From de1dfab03ef07f92e302629b82500ce852dd5a3a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 30 May 2026 11:07:45 +0200 Subject: [PATCH] refactor: move terminal core into package (#88279) * refactor: move terminal core into package * refactor: move terminal module files * fix: clean terminal package CI followups * test: update lint suppression allowlist * fix: ship terminal core runtime aliases --- config/knip.config.ts | 4 + .../tsconfig.package-boundary.paths.json | 57 +++++++ extensions/xai/tsconfig.json | 57 +++++++ .../src/host/openclaw-runtime.ts | 4 +- packages/plugin-sdk/tsconfig.json | 1 + packages/terminal-core/package.json | 107 ++++++++++++ .../terminal-core/src}/ansi.test.ts | 0 .../terminal-core/src}/ansi.ts | 0 .../src}/decorative-emoji.test.ts | 0 .../terminal-core/src}/decorative-emoji.ts | 0 packages/terminal-core/src/display-string.ts | 72 +++++++++ .../terminal-core/src}/health-style.ts | 2 +- packages/terminal-core/src/index.ts | 17 ++ .../terminal-core/src}/links.test.ts | 0 .../terminal-core/src}/links.ts | 0 .../terminal-core/src}/note.ts | 2 +- .../terminal-core/src}/osc-progress.test.ts | 0 .../terminal-core/src}/osc-progress.ts | 0 .../terminal-core/src}/palette.ts | 0 .../terminal-core/src}/progress-line.ts | 0 .../src}/prompt-select-styled-params.ts | 0 .../src}/prompt-select-styled.test.ts | 0 .../src}/prompt-select-styled.ts | 0 .../terminal-core/src}/prompt-style.ts | 0 .../terminal-core/src}/restore.test.ts | 0 .../terminal-core/src}/restore.ts | 0 .../terminal-core/src}/safe-text.test.ts | 0 .../terminal-core/src}/safe-text.ts | 0 .../terminal-core/src}/stream-writer.test.ts | 0 .../terminal-core/src}/stream-writer.ts | 0 packages/terminal-core/src/string.ts | 6 + .../terminal-core/src}/table.test.ts | 5 +- .../terminal-core/src}/table.ts | 2 +- .../terminal-core/src}/terminal-link.ts | 0 .../terminal-core/src}/theme.ts | 0 pnpm-lock.yaml | 9 ++ scripts/build-all.mjs | 2 + scripts/lib/extension-package-boundary.ts | 39 +++++ ...e-extension-package-boundary-artifacts.mjs | 37 +++++ scripts/run-node-watch-paths.mjs | 1 + scripts/test-shell-completion.ts | 4 +- scripts/write-cli-startup-metadata.ts | 4 +- src/acp/client-helpers.ts | 2 +- .../agent-command.live-model-switch.test.ts | 2 +- src/agents/agent-command.ts | 2 +- .../auth-profiles/oauth-refresh-failure.ts | 2 +- src/agents/command/attempt-execution.ts | 2 +- .../embedded-agent-runner/compact-reasons.ts | 2 +- src/agents/embedded-agent-runner/run.ts | 2 +- .../run/assistant-failover.ts | 2 +- src/agents/mcp-transport-config.ts | 2 +- src/agents/model-fallback-observation.ts | 2 +- src/agents/model-fallback.ts | 2 +- src/agents/model-selection-shared.ts | 2 +- .../reply/agent-runner-execution.ts | 2 +- src/channels/plugins/read-only.ts | 2 +- src/cli/acp-cli.ts | 4 +- src/cli/banner.ts | 8 +- src/cli/capability-cli.ts | 4 +- src/cli/channel-auth.ts | 2 +- src/cli/channels-cli.ts | 4 +- src/cli/clawbot-cli.ts | 4 +- src/cli/completion-cli.ts | 4 +- src/cli/config-cli.ts | 4 +- src/cli/cron-cli/register.cron-add.ts | 2 +- src/cli/cron-cli/register.ts | 4 +- src/cli/cron-cli/shared.ts | 2 +- src/cli/daemon-cli/lifecycle.ts | 2 +- src/cli/daemon-cli/register.ts | 4 +- src/cli/daemon-cli/shared.test.ts | 2 +- src/cli/daemon-cli/shared.ts | 2 +- src/cli/daemon-cli/status.print.test.ts | 7 +- src/cli/daemon-cli/status.print.ts | 2 +- src/cli/daemon-cli/status.test.ts | 2 +- src/cli/daemon-cli/status.ts | 2 +- src/cli/devices-cli.runtime.ts | 6 +- src/cli/devices-cli.test.ts | 2 +- src/cli/directory-cli.ts | 6 +- src/cli/dns-cli.ts | 6 +- src/cli/docs-cli.ts | 4 +- src/cli/exec-approvals-cli.ts | 8 +- src/cli/exec-policy-cli.test.ts | 2 +- src/cli/exec-policy-cli.ts | 8 +- src/cli/gateway-cli/discover.ts | 2 +- .../register.option-collisions.test.ts | 6 +- src/cli/gateway-cli/register.ts | 6 +- src/cli/help-format.ts | 2 +- src/cli/hooks-cli.ts | 11 +- src/cli/logs-cli.ts | 8 +- src/cli/models-cli.ts | 4 +- src/cli/node-cli/daemon.test.ts | 7 +- src/cli/node-cli/daemon.ts | 2 +- src/cli/node-cli/register.ts | 4 +- src/cli/nodes-cli/cli-utils.ts | 2 +- src/cli/nodes-cli/pairing-render.ts | 4 +- src/cli/nodes-cli/register.camera.ts | 2 +- src/cli/nodes-cli/register.pairing.ts | 2 +- src/cli/nodes-cli/register.status.ts | 4 +- src/cli/nodes-cli/register.ts | 4 +- src/cli/pairing-cli.test.ts | 2 +- src/cli/pairing-cli.ts | 6 +- src/cli/plugins-cli.runtime.ts | 4 +- src/cli/plugins-cli.ts | 4 +- src/cli/plugins-command-helpers.ts | 2 +- src/cli/plugins-inspect-command.ts | 4 +- src/cli/plugins-install-command.ts | 2 +- src/cli/plugins-install-persist.ts | 2 +- src/cli/plugins-list-command.ts | 4 +- src/cli/plugins-list-format.ts | 4 +- src/cli/plugins-search-command.ts | 2 +- src/cli/plugins-uninstall-command.ts | 2 +- src/cli/plugins-update-command.ts | 2 +- src/cli/plugins-update-outcomes.ts | 2 +- src/cli/program/command-descriptor-utils.ts | 2 +- src/cli/program/config-guard.test.ts | 2 +- src/cli/program/config-guard.ts | 4 +- src/cli/program/error-output.ts | 4 +- src/cli/program/help.test.ts | 4 +- src/cli/program/help.ts | 4 +- src/cli/program/register.agent.ts | 4 +- src/cli/program/register.backup.ts | 4 +- src/cli/program/register.configure.ts | 4 +- src/cli/program/register.crestodian.ts | 2 +- src/cli/program/register.maintenance.ts | 4 +- src/cli/program/register.message.ts | 4 +- src/cli/program/register.migrate.ts | 2 +- src/cli/program/register.onboard.ts | 4 +- src/cli/program/register.setup.ts | 4 +- .../register.status-health-sessions.ts | 4 +- src/cli/progress.ts | 9 +- src/cli/proxy-cli.runtime.test.ts | 4 +- src/cli/proxy-cli.runtime.ts | 2 +- src/cli/qr-cli.ts | 4 +- src/cli/run-main.exit.test.ts | 2 +- src/cli/run-main.ts | 2 +- src/cli/sandbox-cli.ts | 4 +- src/cli/secrets-cli.ts | 4 +- src/cli/security-cli.ts | 4 +- src/cli/skills-cli.format.ts | 11 +- src/cli/skills-cli.ts | 4 +- src/cli/system-cli.ts | 4 +- src/cli/tui-cli.ts | 4 +- src/cli/update-cli.ts | 4 +- src/cli/update-cli/progress.ts | 2 +- src/cli/update-cli/shared.ts | 2 +- src/cli/update-cli/status.ts | 4 +- src/cli/update-cli/update-command.ts | 4 +- src/cli/update-cli/wizard.ts | 6 +- src/cli/webhooks-cli.ts | 4 +- src/commands/channels.list.test.ts | 2 +- src/commands/channels/capabilities.ts | 2 +- src/commands/channels/list.ts | 4 +- src/commands/channels/logs.ts | 2 +- src/commands/channels/status-config-format.ts | 4 +- src/commands/channels/status.ts | 4 +- src/commands/commitments.test.ts | 2 +- src/commands/commitments.ts | 4 +- src/commands/configure.channels.test.ts | 2 +- src/commands/configure.channels.ts | 4 +- src/commands/configure.daemon.test.ts | 2 +- src/commands/configure.daemon.ts | 2 +- src/commands/configure.gateway.test.ts | 2 +- src/commands/configure.gateway.ts | 2 +- src/commands/configure.shared.ts | 6 +- src/commands/configure.wizard.test.ts | 2 +- src/commands/configure.wizard.ts | 2 +- src/commands/docs.test.ts | 4 +- src/commands/docs.ts | 4 +- src/commands/doctor-auth-flat-profiles.ts | 2 +- src/commands/doctor-auth-legacy-oauth.ts | 4 +- src/commands/doctor-auth-oauth-sidecar.ts | 2 +- ...octor-auth.deprecated-cli-profiles.test.ts | 2 +- .../doctor-auth.profile-health.test.ts | 4 +- src/commands/doctor-auth.ts | 2 +- src/commands/doctor-bootstrap-size.test.ts | 2 +- src/commands/doctor-bootstrap-size.ts | 2 +- src/commands/doctor-browser.ts | 2 +- src/commands/doctor-claude-cli.ts | 2 +- src/commands/doctor-command-owner.test.ts | 2 +- src/commands/doctor-command-owner.ts | 2 +- src/commands/doctor-completion.ts | 2 +- src/commands/doctor-config-analysis.ts | 2 +- src/commands/doctor-config-audit-scrub.ts | 2 +- ...doctor-config-flow.include-warning.test.ts | 4 +- src/commands/doctor-config-flow.test.ts | 2 +- src/commands/doctor-config-flow.ts | 2 +- ...r-config-preflight.state-migration.test.ts | 2 +- src/commands/doctor-config-preflight.ts | 2 +- src/commands/doctor-cron.test.ts | 2 +- src/commands/doctor-cron.ts | 2 +- src/commands/doctor-device-pairing.test.ts | 2 +- src/commands/doctor-device-pairing.ts | 4 +- .../doctor-gateway-daemon-flow.test.ts | 2 +- src/commands/doctor-gateway-daemon-flow.ts | 2 +- src/commands/doctor-gateway-health.test.ts | 2 +- src/commands/doctor-gateway-health.ts | 2 +- src/commands/doctor-gateway-services.test.ts | 2 +- src/commands/doctor-gateway-services.ts | 2 +- .../doctor-heartbeat-main-session-repair.ts | 2 +- .../doctor-heartbeat-template-repair.test.ts | 2 +- .../doctor-heartbeat-template-repair.ts | 2 +- src/commands/doctor-install.test.ts | 4 +- src/commands/doctor-install.ts | 2 +- src/commands/doctor-memory-search.test.ts | 2 +- src/commands/doctor-memory-search.ts | 2 +- src/commands/doctor-platform-notes.ts | 2 +- src/commands/doctor-plugin-manifests.ts | 2 +- src/commands/doctor-plugin-registry.test.ts | 4 +- src/commands/doctor-plugin-registry.ts | 2 +- src/commands/doctor-prompter.ts | 5 +- src/commands/doctor-sandbox.ts | 2 +- ...rns-sandbox-enabled-without-docker.test.ts | 2 +- src/commands/doctor-security.test.ts | 2 +- src/commands/doctor-security.ts | 2 +- src/commands/doctor-session-locks.test.ts | 2 +- src/commands/doctor-session-locks.ts | 2 +- src/commands/doctor-session-snapshots.test.ts | 2 +- src/commands/doctor-session-snapshots.ts | 2 +- .../doctor-session-state-providers.ts | 2 +- .../doctor-session-transcripts.test.ts | 2 +- src/commands/doctor-session-transcripts.ts | 2 +- src/commands/doctor-skills.ts | 2 +- src/commands/doctor-state-integrity.ts | 2 +- src/commands/doctor-ui.ts | 2 +- src/commands/doctor-update.test.ts | 2 +- src/commands/doctor-update.ts | 2 +- .../doctor-whatsapp-responsiveness.test.ts | 2 +- .../doctor-whatsapp-responsiveness.ts | 2 +- src/commands/doctor-workspace-status.test.ts | 2 +- src/commands/doctor-workspace-status.ts | 2 +- src/commands/doctor-workspace.test.ts | 2 +- src/commands/doctor-workspace.ts | 2 +- src/commands/doctor.note-test-helpers.ts | 4 +- src/commands/doctor/emit-notes.ts | 2 +- src/commands/doctor/repair-sequencing.ts | 2 +- .../shared/active-tool-schema-warnings.ts | 2 +- .../shared/bundled-plugin-load-paths.ts | 2 +- .../doctor/shared/channel-plugin-blockers.ts | 2 +- src/commands/doctor/shared/exec-safe-bins.ts | 2 +- .../doctor/shared/invalid-plugin-config.ts | 2 +- .../shared/legacy-config-core-normalizers.ts | 2 +- .../doctor/shared/legacy-tools-by-sender.ts | 2 +- .../doctor/shared/open-policy-allowfrom.ts | 2 +- .../doctor/shared/plugin-runtime-symlinks.ts | 2 +- .../doctor/shared/preview-warnings.ts | 2 +- .../doctor/shared/stale-plugin-config.ts | 2 +- src/commands/flows.ts | 4 +- src/commands/gateway-status.ts | 2 +- src/commands/gateway-status/helpers.ts | 2 +- src/commands/gateway-status/output.test.ts | 7 +- src/commands/gateway-status/output.ts | 2 +- src/commands/health-format.ts | 2 +- src/commands/health.test.ts | 2 +- src/commands/health.ts | 4 +- src/commands/message-format.ts | 4 +- src/commands/migrate.ts | 6 +- src/commands/migrate/output.test.ts | 2 +- src/commands/migrate/output.ts | 2 +- src/commands/models/auth.ts | 5 +- src/commands/models/list.format.ts | 2 +- src/commands/models/list.status-command.ts | 6 +- src/commands/models/list.table.ts | 4 +- src/commands/models/scan.ts | 10 +- .../oauth-tls-preflight.doctor.test.ts | 2 +- src/commands/onboard-helpers.ts | 9 +- src/commands/onboard-interactive.test.ts | 2 +- src/commands/onboard-interactive.ts | 2 +- src/commands/onboarding-plugin-install.ts | 2 +- src/commands/reset.ts | 7 +- src/commands/sandbox-explain.ts | 4 +- src/commands/sessions-cleanup.ts | 2 +- src/commands/sessions-table.ts | 2 +- src/commands/sessions.ts | 2 +- src/commands/status-all/channels.ts | 2 +- src/commands/status-all/report-lines.ts | 4 +- src/commands/status-all/report-sections.ts | 2 +- src/commands/status-all/report-tables.ts | 2 +- src/commands/status-all/text-report.ts | 2 +- src/commands/status.command-report-data.ts | 2 +- src/commands/status.command-report.ts | 2 +- src/commands/status.command-sections.ts | 2 +- src/commands/status.command.text-runtime.ts | 4 +- src/commands/status.command.ts | 2 +- src/commands/systemd-linger.ts | 2 +- src/commands/tasks.ts | 2 +- src/commands/uninstall.ts | 6 +- src/config/io.invalid-config.ts | 2 +- src/config/io.ts | 2 +- src/config/issue-format.ts | 2 +- src/config/logging.ts | 2 +- src/context-engine/registry.ts | 2 +- src/daemon/launchd-restart-handoff.ts | 2 +- src/daemon/launchd.ts | 2 +- src/daemon/output.ts | 2 +- src/flows/channel-setup.prompts.ts | 2 +- src/flows/channel-setup.status.ts | 4 +- src/flows/doctor-health-contributions.test.ts | 2 +- src/flows/doctor-health-contributions.ts | 26 +-- src/flows/doctor-health.ts | 2 +- src/gateway/server-startup-log.test.ts | 2 +- src/globals.ts | 2 +- src/hooks/loader.test.ts | 2 +- src/hooks/loader.ts | 2 +- src/index.ts | 2 +- src/infra/channel-summary.ts | 4 +- src/infra/ports.test.ts | 2 +- src/infra/tailscale.ts | 2 +- ...handled-rejections.fatal-detection.test.ts | 2 +- src/infra/unhandled-rejections.ts | 2 +- src/logger.test.ts | 2 +- src/logger.ts | 2 +- src/logging/console.ts | 2 +- src/logging/subsystem.ts | 2 +- src/plugin-sdk/channel-policy.ts | 2 +- src/plugin-sdk/channel-test-helpers.ts | 2 +- src/plugin-sdk/cli-runtime.ts | 6 +- .../memory-core-host-runtime-cli.ts | 4 +- src/plugin-sdk/optional-channel-setup.ts | 2 +- src/plugin-sdk/setup-tools.ts | 2 +- src/plugin-sdk/setup.ts | 2 +- src/plugin-sdk/test-fixtures.ts | 2 +- src/plugin-sdk/testing.ts | 2 +- src/plugin-sdk/text-chunking.ts | 2 +- src/plugin-sdk/text-runtime.ts | 2 +- ...tension-package-project-boundaries.test.ts | 1 + src/plugins/git-install.ts | 2 +- src/plugins/manifest-registry.ts | 2 +- src/plugins/marketplace.ts | 2 +- src/plugins/provider-auth-choice.ts | 2 +- src/plugins/provider-auth-choices.ts | 2 +- .../provider-openai-codex-oauth-tls.ts | 2 +- src/plugins/provider-runtime.ts | 2 +- src/plugins/schema-validator.ts | 2 +- src/plugins/sdk-alias.test.ts | 32 ++++ src/plugins/sdk-alias.ts | 152 +++++++++++++++++- src/runtime.ts | 4 +- src/skills/lifecycle/source-install.ts | 2 +- src/status/agent-runtime-label.ts | 2 +- .../components/searchable-select-list.test.ts | 2 +- src/tui/components/searchable-select-list.ts | 2 +- src/tui/tui-formatters.ts | 2 +- src/wizard/clack-prompter.ts | 12 +- src/wizard/setup.finalize.test.ts | 2 +- src/wizard/setup.finalize.ts | 2 +- test/helpers/normalize-text.ts | 2 +- .../write-cli-startup-metadata.test.ts | 4 +- test/vitest/vitest.unit-fast-paths.mjs | 6 +- tsconfig.json | 35 ++++ tsconfig.plugin-sdk.dts.json | 1 + tsdown.config.ts | 42 +++++ ui/src/ui/controllers/logs.ts | 2 +- 351 files changed, 1158 insertions(+), 457 deletions(-) create mode 100644 packages/terminal-core/package.json rename {src/terminal => packages/terminal-core/src}/ansi.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/ansi.ts (100%) rename {src/terminal => packages/terminal-core/src}/decorative-emoji.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/decorative-emoji.ts (100%) create mode 100644 packages/terminal-core/src/display-string.ts rename {src/terminal => packages/terminal-core/src}/health-style.ts (94%) create mode 100644 packages/terminal-core/src/index.ts rename {src/terminal => packages/terminal-core/src}/links.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/links.ts (100%) rename {src/terminal => packages/terminal-core/src}/note.ts (98%) rename {src/terminal => packages/terminal-core/src}/osc-progress.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/osc-progress.ts (100%) rename {src/terminal => packages/terminal-core/src}/palette.ts (100%) rename {src/terminal => packages/terminal-core/src}/progress-line.ts (100%) rename {src/terminal => packages/terminal-core/src}/prompt-select-styled-params.ts (100%) rename {src/terminal => packages/terminal-core/src}/prompt-select-styled.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/prompt-select-styled.ts (100%) rename {src/terminal => packages/terminal-core/src}/prompt-style.ts (100%) rename {src/terminal => packages/terminal-core/src}/restore.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/restore.ts (100%) rename {src/terminal => packages/terminal-core/src}/safe-text.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/safe-text.ts (100%) rename {src/terminal => packages/terminal-core/src}/stream-writer.test.ts (100%) rename {src/terminal => packages/terminal-core/src}/stream-writer.ts (100%) create mode 100644 packages/terminal-core/src/string.ts rename {src/terminal => packages/terminal-core/src}/table.test.ts (98%) rename {src/terminal => packages/terminal-core/src}/table.ts (99%) rename {src/terminal => packages/terminal-core/src}/terminal-link.ts (100%) rename {src/terminal => packages/terminal-core/src}/theme.ts (100%) diff --git a/config/knip.config.ts b/config/knip.config.ts index 7f9931f89e1..b3749efe913 100644 --- a/config/knip.config.ts +++ b/config/knip.config.ts @@ -184,6 +184,10 @@ const config = { entry: ["src/*.ts!"], project: ["src/**/*.ts!"], }, + "packages/terminal-core": { + entry: ["src/*.ts!"], + project: ["src/**/*.ts!"], + }, "packages/speech-core": { entry: ["api.ts!", "runtime-api.ts!", "speaker.ts!", "voice-models.ts!"], project: ["**/*.ts!"], diff --git a/extensions/tsconfig.package-boundary.paths.json b/extensions/tsconfig.package-boundary.paths.json index dacc50ade22..0d516cd6370 100644 --- a/extensions/tsconfig.package-boundary.paths.json +++ b/extensions/tsconfig.package-boundary.paths.json @@ -150,6 +150,63 @@ "@openclaw/media-generation-core/*": [ "../dist/plugin-sdk/packages/media-generation-core/src/*.d.ts" ], + "@openclaw/terminal-core": [ + "../dist/plugin-sdk/packages/terminal-core/src/index.d.ts" + ], + "@openclaw/terminal-core/ansi": [ + "../dist/plugin-sdk/packages/terminal-core/src/ansi.d.ts" + ], + "@openclaw/terminal-core/decorative-emoji": [ + "../dist/plugin-sdk/packages/terminal-core/src/decorative-emoji.d.ts" + ], + "@openclaw/terminal-core/health-style": [ + "../dist/plugin-sdk/packages/terminal-core/src/health-style.d.ts" + ], + "@openclaw/terminal-core/links": [ + "../dist/plugin-sdk/packages/terminal-core/src/links.d.ts" + ], + "@openclaw/terminal-core/note": [ + "../dist/plugin-sdk/packages/terminal-core/src/note.d.ts" + ], + "@openclaw/terminal-core/osc-progress": [ + "../dist/plugin-sdk/packages/terminal-core/src/osc-progress.d.ts" + ], + "@openclaw/terminal-core/palette": [ + "../dist/plugin-sdk/packages/terminal-core/src/palette.d.ts" + ], + "@openclaw/terminal-core/progress-line": [ + "../dist/plugin-sdk/packages/terminal-core/src/progress-line.d.ts" + ], + "@openclaw/terminal-core/prompt-select-styled": [ + "../dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled.d.ts" + ], + "@openclaw/terminal-core/prompt-select-styled-params": [ + "../dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled-params.d.ts" + ], + "@openclaw/terminal-core/prompt-style": [ + "../dist/plugin-sdk/packages/terminal-core/src/prompt-style.d.ts" + ], + "@openclaw/terminal-core/restore": [ + "../dist/plugin-sdk/packages/terminal-core/src/restore.d.ts" + ], + "@openclaw/terminal-core/safe-text": [ + "../dist/plugin-sdk/packages/terminal-core/src/safe-text.d.ts" + ], + "@openclaw/terminal-core/stream-writer": [ + "../dist/plugin-sdk/packages/terminal-core/src/stream-writer.d.ts" + ], + "@openclaw/terminal-core/table": [ + "../dist/plugin-sdk/packages/terminal-core/src/table.d.ts" + ], + "@openclaw/terminal-core/terminal-link": [ + "../dist/plugin-sdk/packages/terminal-core/src/terminal-link.d.ts" + ], + "@openclaw/terminal-core/theme": [ + "../dist/plugin-sdk/packages/terminal-core/src/theme.d.ts" + ], + "@openclaw/terminal-core/*": [ + "../dist/plugin-sdk/packages/terminal-core/src/*.d.ts" + ], "@openclaw/*.js": ["../packages/plugin-sdk/dist/extensions/*.d.ts", "../extensions/*"], "@openclaw/*": ["../packages/plugin-sdk/dist/extensions/*", "../extensions/*"], "openclaw/plugin-sdk/qa-channel": ["../dist/plugin-sdk/src/plugin-sdk/qa-channel.d.ts"], diff --git a/extensions/xai/tsconfig.json b/extensions/xai/tsconfig.json index 6f56799b27f..45c5b1a13c3 100644 --- a/extensions/xai/tsconfig.json +++ b/extensions/xai/tsconfig.json @@ -159,6 +159,63 @@ "@openclaw/media-generation-core/*": [ "../../dist/plugin-sdk/packages/media-generation-core/src/*.d.ts" ], + "@openclaw/terminal-core": [ + "../../dist/plugin-sdk/packages/terminal-core/src/index.d.ts" + ], + "@openclaw/terminal-core/ansi": [ + "../../dist/plugin-sdk/packages/terminal-core/src/ansi.d.ts" + ], + "@openclaw/terminal-core/decorative-emoji": [ + "../../dist/plugin-sdk/packages/terminal-core/src/decorative-emoji.d.ts" + ], + "@openclaw/terminal-core/health-style": [ + "../../dist/plugin-sdk/packages/terminal-core/src/health-style.d.ts" + ], + "@openclaw/terminal-core/links": [ + "../../dist/plugin-sdk/packages/terminal-core/src/links.d.ts" + ], + "@openclaw/terminal-core/note": [ + "../../dist/plugin-sdk/packages/terminal-core/src/note.d.ts" + ], + "@openclaw/terminal-core/osc-progress": [ + "../../dist/plugin-sdk/packages/terminal-core/src/osc-progress.d.ts" + ], + "@openclaw/terminal-core/palette": [ + "../../dist/plugin-sdk/packages/terminal-core/src/palette.d.ts" + ], + "@openclaw/terminal-core/progress-line": [ + "../../dist/plugin-sdk/packages/terminal-core/src/progress-line.d.ts" + ], + "@openclaw/terminal-core/prompt-select-styled": [ + "../../dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled.d.ts" + ], + "@openclaw/terminal-core/prompt-select-styled-params": [ + "../../dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled-params.d.ts" + ], + "@openclaw/terminal-core/prompt-style": [ + "../../dist/plugin-sdk/packages/terminal-core/src/prompt-style.d.ts" + ], + "@openclaw/terminal-core/restore": [ + "../../dist/plugin-sdk/packages/terminal-core/src/restore.d.ts" + ], + "@openclaw/terminal-core/safe-text": [ + "../../dist/plugin-sdk/packages/terminal-core/src/safe-text.d.ts" + ], + "@openclaw/terminal-core/stream-writer": [ + "../../dist/plugin-sdk/packages/terminal-core/src/stream-writer.d.ts" + ], + "@openclaw/terminal-core/table": [ + "../../dist/plugin-sdk/packages/terminal-core/src/table.d.ts" + ], + "@openclaw/terminal-core/terminal-link": [ + "../../dist/plugin-sdk/packages/terminal-core/src/terminal-link.d.ts" + ], + "@openclaw/terminal-core/theme": [ + "../../dist/plugin-sdk/packages/terminal-core/src/theme.d.ts" + ], + "@openclaw/terminal-core/*": [ + "../../dist/plugin-sdk/packages/terminal-core/src/*.d.ts" + ], "@openclaw/*.js": ["../../packages/plugin-sdk/dist/extensions/*.d.ts", "../*"], "@openclaw/*": ["../*"], "openclaw/plugin-sdk/qa-channel": [ diff --git a/packages/memory-host-sdk/src/host/openclaw-runtime.ts b/packages/memory-host-sdk/src/host/openclaw-runtime.ts index db30ae00c21..4ff81ed404d 100644 --- a/packages/memory-host-sdk/src/host/openclaw-runtime.ts +++ b/packages/memory-host-sdk/src/host/openclaw-runtime.ts @@ -140,8 +140,8 @@ export { parseAgentSessionKey } from "../../../../src/routing/session-key.js"; export { hasInterSessionUserProvenance } from "../../../../src/sessions/input-provenance.js"; export { isCronRunSessionKey } from "../../../../src/sessions/session-key-utils.js"; export { onSessionTranscriptUpdate } from "../../../../src/sessions/transcript-events.js"; -export { formatDocsLink } from "../../../../src/terminal/links.js"; -export { colorize, isRich, theme } from "../../../../src/terminal/theme.js"; +export { formatDocsLink } from "../../../terminal-core/src/links.js"; +export { colorize, isRich, theme } from "../../../terminal-core/src/theme.js"; export { CHARS_PER_TOKEN_ESTIMATE, estimateStringChars } from "../../../../src/utils/cjk-chars.js"; export { runTasksWithConcurrency } from "../../../../src/utils/run-with-concurrency.js"; export { splitShellArgs } from "../../../../src/utils/shell-argv.js"; diff --git a/packages/plugin-sdk/tsconfig.json b/packages/plugin-sdk/tsconfig.json index 24a61c1d04d..21584911e53 100644 --- a/packages/plugin-sdk/tsconfig.json +++ b/packages/plugin-sdk/tsconfig.json @@ -15,6 +15,7 @@ "include": [ "../../packages/markdown-core/src/**/*.ts", "../../packages/media-generation-core/src/**/*.ts", + "../../packages/terminal-core/src/**/*.ts", "../../src/plugin-sdk/**/*.ts", "../../src/video-generation/dashscope-compatible.ts", "../../src/video-generation/types.ts", diff --git a/packages/terminal-core/package.json b/packages/terminal-core/package.json new file mode 100644 index 00000000000..7af70e1e88e --- /dev/null +++ b/packages/terminal-core/package.json @@ -0,0 +1,107 @@ +{ + "name": "@openclaw/terminal-core", + "version": "0.0.0-private", + "private": true, + "files": [ + "dist" + ], + "type": "module", + "main": "./dist/index.mjs", + "types": "./dist/index.d.mts", + "exports": { + ".": { + "types": "./dist/index.d.mts", + "import": "./dist/index.mjs", + "default": "./dist/index.mjs" + }, + "./ansi": { + "types": "./dist/ansi.d.mts", + "import": "./dist/ansi.mjs", + "default": "./dist/ansi.mjs" + }, + "./decorative-emoji": { + "types": "./dist/decorative-emoji.d.mts", + "import": "./dist/decorative-emoji.mjs", + "default": "./dist/decorative-emoji.mjs" + }, + "./health-style": { + "types": "./dist/health-style.d.mts", + "import": "./dist/health-style.mjs", + "default": "./dist/health-style.mjs" + }, + "./links": { + "types": "./dist/links.d.mts", + "import": "./dist/links.mjs", + "default": "./dist/links.mjs" + }, + "./note": { + "types": "./dist/note.d.mts", + "import": "./dist/note.mjs", + "default": "./dist/note.mjs" + }, + "./osc-progress": { + "types": "./dist/osc-progress.d.mts", + "import": "./dist/osc-progress.mjs", + "default": "./dist/osc-progress.mjs" + }, + "./palette": { + "types": "./dist/palette.d.mts", + "import": "./dist/palette.mjs", + "default": "./dist/palette.mjs" + }, + "./progress-line": { + "types": "./dist/progress-line.d.mts", + "import": "./dist/progress-line.mjs", + "default": "./dist/progress-line.mjs" + }, + "./prompt-select-styled": { + "types": "./dist/prompt-select-styled.d.mts", + "import": "./dist/prompt-select-styled.mjs", + "default": "./dist/prompt-select-styled.mjs" + }, + "./prompt-select-styled-params": { + "types": "./dist/prompt-select-styled-params.d.mts", + "import": "./dist/prompt-select-styled-params.mjs", + "default": "./dist/prompt-select-styled-params.mjs" + }, + "./prompt-style": { + "types": "./dist/prompt-style.d.mts", + "import": "./dist/prompt-style.mjs", + "default": "./dist/prompt-style.mjs" + }, + "./restore": { + "types": "./dist/restore.d.mts", + "import": "./dist/restore.mjs", + "default": "./dist/restore.mjs" + }, + "./safe-text": { + "types": "./dist/safe-text.d.mts", + "import": "./dist/safe-text.mjs", + "default": "./dist/safe-text.mjs" + }, + "./stream-writer": { + "types": "./dist/stream-writer.d.mts", + "import": "./dist/stream-writer.mjs", + "default": "./dist/stream-writer.mjs" + }, + "./table": { + "types": "./dist/table.d.mts", + "import": "./dist/table.mjs", + "default": "./dist/table.mjs" + }, + "./terminal-link": { + "types": "./dist/terminal-link.d.mts", + "import": "./dist/terminal-link.mjs", + "default": "./dist/terminal-link.mjs" + }, + "./theme": { + "types": "./dist/theme.d.mts", + "import": "./dist/theme.mjs", + "default": "./dist/theme.mjs" + } + }, + "dependencies": { + "@clack/prompts": "1.4.0", + "chalk": "5.6.2" + } +} diff --git a/src/terminal/ansi.test.ts b/packages/terminal-core/src/ansi.test.ts similarity index 100% rename from src/terminal/ansi.test.ts rename to packages/terminal-core/src/ansi.test.ts diff --git a/src/terminal/ansi.ts b/packages/terminal-core/src/ansi.ts similarity index 100% rename from src/terminal/ansi.ts rename to packages/terminal-core/src/ansi.ts diff --git a/src/terminal/decorative-emoji.test.ts b/packages/terminal-core/src/decorative-emoji.test.ts similarity index 100% rename from src/terminal/decorative-emoji.test.ts rename to packages/terminal-core/src/decorative-emoji.test.ts diff --git a/src/terminal/decorative-emoji.ts b/packages/terminal-core/src/decorative-emoji.ts similarity index 100% rename from src/terminal/decorative-emoji.ts rename to packages/terminal-core/src/decorative-emoji.ts diff --git a/packages/terminal-core/src/display-string.ts b/packages/terminal-core/src/display-string.ts new file mode 100644 index 00000000000..a900492b422 --- /dev/null +++ b/packages/terminal-core/src/display-string.ts @@ -0,0 +1,72 @@ +import os from "node:os"; +import path from "node:path"; + +function normalize(value: string | undefined): string | undefined { + const trimmed = value?.trim(); + return trimmed && trimmed !== "undefined" && trimmed !== "null" ? trimmed : undefined; +} + +function normalizeSafe(fn: () => string | undefined): string | undefined { + try { + return normalize(fn()); + } catch { + return undefined; + } +} + +function resolveTermuxHome(env: NodeJS.ProcessEnv): string | undefined { + const prefix = normalize(env.PREFIX); + if (!prefix || !normalize(env.ANDROID_DATA)) { + return undefined; + } + if (!/(?:^|\/)com\.termux\/files\/usr\/?$/u.test(prefix.replace(/\\/gu, "/"))) { + return undefined; + } + return path.resolve(prefix, "..", "home"); +} + +function resolveRawOsHomeDir(env: NodeJS.ProcessEnv, homedir: () => string): string | undefined { + return ( + normalize(env.HOME) ?? + normalize(env.USERPROFILE) ?? + resolveTermuxHome(env) ?? + normalizeSafe(homedir) + ); +} + +function resolveRawHomeDir( + env: NodeJS.ProcessEnv = process.env, + homedir: () => string = os.homedir, +): string | undefined { + const explicitHome = normalize(env.OPENCLAW_HOME); + if (explicitHome) { + const fallbackHome = resolveRawOsHomeDir(env, homedir); + return fallbackHome ? explicitHome.replace(/^~(?=$|[\\/])/, fallbackHome) : explicitHome; + } + return resolveRawOsHomeDir(env, homedir); +} + +function resolveEffectiveHomeDir( + env: NodeJS.ProcessEnv = process.env, + homedir: () => string = os.homedir, +): string | undefined { + const raw = resolveRawHomeDir(env, homedir); + return raw ? path.resolve(raw) : undefined; +} + +function resolveHomeDisplayPrefix(): { home: string; prefix: string } | undefined { + const home = resolveEffectiveHomeDir(); + if (!home) { + return undefined; + } + const explicitHome = process.env.OPENCLAW_HOME?.trim(); + return explicitHome ? { home, prefix: "$OPENCLAW_HOME" } : { home, prefix: "~" }; +} + +export function displayString(input: string): string { + if (!input) { + return input; + } + const display = resolveHomeDisplayPrefix(); + return display ? input.split(display.home).join(display.prefix) : input; +} diff --git a/src/terminal/health-style.ts b/packages/terminal-core/src/health-style.ts similarity index 94% rename from src/terminal/health-style.ts rename to packages/terminal-core/src/health-style.ts index b6c18c3d160..9c04b6ce0af 100644 --- a/src/terminal/health-style.ts +++ b/packages/terminal-core/src/health-style.ts @@ -1,4 +1,4 @@ -import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; +import { normalizeLowercaseStringOrEmpty } from "./string.js"; import { theme } from "./theme.js"; export function styleHealthChannelLine(line: string, rich: boolean): string { diff --git a/packages/terminal-core/src/index.ts b/packages/terminal-core/src/index.ts new file mode 100644 index 00000000000..f9447bedf3b --- /dev/null +++ b/packages/terminal-core/src/index.ts @@ -0,0 +1,17 @@ +export * from "./ansi.js"; +export * from "./decorative-emoji.js"; +export * from "./health-style.js"; +export * from "./links.js"; +export * from "./note.js"; +export * from "./osc-progress.js"; +export * from "./palette.js"; +export * from "./progress-line.js"; +export * from "./prompt-select-styled.js"; +export * from "./prompt-select-styled-params.js"; +export * from "./prompt-style.js"; +export * from "./restore.js"; +export * from "./safe-text.js"; +export * from "./stream-writer.js"; +export * from "./table.js"; +export * from "./terminal-link.js"; +export * from "./theme.js"; diff --git a/src/terminal/links.test.ts b/packages/terminal-core/src/links.test.ts similarity index 100% rename from src/terminal/links.test.ts rename to packages/terminal-core/src/links.test.ts diff --git a/src/terminal/links.ts b/packages/terminal-core/src/links.ts similarity index 100% rename from src/terminal/links.ts rename to packages/terminal-core/src/links.ts diff --git a/src/terminal/note.ts b/packages/terminal-core/src/note.ts similarity index 98% rename from src/terminal/note.ts rename to packages/terminal-core/src/note.ts index 798eda4cf76..18ab330dd7a 100644 --- a/src/terminal/note.ts +++ b/packages/terminal-core/src/note.ts @@ -1,8 +1,8 @@ import { AsyncLocalStorage } from "node:async_hooks"; import { note as clackNote } from "@clack/prompts"; -import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; import { visibleWidth } from "./ansi.js"; import { stylePromptTitle } from "./prompt-style.js"; +import { normalizeLowercaseStringOrEmpty } from "./string.js"; const MIN_NOTE_COLUMNS = 80; const URL_PREFIX_RE = /^(https?:\/\/|file:\/\/)/i; diff --git a/src/terminal/osc-progress.test.ts b/packages/terminal-core/src/osc-progress.test.ts similarity index 100% rename from src/terminal/osc-progress.test.ts rename to packages/terminal-core/src/osc-progress.test.ts diff --git a/src/terminal/osc-progress.ts b/packages/terminal-core/src/osc-progress.ts similarity index 100% rename from src/terminal/osc-progress.ts rename to packages/terminal-core/src/osc-progress.ts diff --git a/src/terminal/palette.ts b/packages/terminal-core/src/palette.ts similarity index 100% rename from src/terminal/palette.ts rename to packages/terminal-core/src/palette.ts diff --git a/src/terminal/progress-line.ts b/packages/terminal-core/src/progress-line.ts similarity index 100% rename from src/terminal/progress-line.ts rename to packages/terminal-core/src/progress-line.ts diff --git a/src/terminal/prompt-select-styled-params.ts b/packages/terminal-core/src/prompt-select-styled-params.ts similarity index 100% rename from src/terminal/prompt-select-styled-params.ts rename to packages/terminal-core/src/prompt-select-styled-params.ts diff --git a/src/terminal/prompt-select-styled.test.ts b/packages/terminal-core/src/prompt-select-styled.test.ts similarity index 100% rename from src/terminal/prompt-select-styled.test.ts rename to packages/terminal-core/src/prompt-select-styled.test.ts diff --git a/src/terminal/prompt-select-styled.ts b/packages/terminal-core/src/prompt-select-styled.ts similarity index 100% rename from src/terminal/prompt-select-styled.ts rename to packages/terminal-core/src/prompt-select-styled.ts diff --git a/src/terminal/prompt-style.ts b/packages/terminal-core/src/prompt-style.ts similarity index 100% rename from src/terminal/prompt-style.ts rename to packages/terminal-core/src/prompt-style.ts diff --git a/src/terminal/restore.test.ts b/packages/terminal-core/src/restore.test.ts similarity index 100% rename from src/terminal/restore.test.ts rename to packages/terminal-core/src/restore.test.ts diff --git a/src/terminal/restore.ts b/packages/terminal-core/src/restore.ts similarity index 100% rename from src/terminal/restore.ts rename to packages/terminal-core/src/restore.ts diff --git a/src/terminal/safe-text.test.ts b/packages/terminal-core/src/safe-text.test.ts similarity index 100% rename from src/terminal/safe-text.test.ts rename to packages/terminal-core/src/safe-text.test.ts diff --git a/src/terminal/safe-text.ts b/packages/terminal-core/src/safe-text.ts similarity index 100% rename from src/terminal/safe-text.ts rename to packages/terminal-core/src/safe-text.ts diff --git a/src/terminal/stream-writer.test.ts b/packages/terminal-core/src/stream-writer.test.ts similarity index 100% rename from src/terminal/stream-writer.test.ts rename to packages/terminal-core/src/stream-writer.test.ts diff --git a/src/terminal/stream-writer.ts b/packages/terminal-core/src/stream-writer.ts similarity index 100% rename from src/terminal/stream-writer.ts rename to packages/terminal-core/src/stream-writer.ts diff --git a/packages/terminal-core/src/string.ts b/packages/terminal-core/src/string.ts new file mode 100644 index 00000000000..ef5d2d75397 --- /dev/null +++ b/packages/terminal-core/src/string.ts @@ -0,0 +1,6 @@ +export function normalizeLowercaseStringOrEmpty(value: unknown): string { + if (typeof value !== "string") { + return ""; + } + return value.trim().toLowerCase(); +} diff --git a/src/terminal/table.test.ts b/packages/terminal-core/src/table.test.ts similarity index 98% rename from src/terminal/table.test.ts rename to packages/terminal-core/src/table.test.ts index 8f217273aa6..13ad57348ce 100644 --- a/src/terminal/table.test.ts +++ b/packages/terminal-core/src/table.test.ts @@ -1,9 +1,12 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { mockProcessPlatform } from "../test-utils/vitest-spies.js"; import { visibleWidth } from "./ansi.js"; import { resolveNoteColumns, wrapNoteMessage } from "./note.js"; import { renderTable } from "./table.js"; +function mockProcessPlatform(platform: NodeJS.Platform): void { + vi.spyOn(process, "platform", "get").mockReturnValue(platform); +} + describe("renderTable", () => { afterEach(() => { vi.unstubAllEnvs(); diff --git a/src/terminal/table.ts b/packages/terminal-core/src/table.ts similarity index 99% rename from src/terminal/table.ts rename to packages/terminal-core/src/table.ts index bd0aa1ab46e..e662bf106a9 100644 --- a/src/terminal/table.ts +++ b/packages/terminal-core/src/table.ts @@ -1,5 +1,5 @@ -import { displayString } from "../utils.js"; import { splitGraphemes, visibleWidth } from "./ansi.js"; +import { displayString } from "./display-string.js"; type Align = "left" | "right" | "center"; diff --git a/src/terminal/terminal-link.ts b/packages/terminal-core/src/terminal-link.ts similarity index 100% rename from src/terminal/terminal-link.ts rename to packages/terminal-core/src/terminal-link.ts diff --git a/src/terminal/theme.ts b/packages/terminal-core/src/theme.ts similarity index 100% rename from src/terminal/theme.ts rename to packages/terminal-core/src/theme.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 020825c2d26..cefa58a761b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1856,6 +1856,15 @@ importers: specifier: workspace:* version: link:../.. + packages/terminal-core: + dependencies: + '@clack/prompts': + specifier: 1.4.0 + version: 1.4.0 + chalk: + specifier: 5.6.2 + version: 5.6.2 + ui: dependencies: '@create-markdown/preview': diff --git a/scripts/build-all.mjs b/scripts/build-all.mjs index c0fffc86f84..c542961f40a 100644 --- a/scripts/build-all.mjs +++ b/scripts/build-all.mjs @@ -48,6 +48,7 @@ export const BUILD_ALL_STEPS = [ "packages/plugin-sdk/package.json", "packages/llm-core/package.json", "packages/markdown-core/package.json", + "packages/terminal-core/package.json", "packages/memory-host-sdk/package.json", "tsconfig.json", "tsconfig.plugin-sdk.dts.json", @@ -56,6 +57,7 @@ export const BUILD_ALL_STEPS = [ "packages/markdown-core/src", "packages/memory-host-sdk/src", "packages/media-generation-core/src", + "packages/terminal-core/src", "src/types", "src/video-generation/dashscope-compatible.ts", "src/video-generation/types.ts", diff --git a/scripts/lib/extension-package-boundary.ts b/scripts/lib/extension-package-boundary.ts index b7021403b65..258827d88e7 100644 --- a/scripts/lib/extension-package-boundary.ts +++ b/scripts/lib/extension-package-boundary.ts @@ -93,6 +93,45 @@ export const EXTENSION_PACKAGE_BOUNDARY_BASE_PATHS = { "@openclaw/media-generation-core/*": [ "../dist/plugin-sdk/packages/media-generation-core/src/*.d.ts", ], + "@openclaw/terminal-core": ["../dist/plugin-sdk/packages/terminal-core/src/index.d.ts"], + "@openclaw/terminal-core/ansi": ["../dist/plugin-sdk/packages/terminal-core/src/ansi.d.ts"], + "@openclaw/terminal-core/decorative-emoji": [ + "../dist/plugin-sdk/packages/terminal-core/src/decorative-emoji.d.ts", + ], + "@openclaw/terminal-core/health-style": [ + "../dist/plugin-sdk/packages/terminal-core/src/health-style.d.ts", + ], + "@openclaw/terminal-core/links": ["../dist/plugin-sdk/packages/terminal-core/src/links.d.ts"], + "@openclaw/terminal-core/note": ["../dist/plugin-sdk/packages/terminal-core/src/note.d.ts"], + "@openclaw/terminal-core/osc-progress": [ + "../dist/plugin-sdk/packages/terminal-core/src/osc-progress.d.ts", + ], + "@openclaw/terminal-core/palette": ["../dist/plugin-sdk/packages/terminal-core/src/palette.d.ts"], + "@openclaw/terminal-core/progress-line": [ + "../dist/plugin-sdk/packages/terminal-core/src/progress-line.d.ts", + ], + "@openclaw/terminal-core/prompt-select-styled": [ + "../dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled.d.ts", + ], + "@openclaw/terminal-core/prompt-select-styled-params": [ + "../dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled-params.d.ts", + ], + "@openclaw/terminal-core/prompt-style": [ + "../dist/plugin-sdk/packages/terminal-core/src/prompt-style.d.ts", + ], + "@openclaw/terminal-core/restore": ["../dist/plugin-sdk/packages/terminal-core/src/restore.d.ts"], + "@openclaw/terminal-core/safe-text": [ + "../dist/plugin-sdk/packages/terminal-core/src/safe-text.d.ts", + ], + "@openclaw/terminal-core/stream-writer": [ + "../dist/plugin-sdk/packages/terminal-core/src/stream-writer.d.ts", + ], + "@openclaw/terminal-core/table": ["../dist/plugin-sdk/packages/terminal-core/src/table.d.ts"], + "@openclaw/terminal-core/terminal-link": [ + "../dist/plugin-sdk/packages/terminal-core/src/terminal-link.d.ts", + ], + "@openclaw/terminal-core/theme": ["../dist/plugin-sdk/packages/terminal-core/src/theme.d.ts"], + "@openclaw/terminal-core/*": ["../dist/plugin-sdk/packages/terminal-core/src/*.d.ts"], "@openclaw/*.js": ["../packages/plugin-sdk/dist/extensions/*.d.ts", "../extensions/*"], "@openclaw/*": ["../packages/plugin-sdk/dist/extensions/*", "../extensions/*"], "openclaw/plugin-sdk/qa-channel": ["../dist/plugin-sdk/src/plugin-sdk/qa-channel.d.ts"], diff --git a/scripts/prepare-extension-package-boundary-artifacts.mjs b/scripts/prepare-extension-package-boundary-artifacts.mjs index 15d7617816a..44101a7d825 100644 --- a/scripts/prepare-extension-package-boundary-artifacts.mjs +++ b/scripts/prepare-extension-package-boundary-artifacts.mjs @@ -19,6 +19,7 @@ const PLUGIN_SDK_TYPE_INPUTS = [ "packages/markdown-core/src", "packages/memory-host-sdk/src", "packages/media-generation-core/src", + "packages/terminal-core/src", "src/video-generation/dashscope-compatible.ts", "src/video-generation/types.ts", "src/types", @@ -48,6 +49,24 @@ const ROOT_DTS_REQUIRED_OUTPUTS = [ "dist/plugin-sdk/packages/media-generation-core/src/index.d.ts", "dist/plugin-sdk/packages/media-generation-core/src/model-ref.d.ts", "dist/plugin-sdk/packages/media-generation-core/src/normalization.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/ansi.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/decorative-emoji.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/health-style.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/index.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/links.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/note.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/osc-progress.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/palette.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/progress-line.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled-params.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/prompt-select-styled.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/prompt-style.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/restore.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/safe-text.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/stream-writer.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/table.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/terminal-link.d.ts", + "dist/plugin-sdk/packages/terminal-core/src/theme.d.ts", "dist/plugin-sdk/error-runtime.d.ts", "dist/plugin-sdk/plugin-entry.d.ts", "dist/plugin-sdk/provider-auth.d.ts", @@ -70,6 +89,24 @@ const PACKAGE_DTS_REQUIRED_OUTPUTS = [ "packages/plugin-sdk/dist/packages/media-generation-core/src/index.d.ts", "packages/plugin-sdk/dist/packages/media-generation-core/src/model-ref.d.ts", "packages/plugin-sdk/dist/packages/media-generation-core/src/normalization.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/ansi.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/decorative-emoji.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/health-style.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/index.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/links.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/note.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/osc-progress.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/palette.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/progress-line.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/prompt-select-styled-params.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/prompt-select-styled.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/prompt-style.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/restore.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/safe-text.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/stream-writer.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/table.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/terminal-link.d.ts", + "packages/plugin-sdk/dist/packages/terminal-core/src/theme.d.ts", "packages/plugin-sdk/dist/src/plugin-sdk/error-runtime.d.ts", "packages/plugin-sdk/dist/src/plugin-sdk/plugin-entry.d.ts", "packages/plugin-sdk/dist/src/plugin-sdk/provider-auth.d.ts", diff --git a/scripts/run-node-watch-paths.mjs b/scripts/run-node-watch-paths.mjs index ef0d59a40a3..9528634f963 100644 --- a/scripts/run-node-watch-paths.mjs +++ b/scripts/run-node-watch-paths.mjs @@ -12,6 +12,7 @@ const RUN_NODE_PACKAGE_SOURCE_ROOTS = [ "packages/gateway-protocol/src", "packages/markdown-core/src", "packages/media-generation-core/src", + "packages/terminal-core/src", "packages/net-policy/src", ]; diff --git a/scripts/test-shell-completion.ts b/scripts/test-shell-completion.ts index 068d0337248..8e69a7b12ea 100644 --- a/scripts/test-shell-completion.ts +++ b/scripts/test-shell-completion.ts @@ -26,13 +26,13 @@ import os from "node:os"; import path from "node:path"; import { confirm, isCancel } from "@clack/prompts"; +import { stylePromptMessage } from "../packages/terminal-core/src/prompt-style.js"; +import { theme } from "../packages/terminal-core/src/theme.js"; import { installCompletion } from "../src/cli/completion-cli.js"; import { checkShellCompletionStatus, ensureCompletionCacheExists, } from "../src/commands/doctor-completion.js"; -import { stylePromptMessage } from "../src/terminal/prompt-style.js"; -import { theme } from "../src/terminal/theme.js"; const CLI_NAME = "openclaw"; diff --git a/scripts/write-cli-startup-metadata.ts b/scripts/write-cli-startup-metadata.ts index b05720022e2..8e6404a64d0 100644 --- a/scripts/write-cli-startup-metadata.ts +++ b/scripts/write-cli-startup-metadata.ts @@ -162,8 +162,8 @@ function resolveSubcommandHelpSourceSignature(sourceRootDir: string = rootDir): path.join(sourceRootDir, "src/cli/gateway-cli/run-command.ts"), path.join(sourceRootDir, "src/cli/models-cli.ts"), path.join(sourceRootDir, "src/cli/plugins-cli.ts"), - path.join(sourceRootDir, "src/terminal/links.ts"), - path.join(sourceRootDir, "src/terminal/theme.ts"), + path.join(sourceRootDir, "packages/terminal-core/src/links.ts"), + path.join(sourceRootDir, "packages/terminal-core/src/theme.ts"), ], sourceRootDir, ); diff --git a/src/acp/client-helpers.ts b/src/acp/client-helpers.ts index 891274293a2..d076ca5bc10 100644 --- a/src/acp/client-helpers.ts +++ b/src/acp/client-helpers.ts @@ -1,5 +1,6 @@ import * as readline from "node:readline"; import type { RequestPermissionRequest, RequestPermissionResponse } from "@agentclientprotocol/sdk"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { materializeWindowsSpawnProgram, resolveWindowsSpawnProgram, @@ -12,7 +13,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { classifyAcpToolApproval, type AcpApprovalClass } from "./approval-classifier.js"; type PermissionOption = RequestPermissionRequest["options"][number]; diff --git a/src/agents/agent-command.live-model-switch.test.ts b/src/agents/agent-command.live-model-switch.test.ts index 208447b6537..56e01942fdb 100644 --- a/src/agents/agent-command.live-model-switch.test.ts +++ b/src/agents/agent-command.live-model-switch.test.ts @@ -290,7 +290,7 @@ vi.mock("../sessions/send-policy.js", () => ({ resolveSendPolicy: () => "allow", })); -vi.mock("../terminal/ansi.js", () => ({ +vi.mock("../../packages/terminal-core/src/ansi.js", () => ({ sanitizeForLog: (s: string) => s, })); diff --git a/src/agents/agent-command.ts b/src/agents/agent-command.ts index cd73f706572..d652d0cc447 100644 --- a/src/agents/agent-command.ts +++ b/src/agents/agent-command.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { resolveInlineAgentImageAttachments } from "../auto-reply/reply/agent-turn-attachments.js"; import { sanitizePendingFinalDeliveryText } from "../auto-reply/reply/pending-final-delivery.js"; import { @@ -44,7 +45,6 @@ import { normalizeOptionalString } from "../shared/string-coerce.js"; import { resolveEffectiveAgentSkillFilter } from "../skills/discovery/agent-filter.js"; import type { getRemoteSkillEligibility } from "../skills/runtime/remote.js"; import type { resolveReusableWorkspaceSkillSnapshot } from "../skills/runtime/session-snapshot.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { createTrajectoryRuntimeRecorder } from "../trajectory/runtime.js"; import { resolveUserPath } from "../utils.js"; import { resolveMessageChannel } from "../utils/message-channel.js"; diff --git a/src/agents/auth-profiles/oauth-refresh-failure.ts b/src/agents/auth-profiles/oauth-refresh-failure.ts index 69867ac1267..a010919ab70 100644 --- a/src/agents/auth-profiles/oauth-refresh-failure.ts +++ b/src/agents/auth-profiles/oauth-refresh-failure.ts @@ -1,5 +1,5 @@ +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { formatCliCommand } from "../../cli/command-format.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { normalizeProviderId } from "../provider-id.js"; export type OAuthRefreshFailureReason = diff --git a/src/agents/command/attempt-execution.ts b/src/agents/command/attempt-execution.ts index 0a771114a7d..58ee0222064 100644 --- a/src/agents/command/attempt-execution.ts +++ b/src/agents/command/attempt-execution.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { formatAcpErrorChain } from "../../acp/runtime/errors.js"; import type { AcpRuntimeEvent } from "../../acp/runtime/types.js"; import { normalizeReplyPayload } from "../../auto-reply/reply/normalize-reply.js"; @@ -20,7 +21,6 @@ import { type PersistedUserTurnMessage, } from "../../sessions/user-turn-transcript.js"; import { buildWorkspaceSkillSnapshot } from "../../skills/loading/workspace.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { resolveUserPath } from "../../utils.js"; import { resolveMessageChannel } from "../../utils/message-channel.js"; import { resolveAuthProfileOrder } from "../auth-profiles/order.js"; diff --git a/src/agents/embedded-agent-runner/compact-reasons.ts b/src/agents/embedded-agent-runner/compact-reasons.ts index 2ff9ecc0dff..201ec361bdc 100644 --- a/src/agents/embedded-agent-runner/compact-reasons.ts +++ b/src/agents/embedded-agent-runner/compact-reasons.ts @@ -1,5 +1,5 @@ +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; const MAX_COMPACTION_REASON_DETAIL_CHARS = 100; diff --git a/src/agents/embedded-agent-runner/run.ts b/src/agents/embedded-agent-runner/run.ts index 952cf2f6e4a..0bcacbd86be 100644 --- a/src/agents/embedded-agent-runner/run.ts +++ b/src/agents/embedded-agent-runner/run.ts @@ -1,5 +1,6 @@ import { randomBytes } from "node:crypto"; import fs from "node:fs/promises"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import type { ReplyPayload } from "../../auto-reply/reply-payload.js"; import type { ThinkLevel } from "../../auto-reply/thinking.js"; import { SILENT_REPLY_TOKEN } from "../../auto-reply/tokens.js"; @@ -20,7 +21,6 @@ import { enqueueCommandInLane } from "../../process/command-queue.js"; import type { CommandQueueEnqueueOptions } from "../../process/command-queue.types.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; import { createAgentHarnessTaskRuntimeScope } from "../../tasks/agent-harness-task-runtime-scope.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { resolveUserPath } from "../../utils.js"; import { isMarkdownCapableMessageChannel } from "../../utils/message-channel.js"; import { diff --git a/src/agents/embedded-agent-runner/run/assistant-failover.ts b/src/agents/embedded-agent-runner/run/assistant-failover.ts index 1887621f183..ff12fb9ef4e 100644 --- a/src/agents/embedded-agent-runner/run/assistant-failover.ts +++ b/src/agents/embedded-agent-runner/run/assistant-failover.ts @@ -1,6 +1,6 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import type { AssistantMessage } from "../../../llm/types.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import type { AuthProfileFailureReason } from "../../auth-profiles.js"; import { formatAssistantErrorText, diff --git a/src/agents/mcp-transport-config.ts b/src/agents/mcp-transport-config.ts index bd0b92ff5fa..aa03c639f4e 100644 --- a/src/agents/mcp-transport-config.ts +++ b/src/agents/mcp-transport-config.ts @@ -1,7 +1,7 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { resolveOpenClawMcpTransportAlias } from "../config/mcp-config-normalize.js"; import { logWarn } from "../logger.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { describeHttpMcpServerLaunchConfig, resolveHttpMcpServerLaunchConfig, diff --git a/src/agents/model-fallback-observation.ts b/src/agents/model-fallback-observation.ts index a882445f115..f5173fd854a 100644 --- a/src/agents/model-fallback-observation.ts +++ b/src/agents/model-fallback-observation.ts @@ -1,5 +1,5 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { buildTextObservationFields } from "./embedded-agent-error-observation.js"; import type { FailoverReason } from "./embedded-agent-helpers.js"; import type { FallbackAttempt, ModelCandidate } from "./model-fallback.types.js"; diff --git a/src/agents/model-fallback.ts b/src/agents/model-fallback.ts index 8bed547bb2d..f564281a54a 100644 --- a/src/agents/model-fallback.ts +++ b/src/agents/model-fallback.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, @@ -16,7 +17,6 @@ import { import { isCommandLaneTaskTimeoutError } from "../process/command-queue.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { isDefaultAgentRuntimeId } from "./agent-runtime-id.js"; import { normalizeOptionalAgentRuntimeId } from "./agent-runtime-id.js"; import { externalCliDiscoveryForProviders } from "./auth-profiles/external-cli-discovery.js"; diff --git a/src/agents/model-selection-shared.ts b/src/agents/model-selection-shared.ts index fc7afb5cb57..1779342d43b 100644 --- a/src/agents/model-selection-shared.ts +++ b/src/agents/model-selection-shared.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog, stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import { resolveAgentModelPrimaryValue } from "../config/model-input.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; @@ -8,7 +9,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { sanitizeForLog, stripAnsi } from "../terminal/ansi.js"; import { resolveConfiguredProviderFallback } from "./configured-provider-fallback.js"; import { DEFAULT_PROVIDER } from "./defaults.js"; import { findModelCatalogEntry } from "./model-catalog-lookup.js"; diff --git a/src/auto-reply/reply/agent-runner-execution.ts b/src/auto-reply/reply/agent-runner-execution.ts index 37890a5f8ae..187d76b78d6 100644 --- a/src/auto-reply/reply/agent-runner-execution.ts +++ b/src/auto-reply/reply/agent-runner-execution.ts @@ -3,6 +3,7 @@ import { hasOutboundReplyContent, resolveSendableOutboundReplyParts, } from "openclaw/plugin-sdk/reply-payload"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { clearAutoFallbackPrimaryProbeSelection, entryMatchesAutoFallbackPrimaryProbe, @@ -66,7 +67,6 @@ import { normalizeOptionalString, readStringValue, } from "../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { isMarkdownCapableMessageChannel, resolveMessageChannel, diff --git a/src/channels/plugins/read-only.ts b/src/channels/plugins/read-only.ts index 0bc4d07d62b..01ceaa200d0 100644 --- a/src/channels/plugins/read-only.ts +++ b/src/channels/plugins/read-only.ts @@ -1,6 +1,7 @@ import { createHash } from "node:crypto"; import path from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agents/agent-scope.js"; import { resolveRuntimeConfigCacheKey } from "../../config/runtime-snapshot.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; @@ -27,7 +28,6 @@ import { import { getActivePluginChannelRegistryVersion } from "../../plugins/runtime.js"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../routing/session-key.js"; import { sortUniqueStrings, uniqueStrings } from "../../shared/string-normalization.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { getBundledChannelSetupPlugin } from "./bundled.js"; import { isSafeManifestChannelId, diff --git a/src/cli/acp-cli.ts b/src/cli/acp-cli.ts index c0727d69339..4459fbcde31 100644 --- a/src/cli/acp-cli.ts +++ b/src/cli/acp-cli.ts @@ -1,11 +1,11 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { runAcpClientInteractive } from "../acp/client.js"; import { serveAcpGateway } from "../acp/server.js"; import { normalizeAcpProvenanceMode } from "../acp/types.js"; import { formatErrorMessage } from "../infra/errors.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { inheritOptionFromParent } from "./command-options.js"; import { resolveGatewayAuthOptions } from "./gateway-secret-options.js"; diff --git a/src/cli/banner.ts b/src/cli/banner.ts index d6a2edef8c5..81f1c9b5784 100644 --- a/src/cli/banner.ts +++ b/src/cli/banner.ts @@ -1,13 +1,13 @@ -import { resolveCommitHash } from "../infra/git-commit.js"; -import { visibleWidth } from "../terminal/ansi.js"; +import { visibleWidth } from "../../packages/terminal-core/src/ansi.js"; import { decorativeEmoji, decorativePrefix, stripDecorativeEmojiForTerminal, supportsDecorativeEmoji, type DecorativeEmojiOptions, -} from "../terminal/decorative-emoji.js"; -import { isRich, theme } from "../terminal/theme.js"; +} from "../../packages/terminal-core/src/decorative-emoji.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; +import { resolveCommitHash } from "../infra/git-commit.js"; import { hasRootVersionAlias } from "./argv.js"; import { parseTaglineMode, readCliBannerTaglineMode } from "./banner-config-lite.js"; import { pickTagline, type TaglineMode, type TaglineOptions } from "./tagline.js"; diff --git a/src/cli/capability-cli.ts b/src/cli/capability-cli.ts index 77baefa7031..d7ebc4628ab 100644 --- a/src/cli/capability-cli.ts +++ b/src/cli/capability-cli.ts @@ -9,6 +9,8 @@ import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES, } from "../../packages/gateway-protocol/src/client-info.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { resolveAgentDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { listProfilesForProvider, @@ -72,8 +74,6 @@ import { normalizeOptionalString, normalizeStringifiedOptionalString, } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { canonicalizeSpeechProviderId, listSpeechProviders } from "../tts/provider-registry.js"; import { getTtsProvider, diff --git a/src/cli/channel-auth.ts b/src/cli/channel-auth.ts index 39403bac70f..b32c97a2904 100644 --- a/src/cli/channel-auth.ts +++ b/src/cli/channel-auth.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { resolveChannelDefaultAccountId } from "../channels/plugins/helpers.js"; import { getChannelPlugin, @@ -13,7 +14,6 @@ import { formatErrorMessage } from "../infra/errors.js"; import { isBlockedObjectKey } from "../infra/prototype-keys.js"; import { defaultRuntime, type RuntimeEnv } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; import { formatCliCommand } from "./command-format.js"; import { formatUnsupportedChannelActionMessage } from "./error-format.js"; diff --git a/src/cli/channels-cli.ts b/src/cli/channels-cli.ts index f4a76f6e4f3..198d4df4d71 100644 --- a/src/cli/channels-cli.ts +++ b/src/cli/channels-cli.ts @@ -1,9 +1,9 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { danger } from "../globals.js"; import { defaultRuntime } from "../runtime.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { resolveCliArgvInvocation } from "./argv-invocation.js"; import { runChannelLogin, runChannelLogout } from "./channel-auth.js"; import { formatCliChannelOptions } from "./channel-options.js"; diff --git a/src/cli/clawbot-cli.ts b/src/cli/clawbot-cli.ts index fc49efb9c2a..82b9b3094a0 100644 --- a/src/cli/clawbot-cli.ts +++ b/src/cli/clawbot-cli.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { registerQrCli } from "./qr-cli.js"; export function registerClawbotCli(program: Command) { diff --git a/src/cli/completion-cli.ts b/src/cli/completion-cli.ts index de7a01c47d0..6389e029420 100644 --- a/src/cli/completion-cli.ts +++ b/src/cli/completion-cli.ts @@ -1,9 +1,9 @@ import fs from "node:fs/promises"; import path from "node:path"; import { Command, Option } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { routeLogsToStderr } from "../logging/console.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { buildFishOptionCompletionLine, buildFishSubcommandCompletionLine, diff --git a/src/cli/config-cli.ts b/src/cli/config-cli.ts index 16f4aee2929..5db5c0cf5e1 100644 --- a/src/cli/config-cli.ts +++ b/src/cli/config-cli.ts @@ -1,6 +1,8 @@ import fs from "node:fs"; import type { Command } from "commander"; import JSON5 from "json5"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { normalizeConfiguredProviderCatalogModelId } from "../agents/model-ref-shared.js"; import { type ConfigFileSnapshot, @@ -59,8 +61,6 @@ import { parseConfigPathArrayIndex } from "../shared/path-array-index.js"; import { isRecord as isPlainRecord } from "../shared/record-coerce.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeStringEntries, uniqueValues } from "../shared/string-normalization.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomePath } from "../utils.js"; import { formatCliCommand } from "./command-format.js"; import { formatPluginPackagingRuntimeOutputRecoveryHint } from "./config-recovery-hints.js"; diff --git a/src/cli/cron-cli/register.cron-add.ts b/src/cli/cron-cli/register.cron-add.ts index f120f398416..5b4fa4b7b33 100644 --- a/src/cli/cron-cli/register.cron-add.ts +++ b/src/cli/cron-cli/register.cron-add.ts @@ -1,4 +1,5 @@ import type { Command } from "commander"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import type { CronJob } from "../../cron/types.js"; import { sanitizeAgentId } from "../../routing/session-key.js"; import { defaultRuntime } from "../../runtime.js"; @@ -6,7 +7,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../../shared/string-coerce.js"; -import { theme } from "../../terminal/theme.js"; import type { GatewayRpcOpts } from "../gateway-rpc.js"; import { addGatewayClientOptions, callGatewayFromCli } from "../gateway-rpc.js"; import { parsePositiveIntOrUndefined } from "../program/helpers.js"; diff --git a/src/cli/cron-cli/register.ts b/src/cli/cron-cli/register.ts index 8660175a9e1..79b84169d53 100644 --- a/src/cli/cron-cli/register.ts +++ b/src/cli/cron-cli/register.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { applyParentDefaultHelpAction } from "../program/parent-default-help.js"; import { registerCronAddCommand, diff --git a/src/cli/cron-cli/shared.ts b/src/cli/cron-cli/shared.ts index de6bfc6ad77..951081e54c1 100644 --- a/src/cli/cron-cli/shared.ts +++ b/src/cli/cron-cli/shared.ts @@ -1,3 +1,4 @@ +import { colorize, isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import { listChannelPlugins } from "../../channels/plugins/index.js"; import { parseAbsoluteTimeMs } from "../../cron/parse.js"; import { resolveCronStaggerMs } from "../../cron/stagger.js"; @@ -13,7 +14,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../../shared/string-coerce.js"; -import { colorize, isRich, theme } from "../../terminal/theme.js"; import type { GatewayRpcOpts } from "../gateway-rpc.js"; import { callGatewayFromCli } from "../gateway-rpc.js"; diff --git a/src/cli/daemon-cli/lifecycle.ts b/src/cli/daemon-cli/lifecycle.ts index d92b6b7c041..4535eaa4873 100644 --- a/src/cli/daemon-cli/lifecycle.ts +++ b/src/cli/daemon-cli/lifecycle.ts @@ -1,3 +1,4 @@ +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { isRestartEnabled } from "../../config/commands.flags.js"; import { readBestEffortConfig, resolveGatewayPort } from "../../config/config.js"; import { resolveGatewayService } from "../../daemon/service.js"; @@ -12,7 +13,6 @@ import type { SafeGatewayRestartRequestResult } from "../../infra/restart-coordi import { type GatewayRestartIntent, writeGatewayRestartIntentSync } from "../../infra/restart.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { theme } from "../../terminal/theme.js"; import { formatCliCommand } from "../command-format.js"; import { parseDurationMs } from "../parse-duration.js"; import { recoverInstalledLaunchAgent } from "./launchd-recovery.js"; diff --git a/src/cli/daemon-cli/register.ts b/src/cli/daemon-cli/register.ts index d0162e23323..5eef3747cb2 100644 --- a/src/cli/daemon-cli/register.ts +++ b/src/cli/daemon-cli/register.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { addGatewayServiceCommands } from "./register-service-commands.js"; export function registerDaemonCli(program: Command) { diff --git a/src/cli/daemon-cli/shared.test.ts b/src/cli/daemon-cli/shared.test.ts index 21c655ae1ce..777365a67e9 100644 --- a/src/cli/daemon-cli/shared.test.ts +++ b/src/cli/daemon-cli/shared.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { theme } from "../../terminal/theme.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { filterContainerGenericHints, parsePortFromArgs, diff --git a/src/cli/daemon-cli/shared.ts b/src/cli/daemon-cli/shared.ts index 846a6490218..0c4f6e15212 100644 --- a/src/cli/daemon-cli/shared.ts +++ b/src/cli/daemon-cli/shared.ts @@ -1,3 +1,4 @@ +import { colorize, isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import { resolveIsNixMode } from "../../config/paths.js"; import { resolveGatewayLaunchAgentLabel, @@ -11,7 +12,6 @@ import { buildPlatformServiceStartHints, } from "../../daemon/runtime-hints.js"; import { parseInlineOptionToken } from "../../infra/inline-option-token.js"; -import { colorize, isRich, theme } from "../../terminal/theme.js"; import { formatCliCommand } from "../command-format.js"; import { parsePort } from "../shared/parse-port.js"; import { createDaemonActionContext } from "./response.js"; diff --git a/src/cli/daemon-cli/status.print.test.ts b/src/cli/daemon-cli/status.print.test.ts index aa13ba9ac26..53e8bfb19bd 100644 --- a/src/cli/daemon-cli/status.print.test.ts +++ b/src/cli/daemon-cli/status.print.test.ts @@ -16,9 +16,10 @@ vi.mock("../../runtime.js", () => ({ defaultRuntime: runtime, })); -vi.mock("../../terminal/theme.js", async () => { - const actual = - await vi.importActual("../../terminal/theme.js"); +vi.mock("../../../packages/terminal-core/src/theme.js", async () => { + const actual = await vi.importActual< + typeof import("../../../packages/terminal-core/src/theme.js") + >("../../../packages/terminal-core/src/theme.js"); return { ...actual, colorize: (_rich: boolean, _theme: unknown, text: string) => text, diff --git a/src/cli/daemon-cli/status.print.ts b/src/cli/daemon-cli/status.print.ts index d33e59abcc9..de2651ab4fd 100644 --- a/src/cli/daemon-cli/status.print.ts +++ b/src/cli/daemon-cli/status.print.ts @@ -1,3 +1,4 @@ +import { colorize } from "../../../packages/terminal-core/src/theme.js"; import { formatConfigIssueLine } from "../../config/issue-format.js"; import { resolveGatewayLaunchAgentLabel, @@ -17,7 +18,6 @@ import { resolveControlUiLinks } from "../../gateway/control-ui-links.js"; import { formatGatewayRestartHandoffDiagnostic } from "../../infra/restart-handoff.js"; import { isWSLEnv } from "../../infra/wsl.js"; import { defaultRuntime } from "../../runtime.js"; -import { colorize } from "../../terminal/theme.js"; import { shortenHomePath } from "../../utils.js"; import { formatCliCommand } from "../command-format.js"; import { diff --git a/src/cli/daemon-cli/status.test.ts b/src/cli/daemon-cli/status.test.ts index abab4096431..cad7fa849eb 100644 --- a/src/cli/daemon-cli/status.test.ts +++ b/src/cli/daemon-cli/status.test.ts @@ -25,7 +25,7 @@ vi.mock("../../runtime.js", () => ({ defaultRuntime, })); -vi.mock("../../terminal/theme.js", () => ({ +vi.mock("../../../packages/terminal-core/src/theme.js", () => ({ colorize: (_rich: boolean, _color: unknown, text: string) => text, isRich: () => false, theme: { error: "error" }, diff --git a/src/cli/daemon-cli/status.ts b/src/cli/daemon-cli/status.ts index cf510aa1e49..4b6a6363dd3 100644 --- a/src/cli/daemon-cli/status.ts +++ b/src/cli/daemon-cli/status.ts @@ -1,5 +1,5 @@ +import { colorize, isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import { defaultRuntime } from "../../runtime.js"; -import { colorize, isRich, theme } from "../../terminal/theme.js"; import { gatherDaemonStatus } from "./status.gather.js"; import { printDaemonStatus } from "./status.print.js"; import type { DaemonStatusOptions } from "./types.js"; diff --git a/src/cli/devices-cli.runtime.ts b/src/cli/devices-cli.runtime.ts index ad654399c2d..079fc24b588 100644 --- a/src/cli/devices-cli.runtime.ts +++ b/src/cli/devices-cli.runtime.ts @@ -6,6 +6,9 @@ import { readConnectPairingRequiredMessage, type ConnectPairingRequiredDetails, } from "../../packages/gateway-protocol/src/connect-error-details.js"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { buildGatewayConnectionDetails, callGateway, @@ -34,9 +37,6 @@ import { normalizeStringifiedOptionalString, } from "../shared/string-coerce.js"; import { uniqueStrings } from "../shared/string-normalization.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; import { parseTimeoutMsWithFallback } from "./parse-timeout.js"; import { withProgress } from "./progress.js"; diff --git a/src/cli/devices-cli.test.ts b/src/cli/devices-cli.test.ts index 7c6916ac0c8..110fe3abc90 100644 --- a/src/cli/devices-cli.test.ts +++ b/src/cli/devices-cli.test.ts @@ -1,6 +1,6 @@ import { Command } from "commander"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { stripAnsi } from "../terminal/ansi.js"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import { registerDevicesCli } from "./devices-cli.js"; const mocks = vi.hoisted(() => ({ diff --git a/src/cli/directory-cli.ts b/src/cli/directory-cli.ts index 650190e64d2..4fff9ef24c8 100644 --- a/src/cli/directory-cli.ts +++ b/src/cli/directory-cli.ts @@ -1,4 +1,7 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { resolveChannelDefaultAccountId } from "../channels/plugins/helpers.js"; import { getChannelPlugin } from "../channels/plugins/index.js"; import { resolveInstallableChannelPlugin } from "../commands/channel-setup/channel-plugin-resolution.js"; @@ -12,9 +15,6 @@ import { normalizeOptionalString, normalizeStringifiedOptionalString, } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { formatHelpExamples } from "./help-format.js"; import { commitConfigWithPendingPluginInstalls } from "./plugins-install-record-commit.js"; diff --git a/src/cli/dns-cli.ts b/src/cli/dns-cli.ts index 16635cddd05..511b8189de8 100644 --- a/src/cli/dns-cli.ts +++ b/src/cli/dns-cli.ts @@ -2,6 +2,9 @@ import { spawnSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import { pickPrimaryTailnetIPv4, pickPrimaryTailnetIPv6 } from "../infra/tailnet.js"; import { @@ -10,9 +13,6 @@ import { resolveWideAreaDiscoveryDomain, } from "../infra/widearea-dns.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; type RunOpts = { allowFailure?: boolean; inherit?: boolean }; diff --git a/src/cli/docs-cli.ts b/src/cli/docs-cli.ts index dc100908454..612ee1bbc15 100644 --- a/src/cli/docs-cli.ts +++ b/src/cli/docs-cli.ts @@ -1,8 +1,8 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { docsSearchCommand } from "../commands/docs.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { runCommandWithRuntime } from "./cli-utils.js"; export function registerDocsCli(program: Command) { diff --git a/src/cli/exec-approvals-cli.ts b/src/cli/exec-approvals-cli.ts index 4df0a64666e..dfca861a1a2 100644 --- a/src/cli/exec-approvals-cli.ts +++ b/src/cli/exec-approvals-cli.ts @@ -1,6 +1,10 @@ import fs from "node:fs/promises"; import type { Command } from "commander"; import JSON5 from "json5"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { readBestEffortConfig, type OpenClawConfig } from "../config/config.js"; import { formatErrorMessage } from "../infra/errors.js"; import { @@ -16,10 +20,6 @@ import { import { formatTimeAgo } from "../infra/format-time/format-relative.ts"; import { defaultRuntime } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { isRich, theme } from "../terminal/theme.js"; import { callGatewayFromCli } from "./gateway-rpc.js"; import { nodesCallOpts, resolveNodeId } from "./nodes-cli/rpc.js"; import type { NodesRpcOpts } from "./nodes-cli/types.js"; diff --git a/src/cli/exec-policy-cli.test.ts b/src/cli/exec-policy-cli.test.ts index 520782a85ec..e65ca41f547 100644 --- a/src/cli/exec-policy-cli.test.ts +++ b/src/cli/exec-policy-cli.test.ts @@ -1,9 +1,9 @@ import crypto from "node:crypto"; import { Command } from "commander"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../config/config.js"; import type { ExecApprovalsFile, ExecApprovalsSnapshot } from "../infra/exec-approvals.js"; -import { stripAnsi } from "../terminal/ansi.js"; import { registerExecPolicyCli } from "./exec-policy-cli.js"; function hashApprovalsFile(file: ExecApprovalsFile): string { diff --git a/src/cli/exec-policy-cli.ts b/src/cli/exec-policy-cli.ts index 250b5e417ec..02646cf0a0c 100644 --- a/src/cli/exec-policy-cli.ts +++ b/src/cli/exec-policy-cli.ts @@ -1,5 +1,9 @@ import crypto from "node:crypto"; import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { readConfigFileSnapshot, replaceConfigFile } from "../config/config.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { sanitizeExecApprovalDisplayText } from "../infra/exec-approval-command-display.js"; @@ -20,10 +24,6 @@ import { type ExecTarget, } from "../infra/exec-approvals.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { isRich, theme } from "../terminal/theme.js"; type ExecPolicyPresetName = "yolo" | "cautious" | "deny-all"; diff --git a/src/cli/gateway-cli/discover.ts b/src/cli/gateway-cli/discover.ts index ebefa219de9..60d32d8fb2d 100644 --- a/src/cli/gateway-cli/discover.ts +++ b/src/cli/gateway-cli/discover.ts @@ -1,6 +1,6 @@ +import { colorize, theme } from "../../../packages/terminal-core/src/theme.js"; import type { GatewayBonjourBeacon } from "../../infra/bonjour-discovery.js"; import { buildGatewayDiscoveryTarget } from "../../infra/gateway-discovery-targets.js"; -import { colorize, theme } from "../../terminal/theme.js"; import { parseTimeoutMsWithFallback } from "../parse-timeout.js"; export type GatewayDiscoverOpts = { diff --git a/src/cli/gateway-cli/register.option-collisions.test.ts b/src/cli/gateway-cli/register.option-collisions.test.ts index b531a257f29..372479dfc3e 100644 --- a/src/cli/gateway-cli/register.option-collisions.test.ts +++ b/src/cli/gateway-cli/register.option-collisions.test.ts @@ -83,15 +83,15 @@ vi.mock("../../infra/widearea-dns.js", () => ({ resolveWideAreaDiscoveryDomain: () => undefined, })); -vi.mock("../../terminal/health-style.js", () => ({ +vi.mock("../../../packages/terminal-core/src/health-style.js", () => ({ styleHealthChannelLine: (line: string) => line, })); -vi.mock("../../terminal/links.js", () => ({ +vi.mock("../../../packages/terminal-core/src/links.js", () => ({ formatDocsLink: () => "docs.openclaw.ai/cli/gateway", })); -vi.mock("../../terminal/theme.js", () => ({ +vi.mock("../../../packages/terminal-core/src/theme.js", () => ({ colorize: (_rich: boolean, _fn: (value: string) => string, value: string) => value, isRich: () => false, theme: { diff --git a/src/cli/gateway-cli/register.ts b/src/cli/gateway-cli/register.ts index ea32c827b82..29c749cc0ad 100644 --- a/src/cli/gateway-cli/register.ts +++ b/src/cli/gateway-cli/register.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { colorize, isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import type { HealthSummary } from "../../commands/health.js"; import { parseStrictPositiveInteger } from "../../infra/parse-finite-number.js"; import type { CostUsageSummary } from "../../infra/session-cost-usage.js"; @@ -13,8 +15,6 @@ import { import type { WriteDiagnosticSupportExportResult } from "../../logging/diagnostic-support-export.js"; import { defaultRuntime } from "../../runtime.js"; import { createLazyImportLoader } from "../../shared/lazy-promise.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { colorize, isRich, theme } from "../../terminal/theme.js"; import { inheritOptionFromParent } from "../command-options.js"; import { addGatewayServiceCommands } from "../daemon-cli/register-service-commands.js"; import { formatHelpExamples } from "../help-format.js"; @@ -34,7 +34,7 @@ const bonjourDiscoveryModuleLoader = createLazyImportLoader( ); const wideAreaDnsModuleLoader = createLazyImportLoader(() => import("../../infra/widearea-dns.js")); const healthStyleModuleLoader = createLazyImportLoader( - () => import("../../terminal/health-style.js"), + () => import("../../../packages/terminal-core/src/health-style.js"), ); const usageFormatModuleLoader = createLazyImportLoader(() => import("../../utils/usage-format.js")); const stabilityBundleModuleLoader = createLazyImportLoader( diff --git a/src/cli/help-format.ts b/src/cli/help-format.ts index 1be31d63d92..bb2b7238d2b 100644 --- a/src/cli/help-format.ts +++ b/src/cli/help-format.ts @@ -1,4 +1,4 @@ -import { theme } from "../terminal/theme.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; export type HelpExample = readonly [command: string, description: string]; diff --git a/src/cli/hooks-cli.ts b/src/cli/hooks-cli.ts index 3516b65a062..3e73e48ea3b 100644 --- a/src/cli/hooks-cli.ts +++ b/src/cli/hooks-cli.ts @@ -1,4 +1,11 @@ import type { Command } from "commander"; +import { + decorativeEmoji, + decorativePrefix, +} from "../../packages/terminal-core/src/decorative-emoji.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { getRuntimeConfig, readConfigFileSnapshot, replaceConfigFile } from "../config/config.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -13,10 +20,6 @@ import { loadWorkspaceHookEntries } from "../hooks/workspace.js"; import { formatErrorMessage } from "../infra/errors.js"; import { buildPluginDiagnosticsReport } from "../plugins/status.js"; import { defaultRuntime } from "../runtime.js"; -import { decorativeEmoji, decorativePrefix } from "../terminal/decorative-emoji.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomePath } from "../utils.js"; import { formatCliCommand } from "./command-format.js"; import { runNativeHookRelayCli, type NativeHookRelayCliOptions } from "./native-hook-relay-cli.js"; diff --git a/src/cli/logs-cli.ts b/src/cli/logs-cli.ts index df00f896ccb..0c142425175 100644 --- a/src/cli/logs-cli.ts +++ b/src/cli/logs-cli.ts @@ -5,6 +5,10 @@ import { GATEWAY_CLIENT_NAMES, } from "../../packages/gateway-protocol/src/client-info.js"; import { readConnectPairingRequiredMessage } from "../../packages/gateway-protocol/src/connect-error-details.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { clearActiveProgressLine } from "../../packages/terminal-core/src/progress-line.js"; +import { createSafeStreamWriter } from "../../packages/terminal-core/src/stream-writer.js"; +import { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { buildGatewayConnectionDetails, isGatewayTransportError, @@ -19,10 +23,6 @@ import { parseLogLine } from "../logging/parse-log-line.js"; import { redactSensitiveLines, resolveRedactOptions } from "../logging/redact.js"; import { formatTimestamp } from "../logging/timestamps.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { clearActiveProgressLine } from "../terminal/progress-line.js"; -import { createSafeStreamWriter } from "../terminal/stream-writer.js"; -import { colorize, isRich, theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; import { addGatewayClientOptions, callGatewayFromCli } from "./gateway-rpc.js"; diff --git a/src/cli/models-cli.ts b/src/cli/models-cli.ts index 6c7ace1a22c..dc8b2e21026 100644 --- a/src/cli/models-cli.ts +++ b/src/cli/models-cli.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; type ModelsCliRuntime = typeof import("./models-cli.runtime.js"); diff --git a/src/cli/node-cli/daemon.test.ts b/src/cli/node-cli/daemon.test.ts index aa06f7e98ae..86967f89a73 100644 --- a/src/cli/node-cli/daemon.test.ts +++ b/src/cli/node-cli/daemon.test.ts @@ -43,9 +43,10 @@ vi.mock("../../daemon/runtime-hints.js", () => ({ buildPlatformServiceStartHints: () => ["openclaw node install", "openclaw node start"], })); -vi.mock("../../terminal/theme.js", async () => { - const actual = - await vi.importActual("../../terminal/theme.js"); +vi.mock("../../../packages/terminal-core/src/theme.js", async () => { + const actual = await vi.importActual< + typeof import("../../../packages/terminal-core/src/theme.js") + >("../../../packages/terminal-core/src/theme.js"); return { ...actual, colorize: (_rich: boolean, _theme: unknown, text: string) => text, diff --git a/src/cli/node-cli/daemon.ts b/src/cli/node-cli/daemon.ts index 3be819d2ad5..436760cbc36 100644 --- a/src/cli/node-cli/daemon.ts +++ b/src/cli/node-cli/daemon.ts @@ -1,3 +1,4 @@ +import { colorize } from "../../../packages/terminal-core/src/theme.js"; import { buildNodeInstallPlan } from "../../commands/node-daemon-install-helpers.js"; import { DEFAULT_NODE_DAEMON_RUNTIME, @@ -17,7 +18,6 @@ import type { GatewayServiceRuntime } from "../../daemon/service-runtime.js"; import { loadNodeHostConfig } from "../../node-host/config.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { colorize } from "../../terminal/theme.js"; import { formatCliCommand } from "../command-format.js"; import { runServiceRestart, diff --git a/src/cli/node-cli/register.ts b/src/cli/node-cli/register.ts index a3d8caaf047..63716d1a85a 100644 --- a/src/cli/node-cli/register.ts +++ b/src/cli/node-cli/register.ts @@ -1,10 +1,10 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { loadNodeHostConfig } from "../../node-host/config.js"; import { runNodeHost } from "../../node-host/runner.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { parsePort } from "../daemon-cli/shared.js"; import { formatInvalidPortOption } from "../error-format.js"; import { formatHelpExamples } from "../help-format.js"; diff --git a/src/cli/nodes-cli/cli-utils.ts b/src/cli/nodes-cli/cli-utils.ts index 38d94985109..894babf0131 100644 --- a/src/cli/nodes-cli/cli-utils.ts +++ b/src/cli/nodes-cli/cli-utils.ts @@ -1,5 +1,5 @@ +import { isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import { defaultRuntime } from "../../runtime.js"; -import { isRich, theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { unauthorizedHintForMessage } from "./rpc.js"; diff --git a/src/cli/nodes-cli/pairing-render.ts b/src/cli/nodes-cli/pairing-render.ts index b74e0e99a75..65e0400dcea 100644 --- a/src/cli/nodes-cli/pairing-render.ts +++ b/src/cli/nodes-cli/pairing-render.ts @@ -1,6 +1,6 @@ +import { sanitizeTerminalText } from "../../../packages/terminal-core/src/safe-text.js"; +import { renderTable } from "../../../packages/terminal-core/src/table.js"; import { formatTimeAgo } from "../../infra/format-time/format-relative.ts"; -import { sanitizeTerminalText } from "../../terminal/safe-text.js"; -import { renderTable } from "../../terminal/table.js"; import type { PendingRequest } from "./types.js"; export function renderPendingPairingRequestsTable(params: { diff --git a/src/cli/nodes-cli/register.camera.ts b/src/cli/nodes-cli/register.camera.ts index 6734a562aac..a89b2078e08 100644 --- a/src/cli/nodes-cli/register.camera.ts +++ b/src/cli/nodes-cli/register.camera.ts @@ -1,10 +1,10 @@ import type { Command } from "commander"; +import { getTerminalTableWidth, renderTable } from "../../../packages/terminal-core/src/table.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../../shared/string-coerce.js"; -import { getTerminalTableWidth, renderTable } from "../../terminal/table.js"; import { shortenHomePath } from "../../utils.js"; import { type CameraFacing, diff --git a/src/cli/nodes-cli/register.pairing.ts b/src/cli/nodes-cli/register.pairing.ts index c9323823907..232efd744cc 100644 --- a/src/cli/nodes-cli/register.pairing.ts +++ b/src/cli/nodes-cli/register.pairing.ts @@ -1,9 +1,9 @@ import type { Command } from "commander"; +import { getTerminalTableWidth } from "../../../packages/terminal-core/src/table.js"; import type { OperatorScope } from "../../gateway/method-scopes.js"; import { resolveNodePairApprovalScopes } from "../../infra/node-pairing-authz.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { getTerminalTableWidth } from "../../terminal/table.js"; import { formatCliCommand } from "../command-format.js"; import { getNodesTheme, runNodesCommand } from "./cli-utils.js"; import { parsePairingList } from "./format.js"; diff --git a/src/cli/nodes-cli/register.status.ts b/src/cli/nodes-cli/register.status.ts index 8f2ec6ada99..f2fbd6bb59f 100644 --- a/src/cli/nodes-cli/register.status.ts +++ b/src/cli/nodes-cli/register.status.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { sanitizeTerminalText } from "../../../packages/terminal-core/src/safe-text.js"; +import { getTerminalTableWidth, renderTable } from "../../../packages/terminal-core/src/table.js"; import { formatErrorMessage } from "../../infra/errors.js"; import { formatTimeAgo } from "../../infra/format-time/format-relative.ts"; import { defaultRuntime } from "../../runtime.js"; @@ -7,8 +9,6 @@ import { normalizeOptionalLowercaseString, normalizeOptionalString, } from "../../shared/string-coerce.js"; -import { sanitizeTerminalText } from "../../terminal/safe-text.js"; -import { getTerminalTableWidth, renderTable } from "../../terminal/table.js"; import { shortenHomeInString } from "../../utils.js"; import { parseDurationMs } from "../parse-duration.js"; import { getNodesTheme, runNodesCommand } from "./cli-utils.js"; diff --git a/src/cli/nodes-cli/register.ts b/src/cli/nodes-cli/register.ts index c31eb635124..596728652d2 100644 --- a/src/cli/nodes-cli/register.ts +++ b/src/cli/nodes-cli/register.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { formatHelpExamples } from "../help-format.js"; import { withConsoleLogsRoutedToStderrForJson } from "../json-output-mode.js"; import { registerNodesCameraCommands } from "./register.camera.js"; diff --git a/src/cli/pairing-cli.test.ts b/src/cli/pairing-cli.test.ts index 05fa1c811a1..8b036ed0010 100644 --- a/src/cli/pairing-cli.test.ts +++ b/src/cli/pairing-cli.test.ts @@ -1,6 +1,6 @@ import { Command } from "commander"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { theme } from "../terminal/theme.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { registerPairingCli } from "./pairing-cli.js"; const mocks = vi.hoisted(() => ({ diff --git a/src/cli/pairing-cli.ts b/src/cli/pairing-cli.ts index ca49fc926a9..efaccf91b1b 100644 --- a/src/cli/pairing-cli.ts +++ b/src/cli/pairing-cli.ts @@ -1,4 +1,7 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { normalizeChannelId } from "../channels/plugins/index.js"; import { listPairingChannels, notifyPairingApproved } from "../channels/plugins/pairing.js"; import { @@ -18,9 +21,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeStringifiedOptionalString, } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; /** Parse channel, allowing extension channels not in core registry. */ diff --git a/src/cli/plugins-cli.runtime.ts b/src/cli/plugins-cli.runtime.ts index caa7a6b8a9e..db9c1680749 100644 --- a/src/cli/plugins-cli.runtime.ts +++ b/src/cli/plugins-cli.runtime.ts @@ -1,3 +1,5 @@ +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { collectConfiguredRuntimePluginIds, resolveConfiguredRuntimePluginInstallCandidate, @@ -11,8 +13,6 @@ import { import type { OpenClawConfig } from "../config/types.openclaw.js"; import { tracePluginLifecyclePhaseAsync } from "../plugins/plugin-lifecycle-trace.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomeInString } from "../utils.js"; import { formatMissingPluginMessage } from "./error-format.js"; import type { PluginMarketplaceListOptions, PluginRegistryOptions } from "./plugins-cli.js"; diff --git a/src/cli/plugins-cli.ts b/src/cli/plugins-cli.ts index 80d80d06c35..a58f3ec39d6 100644 --- a/src/cli/plugins-cli.ts +++ b/src/cli/plugins-cli.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import type { PluginInspectOptions } from "./plugins-inspect-command.js"; import type { PluginsListOptions } from "./plugins-list-command.js"; import { parseStrictPositiveIntOption } from "./program/helpers.js"; diff --git a/src/cli/plugins-command-helpers.ts b/src/cli/plugins-command-helpers.ts index 9ff9d372d73..f24c3d88063 100644 --- a/src/cli/plugins-command-helpers.ts +++ b/src/cli/plugins-command-helpers.ts @@ -1,3 +1,4 @@ +import { theme } from "../../packages/terminal-core/src/theme.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { PluginKind } from "../plugins/plugin-kind.types.js"; import { loadPluginMetadataSnapshot } from "../plugins/plugin-metadata-snapshot.js"; @@ -6,7 +7,6 @@ import { buildPluginDiagnosticsReport } from "../plugins/status.js"; import type { PluginLogger } from "../plugins/types.js"; import { defaultRuntime, type RuntimeEnv } from "../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { theme } from "../terminal/theme.js"; type HookInternalEntryLike = Record & { enabled?: boolean }; diff --git a/src/cli/plugins-inspect-command.ts b/src/cli/plugins-inspect-command.ts index a576450681a..a8eb1c59cb8 100644 --- a/src/cli/plugins-inspect-command.ts +++ b/src/cli/plugins-inspect-command.ts @@ -1,3 +1,5 @@ +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import type { PluginInstallRecord } from "../config/types.plugins.js"; import { @@ -5,8 +7,6 @@ import { tracePluginLifecyclePhaseAsync, } from "../plugins/plugin-lifecycle-trace.js"; import { defaultRuntime } from "../runtime.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomeInString, shortenHomePath } from "../utils.js"; import { formatMissingPluginMessage } from "./error-format.js"; import { quietPluginJsonLogger } from "./plugins-command-helpers.js"; diff --git a/src/cli/plugins-install-command.ts b/src/cli/plugins-install-command.ts index 890f51c08ee..27e9c77bcf3 100644 --- a/src/cli/plugins-install-command.ts +++ b/src/cli/plugins-install-command.ts @@ -1,4 +1,5 @@ import fs from "node:fs"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { collectChannelDoctorStaleConfigMutations } from "../commands/doctor/shared/channel-doctor.js"; import { assertConfigWriteAllowedInCurrentMode, readConfigFileSnapshot } from "../config/config.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -33,7 +34,6 @@ import { validateJsonSchemaValue } from "../plugins/schema-validator.js"; import { defaultRuntime, type RuntimeEnv } from "../runtime.js"; import { isRecord } from "../shared/record-coerce.js"; import { uniqueStrings } from "../shared/string-normalization.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomePath } from "../utils.js"; import { formatCliCommand } from "./command-format.js"; import { looksLikeLocalInstallSpec } from "./install-spec.js"; diff --git a/src/cli/plugins-install-persist.ts b/src/cli/plugins-install-persist.ts index efe7885e872..9680d623453 100644 --- a/src/cli/plugins-install-persist.ts +++ b/src/cli/plugins-install-persist.ts @@ -1,3 +1,4 @@ +import { theme } from "../../packages/terminal-core/src/theme.js"; import { replaceConfigFile } from "../config/config.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { PluginInstallRecord } from "../config/types.plugins.js"; @@ -18,7 +19,6 @@ import { type PluginUninstallDirectoryRemoval, } from "../plugins/uninstall.js"; import { defaultRuntime, type RuntimeEnv } from "../runtime.js"; -import { theme } from "../terminal/theme.js"; import { resolveUserPath, shortenHomePath } from "../utils.js"; import { applySlotSelectionForPlugin, diff --git a/src/cli/plugins-list-command.ts b/src/cli/plugins-list-command.ts index 7e7c51467e6..034b080cddb 100644 --- a/src/cli/plugins-list-command.ts +++ b/src/cli/plugins-list-command.ts @@ -1,8 +1,8 @@ +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import { formatPluginSourceForTable, resolvePluginSourceRoots } from "../plugins/source-display.js"; import { defaultRuntime, writeRuntimeJson, type RuntimeEnv } from "../runtime.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; import { quietPluginJsonLogger } from "./plugins-command-helpers.js"; import { formatPluginLine } from "./plugins-list-format.js"; diff --git a/src/cli/plugins-list-format.ts b/src/cli/plugins-list-format.ts index 47db9f9dbc8..82bb26f1f9d 100644 --- a/src/cli/plugins-list-format.ts +++ b/src/cli/plugins-list-format.ts @@ -1,6 +1,6 @@ +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import type { PluginRecord } from "../plugins/registry.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomeInString } from "../utils.js"; export function formatPluginLine(plugin: PluginRecord, verbose = false): string { diff --git a/src/cli/plugins-search-command.ts b/src/cli/plugins-search-command.ts index ab2277e0b14..c48aa971911 100644 --- a/src/cli/plugins-search-command.ts +++ b/src/cli/plugins-search-command.ts @@ -1,3 +1,4 @@ +import { theme } from "../../packages/terminal-core/src/theme.js"; import { searchClawHubPackages, type ClawHubPackageFamily, @@ -6,7 +7,6 @@ import { import { formatErrorMessage } from "../infra/errors.js"; import { defaultRuntime, writeRuntimeJson, type RuntimeEnv } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { theme } from "../terminal/theme.js"; export type PluginsSearchOptions = { json?: boolean; diff --git a/src/cli/plugins-uninstall-command.ts b/src/cli/plugins-uninstall-command.ts index 0efa3126aa2..bb7dd61ba09 100644 --- a/src/cli/plugins-uninstall-command.ts +++ b/src/cli/plugins-uninstall-command.ts @@ -1,5 +1,6 @@ import os from "node:os"; import path from "node:path"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { assertConfigWriteAllowedInCurrentMode, readConfigFileSnapshot } from "../config/config.js"; import { resolveStateDir } from "../config/paths.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -8,7 +9,6 @@ import { tracePluginLifecyclePhaseAsync, } from "../plugins/plugin-lifecycle-trace.js"; import { defaultRuntime, type RuntimeEnv } from "../runtime.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomePath } from "../utils.js"; export type PluginUninstallOptions = { diff --git a/src/cli/plugins-update-command.ts b/src/cli/plugins-update-command.ts index 4e3baae4ed1..398c77e7c24 100644 --- a/src/cli/plugins-update-command.ts +++ b/src/cli/plugins-update-command.ts @@ -1,3 +1,4 @@ +import { theme } from "../../packages/terminal-core/src/theme.js"; import { assertConfigWriteAllowedInCurrentMode, getRuntimeConfig, @@ -12,7 +13,6 @@ import { } from "../plugins/installed-plugin-index-records.js"; import { updateNpmInstalledPlugins } from "../plugins/update.js"; import { defaultRuntime } from "../runtime.js"; -import { theme } from "../terminal/theme.js"; import { commitPluginInstallRecordsWithConfig } from "./plugins-install-record-commit.js"; import { refreshPluginRegistryAfterConfigMutation } from "./plugins-registry-refresh.js"; import { logPluginUpdateOutcomes } from "./plugins-update-outcomes.js"; diff --git a/src/cli/plugins-update-outcomes.ts b/src/cli/plugins-update-outcomes.ts index 9cf057d25df..c134563cab4 100644 --- a/src/cli/plugins-update-outcomes.ts +++ b/src/cli/plugins-update-outcomes.ts @@ -1,4 +1,4 @@ -import { theme } from "../terminal/theme.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; type PluginUpdateCliOutcome = { status: string; diff --git a/src/cli/program/command-descriptor-utils.ts b/src/cli/program/command-descriptor-utils.ts index 7f7b0edad56..df420f66294 100644 --- a/src/cli/program/command-descriptor-utils.ts +++ b/src/cli/program/command-descriptor-utils.ts @@ -1,5 +1,5 @@ import type { Command } from "commander"; -import { sanitizeForLog } from "../../terminal/ansi.js"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import type { NamedCommandDescriptor } from "./command-group-descriptors.js"; export type CommandDescriptorLike = Pick; diff --git a/src/cli/program/config-guard.test.ts b/src/cli/program/config-guard.test.ts index 1f34cabfa95..527183ed909 100644 --- a/src/cli/program/config-guard.test.ts +++ b/src/cli/program/config-guard.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { note } from "../../terminal/note.js"; +import { note } from "../../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../command-format.js"; import { ensureConfigReady, testApi } from "./config-guard.js"; diff --git a/src/cli/program/config-guard.ts b/src/cli/program/config-guard.ts index f0a28f181b2..205f7ca64ac 100644 --- a/src/cli/program/config-guard.ts +++ b/src/cli/program/config-guard.ts @@ -1,11 +1,11 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import { withSuppressedNotes } from "../../../packages/terminal-core/src/note.js"; import { readConfigFileSnapshot, setRuntimeConfigSnapshot } from "../../config/config.js"; import { resolveLegacyStateDirs, resolveOAuthDir, resolveStateDir } from "../../config/paths.js"; import { resolveRequiredHomeDir } from "../../infra/home-dir.js"; import type { RuntimeEnv } from "../../runtime.js"; -import { withSuppressedNotes } from "../../terminal/note.js"; import { shouldMigrateStateFromPath } from "../argv.js"; const ALLOWED_INVALID_COMMANDS = new Set(["doctor", "logs", "health", "help", "status"]); @@ -215,7 +215,7 @@ export async function ensureConfigReady(params: { { isPluginPackagingRuntimeOutputInvalidConfigSnapshot }, { formatPluginPackagingRuntimeOutputRecoveryHint }, ] = await Promise.all([ - import("../../terminal/theme.js"), + import("../../../packages/terminal-core/src/theme.js"), import("../../utils.js"), import("../command-format.js"), import("../../config/recovery-policy.js"), diff --git a/src/cli/program/error-output.ts b/src/cli/program/error-output.ts index f4e96ab564b..a2b91b5817e 100644 --- a/src/cli/program/error-output.ts +++ b/src/cli/program/error-output.ts @@ -1,5 +1,5 @@ -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { getCommandPathWithRootOptions } from "../argv.js"; import { formatCliCommand } from "../command-format.js"; diff --git a/src/cli/program/help.test.ts b/src/cli/program/help.test.ts index de25ce04cd8..8f701bebe41 100644 --- a/src/cli/program/help.test.ts +++ b/src/cli/program/help.test.ts @@ -10,11 +10,11 @@ const formatDocsLinkMock = vi.hoisted(() => ); const resolveCommitHashMock = vi.hoisted(() => vi.fn<() => string | null>(() => "abc1234")); -vi.mock("../../terminal/links.js", () => ({ +vi.mock("../../../packages/terminal-core/src/links.js", () => ({ formatDocsLink: formatDocsLinkMock, })); -vi.mock("../../terminal/theme.js", () => ({ +vi.mock("../../../packages/terminal-core/src/theme.js", () => ({ isRich: () => false, theme: { heading: (s: string) => s, diff --git a/src/cli/program/help.ts b/src/cli/program/help.ts index 8d03f3a7d32..1afe1cbcb55 100644 --- a/src/cli/program/help.ts +++ b/src/cli/program/help.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import { resolveCommitHash } from "../../infra/git-commit.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { isRich, theme } from "../../terminal/theme.js"; import { escapeRegExp } from "../../utils.js"; import { isRootVersionInvocation } from "../argv.js"; import { formatCliBannerLine, hasEmittedCliBanner } from "../banner.js"; diff --git a/src/cli/program/register.agent.ts b/src/cli/program/register.agent.ts index bcac30699ec..0928892a927 100644 --- a/src/cli/program/register.agent.ts +++ b/src/cli/program/register.agent.ts @@ -1,8 +1,8 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { hasExplicitOptions } from "../command-options.js"; import { formatHelpExamples } from "../help-format.js"; diff --git a/src/cli/program/register.backup.ts b/src/cli/program/register.backup.ts index ff477f1453b..a70574450f1 100644 --- a/src/cli/program/register.backup.ts +++ b/src/cli/program/register.backup.ts @@ -1,9 +1,9 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { backupVerifyCommand } from "../../commands/backup-verify.js"; import { backupCreateCommand } from "../../commands/backup.js"; import { defaultRuntime } from "../../runtime.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { formatHelpExamples } from "../help-format.js"; diff --git a/src/cli/program/register.configure.ts b/src/cli/program/register.configure.ts index 860d5cf7e68..f3dabac6a6f 100644 --- a/src/cli/program/register.configure.ts +++ b/src/cli/program/register.configure.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { CONFIGURE_WIZARD_SECTIONS } from "../../commands/configure.shared.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; export function registerConfigureCommand(program: Command): void { diff --git a/src/cli/program/register.crestodian.ts b/src/cli/program/register.crestodian.ts index a008156a71d..34b2c2de770 100644 --- a/src/cli/program/register.crestodian.ts +++ b/src/cli/program/register.crestodian.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { runCrestodian } from "../../crestodian/crestodian.js"; import { defaultRuntime } from "../../runtime.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { formatHelpExamples } from "../help-format.js"; diff --git a/src/cli/program/register.maintenance.ts b/src/cli/program/register.maintenance.ts index 7e2859027d7..0cd049f5605 100644 --- a/src/cli/program/register.maintenance.ts +++ b/src/cli/program/register.maintenance.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { defaultRuntime } from "../../runtime.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; export function registerMaintenanceCommands(program: Command) { diff --git a/src/cli/program/register.message.ts b/src/cli/program/register.message.ts index 0c79f83be91..22f5277823d 100644 --- a/src/cli/program/register.message.ts +++ b/src/cli/program/register.message.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { formatHelpExamples } from "../help-format.js"; import type { ProgramContext } from "./context.js"; import { createMessageCliHelpers } from "./message/helpers.js"; diff --git a/src/cli/program/register.migrate.ts b/src/cli/program/register.migrate.ts index 73847ea24b8..accf1d1b733 100644 --- a/src/cli/program/register.migrate.ts +++ b/src/cli/program/register.migrate.ts @@ -1,4 +1,5 @@ import type { Command } from "commander"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { migrateApplyCommand, migrateDefaultCommand, @@ -6,7 +7,6 @@ import { migratePlanCommand, } from "../../commands/migrate.js"; import { defaultRuntime } from "../../runtime.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { formatHelpExamples } from "../help-format.js"; diff --git a/src/cli/program/register.onboard.ts b/src/cli/program/register.onboard.ts index 191170de31a..b4750fdfeb2 100644 --- a/src/cli/program/register.onboard.ts +++ b/src/cli/program/register.onboard.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { formatAuthChoiceChoicesForCli } from "../../commands/auth-choice-options.js"; import type { GatewayDaemonRuntime } from "../../commands/daemon-runtime.js"; import { CORE_ONBOARD_AUTH_FLAGS } from "../../commands/onboard-core-auth-flags.js"; @@ -12,8 +14,6 @@ import type { TailscaleMode, } from "../../commands/onboard-types.js"; import { resolveManifestProviderOnboardAuthFlags } from "../../plugins/provider-auth-choices.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { parsePort } from "../shared/parse-port.js"; diff --git a/src/cli/program/register.setup.ts b/src/cli/program/register.setup.ts index daf34c4fd2a..ca09c6ac12e 100644 --- a/src/cli/program/register.setup.ts +++ b/src/cli/program/register.setup.ts @@ -1,6 +1,6 @@ import type { Command } from "commander"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { hasExplicitOptions } from "../command-options.js"; diff --git a/src/cli/program/register.status-health-sessions.ts b/src/cli/program/register.status-health-sessions.ts index 841fe47cabf..ab4143d0ed5 100644 --- a/src/cli/program/register.status-health-sessions.ts +++ b/src/cli/program/register.status-health-sessions.ts @@ -1,8 +1,8 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { setVerbose } from "../../globals.js"; import { defaultRuntime } from "../../runtime.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { runCommandWithRuntime } from "../cli-utils.js"; import { formatHelpExamples } from "../help-format.js"; import { parsePositiveIntOrUndefined, parseStrictPositiveIntOrUndefined } from "./helpers.js"; diff --git a/src/cli/progress.ts b/src/cli/progress.ts index 9df04412b14..bc3389f5288 100644 --- a/src/cli/progress.ts +++ b/src/cli/progress.ts @@ -1,11 +1,14 @@ import { spinner } from "@clack/prompts"; -import { createOscProgressController, supportsOscProgress } from "../terminal/osc-progress.js"; +import { + createOscProgressController, + supportsOscProgress, +} from "../../packages/terminal-core/src/osc-progress.js"; import { clearActiveProgressLine, registerActiveProgressLine, unregisterActiveProgressLine, -} from "../terminal/progress-line.js"; -import { theme } from "../terminal/theme.js"; +} from "../../packages/terminal-core/src/progress-line.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; const DEFAULT_DELAY_MS = 0; let activeProgress = 0; diff --git a/src/cli/proxy-cli.runtime.test.ts b/src/cli/proxy-cli.runtime.test.ts index 65ea9f6ea5d..b280a65d0c9 100644 --- a/src/cli/proxy-cli.runtime.test.ts +++ b/src/cli/proxy-cli.runtime.test.ts @@ -378,7 +378,7 @@ describe("proxy cli runtime", () => { it("applies the terminal color theme when rich output is enabled", async () => { vi.resetModules(); - vi.doMock("../terminal/theme.js", () => ({ + vi.doMock("../../packages/terminal-core/src/theme.js", () => ({ colorize: (rich: boolean, color: (value: string) => string, value: string) => rich ? color(value) : value, isRich: () => true, @@ -400,7 +400,7 @@ describe("proxy cli runtime", () => { expect(output).toContain("Checks"); expect(output).toContain("✓"); } finally { - vi.doUnmock("../terminal/theme.js"); + vi.doUnmock("../../packages/terminal-core/src/theme.js"); } }); diff --git a/src/cli/proxy-cli.runtime.ts b/src/cli/proxy-cli.runtime.ts index 3e7dcc65cd4..62a03f4f31e 100644 --- a/src/cli/proxy-cli.runtime.ts +++ b/src/cli/proxy-cli.runtime.ts @@ -1,6 +1,7 @@ import { spawn } from "node:child_process"; import { randomUUID } from "node:crypto"; import process from "node:process"; +import { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import { runProxyValidation, @@ -19,7 +20,6 @@ import { getDebugProxyCaptureStore, } from "../proxy-capture/store.sqlite.js"; import type { CaptureQueryPreset } from "../proxy-capture/types.js"; -import { colorize, isRich, theme } from "../terminal/theme.js"; export async function runDebugProxyStartCommand(opts: { host?: string; port?: number }) { const settings = resolveDebugProxySettings(); diff --git a/src/cli/qr-cli.ts b/src/cli/qr-cli.ts index b7c7f1e1835..50b1cf84708 100644 --- a/src/cli/qr-cli.ts +++ b/src/cli/qr-cli.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { hasConfiguredSecretInput } from "../config/types.secrets.js"; @@ -8,8 +10,6 @@ import { renderQrTerminal } from "../media/qr-terminal.ts"; import { resolvePairingSetupFromConfig, encodePairingSetupCode } from "../pairing/setup-code.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { resolveCommandSecretRefsViaGateway } from "./command-secret-gateway.js"; import { getQrRemoteCommandSecretTargetIds } from "./command-secret-targets.js"; diff --git a/src/cli/run-main.exit.test.ts b/src/cli/run-main.exit.test.ts index 4c2a4928cd1..19e37ba813c 100644 --- a/src/cli/run-main.exit.test.ts +++ b/src/cli/run-main.exit.test.ts @@ -232,7 +232,7 @@ vi.mock("../plugins/manifest-command-aliases.runtime.js", () => ({ resolveManifestToolOwner: resolveManifestToolOwnerMock, })); -vi.mock("../terminal/restore.js", () => ({ +vi.mock("../../packages/terminal-core/src/restore.js", () => ({ restoreTerminalState: restoreTerminalStateMock, })); diff --git a/src/cli/run-main.ts b/src/cli/run-main.ts index 3df6f6c9fd4..a6281245528 100644 --- a/src/cli/run-main.ts +++ b/src/cli/run-main.ts @@ -771,7 +771,7 @@ export async function runCli(argv: string[] = process.argv) { import("./failure-output.js"), import("../infra/fatal-error-hooks.js"), import("../infra/unhandled-rejections.js"), - import("../terminal/restore.js"), + import("../../packages/terminal-core/src/restore.js"), ]), ); const program = await startupTrace.measure("build-program", () => buildProgram()); diff --git a/src/cli/sandbox-cli.ts b/src/cli/sandbox-cli.ts index 57b4d82ab8d..b22a56d3f99 100644 --- a/src/cli/sandbox-cli.ts +++ b/src/cli/sandbox-cli.ts @@ -1,9 +1,9 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { sandboxExplainCommand } from "../commands/sandbox-explain.js"; import { sandboxListCommand, sandboxRecreateCommand } from "../commands/sandbox.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { formatHelpExamples } from "./help-format.js"; // --- Types --- diff --git a/src/cli/secrets-cli.ts b/src/cli/secrets-cli.ts index 939bffa8259..2e529e4e052 100644 --- a/src/cli/secrets-cli.ts +++ b/src/cli/secrets-cli.ts @@ -1,10 +1,10 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { danger } from "../globals.js"; import { formatErrorMessage } from "../infra/errors.js"; import { defaultRuntime } from "../runtime.js"; import type { SecretsApplyPlan } from "../secrets/plan.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; import { formatGatewayCommandFailure } from "./error-format.js"; import { addGatewayClientOptions, callGatewayFromCli, type GatewayRpcOpts } from "./gateway-rpc.js"; diff --git a/src/cli/security-cli.ts b/src/cli/security-cli.ts index 0d22480bdf0..c4f36f1076f 100644 --- a/src/cli/security-cli.ts +++ b/src/cli/security-cli.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import type { GatewayAuthMode } from "../config/types.gateway.js"; import { defaultRuntime } from "../runtime.js"; @@ -8,8 +10,6 @@ import { normalizeOptionalLowercaseString, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { isRich, theme } from "../terminal/theme.js"; import { shortenHomeInString, shortenHomePath } from "../utils.js"; import { formatCliCommand } from "./command-format.js"; import { resolveCommandSecretRefsViaGateway } from "./command-secret-gateway.js"; diff --git a/src/cli/skills-cli.format.ts b/src/cli/skills-cli.format.ts index fca8e32b9da..2a23909b012 100644 --- a/src/cli/skills-cli.format.ts +++ b/src/cli/skills-cli.format.ts @@ -1,12 +1,15 @@ +import { sanitizeForLog, stripAnsi } from "../../packages/terminal-core/src/ansi.js"; +import { + decorativeEmoji, + decorativePrefix, +} from "../../packages/terminal-core/src/decorative-emoji.js"; +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { resolveSkillStatusEntry, type SkillStatusEntry, type SkillStatusReport, } from "../skills/discovery/status.js"; -import { sanitizeForLog, stripAnsi } from "../terminal/ansi.js"; -import { decorativeEmoji, decorativePrefix } from "../terminal/decorative-emoji.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { theme } from "../terminal/theme.js"; import { shortenHomePath } from "../utils.js"; import { formatCliCommand } from "./command-format.js"; diff --git a/src/cli/skills-cli.ts b/src/cli/skills-cli.ts index 36fb8c88a54..ec2fa528eca 100644 --- a/src/cli/skills-cli.ts +++ b/src/cli/skills-cli.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { resolveAgentIdByWorkspacePath, resolveAgentWorkspaceDir, @@ -23,8 +25,6 @@ import { installSkillFromSource, isSkillSourceInstallSpec, } from "../skills/lifecycle/source-install.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { CONFIG_DIR } from "../utils.js"; import { resolveOptionFromCommand } from "./cli-utils.js"; import { parseStrictPositiveIntOption } from "./program/helpers.js"; diff --git a/src/cli/system-cli.ts b/src/cli/system-cli.ts index bf8bd61cbd7..49dda5148bc 100644 --- a/src/cli/system-cli.ts +++ b/src/cli/system-cli.ts @@ -1,9 +1,9 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { danger } from "../globals.js"; import { defaultRuntime } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; import type { GatewayRpcOpts } from "./gateway-rpc.js"; import { addGatewayClientOptions, callGatewayFromCli } from "./gateway-rpc.js"; diff --git a/src/cli/tui-cli.ts b/src/cli/tui-cli.ts index 982e43fc2f5..902e161d988 100644 --- a/src/cli/tui-cli.ts +++ b/src/cli/tui-cli.ts @@ -1,8 +1,8 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { parseStrictPositiveInteger } from "../infra/parse-finite-number.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { parseTimeoutMs } from "./parse-timeout.js"; export function registerTuiCli(program: Command) { diff --git a/src/cli/update-cli.ts b/src/cli/update-cli.ts index 387165c9325..caa741d486a 100644 --- a/src/cli/update-cli.ts +++ b/src/cli/update-cli.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { defaultRuntime } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { inheritOptionFromParent } from "./command-options.js"; import { formatHelpExamples } from "./help-format.js"; import { diff --git a/src/cli/update-cli/progress.ts b/src/cli/update-cli/progress.ts index 2cb4186128f..00a6964ed53 100644 --- a/src/cli/update-cli/progress.ts +++ b/src/cli/update-cli/progress.ts @@ -1,4 +1,5 @@ import { spinner } from "@clack/prompts"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { formatDurationPrecise } from "../../infra/format-time/format-duration.ts"; import type { UpdateRunResult, @@ -7,7 +8,6 @@ import type { } from "../../infra/update-runner.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js"; -import { theme } from "../../terminal/theme.js"; import type { UpdateCommandOptions } from "./shared.js"; const STEP_LABELS: Record = { diff --git a/src/cli/update-cli/shared.ts b/src/cli/update-cli/shared.ts index b807771bb92..60a5605ec0a 100644 --- a/src/cli/update-cli/shared.ts +++ b/src/cli/update-cli/shared.ts @@ -2,6 +2,7 @@ import { spawnSync } from "node:child_process"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { resolveRequiredHomeDir } from "../../infra/home-dir.js"; import { resolveOpenClawPackageRoot } from "../../infra/openclaw-root.js"; import { readPackageName, readPackageVersion } from "../../infra/package-json.js"; @@ -22,7 +23,6 @@ import type { UpdateStepProgress, UpdateStepResult } from "../../infra/update-ru import { runCommandWithTimeout } from "../../process/exec.js"; import { defaultRuntime } from "../../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js"; -import { theme } from "../../terminal/theme.js"; import { pathExists } from "../../utils.js"; import { COMPLETION_SKIP_PLUGIN_COMMANDS_ENV } from "../completion-runtime.js"; diff --git a/src/cli/update-cli/status.ts b/src/cli/update-cli/status.ts index c31e5db4bd9..e79c2c91dbf 100644 --- a/src/cli/update-cli/status.ts +++ b/src/cli/update-cli/status.ts @@ -1,3 +1,5 @@ +import { getTerminalTableWidth, renderTable } from "../../../packages/terminal-core/src/table.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { formatUpdateAvailableHint, formatUpdateOneLiner, @@ -11,8 +13,6 @@ import { } from "../../infra/update-channels.js"; import { checkUpdateStatus } from "../../infra/update-check.js"; import { defaultRuntime } from "../../runtime.js"; -import { getTerminalTableWidth, renderTable } from "../../terminal/table.js"; -import { theme } from "../../terminal/theme.js"; import { VERSION } from "../../version.js"; import { parseTimeoutMsOrExit, resolveUpdateRoot, type UpdateStatusOptions } from "./shared.js"; diff --git a/src/cli/update-cli/update-command.ts b/src/cli/update-cli/update-command.ts index 24a4946e4d3..1cc0405162e 100644 --- a/src/cli/update-cli/update-command.ts +++ b/src/cli/update-cli/update-command.ts @@ -5,6 +5,8 @@ import os from "node:os"; import path from "node:path"; import { Writable } from "node:stream"; import { confirm, isCancel } from "@clack/prompts"; +import { stylePromptMessage } from "../../../packages/terminal-core/src/prompt-style.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { checkShellCompletionStatus, ensureCompletionCacheExists, @@ -99,8 +101,6 @@ import { runCommandWithTimeout } from "../../process/exec.js"; import { defaultRuntime } from "../../runtime.js"; import { isRecord } from "../../shared/record-coerce.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { stylePromptMessage } from "../../terminal/prompt-style.js"; -import { theme } from "../../terminal/theme.js"; import { resolveUserPath } from "../../utils.js"; import { VERSION } from "../../version.js"; import { replaceCliName, resolveCliName } from "../cli-name.js"; diff --git a/src/cli/update-cli/wizard.ts b/src/cli/update-cli/wizard.ts index d1de48f5c37..570f6dde8de 100644 --- a/src/cli/update-cli/wizard.ts +++ b/src/cli/update-cli/wizard.ts @@ -1,4 +1,7 @@ import { confirm, isCancel } from "@clack/prompts"; +import { selectStyled } from "../../../packages/terminal-core/src/prompt-select-styled.js"; +import { stylePromptMessage } from "../../../packages/terminal-core/src/prompt-style.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { readConfigFileSnapshot } from "../../config/config.js"; import { formatUpdateChannelLabel, @@ -7,9 +10,6 @@ import { } from "../../infra/update-channels.js"; import { checkUpdateStatus } from "../../infra/update-check.js"; import { defaultRuntime } from "../../runtime.js"; -import { selectStyled } from "../../terminal/prompt-select-styled.js"; -import { stylePromptMessage } from "../../terminal/prompt-style.js"; -import { theme } from "../../terminal/theme.js"; import { pathExists } from "../../utils.js"; import { isEmptyDir, diff --git a/src/cli/webhooks-cli.ts b/src/cli/webhooks-cli.ts index db146225dd0..01cad5d0a08 100644 --- a/src/cli/webhooks-cli.ts +++ b/src/cli/webhooks-cli.ts @@ -1,4 +1,6 @@ import type { Command } from "commander"; +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { danger } from "../globals.js"; import { type GmailRunOptions, @@ -19,8 +21,6 @@ import { import { parseStrictPositiveInteger } from "../infra/parse-finite-number.js"; import { defaultRuntime } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { theme } from "../terminal/theme.js"; import { formatCliCommand } from "./command-format.js"; export function registerWebhooksCli(program: Command) { diff --git a/src/commands/channels.list.test.ts b/src/commands/channels.list.test.ts index 9b58a8ec04e..e3e05033a37 100644 --- a/src/commands/channels.list.test.ts +++ b/src/commands/channels.list.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import type { ChannelPluginCatalogEntry } from "../channels/plugins/catalog.js"; import type { ChannelPlugin } from "../channels/plugins/types.plugin.js"; -import { stripAnsi } from "../terminal/ansi.js"; import { baseConfigSnapshot, createTestRuntime } from "./test-runtime-config-helpers.js"; const mocks = vi.hoisted(() => ({ diff --git a/src/commands/channels/capabilities.ts b/src/commands/channels/capabilities.ts index b74089474fe..c787bc06c15 100644 --- a/src/commands/channels/capabilities.ts +++ b/src/commands/channels/capabilities.ts @@ -1,3 +1,4 @@ +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { resolveChannelDefaultAccountId } from "../../channels/plugins/helpers.js"; import { createMessageActionDiscoveryContext, @@ -27,7 +28,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../../shared/string-coerce.js"; -import { theme } from "../../terminal/theme.js"; import { resolveInstallableChannelPlugin } from "../channel-setup/channel-plugin-resolution.js"; import { formatChannelAccountLabel, requireValidConfig } from "./shared.js"; diff --git a/src/commands/channels/list.ts b/src/commands/channels/list.ts index 4b870f4c321..940f9407fef 100644 --- a/src/commands/channels/list.ts +++ b/src/commands/channels/list.ts @@ -1,3 +1,5 @@ +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agents/agent-scope.js"; import type { ChannelPluginCatalogEntry } from "../../channels/plugins/catalog.js"; import { isChannelVisibleInConfiguredLists } from "../../channels/plugins/exposure.js"; @@ -13,8 +15,6 @@ import { import { callGateway } from "../../gateway/call.js"; import { resolveMissingOfficialExternalChannelPluginRepairHint } from "../../plugins/official-external-plugin-repair-hints.js"; import { defaultRuntime, type RuntimeEnv, writeRuntimeJson } from "../../runtime.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { isCatalogChannelInstalled } from "../channel-setup/discovery.js"; import { listTrustedChannelPluginCatalogEntries } from "../channel-setup/trusted-catalog.js"; import { formatChannelAccountLabel, requireValidConfig } from "./shared.js"; diff --git a/src/commands/channels/logs.ts b/src/commands/channels/logs.ts index debed8c23d3..6aedb8b6abf 100644 --- a/src/commands/channels/logs.ts +++ b/src/commands/channels/logs.ts @@ -1,4 +1,5 @@ import fs from "node:fs/promises"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { normalizeChannelId as normalizeBundledChannelId } from "../../channels/registry.js"; import { parseStrictPositiveInteger } from "../../infra/parse-finite-number.js"; import { getResolvedLoggerSettings } from "../../logging.js"; @@ -7,7 +8,6 @@ import { parseLogLine } from "../../logging/parse-log-line.js"; import { listManifestChannelContributionIds } from "../../plugins/manifest-contribution-ids.js"; import { defaultRuntime, type RuntimeEnv, writeRuntimeJson } from "../../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js"; -import { theme } from "../../terminal/theme.js"; export type ChannelsLogsOptions = { channel?: string; diff --git a/src/commands/channels/status-config-format.ts b/src/commands/channels/status-config-format.ts index 24ebb689aa3..167e6135677 100644 --- a/src/commands/channels/status-config-format.ts +++ b/src/commands/channels/status-config-format.ts @@ -1,3 +1,5 @@ +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { hasConfiguredUnavailableCredentialStatus, hasResolvedCredentialValue, @@ -15,8 +17,6 @@ import { type OfficialExternalPluginRepairHint, resolveMissingOfficialExternalChannelPluginRepairHint, } from "../../plugins/official-external-plugin-repair-hints.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { appendBaseUrlBit, appendEnabledConfiguredLinkedBits, diff --git a/src/commands/channels/status.ts b/src/commands/channels/status.ts index 907e302949d..f53441c11db 100644 --- a/src/commands/channels/status.ts +++ b/src/commands/channels/status.ts @@ -1,4 +1,6 @@ import { redactSensitiveUrlLikeString } from "@openclaw/net-policy/redact-sensitive-url"; +import { formatDocsLink } from "../../../packages/terminal-core/src/links.js"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { normalizeChannelId } from "../../channels/plugins/index.js"; import { resolveCommandConfigWithSecrets } from "../../cli/command-config-resolution.js"; import { formatCliCommand } from "../../cli/command-format.js"; @@ -12,8 +14,6 @@ import { formatErrorMessage } from "../../infra/errors.js"; import { formatTimeAgo } from "../../infra/format-time/format-relative.ts"; import { listConfiguredChannelIdsForReadOnlyScope } from "../../plugins/channel-plugin-ids.js"; import { defaultRuntime, type RuntimeEnv, writeRuntimeJson } from "../../runtime.js"; -import { formatDocsLink } from "../../terminal/links.js"; -import { theme } from "../../terminal/theme.js"; import { appendBaseUrlBit, appendEnabledConfiguredLinkedBits, diff --git a/src/commands/commitments.test.ts b/src/commands/commitments.test.ts index 6de68a7ab6c..8e7102d0263 100644 --- a/src/commands/commitments.test.ts +++ b/src/commands/commitments.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import type { CommitmentRecord } from "../commitments/types.js"; import type { OutputRuntimeEnv } from "../runtime.js"; -import { stripAnsi } from "../terminal/ansi.js"; import { commitmentsDismissCommand, commitmentsListCommand } from "./commitments.js"; const mocks = vi.hoisted(() => ({ diff --git a/src/commands/commitments.ts b/src/commands/commitments.ts index 2d72784190e..51b91764562 100644 --- a/src/commands/commitments.ts +++ b/src/commands/commitments.ts @@ -1,3 +1,5 @@ +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { formatCliCommand } from "../cli/command-format.js"; import { listCommitments, @@ -10,8 +12,6 @@ import { info } from "../globals.js"; import { type RuntimeEnv, writeRuntimeJson } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeStringEntries } from "../shared/string-normalization.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; -import { isRich, theme } from "../terminal/theme.js"; const STATUS_VALUES = new Set([ "pending", diff --git a/src/commands/configure.channels.test.ts b/src/commands/configure.channels.test.ts index 7eca8e003c3..6eae3cfeee4 100644 --- a/src/commands/configure.channels.test.ts +++ b/src/commands/configure.channels.test.ts @@ -14,7 +14,7 @@ vi.mock("../channels/chat-meta.js", () => ({ listChatChannels: () => chatChannels(), })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: (...args: unknown[]) => note(...args), })); diff --git a/src/commands/configure.channels.ts b/src/commands/configure.channels.ts index dd3deb063da..4001c38f673 100644 --- a/src/commands/configure.channels.ts +++ b/src/commands/configure.channels.ts @@ -1,11 +1,11 @@ +import { note } from "../../packages/terminal-core/src/note.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { listChatChannels } from "../channels/chat-meta.js"; import { formatCliCommand } from "../cli/command-format.js"; import { CONFIG_PATH } from "../config/config.js"; import { isBlockedObjectKey } from "../config/prototype-keys.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { shortenHomePath } from "../utils.js"; import { confirm, select } from "./configure.shared.js"; import { guardCancel } from "./onboard-helpers.js"; diff --git a/src/commands/configure.daemon.test.ts b/src/commands/configure.daemon.test.ts index b100a9451f0..bee374ec7ad 100644 --- a/src/commands/configure.daemon.test.ts +++ b/src/commands/configure.daemon.test.ts @@ -37,7 +37,7 @@ vi.mock("./daemon-install-helpers.js", () => ({ gatewayInstallErrorHint: vi.fn(() => "hint"), })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/configure.daemon.ts b/src/commands/configure.daemon.ts index 9a0e23bd7b0..4643b06120b 100644 --- a/src/commands/configure.daemon.ts +++ b/src/commands/configure.daemon.ts @@ -1,10 +1,10 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { withProgress } from "../cli/progress.js"; import { getRuntimeConfig } from "../config/config.js"; import { describeGatewayServiceRestart, resolveGatewayService } from "../daemon/service.js"; import { isNonFatalSystemdInstallProbeError } from "../daemon/systemd.js"; import { formatErrorMessage } from "../infra/errors.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import { confirm, select } from "./configure.shared.js"; import { buildGatewayInstallPlan, gatewayInstallErrorHint } from "./daemon-install-helpers.js"; import { diff --git a/src/commands/configure.gateway.test.ts b/src/commands/configure.gateway.test.ts index db4be2b0c2f..303af44b17e 100644 --- a/src/commands/configure.gateway.test.ts +++ b/src/commands/configure.gateway.test.ts @@ -27,7 +27,7 @@ vi.mock("./configure.shared.js", () => ({ confirm: mocks.confirm, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: mocks.note, })); diff --git a/src/commands/configure.gateway.ts b/src/commands/configure.gateway.ts index beea897bd75..cc9f8445895 100644 --- a/src/commands/configure.gateway.ts +++ b/src/commands/configure.gateway.ts @@ -1,4 +1,5 @@ import { validateIPv4AddressInput } from "@openclaw/net-policy/ipv4"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatPortRangeHint } from "../cli/error-format.js"; import { parsePort } from "../cli/shared/parse-port.js"; import { resolveGatewayPort } from "../config/config.js"; @@ -15,7 +16,6 @@ import type { RuntimeEnv } from "../runtime.js"; import { resolveDefaultSecretProviderAlias } from "../secrets/ref-contract.js"; import { normalizeOptionalString, readStringValue } from "../shared/string-coerce.js"; import { normalizeStringEntries } from "../shared/string-normalization.js"; -import { note } from "../terminal/note.js"; import { buildGatewayAuthConfig } from "./configure.gateway-auth.js"; import { confirm, select, text } from "./configure.shared.js"; import { diff --git a/src/commands/configure.shared.ts b/src/commands/configure.shared.ts index f33de5ab31b..59c91cfbe6b 100644 --- a/src/commands/configure.shared.ts +++ b/src/commands/configure.shared.ts @@ -5,8 +5,12 @@ import { select as clackSelect, text as clackText, } from "@clack/prompts"; +import { + stylePromptHint, + stylePromptMessage, + stylePromptTitle, +} from "../../packages/terminal-core/src/prompt-style.js"; import { normalizeStringEntries } from "../shared/string-normalization.js"; -import { stylePromptHint, stylePromptMessage, stylePromptTitle } from "../terminal/prompt-style.js"; export const CONFIGURE_WIZARD_SECTIONS = [ "workspace", diff --git a/src/commands/configure.wizard.test.ts b/src/commands/configure.wizard.test.ts index 6e75a6f1f94..aff2ed58723 100644 --- a/src/commands/configure.wizard.test.ts +++ b/src/commands/configure.wizard.test.ts @@ -63,7 +63,7 @@ vi.mock("../wizard/clack-prompter.js", () => ({ createClackPrompter: mocks.createClackPrompter, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: mocks.note, })); diff --git a/src/commands/configure.wizard.ts b/src/commands/configure.wizard.ts index a2359ad8f03..63f0436047a 100644 --- a/src/commands/configure.wizard.ts +++ b/src/commands/configure.wizard.ts @@ -1,6 +1,7 @@ import fsPromises from "node:fs/promises"; import nodePath from "node:path"; import { isDeepStrictEqual } from "node:util"; +import { note } from "../../packages/terminal-core/src/note.js"; import { describeCodexNativeWebSearch } from "../agents/codex-native-web-search.shared.js"; import { formatCliCommand } from "../cli/command-format.js"; import { formatPortRangeHint } from "../cli/error-format.js"; @@ -16,7 +17,6 @@ import type { RuntimeEnv } from "../runtime.js"; import { defaultRuntime } from "../runtime.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { isPlainObject, resolveUserPath } from "../utils.js"; import { createClackPrompter } from "../wizard/clack-prompter.js"; import { WizardCancelledError } from "../wizard/prompts.js"; diff --git a/src/commands/docs.test.ts b/src/commands/docs.test.ts index 809a86f0298..0ce1ba7c305 100644 --- a/src/commands/docs.test.ts +++ b/src/commands/docs.test.ts @@ -3,7 +3,7 @@ import type { RuntimeEnv } from "../runtime.js"; const fetchMock = vi.fn(); -vi.mock("../terminal/theme.js", () => ({ +vi.mock("../../packages/terminal-core/src/theme.js", () => ({ isRich: () => false, theme: { heading: (s: string) => s, @@ -13,7 +13,7 @@ vi.mock("../terminal/theme.js", () => ({ }, })); -vi.mock("../terminal/links.js", () => ({ +vi.mock("../../packages/terminal-core/src/links.js", () => ({ formatDocsLink: (path: string, label: string) => `${label}${path}`, })); diff --git a/src/commands/docs.ts b/src/commands/docs.ts index 8a86eb2797b..7051433296c 100644 --- a/src/commands/docs.ts +++ b/src/commands/docs.ts @@ -1,7 +1,7 @@ +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { RuntimeEnv } from "../runtime.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { isRich, theme } from "../terminal/theme.js"; const SEARCH_API = "https://docs.openclaw.ai/api/search"; const SEARCH_TIMEOUT_MS = 30_000; diff --git a/src/commands/doctor-auth-flat-profiles.ts b/src/commands/doctor-auth-flat-profiles.ts index f59ac3238a5..3aa74c95ef2 100644 --- a/src/commands/doctor-auth-flat-profiles.ts +++ b/src/commands/doctor-auth-flat-profiles.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentDir, resolveDefaultAgentDir, listAgentIds } from "../agents/agent-scope.js"; import { AUTH_STORE_VERSION } from "../agents/auth-profiles/constants.js"; import { resolveAuthStorePath } from "../agents/auth-profiles/paths.js"; @@ -15,7 +16,6 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; import { coerceSecretRef } from "../config/types.secrets.js"; import { loadJsonFile } from "../infra/json-file.js"; import { isRecord } from "../shared/record-coerce.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; diff --git a/src/commands/doctor-auth-legacy-oauth.ts b/src/commands/doctor-auth-legacy-oauth.ts index 22849357979..33d44acc42c 100644 --- a/src/commands/doctor-auth-legacy-oauth.ts +++ b/src/commands/doctor-auth-legacy-oauth.ts @@ -1,7 +1,7 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { repairOAuthProfileIdMismatch } from "../agents/auth-profiles/repair.js"; import { ensureAuthProfileStore } from "../agents/auth-profiles/store.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; async function loadProviderRuntime() { @@ -9,7 +9,7 @@ async function loadProviderRuntime() { } async function loadNoteRuntime() { - return import("../terminal/note.js"); + return import("../../packages/terminal-core/src/note.js"); } function hasConfigOAuthProfiles(cfg: OpenClawConfig): boolean { diff --git a/src/commands/doctor-auth-oauth-sidecar.ts b/src/commands/doctor-auth-oauth-sidecar.ts index 7a9f5855ed6..a0c4b15a584 100644 --- a/src/commands/doctor-auth-oauth-sidecar.ts +++ b/src/commands/doctor-auth-oauth-sidecar.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { listAgentIds, resolveAgentDir, resolveDefaultAgentDir } from "../agents/agent-scope.js"; import { AUTH_STORE_VERSION } from "../agents/auth-profiles/constants.js"; import { @@ -18,7 +19,6 @@ import { resolveOAuthDir, resolveStateDir } from "../config/paths.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { loadJsonFile, saveJsonFile } from "../infra/json-file.js"; import { isRecord } from "../shared/record-coerce.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; diff --git a/src/commands/doctor-auth.deprecated-cli-profiles.test.ts b/src/commands/doctor-auth.deprecated-cli-profiles.test.ts index 1eb38241d48..c470e14f8cb 100644 --- a/src/commands/doctor-auth.deprecated-cli-profiles.test.ts +++ b/src/commands/doctor-auth.deprecated-cli-profiles.test.ts @@ -26,7 +26,7 @@ vi.mock("../agents/auth-profiles/store.js", () => ({ ensureAuthProfileStore: () => authProfileStoreMock.store, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: vi.fn(), })); diff --git a/src/commands/doctor-auth.profile-health.test.ts b/src/commands/doctor-auth.profile-health.test.ts index 1f1e1d81a09..4105717e685 100644 --- a/src/commands/doctor-auth.profile-health.test.ts +++ b/src/commands/doctor-auth.profile-health.test.ts @@ -32,9 +32,9 @@ vi.mock("../agents/auth-profiles.js", () => ({ resolveProfileUnusableUntilForDisplay: authProfileMocks.resolveProfileUnusableUntilForDisplay, })); -vi.mock("../terminal/note.js", () => ({ note: vi.fn() })); +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: vi.fn() })); -import { note } from "../terminal/note.js"; +import { note } from "../../packages/terminal-core/src/note.js"; import { noteAuthProfileHealth } from "./doctor-auth.js"; const noteMock = vi.mocked(note); diff --git a/src/commands/doctor-auth.ts b/src/commands/doctor-auth.ts index 7a87b6b666d..bfaa94ec911 100644 --- a/src/commands/doctor-auth.ts +++ b/src/commands/doctor-auth.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { listAgentIds, resolveAgentDir, @@ -31,7 +32,6 @@ import { } from "../agents/auth-profiles/paths.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { formatErrorMessage } from "../infra/errors.js"; -import { note } from "../terminal/note.js"; import { isRecord } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; import { buildProviderAuthRecoveryHint } from "./provider-auth-guidance.js"; diff --git a/src/commands/doctor-bootstrap-size.test.ts b/src/commands/doctor-bootstrap-size.test.ts index 197babc6323..3e31801e1b7 100644 --- a/src/commands/doctor-bootstrap-size.test.ts +++ b/src/commands/doctor-bootstrap-size.test.ts @@ -8,7 +8,7 @@ const resolveBootstrapContextForRun = vi.hoisted(() => vi.fn()); const resolveBootstrapMaxChars = vi.hoisted(() => vi.fn(() => 20_000)); const resolveBootstrapTotalMaxChars = vi.hoisted(() => vi.fn(() => 150_000)); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-bootstrap-size.ts b/src/commands/doctor-bootstrap-size.ts index 6391707ef86..63f62d55c91 100644 --- a/src/commands/doctor-bootstrap-size.ts +++ b/src/commands/doctor-bootstrap-size.ts @@ -1,3 +1,4 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { buildBootstrapInjectionStats, @@ -9,7 +10,6 @@ import { resolveBootstrapTotalMaxChars, } from "../agents/embedded-agent-helpers.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; -import { note } from "../terminal/note.js"; function formatInt(value: number): string { return new Intl.NumberFormat("en-US").format(Math.max(0, Math.floor(value))); diff --git a/src/commands/doctor-browser.ts b/src/commands/doctor-browser.ts index 995c1cb1e40..4fd085b7f36 100644 --- a/src/commands/doctor-browser.ts +++ b/src/commands/doctor-browser.ts @@ -1,8 +1,8 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { loadBundledPluginPublicSurfaceModuleSync } from "../plugin-sdk/facade-loader.js"; -import { note } from "../terminal/note.js"; import { resolveConfigDir } from "../utils.js"; type BrowserDoctorDeps = { diff --git a/src/commands/doctor-claude-cli.ts b/src/commands/doctor-claude-cli.ts index eba6ba43cb8..2d04edb5786 100644 --- a/src/commands/doctor-claude-cli.ts +++ b/src/commands/doctor-claude-cli.ts @@ -1,4 +1,5 @@ import fs from "node:fs"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveModelAgentRuntimeMetadata } from "../agents/agent-runtime-metadata.js"; import { listAgentIds, @@ -23,7 +24,6 @@ import { normalizeOptionalString, resolvePrimaryStringValue, } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; const CLAUDE_CLI_PROVIDER = "claude-cli"; diff --git a/src/commands/doctor-command-owner.test.ts b/src/commands/doctor-command-owner.test.ts index 49602a39302..5d601ec3937 100644 --- a/src/commands/doctor-command-owner.test.ts +++ b/src/commands/doctor-command-owner.test.ts @@ -7,7 +7,7 @@ import { const note = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-command-owner.ts b/src/commands/doctor-command-owner.ts index 35759a355e1..b1202971f44 100644 --- a/src/commands/doctor-command-owner.ts +++ b/src/commands/doctor-command-owner.ts @@ -1,9 +1,9 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { PairingChannel } from "../pairing/pairing-store.types.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeStringEntries } from "../shared/string-normalization.js"; -import { note } from "../terminal/note.js"; function resolveConfiguredCommandOwners(cfg: OpenClawConfig): string[] { const owners = cfg.commands?.ownerAllowFrom; diff --git a/src/commands/doctor-completion.ts b/src/commands/doctor-completion.ts index aff789bf8cd..68f2dca3eeb 100644 --- a/src/commands/doctor-completion.ts +++ b/src/commands/doctor-completion.ts @@ -1,5 +1,6 @@ import { spawnSync } from "node:child_process"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveCliName } from "../cli/cli-name.js"; import { completionCacheExists, @@ -14,7 +15,6 @@ import { import type { HealthFinding, HealthRepairEffect } from "../flows/health-checks.js"; import { resolveOpenClawPackageRoot } from "../infra/openclaw-root.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; type CompletionShell = "zsh" | "bash" | "fish" | "powershell"; diff --git a/src/commands/doctor-config-analysis.ts b/src/commands/doctor-config-analysis.ts index 7c802c45155..d7f218139e9 100644 --- a/src/commands/doctor-config-analysis.ts +++ b/src/commands/doctor-config-analysis.ts @@ -1,11 +1,11 @@ import path from "node:path"; import type { ZodIssue } from "zod"; +import { note } from "../../packages/terminal-core/src/note.js"; import { CONFIG_PATH } from "../config/config.js"; import { resolveAgentModelFallbackValues } from "../config/model-input.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { OpenClawSchema } from "../config/zod-schema.js"; import { resolvePrimaryStringValue } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { isRecord } from "../utils.js"; type UnrecognizedKeysIssue = ZodIssue & { diff --git a/src/commands/doctor-config-audit-scrub.ts b/src/commands/doctor-config-audit-scrub.ts index b637a9c9ffa..9bb5707343c 100644 --- a/src/commands/doctor-config-audit-scrub.ts +++ b/src/commands/doctor-config-audit-scrub.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import os from "node:os"; +import { note } from "../../packages/terminal-core/src/note.js"; import { scrubConfigAuditLog } from "../config/io.audit.js"; -import { note } from "../terminal/note.js"; const NOTE_TITLE = "Config audit"; diff --git a/src/commands/doctor-config-flow.include-warning.test.ts b/src/commands/doctor-config-flow.include-warning.test.ts index 240e84b58ca..5be9d7b6ee3 100644 --- a/src/commands/doctor-config-flow.include-warning.test.ts +++ b/src/commands/doctor-config-flow.include-warning.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it, vi } from "vitest"; -import { note } from "../terminal/note.js"; +import { note } from "../../packages/terminal-core/src/note.js"; import { noteIncludeConfinementWarning } from "./doctor-config-analysis.js"; -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: vi.fn(), })); diff --git a/src/commands/doctor-config-flow.test.ts b/src/commands/doctor-config-flow.test.ts index e88329557e8..52a6e41d601 100644 --- a/src/commands/doctor-config-flow.test.ts +++ b/src/commands/doctor-config-flow.test.ts @@ -222,7 +222,7 @@ const legacyConfigMigrationForTest = vi.hoisted(() => { }; }); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: terminalNoteMock, })); diff --git a/src/commands/doctor-config-flow.ts b/src/commands/doctor-config-flow.ts index ee8daf600d0..fca20b5be28 100644 --- a/src/commands/doctor-config-flow.ts +++ b/src/commands/doctor-config-flow.ts @@ -1,9 +1,9 @@ import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import { CONFIG_PATH } from "../config/paths.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import { noteImplicitFallbackClobberWarnings, noteOpencodeProviderOverrides, diff --git a/src/commands/doctor-config-preflight.state-migration.test.ts b/src/commands/doctor-config-preflight.state-migration.test.ts index 19fae8811f7..bb06aeb3813 100644 --- a/src/commands/doctor-config-preflight.state-migration.test.ts +++ b/src/commands/doctor-config-preflight.state-migration.test.ts @@ -34,7 +34,7 @@ vi.mock("../config/io.js", () => ({ recoverConfigFromLastKnownGood: vi.fn(), })); -vi.mock("../terminal/note.js", () => ({ note })); +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note })); const { runDoctorConfigPreflight } = await import("./doctor-config-preflight.js"); diff --git a/src/commands/doctor-config-preflight.ts b/src/commands/doctor-config-preflight.ts index 79f606554b0..ed88bbca92b 100644 --- a/src/commands/doctor-config-preflight.ts +++ b/src/commands/doctor-config-preflight.ts @@ -1,5 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { readConfigFileSnapshot, recoverConfigFromJsonRootSuffix, @@ -9,7 +10,6 @@ import { formatConfigIssueLines } from "../config/issue-format.js"; import type { LegacyConfigIssue } from "../config/types.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { isTruthyEnvValue } from "../infra/env.js"; -import { note } from "../terminal/note.js"; import { resolveHomeDir } from "../utils.js"; import { noteIncludeConfinementWarning } from "./doctor-config-analysis.js"; import { findDoctorLegacyConfigIssues } from "./doctor/shared/legacy-config-issues.js"; diff --git a/src/commands/doctor-cron.test.ts b/src/commands/doctor-cron.test.ts index 340becc1fad..eeb5b0035b1 100644 --- a/src/commands/doctor-cron.test.ts +++ b/src/commands/doctor-cron.test.ts @@ -14,7 +14,7 @@ type TerminalNote = (message: string, title?: string) => void; const noteMock = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: noteMock, })); diff --git a/src/commands/doctor-cron.ts b/src/commands/doctor-cron.ts index a98afb02be5..4832a06f5e2 100644 --- a/src/commands/doctor-cron.ts +++ b/src/commands/doctor-cron.ts @@ -1,5 +1,6 @@ import { execFile } from "node:child_process"; import { promisify } from "node:util"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import { resolveAgentModelPrimaryValue } from "../config/model-input.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -15,7 +16,6 @@ import { normalizeOptionalLowercaseString, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import { countStaleDreamingJobs, diff --git a/src/commands/doctor-device-pairing.test.ts b/src/commands/doctor-device-pairing.test.ts index ec6adddd9f0..6f38337f3fe 100644 --- a/src/commands/doctor-device-pairing.test.ts +++ b/src/commands/doctor-device-pairing.test.ts @@ -22,7 +22,7 @@ vi.mock("../gateway/call.js", () => ({ callGateway: (...args: unknown[]) => callGatewayMock(...args), })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: (...args: unknown[]) => noteMock(...args), })); diff --git a/src/commands/doctor-device-pairing.ts b/src/commands/doctor-device-pairing.ts index 54ce2d99384..b1aa2359c89 100644 --- a/src/commands/doctor-device-pairing.ts +++ b/src/commands/doctor-device-pairing.ts @@ -1,4 +1,6 @@ import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { formatCliCommand } from "../cli/command-format.js"; import { resolveStateDir } from "../config/paths.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -16,8 +18,6 @@ import type { DeviceAuthStore } from "../shared/device-auth.js"; import { normalizeDeviceAuthScopes } from "../shared/device-auth.js"; import { roleScopesAllow } from "../shared/operator-scope-compat.js"; import { normalizeUniqueSingleOrTrimmedStringList } from "../shared/string-normalization.js"; -import { note } from "../terminal/note.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; type GatewayListedPairedDevice = Omit & { tokens?: DeviceAuthTokenSummary[]; diff --git a/src/commands/doctor-gateway-daemon-flow.test.ts b/src/commands/doctor-gateway-daemon-flow.test.ts index 705b1da3f17..28b95a1f343 100644 --- a/src/commands/doctor-gateway-daemon-flow.test.ts +++ b/src/commands/doctor-gateway-daemon-flow.test.ts @@ -109,7 +109,7 @@ vi.mock("../infra/wsl.js", () => ({ isWSL: vi.fn(async () => false), })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-gateway-daemon-flow.ts b/src/commands/doctor-gateway-daemon-flow.ts index 16f8f17650b..23b70b3332e 100644 --- a/src/commands/doctor-gateway-daemon-flow.ts +++ b/src/commands/doctor-gateway-daemon-flow.ts @@ -1,3 +1,4 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import { resolveGatewayPort } from "../config/config.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -28,7 +29,6 @@ import { } from "../infra/restart-handoff.js"; import { isWSL } from "../infra/wsl.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import { sleep } from "../utils.js"; import { buildGatewayInstallPlan, gatewayInstallErrorHint } from "./daemon-install-helpers.js"; import { diff --git a/src/commands/doctor-gateway-health.test.ts b/src/commands/doctor-gateway-health.test.ts index 4efa6711dd5..5a8d1a1e577 100644 --- a/src/commands/doctor-gateway-health.test.ts +++ b/src/commands/doctor-gateway-health.test.ts @@ -11,7 +11,7 @@ vi.mock("../gateway/call.js", () => ({ callGateway, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-gateway-health.ts b/src/commands/doctor-gateway-health.ts index 160aca96388..83f88608c42 100644 --- a/src/commands/doctor-gateway-health.ts +++ b/src/commands/doctor-gateway-health.ts @@ -1,10 +1,10 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { buildGatewayConnectionDetails, callGateway } from "../gateway/call.js"; import type { DoctorMemoryStatusPayload } from "../gateway/server-methods/doctor.js"; import { collectChannelStatusIssues } from "../infra/channels-status-issues.js"; import { formatErrorMessage } from "../infra/errors.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import { VERSION } from "../version.js"; import { formatHealthCheckFailure } from "./health-format.js"; import type { StatusSummary } from "./status.types.js"; diff --git a/src/commands/doctor-gateway-services.test.ts b/src/commands/doctor-gateway-services.test.ts index f3fd025c85c..36954c5ecc5 100644 --- a/src/commands/doctor-gateway-services.test.ts +++ b/src/commands/doctor-gateway-services.test.ts @@ -96,7 +96,7 @@ vi.mock("../daemon/systemd.js", () => ({ uninstallLegacySystemdUnits: mocks.uninstallLegacySystemdUnits, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: mocks.note, })); diff --git a/src/commands/doctor-gateway-services.ts b/src/commands/doctor-gateway-services.ts index 4b14020f10a..79b19fbe5b3 100644 --- a/src/commands/doctor-gateway-services.ts +++ b/src/commands/doctor-gateway-services.ts @@ -3,6 +3,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { promisify } from "node:util"; +import { note } from "../../packages/terminal-core/src/note.js"; import { replaceConfigFile, type OpenClawConfig } from "../config/config.js"; import { resolveGatewayPort, resolveIsNixMode } from "../config/paths.js"; import { resolveSecretInputRef } from "../config/types.secrets.js"; @@ -32,7 +33,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { buildGatewayInstallPlan } from "./daemon-install-helpers.js"; import { DEFAULT_GATEWAY_DAEMON_RUNTIME, type GatewayDaemonRuntime } from "./daemon-runtime.js"; import { resolveGatewayAuthTokenForService } from "./doctor-gateway-auth-token.js"; diff --git a/src/commands/doctor-heartbeat-main-session-repair.ts b/src/commands/doctor-heartbeat-main-session-repair.ts index a9c175e8c6e..2b39c660a8c 100644 --- a/src/commands/doctor-heartbeat-main-session-repair.ts +++ b/src/commands/doctor-heartbeat-main-session-repair.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import type { note } from "../../packages/terminal-core/src/note.js"; import { isHeartbeatOkResponse, isHeartbeatUserMessage } from "../auto-reply/heartbeat-filter.js"; import { formatSessionArchiveTimestamp } from "../config/sessions/artifacts.js"; import { resolveMainSessionKey } from "../config/sessions/main-session.js"; @@ -12,7 +13,6 @@ import type { SessionEntry } from "../config/sessions/types.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { parseAgentSessionKey } from "../sessions/session-key-utils.js"; import { asNullableObjectRecord } from "../shared/record-coerce.js"; -import type { note } from "../terminal/note.js"; type DoctorPrompterLike = { confirmRuntimeRepair: (params: { diff --git a/src/commands/doctor-heartbeat-template-repair.test.ts b/src/commands/doctor-heartbeat-template-repair.test.ts index 2462747edc9..bf0a3896ebd 100644 --- a/src/commands/doctor-heartbeat-template-repair.test.ts +++ b/src/commands/doctor-heartbeat-template-repair.test.ts @@ -11,7 +11,7 @@ const mocks = vi.hoisted(() => ({ note: vi.fn(), })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: mocks.note, })); diff --git a/src/commands/doctor-heartbeat-template-repair.ts b/src/commands/doctor-heartbeat-template-repair.ts index c1ba30f598d..35cbe938b31 100644 --- a/src/commands/doctor-heartbeat-template-repair.ts +++ b/src/commands/doctor-heartbeat-template-repair.ts @@ -1,12 +1,12 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { resolveWorkspaceTemplateDir } from "../agents/workspace-templates.js"; import { DEFAULT_HEARTBEAT_FILENAME } from "../agents/workspace.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { formatErrorMessage } from "../infra/errors.js"; import { writeTextAtomic } from "../infra/json-files.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; const LEGACY_HEARTBEAT_PROSE_TEMPLATE = [ diff --git a/src/commands/doctor-install.test.ts b/src/commands/doctor-install.test.ts index 3aee14c991b..8a1a67565ce 100644 --- a/src/commands/doctor-install.test.ts +++ b/src/commands/doctor-install.test.ts @@ -1,11 +1,11 @@ import fs from "node:fs/promises"; import path from "node:path"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import { note } from "../terminal/note.js"; +import { note } from "../../packages/terminal-core/src/note.js"; import { withTempDir } from "../test-helpers/temp-dir.js"; import { noteSourceInstallIssues } from "./doctor-install.js"; -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: vi.fn(), })); diff --git a/src/commands/doctor-install.ts b/src/commands/doctor-install.ts index c01b4edcd3b..86ff11e7b31 100644 --- a/src/commands/doctor-install.ts +++ b/src/commands/doctor-install.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; import path from "node:path"; -import { note } from "../terminal/note.js"; +import { note } from "../../packages/terminal-core/src/note.js"; export function noteSourceInstallIssues(root: string | null) { if (!root) { diff --git a/src/commands/doctor-memory-search.test.ts b/src/commands/doctor-memory-search.test.ts index de6d27ce068..3c57eda67c1 100644 --- a/src/commands/doctor-memory-search.test.ts +++ b/src/commands/doctor-memory-search.test.ts @@ -24,7 +24,7 @@ const repairShortTermPromotionArtifacts = vi.hoisted(() => vi.fn()); const noteWorkspaceMemoryHealth = vi.hoisted(() => vi.fn(async () => undefined)); const maybeRepairWorkspaceMemoryHealth = vi.hoisted(() => vi.fn(async () => undefined)); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-memory-search.ts b/src/commands/doctor-memory-search.ts index e92080da942..61d4232ba3f 100644 --- a/src/commands/doctor-memory-search.ts +++ b/src/commands/doctor-memory-search.ts @@ -1,4 +1,5 @@ import fsSync from "node:fs"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentDir, resolveAgentWorkspaceDir, @@ -37,7 +38,6 @@ import { import { defaultSlotIdForKey } from "../plugins/slots.js"; import { getProviderEnvVars } from "../secrets/provider-env-vars.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { resolveUserPath } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; import { maybeRepairWorkspaceMemoryHealth, noteWorkspaceMemoryHealth } from "./doctor-workspace.js"; diff --git a/src/commands/doctor-platform-notes.ts b/src/commands/doctor-platform-notes.ts index 93818c0901d..ead7a057eda 100644 --- a/src/commands/doctor-platform-notes.ts +++ b/src/commands/doctor-platform-notes.ts @@ -3,12 +3,12 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { promisify } from "node:util"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { hasConfiguredSecretInput } from "../config/types.secrets.js"; import { findStaleOpenClawUpdateLaunchdJobs } from "../daemon/launchd.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; const execFileAsync = promisify(execFile); diff --git a/src/commands/doctor-plugin-manifests.ts b/src/commands/doctor-plugin-manifests.ts index cd54209eafe..857b7e6489c 100644 --- a/src/commands/doctor-plugin-manifests.ts +++ b/src/commands/doctor-plugin-manifests.ts @@ -1,12 +1,12 @@ import fs from "node:fs"; import path from "node:path"; import { z } from "zod"; +import { note } from "../../packages/terminal-core/src/note.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { loadPluginManifestRegistry } from "../plugins/manifest-registry.js"; import type { RuntimeEnv } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeTrimmedStringList } from "../shared/string-normalization.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import { safeParseJsonWithSchema, safeParseWithSchema } from "../utils/zod-parse.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; diff --git a/src/commands/doctor-plugin-registry.test.ts b/src/commands/doctor-plugin-registry.test.ts index b5836e2e231..4d72fb5965a 100644 --- a/src/commands/doctor-plugin-registry.test.ts +++ b/src/commands/doctor-plugin-registry.test.ts @@ -1,6 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; +import { note } from "../../packages/terminal-core/src/note.js"; import type { PluginCandidate } from "../plugins/discovery.js"; import { resolvePluginNpmProjectDir } from "../plugins/install-paths.js"; import { @@ -9,11 +10,10 @@ import { } from "../plugins/installed-plugin-index-store.js"; import type { InstalledPluginIndex } from "../plugins/installed-plugin-index.js"; import { cleanupTrackedTempDirs, makeTrackedTempDir } from "../plugins/test-helpers/fs-fixtures.js"; -import { note } from "../terminal/note.js"; import { maybeRepairPluginRegistryState } from "./doctor-plugin-registry.js"; import { DISABLE_PLUGIN_REGISTRY_MIGRATION_ENV } from "./doctor/shared/plugin-registry-migration.js"; -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: vi.fn(), })); diff --git a/src/commands/doctor-plugin-registry.ts b/src/commands/doctor-plugin-registry.ts index 6600a49ea58..500b486322a 100644 --- a/src/commands/doctor-plugin-registry.ts +++ b/src/commands/doctor-plugin-registry.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { saveJsonFile } from "../infra/json-file.js"; @@ -22,7 +23,6 @@ import { type StaleLocalBundledPluginInstallRecord, } from "../plugins/stale-local-bundled-plugin-install-records.js"; import { isRecord } from "../shared/record-coerce.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; import { diff --git a/src/commands/doctor-prompter.ts b/src/commands/doctor-prompter.ts index 3c44ed9d9dc..a7ad4c03104 100644 --- a/src/commands/doctor-prompter.ts +++ b/src/commands/doctor-prompter.ts @@ -1,6 +1,9 @@ import { confirm, select } from "@clack/prompts"; +import { + stylePromptHint, + stylePromptMessage, +} from "../../packages/terminal-core/src/prompt-style.js"; import type { RuntimeEnv } from "../runtime.js"; -import { stylePromptHint, stylePromptMessage } from "../terminal/prompt-style.js"; import { resolveDoctorRepairMode, shouldAutoApproveDoctorFix, diff --git a/src/commands/doctor-sandbox.ts b/src/commands/doctor-sandbox.ts index 2b5359a4f34..de6f2e0a285 100644 --- a/src/commands/doctor-sandbox.ts +++ b/src/commands/doctor-sandbox.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { DEFAULT_SANDBOX_BROWSER_IMAGE, DEFAULT_SANDBOX_COMMON_IMAGE, @@ -17,7 +18,6 @@ import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { runCommandWithTimeout, runExec } from "../process/exec.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; diff --git a/src/commands/doctor-sandbox.warns-sandbox-enabled-without-docker.test.ts b/src/commands/doctor-sandbox.warns-sandbox-enabled-without-docker.test.ts index 1ab3ce3b3e2..3ff928b585a 100644 --- a/src/commands/doctor-sandbox.warns-sandbox-enabled-without-docker.test.ts +++ b/src/commands/doctor-sandbox.warns-sandbox-enabled-without-docker.test.ts @@ -26,7 +26,7 @@ vi.mock("../agents/sandbox/registry.js", () => ({ migrateLegacySandboxRegistryFiles, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-security.test.ts b/src/commands/doctor-security.test.ts index 3f8e84ede47..11ed51a1f8e 100644 --- a/src/commands/doctor-security.test.ts +++ b/src/commands/doctor-security.test.ts @@ -8,7 +8,7 @@ const note = vi.hoisted(() => vi.fn()); const pluginRegistry = vi.hoisted(() => ({ list: [] as unknown[] })); const listReadOnlyChannelPluginsForConfigMock = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-security.ts b/src/commands/doctor-security.ts index 0602a0c183f..302e3a24101 100644 --- a/src/commands/doctor-security.ts +++ b/src/commands/doctor-security.ts @@ -1,3 +1,4 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveDmAllowAuditState } from "../channels/message-access/dm-allow-state.js"; import { listReadOnlyChannelPluginsForConfig } from "../channels/plugins/read-only.js"; import type { ChannelId } from "../channels/plugins/types.public.js"; @@ -20,7 +21,6 @@ import { hasConfiguredPlaintextSecretValue } from "../secrets/secret-value.js"; import { discoverConfigSecretTargets } from "../secrets/target-registry.js"; import { collectExecFilesystemPolicyDriftHits } from "../security/exec-filesystem-policy.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import { resolveDefaultChannelAccountContext } from "./channel-account-context.js"; function collectImplicitHeartbeatDirectPolicyWarnings(cfg: OpenClawConfig): string[] { diff --git a/src/commands/doctor-session-locks.test.ts b/src/commands/doctor-session-locks.test.ts index c060a46f1ef..11049d1acc8 100644 --- a/src/commands/doctor-session-locks.test.ts +++ b/src/commands/doctor-session-locks.test.ts @@ -8,7 +8,7 @@ import { const note = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-session-locks.ts b/src/commands/doctor-session-locks.ts index 4db1ab5a52e..b9b3c4b49a9 100644 --- a/src/commands/doctor-session-locks.ts +++ b/src/commands/doctor-session-locks.ts @@ -1,3 +1,4 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentSessionDirs } from "../agents/session-dirs.js"; import { cleanStaleLockFiles, @@ -7,7 +8,6 @@ import { type SessionWriteLockAcquireTimeoutConfig, } from "../agents/session-write-lock.js"; import { resolveStateDir } from "../config/paths.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; function formatAge(ageMs: number | null): string { diff --git a/src/commands/doctor-session-snapshots.test.ts b/src/commands/doctor-session-snapshots.test.ts index 759c1be68c7..df841a8817e 100644 --- a/src/commands/doctor-session-snapshots.test.ts +++ b/src/commands/doctor-session-snapshots.test.ts @@ -8,7 +8,7 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; const note = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-session-snapshots.ts b/src/commands/doctor-session-snapshots.ts index bfbd13ebbb7..6b73d0f92f5 100644 --- a/src/commands/doctor-session-snapshots.ts +++ b/src/commands/doctor-session-snapshots.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveStateDir } from "../config/paths.js"; import { hydrateSessionStoreSkillPromptRefs } from "../config/sessions/skill-prompt-blobs.js"; import { resolveAllAgentSessionStoreTargetsSync } from "../config/sessions/targets.js"; @@ -8,7 +9,6 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; import { expandHomePrefix } from "../infra/home-dir.js"; import { isRecord } from "../shared/record-coerce.js"; import { resolveBundledSkillsDir } from "../skills/loading/bundled-dir.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; type SnapshotPathSource = diff --git a/src/commands/doctor-session-state-providers.ts b/src/commands/doctor-session-state-providers.ts index 38f1f7f9eb7..11dc70cda2f 100644 --- a/src/commands/doctor-session-state-providers.ts +++ b/src/commands/doctor-session-state-providers.ts @@ -1,3 +1,4 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentModelFallbacksOverride, resolveDefaultAgentId, @@ -18,7 +19,6 @@ import type { DoctorSessionRouteStateOwner } from "../plugins/doctor-session-rou import { parseAgentSessionKey } from "../sessions/session-key-utils.js"; import { normalizeOptionalString as normalizeString } from "../shared/string-coerce.js"; import { normalizeStringEntriesLower } from "../shared/string-normalization.js"; -import { note } from "../terminal/note.js"; type DoctorPrompterLike = { confirmRuntimeRepair: (params: { diff --git a/src/commands/doctor-session-transcripts.test.ts b/src/commands/doctor-session-transcripts.test.ts index 088e7e4a5d6..fd0880aef3e 100644 --- a/src/commands/doctor-session-transcripts.test.ts +++ b/src/commands/doctor-session-transcripts.test.ts @@ -5,7 +5,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const note = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-session-transcripts.ts b/src/commands/doctor-session-transcripts.ts index 2fb10f64019..dc55469433d 100644 --- a/src/commands/doctor-session-transcripts.ts +++ b/src/commands/doctor-session-transcripts.ts @@ -1,13 +1,13 @@ import type { Dirent } from "node:fs"; import fs from "node:fs/promises"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { hasInternalRuntimeContext, stripInternalRuntimeContext, } from "../agents/internal-runtime-context.js"; import { resolveAgentSessionDirs } from "../agents/session-dirs.js"; import { resolveStateDir } from "../config/paths.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; type TranscriptEntry = Record & { diff --git a/src/commands/doctor-skills.ts b/src/commands/doctor-skills.ts index 6a50c8cb8ac..693c7831162 100644 --- a/src/commands/doctor-skills.ts +++ b/src/commands/doctor-skills.ts @@ -1,4 +1,5 @@ import { existsSync } from "node:fs"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -10,7 +11,6 @@ import { type GhConfigDiscoveryInput, type GhConfigDiscoveryResult, } from "../skills/lifecycle/gh-config-discovery.js"; -import { note } from "../terminal/note.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; import { collectUnavailableAgentSkills, diff --git a/src/commands/doctor-state-integrity.ts b/src/commands/doctor-state-integrity.ts index 5439bc65084..dfddb908d12 100644 --- a/src/commands/doctor-state-integrity.ts +++ b/src/commands/doctor-state-integrity.ts @@ -1,6 +1,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { listAgentEntries, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { clearWedgedSubagentRecoveryAbort, @@ -32,7 +33,6 @@ import { parseAgentSessionKey } from "../sessions/session-key-utils.js"; import { asNullableObjectRecord } from "../shared/record-coerce.js"; import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js"; import { uniqueStrings } from "../shared/string-normalization.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import { repairHeartbeatPoisonedMainSession } from "./doctor-heartbeat-main-session-repair.js"; import { describeHeartbeatSessionTargetIssues } from "./doctor-heartbeat-session-target.js"; diff --git a/src/commands/doctor-ui.ts b/src/commands/doctor-ui.ts index 3aa8cb2a99d..544448959ab 100644 --- a/src/commands/doctor-ui.ts +++ b/src/commands/doctor-ui.ts @@ -1,5 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveControlUiDistIndexHealth, resolveControlUiDistIndexPathForRoot, @@ -7,7 +8,6 @@ import { import { resolveOpenClawPackageRoot } from "../infra/openclaw-root.js"; import { runCommandWithTimeout } from "../process/exec.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; export async function maybeRepairUiProtocolFreshness( diff --git a/src/commands/doctor-update.test.ts b/src/commands/doctor-update.test.ts index 197b4b0d60b..a4fded141a0 100644 --- a/src/commands/doctor-update.test.ts +++ b/src/commands/doctor-update.test.ts @@ -18,7 +18,7 @@ vi.mock("../infra/update-runner.js", () => ({ runGatewayUpdate: mocks.runGatewayUpdate, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: mocks.note, })); diff --git a/src/commands/doctor-update.ts b/src/commands/doctor-update.ts index c5125e2faf2..3e9f0969dd3 100644 --- a/src/commands/doctor-update.ts +++ b/src/commands/doctor-update.ts @@ -1,12 +1,12 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import { isTruthyEnvValue } from "../infra/env.js"; import { runGatewayUpdate } from "../infra/update-runner.js"; import { runCommandWithTimeout } from "../process/exec.js"; import type { RuntimeEnv } from "../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { note } from "../terminal/note.js"; import type { DoctorOptions } from "./doctor-prompter.js"; async function resolveComparablePath(target: string): Promise { diff --git a/src/commands/doctor-whatsapp-responsiveness.test.ts b/src/commands/doctor-whatsapp-responsiveness.test.ts index d02c6b783cd..5a2ff96947d 100644 --- a/src/commands/doctor-whatsapp-responsiveness.test.ts +++ b/src/commands/doctor-whatsapp-responsiveness.test.ts @@ -9,7 +9,7 @@ vi.mock("node:child_process", async () => { return mockNodeChildProcessSpawnSync(spawnSyncMock); }); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: noteMock, })); diff --git a/src/commands/doctor-whatsapp-responsiveness.ts b/src/commands/doctor-whatsapp-responsiveness.ts index 4e662dc1fcd..bea7c2d1f75 100644 --- a/src/commands/doctor-whatsapp-responsiveness.ts +++ b/src/commands/doctor-whatsapp-responsiveness.ts @@ -1,8 +1,8 @@ import { spawnSync } from "node:child_process"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; -import { note } from "../terminal/note.js"; import type { StatusSummary } from "./status.types.js"; export type LocalTuiProcess = { diff --git a/src/commands/doctor-workspace-status.test.ts b/src/commands/doctor-workspace-status.test.ts index 2f29b072165..efc11e10dd4 100644 --- a/src/commands/doctor-workspace-status.test.ts +++ b/src/commands/doctor-workspace-status.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from "vitest"; +import * as noteModule from "../../packages/terminal-core/src/note.js"; import { createPluginLoadResult, createPluginRecord, createTypedHook, } from "../plugins/status.test-helpers.js"; -import * as noteModule from "../terminal/note.js"; import { noteWorkspaceStatus } from "./doctor-workspace-status.js"; const mocks = vi.hoisted(() => ({ diff --git a/src/commands/doctor-workspace-status.ts b/src/commands/doctor-workspace-status.ts index 07284d61018..65b3fb51f94 100644 --- a/src/commands/doctor-workspace-status.ts +++ b/src/commands/doctor-workspace-status.ts @@ -1,3 +1,4 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -8,7 +9,6 @@ import { import { buildWorkspaceSkillStatus } from "../skills/discovery/status.js"; import { listTasksForFlowId } from "../tasks/runtime-internal.js"; import { listTaskFlowRecords } from "../tasks/task-flow-runtime-internal.js"; -import { note } from "../terminal/note.js"; import { detectLegacyWorkspaceDirs, formatLegacyWorkspaceWarning } from "./doctor-workspace.js"; function noteFlowRecoveryHints() { diff --git a/src/commands/doctor-workspace.test.ts b/src/commands/doctor-workspace.test.ts index 5ca6a21a465..a1de3d4232b 100644 --- a/src/commands/doctor-workspace.test.ts +++ b/src/commands/doctor-workspace.test.ts @@ -7,7 +7,7 @@ import type { DoctorPrompter } from "./doctor-prompter.js"; const note = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/doctor-workspace.ts b/src/commands/doctor-workspace.ts index 9f9744d638b..a79a76fc3fd 100644 --- a/src/commands/doctor-workspace.ts +++ b/src/commands/doctor-workspace.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { DEFAULT_AGENTS_FILENAME } from "../agents/workspace.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -11,7 +12,6 @@ import { resolveLegacyRootMemoryPath, resolveRootMemoryRepairDir, } from "../memory/root-memory-files.js"; -import { note } from "../terminal/note.js"; import { shortenHomePath } from "../utils.js"; import type { DoctorPrompter } from "./doctor-prompter.js"; diff --git a/src/commands/doctor.note-test-helpers.ts b/src/commands/doctor.note-test-helpers.ts index fbc4e00a436..10933dc7fef 100644 --- a/src/commands/doctor.note-test-helpers.ts +++ b/src/commands/doctor.note-test-helpers.ts @@ -3,13 +3,13 @@ import { vi } from "vitest"; export const terminalNoteMock: Mock<(...args: unknown[]) => unknown> = vi.fn(); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: (...args: unknown[]) => terminalNoteMock(...args), })); export async function loadDoctorCommandForTest(params?: { unmockModules?: string[] }) { vi.resetModules(); - vi.doMock("../terminal/note.js", () => ({ + vi.doMock("../../packages/terminal-core/src/note.js", () => ({ note: (...args: unknown[]) => terminalNoteMock(...args), })); for (const modulePath of params?.unmockModules ?? []) { diff --git a/src/commands/doctor/emit-notes.ts b/src/commands/doctor/emit-notes.ts index 7efae8e3186..cdf3ebb6432 100644 --- a/src/commands/doctor/emit-notes.ts +++ b/src/commands/doctor/emit-notes.ts @@ -1,4 +1,4 @@ -import { sanitizeForLog } from "../../terminal/ansi.js"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; export function sanitizeDoctorNote(note: string): string { return note diff --git a/src/commands/doctor/repair-sequencing.ts b/src/commands/doctor/repair-sequencing.ts index 70285f60a85..28a9be4bb9a 100644 --- a/src/commands/doctor/repair-sequencing.ts +++ b/src/commands/doctor/repair-sequencing.ts @@ -1,5 +1,5 @@ +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { applyPluginAutoEnable } from "../../config/plugin-auto-enable.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { maybeRepairLegacyOAuthSidecarProfiles } from "../doctor-auth-oauth-sidecar.js"; import { maybeRepairManagedNpmOpenClawPeerLinks, diff --git a/src/commands/doctor/shared/active-tool-schema-warnings.ts b/src/commands/doctor/shared/active-tool-schema-warnings.ts index 825ea6b83d3..46751c8b7ea 100644 --- a/src/commands/doctor/shared/active-tool-schema-warnings.ts +++ b/src/commands/doctor/shared/active-tool-schema-warnings.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import { listAgentIds, resolveAgentConfig, @@ -19,7 +20,6 @@ import { formatErrorMessage } from "../../../infra/errors.js"; import { extractModelCompat } from "../../../plugins/provider-model-compat.js"; import type { ProviderRuntimeModel } from "../../../plugins/provider-runtime-model.types.js"; import { getPluginToolMeta } from "../../../plugins/tools.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; function resolvePrimaryModelRef( cfg: OpenClawConfig, diff --git a/src/commands/doctor/shared/bundled-plugin-load-paths.ts b/src/commands/doctor/shared/bundled-plugin-load-paths.ts index f09201e246b..9a6e3c53b32 100644 --- a/src/commands/doctor/shared/bundled-plugin-load-paths.ts +++ b/src/commands/doctor/shared/bundled-plugin-load-paths.ts @@ -1,4 +1,5 @@ import path from "node:path"; +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../../agents/agent-scope.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { @@ -8,7 +9,6 @@ import { parsePackagedBundledPluginPath, } from "../../../plugins/bundled-load-path-aliases.js"; import { resolveBundledPluginSources } from "../../../plugins/bundled-sources.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { resolveUserPath } from "../../../utils.js"; import { asObjectRecord } from "./object.js"; diff --git a/src/commands/doctor/shared/channel-plugin-blockers.ts b/src/commands/doctor/shared/channel-plugin-blockers.ts index c7279dae62f..1b3ee4e2956 100644 --- a/src/commands/doctor/shared/channel-plugin-blockers.ts +++ b/src/commands/doctor/shared/channel-plugin-blockers.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { listExplicitConfiguredChannelIdsForConfig, @@ -9,7 +10,6 @@ import { } from "../../../plugins/config-state.js"; import { loadPluginManifestRegistryForPluginRegistry } from "../../../plugins/plugin-registry.js"; import { normalizeOptionalLowercaseString } from "../../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; export type ChannelPluginBlockerHit = { channelId: string; diff --git a/src/commands/doctor/shared/exec-safe-bins.ts b/src/commands/doctor/shared/exec-safe-bins.ts index 87c2f9bca0d..24d70b053e0 100644 --- a/src/commands/doctor/shared/exec-safe-bins.ts +++ b/src/commands/doctor/shared/exec-safe-bins.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { resolveCommandResolutionFromArgv } from "../../../infra/exec-command-resolution.js"; import { @@ -11,7 +12,6 @@ import { normalizeTrustedSafeBinDirs, } from "../../../infra/exec-safe-bin-trust.js"; import { normalizeOptionalLowercaseString } from "../../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { asObjectRecord } from "./object.js"; export type ExecSafeBinCoverageHit = { diff --git a/src/commands/doctor/shared/invalid-plugin-config.ts b/src/commands/doctor/shared/invalid-plugin-config.ts index cfcfcb52cc9..cf989b770ae 100644 --- a/src/commands/doctor/shared/invalid-plugin-config.ts +++ b/src/commands/doctor/shared/invalid-plugin-config.ts @@ -1,6 +1,6 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { validateConfigObjectWithPlugins } from "../../../config/validation.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { asObjectRecord } from "./object.js"; type InvalidPluginConfigHit = { diff --git a/src/commands/doctor/shared/legacy-config-core-normalizers.ts b/src/commands/doctor/shared/legacy-config-core-normalizers.ts index b904e1739c1..12cbe089b98 100644 --- a/src/commands/doctor/shared/legacy-config-core-normalizers.ts +++ b/src/commands/doctor/shared/legacy-config-core-normalizers.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import { normalizeProviderId } from "../../../agents/provider-id.js"; import { resolveSingleAccountKeysToMove } from "../../../channels/plugins/setup-promotion-helpers.js"; import { resolveNormalizedProviderModelMaxTokens } from "../../../config/defaults.js"; @@ -8,7 +9,6 @@ import { normalizeOptionalLowercaseString, normalizeOptionalString, } from "../../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { hasOwnKey, isRecord } from "./legacy-config-record-shared.js"; import { isLegacyModelsAddCodexMetadataModel } from "./legacy-models-add-metadata.js"; import { diff --git a/src/commands/doctor/shared/legacy-tools-by-sender.ts b/src/commands/doctor/shared/legacy-tools-by-sender.ts index 470e6fc80ad..04850c7795a 100644 --- a/src/commands/doctor/shared/legacy-tools-by-sender.ts +++ b/src/commands/doctor/shared/legacy-tools-by-sender.ts @@ -1,6 +1,6 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { parseToolsBySenderTypedKey } from "../../../config/types.tools.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { formatConfigPath, resolveConfigPathTarget } from "../../doctor-config-analysis.js"; import { asObjectRecord } from "./object.js"; diff --git a/src/commands/doctor/shared/open-policy-allowfrom.ts b/src/commands/doctor/shared/open-policy-allowfrom.ts index 3fe1d560231..5c1fc765f55 100644 --- a/src/commands/doctor/shared/open-policy-allowfrom.ts +++ b/src/commands/doctor/shared/open-policy-allowfrom.ts @@ -1,6 +1,6 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import { ensureOpenDmPolicyAllowFromWildcard } from "../../../channels/plugins/dm-access.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { resolveAllowFromMode, type AllowFromMode } from "./allow-from-mode.js"; import { asObjectRecord } from "./object.js"; diff --git a/src/commands/doctor/shared/plugin-runtime-symlinks.ts b/src/commands/doctor/shared/plugin-runtime-symlinks.ts index f9dae19b0ea..a9925c69a47 100644 --- a/src/commands/doctor/shared/plugin-runtime-symlinks.ts +++ b/src/commands/doctor/shared/plugin-runtime-symlinks.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { note } from "../../../../packages/terminal-core/src/note.js"; import { sortUniqueStrings } from "../../../shared/string-normalization.js"; -import { note } from "../../../terminal/note.js"; import { shortenHomePath } from "../../../utils.js"; const PLUGIN_RUNTIME_DEPS_MARKER = "plugin-runtime-deps"; diff --git a/src/commands/doctor/shared/preview-warnings.ts b/src/commands/doctor/shared/preview-warnings.ts index f591c0c6dbd..caf16972888 100644 --- a/src/commands/doctor/shared/preview-warnings.ts +++ b/src/commands/doctor/shared/preview-warnings.ts @@ -899,7 +899,7 @@ export async function collectDoctorPreviewNotes(params: { ), ); if (emptyAllowlistWarnings.length > 0) { - const { sanitizeForLog } = await import("../../../terminal/ansi.js"); + const { sanitizeForLog } = await import("../../../../packages/terminal-core/src/ansi.js"); warnings.push(emptyAllowlistWarnings.map((line) => sanitizeForLog(line)).join("\n")); } } diff --git a/src/commands/doctor/shared/stale-plugin-config.ts b/src/commands/doctor/shared/stale-plugin-config.ts index 29cc30b6d92..37667fc4672 100644 --- a/src/commands/doctor/shared/stale-plugin-config.ts +++ b/src/commands/doctor/shared/stale-plugin-config.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../../agents/agent-scope.js"; import { CHANNEL_IDS } from "../../../channels/ids.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; @@ -5,7 +6,6 @@ import { normalizePluginId } from "../../../plugins/config-state.js"; import { loadInstalledPluginIndexInstallRecordsSync } from "../../../plugins/installed-plugin-index-records.js"; import { loadManifestMetadataSnapshot } from "../../../plugins/manifest-contract-eligibility.js"; import { defaultSlotIdForKey, type PluginSlotKey } from "../../../plugins/slots.js"; -import { sanitizeForLog } from "../../../terminal/ansi.js"; import { asObjectRecord } from "./object.js"; const CHANNEL_CONFIG_META_KEYS = new Set(["defaults", "modelByChannel"]); diff --git a/src/commands/flows.ts b/src/commands/flows.ts index 143813adcb6..879da5983ef 100644 --- a/src/commands/flows.ts +++ b/src/commands/flows.ts @@ -1,3 +1,5 @@ +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { formatCliCommand } from "../cli/command-format.js"; import { getRuntimeConfig } from "../config/config.js"; import { info } from "../globals.js"; @@ -11,8 +13,6 @@ import { listTaskFlowRecords, resolveTaskFlowForLookupToken, } from "../tasks/task-flow-runtime-internal.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; -import { isRich, theme } from "../terminal/theme.js"; const ID_PAD = 10; const STATUS_PAD = 10; diff --git a/src/commands/gateway-status.ts b/src/commands/gateway-status.ts index 099a8b44be6..9510c1cbc2d 100644 --- a/src/commands/gateway-status.ts +++ b/src/commands/gateway-status.ts @@ -1,9 +1,9 @@ +import { isRich } from "../../packages/terminal-core/src/theme.js"; import { withProgress } from "../cli/progress.js"; import { readBestEffortConfig, resolveGatewayPort } from "../config/config.js"; import { resolveWideAreaDiscoveryDomain } from "../infra/widearea-dns.js"; import type { RuntimeEnv } from "../runtime.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; -import { isRich } from "../terminal/theme.js"; import { inferSshTargetFromRemoteUrl, resolveSshTarget } from "./gateway-status/discovery.js"; import { buildNetworkHints, diff --git a/src/commands/gateway-status/helpers.ts b/src/commands/gateway-status/helpers.ts index 2c799ca9a28..d90bc751da9 100644 --- a/src/commands/gateway-status/helpers.ts +++ b/src/commands/gateway-status/helpers.ts @@ -1,3 +1,4 @@ +import { colorize, theme } from "../../../packages/terminal-core/src/theme.js"; import { parseTimeoutMsWithFallback } from "../../cli/parse-timeout.js"; import { resolveGatewayPort } from "../../config/config.js"; import type { OpenClawConfig, ConfigFileSnapshot } from "../../config/types.js"; @@ -8,7 +9,6 @@ import { type GatewayProbeCapability, type GatewayProbeResult } from "../../gate import { inspectBestEffortPrimaryTailnetIPv4 } from "../../infra/network-discovery-display.js"; import { parseStrictInteger } from "../../infra/parse-finite-number.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { colorize, theme } from "../../terminal/theme.js"; import { pickGatewaySelfPresence } from "../gateway-presence.js"; const MISSING_SCOPE_PATTERN = /\bmissing scope:\s*[a-z0-9._-]+/i; diff --git a/src/commands/gateway-status/output.test.ts b/src/commands/gateway-status/output.test.ts index 48ea9b25619..d2d90c055ad 100644 --- a/src/commands/gateway-status/output.test.ts +++ b/src/commands/gateway-status/output.test.ts @@ -11,9 +11,10 @@ vi.mock("../../runtime.js", () => ({ writeRuntimeJson: (...args: unknown[]) => mocks.writeRuntimeJson(...args), })); -vi.mock("../../terminal/theme.js", async () => { - const actual = - await vi.importActual("../../terminal/theme.js"); +vi.mock("../../../packages/terminal-core/src/theme.js", async () => { + const actual = await vi.importActual< + typeof import("../../../packages/terminal-core/src/theme.js") + >("../../../packages/terminal-core/src/theme.js"); return { ...actual, colorize: (_rich: boolean, _theme: unknown, text: string) => text, diff --git a/src/commands/gateway-status/output.ts b/src/commands/gateway-status/output.ts index eb7dfd12955..cebeada64db 100644 --- a/src/commands/gateway-status/output.ts +++ b/src/commands/gateway-status/output.ts @@ -1,6 +1,6 @@ +import { colorize, theme } from "../../../packages/terminal-core/src/theme.js"; import type { RuntimeEnv } from "../../runtime.js"; import { writeRuntimeJson } from "../../runtime.js"; -import { colorize, theme } from "../../terminal/theme.js"; import { serializeGatewayDiscoveryBeacon } from "./discovery.js"; import { isProbeReachable, diff --git a/src/commands/health-format.ts b/src/commands/health-format.ts index 82339a58d37..c511f4afbab 100644 --- a/src/commands/health-format.ts +++ b/src/commands/health-format.ts @@ -1,6 +1,6 @@ +import { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { formatChannelStatusState } from "../channels/plugins/status-state.js"; import { asNullableRecord } from "../shared/record-coerce.js"; -import { colorize, isRich, theme } from "../terminal/theme.js"; import type { ChannelAccountHealthSummary, HealthSummary } from "./health.types.js"; const formatKv = (line: string, rich: boolean) => { diff --git a/src/commands/health.test.ts b/src/commands/health.test.ts index 63412feb93f..44d6f81f6c0 100644 --- a/src/commands/health.test.ts +++ b/src/commands/health.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { stripAnsi } from "../terminal/ansi.js"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import { formatHealthCheckFailure } from "./health-format.js"; import type { HealthSummary } from "./health.js"; import { diff --git a/src/commands/health.ts b/src/commands/health.ts index caaae71ad41..c7aead23e51 100644 --- a/src/commands/health.ts +++ b/src/commands/health.ts @@ -1,3 +1,5 @@ +import { styleHealthChannelLine } from "../../packages/terminal-core/src/health-style.js"; +import { isRich } from "../../packages/terminal-core/src/theme.js"; import { resolveDefaultAgentId } from "../agents/agent-scope.js"; import { inspectChannelAccount } from "../channels/account-inspection.js"; import { @@ -37,8 +39,6 @@ import { normalizeAgentId } from "../routing/session-key.js"; import { type RuntimeEnv, writeRuntimeJson } from "../runtime.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; import { asNullableRecord } from "../shared/record-coerce.js"; -import { styleHealthChannelLine } from "../terminal/health-style.js"; -import { isRich } from "../terminal/theme.js"; import { formatHealthChannelLines } from "./health-format.js"; import type { AgentHealthSummary, diff --git a/src/commands/message-format.ts b/src/commands/message-format.ts index 907bf0dda68..06a54582f1c 100644 --- a/src/commands/message-format.ts +++ b/src/commands/message-format.ts @@ -1,3 +1,5 @@ +import { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { getLoadedChannelPlugin } from "../channels/plugins/index.js"; import type { ChannelId } from "../channels/plugins/types.public.js"; import type { OutboundDeliveryResult } from "../infra/outbound/deliver.js"; @@ -6,8 +8,6 @@ import type { MessageActionRunResult } from "../infra/outbound/message-action-ru import { formatTargetDisplay } from "../infra/outbound/target-resolver.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeStringEntries } from "../shared/string-normalization.js"; -import { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -import { isRich, theme } from "../terminal/theme.js"; import { shortenText } from "./text-format.js"; const resolveChannelLabel = (channel: ChannelId) => diff --git a/src/commands/migrate.ts b/src/commands/migrate.ts index 4f3f4d88b4d..1c0919627e1 100644 --- a/src/commands/migrate.ts +++ b/src/commands/migrate.ts @@ -1,4 +1,9 @@ import { cancel, confirm, isCancel, log } from "@clack/prompts"; +import { + stylePromptHint, + stylePromptMessage, + stylePromptTitle, +} from "../../packages/terminal-core/src/prompt-style.js"; import { formatCliCommand } from "../cli/command-format.js"; import { withProgress } from "../cli/progress.js"; import { promptYesNo } from "../cli/prompt.js"; @@ -11,7 +16,6 @@ import { import type { MigrationApplyResult, MigrationPlan } from "../plugins/types.js"; import type { RuntimeEnv } from "../runtime.js"; import { writeRuntimeJson } from "../runtime.js"; -import { stylePromptHint, stylePromptMessage, stylePromptTitle } from "../terminal/prompt-style.js"; import { runMigrationApply } from "./migrate/apply.js"; import { formatMigrationPreview } from "./migrate/output.js"; import { createMigrationPlan, resolveMigrationProvider } from "./migrate/providers.js"; diff --git a/src/commands/migrate/output.test.ts b/src/commands/migrate/output.test.ts index ee0389c69e5..ca744cbdb83 100644 --- a/src/commands/migrate/output.test.ts +++ b/src/commands/migrate/output.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; +import { stripAnsi } from "../../../packages/terminal-core/src/ansi.js"; import type { MigrationItem, MigrationPlan } from "../../plugins/types.js"; -import { stripAnsi } from "../../terminal/ansi.js"; import { formatMigrationPreview, formatMigrationResult } from "./output.js"; function skillItem(index: number): MigrationItem { diff --git a/src/commands/migrate/output.ts b/src/commands/migrate/output.ts index 3e5e7d3c1e6..39d76c20658 100644 --- a/src/commands/migrate/output.ts +++ b/src/commands/migrate/output.ts @@ -1,9 +1,9 @@ import { log } from "@clack/prompts"; +import { theme } from "../../../packages/terminal-core/src/theme.js"; import { redactMigrationPlan } from "../../plugin-sdk/migration.js"; import type { MigrationApplyResult, MigrationItem, MigrationPlan } from "../../plugins/types.js"; import { writeRuntimeJson } from "../../runtime.js"; import type { RuntimeEnv } from "../../runtime.js"; -import { theme } from "../../terminal/theme.js"; import type { MigrateApplyOptions } from "./types.js"; function formatCount(value: number, label: string): string { diff --git a/src/commands/models/auth.ts b/src/commands/models/auth.ts index 426299eea0a..6013f45c7fe 100644 --- a/src/commands/models/auth.ts +++ b/src/commands/models/auth.ts @@ -6,6 +6,10 @@ import { select as clackSelect, text as clackText, } from "@clack/prompts"; +import { + stylePromptHint, + stylePromptMessage, +} from "../../../packages/terminal-core/src/prompt-style.js"; import { resolveAgentDir, resolveAgentWorkspaceDir, @@ -51,7 +55,6 @@ import { normalizeOptionalString, normalizeStringifiedOptionalString, } from "../../shared/string-coerce.js"; -import { stylePromptHint, stylePromptMessage } from "../../terminal/prompt-style.js"; import { normalizeSecretInput } from "../../utils/normalize-secret-input.js"; import { createClackPrompter } from "../../wizard/clack-prompter.js"; import { validateAnthropicSetupToken } from "../auth-token.js"; diff --git a/src/commands/models/list.format.ts b/src/commands/models/list.format.ts index 9d1152dcd74..edc5a492f7c 100644 --- a/src/commands/models/list.format.ts +++ b/src/commands/models/list.format.ts @@ -1,4 +1,4 @@ -import { isRich as isRichTerminal, theme } from "../../terminal/theme.js"; +import { isRich as isRichTerminal, theme } from "../../../packages/terminal-core/src/theme.js"; export { maskApiKey } from "../../utils/mask-api-key.js"; export const isRich = (opts?: { json?: boolean; plain?: boolean }) => diff --git a/src/commands/models/list.status-command.ts b/src/commands/models/list.status-command.ts index cc51e8247f1..40977fc9a5b 100644 --- a/src/commands/models/list.status-command.ts +++ b/src/commands/models/list.status-command.ts @@ -1,4 +1,5 @@ import path from "node:path"; +import { colorize, theme } from "../../../packages/terminal-core/src/theme.js"; import { resolveAgentDir, resolveAgentExplicitModelPrimary, @@ -59,7 +60,6 @@ import { resolveRuntimeSyntheticAuthProviderRefs } from "../../plugins/synthetic import { type RuntimeEnv, writeRuntimeJson } from "../../runtime.js"; import { createLazyImportLoader } from "../../shared/lazy-promise.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { colorize, theme } from "../../terminal/theme.js"; import { resolveUserPath, shortenHomePath } from "../../utils.js"; import { resolveProviderAuthOverview } from "./list.auth-overview.js"; import { isRich } from "./list.format.js"; @@ -80,7 +80,7 @@ function resolveEnvAgentDirOverride(env: NodeJS.ProcessEnv = process.env): strin const override = env.OPENCLAW_AGENT_DIR?.trim() || env.PI_CODING_AGENT_DIR?.trim(); return override ? resolveUserPath(override, env) : undefined; } -type TerminalTableRuntime = typeof import("../../terminal/table.js"); +type TerminalTableRuntime = typeof import("../../../packages/terminal-core/src/table.js"); type ListProbeRuntime = typeof import("./list.probe.js"); const providerUsageRuntimeLoader = createLazyImportLoader( @@ -90,7 +90,7 @@ const progressRuntimeLoader = createLazyImportLoader( () => import("../../cli/progress.js"), ); const terminalTableRuntimeLoader = createLazyImportLoader( - () => import("../../terminal/table.js"), + () => import("../../../packages/terminal-core/src/table.js"), ); const listProbeRuntimeLoader = createLazyImportLoader( () => import("./list.probe.js"), diff --git a/src/commands/models/list.table.ts b/src/commands/models/list.table.ts index cb9cc968330..2e06bf681df 100644 --- a/src/commands/models/list.table.ts +++ b/src/commands/models/list.table.ts @@ -1,6 +1,6 @@ +import { sanitizeTerminalText } from "../../../packages/terminal-core/src/safe-text.js"; +import { colorize, theme } from "../../../packages/terminal-core/src/theme.js"; import { type RuntimeEnv, writeRuntimeJson } from "../../runtime.js"; -import { sanitizeTerminalText } from "../../terminal/safe-text.js"; -import { colorize, theme } from "../../terminal/theme.js"; import { formatTag, isRich, pad, truncate } from "./list.format.js"; import type { ModelRow } from "./list.types.js"; import { formatTokenK } from "./shared.js"; diff --git a/src/commands/models/scan.ts b/src/commands/models/scan.ts index 7f26ed08ffe..537e5ea3de7 100644 --- a/src/commands/models/scan.ts +++ b/src/commands/models/scan.ts @@ -1,4 +1,9 @@ import { cancel, multiselect as clackMultiselect, isCancel } from "@clack/prompts"; +import { + stylePromptHint, + stylePromptMessage, + stylePromptTitle, +} from "../../../packages/terminal-core/src/prompt-style.js"; import { resolveApiKeyForProvider } from "../../agents/model-auth.js"; import { type ModelScanResult, scanOpenRouterModels } from "../../agents/model-scan.js"; import { formatCliCommand } from "../../cli/command-format.js"; @@ -11,11 +16,6 @@ import { } from "../../infra/parse-finite-number.js"; import { getEnvApiKey } from "../../llm/env-api-keys.js"; import { type RuntimeEnv, writeRuntimeJson } from "../../runtime.js"; -import { - stylePromptHint, - stylePromptMessage, - stylePromptTitle, -} from "../../terminal/prompt-style.js"; import { pad, truncate } from "./list.format.js"; import { loadModelsConfig } from "./load-config.js"; import { formatMs, formatTokenK, updateConfig } from "./shared.js"; diff --git a/src/commands/oauth-tls-preflight.doctor.test.ts b/src/commands/oauth-tls-preflight.doctor.test.ts index bf4107cce22..6ed7322dcc9 100644 --- a/src/commands/oauth-tls-preflight.doctor.test.ts +++ b/src/commands/oauth-tls-preflight.doctor.test.ts @@ -3,7 +3,7 @@ import type { OpenClawConfig } from "../config/config.js"; const note = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note, })); diff --git a/src/commands/onboard-helpers.ts b/src/commands/onboard-helpers.ts index ac1f979deb5..48ce7461a72 100644 --- a/src/commands/onboard-helpers.ts +++ b/src/commands/onboard-helpers.ts @@ -2,6 +2,12 @@ import fs from "node:fs/promises"; import path from "node:path"; import { inspect } from "node:util"; import { cancel, isCancel } from "@clack/prompts"; +import { visibleWidth } from "../../packages/terminal-core/src/ansi.js"; +import { + decorativeEmoji, + supportsDecorativeEmoji, +} from "../../packages/terminal-core/src/decorative-emoji.js"; +import { stylePromptTitle } from "../../packages/terminal-core/src/prompt-style.js"; import { DEFAULT_AGENT_WORKSPACE_DIR, ensureAgentWorkspace } from "../agents/workspace.js"; import { resolveAgentModelPrimaryValue } from "../config/model-input.js"; import { resolveConfigPath } from "../config/paths.js"; @@ -21,9 +27,6 @@ import { movePathToTrash } from "../infra/fs-safe.js"; import type { RuntimeEnv } from "../runtime.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { uniqueStrings } from "../shared/string-normalization.js"; -import { visibleWidth } from "../terminal/ansi.js"; -import { decorativeEmoji, supportsDecorativeEmoji } from "../terminal/decorative-emoji.js"; -import { stylePromptTitle } from "../terminal/prompt-style.js"; import { resolveConfigDir, shortenHomeInString, shortenHomePath, sleep } from "../utils.js"; import { VERSION } from "../version.js"; import type { NodeManagerChoice, OnboardMode, ResetScope } from "./onboard-types.js"; diff --git a/src/commands/onboard-interactive.test.ts b/src/commands/onboard-interactive.test.ts index ba3a9227fe6..f8a68495ba6 100644 --- a/src/commands/onboard-interactive.test.ts +++ b/src/commands/onboard-interactive.test.ts @@ -17,7 +17,7 @@ vi.mock("../wizard/setup.js", () => ({ runSetupWizard: mocks.runSetupWizard, })); -vi.mock("../terminal/restore.js", () => ({ +vi.mock("../../packages/terminal-core/src/restore.js", () => ({ restoreTerminalState: mocks.restoreTerminalState, })); diff --git a/src/commands/onboard-interactive.ts b/src/commands/onboard-interactive.ts index f271764e5de..d02f8e50aa0 100644 --- a/src/commands/onboard-interactive.ts +++ b/src/commands/onboard-interactive.ts @@ -1,6 +1,6 @@ +import { restoreTerminalState } from "../../packages/terminal-core/src/restore.js"; import type { RuntimeEnv } from "../runtime.js"; import { defaultRuntime } from "../runtime.js"; -import { restoreTerminalState } from "../terminal/restore.js"; import { createClackPrompter } from "../wizard/clack-prompter.js"; import { WizardCancelledError } from "../wizard/prompts.js"; import { runSetupWizard } from "../wizard/setup.js"; diff --git a/src/commands/onboarding-plugin-install.ts b/src/commands/onboarding-plugin-install.ts index 95936deced2..05c2b5be7c1 100644 --- a/src/commands/onboarding-plugin-install.ts +++ b/src/commands/onboarding-plugin-install.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { resolveBundledInstallPlanForCatalogEntry } from "../cli/plugin-install-plan.js"; import { assertConfigWriteAllowedInCurrentMode } from "../config/nix-mode-write-guard.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -33,7 +34,6 @@ import { buildNpmResolutionInstallFields, recordPluginInstall } from "../plugins import type { PluginPackageInstall } from "../plugins/manifest.js"; import type { RuntimeEnv } from "../runtime.js"; import { uniqueStrings } from "../shared/string-normalization.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { withTimeout } from "../utils/with-timeout.js"; import { VERSION } from "../version.js"; import { t } from "../wizard/i18n/index.js"; diff --git a/src/commands/reset.ts b/src/commands/reset.ts index 596d80a139a..fe7aca07170 100644 --- a/src/commands/reset.ts +++ b/src/commands/reset.ts @@ -1,10 +1,13 @@ import { cancel, confirm, isCancel } from "@clack/prompts"; +import { selectStyled } from "../../packages/terminal-core/src/prompt-select-styled.js"; +import { + stylePromptMessage, + stylePromptTitle, +} from "../../packages/terminal-core/src/prompt-style.js"; import { formatCliCommand } from "../cli/command-format.js"; import { isNixMode } from "../config/config.js"; import { resolveGatewayService } from "../daemon/service.js"; import type { RuntimeEnv } from "../runtime.js"; -import { selectStyled } from "../terminal/prompt-select-styled.js"; -import { stylePromptMessage, stylePromptTitle } from "../terminal/prompt-style.js"; import { resolveCleanupPlanFromDisk } from "./cleanup-plan.js"; import { listAgentSessionDirs, diff --git a/src/commands/sandbox-explain.ts b/src/commands/sandbox-explain.ts index d82f56bc711..cc6b20d3ac9 100644 --- a/src/commands/sandbox-explain.ts +++ b/src/commands/sandbox-explain.ts @@ -1,3 +1,5 @@ +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { resolveAgentConfig } from "../agents/agent-scope.js"; import { resolveSandboxConfigForAgent } from "../agents/sandbox.js"; import { resolveSandboxToolPolicyForAgent } from "../agents/sandbox/tool-policy.js"; @@ -22,8 +24,6 @@ import { normalizeOptionalLowercaseString, normalizeStringifiedEntries, } from "../shared/string-coerce.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { colorize, isRich, theme } from "../terminal/theme.js"; import { INTERNAL_MESSAGE_CHANNEL } from "../utils/message-channel.js"; type SandboxExplainOptions = { diff --git a/src/commands/sessions-cleanup.ts b/src/commands/sessions-cleanup.ts index b9e9d7b7e39..eb1d3e5a0a1 100644 --- a/src/commands/sessions-cleanup.ts +++ b/src/commands/sessions-cleanup.ts @@ -1,3 +1,4 @@ +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { getRuntimeConfig } from "../config/config.js"; import { resolveSessionCleanupAction, @@ -10,7 +11,6 @@ import { import type { OpenClawConfig } from "../config/types.openclaw.js"; import { callGateway, isGatewayTransportError } from "../gateway/call.js"; import { type RuntimeEnv, writeRuntimeJson } from "../runtime.js"; -import { isRich, theme } from "../terminal/theme.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; import { resolveSessionStoreTargetsOrExit } from "./session-store-targets.js"; import { resolveSessionDisplayModel } from "./sessions-display-model.js"; diff --git a/src/commands/sessions-table.ts b/src/commands/sessions-table.ts index 1cb9b1a213d..747e0918501 100644 --- a/src/commands/sessions-table.ts +++ b/src/commands/sessions-table.ts @@ -1,6 +1,6 @@ +import { theme } from "../../packages/terminal-core/src/theme.js"; import type { SessionEntry } from "../config/sessions.js"; import { formatTimeAgo } from "../infra/format-time/format-relative.ts"; -import { theme } from "../terminal/theme.js"; export type SessionDisplayRow = { key: string; diff --git a/src/commands/sessions.ts b/src/commands/sessions.ts index 876b1f5d5aa..3599f38776c 100644 --- a/src/commands/sessions.ts +++ b/src/commands/sessions.ts @@ -1,3 +1,4 @@ +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { resolveModelAgentRuntimeMetadata } from "../agents/agent-runtime-metadata.js"; import { DEFAULT_CONTEXT_TOKENS } from "../agents/defaults.js"; import { resolveRuntimePolicySessionKey } from "../auto-reply/reply/runtime-policy-session-key.js"; @@ -18,7 +19,6 @@ import { normalizeOptionalString, } from "../shared/string-coerce.js"; import { resolveAgentRuntimeLabel } from "../status/agent-runtime-label.js"; -import { isRich, theme } from "../terminal/theme.js"; import { resolveSessionStoreTargetsOrExit } from "./session-store-targets.js"; import { resolveSessionDisplayModelRef, diff --git a/src/commands/status-all/channels.ts b/src/commands/status-all/channels.ts index a81cce28ce9..59e8ecf5e0b 100644 --- a/src/commands/status-all/channels.ts +++ b/src/commands/status-all/channels.ts @@ -1,4 +1,5 @@ import fs from "node:fs"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { resolveInspectedChannelAccount } from "../../channels/account-inspection.js"; import { hasConfiguredUnavailableCredentialStatus } from "../../channels/account-snapshot-fields.js"; import { @@ -23,7 +24,6 @@ import { listExplicitConfiguredChannelIdsForConfig } from "../../plugins/channel import { resolveMissingOfficialExternalChannelPluginRepairHint } from "../../plugins/official-external-plugin-repair-hints.js"; import { asRecord } from "../../shared/record-coerce.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { summarizeTokenConfig, type ChannelAccountTokenSummaryRow, diff --git a/src/commands/status-all/report-lines.ts b/src/commands/status-all/report-lines.ts index eaf63cafff9..ce0ee7776c4 100644 --- a/src/commands/status-all/report-lines.ts +++ b/src/commands/status-all/report-lines.ts @@ -1,6 +1,6 @@ +import { getTerminalTableWidth, renderTable } from "../../../packages/terminal-core/src/table.js"; +import { isRich, theme } from "../../../packages/terminal-core/src/theme.js"; import type { ProgressReporter } from "../../cli/progress.js"; -import { getTerminalTableWidth, renderTable } from "../../terminal/table.js"; -import { isRich, theme } from "../../terminal/theme.js"; import { appendStatusAllDiagnosis } from "./diagnosis.js"; import { buildStatusAgentsSection, diff --git a/src/commands/status-all/report-sections.ts b/src/commands/status-all/report-sections.ts index c632ae22dcd..66a85af30ae 100644 --- a/src/commands/status-all/report-sections.ts +++ b/src/commands/status-all/report-sections.ts @@ -1,4 +1,4 @@ -import type { RenderTableOptions, TableColumn } from "../../terminal/table.js"; +import type { RenderTableOptions, TableColumn } from "../../../packages/terminal-core/src/table.js"; import { buildStatusChannelsTableRows, statusChannelsTableColumns } from "./channels-table.js"; import { buildStatusAgentTableRows, diff --git a/src/commands/status-all/report-tables.ts b/src/commands/status-all/report-tables.ts index b23da761d1e..e5e0460869e 100644 --- a/src/commands/status-all/report-tables.ts +++ b/src/commands/status-all/report-tables.ts @@ -1,4 +1,4 @@ -import type { RenderTableOptions } from "../../terminal/table.js"; +import type { RenderTableOptions } from "../../../packages/terminal-core/src/table.js"; import { formatTimeAgo } from "./format.js"; import type { StatusReportSection } from "./text-report.js"; diff --git a/src/commands/status-all/text-report.ts b/src/commands/status-all/text-report.ts index 5f405a3d95c..96fc8811aa0 100644 --- a/src/commands/status-all/text-report.ts +++ b/src/commands/status-all/text-report.ts @@ -1,4 +1,4 @@ -import type { RenderTableOptions, TableColumn } from "../../terminal/table.js"; +import type { RenderTableOptions, TableColumn } from "../../../packages/terminal-core/src/table.js"; type HeadingFn = (text: string) => string; type TableRenderer = (input: RenderTableOptions) => string; diff --git a/src/commands/status.command-report-data.ts b/src/commands/status.command-report-data.ts index 751083884e0..2ed5cd11fb7 100644 --- a/src/commands/status.command-report-data.ts +++ b/src/commands/status.command-report-data.ts @@ -1,9 +1,9 @@ import type { ConnectPairingRequiredReason } from "../../packages/gateway-protocol/src/connect-error-details.js"; +import type { RenderTableOptions, TableColumn } from "../../packages/terminal-core/src/table.js"; import type { HeartbeatEventPayload } from "../infra/heartbeat-events.js"; import type { resolveOsSummary } from "../infra/os-summary.js"; import type { PluginCompatibilityNotice } from "../plugins/status.js"; import type { SecurityAuditReport } from "../security/audit.js"; -import type { RenderTableOptions, TableColumn } from "../terminal/table.js"; import type { HealthSummary } from "./health.js"; import { buildStatusChannelsTableRows, diff --git a/src/commands/status.command-report.ts b/src/commands/status.command-report.ts index 778013726b6..8bfefa838f8 100644 --- a/src/commands/status.command-report.ts +++ b/src/commands/status.command-report.ts @@ -1,4 +1,4 @@ -import type { RenderTableOptions, TableColumn } from "../terminal/table.js"; +import type { RenderTableOptions, TableColumn } from "../../packages/terminal-core/src/table.js"; import { buildStatusChannelsTableSection, buildStatusHealthSection, diff --git a/src/commands/status.command-sections.ts b/src/commands/status.command-sections.ts index 6062cb85a40..d417811d22e 100644 --- a/src/commands/status.command-sections.ts +++ b/src/commands/status.command-sections.ts @@ -3,11 +3,11 @@ import { describePairingConnectRequirement, type ConnectPairingRequiredReason, } from "../../packages/gateway-protocol/src/connect-error-details.js"; +import type { TableColumn } from "../../packages/terminal-core/src/table.js"; import { areRuntimeModelRefsEquivalent } from "../agents/model-runtime-aliases.js"; import type { HeartbeatEventPayload } from "../infra/heartbeat-events.js"; import type { Tone } from "../memory-host-sdk/status.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import type { TableColumn } from "../terminal/table.js"; import type { HealthSummary } from "./health.js"; import type { AgentLocalStatus } from "./status.agent-local.js"; import type { MemoryStatusSnapshot, MemoryPluginStatus } from "./status.scan.shared.js"; diff --git a/src/commands/status.command.text-runtime.ts b/src/commands/status.command.text-runtime.ts index a8ce202e6b5..d3e621a7396 100644 --- a/src/commands/status.command.text-runtime.ts +++ b/src/commands/status.command.text-runtime.ts @@ -11,8 +11,8 @@ export { formatPluginCompatibilityNotice, summarizePluginCompatibility, } from "../plugins/status.js"; -export { getTerminalTableWidth, renderTable } from "../terminal/table.js"; -export { theme } from "../terminal/theme.js"; +export { getTerminalTableWidth, renderTable } from "../../packages/terminal-core/src/table.js"; +export { theme } from "../../packages/terminal-core/src/theme.js"; export { formatHealthChannelLines } from "./health-format.js"; export { groupChannelIssuesByChannel } from "./status-all/channel-issues.js"; export { diff --git a/src/commands/status.command.ts b/src/commands/status.command.ts index 99b993cb729..c7ff11ca6f0 100644 --- a/src/commands/status.command.ts +++ b/src/commands/status.command.ts @@ -4,11 +4,11 @@ import { readPairingConnectErrorDetails, type ConnectPairingRequiredReason, } from "../../packages/gateway-protocol/src/connect-error-details.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { withProgress } from "../cli/progress.js"; import { readRestartSentinel } from "../infra/restart-sentinel.js"; import { type RuntimeEnv } from "../runtime.js"; import { createLazyImportLoader } from "../shared/lazy-promise.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { runStatusJsonCommand } from "./status-json-command.ts"; import { buildStatusOverviewSurfaceFromScan } from "./status-overview-surface.ts"; import { diff --git a/src/commands/systemd-linger.ts b/src/commands/systemd-linger.ts index f810f5c2500..1d8ac4e00ed 100644 --- a/src/commands/systemd-linger.ts +++ b/src/commands/systemd-linger.ts @@ -1,10 +1,10 @@ +import { note } from "../../packages/terminal-core/src/note.js"; import { enableSystemdUserLinger, isSystemdUserServiceAvailable, readSystemdUserLingerStatus, } from "../daemon/systemd.js"; import type { RuntimeEnv } from "../runtime.js"; -import { note } from "../terminal/note.js"; export type LingerPrompter = { confirm?: (params: { message: string; initialValue?: boolean }) => Promise; diff --git a/src/commands/tasks.ts b/src/commands/tasks.ts index ce9849430a7..27813ad2604 100644 --- a/src/commands/tasks.ts +++ b/src/commands/tasks.ts @@ -1,4 +1,5 @@ import fs from "node:fs"; +import { isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { formatCliCommand } from "../cli/command-format.js"; import { formatLookupMiss } from "../cli/error-format.js"; import { getRuntimeConfig } from "../config/config.js"; @@ -40,7 +41,6 @@ import { } from "../tasks/task-registry.reconcile.js"; import { summarizeTaskRecords } from "../tasks/task-registry.summary.js"; import type { TaskNotifyPolicy, TaskRecord } from "../tasks/task-registry.types.js"; -import { isRich, theme } from "../terminal/theme.js"; import { buildTaskSystemAuditFindings, type TaskSystemAuditCode, diff --git a/src/commands/uninstall.ts b/src/commands/uninstall.ts index 7d307de6127..ea37342019f 100644 --- a/src/commands/uninstall.ts +++ b/src/commands/uninstall.ts @@ -1,11 +1,15 @@ import path from "node:path"; import { cancel, confirm, isCancel, multiselect } from "@clack/prompts"; +import { + stylePromptHint, + stylePromptMessage, + stylePromptTitle, +} from "../../packages/terminal-core/src/prompt-style.js"; import { formatCliCommand } from "../cli/command-format.js"; import { isNixMode } from "../config/config.js"; import { resolveGatewayService } from "../daemon/service.js"; import { formatErrorMessage } from "../infra/errors.js"; import type { RuntimeEnv } from "../runtime.js"; -import { stylePromptHint, stylePromptMessage, stylePromptTitle } from "../terminal/prompt-style.js"; import { resolveHomeDir } from "../utils.js"; import { resolveCleanupPlanFromDisk } from "./cleanup-plan.js"; import { removePath, removeStateAndLinkedPaths, removeWorkspaceDirs } from "./cleanup-utils.js"; diff --git a/src/config/io.invalid-config.ts b/src/config/io.invalid-config.ts index 0dbae82a78a..1519f297f67 100644 --- a/src/config/io.invalid-config.ts +++ b/src/config/io.invalid-config.ts @@ -1,4 +1,4 @@ -import { sanitizeTerminalText } from "../terminal/safe-text.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; type ConfigValidationIssueLike = { path: string; diff --git a/src/config/io.ts b/src/config/io.ts index 9f048f06df3..79b50c15bca 100644 --- a/src/config/io.ts +++ b/src/config/io.ts @@ -3,6 +3,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import JSON5 from "json5"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope-config.js"; import { ensureOwnerDisplaySecret } from "../agents/owner-display.js"; import { isVerbose } from "../global-state.js"; @@ -27,7 +28,6 @@ import { type PluginMetadataSnapshot, } from "../plugins/plugin-metadata-snapshot.js"; import { collectManifestModelIdNormalizationPolicies } from "../shared/provider-model-id-normalization.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { isRecord } from "../utils.js"; import { VERSION } from "../version.js"; import { DuplicateAgentDirError, findDuplicateAgentDirs } from "./agent-dirs.js"; diff --git a/src/config/issue-format.ts b/src/config/issue-format.ts index 0b81fbba4fa..01e18f8e622 100644 --- a/src/config/issue-format.ts +++ b/src/config/issue-format.ts @@ -1,4 +1,4 @@ -import { sanitizeTerminalText } from "../terminal/safe-text.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import type { ConfigValidationIssue } from "./types.js"; export type ConfigIssueLineInput = { diff --git a/src/config/logging.ts b/src/config/logging.ts index 2ec298167a6..56fa1238ccb 100644 --- a/src/config/logging.ts +++ b/src/config/logging.ts @@ -1,6 +1,6 @@ import fs from "node:fs"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import type { RuntimeEnv } from "../runtime.js"; -import { theme } from "../terminal/theme.js"; import { displayPath } from "../utils.js"; import { createConfigIO } from "./io.js"; diff --git a/src/context-engine/registry.ts b/src/context-engine/registry.ts index 21d7de2fe39..877f73f1731 100644 --- a/src/context-engine/registry.ts +++ b/src/context-engine/registry.ts @@ -1,7 +1,7 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../config/types.js"; import { defaultSlotIdForKey } from "../plugins/slots.js"; import { resolveGlobalSingleton } from "../shared/global-singleton.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import type { AssembleResult, BootstrapResult, diff --git a/src/daemon/launchd-restart-handoff.ts b/src/daemon/launchd-restart-handoff.ts index bcc6d52ee38..31ac2bc2eed 100644 --- a/src/daemon/launchd-restart-handoff.ts +++ b/src/daemon/launchd-restart-handoff.ts @@ -1,10 +1,10 @@ import { spawn } from "node:child_process"; import os from "node:os"; import path from "node:path"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { formatErrorMessage } from "../infra/errors.js"; import { sanitizeHostExecEnv } from "../infra/host-env-security.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { resolveGatewayLaunchAgentLabel } from "./constants.js"; import { renderPosixRestartLogSetup } from "./restart-logs.js"; diff --git a/src/daemon/launchd.ts b/src/daemon/launchd.ts index 06b22c94326..239709ed0a1 100644 --- a/src/daemon/launchd.ts +++ b/src/daemon/launchd.ts @@ -1,12 +1,12 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { normalizeEnvVarKey } from "../infra/host-env-security.js"; import { parseStrictInteger, parseStrictPositiveInteger } from "../infra/parse-finite-number.js"; import { formatPortDiagnostics, inspectPortUsage } from "../infra/ports.js"; import { cleanStaleGatewayProcessesSync } from "../infra/restart-stale-pids.js"; import { parseTcpPort } from "../infra/tcp-port.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { GATEWAY_LAUNCH_AGENT_LABEL, GATEWAY_SERVICE_KIND, diff --git a/src/daemon/output.ts b/src/daemon/output.ts index 0d910918c2b..eeb09fdc636 100644 --- a/src/daemon/output.ts +++ b/src/daemon/output.ts @@ -1,4 +1,4 @@ -import { colorize, isRich, theme } from "../terminal/theme.js"; +import { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; export const toPosixPath = (value: string) => value.replace(/\\/g, "/"); diff --git a/src/flows/channel-setup.prompts.ts b/src/flows/channel-setup.prompts.ts index 34142314f6e..d6042f09a76 100644 --- a/src/flows/channel-setup.prompts.ts +++ b/src/flows/channel-setup.prompts.ts @@ -1,3 +1,4 @@ +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; import { resolveChannelDefaultAccountId } from "../channels/plugins/helpers.js"; import { getChannelSetupPlugin } from "../channels/plugins/setup-registry.js"; import type { ChannelSetupPlugin } from "../channels/plugins/setup-wizard-types.js"; @@ -10,7 +11,6 @@ import type { ChannelChoice } from "../commands/onboard-types.js"; import type { DmPolicy } from "../config/types.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; -import { formatDocsLink } from "../terminal/links.js"; import { t } from "../wizard/i18n/index.js"; import type { WizardPrompter, WizardSelectOption } from "../wizard/prompts.js"; diff --git a/src/flows/channel-setup.status.ts b/src/flows/channel-setup.status.ts index d8a8fc73f59..4566bc08ebe 100644 --- a/src/flows/channel-setup.status.ts +++ b/src/flows/channel-setup.status.ts @@ -1,3 +1,5 @@ +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import { listChatChannels } from "../channels/chat-meta.js"; import { listChannelPluginCatalogEntries } from "../channels/plugins/catalog.js"; @@ -22,8 +24,6 @@ import { resolveBundledPluginSources, type BundledPluginSource, } from "../plugins/bundled-sources.js"; -import { formatDocsLink } from "../terminal/links.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { t, wizardT } from "../wizard/i18n/index.js"; import type { WizardPrompter } from "../wizard/prompts.js"; import type { FlowContribution } from "./types.js"; diff --git a/src/flows/doctor-health-contributions.test.ts b/src/flows/doctor-health-contributions.test.ts index 6005688c28c..dcd6dcc77cc 100644 --- a/src/flows/doctor-health-contributions.test.ts +++ b/src/flows/doctor-health-contributions.test.ts @@ -59,7 +59,7 @@ vi.mock("../agents/agent-scope.js", () => ({ resolveDefaultAgentId: mocks.resolveDefaultAgentId, })); -vi.mock("../terminal/note.js", () => ({ +vi.mock("../../packages/terminal-core/src/note.js", () => ({ note: mocks.note, })); diff --git a/src/flows/doctor-health-contributions.ts b/src/flows/doctor-health-contributions.ts index 971766ee362..a92e90a8cf0 100644 --- a/src/flows/doctor-health-contributions.ts +++ b/src/flows/doctor-health-contributions.ts @@ -108,7 +108,7 @@ function createDoctorHealthContribution(params: { async function runGatewayConfigHealth(ctx: DoctorHealthFlowContext): Promise { const { formatCliCommand } = await import("../cli/command-format.js"); const { hasAmbiguousGatewayAuthModeConfig } = await import("../gateway/auth-mode-policy.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); if (!ctx.cfg.gateway?.mode) { const lines = [ "gateway.mode is unset; gateway start will be blocked.", @@ -143,7 +143,7 @@ async function runAuthProfileHealth(ctx: DoctorHealthFlowContext): Promise const { noteAuthProfileHealth, noteLegacyCodexProviderOverride } = await import("../commands/doctor-auth.js"); const { buildGatewayConnectionDetails } = await import("../gateway/call.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); await maybeRepairLegacyFlatAuthProfileStores({ cfg: ctx.cfg, prompter: ctx.prompter, @@ -175,7 +175,7 @@ async function runGatewayAuthHealth(ctx: DoctorHealthFlowContext): Promise await import("./doctor-core-checks.js"); const { resolveGatewayAuth } = await import("../gateway/auth.js"); const { resolveGatewayAuthToken } = await import("../gateway/auth-token-resolution.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); const { randomToken } = await import("../commands/onboard-helpers.js"); if (resolveDoctorMode(ctx.cfg) !== "local" || !ctx.sourceConfigValid) { return; @@ -296,7 +296,7 @@ async function runStructuredHealthRepairs(ctx: DoctorHealthFlowContext): Promise const { runDoctorHealthRepairs } = await import("./doctor-repair-flow.js"); const { resolveAgentWorkspaceDir, resolveDefaultAgentId } = await import("../agents/agent-scope.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); registerCoreHealthChecks(); const workspaceDir = resolveAgentWorkspaceDir(ctx.cfg, resolveDefaultAgentId(ctx.cfg)); @@ -331,7 +331,7 @@ async function runClaudeCliHealth(ctx: DoctorHealthFlowContext): Promise { async function runLegacyStateHealth(ctx: DoctorHealthFlowContext): Promise { const { detectLegacyStateMigrations, runLegacyStateMigrations } = await import("../commands/doctor-state-migrations.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); const legacyState = await detectLegacyStateMigrations({ cfg: ctx.cfg }); if (legacyState.preview.length === 0) { return; @@ -389,7 +389,7 @@ async function runReleaseConfiguredPluginInstallsHealth( } const { maybeRunConfiguredPluginInstallReleaseStep } = await import("../commands/doctor/shared/release-configured-plugin-installs.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); const { VERSION } = await import("../version.js"); const result = await maybeRunConfiguredPluginInstallReleaseStep({ cfg: ctx.cfg, @@ -428,7 +428,7 @@ async function runStateIntegrityHealth(ctx: DoctorHealthFlowContext): Promise { const { maybeRepairCodexSessionRoutes } = await import("../commands/doctor/shared/codex-route-warnings.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); const result = await maybeRepairCodexSessionRoutes({ cfg: ctx.cfg, env: ctx.env ?? process.env, @@ -543,7 +543,7 @@ async function runHooksModelHealth(ctx: DoctorHealthFlowContext): Promise const { loadModelCatalog } = await import("../agents/model-catalog.js"); const { getModelRefStatus, resolveConfiguredModelRef, resolveHooksGmailModel } = await import("../agents/model-selection.js"); - const { note } = await import("../terminal/note.js"); + const { note } = await import("../../packages/terminal-core/src/note.js"); const hooksModelRef = resolveHooksGmailModel({ cfg: ctx.cfg, defaultProvider: DEFAULT_PROVIDER, @@ -621,7 +621,7 @@ async function runToolResultCapHealth(ctx: DoctorHealthFlowContext): Promise { @@ -664,7 +664,7 @@ async function runSystemdLingerHealth(ctx: DoctorHealthFlowContext): Promise clackIntro(stylePromptTitle(message) ?? message); const outro = (message: string) => clackOutro(stylePromptTitle(message) ?? message); diff --git a/src/gateway/server-startup-log.test.ts b/src/gateway/server-startup-log.test.ts index 3b6d805aa3f..8a596bac0e0 100644 --- a/src/gateway/server-startup-log.test.ts +++ b/src/gateway/server-startup-log.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "vitest"; -import { stripAnsi } from "../terminal/ansi.js"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import { formatAgentModelStartupDetails, logGatewayStartup } from "./server-startup-log.js"; describe("gateway startup log", () => { diff --git a/src/globals.ts b/src/globals.ts index 2060716a260..789cd044b92 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -1,7 +1,7 @@ export { isVerbose, isYes, setVerbose, setYes } from "./global-state.js"; +import { theme } from "../packages/terminal-core/src/theme.js"; import { isVerbose } from "./global-state.js"; import { getLogger, isFileLogLevelEnabled } from "./logging/logger.js"; -import { theme } from "./terminal/theme.js"; export function shouldLogVerbose() { return isVerbose() || isFileLogLevelEnabled("debug"); diff --git a/src/hooks/loader.test.ts b/src/hooks/loader.test.ts index 18b158b46c6..04ff94faeac 100644 --- a/src/hooks/loader.test.ts +++ b/src/hooks/loader.test.ts @@ -2,10 +2,10 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../config/config.js"; import { setLoggerOverride } from "../logging/logger.js"; import { loggingState } from "../logging/state.js"; -import { stripAnsi } from "../terminal/ansi.js"; import { captureEnv } from "../test-utils/env.js"; import { hasConfiguredInternalHooks, resolveConfiguredInternalHookNames } from "./configured.js"; import { diff --git a/src/hooks/loader.ts b/src/hooks/loader.ts index 0511fecff12..59deddcd37d 100644 --- a/src/hooks/loader.ts +++ b/src/hooks/loader.ts @@ -7,12 +7,12 @@ import fs from "node:fs"; import path from "node:path"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { openRootFile } from "../infra/boundary-file-read.js"; import { formatErrorMessage } from "../infra/errors.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { resolveGlobalSingleton } from "../shared/global-singleton.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { shouldIncludeHook } from "./config.js"; import { hasConfiguredInternalHooks, resolveConfiguredInternalHookNames } from "./configured.js"; import { buildImportUrl } from "./import-url.js"; diff --git a/src/index.ts b/src/index.ts index b1939e831df..572697e6d0d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -84,7 +84,7 @@ if (!isMain) { } if (isMain) { - const { restoreTerminalState } = await import("./terminal/restore.js"); + const { restoreTerminalState } = await import("../packages/terminal-core/src/restore.js"); // Global error handlers to prevent silent crashes from unhandled rejections/exceptions. // These log the error and exit gracefully instead of crashing without trace. diff --git a/src/infra/channel-summary.ts b/src/infra/channel-summary.ts index 1b90e2801d3..4cba275a3ea 100644 --- a/src/infra/channel-summary.ts +++ b/src/infra/channel-summary.ts @@ -1,3 +1,5 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { resolveInspectedChannelAccount } from "../channels/account-inspection.js"; import { hasConfiguredUnavailableCredentialStatus } from "../channels/account-snapshot-fields.js"; import { @@ -9,8 +11,6 @@ import type { ChannelPlugin } from "../channels/plugins/types.plugin.js"; import type { ChannelAccountSnapshot } from "../channels/plugins/types.public.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { DEFAULT_ACCOUNT_ID } from "../routing/session-key.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; -import { theme } from "../terminal/theme.js"; import { formatTimeAgo } from "./format-time/format-relative.ts"; export type ChannelSummaryOptions = { diff --git a/src/infra/ports.test.ts b/src/infra/ports.test.ts index dcba528866a..6d272cccd69 100644 --- a/src/infra/ports.test.ts +++ b/src/infra/ports.test.ts @@ -1,6 +1,6 @@ import net from "node:net"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { stripAnsi } from "../terminal/ansi.js"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import { mockProcessPlatform } from "../test-utils/vitest-spies.js"; const runCommandWithTimeoutMock = vi.hoisted(() => vi.fn()); diff --git a/src/infra/tailscale.ts b/src/infra/tailscale.ts index 9741de3b354..dd31f81122d 100644 --- a/src/infra/tailscale.ts +++ b/src/infra/tailscale.ts @@ -1,4 +1,5 @@ import { existsSync } from "node:fs"; +import { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; import { formatCliCommand } from "../cli/command-format.js"; import { promptYesNo } from "../cli/prompt.js"; import { danger, info, logVerbose, shouldLogVerbose, warn } from "../globals.js"; @@ -9,7 +10,6 @@ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { colorize, isRich, theme } from "../terminal/theme.js"; import { ensureBinary } from "./binaries.js"; function parsePossiblyNoisyJsonObject(stdout: string): Record { diff --git a/src/infra/unhandled-rejections.fatal-detection.test.ts b/src/infra/unhandled-rejections.fatal-detection.test.ts index 8deae074e35..841a8162160 100644 --- a/src/infra/unhandled-rejections.fatal-detection.test.ts +++ b/src/infra/unhandled-rejections.fatal-detection.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect, vi, beforeAll, afterAll, beforeEach, afterEach } const restoreTerminalStateMock = vi.hoisted(() => vi.fn()); -vi.mock("../terminal/restore.js", () => ({ +vi.mock("../../packages/terminal-core/src/restore.js", () => ({ restoreTerminalState: restoreTerminalStateMock, })); diff --git a/src/infra/unhandled-rejections.ts b/src/infra/unhandled-rejections.ts index 9ceeffa68c1..afce28bbecc 100644 --- a/src/infra/unhandled-rejections.ts +++ b/src/infra/unhandled-rejections.ts @@ -1,6 +1,6 @@ import process from "node:process"; +import { restoreTerminalState } from "../../packages/terminal-core/src/restore.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { restoreTerminalState } from "../terminal/restore.js"; import { collectErrorGraphCandidates, extractErrorCode, diff --git a/src/logger.test.ts b/src/logger.test.ts index 3c2ddcf8baf..2463de99072 100644 --- a/src/logger.test.ts +++ b/src/logger.test.ts @@ -1,6 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; +import { theme } from "../packages/terminal-core/src/theme.js"; import { isVerbose, isYes, logVerbose, setVerbose, setYes } from "./globals.js"; import { logDebug, logError, logInfo, logSuccess, logWarn } from "./logger.js"; import { @@ -9,7 +10,6 @@ import { stripRedundantSubsystemPrefixForConsole, } from "./logging.js"; import type { RuntimeEnv } from "./runtime.js"; -import { theme } from "./terminal/theme.js"; import { withTempDirSync } from "./test-helpers/temp-dir.js"; describe("logger helpers", () => { diff --git a/src/logger.ts b/src/logger.ts index b69a5870d37..f20ee43a7c5 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,8 +1,8 @@ +import { theme } from "../packages/terminal-core/src/theme.js"; import { isVerbose } from "./global-state.js"; import { getLogger } from "./logging/logger.js"; import { createSubsystemLogger } from "./logging/subsystem.js"; import { defaultRuntime, type RuntimeEnv } from "./runtime.js"; -import { theme } from "./terminal/theme.js"; const subsystemPrefixRe = /^([a-z][a-z0-9-]{1,20}):\s+(.*)$/i; diff --git a/src/logging/console.ts b/src/logging/console.ts index fa80fff1ed9..04d1eb735fa 100644 --- a/src/logging/console.ts +++ b/src/logging/console.ts @@ -1,7 +1,7 @@ import util from "node:util"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../config/types.js"; import { isVerbose } from "../global-state.js"; -import { stripAnsi } from "../terminal/ansi.js"; import { readLoggingConfig, shouldSkipMutatingLoggingConfigRead } from "./config.js"; import { resolveEnvLogLevelOverride } from "./env-log-level.js"; import { type LogLevel, normalizeLogLevel } from "./levels.js"; diff --git a/src/logging/subsystem.ts b/src/logging/subsystem.ts index a2bc4798461..a0aa3b5228c 100644 --- a/src/logging/subsystem.ts +++ b/src/logging/subsystem.ts @@ -1,9 +1,9 @@ import { Chalk } from "chalk"; import type { Logger as TsLogger } from "tslog"; +import { clearActiveProgressLine } from "../../packages/terminal-core/src/progress-line.js"; import { isVerbose } from "../global-state.js"; import { defaultRuntime, type OutputRuntimeEnv, type RuntimeEnv } from "../runtime.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { clearActiveProgressLine } from "../terminal/progress-line.js"; import { formatConsoleTimestamp, getConsoleSettings, diff --git a/src/plugin-sdk/channel-policy.ts b/src/plugin-sdk/channel-policy.ts index 5f122fc08e2..78954b708fe 100644 --- a/src/plugin-sdk/channel-policy.ts +++ b/src/plugin-sdk/channel-policy.ts @@ -1,10 +1,10 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { createAllowlistProviderRestrictSendersWarningCollector } from "../channels/plugins/group-policy-warnings.js"; import type { ChannelSecurityAdapter } from "../channels/plugins/types.adapters.js"; import { collectProviderDangerousNameMatchingScopes } from "../config/dangerous-name-matching.js"; import type { GroupPolicy } from "../config/types.base.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { normalizeStringEntries, uniqueStrings } from "../shared/string-normalization.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { createScopedDmSecurityResolver } from "./channel-config-helpers.js"; /** Shared policy warnings and DM/group policy helpers for channel plugins. */ export type { diff --git a/src/plugin-sdk/channel-test-helpers.ts b/src/plugin-sdk/channel-test-helpers.ts index a2ea5f20254..f8c02f26212 100644 --- a/src/plugin-sdk/channel-test-helpers.ts +++ b/src/plugin-sdk/channel-test-helpers.ts @@ -51,4 +51,4 @@ export { formatLocalEnvelopeTimestamp, } from "./test-helpers/envelope-timestamp.js"; export { expectPairingReplyText, extractPairingCode } from "./test-helpers/pairing-reply.js"; -export { stripAnsi } from "../terminal/ansi.js"; +export { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; diff --git a/src/plugin-sdk/cli-runtime.ts b/src/plugin-sdk/cli-runtime.ts index e886ab2fb56..1566c518e93 100644 --- a/src/plugin-sdk/cli-runtime.ts +++ b/src/plugin-sdk/cli-runtime.ts @@ -16,7 +16,7 @@ export * from "../cli/parse-duration.js"; export { resolveCliArgvInvocation, type CliArgvInvocation } from "../cli/argv-invocation.js"; export { shouldEagerRegisterSubcommands } from "../cli/command-registration-policy.js"; export * from "../cli/wait.js"; -export { note } from "../terminal/note.js"; -export { stylePromptTitle } from "../terminal/prompt-style.js"; -export { theme } from "../terminal/theme.js"; +export { note } from "../../packages/terminal-core/src/note.js"; +export { stylePromptTitle } from "../../packages/terminal-core/src/prompt-style.js"; +export { theme } from "../../packages/terminal-core/src/theme.js"; export * from "../version.js"; diff --git a/src/plugin-sdk/memory-core-host-runtime-cli.ts b/src/plugin-sdk/memory-core-host-runtime-cli.ts index 63aa0ae42d7..7976dd23912 100644 --- a/src/plugin-sdk/memory-core-host-runtime-cli.ts +++ b/src/plugin-sdk/memory-core-host-runtime-cli.ts @@ -5,6 +5,6 @@ export { formatHelpExamples } from "../cli/help-format.js"; export { withProgress, withProgressTotals } from "../cli/progress.js"; export { isVerbose, setVerbose } from "../globals.js"; export { defaultRuntime } from "../runtime.js"; -export { formatDocsLink } from "../terminal/links.js"; -export { colorize, isRich, theme } from "../terminal/theme.js"; +export { formatDocsLink } from "../../packages/terminal-core/src/links.js"; +export { colorize, isRich, theme } from "../../packages/terminal-core/src/theme.js"; export { shortenHomeInString, shortenHomePath } from "../utils.js"; diff --git a/src/plugin-sdk/optional-channel-setup.ts b/src/plugin-sdk/optional-channel-setup.ts index 9ce204d35e0..f3cf8b18ce8 100644 --- a/src/plugin-sdk/optional-channel-setup.ts +++ b/src/plugin-sdk/optional-channel-setup.ts @@ -1,7 +1,7 @@ +import { formatDocsLink } from "../../packages/terminal-core/src/links.js"; import type { ChannelSetupWizard } from "../channels/plugins/setup-wizard-types.js"; import type { ChannelSetupAdapter } from "../channels/plugins/types.adapters.js"; import { DEFAULT_ACCOUNT_ID } from "../routing/session-key.js"; -import { formatDocsLink } from "../terminal/links.js"; type OptionalChannelSetupParams = { channel: string; diff --git a/src/plugin-sdk/setup-tools.ts b/src/plugin-sdk/setup-tools.ts index 89f463d5f06..bf2284e7eb2 100644 --- a/src/plugin-sdk/setup-tools.ts +++ b/src/plugin-sdk/setup-tools.ts @@ -2,5 +2,5 @@ export { formatCliCommand } from "../cli/command-format.js"; export { extractArchive } from "../infra/archive.js"; export { resolveBrewExecutable } from "../infra/brew.js"; export { detectBinary } from "../plugins/setup-binary.js"; -export { formatDocsLink } from "../terminal/links.js"; +export { formatDocsLink } from "../../packages/terminal-core/src/links.js"; export { CONFIG_DIR } from "../utils.js"; diff --git a/src/plugin-sdk/setup.ts b/src/plugin-sdk/setup.ts index f15e53f7059..d69417ffe07 100644 --- a/src/plugin-sdk/setup.ts +++ b/src/plugin-sdk/setup.ts @@ -25,7 +25,7 @@ export type { export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; export { formatCliCommand } from "../cli/command-format.js"; export { detectBinary } from "../plugins/setup-binary.js"; -export { formatDocsLink } from "../terminal/links.js"; +export { formatDocsLink } from "../../packages/terminal-core/src/links.js"; export { hasConfiguredSecretInput, normalizeSecretInputString } from "../config/types.secrets.js"; export { normalizeE164, pathExists } from "../utils.js"; diff --git a/src/plugin-sdk/test-fixtures.ts b/src/plugin-sdk/test-fixtures.ts index 1ccea0d0017..65f59b7e757 100644 --- a/src/plugin-sdk/test-fixtures.ts +++ b/src/plugin-sdk/test-fixtures.ts @@ -21,7 +21,7 @@ export { makeAgentUserMessage, } from "../agents/test-helpers/agent-message-fixtures.js"; export { peekSystemEvents, resetSystemEventsForTest } from "../infra/system-events.js"; -export { sanitizeTerminalText } from "../terminal/safe-text.js"; +export { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; export { countLines, hasBalancedFences } from "../test-utils/chunk-test-helpers.js"; export { expectGeneratedTokenPersistedToGatewayAuth } from "../test-utils/auth-token-assertions.js"; export { typedCases } from "../test-utils/typed-cases.js"; diff --git a/src/plugin-sdk/testing.ts b/src/plugin-sdk/testing.ts index ab2c76dc285..d70d85bab5c 100644 --- a/src/plugin-sdk/testing.ts +++ b/src/plugin-sdk/testing.ts @@ -164,7 +164,7 @@ export { mockPinnedHostnameResolution } from "../test-helpers/ssrf.js"; export { createOutboundTestPlugin, createTestRegistry } from "../test-utils/channel-plugins.js"; export { createWindowsCmdShimFixture } from "../test-helpers/windows-cmd-shim.js"; export { installCommonResolveTargetErrorCases } from "../test-helpers/resolve-target-error-cases.js"; -export { sanitizeTerminalText } from "../terminal/safe-text.js"; +export { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; export { withStateDirEnv } from "../test-helpers/state-dir-env.js"; export { countLines, hasBalancedFences } from "../test-utils/chunk-test-helpers.js"; export { expectGeneratedTokenPersistedToGatewayAuth } from "../test-utils/auth-token-assertions.js"; diff --git a/src/plugin-sdk/text-chunking.ts b/src/plugin-sdk/text-chunking.ts index 2bf1f456a42..79b62e5ca88 100644 --- a/src/plugin-sdk/text-chunking.ts +++ b/src/plugin-sdk/text-chunking.ts @@ -52,7 +52,7 @@ export { type ReasoningTagTrim, } from "../shared/text/reasoning-tags.js"; export { stripMarkdown } from "../shared/text/strip-markdown.js"; -export { sanitizeTerminalText } from "../terminal/safe-text.js"; +export { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; export { SYSTEM_MARK, hasSystemMark, prefixSystemMessage } from "../infra/system-message.ts"; export { stripInlineDirectiveTagsForDelivery, diff --git a/src/plugin-sdk/text-runtime.ts b/src/plugin-sdk/text-runtime.ts index c74331dd984..12505c166fa 100644 --- a/src/plugin-sdk/text-runtime.ts +++ b/src/plugin-sdk/text-runtime.ts @@ -23,7 +23,7 @@ export * from "../shared/text/auto-linked-file-ref.js"; export * from "../shared/text/code-regions.js"; export * from "../shared/text/reasoning-tags.js"; export * from "../shared/text/strip-markdown.js"; -export * from "../terminal/safe-text.js"; +export * from "../../packages/terminal-core/src/safe-text.js"; export * from "../infra/system-message.ts"; export * from "../utils/directive-tags.js"; export * from "../utils/chunk-items.js"; diff --git a/src/plugins/contracts/extension-package-project-boundaries.test.ts b/src/plugins/contracts/extension-package-project-boundaries.test.ts index c88857c9c13..48197a66063 100644 --- a/src/plugins/contracts/extension-package-project-boundaries.test.ts +++ b/src/plugins/contracts/extension-package-project-boundaries.test.ts @@ -196,6 +196,7 @@ describe("opt-in extension package boundaries", () => { expect(tsconfig.include).toEqual([ "../../packages/markdown-core/src/**/*.ts", "../../packages/media-generation-core/src/**/*.ts", + "../../packages/terminal-core/src/**/*.ts", "../../src/plugin-sdk/**/*.ts", "../../src/video-generation/dashscope-compatible.ts", "../../src/video-generation/types.ts", diff --git a/src/plugins/git-install.ts b/src/plugins/git-install.ts index 07133ce6d3d..2ef22f0647c 100644 --- a/src/plugins/git-install.ts +++ b/src/plugins/git-install.ts @@ -2,6 +2,7 @@ import "../infra/fs-safe-defaults.js"; import { createHash } from "node:crypto"; import path from "node:path"; import { redactSensitiveUrlLikeString } from "@openclaw/net-policy/redact-sensitive-url"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { withTempDir } from "../infra/install-source-utils.js"; import { replaceDirectoryAtomic } from "../infra/replace-file.js"; import { @@ -10,7 +11,6 @@ import { } from "../infra/safe-package-install.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { resolveUserPath } from "../utils.js"; import { resolveDefaultPluginGitDir } from "./install-paths.js"; import type { InstallSafetyOverrides } from "./install-security-scan.js"; diff --git a/src/plugins/manifest-registry.ts b/src/plugins/manifest-registry.ts index 41aa264146c..0079ab8765b 100644 --- a/src/plugins/manifest-registry.ts +++ b/src/plugins/manifest-registry.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../config/types.js"; import type { PluginInstallRecord } from "../config/types.plugins.js"; import { satisfiesPluginApiRange } from "../infra/clawhub.js"; @@ -9,7 +10,6 @@ import { normalizeOptionalTrimmedStringList, uniqueStrings, } from "../shared/string-normalization.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { resolveUserPath } from "../utils.js"; import { resolveCompatibilityHostVersion } from "../version.js"; import { loadBundleManifest } from "./bundle-manifest.js"; diff --git a/src/plugins/marketplace.ts b/src/plugins/marketplace.ts index 2c3952bf75c..c2d40031e85 100644 --- a/src/plugins/marketplace.ts +++ b/src/plugins/marketplace.ts @@ -2,6 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { redactSensitiveUrlLikeString } from "@openclaw/net-policy/redact-sensitive-url"; +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { resolveArchiveKind } from "../infra/archive.js"; import { formatErrorMessage } from "../infra/errors.js"; import { pathExists } from "../infra/fs-safe.js"; @@ -11,7 +12,6 @@ import { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js"; import { isPathInside } from "../infra/path-guards.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { resolveUserPath } from "../utils.js"; import type { InstallSafetyOverrides } from "./install-security-scan.js"; import { installPluginFromPath, type InstallPluginResult } from "./install.js"; diff --git a/src/plugins/provider-auth-choice.ts b/src/plugins/provider-auth-choice.ts index e98c94252db..2121a56cb91 100644 --- a/src/plugins/provider-auth-choice.ts +++ b/src/plugins/provider-auth-choice.ts @@ -1,3 +1,4 @@ +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { resolveDefaultAgentId, resolveAgentDir, @@ -9,7 +10,6 @@ import { resolveDefaultAgentWorkspaceDir } from "../agents/workspace.js"; import { normalizeAgentModelRefForConfig } from "../config/model-input.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { RuntimeEnv } from "../runtime.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { t } from "../wizard/i18n/index.js"; import type { WizardPrompter } from "../wizard/prompts.js"; import { enablePluginInConfig } from "./enable.js"; diff --git a/src/plugins/provider-auth-choices.ts b/src/plugins/provider-auth-choices.ts index 2bf96cf5c8a..bbd32636d6c 100644 --- a/src/plugins/provider-auth-choices.ts +++ b/src/plugins/provider-auth-choices.ts @@ -1,6 +1,6 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { resolveProviderIdForAuth } from "../agents/provider-auth-aliases.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { normalizePluginsConfig, resolveEffectiveEnableState } from "./config-state.js"; import { loadManifestMetadataSnapshot } from "./manifest-contract-eligibility.js"; import type { PluginManifestRecord } from "./manifest-registry.js"; diff --git a/src/plugins/provider-openai-codex-oauth-tls.ts b/src/plugins/provider-openai-codex-oauth-tls.ts index 8121a043beb..29546a2d910 100644 --- a/src/plugins/provider-openai-codex-oauth-tls.ts +++ b/src/plugins/provider-openai-codex-oauth-tls.ts @@ -1,9 +1,9 @@ import path from "node:path"; +import { note } from "../../packages/terminal-core/src/note.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { resolveTimerTimeoutMs } from "../shared/number-coercion.js"; import { asNullableObjectRecord } from "../shared/record-coerce.js"; -import { note } from "../terminal/note.js"; const TLS_CERT_ERROR_CODES = new Set([ "UNABLE_TO_GET_ISSUER_CERT_LOCALLY", diff --git a/src/plugins/provider-runtime.ts b/src/plugins/provider-runtime.ts index 1450628aee0..562705c614a 100644 --- a/src/plugins/provider-runtime.ts +++ b/src/plugins/provider-runtime.ts @@ -1,3 +1,4 @@ +import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import type { AuthProfileCredential, OAuthCredential } from "../agents/auth-profiles/types.js"; import { resolveGpt5SystemPromptContribution } from "../agents/gpt5-prompt-overlay.js"; import { @@ -11,7 +12,6 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { sortUniqueStrings, uniqueStrings } from "../shared/string-normalization.js"; -import { sanitizeForLog } from "../terminal/ansi.js"; import { normalizeProviderModelIdWithManifest } from "./manifest-model-id-normalization.js"; import { loadPluginMetadataSnapshot } from "./plugin-metadata-snapshot.js"; import { resolvePluginDiscoveryProvidersRuntime } from "./provider-discovery.runtime.js"; diff --git a/src/plugins/schema-validator.ts b/src/plugins/schema-validator.ts index 1b3c740427b..83ab872d5dd 100644 --- a/src/plugins/schema-validator.ts +++ b/src/plugins/schema-validator.ts @@ -1,5 +1,6 @@ import { Compile, type Validator as TypeBoxValidator } from "typebox/compile"; import { Format } from "typebox/format"; +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { appendAllowedValuesHint, summarizeAllowedValues } from "../config/allowed-values.js"; import { applyJsonSchemaDefaults, @@ -7,7 +8,6 @@ import { normalizeJsonSchemaForTypeBox, } from "../shared/json-schema-defaults.js"; import type { JsonSchemaObject } from "../shared/json-schema.types.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; import { PluginLruCache } from "./plugin-cache-primitives.js"; type TypeBoxValidationError = { diff --git a/src/plugins/sdk-alias.test.ts b/src/plugins/sdk-alias.test.ts index adc439d19a5..b5e998c49cb 100644 --- a/src/plugins/sdk-alias.test.ts +++ b/src/plugins/sdk-alias.test.ts @@ -1402,6 +1402,18 @@ describe("plugin sdk alias helpers", () => { srcFile: "model-ref.ts", distFile: "model-ref.mjs", }); + const terminalCore = writeWorkspacePackageEntry({ + root: fixture.root, + packageDir: "terminal-core", + srcFile: "index.ts", + distFile: "index.mjs", + }); + const terminalCoreTheme = writeWorkspacePackageEntry({ + root: fixture.root, + packageDir: "terminal-core", + srcFile: "theme.ts", + distFile: "theme.mjs", + }); const netPolicyIp = writeWorkspacePackageEntry({ root: fixture.root, packageDir: "net-policy", @@ -1416,6 +1428,8 @@ describe("plugin sdk alias helpers", () => { fs.rmSync(markdownCoreTables.distFile); fs.rmSync(mediaGenerationCore.distFile); fs.rmSync(mediaGenerationModelRef.distFile); + fs.rmSync(terminalCore.distFile); + fs.rmSync(terminalCoreTheme.distFile); fs.rmSync(netPolicy.distFile); fs.rmSync(netPolicyIp.distFile); const sourcePluginEntry = writePluginEntry( @@ -1451,6 +1465,12 @@ describe("plugin sdk alias helpers", () => { expect(fs.realpathSync(aliases["@openclaw/media-generation-core/model-ref"] ?? "")).toBe( fs.realpathSync(mediaGenerationModelRef.srcFile), ); + expect(fs.realpathSync(aliases["@openclaw/terminal-core"] ?? "")).toBe( + fs.realpathSync(terminalCore.srcFile), + ); + expect(fs.realpathSync(aliases["@openclaw/terminal-core/theme"] ?? "")).toBe( + fs.realpathSync(terminalCoreTheme.srcFile), + ); expect(fs.realpathSync(aliases["@openclaw/net-policy"] ?? "")).toBe( fs.realpathSync(netPolicy.srcFile), ); @@ -1485,6 +1505,15 @@ describe("plugin sdk alias helpers", () => { srcFile: "render.ts", distFile: "render.mjs", }); + const terminalCore = writeWorkspacePackageEntry({ + root: fixture.root, + packageDir: "terminal-core", + srcFile: "links.ts", + distFile: "links.mjs", + }); + const terminalCoreRootDistFile = path.join(fixture.root, "dist", "terminal-core", "links.js"); + mkdirSafeDir(path.dirname(terminalCoreRootDistFile)); + fs.writeFileSync(terminalCoreRootDistFile, "export {};\n", "utf-8"); const netPolicy = writeWorkspacePackageEntry({ root: fixture.root, packageDir: "net-policy", @@ -1512,6 +1541,9 @@ describe("plugin sdk alias helpers", () => { expect(fs.realpathSync(aliases["@openclaw/media-generation-core/catalog"] ?? "")).toBe( fs.realpathSync(mediaGenerationCore.distFile), ); + expect(fs.realpathSync(aliases["@openclaw/terminal-core/links"] ?? "")).toBe( + fs.realpathSync(terminalCoreRootDistFile), + ); expect(fs.realpathSync(aliases["@openclaw/net-policy/redact-sensitive-url"] ?? "")).toBe( fs.realpathSync(netPolicy.distFile), ); diff --git a/src/plugins/sdk-alias.ts b/src/plugins/sdk-alias.ts index 4a769b179ad..9cc6faaf887 100644 --- a/src/plugins/sdk-alias.ts +++ b/src/plugins/sdk-alias.ts @@ -658,6 +658,132 @@ const WORKSPACE_PACKAGE_ALIAS_ENTRIES = [ srcFile: "normalization.ts", distFile: "normalization.mjs", }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "", + srcFile: "index.ts", + distFile: "index.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "ansi", + srcFile: "ansi.ts", + distFile: "ansi.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "decorative-emoji", + srcFile: "decorative-emoji.ts", + distFile: "decorative-emoji.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "health-style", + srcFile: "health-style.ts", + distFile: "health-style.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "links", + srcFile: "links.ts", + distFile: "links.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "note", + srcFile: "note.ts", + distFile: "note.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "osc-progress", + srcFile: "osc-progress.ts", + distFile: "osc-progress.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "palette", + srcFile: "palette.ts", + distFile: "palette.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "progress-line", + srcFile: "progress-line.ts", + distFile: "progress-line.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "prompt-select-styled", + srcFile: "prompt-select-styled.ts", + distFile: "prompt-select-styled.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "prompt-select-styled-params", + srcFile: "prompt-select-styled-params.ts", + distFile: "prompt-select-styled-params.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "prompt-style", + srcFile: "prompt-style.ts", + distFile: "prompt-style.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "restore", + srcFile: "restore.ts", + distFile: "restore.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "safe-text", + srcFile: "safe-text.ts", + distFile: "safe-text.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "stream-writer", + srcFile: "stream-writer.ts", + distFile: "stream-writer.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "table", + srcFile: "table.ts", + distFile: "table.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "terminal-link", + srcFile: "terminal-link.ts", + distFile: "terminal-link.mjs", + }, + { + packageName: "@openclaw/terminal-core", + packageDir: "terminal-core", + subpath: "theme", + srcFile: "theme.ts", + distFile: "theme.mjs", + }, { packageName: "@openclaw/net-policy", packageDir: "net-policy", @@ -899,15 +1025,27 @@ function resolveWorkspacePackageAliasMap(params: { for (const entry of WORKSPACE_PACKAGE_ALIAS_ENTRIES) { const alias = entry.subpath ? `${entry.packageName}/${entry.subpath}` : entry.packageName; for (const kind of orderedKinds) { - const candidate = + const candidates = kind === "dist" - ? path.join(packageRoot, "packages", entry.packageDir, "dist", entry.distFile) - : path.join(packageRoot, "packages", entry.packageDir, "src", entry.srcFile); - if (!fs.existsSync(candidate)) { - continue; + ? [ + ...(entry.packageName === "@openclaw/terminal-core" + ? [ + path.join( + packageRoot, + "dist", + "terminal-core", + entry.distFile.replace(/\.mjs$/u, ".js"), + ), + ] + : []), + path.join(packageRoot, "packages", entry.packageDir, "dist", entry.distFile), + ] + : [path.join(packageRoot, "packages", entry.packageDir, "src", entry.srcFile)]; + const candidate = candidates.find((candidatePath) => fs.existsSync(candidatePath)); + if (candidate) { + aliasMap[alias] = normalizeJitiAliasTargetPath(candidate); + break; } - aliasMap[alias] = normalizeJitiAliasTargetPath(candidate); - break; } } return aliasMap; diff --git a/src/runtime.ts b/src/runtime.ts index 76f32123c0d..11b10b80f9a 100644 --- a/src/runtime.ts +++ b/src/runtime.ts @@ -1,5 +1,5 @@ -import { clearActiveProgressLine } from "./terminal/progress-line.js"; -import { restoreTerminalState } from "./terminal/restore.js"; +import { clearActiveProgressLine } from "../packages/terminal-core/src/progress-line.js"; +import { restoreTerminalState } from "../packages/terminal-core/src/restore.js"; export type RuntimeEnv = { log: (...args: unknown[]) => void; diff --git a/src/skills/lifecycle/source-install.ts b/src/skills/lifecycle/source-install.ts index d7e78cb8df0..93be09759eb 100644 --- a/src/skills/lifecycle/source-install.ts +++ b/src/skills/lifecycle/source-install.ts @@ -1,13 +1,13 @@ import fs from "node:fs/promises"; import path from "node:path"; import { redactSensitiveUrlLikeString } from "@openclaw/net-policy/redact-sensitive-url"; +import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import { sanitizeHostExecEnv } from "../../infra/host-env-security.js"; import { withTempDir } from "../../infra/install-source-utils.js"; import { writeJson } from "../../infra/json-files.js"; import { parseGitPluginSpec } from "../../plugins/git-install.js"; import { runCommandWithTimeout } from "../../process/exec.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; -import { sanitizeForLog } from "../../terminal/ansi.js"; import { resolveUserPath } from "../../utils.js"; import { parseFrontmatter } from "../loading/frontmatter.js"; import { installExtractedSkillRoot, validateRequestedSkillSlug } from "./archive-install.js"; diff --git a/src/status/agent-runtime-label.ts b/src/status/agent-runtime-label.ts index 5f768db1dbe..9aaf8af0c9c 100644 --- a/src/status/agent-runtime-label.ts +++ b/src/status/agent-runtime-label.ts @@ -1,3 +1,4 @@ +import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text.js"; import { isCliProvider } from "../agents/model-selection.js"; import type { SessionEntry } from "../config/sessions/types.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; @@ -5,7 +6,6 @@ import { normalizeOptionalLowercaseString, normalizeOptionalString, } from "../shared/string-coerce.js"; -import { sanitizeTerminalText } from "../terminal/safe-text.js"; const AGENT_RUNTIME_LABELS: Readonly> = { openclaw: "OpenClaw Default", diff --git a/src/tui/components/searchable-select-list.test.ts b/src/tui/components/searchable-select-list.test.ts index 6eab893f698..bd342429606 100644 --- a/src/tui/components/searchable-select-list.test.ts +++ b/src/tui/components/searchable-select-list.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { stripAnsi, visibleWidth } from "../../terminal/ansi.js"; +import { stripAnsi, visibleWidth } from "../../../packages/terminal-core/src/ansi.js"; import { SearchableSelectList, type SearchableSelectListTheme } from "./searchable-select-list.js"; const mockTheme: SearchableSelectListTheme = { diff --git a/src/tui/components/searchable-select-list.ts b/src/tui/components/searchable-select-list.ts index 84aebac1e5e..935b3a4bd3c 100644 --- a/src/tui/components/searchable-select-list.ts +++ b/src/tui/components/searchable-select-list.ts @@ -7,9 +7,9 @@ import { type SelectListTheme, truncateToWidth, } from "@earendil-works/pi-tui"; +import { stripAnsi, visibleWidth } from "../../../packages/terminal-core/src/ansi.js"; import { normalizeLowercaseStringOrEmpty } from "../../shared/string-coerce.js"; import { uniqueStrings } from "../../shared/string-normalization.js"; -import { stripAnsi, visibleWidth } from "../../terminal/ansi.js"; import { findWordBoundaryIndex, fuzzyFilterLower } from "./fuzzy-filter.js"; const ANSI_ESCAPE = String.fromCharCode(27); diff --git a/src/tui/tui-formatters.ts b/src/tui/tui-formatters.ts index 4fb56cfad30..d7bc6f78e8a 100644 --- a/src/tui/tui-formatters.ts +++ b/src/tui/tui-formatters.ts @@ -1,8 +1,8 @@ +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; import { stripLeadingInboundMetadata } from "../auto-reply/reply/strip-inbound-meta.js"; import type { SessionGoal } from "../config/sessions/types.js"; import { formatRawAssistantErrorForUi } from "../shared/assistant-error-format.js"; import { extractAssistantVisibleText } from "../shared/chat-message-content.js"; -import { stripAnsi } from "../terminal/ansi.js"; import { formatTokenCount } from "../utils/usage-format.js"; const REPLACEMENT_CHAR_RE = /\uFFFD/g; diff --git a/src/wizard/clack-prompter.ts b/src/wizard/clack-prompter.ts index 62b045fa64a..6e837a9717e 100644 --- a/src/wizard/clack-prompter.ts +++ b/src/wizard/clack-prompter.ts @@ -13,12 +13,16 @@ import { spinner, text, } from "@clack/prompts"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; +import { note as emitNote } from "../../packages/terminal-core/src/note.js"; +import { + stylePromptHint, + stylePromptMessage, + stylePromptTitle, +} from "../../packages/terminal-core/src/prompt-style.js"; +import { theme } from "../../packages/terminal-core/src/theme.js"; import { createCliProgress } from "../cli/progress.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -import { stripAnsi } from "../terminal/ansi.js"; -import { note as emitNote } from "../terminal/note.js"; -import { stylePromptHint, stylePromptMessage, stylePromptTitle } from "../terminal/prompt-style.js"; -import { theme } from "../terminal/theme.js"; import type { WizardProgress, WizardPrompter } from "./prompts.js"; import { WizardCancelledError } from "./prompts.js"; diff --git a/src/wizard/setup.finalize.test.ts b/src/wizard/setup.finalize.test.ts index 431401722bf..095fc17db9e 100644 --- a/src/wizard/setup.finalize.test.ts +++ b/src/wizard/setup.finalize.test.ts @@ -150,7 +150,7 @@ vi.mock("../infra/control-ui-assets.js", () => ({ ensureControlUiAssetsBuilt: vi.fn(async () => ({ ok: true })), })); -vi.mock("../terminal/restore.js", () => ({ +vi.mock("../../packages/terminal-core/src/restore.js", () => ({ restoreTerminalState, })); diff --git a/src/wizard/setup.finalize.ts b/src/wizard/setup.finalize.ts index 7975e307e27..299eac6e4b1 100644 --- a/src/wizard/setup.finalize.ts +++ b/src/wizard/setup.finalize.ts @@ -1,5 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { restoreTerminalState } from "../../packages/terminal-core/src/restore.js"; import { resolveDefaultAgentDir } from "../agents/agent-scope-config.js"; import { describeCodexNativeWebSearch } from "../agents/codex-native-web-search.shared.js"; import { hasAuthProfileForProvider } from "../agents/tools/model-config.helpers.js"; @@ -31,7 +32,6 @@ import { isSystemdUserServiceAvailable } from "../daemon/systemd.js"; import { ensureControlUiAssetsBuilt } from "../infra/control-ui-assets.js"; import { formatErrorMessage } from "../infra/errors.js"; import type { RuntimeEnv } from "../runtime.js"; -import { restoreTerminalState } from "../terminal/restore.js"; import { launchTuiCli } from "../tui/tui-launch.js"; import { resolveUserPath } from "../utils.js"; import { listConfiguredWebSearchProviders } from "../web-search/runtime.js"; diff --git a/test/helpers/normalize-text.ts b/test/helpers/normalize-text.ts index a5134255ffd..ffd58789311 100644 --- a/test/helpers/normalize-text.ts +++ b/test/helpers/normalize-text.ts @@ -1,4 +1,4 @@ -import { stripAnsi } from "../../src/terminal/ansi.js"; +import { stripAnsi } from "../../packages/terminal-core/src/ansi.js"; export function normalizeTestText(input: string): string { return stripAnsi(input) diff --git a/test/scripts/write-cli-startup-metadata.test.ts b/test/scripts/write-cli-startup-metadata.test.ts index fafd8bf9eb3..ac5e8553b8b 100644 --- a/test/scripts/write-cli-startup-metadata.test.ts +++ b/test/scripts/write-cli-startup-metadata.test.ts @@ -38,8 +38,8 @@ function writeStartupMetadataSourceSignatureFixture(rootDir: string): void { "export const pluginCommandGroups = 'plugins';\n", ], ["src/cli/secrets-cli.ts", "export const secretsHelp = 'secrets';\n"], - ["src/terminal/links.ts", "export const links = 'links';\n"], - ["src/terminal/theme.ts", "export const theme = 'theme';\n"], + ["packages/terminal-core/src/links.ts", "export const links = 'links';\n"], + ["packages/terminal-core/src/theme.ts", "export const theme = 'theme';\n"], ]); for (const [relativePath, contents] of fixtures) { writeFixtureFile(rootDir, relativePath, contents); diff --git a/test/vitest/vitest.unit-fast-paths.mjs b/test/vitest/vitest.unit-fast-paths.mjs index b148729ff26..3d1c037da5f 100644 --- a/test/vitest/vitest.unit-fast-paths.mjs +++ b/test/vitest/vitest.unit-fast-paths.mjs @@ -32,6 +32,7 @@ const unitFastCandidateGlobs = [ "src/link-understanding/**/*.test.ts", "src/logging/**/*.test.ts", "packages/markdown-core/src/**/*.test.ts", + "packages/terminal-core/src/**/*.test.ts", "src/media/**/*.test.ts", "src/media-generation/**/*.test.ts", "src/media-understanding/**/*.test.ts", @@ -48,7 +49,6 @@ const unitFastCandidateGlobs = [ "src/routing/**/*.test.ts", "src/sessions/**/*.test.ts", "src/shared/**/*.test.ts", - "src/terminal/**/*.test.ts", "src/test-utils/**/*.test.ts", "src/tasks/**/*.test.ts", "src/tts/**/*.test.ts", @@ -190,8 +190,8 @@ export const forcedUnitFastTestFiles = [ "src/tts/status-config.test.ts", "src/tts/tts-config.test.ts", "src/ui-app-settings.agents-files-refresh.test.ts", - "src/terminal/restore.test.ts", - "src/terminal/table.test.ts", + "packages/terminal-core/src/restore.test.ts", + "packages/terminal-core/src/table.test.ts", "src/test-helpers/state-dir-env.test.ts", "src/test-utils/env.test.ts", "src/test-utils/openclaw-test-state.test.ts", diff --git a/tsconfig.json b/tsconfig.json index 6a5d45986e8..ba0d5c255e8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -77,6 +77,41 @@ "@openclaw/markdown-core/tables": ["./packages/markdown-core/src/tables.ts"], "@openclaw/markdown-core/types": ["./packages/markdown-core/src/types.ts"], "@openclaw/markdown-core/*": ["./packages/markdown-core/src/*"], + "@openclaw/terminal-core": ["./packages/terminal-core/src/index.ts"], + "@openclaw/terminal-core/ansi": ["./packages/terminal-core/src/ansi.ts"], + "@openclaw/terminal-core/decorative-emoji": [ + "./packages/terminal-core/src/decorative-emoji.ts" + ], + "@openclaw/terminal-core/health-style": [ + "./packages/terminal-core/src/health-style.ts" + ], + "@openclaw/terminal-core/links": ["./packages/terminal-core/src/links.ts"], + "@openclaw/terminal-core/note": ["./packages/terminal-core/src/note.ts"], + "@openclaw/terminal-core/osc-progress": ["./packages/terminal-core/src/osc-progress.ts"], + "@openclaw/terminal-core/palette": ["./packages/terminal-core/src/palette.ts"], + "@openclaw/terminal-core/progress-line": [ + "./packages/terminal-core/src/progress-line.ts" + ], + "@openclaw/terminal-core/prompt-select-styled": [ + "./packages/terminal-core/src/prompt-select-styled.ts" + ], + "@openclaw/terminal-core/prompt-select-styled-params": [ + "./packages/terminal-core/src/prompt-select-styled-params.ts" + ], + "@openclaw/terminal-core/prompt-style": [ + "./packages/terminal-core/src/prompt-style.ts" + ], + "@openclaw/terminal-core/restore": ["./packages/terminal-core/src/restore.ts"], + "@openclaw/terminal-core/safe-text": ["./packages/terminal-core/src/safe-text.ts"], + "@openclaw/terminal-core/stream-writer": [ + "./packages/terminal-core/src/stream-writer.ts" + ], + "@openclaw/terminal-core/table": ["./packages/terminal-core/src/table.ts"], + "@openclaw/terminal-core/terminal-link": [ + "./packages/terminal-core/src/terminal-link.ts" + ], + "@openclaw/terminal-core/theme": ["./packages/terminal-core/src/theme.ts"], + "@openclaw/terminal-core/*": ["./packages/terminal-core/src/*"], "@openclaw/net-policy": ["./packages/net-policy/src/index.ts"], "@openclaw/net-policy/ip": ["./packages/net-policy/src/ip.ts"], "@openclaw/net-policy/ipv4": ["./packages/net-policy/src/ipv4.ts"], diff --git a/tsconfig.plugin-sdk.dts.json b/tsconfig.plugin-sdk.dts.json index 4116aaf437c..3d2836e45ef 100644 --- a/tsconfig.plugin-sdk.dts.json +++ b/tsconfig.plugin-sdk.dts.json @@ -17,6 +17,7 @@ "packages/markdown-core/src/**/*.ts", "packages/media-generation-core/src/**/*.ts", "packages/memory-host-sdk/src/**/*.ts", + "packages/terminal-core/src/**/*.ts", "src/video-generation/dashscope-compatible.ts", "src/video-generation/types.ts", "src/types/**/*.d.ts" diff --git a/tsdown.config.ts b/tsdown.config.ts index af1f47fccdb..ccd27f00369 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -408,6 +408,29 @@ function buildMarkdownCoreDistEntries(): Record { }; } +function buildTerminalCoreDistEntries(): Record { + return { + index: "packages/terminal-core/src/index.ts", + ansi: "packages/terminal-core/src/ansi.ts", + "decorative-emoji": "packages/terminal-core/src/decorative-emoji.ts", + "health-style": "packages/terminal-core/src/health-style.ts", + links: "packages/terminal-core/src/links.ts", + note: "packages/terminal-core/src/note.ts", + "osc-progress": "packages/terminal-core/src/osc-progress.ts", + palette: "packages/terminal-core/src/palette.ts", + "progress-line": "packages/terminal-core/src/progress-line.ts", + "prompt-select-styled": "packages/terminal-core/src/prompt-select-styled.ts", + "prompt-select-styled-params": "packages/terminal-core/src/prompt-select-styled-params.ts", + "prompt-style": "packages/terminal-core/src/prompt-style.ts", + restore: "packages/terminal-core/src/restore.ts", + "safe-text": "packages/terminal-core/src/safe-text.ts", + "stream-writer": "packages/terminal-core/src/stream-writer.ts", + table: "packages/terminal-core/src/table.ts", + "terminal-link": "packages/terminal-core/src/terminal-link.ts", + theme: "packages/terminal-core/src/theme.ts", + }; +} + function buildSpeechCoreDistEntries(): Record { return { api: "packages/speech-core/api.ts", @@ -484,6 +507,10 @@ function shouldExternalizeMarkdownCoreDependency(id: string): boolean { ); } +function shouldExternalizeTerminalCoreDependency(id: string): boolean { + return id === "@clack/prompts" || id.startsWith("@clack/prompts/") || id === "chalk"; +} + const coreDistEntries = buildCoreDistEntries(); const dockerE2eHarnessEntries = buildDockerE2eHarnessEntries(); const rootBundledPluginBuildEntries = bundledPluginBuildEntries.filter( @@ -494,6 +521,12 @@ function buildUnifiedDistEntries(): Record { return { ...coreDistEntries, ...dockerE2eHarnessEntries, + ...Object.fromEntries( + Object.entries(buildTerminalCoreDistEntries()).map(([entry, source]) => [ + `terminal-core/${entry}`, + source, + ]), + ), // Internal compat artifact for the root-alias.cjs lazy loader. "plugin-sdk/compat": "src/plugin-sdk/compat.ts", // Private bundled Codex helper for app-server user MCP config projection. @@ -568,6 +601,15 @@ export default defineConfig([ neverBundle: shouldExternalizeMarkdownCoreDependency, }, }), + nodeWorkspacePackageBuildConfig({ + clean: true, + dts: RUN_NODE_SKIP_DTS_BUILD ? false : undefined, + entry: buildTerminalCoreDistEntries(), + outDir: "packages/terminal-core/dist", + deps: { + neverBundle: shouldExternalizeTerminalCoreDependency, + }, + }), nodeWorkspacePackageBuildConfig({ clean: true, dts: RUN_NODE_SKIP_DTS_BUILD ? false : undefined, diff --git a/ui/src/ui/controllers/logs.ts b/ui/src/ui/controllers/logs.ts index 966d559e569..df3e0017ebd 100644 --- a/ui/src/ui/controllers/logs.ts +++ b/ui/src/ui/controllers/logs.ts @@ -1,4 +1,4 @@ -import { stripAnsi } from "../../../../src/terminal/ansi.js"; +import { stripAnsi } from "../../../../packages/terminal-core/src/ansi.js"; import type { GatewayBrowserClient } from "../gateway.ts"; import { normalizeLowercaseStringOrEmpty } from "../string-coerce.ts"; import type { LogEntry, LogLevel } from "../types.ts";