From 45f86187ed4c122194abfbbcf716d10003846f9d Mon Sep 17 00:00:00 2001 From: kumarabhirup Date: Sat, 21 Feb 2026 18:25:26 -0800 Subject: [PATCH] fix: resolve merge-induced type errors and lint issues - Deduplicate SkillEntry/SkillSnapshot imports in workspace.ts - Add missing skillFilter/applySkillsPromptLimits in workspace skills - Add sessionEventLog/sessionSubscriptions to runtime state return type - Add allowRealIpFallback to GatewayConfig type - Fix agent.subscribe/unsubscribe validation to use AJV pattern - Add missing imports (RuntimeEnv, inheritOptionFromParent, etc.) - Fix spread type in run-main.exit.test.ts - Type chat.ts appendMessage call correctly - Rename synology-chat workspace ref from openclaw to ironclaw - Regenerate pnpm-lock.yaml for merged dependencies Co-authored-by: Cursor --- extensions/synology-chat/package.json | 2 +- pnpm-lock.yaml | 570 ++++++++---------- src/agents/aisdk/run.ts | 4 +- src/agents/cli-runner/helpers.ts | 8 +- src/agents/pi-embedded-runner/run/attempt.ts | 6 +- .../pi-embedded-runner/system-prompt.ts | 4 +- ...pi-embedded-subscribe.handlers.messages.ts | 2 +- src/agents/pi-embedded-subscribe.ts | 12 +- src/agents/skills/config.ts | 2 +- src/agents/skills/frontmatter.ts | 14 +- src/agents/skills/refresh.test.ts | 3 +- src/agents/skills/refresh.ts | 2 +- src/agents/skills/workspace.ts | 83 ++- src/agents/system-prompt.ts | 6 +- src/auto-reply/reply/get-reply-run.ts | 16 +- src/cli/daemon-cli/install.ts | 2 +- src/cli/run-main.exit.test.ts | 7 +- src/cli/update-cli.ts | 1 + src/commands/agent-via-gateway.e2e.test.ts | 3 +- src/commands/agent-via-gateway.ts | 4 +- src/commands/agent.ts | 2 +- src/commands/configure.wizard.ts | 14 +- .../local/daemon-install.ts | 3 +- .../local/gateway-config.ts | 2 +- src/config/sessions/types.ts | 2 +- src/config/types.gateway.ts | 5 + src/gateway/server-close.ts | 4 +- src/gateway/server-methods/agent.ts | 26 +- src/gateway/server-methods/chat.ts | 10 +- src/gateway/server-runtime-state.ts | 14 +- src/gateway/server-startup.ts | 6 +- src/gateway/server-web-app.test.ts | 28 +- src/gateway/server.impl.ts | 10 +- src/hooks/llm-slug-generator.ts | 2 +- src/infra/ports-format.ts | 2 +- src/memory/embeddings.ts | 2 +- src/security/audit.ts | 4 +- src/telegram/bot.create-telegram-bot.test.ts | 2 +- src/telegram/bot.test.ts | 7 +- src/tui/tui.ts | 14 +- src/wizard/onboarding.finalize.ts | 10 +- src/wizard/onboarding.gateway-config.ts | 18 +- src/wizard/onboarding.test.ts | 4 +- src/wizard/onboarding.ts | 6 +- ui/src/ui/app-chat.ts | 6 +- 45 files changed, 478 insertions(+), 476 deletions(-) diff --git a/extensions/synology-chat/package.json b/extensions/synology-chat/package.json index ef661765ffb..14be854f2ad 100644 --- a/extensions/synology-chat/package.json +++ b/extensions/synology-chat/package.json @@ -5,7 +5,7 @@ "description": "Synology Chat channel plugin for OpenClaw", "type": "module", "devDependencies": { - "openclaw": "workspace:*" + "ironclaw": "workspace:*" }, "openclaw": { "extensions": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a791795d8ab..10da6932bea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,8 +63,8 @@ importers: specifier: ^3.990.0 version: 3.991.0 '@buape/carbon': - specifier: 0.0.0-beta-20260216184201 - version: 0.0.0-beta-20260216184201(@discordjs/opus@0.10.0)(hono@4.11.10)(opusscript@0.0.8) + specifier: 0.14.0 + version: 0.14.0(@discordjs/opus@0.10.0)(hono@4.11.10)(opusscript@0.0.8) '@clack/prompts': specifier: ^1.0.1 version: 1.0.1 @@ -162,8 +162,8 @@ importers: specifier: ^1.40.0 version: 1.40.0 hono: - specifier: 4.11.9 - version: 4.11.9 + specifier: 4.11.10 + version: 4.11.10 https-proxy-agent: specifier: ^7.0.6 version: 7.0.6 @@ -268,8 +268,8 @@ importers: specifier: 0.34.0 version: 0.34.0 oxlint: - specifier: ^1.47.0 - version: 1.48.0(oxlint-tsgolint@0.13.0) + specifier: ^1.49.0 + version: 1.49.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: specifier: ^0.14.2 version: 0.14.2 @@ -569,7 +569,7 @@ importers: specifier: 14.1.1 version: 14.1.1 music-metadata: - specifier: ^11.12.0 + specifier: ^11.12.1 version: 11.12.1 zod: specifier: ^4.3.6 @@ -665,7 +665,7 @@ importers: extensions/synology-chat: devDependencies: - openclaw: + ironclaw: specifier: workspace:* version: link:../.. @@ -1003,50 +1003,38 @@ packages: resolution: {integrity: sha512-1DedO6N3m8zQ/vG6twNiHtsdwBgk773VdavLEbB3NXeKZDlzSK1BTviqWwvJdKx5UnIy4kGGP6WWpCEFEt/bhQ==} engines: {node: '>= 14.0.0'} - '@aws-sdk/nested-clients@3.993.0': - resolution: {integrity: sha512-iOq86f2H67924kQUIPOAvlmMaOAvOLoDOIb66I2YqSUpMYB6ufiuJW3RlREgskxv86S5qKzMnfy/X6CqMjK6XQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/nested-clients@3.995.0': - resolution: {integrity: sha512-7gq9gismVhESiRsSt0eYe1y1b6jS20LqLk+e/YSyPmGi9yHdndHQLIq73RbEJnK/QPpkQGFqq70M1mI46M1HGw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.991.0': resolution: {integrity: sha512-vCWX2O4Kf9h0BviR46r2kc9cAv9twcxDCW9Rlszjkxg0+QN3ji0Q68OVfFZKZYx1BIPkPaWwjeMFB3iUtyyC3w==} engines: {node: '>=20.0.0'} + '@aws-sdk/nested-clients@3.993.0': + resolution: {integrity: sha512-iOq86f2H67924kQUIPOAvlmMaOAvOLoDOIb66I2YqSUpMYB6ufiuJW3RlREgskxv86S5qKzMnfy/X6CqMjK6XQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/region-config-resolver@3.972.3': resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.993.0': - resolution: {integrity: sha512-+35g4c+8r7sB9Sjp1KPdM8qxGn6B/shBjJtEUN4e+Edw9UEQlZKIzioOGu3UAbyE0a/s450LdLZr4wbJChtmww==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/token-providers@3.995.0': - resolution: {integrity: sha512-lYSadNdZZ513qCKoj/KlJ+PgCycL3n8ZNS37qLVFC0t7TbHzoxvGquu9aD2n9OCERAn43OMhQ7dXjYDYdjAXzA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.991.0': resolution: {integrity: sha512-bBlhKprCPhOU+XuoFdR8D5hrbfvUxOYPsMm/bTAhaiCZzng0G1QM5jqOet3z9U9BzyIAH+PH6kUGbeDwhv0acA==} engines: {node: '>=20.0.0'} + '@aws-sdk/token-providers@3.993.0': + resolution: {integrity: sha512-+35g4c+8r7sB9Sjp1KPdM8qxGn6B/shBjJtEUN4e+Edw9UEQlZKIzioOGu3UAbyE0a/s450LdLZr4wbJChtmww==} + engines: {node: '>=20.0.0'} + '@aws-sdk/types@3.973.1': resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.993.0': - resolution: {integrity: sha512-j6vioBeRZ4eHX4SWGvGPpwGg/xSOcK7f1GL0VM+rdf3ZFTIsUEhCFmD78B+5r2PgztcECSzEfvHQX01k8dPQPw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.995.0': - resolution: {integrity: sha512-aym/pjB8SLbo9w2nmkrDdAAVKVlf7CM71B9mKhjDbJTzwpSFBPHqJIMdDyj0mLumKC0aIVDr1H6U+59m9GvMFw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.991.0': resolution: {integrity: sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==} engines: {node: '>=20.0.0'} + '@aws-sdk/util-endpoints@3.993.0': + resolution: {integrity: sha512-j6vioBeRZ4eHX4SWGvGPpwGg/xSOcK7f1GL0VM+rdf3ZFTIsUEhCFmD78B+5r2PgztcECSzEfvHQX01k8dPQPw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-format-url@3.972.3': resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} engines: {node: '>=20.0.0'} @@ -1165,8 +1153,8 @@ packages: '@borewit/text-codec@0.2.1': resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} - '@buape/carbon@0.0.0-beta-20260216184201': - resolution: {integrity: sha512-u5mgYcigfPVqT7D9gVTGd+3YSflTreQmrWog7ORbb0z5w9eT8ft4rJOdw9fGwr75zMu9kXpSBaAcY2eZoJFSdA==} + '@buape/carbon@0.14.0': + resolution: {integrity: sha512-mavllPK2iVpRNRtC4C8JOUdJ1hdV0+LDelFW+pjpJaM31MBLMfIJ+f/LlYTIK5QrEcQsXOC+6lU2e0gmgjWhIQ==} '@cacheable/memory@2.0.7': resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} @@ -1638,6 +1626,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -1952,10 +1944,6 @@ packages: resolution: {integrity: sha512-unVFo8CUlUeJCCxt50+j4yy91NF4x6n9zdGcvEsOFAWzowtZm3mgx8X2D7xjwV0cFSfxmpGPoe+JS77uzeFsxg==} engines: {node: '>= 10'} - '@napi-rs/canvas@0.1.94': - resolution: {integrity: sha512-8jBkvqynXNdQPNZjLJxB/Rp9PdnnMSHFBLzPmMc615nlt/O6w0ergBbkEDEOr8EbjL8nRQDpEklPx4pzD7zrbg==} - engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} @@ -2532,116 +2520,116 @@ packages: cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.48.0': - resolution: {integrity: sha512-1Pz/stJvveO9ZO7ll4ZoEY3f6j2FiUgBLBcCRCiW6ylId9L9UKs+gn3X28m3eTnoiFCkhKwmJJ+VO6vwsu7Qtg==} + '@oxlint/binding-android-arm-eabi@1.49.0': + resolution: {integrity: sha512-2WPoh/2oK9r/i2R4o4J18AOrm3HVlWiHZ8TnuCaS4dX8m5ZzRmHW0I3eLxEurQLHWVruhQN7fHgZnah+ag5iQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.48.0': - resolution: {integrity: sha512-Zc42RWGE8huo6Ht0lXKjd0NH2lWNmimQHUmD0JFcvShLOuwN+RSEE/kRakc2/0LIgOUuU/R7PaDMCOdQlPgNUQ==} + '@oxlint/binding-android-arm64@1.49.0': + resolution: {integrity: sha512-YqJAGvNB11EzoKm1euVhZntb79alhMvWW/j12bYqdvVxn6xzEQWrEDCJg9BPo3A3tBCSUBKH7bVkAiCBqK/L1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.48.0': - resolution: {integrity: sha512-jgZs563/4vaG5jH2RSt2TSh8A2jwsFdmhLXrElMdm3Mmto0HPf85FgInLSNi9HcwzQFvkYV8JofcoUg2GH1HTA==} + '@oxlint/binding-darwin-arm64@1.49.0': + resolution: {integrity: sha512-WFocCRlvVkMhChCJ2qpJfp1Gj/IjvyjuifH9Pex8m8yHonxxQa3d8DZYreuDQU3T4jvSY8rqhoRqnpc61Nlbxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.48.0': - resolution: {integrity: sha512-kvo87BujEUjCJREuWDC4aPh1WoXCRFFWE4C7uF6wuoMw2f6N2hypA/cHHcYn9DdL8R2RrgUZPefC8JExyeIMKA==} + '@oxlint/binding-darwin-x64@1.49.0': + resolution: {integrity: sha512-BN0KniwvehbUfYztOMwEDkYoojGm/narf5oJf+/ap+6PnzMeWLezMaVARNIS0j3OdMkjHTEP8s3+GdPJ7WDywQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.48.0': - resolution: {integrity: sha512-eyzzPaHQKn0RIM+ueDfgfJF2RU//Wp4oaKs2JVoVYcM5HjbCL36+O0S3wO5Xe1NWpcZIG3cEHc/SuOCDRqZDSg==} + '@oxlint/binding-freebsd-x64@1.49.0': + resolution: {integrity: sha512-SnkAc/DPIY6joMCiP/+53Q+N2UOGMU6ULvbztpmvPJNF/jYPGhNbKtN982uj2Gs6fpbxYkmyj08QnpkD4fbHJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.48.0': - resolution: {integrity: sha512-p3kSloztK7GRO7FyO3u38UCjZxQTl92VaLDsMQAq0eGoiNmeeEF1KPeE4+Fr+LSkQhF8WvJKSuls6TwOlurdPA==} + '@oxlint/binding-linux-arm-gnueabihf@1.49.0': + resolution: {integrity: sha512-6Z3EzRvpQVIpO7uFhdiGhdE8Mh3S2VWKLL9xuxVqD6fzPhyI3ugthpYXlCChXzO8FzcYIZ3t1+Kau+h2NY1hqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.48.0': - resolution: {integrity: sha512-uWM+wiTqLW/V0ZmY/eyTWs8ykhIkzU+K2tz/8m35YepYEzohiUGRbnkpAFXj2ioXpQL+GUe5vmM3SLH6ozlfFw==} + '@oxlint/binding-linux-arm-musleabihf@1.49.0': + resolution: {integrity: sha512-wdjXaQYAL/L25732mLlngfst4Jdmi/HLPVHb3yfCoP5mE3lO/pFFrmOJpqWodgv29suWY74Ij+RmJ/YIG5VuzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.48.0': - resolution: {integrity: sha512-OhQNPjs/OICaYqxYJjKKMaIY7p3nJ9IirXcFoHKD+CQE1BZFCeUUAknMzUeLclDCfudH9Vb/UgjFm8+ZM5puAg==} + '@oxlint/binding-linux-arm64-gnu@1.49.0': + resolution: {integrity: sha512-oSHpm8zmSvAG1BWUumbDRSg7moJbnwoEXKAkwDf/xTQJOzvbUknq95NVQdw/AduZr5dePftalB8rzJNGBogUMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxlint/binding-linux-arm64-musl@1.48.0': - resolution: {integrity: sha512-adu5txuwGvQ4C4fjYHJD+vnY+OCwCixBzn7J3KF3iWlVHBBImcosSv+Ye+fbMMJui4HGjifNXzonjKm9pXmOiw==} + '@oxlint/binding-linux-arm64-musl@1.49.0': + resolution: {integrity: sha512-xeqkMOARgGBlEg9BQuPDf6ZW711X6BT5qjDyeM5XNowCJeTSdmMhpePJjTEiVbbr3t21sIlK8RE6X5bc04nWyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxlint/binding-linux-ppc64-gnu@1.48.0': - resolution: {integrity: sha512-inlQQRUnHCny/7b7wA6NjEoJSSZPNea4qnDhWyeqBYWx8ukf2kzNDSiamfhOw6bfAYPm/PVlkVRYaNXQbkLeTQ==} + '@oxlint/binding-linux-ppc64-gnu@1.49.0': + resolution: {integrity: sha512-uvcqRO6PnlJGbL7TeePhTK5+7/JXbxGbN+C6FVmfICDeeRomgQqrfVjf0lUrVpUU8ii8TSkIbNdft3M+oNlOsQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxlint/binding-linux-riscv64-gnu@1.48.0': - resolution: {integrity: sha512-YiJx6sW6bYebQDZRVWLKm/Drswx/hcjIgbLIhULSn0rRcBKc7d9V6mkqPjKDbhcxJgQD5Zi0yVccJiOdF40AWA==} + '@oxlint/binding-linux-riscv64-gnu@1.49.0': + resolution: {integrity: sha512-Dw1HkdXAwHNH+ZDserHP2RzXQmhHtpsYYI0hf8fuGAVCIVwvS6w1+InLxpPMY25P8ASRNiFN3hADtoh6lI+4lg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxlint/binding-linux-riscv64-musl@1.48.0': - resolution: {integrity: sha512-zwSqxMgmb2ITamNfDv9Q9EKBc/4ZhCBP9gkg2hhcgR6sEVGPUDl1AKPC89CBKMxkmPUi3685C38EvqtZn5OtHw==} + '@oxlint/binding-linux-riscv64-musl@1.49.0': + resolution: {integrity: sha512-EPlMYaA05tJ9km/0dI9K57iuMq3Tw+nHst7TNIegAJZrBPtsOtYaMFZEaWj02HA8FI5QvSnRHMt+CI+RIhXJBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxlint/binding-linux-s390x-gnu@1.48.0': - resolution: {integrity: sha512-c/+2oUWAOsQB5JTem0rW8ODlZllF6pAtGSGXoLSvPTonKI1vAwaKhD9Qw1X36jRbcI3Etkpu/9z/RRjMba8vFQ==} + '@oxlint/binding-linux-s390x-gnu@1.49.0': + resolution: {integrity: sha512-yZiQL9qEwse34aMbnMb5VqiAWfDY+fLFuoJbHOuzB1OaJZbN1MRF9Nk+W89PIpGr5DNPDipwjZb8+Q7wOywoUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@oxlint/binding-linux-x64-gnu@1.48.0': - resolution: {integrity: sha512-PhauDqeFW5DGed6QxCY5lXZYKSlcBdCXJnH03ZNU6QmDZ0BFM/zSy1oPT2MNb1Afx1G6yOOVk8ErjWsQ7c59ng==} + '@oxlint/binding-linux-x64-gnu@1.49.0': + resolution: {integrity: sha512-CcCDwMMXSchNkhdgvhVn3DLZ4EnBXAD8o8+gRzahg+IdSt/72y19xBgShJgadIRF0TsRcV/MhDUMwL5N/W54aQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxlint/binding-linux-x64-musl@1.48.0': - resolution: {integrity: sha512-6d7LIFFZGiavbHndhf1cK9kG9qmy2Dmr37sV9Ep7j3H+ciFdKSuOzdLh85mEUYMih+b+esMDlF5DU0WQRZPQjw==} + '@oxlint/binding-linux-x64-musl@1.49.0': + resolution: {integrity: sha512-u3HfKV8BV6t6UCCbN0RRiyqcymhrnpunVmLFI8sEa5S/EBu+p/0bJ3D7LZ2KT6PsBbrB71SWq4DeFrskOVgIZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxlint/binding-openharmony-arm64@1.48.0': - resolution: {integrity: sha512-r+0KK9lK6vFp3tXAgDMOW32o12dxvKS3B9La1uYMGdWAMoSeu2RzG34KmzSpXu6MyLDl4aSVyZLFM8KGdEjwaw==} + '@oxlint/binding-openharmony-arm64@1.49.0': + resolution: {integrity: sha512-dRDpH9fw+oeUMpM4br0taYCFpW6jQtOuEIec89rOgDA1YhqwmeRcx0XYeCv7U48p57qJ1XZHeMGM9LdItIjfzA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.48.0': - resolution: {integrity: sha512-Nkw/MocyT3HSp0OJsKPXrcbxZqSPMTYnLLfsqsoiFKoL1ppVNL65MFa7vuTxJehPlBkjy+95gUgacZtuNMECrg==} + '@oxlint/binding-win32-arm64-msvc@1.49.0': + resolution: {integrity: sha512-6rrKe/wL9tn0qnOy76i1/0f4Dc3dtQnibGlU4HqR/brVHlVjzLSoaH0gAFnLnznh9yQ6gcFTBFOPrcN/eKPDGA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.48.0': - resolution: {integrity: sha512-reO1SpefvRmeZSP+WeyWkQd1ArxxDD1MyKgMUKuB8lNuUoxk9QEohYtKnsfsxJuFwMT0JTr7p9wZjouA85GzGQ==} + '@oxlint/binding-win32-ia32-msvc@1.49.0': + resolution: {integrity: sha512-CXHLWAtLs2xG/aVy1OZiYJzrULlq0QkYpI6cd7VKMrab+qur4fXVE/B1Bp1m0h1qKTj5/FTGg6oU4qaXMjS/ug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.48.0': - resolution: {integrity: sha512-T6zwhfcsrorqAybkOglZdPkTLlEwipbtdO1qjE+flbawvwOMsISoyiuaa7vM7zEyfq1hmDvMq1ndvkYFioranA==} + '@oxlint/binding-win32-x64-msvc@1.49.0': + resolution: {integrity: sha512-VteIelt78kwzSglOozaQcs6BCS4Lk0j+QA+hGV0W8UeyaqQ3XpbZRhDU55NW1PPvCy1tg4VXsTlEaPovqto7nQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3576,8 +3564,8 @@ packages: '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/bun@1.3.9': - resolution: {integrity: sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw==} + '@types/bun@1.3.6': + resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==} '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} @@ -3908,6 +3896,10 @@ packages: resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} engines: {node: '>=0.8'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -4043,9 +4035,6 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.2: resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} engines: {node: 20 || >=22} @@ -4103,8 +4092,8 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bun-types@1.3.9: - resolution: {integrity: sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg==} + bun-types@1.3.6: + resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -4639,9 +4628,6 @@ packages: resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} engines: {node: '>=6.0.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} @@ -4768,6 +4754,11 @@ packages: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -4823,6 +4814,10 @@ packages: resolution: {integrity: sha512-KACie1EOs9BIOMtenFaxwmYODWA3/fTfGSUnLhMJpXRntu1g+uL/Xvub5f8SCTppvo9q62Qy4LeOoUiaL54G5A==} engines: {node: 20 || >=22} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + google-auth-library@10.5.0: resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} engines: {node: '>=18'} @@ -5042,10 +5037,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} - engines: {node: '>=16'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -5103,6 +5094,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -5742,6 +5737,11 @@ packages: node-readable-to-web-readable-stream@0.4.2: resolution: {integrity: sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==} + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + nostr-tools@2.23.1: resolution: {integrity: sha512-Q5SJ1omrseBFXtLwqDhufpFLA6vX3rS/IuBCc974qaYX6YKGwEPxa/ZsyxruUOr+b+5EpWL2hFmCB5AueYrfBw==} peerDependencies: @@ -5784,9 +5784,6 @@ packages: resolution: {integrity: sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==} engines: {node: '>= 20'} - ollama@0.6.3: - resolution: {integrity: sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==} - on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -5840,6 +5837,9 @@ packages: zod: optional: true + opusscript@0.0.8: + resolution: {integrity: sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==} + ora@8.2.0: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} @@ -5860,12 +5860,12 @@ packages: resolution: {integrity: sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==} hasBin: true - oxlint@1.48.0: - resolution: {integrity: sha512-m5vyVBgPtPhVCJc3xI//8je9lRc8bYuYB4R/1PH3VPGOjA4vjVhkHtyJukdEjYEjwrw4Qf1eIf+pP9xvfhfMow==} + oxlint@1.49.0: + resolution: {integrity: sha512-YZffp0gM+63CJoRhHjtjRnwKtAgUnXM6j63YQ++aigji2NVvLGsUlrXo9gJUXZOdcbfShLYtA6RuTu8GZ4lzOQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.12.2' + oxlint-tsgolint: '>=0.14.1' peerDependenciesMeta: oxlint-tsgolint: optional: true @@ -6285,8 +6285,8 @@ packages: remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - request-promise-core@1.1.4: - resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + request-promise-core@1.1.3: + resolution: {integrity: sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==} engines: {node: '>=0.10.0'} peerDependencies: request: ^2.34 @@ -6675,10 +6675,9 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar@7.5.7: - resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + tar@7.5.9: + resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} @@ -7622,6 +7621,49 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 + '@aws-sdk/nested-clients@3.991.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.11 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.11 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.991.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.10 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.2 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.16 + '@smithy/middleware-retry': 4.4.33 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.32 + '@smithy/util-defaults-mode-node': 4.2.35 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/nested-clients@3.993.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -7665,92 +7707,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/nested-clients@3.995.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.11 - '@aws-sdk/middleware-host-header': 3.972.3 - '@aws-sdk/middleware-logger': 3.972.3 - '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.11 - '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.995.0 - '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.10 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.23.2 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.16 - '@smithy/middleware-retry': 4.4.33 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.10 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.32 - '@smithy/util-defaults-mode-node': 4.2.35 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/nested-clients@3.991.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.10 - '@aws-sdk/middleware-host-header': 3.972.3 - '@aws-sdk/middleware-logger': 3.972.3 - '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.10 - '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.991.0 - '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.8 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.23.0 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.14 - '@smithy/middleware-retry': 4.4.31 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.10 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.3 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.30 - '@smithy/util-defaults-mode-node': 4.2.33 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/region-config-resolver@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 @@ -7759,6 +7715,18 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@aws-sdk/token-providers@3.991.0': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/nested-clients': 3.991.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/token-providers@3.993.0': dependencies: '@aws-sdk/core': 3.973.11 @@ -7771,51 +7739,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/token-providers@3.995.0': - dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/nested-clients': 3.995.0 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/token-providers@3.991.0': - dependencies: - '@aws-sdk/core': 3.973.10 - '@aws-sdk/nested-clients': 3.991.0 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/types@3.973.1': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.993.0': - dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.995.0': - dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 - tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.991.0': dependencies: '@aws-sdk/types': 3.973.1 @@ -7824,6 +7752,14 @@ snapshots: '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.993.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + '@aws-sdk/util-format-url@3.972.3': dependencies: '@aws-sdk/types': 3.973.1 @@ -7951,7 +7887,7 @@ snapshots: '@borewit/text-codec@0.2.1': {} - '@buape/carbon@0.0.0-beta-20260216184201(@discordjs/opus@0.10.0)(hono@4.11.10)(opusscript@0.0.8)': + '@buape/carbon@0.14.0(@discordjs/opus@0.10.0)(hono@4.11.10)(opusscript@0.0.8)': dependencies: '@types/node': 25.3.0 discord-api-types: 0.38.37 @@ -7959,7 +7895,7 @@ snapshots: '@cloudflare/workers-types': 4.20260120.0 '@discordjs/voice': 0.19.0(@discordjs/opus@0.10.0)(opusscript@0.0.8) '@hono/node-server': 1.19.9(hono@4.11.10) - '@types/bun': 1.3.9 + '@types/bun': 1.3.6 '@types/ws': 8.18.1 ws: 8.19.0 transitivePeerDependencies: @@ -8418,6 +8354,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.3 @@ -8622,7 +8560,7 @@ snapshots: dependencies: '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) '@aws-sdk/client-bedrock-runtime': 3.991.0 - '@google/genai': 1.41.0 + '@google/genai': 1.42.0 '@mistralai/mistralai': 1.10.0 '@sinclair/typebox': 0.34.48 ajv: 8.18.0 @@ -8763,21 +8701,6 @@ snapshots: '@napi-rs/canvas-win32-arm64-msvc': 0.1.93 '@napi-rs/canvas-win32-x64-msvc': 0.1.93 - '@napi-rs/canvas@0.1.94': - optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.94 - '@napi-rs/canvas-darwin-arm64': 0.1.94 - '@napi-rs/canvas-darwin-x64': 0.1.94 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.94 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.94 - '@napi-rs/canvas-linux-arm64-musl': 0.1.94 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.94 - '@napi-rs/canvas-linux-x64-gnu': 0.1.94 - '@napi-rs/canvas-linux-x64-musl': 0.1.94 - '@napi-rs/canvas-win32-arm64-msvc': 0.1.94 - '@napi-rs/canvas-win32-x64-msvc': 0.1.94 - optional: true - '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.8.1 @@ -9325,61 +9248,61 @@ snapshots: '@oxlint-tsgolint/win32-x64@0.14.2': optional: true - '@oxlint/binding-android-arm-eabi@1.48.0': + '@oxlint/binding-android-arm-eabi@1.49.0': optional: true - '@oxlint/binding-android-arm64@1.48.0': + '@oxlint/binding-android-arm64@1.49.0': optional: true - '@oxlint/binding-darwin-arm64@1.48.0': + '@oxlint/binding-darwin-arm64@1.49.0': optional: true - '@oxlint/binding-darwin-x64@1.48.0': + '@oxlint/binding-darwin-x64@1.49.0': optional: true - '@oxlint/binding-freebsd-x64@1.48.0': + '@oxlint/binding-freebsd-x64@1.49.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.48.0': + '@oxlint/binding-linux-arm-gnueabihf@1.49.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.48.0': + '@oxlint/binding-linux-arm-musleabihf@1.49.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.48.0': + '@oxlint/binding-linux-arm64-gnu@1.49.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.48.0': + '@oxlint/binding-linux-arm64-musl@1.49.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.48.0': + '@oxlint/binding-linux-ppc64-gnu@1.49.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.48.0': + '@oxlint/binding-linux-riscv64-gnu@1.49.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.48.0': + '@oxlint/binding-linux-riscv64-musl@1.49.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.48.0': + '@oxlint/binding-linux-s390x-gnu@1.49.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.48.0': + '@oxlint/binding-linux-x64-gnu@1.49.0': optional: true - '@oxlint/binding-linux-x64-musl@1.48.0': + '@oxlint/binding-linux-x64-musl@1.49.0': optional: true - '@oxlint/binding-openharmony-arm64@1.48.0': + '@oxlint/binding-openharmony-arm64@1.49.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.48.0': + '@oxlint/binding-win32-arm64-msvc@1.49.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.48.0': + '@oxlint/binding-win32-ia32-msvc@1.49.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.48.0': + '@oxlint/binding-win32-x64-msvc@1.49.0': optional: true '@pinojs/redact@0.4.0': {} @@ -10252,7 +10175,7 @@ snapshots: dependencies: '@tiptap/core': 3.19.0(@tiptap/pm@3.19.0) '@tiptap/pm': 3.19.0 - marked: 17.0.2 + marked: 17.0.3 '@tiptap/pm@3.19.0': dependencies: @@ -10398,9 +10321,9 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 25.3.0 - '@types/bun@1.3.9': + '@types/bun@1.3.6': dependencies: - bun-types: 1.3.9 + bun-types: 1.3.6 optional: true '@types/caseless@0.12.5': {} @@ -10676,7 +10599,7 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': dependencies: '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) @@ -10707,7 +10630,7 @@ snapshots: - vite optional: true - '@vitest/browser@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + '@vitest/browser@4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': dependencies: '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/utils': 4.0.18 @@ -10757,7 +10680,7 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 @@ -10832,14 +10755,14 @@ snapshots: acorn@8.16.0: {} + adler-32@1.3.1: {} + agent-base@6.0.2: dependencies: debug: 4.4.3 transitivePeerDependencies: - supports-color - adler-32@1.3.1: {} - agent-base@7.1.4: {} ai@6.0.86(zod@4.3.6): @@ -10965,8 +10888,6 @@ snapshots: bail@2.0.2: {} - balanced-match@1.0.2: {} - balanced-match@4.0.2: dependencies: jackspeak: 4.2.3 @@ -11030,13 +10951,13 @@ snapshots: brace-expansion@5.0.2: dependencies: - balanced-match: 4.0.3 + balanced-match: 4.0.2 buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} - bun-types@1.3.9: + bun-types@1.3.6: dependencies: '@types/node': 25.3.0 optional: true @@ -11564,8 +11485,6 @@ snapshots: fast-equals@5.4.0: {} - fast-json-stable-stringify@2.1.0: {} - fast-uri@3.1.0: {} fast-xml-parser@5.3.6: @@ -11684,6 +11603,18 @@ snapshots: fuse.js@7.1.0: {} + gauge@3.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + gauge@4.0.4: dependencies: aproba: 2.1.0 @@ -11766,8 +11697,17 @@ snapshots: glob@13.0.4: dependencies: minimatch: 10.2.1 - minipass: 7.1.2 - path-scurry: 2.0.1 + minipass: 7.1.3 + path-scurry: 2.0.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 10.2.1 + once: 1.4.0 + path-is-absolute: 1.0.1 google-auth-library@10.5.0: dependencies: @@ -11874,7 +11814,7 @@ snapshots: highlight.js@10.7.3: {} - hono@4.11.9: {} + hono@4.11.10: {} hookable@6.0.1: {} @@ -12053,8 +11993,6 @@ snapshots: is-interactive@2.0.0: {} - is-network-error@1.3.0: {} - is-plain-obj@4.1.0: {} is-plain-object@5.0.0: {} @@ -12098,6 +12036,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + jiti@2.6.1: {} jose@4.15.9: {} @@ -12946,6 +12888,10 @@ snapshots: node-readable-to-web-readable-stream@0.4.2: optional: true + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + nostr-tools@2.23.1(typescript@5.9.3): dependencies: '@noble/ciphers': 2.1.1 @@ -13000,10 +12946,6 @@ snapshots: '@octokit/types': 16.0.0 '@octokit/webhooks': 14.2.0 - ollama@0.6.3: - dependencies: - whatwg-fetch: 3.6.20 - on-exit-leak-free@2.1.2: {} on-finished@2.3.0: @@ -13042,6 +12984,8 @@ snapshots: ws: 8.19.0 zod: 4.3.6 + opusscript@0.0.8: {} + ora@8.2.0: dependencies: chalk: 5.6.2 @@ -13091,28 +13035,28 @@ snapshots: '@oxlint-tsgolint/win32-arm64': 0.14.2 '@oxlint-tsgolint/win32-x64': 0.14.2 - oxlint@1.48.0(oxlint-tsgolint@0.13.0): + oxlint@1.49.0(oxlint-tsgolint@0.14.2): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.48.0 - '@oxlint/binding-android-arm64': 1.48.0 - '@oxlint/binding-darwin-arm64': 1.48.0 - '@oxlint/binding-darwin-x64': 1.48.0 - '@oxlint/binding-freebsd-x64': 1.48.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.48.0 - '@oxlint/binding-linux-arm-musleabihf': 1.48.0 - '@oxlint/binding-linux-arm64-gnu': 1.48.0 - '@oxlint/binding-linux-arm64-musl': 1.48.0 - '@oxlint/binding-linux-ppc64-gnu': 1.48.0 - '@oxlint/binding-linux-riscv64-gnu': 1.48.0 - '@oxlint/binding-linux-riscv64-musl': 1.48.0 - '@oxlint/binding-linux-s390x-gnu': 1.48.0 - '@oxlint/binding-linux-x64-gnu': 1.48.0 - '@oxlint/binding-linux-x64-musl': 1.48.0 - '@oxlint/binding-openharmony-arm64': 1.48.0 - '@oxlint/binding-win32-arm64-msvc': 1.48.0 - '@oxlint/binding-win32-ia32-msvc': 1.48.0 - '@oxlint/binding-win32-x64-msvc': 1.48.0 - oxlint-tsgolint: 0.13.0 + '@oxlint/binding-android-arm-eabi': 1.49.0 + '@oxlint/binding-android-arm64': 1.49.0 + '@oxlint/binding-darwin-arm64': 1.49.0 + '@oxlint/binding-darwin-x64': 1.49.0 + '@oxlint/binding-freebsd-x64': 1.49.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.49.0 + '@oxlint/binding-linux-arm-musleabihf': 1.49.0 + '@oxlint/binding-linux-arm64-gnu': 1.49.0 + '@oxlint/binding-linux-arm64-musl': 1.49.0 + '@oxlint/binding-linux-ppc64-gnu': 1.49.0 + '@oxlint/binding-linux-riscv64-gnu': 1.49.0 + '@oxlint/binding-linux-riscv64-musl': 1.49.0 + '@oxlint/binding-linux-s390x-gnu': 1.49.0 + '@oxlint/binding-linux-x64-gnu': 1.49.0 + '@oxlint/binding-linux-x64-musl': 1.49.0 + '@oxlint/binding-openharmony-arm64': 1.49.0 + '@oxlint/binding-win32-arm64-msvc': 1.49.0 + '@oxlint/binding-win32-ia32-msvc': 1.49.0 + '@oxlint/binding-win32-x64-msvc': 1.49.0 + oxlint-tsgolint: 0.14.2 p-finally@1.0.0: {} @@ -13648,7 +13592,7 @@ snapshots: remove-accents@0.5.0: {} - request-promise-core@1.1.4(request@2.88.2): + request-promise-core@1.1.3(@cypress/request@3.0.10): dependencies: lodash: 4.17.23 request: '@cypress/request@3.0.10' @@ -14140,7 +14084,7 @@ snapshots: tapable@2.3.0: {} - tar@7.5.7: + tar@7.5.9: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -14406,7 +14350,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.57.1 + rollup: 4.58.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.11 @@ -14416,7 +14360,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -14471,7 +14415,7 @@ snapshots: - tsx - yaml - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) diff --git a/src/agents/aisdk/run.ts b/src/agents/aisdk/run.ts index 26394cca6d9..b4e49390088 100644 --- a/src/agents/aisdk/run.ts +++ b/src/agents/aisdk/run.ts @@ -9,10 +9,9 @@ */ import type { ThinkLevel } from "../../auto-reply/thinking.js"; +import { resolveUserPath } from "../../utils.js"; import type { RunEmbeddedPiAgentParams } from "../pi-embedded-runner/run/params.js"; import type { EmbeddedPiRunResult, EmbeddedPiAgentMeta } from "../pi-embedded-runner/types.js"; -import type { AiSdkConfig, ResolvedModel } from "./types.js"; -import { resolveUserPath } from "../../utils.js"; import { resolveSkillsPromptForRun, applySkillEnvOverrides, @@ -22,6 +21,7 @@ import { import { streamWithPiAgentEvents, type EventAdapterInput } from "./event-adapter.js"; import { resolveModel, getDefaultConfig, validateConfig } from "./provider.js"; import { createAiSdkTools, type ToolExecutionContext, type ConvertedAiSdkTool } from "./tools.js"; +import type { AiSdkConfig, ResolvedModel } from "./types.js"; /** * Configuration for the AI SDK agent runner. diff --git a/src/agents/cli-runner/helpers.ts b/src/agents/cli-runner/helpers.ts index 4c653c056cd..493c8fcc756 100644 --- a/src/agents/cli-runner/helpers.ts +++ b/src/agents/cli-runner/helpers.ts @@ -1,18 +1,18 @@ -import type { AgentTool } from "@mariozechner/pi-agent-core"; -import type { ImageContent } from "@mariozechner/pi-ai"; import crypto from "node:crypto"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import type { AgentTool } from "@mariozechner/pi-agent-core"; +import type { ImageContent } from "@mariozechner/pi-ai"; import type { ThinkLevel } from "../../auto-reply/thinking.js"; +import { resolveCliName } from "../../cli/cli-name.js"; import type { OpenClawConfig } from "../../config/config.js"; import type { CliBackendConfig } from "../../config/types.js"; -import type { EmbeddedContextFile } from "../pi-embedded-helpers.js"; -import { resolveCliName } from "../../cli/cli-name.js"; import { buildTtsSystemPromptHint } from "../../tts/tts.js"; import { isRecord } from "../../utils.js"; import { buildModelAliasLines } from "../model-alias-lines.js"; import { resolveDefaultModelForAgent } from "../model-selection.js"; +import type { EmbeddedContextFile } from "../pi-embedded-helpers.js"; import { detectRuntimeShell } from "../shell-utils.js"; import { buildSystemPromptParams } from "../system-prompt-params.js"; import { buildAgentSystemPrompt } from "../system-prompt.js"; diff --git a/src/agents/pi-embedded-runner/run/attempt.ts b/src/agents/pi-embedded-runner/run/attempt.ts index 01de4816528..7864edccce1 100644 --- a/src/agents/pi-embedded-runner/run/attempt.ts +++ b/src/agents/pi-embedded-runner/run/attempt.ts @@ -1,3 +1,5 @@ +import fs from "node:fs/promises"; +import os from "node:os"; import type { AgentMessage } from "@mariozechner/pi-agent-core"; import type { ImageContent } from "@mariozechner/pi-ai"; import { streamSimple } from "@mariozechner/pi-ai"; @@ -7,9 +9,6 @@ import { SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent"; -import fs from "node:fs/promises"; -import os from "node:os"; -import type { EmbeddedRunAttemptParams, EmbeddedRunAttemptResult } from "./types.js"; import { resolveHeartbeatPrompt } from "../../../auto-reply/heartbeat.js"; import { resolveChannelCapabilities } from "../../../config/channel-capabilities.js"; import { getMachineDisplayName } from "../../../infra/machine-name.js"; @@ -110,6 +109,7 @@ import { shouldFlagCompactionTimeout, } from "./compaction-timeout.js"; import { detectAndLoadPromptImages } from "./images.js"; +import type { EmbeddedRunAttemptParams, EmbeddedRunAttemptResult } from "./types.js"; export function injectHistoryImagesIntoMessages( messages: AgentMessage[], diff --git a/src/agents/pi-embedded-runner/system-prompt.ts b/src/agents/pi-embedded-runner/system-prompt.ts index a4ab6c73397..296f8275789 100644 --- a/src/agents/pi-embedded-runner/system-prompt.ts +++ b/src/agents/pi-embedded-runner/system-prompt.ts @@ -3,10 +3,10 @@ import type { AgentSession } from "@mariozechner/pi-coding-agent"; import type { MemoryCitationsMode } from "../../config/types.memory.js"; import type { ResolvedTimeFormat } from "../date-time.js"; import type { EmbeddedContextFile } from "../pi-embedded-helpers.js"; -import type { EmbeddedSandboxInfo } from "./types.js"; -import type { ReasoningLevel, ThinkLevel } from "./utils.js"; import { buildAgentSystemPrompt, type PromptMode } from "../system-prompt.js"; import { buildToolSummaryMap } from "../tool-summaries.js"; +import type { EmbeddedSandboxInfo } from "./types.js"; +import type { ReasoningLevel, ThinkLevel } from "./utils.js"; export function buildEmbeddedSystemPrompt(params: { workspaceDir: string; diff --git a/src/agents/pi-embedded-subscribe.handlers.messages.ts b/src/agents/pi-embedded-subscribe.handlers.messages.ts index 8e9c91e3dc7..cea1f578091 100644 --- a/src/agents/pi-embedded-subscribe.handlers.messages.ts +++ b/src/agents/pi-embedded-subscribe.handlers.messages.ts @@ -1,5 +1,4 @@ import type { AgentEvent, AgentMessage } from "@mariozechner/pi-agent-core"; -import type { EmbeddedPiSubscribeContext } from "./pi-embedded-subscribe.handlers.types.js"; import { parseReplyDirectives } from "../auto-reply/reply/reply-directives.js"; import { SILENT_REPLY_TOKEN } from "../auto-reply/tokens.js"; import { emitAgentEvent } from "../infra/agent-events.js"; @@ -8,6 +7,7 @@ import { isMessagingToolDuplicateNormalized, normalizeTextForComparison, } from "./pi-embedded-helpers.js"; +import type { EmbeddedPiSubscribeContext } from "./pi-embedded-subscribe.handlers.types.js"; import { appendRawStream } from "./pi-embedded-subscribe.raw-stream.js"; import { extractAssistantText, diff --git a/src/agents/pi-embedded-subscribe.ts b/src/agents/pi-embedded-subscribe.ts index e74dd938d5d..31993552068 100644 --- a/src/agents/pi-embedded-subscribe.ts +++ b/src/agents/pi-embedded-subscribe.ts @@ -1,15 +1,10 @@ import type { AgentMessage } from "@mariozechner/pi-agent-core"; -import type { InlineCodeState } from "../markdown/code-spans.js"; -import type { - EmbeddedPiSubscribeContext, - EmbeddedPiSubscribeState, -} from "./pi-embedded-subscribe.handlers.types.js"; -import type { SubscribeEmbeddedPiSessionParams } from "./pi-embedded-subscribe.types.js"; import { parseReplyDirectives } from "../auto-reply/reply/reply-directives.js"; import { createStreamingDirectiveAccumulator } from "../auto-reply/reply/streaming-directives.js"; import { formatToolAggregate } from "../auto-reply/tool-meta.js"; import { emitAgentEvent } from "../infra/agent-events.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; +import type { InlineCodeState } from "../markdown/code-spans.js"; import { buildCodeSpanIndex, createInlineCodeState } from "../markdown/code-spans.js"; import { EmbeddedBlockChunker } from "./pi-embedded-block-chunker.js"; import { @@ -17,7 +12,12 @@ import { normalizeTextForComparison, } from "./pi-embedded-helpers.js"; import { createEmbeddedPiSessionEventHandler } from "./pi-embedded-subscribe.handlers.js"; +import type { + EmbeddedPiSubscribeContext, + EmbeddedPiSubscribeState, +} from "./pi-embedded-subscribe.handlers.types.js"; import { filterToolResultMediaUrls } from "./pi-embedded-subscribe.tools.js"; +import type { SubscribeEmbeddedPiSessionParams } from "./pi-embedded-subscribe.types.js"; import { formatReasoningMessage, stripDowngradedToolCallText } from "./pi-embedded-utils.js"; import { hasNonzeroUsage, normalizeUsage, type UsageLike } from "./usage.js"; diff --git a/src/agents/skills/config.ts b/src/agents/skills/config.ts index 5b70ee177af..2ee3f3cd98d 100644 --- a/src/agents/skills/config.ts +++ b/src/agents/skills/config.ts @@ -1,5 +1,4 @@ import type { OpenClawConfig, SkillConfig } from "../../config/config.js"; -import type { SkillEligibilityContext, SkillEntry } from "./types.js"; import { evaluateRuntimeRequires, hasBinary, @@ -8,6 +7,7 @@ import { resolveRuntimePlatform, } from "../../shared/config-eval.js"; import { resolveSkillKey } from "./frontmatter.js"; +import type { SkillEligibilityContext, SkillEntry } from "./types.js"; const DEFAULT_CONFIG_VALUES: Record = { "browser.enabled": true, diff --git a/src/agents/skills/frontmatter.ts b/src/agents/skills/frontmatter.ts index 2032789f84c..bf9ce9043ea 100644 --- a/src/agents/skills/frontmatter.ts +++ b/src/agents/skills/frontmatter.ts @@ -1,11 +1,4 @@ import type { Skill } from "@mariozechner/pi-coding-agent"; -import type { - OpenClawSkillMetadata, - ParsedSkillFrontmatter, - SkillEntry, - SkillInstallSpec, - SkillInvocationPolicy, -} from "./types.js"; import { parseFrontmatterBlock } from "../../markdown/frontmatter.js"; import { getFrontmatterString, @@ -17,6 +10,13 @@ import { resolveOpenClawManifestOs, resolveOpenClawManifestRequires, } from "../../shared/frontmatter.js"; +import type { + OpenClawSkillMetadata, + ParsedSkillFrontmatter, + SkillEntry, + SkillInstallSpec, + SkillInvocationPolicy, +} from "./types.js"; export function parseFrontmatter(content: string): ParsedSkillFrontmatter { return parseFrontmatterBlock(content); diff --git a/src/agents/skills/refresh.test.ts b/src/agents/skills/refresh.test.ts index c87ac2f671b..a7a5ad904d8 100644 --- a/src/agents/skills/refresh.test.ts +++ b/src/agents/skills/refresh.test.ts @@ -82,7 +82,8 @@ describe("ensureSkillsWatcher", () => { mod.ensureSkillsWatcher({ workspaceDir: "/tmp/workspace-bundled-test" }); expect(watchMock).toHaveBeenCalledTimes(1); - const watchedPaths = watchMock.mock.calls[0]?.[0] as string[]; + const watchedPaths = + (watchMock.mock.calls as unknown as Array<[string[], { ignored?: unknown }]>)[0]?.[0] ?? []; // Should include workspace skills and bundled skills (as SKILL.md globs) expect(watchedPaths.some((p) => p.startsWith("/tmp/workspace-bundled-test/skills"))).toBe(true); diff --git a/src/agents/skills/refresh.ts b/src/agents/skills/refresh.ts index bc337a90a5d..0389bfdbfc8 100644 --- a/src/agents/skills/refresh.ts +++ b/src/agents/skills/refresh.ts @@ -1,6 +1,6 @@ -import chokidar, { type FSWatcher } from "chokidar"; import os from "node:os"; import path from "node:path"; +import chokidar, { type FSWatcher } from "chokidar"; import type { OpenClawConfig } from "../../config/config.js"; import { createSubsystemLogger } from "../../logging/subsystem.js"; import { CONFIG_DIR, resolveUserPath } from "../../utils.js"; diff --git a/src/agents/skills/workspace.ts b/src/agents/skills/workspace.ts index 7b373584e83..d60e54bbec6 100644 --- a/src/agents/skills/workspace.ts +++ b/src/agents/skills/workspace.ts @@ -1,27 +1,12 @@ +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; import { formatSkillsForPrompt, loadSkillsFromDir, type Skill, } from "@mariozechner/pi-coding-agent"; -import fs from "node:fs"; -import os from "node:os"; -import path from "node:path"; import type { OpenClawConfig } from "../../config/config.js"; -import type { - InjectedSkillContent, - ParsedSkillFrontmatter, - SkillEligibilityContext, - SkillCommandSpec, - SkillEntry, - SkillSnapshot, -} from "./types.js"; -import type { - ParsedSkillFrontmatter, - SkillEligibilityContext, - SkillCommandSpec, - SkillEntry, - SkillSnapshot, -} from "./types.js"; import { createSubsystemLogger } from "../../logging/subsystem.js"; import { CONFIG_DIR, resolveUserPath } from "../../utils.js"; import { resolveSandboxPath } from "../sandbox-paths.js"; @@ -35,6 +20,14 @@ import { } from "./frontmatter.js"; import { resolvePluginSkillDirs } from "./plugin-skills.js"; import { serializeByKey } from "./serialize.js"; +import type { + InjectedSkillContent, + ParsedSkillFrontmatter, + SkillEligibilityContext, + SkillCommandSpec, + SkillEntry, + SkillSnapshot, +} from "./types.js"; const fsp = fs.promises; const skillsLogger = createSubsystemLogger("skills"); @@ -430,6 +423,44 @@ function readSkillContent(filePath: string): string | undefined { } } +function applySkillsPromptLimits(params: { skills: Skill[]; config?: OpenClawConfig }): { + skillsForPrompt: Skill[]; + truncated: boolean; + truncatedReason: "count" | "chars" | null; +} { + const limits = resolveSkillsLimits(params.config); + const total = params.skills.length; + const byCount = params.skills.slice(0, Math.max(0, limits.maxSkillsInPrompt)); + + let skillsForPrompt = byCount; + let truncated = total > byCount.length; + let truncatedReason: "count" | "chars" | null = truncated ? "count" : null; + + const fits = (skills: Skill[]): boolean => { + const block = formatSkillsForPrompt(skills); + return block.length <= limits.maxSkillsPromptChars; + }; + + if (!fits(skillsForPrompt)) { + // Binary search the largest prefix that fits in the char budget. + let lo = 0; + let hi = skillsForPrompt.length; + while (lo < hi) { + const mid = Math.ceil((lo + hi) / 2); + if (fits(skillsForPrompt.slice(0, mid))) { + lo = mid; + } else { + hi = mid - 1; + } + } + skillsForPrompt = skillsForPrompt.slice(0, lo); + truncated = true; + truncatedReason = "chars"; + } + + return { skillsForPrompt, truncated, truncatedReason }; +} + export function buildWorkspaceSkillSnapshot( workspaceDir: string, opts?: { @@ -468,8 +499,21 @@ export function buildWorkspaceSkillSnapshot( (entry) => entry.invocation?.disableModelInvocation !== true, ); const resolvedSkills = promptEntries.map((entry) => entry.skill); + const { skillsForPrompt, truncated } = applySkillsPromptLimits({ + skills: resolvedSkills, + config: opts?.config, + }); + const truncationNote = truncated + ? `⚠️ Skills truncated: included ${skillsForPrompt.length} of ${resolvedSkills.length}. Run \`openclaw skills check\` to audit.` + : ""; const remoteNote = opts?.eligibility?.remote?.note?.trim(); - const prompt = [remoteNote, formatSkillsForPrompt(resolvedSkills)].filter(Boolean).join("\n"); + const prompt = [ + remoteNote, + truncationNote, + formatSkillsForPrompt(compactSkillPaths(skillsForPrompt)), + ] + .filter(Boolean) + .join("\n"); // Read full content of injected skills, substituting workspace path placeholders. // We replace both the tilde form and the expanded default path to handle @@ -497,6 +541,7 @@ export function buildWorkspaceSkillSnapshot( } } + const skillFilter = normalizeSkillFilter(opts?.skillFilter); return { prompt, skills: eligible.map((entry) => ({ diff --git a/src/agents/system-prompt.ts b/src/agents/system-prompt.ts index f3f763f643f..b8eccd16f59 100644 --- a/src/agents/system-prompt.ts +++ b/src/agents/system-prompt.ts @@ -1,11 +1,11 @@ import { createHmac, createHash } from "node:crypto"; import type { ReasoningLevel, ThinkLevel } from "../auto-reply/thinking.js"; -import type { MemoryCitationsMode } from "../config/types.memory.js"; -import type { ResolvedTimeFormat } from "./date-time.js"; -import type { EmbeddedContextFile } from "./pi-embedded-helpers.js"; import { SILENT_REPLY_TOKEN } from "../auto-reply/tokens.js"; import { DEFAULT_CLI_NAME } from "../cli/cli-name.js"; +import type { MemoryCitationsMode } from "../config/types.memory.js"; import { listDeliverableMessageChannels } from "../utils/message-channel.js"; +import type { ResolvedTimeFormat } from "./date-time.js"; +import type { EmbeddedContextFile } from "./pi-embedded-helpers.js"; import { sanitizeForPromptLiteral } from "./sanitize-for-prompt.js"; /** diff --git a/src/auto-reply/reply/get-reply-run.ts b/src/auto-reply/reply/get-reply-run.ts index 8aa51eac4ec..58e1e2aee4b 100644 --- a/src/auto-reply/reply/get-reply-run.ts +++ b/src/auto-reply/reply/get-reply-run.ts @@ -1,13 +1,6 @@ import crypto from "node:crypto"; -import type { ExecToolDefaults } from "../../agents/bash-tools.js"; -import type { OpenClawConfig } from "../../config/config.js"; -import type { MsgContext, TemplateContext } from "../templating.js"; -import type { GetReplyOptions, ReplyPayload } from "../types.js"; -import type { buildCommandContext } from "./commands.js"; -import type { InlineDirectives } from "./directive-handling.js"; -import type { createModelSelectionState } from "./model-selection.js"; -import type { TypingController } from "./typing.js"; import { resolveSessionAuthProfileOverride } from "../../agents/auth-profiles/session-override.js"; +import type { ExecToolDefaults } from "../../agents/bash-tools.js"; import { resolveModelAuthLabel } from "../../agents/model-auth-label.js"; import { abortEmbeddedPiRun, @@ -15,6 +8,7 @@ import { isEmbeddedPiRunStreaming, resolveEmbeddedSessionLane, } from "../../agents/pi-embedded.js"; +import type { OpenClawConfig } from "../../config/config.js"; import { resolveGroupSessionKey, resolveSessionFilePath, @@ -29,6 +23,7 @@ import { INTERNAL_MESSAGE_CHANNEL } from "../../utils/message-channel.js"; import { isReasoningTagProvider } from "../../utils/provider-utils.js"; import { hasControlCommand } from "../command-detection.js"; import { buildInboundMediaNote } from "../media-note.js"; +import type { MsgContext, TemplateContext } from "../templating.js"; import { type ElevatedLevel, formatXHighModelHint, @@ -39,15 +34,20 @@ import { type VerboseLevel, } from "../thinking.js"; import { SILENT_REPLY_TOKEN } from "../tokens.js"; +import type { GetReplyOptions, ReplyPayload } from "../types.js"; import { runReplyAgent } from "./agent-runner.js"; import { applySessionHints } from "./body.js"; +import type { buildCommandContext } from "./commands.js"; +import type { InlineDirectives } from "./directive-handling.js"; import { buildGroupChatContext, buildGroupIntro } from "./groups.js"; import { buildInboundMetaSystemPrompt, buildInboundUserContextPrefix } from "./inbound-meta.js"; +import type { createModelSelectionState } from "./model-selection.js"; import { resolveQueueSettings } from "./queue.js"; import { routeReply } from "./route-reply.js"; import { BARE_SESSION_RESET_PROMPT } from "./session-reset-prompt.js"; import { ensureSkillSnapshot, prependSystemEvents } from "./session-updates.js"; import { resolveTypingMode } from "./typing-mode.js"; +import type { TypingController } from "./typing.js"; import { appendUntrustedContext } from "./untrusted-context.js"; type AgentDefaults = NonNullable["defaults"]; diff --git a/src/cli/daemon-cli/install.ts b/src/cli/daemon-cli/install.ts index a96a9808913..337ed894216 100644 --- a/src/cli/daemon-cli/install.ts +++ b/src/cli/daemon-cli/install.ts @@ -1,4 +1,3 @@ -import type { DaemonInstallOptions } from "./types.js"; import { buildGatewayInstallPlan } from "../../commands/daemon-install-helpers.js"; import { DEFAULT_GATEWAY_DAEMON_RUNTIME, @@ -24,6 +23,7 @@ import { installDaemonServiceAndEmit, } from "./response.js"; import { parsePort } from "./shared.js"; +import type { DaemonInstallOptions } from "./types.js"; export async function runDaemonInstall(opts: DaemonInstallOptions) { const json = Boolean(opts.json); diff --git a/src/cli/run-main.exit.test.ts b/src/cli/run-main.exit.test.ts index 3135eb3b18e..dec658f572a 100644 --- a/src/cli/run-main.exit.test.ts +++ b/src/cli/run-main.exit.test.ts @@ -16,11 +16,8 @@ vi.mock("../infra/dotenv.js", () => ({ })); vi.mock("../infra/env.js", async (importOriginal) => { - const actual = await importOriginal(); - return { - ...actual, - normalizeEnv: normalizeEnvMock, - }; + const actual = await importOriginal(); + return Object.assign({}, actual, { normalizeEnv: normalizeEnvMock }); }); vi.mock("../infra/path-env.js", () => ({ diff --git a/src/cli/update-cli.ts b/src/cli/update-cli.ts index 207ffb236fa..8cb4325cef9 100644 --- a/src/cli/update-cli.ts +++ b/src/cli/update-cli.ts @@ -3,6 +3,7 @@ import { defaultRuntime } from "../runtime.js"; import { formatDocsLink } from "../terminal/links.js"; import { theme } from "../terminal/theme.js"; import { replaceCliName, resolveCliName } from "./cli-name.js"; +import { inheritOptionFromParent } from "./command-options.js"; import { formatHelpExamples } from "./help-format.js"; import { updateStatusCommand } from "./update-cli/status.js"; import { updateCommand } from "./update-cli/update-command.js"; diff --git a/src/commands/agent-via-gateway.e2e.test.ts b/src/commands/agent-via-gateway.e2e.test.ts index f8b7ada538b..dc5a20710ae 100644 --- a/src/commands/agent-via-gateway.e2e.test.ts +++ b/src/commands/agent-via-gateway.e2e.test.ts @@ -67,6 +67,7 @@ vi.mock("../gateway/client.js", () => { import type { OpenClawConfig } from "../config/config.js"; import * as configModule from "../config/config.js"; import { callGateway } from "../gateway/call.js"; +import type { RuntimeEnv } from "../runtime.js"; import { agentCliCommand, emitNdjsonLine } from "./agent-via-gateway.js"; import { agentCommand } from "./agent.js"; @@ -252,7 +253,7 @@ describe("agentCliCommand", () => { const store = path.join(dir, "sessions.json"); mockConfig(store); - vi.mocked(agentCommand).mockResolvedValueOnce(undefined); + mockLocalAgentReply(); try { await agentCliCommand({ message: "hi", to: "+1555", local: true, streamJson: true }, runtime); diff --git a/src/commands/agent-via-gateway.ts b/src/commands/agent-via-gateway.ts index d7745910c02..98de24f2f63 100644 --- a/src/commands/agent-via-gateway.ts +++ b/src/commands/agent-via-gateway.ts @@ -1,8 +1,7 @@ -import type { CliDeps } from "../cli/deps.js"; -import type { RuntimeEnv } from "../runtime.js"; import { listAgentIds } from "../agents/agent-scope.js"; import { DEFAULT_CHAT_CHANNEL } from "../channels/registry.js"; import { formatCliCommand } from "../cli/command-format.js"; +import type { CliDeps } from "../cli/deps.js"; import { withProgress } from "../cli/progress.js"; import { loadConfig, resolveConfigPath, resolveStateDir } from "../config/config.js"; import { @@ -15,6 +14,7 @@ import { PROTOCOL_VERSION } from "../gateway/protocol/index.js"; import { loadOrCreateDeviceIdentity } from "../infra/device-identity.js"; import { loadGatewayTlsRuntime } from "../infra/tls/gateway.js"; import { normalizeAgentId } from "../routing/session-key.js"; +import type { RuntimeEnv } from "../runtime.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES, diff --git a/src/commands/agent.ts b/src/commands/agent.ts index 4011e59cb20..100c39d2d9f 100644 --- a/src/commands/agent.ts +++ b/src/commands/agent.ts @@ -1,5 +1,4 @@ import path from "node:path"; -import type { AgentCommandOpts } from "./agent/types.js"; import { listAgentIds, resolveAgentDir, @@ -68,6 +67,7 @@ import { deliverAgentCommandResult } from "./agent/delivery.js"; import { resolveAgentRunContext } from "./agent/run-context.js"; import { updateSessionStoreAfterAgentRun } from "./agent/session-store.js"; import { resolveSession } from "./agent/session.js"; +import type { AgentCommandOpts } from "./agent/types.js"; type PersistSessionEntryParams = { sessionStore: Record; diff --git a/src/commands/configure.wizard.ts b/src/commands/configure.wizard.ts index 48a3a87ded3..6bb5b5a7394 100644 --- a/src/commands/configure.wizard.ts +++ b/src/commands/configure.wizard.ts @@ -1,15 +1,10 @@ -import type { OpenClawConfig } from "../config/config.js"; -import type { RuntimeEnv } from "../runtime.js"; -import type { - ChannelsWizardMode, - ConfigureWizardParams, - WizardSection, -} from "./configure.shared.js"; import { formatCliCommand } from "../cli/command-format.js"; +import type { OpenClawConfig } from "../config/config.js"; import { readConfigFileSnapshot, resolveGatewayPort, writeConfigFile } from "../config/config.js"; import { logConfigUpdated } from "../config/logging.js"; import { ensureWebAppBuilt } from "../gateway/server-web-app.js"; import { ensureControlUiAssetsBuilt } from "../infra/control-ui-assets.js"; +import type { RuntimeEnv } from "../runtime.js"; import { defaultRuntime } from "../runtime.js"; import { note } from "../terminal/note.js"; import { resolveUserPath } from "../utils.js"; @@ -19,6 +14,11 @@ import { removeChannelConfigWizard } from "./configure.channels.js"; import { maybeInstallDaemon } from "./configure.daemon.js"; import { promptAuthConfig } from "./configure.gateway-auth.js"; import { promptGatewayConfig } from "./configure.gateway.js"; +import type { + ChannelsWizardMode, + ConfigureWizardParams, + WizardSection, +} from "./configure.shared.js"; import { CONFIGURE_SECTION_OPTIONS, confirm, diff --git a/src/commands/onboard-non-interactive/local/daemon-install.ts b/src/commands/onboard-non-interactive/local/daemon-install.ts index 30b34fb37b3..792a639d3d2 100644 --- a/src/commands/onboard-non-interactive/local/daemon-install.ts +++ b/src/commands/onboard-non-interactive/local/daemon-install.ts @@ -1,11 +1,12 @@ import type { OpenClawConfig } from "../../../config/config.js"; -import type { OnboardOptions } from "../../onboard-types.js"; import { resolveGatewayService } from "../../../daemon/service.js"; import { isSystemdUserServiceAvailable } from "../../../daemon/systemd.js"; import { ensureWebAppBuilt } from "../../../gateway/server-web-app.js"; import { ensureControlUiAssetsBuilt } from "../../../infra/control-ui-assets.js"; +import type { RuntimeEnv } from "../../../runtime.js"; import { buildGatewayInstallPlan, gatewayInstallErrorHint } from "../../daemon-install-helpers.js"; import { DEFAULT_GATEWAY_DAEMON_RUNTIME, isGatewayDaemonRuntime } from "../../daemon-runtime.js"; +import type { OnboardOptions } from "../../onboard-types.js"; import { ensureSystemdUserLingerNonInteractive } from "../../systemd-linger.js"; export async function installGatewayDaemonNonInteractive(params: { diff --git a/src/commands/onboard-non-interactive/local/gateway-config.ts b/src/commands/onboard-non-interactive/local/gateway-config.ts index edffb7413e1..b5c0bd2435a 100644 --- a/src/commands/onboard-non-interactive/local/gateway-config.ts +++ b/src/commands/onboard-non-interactive/local/gateway-config.ts @@ -1,7 +1,7 @@ import type { OpenClawConfig } from "../../../config/config.js"; import type { RuntimeEnv } from "../../../runtime.js"; -import type { OnboardOptions } from "../../onboard-types.js"; import { randomToken } from "../../onboard-helpers.js"; +import type { OnboardOptions } from "../../onboard-types.js"; export function applyNonInteractiveGatewayConfig(params: { nextConfig: OpenClawConfig; diff --git a/src/config/sessions/types.ts b/src/config/sessions/types.ts index 432f7644f5e..afaaef84f0f 100644 --- a/src/config/sessions/types.ts +++ b/src/config/sessions/types.ts @@ -1,5 +1,5 @@ -import type { Skill } from "@mariozechner/pi-coding-agent"; import crypto from "node:crypto"; +import type { Skill } from "@mariozechner/pi-coding-agent"; import type { ChatType } from "../../channels/chat-type.js"; import type { ChannelId } from "../../channels/plugins/types.js"; import type { DeliveryContext } from "../../utils/delivery-context.js"; diff --git a/src/config/types.gateway.ts b/src/config/types.gateway.ts index 34061f2d59b..316156ec0b4 100644 --- a/src/config/types.gateway.ts +++ b/src/config/types.gateway.ts @@ -323,6 +323,11 @@ export type GatewayConfig = { * to determine the client IP for local pairing and HTTP checks. */ trustedProxies?: string[]; + /** + * When true, fall back to X-Real-IP header if X-Forwarded-For is absent. + * Only applies when trustedProxies is configured. + */ + allowRealIpFallback?: boolean; /** Ironclaw Next.js web app served alongside the gateway. */ webApp?: GatewayWebAppConfig; /** Tool access restrictions for HTTP /tools/invoke endpoint. */ diff --git a/src/gateway/server-close.ts b/src/gateway/server-close.ts index 0f1ebe29864..f231162fdba 100644 --- a/src/gateway/server-close.ts +++ b/src/gateway/server-close.ts @@ -1,11 +1,11 @@ import type { Server as HttpServer } from "node:http"; import type { WebSocketServer } from "ws"; import type { CanvasHostHandler, CanvasHostServer } from "../canvas-host/server.js"; +import { type ChannelId, listChannelPlugins } from "../channels/plugins/index.js"; +import { stopGmailWatcher } from "../hooks/gmail-watcher.js"; import type { HeartbeatRunner } from "../infra/heartbeat-runner.js"; import type { PluginServicesHandle } from "../plugins/services.js"; import type { WebAppHandle } from "./server-web-app.js"; -import { type ChannelId, listChannelPlugins } from "../channels/plugins/index.js"; -import { stopGmailWatcher } from "../hooks/gmail-watcher.js"; export function createGatewayCloseHandler(params: { bonjourStop: (() => Promise) | null; diff --git a/src/gateway/server-methods/agent.ts b/src/gateway/server-methods/agent.ts index 0664d7cdb4e..b6d3430b431 100644 --- a/src/gateway/server-methods/agent.ts +++ b/src/gateway/server-methods/agent.ts @@ -1,5 +1,4 @@ import { randomUUID } from "node:crypto"; -import type { GatewayRequestHandlerOptions, GatewayRequestHandlers } from "./types.js"; import { listAgentIds } from "../../agents/agent-scope.js"; import { BARE_SESSION_RESET_PROMPT } from "../../auto-reply/reply/session-reset-prompt.js"; import { agentCommand } from "../../commands/agent.js"; @@ -52,6 +51,7 @@ import { waitForAgentJob } from "./agent-job.js"; import { injectTimestamp, timestampOptsFromConfig } from "./agent-timestamp.js"; import { normalizeRpcAttachmentsToChatAttachments } from "./attachment-normalize.js"; import { sessionsHandlers } from "./sessions.js"; +import type { GatewayRequestHandlerOptions, GatewayRequestHandlers } from "./types.js"; const RESET_COMMAND_RE = /^\/(new|reset)(?:\s+([\s\S]*))?$/i; @@ -694,19 +694,21 @@ export const agentHandlers: GatewayRequestHandlers = { }, "agent.subscribe": ({ params, client, respond, context }) => { - const validated = validateAgentSubscribeParams(params); - if (!validated.ok) { + if (!validateAgentSubscribeParams(params)) { respond( false, undefined, - errorShape(ErrorCodes.INVALID_PARAMS, formatValidationErrors(validated.errors)), + errorShape( + ErrorCodes.INVALID_REQUEST, + `invalid agent.subscribe params: ${formatValidationErrors(validateAgentSubscribeParams.errors)}`, + ), ); return; } - const p = validated.value; + const p = params; const connId = client?.connId; if (!connId) { - respond(false, undefined, errorShape(ErrorCodes.INVALID_PARAMS, "no connection id")); + respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "no connection id")); return; } context.registerSessionSubscription(p.sessionKey, connId); @@ -718,21 +720,23 @@ export const agentHandlers: GatewayRequestHandlers = { }, "agent.unsubscribe": ({ params, client, respond, context }) => { - const validated = validateAgentUnsubscribeParams(params); - if (!validated.ok) { + if (!validateAgentUnsubscribeParams(params)) { respond( false, undefined, - errorShape(ErrorCodes.INVALID_PARAMS, formatValidationErrors(validated.errors)), + errorShape( + ErrorCodes.INVALID_REQUEST, + `invalid agent.unsubscribe params: ${formatValidationErrors(validateAgentUnsubscribeParams.errors)}`, + ), ); return; } const connId = client?.connId; if (!connId) { - respond(false, undefined, errorShape(ErrorCodes.INVALID_PARAMS, "no connection id")); + respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, "no connection id")); return; } - context.unregisterSessionSubscription(validated.value.sessionKey, connId); + context.unregisterSessionSubscription(params.sessionKey, connId); respond(true, {}); }, }; diff --git a/src/gateway/server-methods/chat.ts b/src/gateway/server-methods/chat.ts index ddf3cd83464..bfae1d38ee6 100644 --- a/src/gateway/server-methods/chat.ts +++ b/src/gateway/server-methods/chat.ts @@ -1,13 +1,12 @@ -import { CURRENT_SESSION_VERSION, SessionManager } from "@mariozechner/pi-coding-agent"; import fs from "node:fs"; import path from "node:path"; -import type { MsgContext } from "../../auto-reply/templating.js"; -import type { GatewayRequestContext, GatewayRequestHandlers } from "./types.js"; +import { CURRENT_SESSION_VERSION, SessionManager } from "@mariozechner/pi-coding-agent"; import { resolveSessionAgentId } from "../../agents/agent-scope.js"; import { resolveThinkingDefault } from "../../agents/model-selection.js"; import { resolveAgentTimeoutMs } from "../../agents/timeout.js"; import { dispatchInboundMessage } from "../../auto-reply/dispatch.js"; import { createReplyDispatcher } from "../../auto-reply/reply/reply-dispatcher.js"; +import type { MsgContext } from "../../auto-reply/templating.js"; import { createReplyPrefixOptions } from "../../channels/reply-prefix.js"; import { resolveSessionFilePath } from "../../config/sessions.js"; import { resolveSendPolicy } from "../../sessions/send-policy.js"; @@ -43,6 +42,7 @@ import { import { formatForLog } from "../ws-log.js"; import { injectTimestamp, timestampOptsFromConfig } from "./agent-timestamp.js"; import { normalizeRpcAttachmentsToChatAttachments } from "./attachment-normalize.js"; +import type { GatewayRequestContext, GatewayRequestHandlers } from "./types.js"; type TranscriptAppendResult = { ok: boolean; @@ -417,7 +417,7 @@ function appendAssistantTranscriptMessage(params: { // IMPORTANT: Use SessionManager so the entry is attached to the current leaf via parentId. // Raw jsonl appends break the parent chain and can hide compaction summaries from context. const sessionManager = SessionManager.open(transcriptPath); - const messageId = sessionManager.appendMessage(messageBody); + const messageId = sessionManager.appendMessage(messageBody as unknown as AppendMessageArg); return { ok: true, messageId, message: messageBody }; } catch (err) { return { ok: false, error: err instanceof Error ? err.message : String(err) }; @@ -478,7 +478,7 @@ function appendUserTranscriptMessage(params: { // IMPORTANT: Use SessionManager so the entry is attached to the current leaf via parentId. // Raw jsonl appends break the parent chain and can hide compaction summaries from context. const sessionManager = SessionManager.open(transcriptPath); - const messageId = sessionManager.appendMessage(messageBody); + const messageId = sessionManager.appendMessage(messageBody as unknown as AppendMessageArg); return { ok: true, messageId, message: messageBody }; } catch (err) { return { ok: false, error: err instanceof Error ? err.message : String(err) }; diff --git a/src/gateway/server-runtime-state.ts b/src/gateway/server-runtime-state.ts index ba65f9055dd..62d736ca8b1 100644 --- a/src/gateway/server-runtime-state.ts +++ b/src/gateway/server-runtime-state.ts @@ -1,5 +1,7 @@ import type { Server as HttpServer } from "node:http"; import { WebSocketServer } from "ws"; +import { CANVAS_HOST_PATH } from "../canvas-host/a2ui.js"; +import { type CanvasHostHandler, createCanvasHostHandler } from "../canvas-host/server.js"; import type { CliDeps } from "../cli/deps.js"; import type { createSubsystemLogger } from "../logging/subsystem.js"; import type { PluginRegistry } from "../plugins/registry.js"; @@ -9,11 +11,6 @@ import type { ResolvedGatewayAuth } from "./auth.js"; import type { ChatAbortControllerEntry } from "./chat-abort.js"; import type { ControlUiRootState } from "./control-ui.js"; import type { HooksConfigResolved } from "./hooks.js"; -import type { DedupeEntry } from "./server-shared.js"; -import type { GatewayTlsRuntime } from "./server/tls.js"; -import type { GatewayWsClient } from "./server/ws-types.js"; -import { CANVAS_HOST_PATH } from "../canvas-host/a2ui.js"; -import { type CanvasHostHandler, createCanvasHostHandler } from "../canvas-host/server.js"; import { resolveGatewayListenHosts } from "./net.js"; import { createGatewayBroadcaster, @@ -22,6 +19,8 @@ import { } from "./server-broadcast.js"; import { type ChatRunEntry, + type SessionEventLog, + type SessionSubscriptionRegistry, createChatRunState, createToolEventRecipientRegistry, createSessionEventLog, @@ -29,9 +28,12 @@ import { } from "./server-chat.js"; import { MAX_PAYLOAD_BYTES } from "./server-constants.js"; import { attachGatewayUpgradeHandler, createGatewayHttpServer } from "./server-http.js"; +import type { DedupeEntry } from "./server-shared.js"; import { createGatewayHooksRequestHandler } from "./server/hooks.js"; import { listenGatewayHttpServer } from "./server/http-listen.js"; import { createGatewayPluginRequestHandler } from "./server/plugins-http.js"; +import type { GatewayTlsRuntime } from "./server/tls.js"; +import type { GatewayWsClient } from "./server/ws-types.js"; export async function createGatewayRuntimeState(params: { cfg: import("../config/config.js").OpenClawConfig; @@ -79,6 +81,8 @@ export async function createGatewayRuntimeState(params: { ) => ChatRunEntry | undefined; chatAbortControllers: Map; toolEventRecipients: ReturnType; + sessionEventLog: SessionEventLog; + sessionSubscriptions: SessionSubscriptionRegistry; }> { let canvasHost: CanvasHostHandler | null = null; if (params.canvasHostEnabled) { diff --git a/src/gateway/server-startup.ts b/src/gateway/server-startup.ts index ec49255676b..8e84fe59206 100644 --- a/src/gateway/server-startup.ts +++ b/src/gateway/server-startup.ts @@ -1,6 +1,3 @@ -import type { CliDeps } from "../cli/deps.js"; -import type { loadConfig } from "../config/config.js"; -import type { loadOpenClawPlugins } from "../plugins/loader.js"; import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js"; import { loadModelCatalog } from "../agents/model-catalog.js"; import { @@ -10,6 +7,8 @@ import { } from "../agents/model-selection.js"; import { resolveAgentSessionDirs } from "../agents/session-dirs.js"; import { cleanStaleLockFiles } from "../agents/session-write-lock.js"; +import type { CliDeps } from "../cli/deps.js"; +import type { loadConfig } from "../config/config.js"; import { resolveStateDir } from "../config/paths.js"; import { startGmailWatcherWithLogs } from "../hooks/gmail-watcher-lifecycle.js"; import { @@ -19,6 +18,7 @@ import { } from "../hooks/internal-hooks.js"; import { loadInternalHooks } from "../hooks/loader.js"; import { isTruthyEnvValue } from "../infra/env.js"; +import type { loadOpenClawPlugins } from "../plugins/loader.js"; import { type PluginServicesHandle, startPluginServices } from "../plugins/services.js"; import { startBrowserControlServerIfEnabled } from "./server-browser.js"; import { diff --git a/src/gateway/server-web-app.test.ts b/src/gateway/server-web-app.test.ts index eac346f61db..01c9e09a999 100644 --- a/src/gateway/server-web-app.test.ts +++ b/src/gateway/server-web-app.test.ts @@ -42,7 +42,7 @@ describe("server-web-app", () => { it("returns true when standalone server.js exists", async () => { const { hasStandaloneBuild, resolveStandaloneServerJs } = await import("./server-web-app.js"); const webAppDir = "/pkg/apps/web"; - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { return String(p) === resolveStandaloneServerJs(webAppDir); }); expect(hasStandaloneBuild(webAppDir)).toBe(true); @@ -60,7 +60,7 @@ describe("server-web-app", () => { describe("hasLegacyNextBuild", () => { it("returns true when .next/BUILD_ID exists", async () => { const { hasLegacyNextBuild } = await import("./server-web-app.js"); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { return String(p).endsWith(path.join(".next", "BUILD_ID")); }); expect(hasLegacyNextBuild("/pkg/apps/web")).toBe(true); @@ -78,7 +78,7 @@ describe("server-web-app", () => { describe("isInWorkspace", () => { it("returns true when pnpm-workspace.yaml exists at root", async () => { const { isInWorkspace } = await import("./server-web-app.js"); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { return String(p).endsWith("pnpm-workspace.yaml"); }); expect(isInWorkspace("/proj/apps/web")).toBe(true); @@ -132,7 +132,7 @@ describe("server-web-app", () => { it("returns ok when standalone build exists", async () => { const { ensureWebAppBuilt } = await import("./server-web-app.js"); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -148,7 +148,7 @@ describe("server-web-app", () => { it("returns ok when legacy .next/BUILD_ID exists (dev workspace)", async () => { const { ensureWebAppBuilt } = await import("./server-web-app.js"); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -164,7 +164,7 @@ describe("server-web-app", () => { it("returns error for global install when no build found", async () => { const { ensureWebAppBuilt } = await import("./server-web-app.js"); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); // Only the package.json exists — no build, no workspace. if (s.endsWith(path.join("apps", "web", "package.json"))) { @@ -266,7 +266,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled } = await import("./server-web-app.js"); mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -304,7 +304,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled } = await import("./server-web-app.js"); mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -337,7 +337,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled } = await import("./server-web-app.js"); mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); // Only package.json exists — no builds, no workspace. if (s.endsWith(path.join("apps", "web", "package.json"))) { @@ -359,7 +359,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled, DEFAULT_WEB_APP_PORT } = await import("./server-web-app.js"); mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -383,7 +383,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled } = await import("./server-web-app.js"); const child = mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -415,7 +415,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled } = await import("./server-web-app.js"); const child = mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -450,7 +450,7 @@ describe("server-web-app", () => { // resolveWebAppDir() needs to find a valid directory before reaching // the port check, so mock existsSync for the package.json check. - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; @@ -491,7 +491,7 @@ describe("server-web-app", () => { const { startWebAppIfEnabled } = await import("./server-web-app.js"); mockChildProcess(); - existsSyncSpy.mockImplementation((p) => { + existsSyncSpy.mockImplementation((p: unknown) => { const s = String(p); if (s.endsWith(path.join("apps", "web", "package.json"))) { return true; diff --git a/src/gateway/server.impl.ts b/src/gateway/server.impl.ts index b9dbf45ac1f..8c1d58e8177 100644 --- a/src/gateway/server.impl.ts +++ b/src/gateway/server.impl.ts @@ -1,14 +1,10 @@ import path from "node:path"; -import type { CanvasHostServer } from "../canvas-host/server.js"; -import type { PluginServicesHandle } from "../plugins/services.js"; -import type { RuntimeEnv } from "../runtime.js"; -import type { ControlUiRootState } from "./control-ui.js"; -import type { startBrowserControlServerIfEnabled } from "./server-browser.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { getActiveEmbeddedRunCount } from "../agents/pi-embedded-runner/runs.js"; import { registerSkillsChangeListener } from "../agents/skills/refresh.js"; import { initSubagentRegistry } from "../agents/subagent-registry.js"; import { getTotalPendingReplies } from "../auto-reply/reply/dispatcher-registry.js"; +import type { CanvasHostServer } from "../canvas-host/server.js"; import { type ChannelId, listChannelPlugins } from "../channels/plugins/index.js"; import { formatCliCommand } from "../cli/command-format.js"; import { createDefaultDeps } from "../cli/deps.js"; @@ -46,17 +42,21 @@ import { startDiagnosticHeartbeat, stopDiagnosticHeartbeat } from "../logging/di import { createSubsystemLogger, runtimeForLogger } from "../logging/subsystem.js"; import { getGlobalHookRunner, runGlobalGatewayStopSafely } from "../plugins/hook-runner-global.js"; import { createEmptyPluginRegistry } from "../plugins/registry.js"; +import type { PluginServicesHandle } from "../plugins/services.js"; import { getTotalQueueSize } from "../process/command-queue.js"; +import type { RuntimeEnv } from "../runtime.js"; import { runOnboardingWizard } from "../wizard/onboarding.js"; import { createAuthRateLimiter, type AuthRateLimiter } from "./auth-rate-limit.js"; import { startChannelHealthMonitor } from "./channel-health-monitor.js"; import { startGatewayConfigReloader } from "./config-reload.js"; +import type { ControlUiRootState } from "./control-ui.js"; import { GATEWAY_EVENT_UPDATE_AVAILABLE, type GatewayUpdateAvailableEventPayload, } from "./events.js"; import { ExecApprovalManager } from "./exec-approval-manager.js"; import { NodeRegistry } from "./node-registry.js"; +import type { startBrowserControlServerIfEnabled } from "./server-browser.js"; import { createChannelManager } from "./server-channels.js"; import { createAgentEventHandler } from "./server-chat.js"; import { createGatewayCloseHandler } from "./server-close.js"; diff --git a/src/hooks/llm-slug-generator.ts b/src/hooks/llm-slug-generator.ts index 05eed7bc416..438cfcee045 100644 --- a/src/hooks/llm-slug-generator.ts +++ b/src/hooks/llm-slug-generator.ts @@ -5,7 +5,6 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import type { OpenClawConfig } from "../config/config.js"; import { resolveDefaultAgentId, resolveAgentWorkspaceDir, @@ -14,6 +13,7 @@ import { import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js"; import { resolveConfiguredModelRef } from "../agents/model-selection.js"; import { runEmbeddedPiAgent } from "../agents/pi-embedded.js"; +import type { OpenClawConfig } from "../config/config.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; const log = createSubsystemLogger("llm-slug-generator"); diff --git a/src/infra/ports-format.ts b/src/infra/ports-format.ts index be79c131601..29f70a010e4 100644 --- a/src/infra/ports-format.ts +++ b/src/infra/ports-format.ts @@ -1,5 +1,5 @@ -import type { PortListener, PortListenerKind, PortUsage } from "./ports-types.js"; import { formatCliCommand } from "../cli/command-format.js"; +import type { PortListener, PortListenerKind, PortUsage } from "./ports-types.js"; export function classifyPortListener(listener: PortListener, port: number): PortListenerKind { const raw = `${listener.commandLine ?? ""} ${listener.command ?? ""}`.trim().toLowerCase(); diff --git a/src/memory/embeddings.ts b/src/memory/embeddings.ts index e70ce85bb13..3945bcc6653 100644 --- a/src/memory/embeddings.ts +++ b/src/memory/embeddings.ts @@ -1,5 +1,5 @@ -import type { Llama, LlamaEmbeddingContext, LlamaModel } from "node-llama-cpp"; import fsSync from "node:fs"; +import type { Llama, LlamaEmbeddingContext, LlamaModel } from "node-llama-cpp"; import type { OpenClawConfig } from "../config/config.js"; import { formatErrorMessage } from "../infra/errors.js"; import { resolveUserPath } from "../utils.js"; diff --git a/src/security/audit.ts b/src/security/audit.ts index 4ea0408bf51..bd195f80a2d 100644 --- a/src/security/audit.ts +++ b/src/security/audit.ts @@ -1,11 +1,10 @@ -import type { OpenClawConfig } from "../config/config.js"; -import type { ExecFn } from "./windows-acl.js"; import { resolveSandboxConfigForAgent } from "../agents/sandbox.js"; import { execDockerRaw } from "../agents/sandbox/docker.js"; import { resolveBrowserConfig, resolveProfile } from "../browser/config.js"; import { resolveBrowserControlAuth } from "../browser/control-auth.js"; import { listChannelPlugins } from "../channels/plugins/index.js"; import { formatCliCommand } from "../cli/command-format.js"; +import type { OpenClawConfig } from "../config/config.js"; import { resolveConfigPath, resolveStateDir } from "../config/paths.js"; import { resolveGatewayAuth } from "../gateway/auth.js"; import { buildGatewayConnectionDetails } from "../gateway/call.js"; @@ -40,6 +39,7 @@ import { inspectPathPermissions, } from "./audit-fs.js"; import { DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./dangerous-tools.js"; +import type { ExecFn } from "./windows-acl.js"; export type SecurityAuditSeverity = "info" | "warn" | "critical"; diff --git a/src/telegram/bot.create-telegram-bot.test.ts b/src/telegram/bot.create-telegram-bot.test.ts index 7089e8b455f..80c6ff1e76d 100644 --- a/src/telegram/bot.create-telegram-bot.test.ts +++ b/src/telegram/bot.create-telegram-bot.test.ts @@ -1,7 +1,7 @@ -import type { Chat, Message } from "@grammyjs/types"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import type { Chat, Message } from "@grammyjs/types"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { escapeRegExp, formatEnvelopeTimestamp } from "../../test/helpers/envelope-timestamp.js"; import { withEnvAsync } from "../test-utils/env.js"; diff --git a/src/telegram/bot.test.ts b/src/telegram/bot.test.ts index 66e2b3b9b95..df6f14745cd 100644 --- a/src/telegram/bot.test.ts +++ b/src/telegram/bot.test.ts @@ -13,10 +13,12 @@ import { enqueueSystemEventSpy, getLoadConfigMock, getReadChannelAllowFromStoreMock, + getUpsertChannelPairingRequestMock, getOnHandler, listSkillCommandsForAgents, onSpy, replySpy, + sendChatActionSpy, sendMessageSpy, setMyCommandsSpy, wasSentByBot, @@ -25,6 +27,7 @@ import { createTelegramBot } from "./bot.js"; const loadConfig = getLoadConfigMock(); const readChannelAllowFromStore = getReadChannelAllowFromStoreMock(); +const upsertChannelPairingRequest = getUpsertChannelPairingRequestMock(); function resolveSkillCommands(config: Parameters[0]) { void config; @@ -280,7 +283,6 @@ describe("createTelegramBot", () => { try { onSpy.mockReset(); - const replySpy = replyModule.__replySpy as unknown as ReturnType; replySpy.mockReset(); createTelegramBot({ token: "tok" }); @@ -321,7 +323,6 @@ describe("createTelegramBot", () => { it("requests pairing by default for unknown DM senders", async () => { onSpy.mockReset(); sendMessageSpy.mockReset(); - const replySpy = replyModule.__replySpy as unknown as ReturnType; replySpy.mockReset(); loadConfig.mockReturnValue({ @@ -361,7 +362,6 @@ describe("createTelegramBot", () => { it("does not resend pairing code when a request is already pending", async () => { onSpy.mockReset(); sendMessageSpy.mockReset(); - const replySpy = replyModule.__replySpy as unknown as ReturnType; replySpy.mockReset(); loadConfig.mockReturnValue({ @@ -414,7 +414,6 @@ describe("createTelegramBot", () => { it("accepts group messages when mentionPatterns match (without @botUsername)", async () => { onSpy.mockReset(); - const replySpy = replyModule.__replySpy as unknown as ReturnType; replySpy.mockReset(); loadConfig.mockReturnValue({ diff --git a/src/tui/tui.ts b/src/tui/tui.ts index 4b65e7f5c0f..9b32c50f74d 100644 --- a/src/tui/tui.ts +++ b/src/tui/tui.ts @@ -8,13 +8,6 @@ import { Text, TUI, } from "@mariozechner/pi-tui"; -import type { - AgentSummary, - SessionInfo, - SessionScope, - TuiOptions, - TuiStateAccess, -} from "./tui-types.js"; import { resolveDefaultAgentId } from "../agents/agent-scope.js"; import { loadConfig } from "../config/config.js"; import { @@ -34,6 +27,13 @@ import { formatTokens } from "./tui-formatters.js"; import { createLocalShellRunner } from "./tui-local-shell.js"; import { createOverlayHandlers } from "./tui-overlays.js"; import { createSessionActions } from "./tui-session-actions.js"; +import type { + AgentSummary, + SessionInfo, + SessionScope, + TuiOptions, + TuiStateAccess, +} from "./tui-types.js"; import { buildWaitingStatusMessage, defaultWaitingPhrases } from "./tui-waiting.js"; export { resolveFinalAssistantText } from "./tui-formatters.js"; diff --git a/src/wizard/onboarding.finalize.ts b/src/wizard/onboarding.finalize.ts index 12a2f0f3e8e..531c4eea69c 100644 --- a/src/wizard/onboarding.finalize.ts +++ b/src/wizard/onboarding.finalize.ts @@ -1,8 +1,3 @@ -import type { OnboardOptions } from "../commands/onboard-types.js"; -import type { OpenClawConfig } from "../config/config.js"; -import type { RuntimeEnv } from "../runtime.js"; -import type { GatewayWizardSettings, WizardFlow } from "./onboarding.types.js"; -import type { WizardPrompter } from "./prompts.js"; import { formatCliCommand } from "../cli/command-format.js"; import { buildGatewayInstallPlan, @@ -22,6 +17,8 @@ import { waitForGatewayReachable, resolveControlUiLinks, } from "../commands/onboard-helpers.js"; +import type { OnboardOptions } from "../commands/onboard-types.js"; +import type { OpenClawConfig } from "../config/config.js"; import { resolveGatewayService } from "../daemon/service.js"; import { isSystemdUserServiceAvailable } from "../daemon/systemd.js"; import { @@ -30,7 +27,10 @@ import { probeForWebApp, } from "../gateway/server-web-app.js"; import { ensureControlUiAssetsBuilt } from "../infra/control-ui-assets.js"; +import type { RuntimeEnv } from "../runtime.js"; import { setupOnboardingShellCompletion } from "./onboarding.completion.js"; +import type { GatewayWizardSettings, WizardFlow } from "./onboarding.types.js"; +import type { WizardPrompter } from "./prompts.js"; type FinalizeOnboardingOptions = { flow: WizardFlow; diff --git a/src/wizard/onboarding.gateway-config.ts b/src/wizard/onboarding.gateway-config.ts index 5d393707d6f..b50e8dcd561 100644 --- a/src/wizard/onboarding.gateway-config.ts +++ b/src/wizard/onboarding.gateway-config.ts @@ -1,24 +1,24 @@ -import type { GatewayAuthChoice } from "../commands/onboard-types.js"; -import type { GatewayBindMode, GatewayTailscaleMode, OpenClawConfig } from "../config/config.js"; -import type { RuntimeEnv } from "../runtime.js"; -import type { - GatewayWizardSettings, - QuickstartGatewayDefaults, - WizardFlow, -} from "./onboarding.types.js"; -import type { WizardPrompter } from "./prompts.js"; import { normalizeGatewayTokenInput, randomToken, validateGatewayPasswordInput, } from "../commands/onboard-helpers.js"; +import type { GatewayAuthChoice } from "../commands/onboard-types.js"; +import type { GatewayBindMode, GatewayTailscaleMode, OpenClawConfig } from "../config/config.js"; import { TAILSCALE_DOCS_LINES, TAILSCALE_EXPOSURE_OPTIONS, TAILSCALE_MISSING_BIN_NOTE_LINES, } from "../gateway/gateway-config-prompts.shared.js"; import { findTailscaleBinary } from "../infra/tailscale.js"; +import type { RuntimeEnv } from "../runtime.js"; import { validateIPv4AddressInput } from "../shared/net/ipv4.js"; +import type { + GatewayWizardSettings, + QuickstartGatewayDefaults, + WizardFlow, +} from "./onboarding.types.js"; +import type { WizardPrompter } from "./prompts.js"; // These commands are "high risk" (privacy writes/recording) and should be // explicitly armed by the user when they want to use them. diff --git a/src/wizard/onboarding.test.ts b/src/wizard/onboarding.test.ts index 0ccb9a239b6..8f6dd64f01e 100644 --- a/src/wizard/onboarding.test.ts +++ b/src/wizard/onboarding.test.ts @@ -2,10 +2,10 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import type { RuntimeEnv } from "../runtime.js"; -import type { WizardPrompter, WizardSelectParams } from "./prompts.js"; import { DEFAULT_BOOTSTRAP_FILENAME } from "../agents/workspace.js"; +import type { RuntimeEnv } from "../runtime.js"; import { runOnboardingWizard } from "./onboarding.js"; +import type { WizardPrompter, WizardSelectParams } from "./prompts.js"; const ensureAuthProfileStore = vi.hoisted(() => vi.fn(() => ({ profiles: {} }))); const promptAuthChoiceGrouped = vi.hoisted(() => vi.fn(async () => "skip")); diff --git a/src/wizard/onboarding.ts b/src/wizard/onboarding.ts index 4d455655ad5..5cb49bace84 100644 --- a/src/wizard/onboarding.ts +++ b/src/wizard/onboarding.ts @@ -1,3 +1,4 @@ +import { formatCliCommand } from "../cli/command-format.js"; import type { GatewayAuthChoice, OnboardMode, @@ -5,17 +6,16 @@ import type { ResetScope, } from "../commands/onboard-types.js"; import type { OpenClawConfig } from "../config/config.js"; -import type { RuntimeEnv } from "../runtime.js"; -import type { QuickstartGatewayDefaults, WizardFlow } from "./onboarding.types.js"; -import { formatCliCommand } from "../cli/command-format.js"; import { DEFAULT_GATEWAY_PORT, readConfigFileSnapshot, resolveGatewayPort, writeConfigFile, } from "../config/config.js"; +import type { RuntimeEnv } from "../runtime.js"; import { defaultRuntime } from "../runtime.js"; import { resolveUserPath } from "../utils.js"; +import type { QuickstartGatewayDefaults, WizardFlow } from "./onboarding.types.js"; import { WizardCancelledError, type WizardPrompter } from "./prompts.js"; async function requireRiskAcknowledgement(params: { diff --git a/ui/src/ui/app-chat.ts b/ui/src/ui/app-chat.ts index 3ff6ad1d052..fa3053192f1 100644 --- a/ui/src/ui/app-chat.ts +++ b/ui/src/ui/app-chat.ts @@ -1,13 +1,13 @@ -import type { OpenClawApp } from "./app.ts"; -import type { GatewayHelloOk } from "./gateway.ts"; -import type { ChatAttachment, ChatQueueItem } from "./ui-types.ts"; import { parseAgentSessionKey } from "../../../src/sessions/session-key-utils.js"; import { scheduleChatScroll } from "./app-scroll.ts"; import { setLastActiveSessionKey } from "./app-settings.ts"; import { resetToolStream } from "./app-tool-stream.ts"; +import type { OpenClawApp } from "./app.ts"; import { abortChatRun, loadChatHistory, sendChatMessage } from "./controllers/chat.ts"; import { loadSessions } from "./controllers/sessions.ts"; +import type { GatewayHelloOk } from "./gateway.ts"; import { normalizeBasePath } from "./navigation.ts"; +import type { ChatAttachment, ChatQueueItem } from "./ui-types.ts"; import { generateUUID } from "./uuid.ts"; export type ChatHost = {