@poolzin/pool-bot 2026.2.11 → 2026.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/agents/agent-scope.js +4 -0
- package/dist/agents/announce-idempotency.js +14 -0
- package/dist/agents/auth-profiles/usage.js +22 -0
- package/dist/agents/auth-profiles.js +1 -1
- package/dist/agents/auth-profiles.resolve-auth-profile-order.fixtures.js +23 -0
- package/dist/agents/bash-tools.exec-runtime.js +438 -0
- package/dist/agents/bash-tools.shared.js +6 -0
- package/dist/agents/cli-runner/reliability.js +61 -0
- package/dist/agents/cli-watchdog-defaults.js +11 -0
- package/dist/agents/command-poll-backoff.js +63 -0
- package/dist/agents/current-time.js +16 -0
- package/dist/agents/glob-pattern.js +42 -0
- package/dist/agents/memory-search.js +33 -0
- package/dist/agents/model-alias-lines.js +18 -0
- package/dist/agents/model-auth-label.js +61 -0
- package/dist/agents/model-fallback.js +59 -8
- package/dist/agents/models-config.e2e-harness.js +115 -0
- package/dist/agents/ollama-stream.js +11 -3
- package/dist/agents/openclaw-tools.js +135 -0
- package/dist/agents/pi-auth-json.js +118 -0
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +147 -0
- package/dist/agents/pi-embedded-subscribe.e2e-harness.js +90 -0
- package/dist/agents/pi-embedded-subscribe.handlers.compaction.js +63 -0
- package/dist/agents/pi-embedded-subscribe.handlers.tools.media.test-helpers.js +30 -0
- package/dist/agents/pi-extensions/session-manager-runtime-registry.js +23 -0
- package/dist/agents/pi-tools.before-tool-call.js +145 -4
- package/dist/agents/pi-tools.js +29 -9
- package/dist/agents/pi-tools.policy.js +85 -92
- package/dist/agents/pi-tools.schema.js +54 -27
- package/dist/agents/queued-file-writer.js +22 -0
- package/dist/agents/sandbox/docker.js +133 -40
- package/dist/agents/sandbox/fs-bridge.js +146 -0
- package/dist/agents/sandbox/fs-paths.js +205 -0
- package/dist/agents/sandbox/hash.js +4 -0
- package/dist/agents/sandbox/validate-sandbox-security.js +157 -0
- package/dist/agents/sandbox-paths.js +3 -0
- package/dist/agents/sandbox-tool-policy.js +26 -0
- package/dist/agents/sanitize-for-prompt.js +18 -0
- package/dist/agents/session-dirs.js +20 -0
- package/dist/agents/session-write-lock.js +203 -39
- package/dist/agents/skills/filter.js +24 -0
- package/dist/agents/skills/tools-dir.js +9 -0
- package/dist/agents/skills-install-download.js +290 -0
- package/dist/agents/skills-install-output.js +30 -0
- package/dist/agents/skills-install.download-test-utils.js +36 -0
- package/dist/agents/skills.e2e-test-helpers.js +13 -0
- package/dist/agents/subagent-announce-queue.js +59 -15
- package/dist/agents/subagent-depth.js +137 -0
- package/dist/agents/subagent-registry.js +448 -96
- package/dist/agents/subagent-spawn.js +262 -0
- package/dist/agents/system-prompt.js +52 -10
- package/dist/agents/test-helpers/fast-tool-stubs.js +18 -0
- package/dist/agents/test-helpers/host-sandbox-fs-bridge.js +74 -0
- package/dist/agents/tool-display-common.js +782 -0
- package/dist/agents/tool-loop-detection.js +466 -0
- package/dist/agents/tool-policy.js +6 -0
- package/dist/agents/tools/image-tool.js +1 -1
- package/dist/agents/tools/sessions-access.js +178 -0
- package/dist/agents/tools/sessions-resolution.js +206 -0
- package/dist/agents/tools/subagents-tool.js +616 -0
- package/dist/agents/workspace-dir.js +18 -0
- package/dist/agents/workspace-dirs.js +14 -0
- package/dist/agents/workspace.js +70 -0
- package/dist/auto-reply/heartbeat-reply-payload.js +18 -0
- package/dist/auto-reply/reply/commands-export-session.js +163 -0
- package/dist/auto-reply/reply/commands-mesh.js +245 -0
- package/dist/auto-reply/reply/commands-setunset.js +28 -0
- package/dist/auto-reply/reply/commands-slash-parse.js +31 -0
- package/dist/auto-reply/reply/commands-system-prompt.js +117 -0
- package/dist/auto-reply/reply/directive-handling.levels.js +17 -0
- package/dist/auto-reply/reply/directive-handling.params.js +1 -0
- package/dist/auto-reply/reply/directive-parsing.js +36 -0
- package/dist/auto-reply/reply/dispatcher-registry.js +43 -0
- package/dist/auto-reply/reply/elevated-unavailable.js +20 -0
- package/dist/auto-reply/reply/post-compaction-audit.js +96 -0
- package/dist/auto-reply/reply/post-compaction-context.js +98 -0
- package/dist/auto-reply/reply/reply-delivery.js +92 -0
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -0
- package/dist/auto-reply/reply/session-run-accounting.js +33 -0
- package/dist/auto-reply/reply.directive.directive-behavior.e2e-harness.js +115 -0
- package/dist/auto-reply/reply.directive.directive-behavior.e2e-mocks.js +12 -0
- package/dist/browser/bridge-auth-registry.js +26 -0
- package/dist/browser/client-actions-url.js +10 -0
- package/dist/browser/control-auth.js +73 -0
- package/dist/browser/csrf.js +64 -0
- package/dist/browser/http-auth.js +52 -0
- package/dist/browser/paths.js +37 -0
- package/dist/browser/proxy-files.js +32 -0
- package/dist/browser/pw-ai-state.js +7 -0
- package/dist/browser/resolved-config-refresh.js +42 -0
- package/dist/browser/routes/path-output.js +1 -0
- package/dist/browser/server-context.chrome-test-harness.js +20 -0
- package/dist/browser/server-middleware.js +31 -0
- package/dist/browser/test-port.js +16 -0
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/file-resolver.js +43 -0
- package/dist/channels/account-summary.js +19 -0
- package/dist/channels/draft-stream-loop.js +77 -0
- package/dist/channels/plugins/account-helpers.js +26 -0
- package/dist/channels/telegram/allow-from.js +10 -0
- package/dist/cli/browser-cli-resize.js +22 -0
- package/dist/cli/browser-cli-shared.js +8 -0
- package/dist/cli/clawbot-cli.js +5 -0
- package/dist/cli/completion-cli.js +566 -0
- package/dist/cli/config-cli.js +63 -5
- package/dist/cli/daemon-cli/lifecycle-core.js +256 -0
- package/dist/cli/daemon-cli/register-service-commands.js +60 -0
- package/dist/cli/daemon-cli-compat.js +80 -0
- package/dist/cli/nodes-cli/pairing-render.js +26 -0
- package/dist/cli/program/action-reparse.js +17 -0
- package/dist/cli/program/command-registry.js +17 -0
- package/dist/cli/program/program-context.js +8 -0
- package/dist/cli/program/register.subclis.js +7 -0
- package/dist/cli/program/routes.js +233 -0
- package/dist/cli/qr-cli.js +132 -0
- package/dist/cli/requirements-test-fixtures.js +17 -0
- package/dist/cli/respawn-policy.js +4 -0
- package/dist/cli/shared/parse-port.js +18 -0
- package/dist/cli/skills-cli.format.js +241 -0
- package/dist/cli/update-cli/progress.js +121 -0
- package/dist/cli/update-cli/restart-helper.js +108 -0
- package/dist/cli/update-cli/shared.js +196 -0
- package/dist/cli/update-cli/status.js +97 -0
- package/dist/cli/update-cli/suppress-deprecations.js +17 -0
- package/dist/cli/update-cli/update-command.js +506 -0
- package/dist/cli/update-cli/wizard.js +130 -0
- package/dist/cli/update-cli.js +3 -9
- package/dist/cli/windows-argv.js +69 -0
- package/dist/commands/auth-choice-legacy.js +20 -0
- package/dist/commands/auth-choice.apply-helpers.js +8 -0
- package/dist/commands/channel-test-helpers.js +19 -0
- package/dist/commands/cleanup-plan.js +10 -0
- package/dist/commands/cleanup-utils.js +7 -0
- package/dist/commands/config-validation.js +15 -0
- package/dist/commands/doctor-completion.js +112 -0
- package/dist/commands/doctor-memory-search.js +119 -0
- package/dist/commands/doctor-session-locks.js +73 -0
- package/dist/commands/doctor.e2e-harness.js +364 -0
- package/dist/commands/gateway-presence.js +19 -0
- package/dist/commands/model-default.js +35 -0
- package/dist/commands/models/fallbacks-shared.js +102 -0
- package/dist/commands/models/shared.js +24 -0
- package/dist/commands/onboard-auth.config-gateways.js +64 -0
- package/dist/commands/onboard-auth.config-litellm.js +45 -0
- package/dist/commands/onboard-auth.config-shared.js +116 -0
- package/dist/commands/onboard-config.js +16 -0
- package/dist/commands/onboard-non-interactive.test-helpers.js +31 -0
- package/dist/commands/onboard-provider-auth-flags.js +136 -0
- package/dist/commands/openai-codex-oauth.js +40 -0
- package/dist/commands/test-runtime-config-helpers.js +21 -0
- package/dist/commands/test-wizard-helpers.js +68 -0
- package/dist/commands/vllm-setup.js +66 -0
- package/dist/compat/legacy-names.js +2 -0
- package/dist/config/backup-rotation.js +19 -0
- package/dist/config/env-preserve.js +122 -0
- package/dist/config/includes-scan.js +78 -0
- package/dist/config/plugins-allowlist.js +13 -0
- package/dist/config/schema.help.js +256 -0
- package/dist/config/schema.hints.js +189 -0
- package/dist/config/schema.irc.js +20 -0
- package/dist/config/schema.labels.js +317 -0
- package/dist/config/sessions/delivery-info.js +40 -0
- package/dist/config/types.irc.js +1 -0
- package/dist/config/zod-schema.agent-defaults.js +14 -0
- package/dist/config/zod-schema.agent-model.js +10 -0
- package/dist/config/zod-schema.agent-runtime.js +14 -0
- package/dist/config/zod-schema.allowdeny.js +35 -0
- package/dist/config/zod-schema.sensitive.js +4 -0
- package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
- package/dist/cron/isolated-agent/skills-snapshot.js +26 -0
- package/dist/cron/isolated-agent/subagent-followup.js +127 -0
- package/dist/cron/isolated-agent.mocks.js +12 -0
- package/dist/cron/isolated-agent.test-setup.js +22 -0
- package/dist/cron/legacy-delivery.js +43 -0
- package/dist/cron/webhook-url.js +22 -0
- package/dist/daemon/arg-split.js +40 -0
- package/dist/daemon/exec-file.js +23 -0
- package/dist/daemon/output.js +6 -0
- package/dist/daemon/runtime-format.js +31 -0
- package/dist/daemon/schtasks-exec.js +4 -0
- package/dist/daemon/service-audit.js +22 -0
- package/dist/discord/client.js +41 -0
- package/dist/discord/components-registry.js +57 -0
- package/dist/discord/components.js +816 -0
- package/dist/discord/guilds.js +12 -0
- package/dist/discord/monitor/gateway-plugin.js +48 -0
- package/dist/discord/monitor/presence.js +30 -0
- package/dist/discord/send.components.js +115 -0
- package/dist/discord/send.shared.js +4 -0
- package/dist/discord/ui.js +26 -0
- package/dist/discord/voice-message.js +254 -0
- package/dist/gateway/agent-event-assistant-text.js +5 -0
- package/dist/gateway/agent-prompt.js +33 -0
- package/dist/gateway/auth-rate-limit.js +136 -0
- package/dist/gateway/channel-health-monitor.js +114 -0
- package/dist/gateway/control-ui-contract.js +1 -0
- package/dist/gateway/control-ui-csp.js +15 -0
- package/dist/gateway/gateway-config-prompts.shared.js +25 -0
- package/dist/gateway/http-auth-helpers.js +18 -0
- package/dist/gateway/http-common.js +18 -0
- package/dist/gateway/http-endpoint-helpers.js +27 -0
- package/dist/gateway/node-invoke-sanitize.js +11 -0
- package/dist/gateway/node-invoke-system-run-approval.js +205 -0
- package/dist/gateway/probe-auth.js +21 -0
- package/dist/gateway/protocol/index.js +7 -2
- package/dist/gateway/protocol/schema/mesh.js +54 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +7 -0
- package/dist/gateway/protocol/schema.js +1 -0
- package/dist/gateway/server/ws-connection/auth-messages.js +54 -0
- package/dist/gateway/server-channels.js +11 -0
- package/dist/gateway/server-methods/attachment-normalize.js +16 -0
- package/dist/gateway/server-methods/base-hash.js +8 -0
- package/dist/gateway/server-methods/mesh.js +700 -0
- package/dist/gateway/server-methods/nodes.handlers.invoke-result.js +55 -0
- package/dist/gateway/server-methods/restart-request.js +13 -0
- package/dist/gateway/server-methods/validation.js +8 -0
- package/dist/gateway/server.agent.gateway-server-agent.mocks.js +35 -0
- package/dist/gateway/server.e2e-registry-helpers.js +1 -0
- package/dist/gateway/server.e2e-ws-harness.js +20 -0
- package/dist/gateway/test-helpers.js +2 -0
- package/dist/gateway/test-helpers.server.js +3 -1
- package/dist/gateway/test-http-response.js +12 -0
- package/dist/gateway/test-openai-responses-model.js +20 -0
- package/dist/gateway/test-temp-config.js +30 -0
- package/dist/gateway/test-with-server.js +32 -0
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +46 -0
- package/dist/imessage/monitor/abort-handler.js +23 -0
- package/dist/imessage/monitor/inbound-processing.js +346 -0
- package/dist/imessage/monitor/parse-notification.js +64 -0
- package/dist/imessage/target-parsing-helpers.js +92 -0
- package/dist/infra/archive.js +244 -20
- package/dist/infra/detect-package-manager.js +26 -0
- package/dist/infra/exec-approvals-allowlist.js +257 -0
- package/dist/infra/exec-approvals-analysis.js +770 -0
- package/dist/infra/exec-approvals.js +13 -0
- package/dist/infra/file-lock.js +1 -0
- package/dist/infra/gemini-auth.js +39 -0
- package/dist/infra/heartbeat-active-hours.js +85 -0
- package/dist/infra/heartbeat-events-filter.js +50 -0
- package/dist/infra/heartbeat-runner.test-utils.js +39 -0
- package/dist/infra/http-body.js +265 -0
- package/dist/infra/install-package-dir.js +50 -0
- package/dist/infra/install-safe-path.js +49 -0
- package/dist/infra/json-files.js +49 -0
- package/dist/infra/jsonl-socket.js +52 -0
- package/dist/infra/map-size.js +14 -0
- package/dist/infra/net/hostname.js +7 -0
- package/dist/infra/npm-registry-spec.js +39 -0
- package/dist/infra/openclaw-root.js +109 -0
- package/dist/infra/outbound/delivery-queue.js +214 -0
- package/dist/infra/outbound/identity.js +23 -0
- package/dist/infra/outbound/message-action-params.js +307 -0
- package/dist/infra/outbound/tool-payload.js +21 -0
- package/dist/infra/package-json.js +23 -0
- package/dist/infra/pairing-files.js +19 -0
- package/dist/infra/pairing-token.js +9 -0
- package/dist/infra/path-prepend.js +51 -0
- package/dist/infra/path-safety.js +16 -0
- package/dist/infra/process-respawn.js +49 -0
- package/dist/infra/runtime-status.js +16 -0
- package/dist/infra/session-cost-usage.types.js +1 -0
- package/dist/infra/session-maintenance-warning.js +89 -0
- package/dist/infra/system-run-command.js +78 -0
- package/dist/infra/tmp-openclaw-dir.js +81 -0
- package/dist/infra/tmp-poolbot-dir.js +2 -0
- package/dist/infra/update-channels.js +19 -0
- package/dist/line/actions.js +45 -0
- package/dist/line/channel-access-token.js +9 -0
- package/dist/line/flex-templates/basic-cards.js +332 -0
- package/dist/line/flex-templates/common.js +18 -0
- package/dist/line/flex-templates/media-control-cards.js +453 -0
- package/dist/line/flex-templates/message.js +10 -0
- package/dist/line/flex-templates/schedule-cards.js +399 -0
- package/dist/line/flex-templates/types.js +1 -0
- package/dist/line/webhook-node.js +100 -0
- package/dist/line/webhook-utils.js +11 -0
- package/dist/logging/diagnostic-session-state.js +73 -0
- package/dist/logging/diagnostic.js +22 -0
- package/dist/logging/timestamps.js +14 -0
- package/dist/markdown/whatsapp.js +62 -0
- package/dist/media/base64.js +34 -0
- package/dist/media/local-roots.js +32 -0
- package/dist/media/outbound-attachment.js +10 -0
- package/dist/media/read-response-with-limit.js +41 -0
- package/dist/media/sniff-mime-from-base64.js +19 -0
- package/dist/media-understanding/audio-preflight.js +67 -0
- package/dist/media-understanding/fs.js +13 -0
- package/dist/media-understanding/output-extract.js +26 -0
- package/dist/media-understanding/providers/audio.test-helpers.js +34 -0
- package/dist/media-understanding/providers/google/inline-data.js +64 -0
- package/dist/media-understanding/providers/shared.js +7 -0
- package/dist/media-understanding/runner.entries.js +459 -0
- package/dist/memory/batch-error-utils.js +11 -0
- package/dist/memory/batch-http.js +27 -0
- package/dist/memory/batch-output.js +29 -0
- package/dist/memory/batch-runner.js +22 -0
- package/dist/memory/batch-upload.js +23 -0
- package/dist/memory/batch-utils.js +26 -0
- package/dist/memory/embeddings-debug.js +11 -0
- package/dist/memory/embeddings-remote-client.js +22 -0
- package/dist/memory/embeddings-remote-fetch.js +14 -0
- package/dist/memory/embeddings.js +36 -9
- package/dist/memory/hybrid.js +24 -5
- package/dist/memory/manager-embedding-ops.js +616 -0
- package/dist/memory/manager-sync-ops.js +953 -0
- package/dist/memory/manager.js +76 -28
- package/dist/memory/mmr.js +164 -0
- package/dist/memory/qmd-manager.js +1061 -0
- package/dist/memory/qmd-query-parser.js +107 -0
- package/dist/memory/qmd-scope.js +93 -0
- package/dist/memory/query-expansion.js +331 -0
- package/dist/memory/search-manager.js +0 -1
- package/dist/memory/sync-index.js +21 -0
- package/dist/memory/sync-progress.js +22 -0
- package/dist/memory/sync-stale.js +30 -0
- package/dist/memory/temporal-decay.js +119 -0
- package/dist/memory/test-embeddings-mock.js +16 -0
- package/dist/memory/test-manager-helpers.js +14 -0
- package/dist/memory/test-runtime-mocks.js +11 -0
- package/dist/node-host/invoke-browser.js +177 -0
- package/dist/node-host/invoke.js +685 -0
- package/dist/pairing/setup-code.js +285 -0
- package/dist/plugin-sdk/account-id.js +1 -0
- package/dist/plugin-sdk/agent-media-payload.js +13 -0
- package/dist/plugin-sdk/allow-from.js +47 -0
- package/dist/plugin-sdk/command-auth.js +23 -0
- package/dist/plugin-sdk/config-paths.js +9 -0
- package/dist/plugin-sdk/file-lock.js +116 -0
- package/dist/plugin-sdk/json-store.js +31 -0
- package/dist/plugin-sdk/onboarding.js +28 -0
- package/dist/plugin-sdk/provider-auth-result.js +29 -0
- package/dist/plugin-sdk/slack-message-actions.js +133 -0
- package/dist/plugin-sdk/status-helpers.js +35 -0
- package/dist/plugin-sdk/text-chunking.js +31 -0
- package/dist/plugin-sdk/tool-send.js +12 -0
- package/dist/plugin-sdk/webhook-path.js +27 -0
- package/dist/plugin-sdk/webhook-targets.js +34 -0
- package/dist/plugins/hooks.test-helpers.js +21 -0
- package/dist/plugins/uninstall.js +171 -0
- package/dist/process/kill-tree.js +98 -0
- package/dist/process/supervisor/adapters/child.js +143 -0
- package/dist/process/supervisor/adapters/env.js +13 -0
- package/dist/process/supervisor/adapters/pty.js +148 -0
- package/dist/process/supervisor/index.js +10 -0
- package/dist/process/supervisor/registry.js +117 -0
- package/dist/process/supervisor/supervisor.js +244 -0
- package/dist/process/supervisor/types.js +1 -0
- package/dist/providers/google-shared.test-helpers.js +75 -0
- package/dist/security/audit-channel.js +419 -0
- package/dist/security/audit-tool-policy.js +1 -0
- package/dist/security/scan-paths.js +12 -0
- package/dist/sessions/input-provenance.js +55 -0
- package/dist/sessions/session-key-utils.js +7 -0
- package/dist/shared/chat-content.js +31 -0
- package/dist/shared/chat-envelope.js +45 -0
- package/dist/shared/config-eval.js +117 -0
- package/dist/shared/device-auth.js +16 -0
- package/dist/shared/entry-metadata.js +9 -0
- package/dist/shared/entry-status.js +25 -0
- package/dist/shared/frontmatter.js +98 -0
- package/dist/shared/model-param-b.js +19 -0
- package/dist/shared/net/ipv4.js +17 -0
- package/dist/shared/node-match.js +53 -0
- package/dist/shared/pid-alive.js +12 -0
- package/dist/shared/process-scoped-map.js +10 -0
- package/dist/shared/requirements.js +128 -0
- package/dist/shared/subagents-format.js +84 -0
- package/dist/shared/usage-aggregates.js +28 -0
- package/dist/signal/monitor/mentions.js +45 -0
- package/dist/signal/rpc-context.js +19 -0
- package/dist/slack/blocks-fallback.js +76 -0
- package/dist/slack/blocks-input.js +40 -0
- package/dist/slack/draft-stream.js +106 -0
- package/dist/slack/message-actions.js +51 -0
- package/dist/slack/modal-metadata.js +32 -0
- package/dist/slack/monitor/events/interactions.js +462 -0
- package/dist/slack/monitor/room-context.js +17 -0
- package/dist/slack/stream-mode.js +41 -0
- package/dist/telegram/bot-native-command-menu.js +64 -0
- package/dist/telegram/bot.media.e2e-harness.js +81 -0
- package/dist/telegram/button-types.js +1 -0
- package/dist/telegram/group-access.js +65 -0
- package/dist/telegram/outbound-params.js +21 -0
- package/dist/telegram/poll-vote-cache.js +21 -0
- package/dist/terminal/health-style.js +36 -0
- package/dist/test-utils/chunk-test-helpers.js +21 -0
- package/dist/test-utils/env.js +72 -0
- package/dist/test-utils/exec-assertions.js +12 -0
- package/dist/test-utils/imessage-test-plugin.js +54 -0
- package/dist/test-utils/mock-http-response.js +17 -0
- package/dist/test-utils/vitest-mock-fn.js +1 -0
- package/dist/tts/tts-core.js +550 -0
- package/dist/utils/chunk-items.js +10 -0
- package/dist/utils/reaction-level.js +52 -0
- package/dist/utils/safe-json.js +22 -0
- package/dist/utils/with-timeout.js +14 -0
- package/dist/web/media.js +17 -5
- package/dist/whatsapp/resolve-outbound-target.js +42 -0
- package/dist/wizard/onboarding.completion.js +74 -0
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/account-resolve.ts +29 -0
- package/extensions/bluebubbles/src/monitor-normalize.ts +796 -0
- package/extensions/bluebubbles/src/monitor-processing.ts +1007 -0
- package/extensions/bluebubbles/src/monitor-reply-cache.ts +185 -0
- package/extensions/bluebubbles/src/monitor-shared.ts +51 -0
- package/extensions/bluebubbles/src/multipart.ts +32 -0
- package/extensions/bluebubbles/src/send-helpers.ts +53 -0
- package/extensions/bluebubbles/src/test-harness.ts +50 -0
- package/extensions/bluebubbles/src/test-mocks.ts +11 -0
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/device-pair/index.ts +554 -0
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/discord/package.json +1 -1
- package/extensions/discord/src/channel.js +366 -0
- package/extensions/discord/src/runtime.js +10 -0
- package/extensions/feishu/index.ts +63 -0
- package/extensions/feishu/src/accounts.ts +114 -0
- package/extensions/feishu/src/bitable.ts +739 -0
- package/extensions/feishu/src/bot.ts +965 -0
- package/extensions/feishu/src/channel.ts +351 -0
- package/extensions/feishu/src/client.ts +118 -0
- package/extensions/feishu/src/config-schema.ts +206 -0
- package/extensions/feishu/src/dedup.ts +33 -0
- package/extensions/feishu/src/directory.ts +177 -0
- package/extensions/feishu/src/doc-schema.ts +47 -0
- package/extensions/feishu/src/docx.ts +536 -0
- package/extensions/feishu/src/drive-schema.ts +46 -0
- package/extensions/feishu/src/drive.ts +227 -0
- package/extensions/feishu/src/dynamic-agent.ts +131 -0
- package/extensions/feishu/src/media.ts +449 -0
- package/extensions/feishu/src/mention.ts +126 -0
- package/extensions/feishu/src/monitor.ts +330 -0
- package/extensions/feishu/src/onboarding.ts +359 -0
- package/extensions/feishu/src/outbound.ts +55 -0
- package/extensions/feishu/src/perm-schema.ts +52 -0
- package/extensions/feishu/src/perm.ts +173 -0
- package/extensions/feishu/src/policy.ts +84 -0
- package/extensions/feishu/src/probe.ts +44 -0
- package/extensions/feishu/src/reactions.ts +160 -0
- package/extensions/feishu/src/reply-dispatcher.ts +239 -0
- package/extensions/feishu/src/runtime.ts +14 -0
- package/extensions/feishu/src/send-result.ts +29 -0
- package/extensions/feishu/src/send.ts +335 -0
- package/extensions/feishu/src/streaming-card.ts +223 -0
- package/extensions/feishu/src/targets.ts +78 -0
- package/extensions/feishu/src/tools-config.ts +21 -0
- package/extensions/feishu/src/types.ts +81 -0
- package/extensions/feishu/src/typing.ts +80 -0
- package/extensions/feishu/src/wiki-schema.ts +55 -0
- package/extensions/feishu/src/wiki.ts +232 -0
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/imessage/src/channel.js +253 -0
- package/extensions/imessage/src/runtime.js +10 -0
- package/extensions/irc/index.ts +17 -0
- package/extensions/irc/src/accounts.ts +268 -0
- package/extensions/irc/src/channel.ts +367 -0
- package/extensions/irc/src/client.ts +439 -0
- package/extensions/irc/src/config-schema.ts +97 -0
- package/extensions/irc/src/connect-options.ts +30 -0
- package/extensions/irc/src/control-chars.ts +22 -0
- package/extensions/irc/src/inbound.ts +334 -0
- package/extensions/irc/src/monitor.ts +147 -0
- package/extensions/irc/src/normalize.ts +117 -0
- package/extensions/irc/src/onboarding.ts +479 -0
- package/extensions/irc/src/policy.ts +157 -0
- package/extensions/irc/src/probe.ts +53 -0
- package/extensions/irc/src/protocol.ts +169 -0
- package/extensions/irc/src/runtime.ts +14 -0
- package/extensions/irc/src/send.ts +88 -0
- package/extensions/irc/src/types.ts +93 -0
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +5 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/matrix/src/matrix/client-bootstrap.ts +39 -0
- package/extensions/mattermost/package.json +1 -1
- package/extensions/mattermost/src/mattermost/monitor-onchar.ts +25 -0
- package/extensions/mattermost/src/mattermost/monitor-websocket.ts +221 -0
- package/extensions/mattermost/src/mattermost/reactions.ts +130 -0
- package/extensions/mattermost/src/mattermost/reconnect.ts +103 -0
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/index.ts +161 -0
- package/extensions/minimax-portal-auth/oauth.ts +247 -0
- package/extensions/msteams/CHANGELOG.md +5 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/msteams/src/file-lock.ts +1 -0
- package/extensions/msteams/src/graph.ts +92 -0
- package/extensions/msteams/src/mentions.ts +114 -0
- package/extensions/msteams/src/test-runtime.ts +16 -0
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +5 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/openai-codex-auth/index.ts +177 -0
- package/extensions/phone-control/index.ts +421 -0
- package/extensions/shared/resolve-target-test-helpers.ts +66 -0
- package/extensions/signal/package.json +1 -1
- package/extensions/signal/src/channel.js +273 -0
- package/extensions/signal/src/runtime.js +10 -0
- package/extensions/slack/package.json +1 -1
- package/extensions/slack/src/channel.js +489 -0
- package/extensions/slack/src/runtime.js +10 -0
- package/extensions/talk-voice/index.ts +150 -0
- package/extensions/telegram/package.json +1 -1
- package/extensions/telegram/src/channel.js +424 -0
- package/extensions/telegram/src/runtime.js +10 -0
- package/extensions/thread-ownership/index.ts +133 -0
- package/extensions/tlon/package.json +1 -1
- package/extensions/tlon/src/account-fields.ts +25 -0
- package/extensions/tlon/src/urbit/base-url.ts +57 -0
- package/extensions/tlon/src/urbit/channel-client.ts +157 -0
- package/extensions/tlon/src/urbit/channel-ops.ts +164 -0
- package/extensions/tlon/src/urbit/context.ts +47 -0
- package/extensions/tlon/src/urbit/errors.ts +51 -0
- package/extensions/tlon/src/urbit/fetch.ts +39 -0
- package/extensions/twitch/CHANGELOG.md +5 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/twitch/src/test-fixtures.ts +30 -0
- package/extensions/voice-call/CHANGELOG.md +5 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/allowlist.ts +19 -0
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/whatsapp/src/channel.js +429 -0
- package/extensions/whatsapp/src/runtime.js +10 -0
- package/extensions/zalo/CHANGELOG.md +5 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +5 -0
- package/extensions/zalouser/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { spinner } from "@clack/prompts";
|
|
2
|
+
import { formatDurationPrecise } from "../../infra/format-time/format-duration.js";
|
|
3
|
+
import { defaultRuntime } from "../../runtime.js";
|
|
4
|
+
import { theme } from "../../terminal/theme.js";
|
|
5
|
+
const STEP_LABELS = {
|
|
6
|
+
"clean check": "Working directory is clean",
|
|
7
|
+
"upstream check": "Upstream branch exists",
|
|
8
|
+
"git fetch": "Fetching latest changes",
|
|
9
|
+
"git rebase": "Rebasing onto target commit",
|
|
10
|
+
"git rev-parse @{upstream}": "Resolving upstream commit",
|
|
11
|
+
"git rev-list": "Enumerating candidate commits",
|
|
12
|
+
"git clone": "Cloning git checkout",
|
|
13
|
+
"preflight worktree": "Preparing preflight worktree",
|
|
14
|
+
"preflight cleanup": "Cleaning preflight worktree",
|
|
15
|
+
"deps install": "Installing dependencies",
|
|
16
|
+
build: "Building",
|
|
17
|
+
"ui:build": "Building UI assets",
|
|
18
|
+
"ui:build (post-doctor repair)": "Restoring missing UI assets",
|
|
19
|
+
"ui assets verify": "Validating UI assets",
|
|
20
|
+
"openclaw doctor entry": "Checking doctor entrypoint",
|
|
21
|
+
"openclaw doctor": "Running doctor checks",
|
|
22
|
+
"git rev-parse HEAD (after)": "Verifying update",
|
|
23
|
+
"global update": "Updating via package manager",
|
|
24
|
+
"global install": "Installing global package",
|
|
25
|
+
};
|
|
26
|
+
function getStepLabel(step) {
|
|
27
|
+
return STEP_LABELS[step.name] ?? step.name;
|
|
28
|
+
}
|
|
29
|
+
export function createUpdateProgress(enabled) {
|
|
30
|
+
if (!enabled) {
|
|
31
|
+
return {
|
|
32
|
+
progress: {},
|
|
33
|
+
stop: () => { },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
let currentSpinner = null;
|
|
37
|
+
const progress = {
|
|
38
|
+
onStepStart: (step) => {
|
|
39
|
+
currentSpinner = spinner();
|
|
40
|
+
currentSpinner.start(theme.accent(getStepLabel(step)));
|
|
41
|
+
},
|
|
42
|
+
onStepComplete: (step) => {
|
|
43
|
+
if (!currentSpinner) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const label = getStepLabel(step);
|
|
47
|
+
const duration = theme.muted(`(${formatDurationPrecise(step.durationMs)})`);
|
|
48
|
+
const icon = step.exitCode === 0 ? theme.success("\u2713") : theme.error("\u2717");
|
|
49
|
+
currentSpinner.stop(`${icon} ${label} ${duration}`);
|
|
50
|
+
currentSpinner = null;
|
|
51
|
+
if (step.exitCode !== 0 && step.stderrTail) {
|
|
52
|
+
const lines = step.stderrTail.split("\n").slice(-10);
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
if (line.trim()) {
|
|
55
|
+
defaultRuntime.log(` ${theme.error(line)}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
progress,
|
|
63
|
+
stop: () => {
|
|
64
|
+
if (currentSpinner) {
|
|
65
|
+
currentSpinner.stop();
|
|
66
|
+
currentSpinner = null;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function formatStepStatus(exitCode) {
|
|
72
|
+
if (exitCode === 0) {
|
|
73
|
+
return theme.success("\u2713");
|
|
74
|
+
}
|
|
75
|
+
if (exitCode === null) {
|
|
76
|
+
return theme.warn("?");
|
|
77
|
+
}
|
|
78
|
+
return theme.error("\u2717");
|
|
79
|
+
}
|
|
80
|
+
export function printResult(result, opts) {
|
|
81
|
+
if (opts.json) {
|
|
82
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const statusColor = result.status === "ok" ? theme.success : result.status === "skipped" ? theme.warn : theme.error;
|
|
86
|
+
defaultRuntime.log("");
|
|
87
|
+
defaultRuntime.log(`${theme.heading("Update Result:")} ${statusColor(result.status.toUpperCase())}`);
|
|
88
|
+
if (result.root) {
|
|
89
|
+
defaultRuntime.log(` Root: ${theme.muted(result.root)}`);
|
|
90
|
+
}
|
|
91
|
+
if (result.reason) {
|
|
92
|
+
defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`);
|
|
93
|
+
}
|
|
94
|
+
if (result.before?.version || result.before?.sha) {
|
|
95
|
+
const before = result.before.version ?? result.before.sha?.slice(0, 8) ?? "";
|
|
96
|
+
defaultRuntime.log(` Before: ${theme.muted(before)}`);
|
|
97
|
+
}
|
|
98
|
+
if (result.after?.version || result.after?.sha) {
|
|
99
|
+
const after = result.after.version ?? result.after.sha?.slice(0, 8) ?? "";
|
|
100
|
+
defaultRuntime.log(` After: ${theme.muted(after)}`);
|
|
101
|
+
}
|
|
102
|
+
if (!opts.hideSteps && result.steps.length > 0) {
|
|
103
|
+
defaultRuntime.log("");
|
|
104
|
+
defaultRuntime.log(theme.heading("Steps:"));
|
|
105
|
+
for (const step of result.steps) {
|
|
106
|
+
const status = formatStepStatus(step.exitCode);
|
|
107
|
+
const duration = theme.muted(`(${formatDurationPrecise(step.durationMs)})`);
|
|
108
|
+
defaultRuntime.log(` ${status} ${step.name} ${duration}`);
|
|
109
|
+
if (step.exitCode !== 0 && step.stderrTail) {
|
|
110
|
+
const lines = step.stderrTail.split("\n").slice(0, 5);
|
|
111
|
+
for (const line of lines) {
|
|
112
|
+
if (line.trim()) {
|
|
113
|
+
defaultRuntime.log(` ${theme.error(line)}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
defaultRuntime.log("");
|
|
120
|
+
defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`);
|
|
121
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { resolveGatewayLaunchAgentLabel, resolveGatewaySystemdServiceName, resolveGatewayWindowsTaskName, } from "../../daemon/constants.js";
|
|
6
|
+
/**
|
|
7
|
+
* Shell-escape a string for embedding in single-quoted shell arguments.
|
|
8
|
+
* Replaces every `'` with `'\''` (end quote, escaped quote, resume quote).
|
|
9
|
+
* For batch scripts, validates against special characters instead.
|
|
10
|
+
*/
|
|
11
|
+
function shellEscape(value) {
|
|
12
|
+
return value.replace(/'/g, "'\\''");
|
|
13
|
+
}
|
|
14
|
+
/** Validates a string is safe for embedding in a batch (cmd.exe) script. */
|
|
15
|
+
function isBatchSafe(value) {
|
|
16
|
+
// Reject characters that have special meaning in batch: & | < > ^ % " ` $
|
|
17
|
+
return /^[A-Za-z0-9 _\-().]+$/.test(value);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Prepares a standalone script to restart the gateway service.
|
|
21
|
+
* This script is written to a temporary directory and does not depend on
|
|
22
|
+
* the installed package files, ensuring restart capability even if the
|
|
23
|
+
* update process temporarily removes or corrupts installation files.
|
|
24
|
+
*/
|
|
25
|
+
export async function prepareRestartScript(env = process.env) {
|
|
26
|
+
const tmpDir = os.tmpdir();
|
|
27
|
+
const timestamp = Date.now();
|
|
28
|
+
const platform = process.platform;
|
|
29
|
+
let scriptContent = "";
|
|
30
|
+
let filename = "";
|
|
31
|
+
try {
|
|
32
|
+
if (platform === "linux") {
|
|
33
|
+
const serviceName = resolveGatewaySystemdServiceName(env.POOLBOT_PROFILE);
|
|
34
|
+
const escaped = shellEscape(`${serviceName}.service`);
|
|
35
|
+
filename = `openclaw-restart-${timestamp}.sh`;
|
|
36
|
+
scriptContent = `#!/bin/sh
|
|
37
|
+
# Standalone restart script — survives parent process termination.
|
|
38
|
+
# Wait briefly to ensure file locks are released after update.
|
|
39
|
+
sleep 1
|
|
40
|
+
systemctl --user restart '${escaped}'
|
|
41
|
+
# Self-cleanup
|
|
42
|
+
rm -f "$0"
|
|
43
|
+
`;
|
|
44
|
+
}
|
|
45
|
+
else if (platform === "darwin") {
|
|
46
|
+
const label = resolveGatewayLaunchAgentLabel(env.POOLBOT_PROFILE);
|
|
47
|
+
const escaped = shellEscape(label);
|
|
48
|
+
// Fallback to 501 if getuid is not available (though it should be on macOS)
|
|
49
|
+
const uid = process.getuid ? process.getuid() : 501;
|
|
50
|
+
filename = `openclaw-restart-${timestamp}.sh`;
|
|
51
|
+
scriptContent = `#!/bin/sh
|
|
52
|
+
# Standalone restart script — survives parent process termination.
|
|
53
|
+
# Wait briefly to ensure file locks are released after update.
|
|
54
|
+
sleep 1
|
|
55
|
+
launchctl kickstart -k 'gui/${uid}/${escaped}'
|
|
56
|
+
# Self-cleanup
|
|
57
|
+
rm -f "$0"
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
else if (platform === "win32") {
|
|
61
|
+
const taskName = resolveGatewayWindowsTaskName(env.POOLBOT_PROFILE);
|
|
62
|
+
if (!isBatchSafe(taskName)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
filename = `openclaw-restart-${timestamp}.bat`;
|
|
66
|
+
scriptContent = `@echo off
|
|
67
|
+
REM Standalone restart script — survives parent process termination.
|
|
68
|
+
REM Wait briefly to ensure file locks are released after update.
|
|
69
|
+
timeout /t 2 /nobreak >nul
|
|
70
|
+
schtasks /End /TN "${taskName}"
|
|
71
|
+
schtasks /Run /TN "${taskName}"
|
|
72
|
+
REM Self-cleanup
|
|
73
|
+
del "%~f0"
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const scriptPath = path.join(tmpDir, filename);
|
|
80
|
+
await fs.writeFile(scriptPath, scriptContent, { mode: 0o755 });
|
|
81
|
+
return scriptPath;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// If we can't write the script, we'll fall back to the standard restart method
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Executes the prepared restart script as a **detached** process.
|
|
90
|
+
*
|
|
91
|
+
* The script must outlive the CLI process because the CLI itself is part
|
|
92
|
+
* of the service being restarted — `systemctl restart` / `launchctl
|
|
93
|
+
* kickstart -k` will terminate the current process tree. Using
|
|
94
|
+
* `spawn({ detached: true })` + `unref()` ensures the script survives
|
|
95
|
+
* the parent's exit.
|
|
96
|
+
*
|
|
97
|
+
* Resolves immediately after spawning; the script runs independently.
|
|
98
|
+
*/
|
|
99
|
+
export async function runRestartScript(scriptPath) {
|
|
100
|
+
const isWindows = process.platform === "win32";
|
|
101
|
+
const file = isWindows ? "cmd.exe" : "/bin/sh";
|
|
102
|
+
const args = isWindows ? ["/c", scriptPath] : [scriptPath];
|
|
103
|
+
const child = spawn(file, args, {
|
|
104
|
+
detached: true,
|
|
105
|
+
stdio: "ignore",
|
|
106
|
+
});
|
|
107
|
+
child.unref();
|
|
108
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { resolveStateDir } from "../../config/paths.js";
|
|
6
|
+
import { resolveOpenClawPackageRoot } from "../../infra/openclaw-root.js";
|
|
7
|
+
import { readPackageName, readPackageVersion } from "../../infra/package-json.js";
|
|
8
|
+
import { trimLogTail } from "../../infra/restart-sentinel.js";
|
|
9
|
+
import { parseSemver } from "../../infra/runtime-guard.js";
|
|
10
|
+
import { fetchNpmTagVersion } from "../../infra/update-check.js";
|
|
11
|
+
import { detectGlobalInstallManagerByPresence, detectGlobalInstallManagerForRoot, } from "../../infra/update-global.js";
|
|
12
|
+
import { runCommandWithTimeout } from "../../process/exec.js";
|
|
13
|
+
import { defaultRuntime } from "../../runtime.js";
|
|
14
|
+
import { theme } from "../../terminal/theme.js";
|
|
15
|
+
import { pathExists } from "../../utils.js";
|
|
16
|
+
const POOLBOT_REPO_URL = "https://github.com/openclaw/openclaw.git";
|
|
17
|
+
const MAX_LOG_CHARS = 8000;
|
|
18
|
+
export const DEFAULT_PACKAGE_NAME = "poolbot";
|
|
19
|
+
const CORE_PACKAGE_NAMES = new Set([DEFAULT_PACKAGE_NAME]);
|
|
20
|
+
export function normalizeTag(value) {
|
|
21
|
+
if (!value) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
if (!trimmed) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
if (trimmed.startsWith("openclaw@")) {
|
|
29
|
+
return trimmed.slice("openclaw@".length);
|
|
30
|
+
}
|
|
31
|
+
if (trimmed.startsWith(`${DEFAULT_PACKAGE_NAME}@`)) {
|
|
32
|
+
return trimmed.slice(`${DEFAULT_PACKAGE_NAME}@`.length);
|
|
33
|
+
}
|
|
34
|
+
return trimmed;
|
|
35
|
+
}
|
|
36
|
+
export function normalizeVersionTag(tag) {
|
|
37
|
+
const trimmed = tag.trim();
|
|
38
|
+
if (!trimmed) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const cleaned = trimmed.startsWith("v") ? trimmed.slice(1) : trimmed;
|
|
42
|
+
return parseSemver(cleaned) ? cleaned : null;
|
|
43
|
+
}
|
|
44
|
+
export { readPackageName, readPackageVersion };
|
|
45
|
+
export async function resolveTargetVersion(tag, timeoutMs) {
|
|
46
|
+
const direct = normalizeVersionTag(tag);
|
|
47
|
+
if (direct) {
|
|
48
|
+
return direct;
|
|
49
|
+
}
|
|
50
|
+
const res = await fetchNpmTagVersion({ tag, timeoutMs });
|
|
51
|
+
return res.version ?? null;
|
|
52
|
+
}
|
|
53
|
+
export async function isGitCheckout(root) {
|
|
54
|
+
try {
|
|
55
|
+
await fs.stat(path.join(root, ".git"));
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function isCorePackage(root) {
|
|
63
|
+
const name = await readPackageName(root);
|
|
64
|
+
return Boolean(name && CORE_PACKAGE_NAMES.has(name));
|
|
65
|
+
}
|
|
66
|
+
export async function isEmptyDir(targetPath) {
|
|
67
|
+
try {
|
|
68
|
+
const entries = await fs.readdir(targetPath);
|
|
69
|
+
return entries.length === 0;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function resolveGitInstallDir() {
|
|
76
|
+
const override = process.env.POOLBOT_GIT_DIR?.trim();
|
|
77
|
+
if (override) {
|
|
78
|
+
return path.resolve(override);
|
|
79
|
+
}
|
|
80
|
+
return resolveDefaultGitDir();
|
|
81
|
+
}
|
|
82
|
+
function resolveDefaultGitDir() {
|
|
83
|
+
return resolveStateDir(process.env, os.homedir);
|
|
84
|
+
}
|
|
85
|
+
export function resolveNodeRunner() {
|
|
86
|
+
const base = path.basename(process.execPath).toLowerCase();
|
|
87
|
+
if (base === "node" || base === "node.exe") {
|
|
88
|
+
return process.execPath;
|
|
89
|
+
}
|
|
90
|
+
return "node";
|
|
91
|
+
}
|
|
92
|
+
export async function resolveUpdateRoot() {
|
|
93
|
+
return ((await resolveOpenClawPackageRoot({
|
|
94
|
+
moduleUrl: import.meta.url,
|
|
95
|
+
argv1: process.argv[1],
|
|
96
|
+
cwd: process.cwd(),
|
|
97
|
+
})) ?? process.cwd());
|
|
98
|
+
}
|
|
99
|
+
export async function runUpdateStep(params) {
|
|
100
|
+
const command = params.argv.join(" ");
|
|
101
|
+
params.progress?.onStepStart?.({
|
|
102
|
+
name: params.name,
|
|
103
|
+
command,
|
|
104
|
+
index: 0,
|
|
105
|
+
total: 0,
|
|
106
|
+
});
|
|
107
|
+
const started = Date.now();
|
|
108
|
+
const res = await runCommandWithTimeout(params.argv, {
|
|
109
|
+
cwd: params.cwd,
|
|
110
|
+
timeoutMs: params.timeoutMs,
|
|
111
|
+
});
|
|
112
|
+
const durationMs = Date.now() - started;
|
|
113
|
+
const stderrTail = trimLogTail(res.stderr, MAX_LOG_CHARS);
|
|
114
|
+
params.progress?.onStepComplete?.({
|
|
115
|
+
name: params.name,
|
|
116
|
+
command,
|
|
117
|
+
index: 0,
|
|
118
|
+
total: 0,
|
|
119
|
+
durationMs,
|
|
120
|
+
exitCode: res.code,
|
|
121
|
+
stderrTail,
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
name: params.name,
|
|
125
|
+
command,
|
|
126
|
+
cwd: params.cwd ?? process.cwd(),
|
|
127
|
+
durationMs,
|
|
128
|
+
exitCode: res.code,
|
|
129
|
+
stdoutTail: trimLogTail(res.stdout, MAX_LOG_CHARS),
|
|
130
|
+
stderrTail,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export async function ensureGitCheckout(params) {
|
|
134
|
+
const dirExists = await pathExists(params.dir);
|
|
135
|
+
if (!dirExists) {
|
|
136
|
+
return await runUpdateStep({
|
|
137
|
+
name: "git clone",
|
|
138
|
+
argv: ["git", "clone", POOLBOT_REPO_URL, params.dir],
|
|
139
|
+
timeoutMs: params.timeoutMs,
|
|
140
|
+
progress: params.progress,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (!(await isGitCheckout(params.dir))) {
|
|
144
|
+
const empty = await isEmptyDir(params.dir);
|
|
145
|
+
if (!empty) {
|
|
146
|
+
throw new Error(`POOLBOT_GIT_DIR points at a non-git directory: ${params.dir}. Set POOLBOT_GIT_DIR to an empty folder or an openclaw checkout.`);
|
|
147
|
+
}
|
|
148
|
+
return await runUpdateStep({
|
|
149
|
+
name: "git clone",
|
|
150
|
+
argv: ["git", "clone", POOLBOT_REPO_URL, params.dir],
|
|
151
|
+
cwd: params.dir,
|
|
152
|
+
timeoutMs: params.timeoutMs,
|
|
153
|
+
progress: params.progress,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (!(await isCorePackage(params.dir))) {
|
|
157
|
+
throw new Error(`POOLBOT_GIT_DIR does not look like a core checkout: ${params.dir}.`);
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
export async function resolveGlobalManager(params) {
|
|
162
|
+
const runCommand = async (argv, options) => {
|
|
163
|
+
const res = await runCommandWithTimeout(argv, options);
|
|
164
|
+
return { stdout: res.stdout, stderr: res.stderr, code: res.code };
|
|
165
|
+
};
|
|
166
|
+
if (params.installKind === "package") {
|
|
167
|
+
const detected = await detectGlobalInstallManagerForRoot(runCommand, params.root, params.timeoutMs);
|
|
168
|
+
if (detected) {
|
|
169
|
+
return detected;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const byPresence = await detectGlobalInstallManagerByPresence(runCommand, params.timeoutMs);
|
|
173
|
+
return byPresence ?? "npm";
|
|
174
|
+
}
|
|
175
|
+
export async function tryWriteCompletionCache(root, jsonMode) {
|
|
176
|
+
const binPath = path.join(root, "openclaw.mjs");
|
|
177
|
+
if (!(await pathExists(binPath))) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const result = spawnSync(resolveNodeRunner(), [binPath, "completion", "--write-state"], {
|
|
181
|
+
cwd: root,
|
|
182
|
+
env: process.env,
|
|
183
|
+
encoding: "utf-8",
|
|
184
|
+
});
|
|
185
|
+
if (result.error) {
|
|
186
|
+
if (!jsonMode) {
|
|
187
|
+
defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (result.status !== 0 && !jsonMode) {
|
|
192
|
+
const stderr = (result.stderr ?? "").toString().trim();
|
|
193
|
+
const detail = stderr ? ` (${stderr})` : "";
|
|
194
|
+
defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { formatUpdateAvailableHint, formatUpdateOneLiner, resolveUpdateAvailability, } from "../../commands/status.update.js";
|
|
2
|
+
import { readConfigFileSnapshot } from "../../config/config.js";
|
|
3
|
+
import { normalizeUpdateChannel, resolveUpdateChannelDisplay, } from "../../infra/update-channels.js";
|
|
4
|
+
import { checkUpdateStatus } from "../../infra/update-check.js";
|
|
5
|
+
import { defaultRuntime } from "../../runtime.js";
|
|
6
|
+
import { renderTable } from "../../terminal/table.js";
|
|
7
|
+
import { theme } from "../../terminal/theme.js";
|
|
8
|
+
import { resolveUpdateRoot } from "./shared.js";
|
|
9
|
+
function formatGitStatusLine(params) {
|
|
10
|
+
const shortSha = params.sha ? params.sha.slice(0, 8) : null;
|
|
11
|
+
const branch = params.branch && params.branch !== "HEAD" ? params.branch : null;
|
|
12
|
+
const tag = params.tag;
|
|
13
|
+
const parts = [
|
|
14
|
+
branch ?? (tag ? "detached" : "git"),
|
|
15
|
+
tag ? `tag ${tag}` : null,
|
|
16
|
+
shortSha ? `@ ${shortSha}` : null,
|
|
17
|
+
].filter(Boolean);
|
|
18
|
+
return parts.join(" · ");
|
|
19
|
+
}
|
|
20
|
+
export async function updateStatusCommand(opts) {
|
|
21
|
+
const timeoutMs = opts.timeout ? Number.parseInt(opts.timeout, 10) * 1000 : undefined;
|
|
22
|
+
if (timeoutMs !== undefined && (Number.isNaN(timeoutMs) || timeoutMs <= 0)) {
|
|
23
|
+
defaultRuntime.error("--timeout must be a positive integer (seconds)");
|
|
24
|
+
defaultRuntime.exit(1);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const root = await resolveUpdateRoot();
|
|
28
|
+
const configSnapshot = await readConfigFileSnapshot();
|
|
29
|
+
const configChannel = configSnapshot.valid
|
|
30
|
+
? normalizeUpdateChannel(configSnapshot.config.update?.channel)
|
|
31
|
+
: null;
|
|
32
|
+
const update = await checkUpdateStatus({
|
|
33
|
+
root,
|
|
34
|
+
timeoutMs: timeoutMs ?? 3500,
|
|
35
|
+
fetchGit: true,
|
|
36
|
+
includeRegistry: true,
|
|
37
|
+
});
|
|
38
|
+
const channelInfo = resolveUpdateChannelDisplay({
|
|
39
|
+
configChannel,
|
|
40
|
+
installKind: update.installKind,
|
|
41
|
+
gitTag: update.git?.tag ?? null,
|
|
42
|
+
gitBranch: update.git?.branch ?? null,
|
|
43
|
+
});
|
|
44
|
+
const channelLabel = channelInfo.label;
|
|
45
|
+
const gitLabel = update.installKind === "git"
|
|
46
|
+
? formatGitStatusLine({
|
|
47
|
+
branch: update.git?.branch ?? null,
|
|
48
|
+
tag: update.git?.tag ?? null,
|
|
49
|
+
sha: update.git?.sha ?? null,
|
|
50
|
+
})
|
|
51
|
+
: null;
|
|
52
|
+
const updateAvailability = resolveUpdateAvailability(update);
|
|
53
|
+
const updateLine = formatUpdateOneLiner(update).replace(/^Update:\s*/i, "");
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
defaultRuntime.log(JSON.stringify({
|
|
56
|
+
update,
|
|
57
|
+
channel: {
|
|
58
|
+
value: channelInfo.channel,
|
|
59
|
+
source: channelInfo.source,
|
|
60
|
+
label: channelLabel,
|
|
61
|
+
config: configChannel,
|
|
62
|
+
},
|
|
63
|
+
availability: updateAvailability,
|
|
64
|
+
}, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
|
|
68
|
+
const installLabel = update.installKind === "git"
|
|
69
|
+
? `git (${update.root ?? "unknown"})`
|
|
70
|
+
: update.installKind === "package"
|
|
71
|
+
? update.packageManager
|
|
72
|
+
: "unknown";
|
|
73
|
+
const rows = [
|
|
74
|
+
{ Item: "Install", Value: installLabel },
|
|
75
|
+
{ Item: "Channel", Value: channelLabel },
|
|
76
|
+
...(gitLabel ? [{ Item: "Git", Value: gitLabel }] : []),
|
|
77
|
+
{
|
|
78
|
+
Item: "Update",
|
|
79
|
+
Value: updateAvailability.available ? theme.warn(`available · ${updateLine}`) : updateLine,
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
defaultRuntime.log(theme.heading("OpenClaw update status"));
|
|
83
|
+
defaultRuntime.log("");
|
|
84
|
+
defaultRuntime.log(renderTable({
|
|
85
|
+
width: tableWidth,
|
|
86
|
+
columns: [
|
|
87
|
+
{ key: "Item", header: "Item", minWidth: 10 },
|
|
88
|
+
{ key: "Value", header: "Value", flex: true, minWidth: 24 },
|
|
89
|
+
],
|
|
90
|
+
rows,
|
|
91
|
+
}).trimEnd());
|
|
92
|
+
defaultRuntime.log("");
|
|
93
|
+
const updateHint = formatUpdateAvailableHint(update);
|
|
94
|
+
if (updateHint) {
|
|
95
|
+
defaultRuntime.log(theme.warn(updateHint));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suppress Node.js deprecation warnings.
|
|
3
|
+
*
|
|
4
|
+
* On Node.js v23+ `process.noDeprecation` may be a read-only property
|
|
5
|
+
* (defined via a getter on the prototype with no setter), so the
|
|
6
|
+
* assignment can throw. We fall back to the environment variable which
|
|
7
|
+
* achieves the same effect.
|
|
8
|
+
*/
|
|
9
|
+
export function suppressDeprecations() {
|
|
10
|
+
try {
|
|
11
|
+
process.noDeprecation = true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// read-only on Node v23+; NODE_NO_WARNINGS below covers this case
|
|
15
|
+
}
|
|
16
|
+
process.env.NODE_NO_WARNINGS = "1";
|
|
17
|
+
}
|