From e2ec8283c40d186947805f9702fdc784202c8cf7 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 13 Jul 2026 00:42:56 -0700 Subject: [PATCH] refactor(deadcode): trim mid-size src exports (#105888) * refactor(deadcode): trim auto-reply and CLI exports * refactor(deadcode): trim cron and task exports * refactor(deadcode): trim fleet and process exports * test(deadcode): exercise live task and process seams * test(fleet): cover stream redaction through owner module * refactor(security): trim dead internal exports * refactor(secrets): trim dead internal exports * refactor(deadcode): trim remaining src exports * refactor(deadcode): remove test-only runtime exports * refactor(deadcode): trim pairing test exports * refactor(deadcode): reconcile refreshed baseline * test(auto-reply): deduplicate queue state imports --- scripts/deadcode-exports.baseline.mjs | 658 ------------------ src/acp/runtime/adapter-contract.testkit.ts | 2 +- src/acp/runtime/session-meta.ts | 2 +- src/agents/anthropic.setup-token.live.test.ts | 6 +- ...ash-tools.exec-foreground-failures.test.ts | 3 +- ...sh-tools.exec-runtime.pty-fallback.test.ts | 3 +- ...-agent-runner-extraparams-moonshot.test.ts | 2 +- .../embedded-agent-runner.guard.test.ts | 6 +- .../run/attempt.async-tasks.test.ts | 3 +- src/agents/identity-avatar-file.test.ts | 3 +- src/agents/identity-avatar.test.ts | 3 +- src/agents/sessions/sdk.test.ts | 6 +- src/audit/audit-event-types.ts | 10 +- src/audit/audit-identity.ts | 4 +- src/audit/audit-recorder.ts | 2 +- src/auto-reply/dispatch.test.ts | 3 +- src/auto-reply/dispatch.ts | 2 +- src/auto-reply/fallback-state.test.ts | 5 +- src/auto-reply/fallback-state.ts | 5 - src/auto-reply/reply-payload.ts | 2 +- src/auto-reply/reply.ts | 11 - src/auto-reply/reply/abort.test.ts | 3 +- src/auto-reply/reply/abort.ts | 2 - src/auto-reply/reply/agent-runner-memory.ts | 2 +- src/auto-reply/reply/commands-acp/shared.ts | 8 +- src/auto-reply/reply/commands-info.ts | 2 - src/auto-reply/reply/commands-slash-parse.ts | 2 +- .../reply/commands-steer.runtime.ts | 1 - .../reply/commands-subagents-dispatch.ts | 1 - .../reply/commands-subagents-routing.test.ts | 2 +- .../reply/directive-handling.model-runtime.ts | 2 +- .../reply/directive-handling.model.test.ts | 7 +- .../reply/directive-handling.model.ts | 1 - .../reply/directive-handling.params.ts | 2 +- .../reply/directive-handling.persist.ts | 2 +- src/auto-reply/reply/directives.ts | 4 +- .../reply/dispatch-acp-delivery.test.ts | 3 +- src/auto-reply/reply/dispatch-acp-delivery.ts | 2 +- src/auto-reply/reply/dispatch-acp.test.ts | 2 +- ...ispatch-from-config.reply-dispatch.test.ts | 3 +- .../reply/dispatch-from-config.runtime.ts | 25 +- ...ispatch-from-config.shared.test-harness.ts | 3 +- .../reply/dispatch-from-config.test.ts | 10 +- src/auto-reply/reply/dispatch-from-config.ts | 5 +- src/auto-reply/reply/exec.ts | 2 - src/auto-reply/reply/followup-runner.test.ts | 5 +- src/auto-reply/reply/history.ts | 2 +- src/auto-reply/reply/inbound-media.ts | 2 +- src/auto-reply/reply/mentions.ts | 2 +- src/auto-reply/reply/prompt-prelude.ts | 4 +- .../provider-request-error-classifier.ts | 4 +- src/auto-reply/reply/queue.collect.test.ts | 3 +- src/auto-reply/reply/queue.dedupe.test.ts | 7 +- .../reply/queue.drain-restart.test.ts | 3 +- src/auto-reply/reply/queue.in-flight.test.ts | 3 +- src/auto-reply/reply/queue.ts | 16 +- src/auto-reply/reply/queue/state.ts | 2 +- src/auto-reply/reply/queue/types.ts | 2 +- src/auto-reply/reply/reply-dispatcher.ts | 2 - .../reply/reply-operation-run-state.ts | 2 +- src/auto-reply/reply/reply-payloads.test.ts | 2 +- src/auto-reply/reply/reply-payloads.ts | 1 - src/auto-reply/reply/reply-run-registry.ts | 18 +- src/auto-reply/reply/reply-turn-admission.ts | 4 +- src/auto-reply/reply/session-delivery.ts | 2 +- src/auto-reply/reply/session-fork.ts | 2 +- src/auto-reply/reply/session-updates.ts | 2 - src/auto-reply/reply/session.test.ts | 2 +- src/auto-reply/reply/session.ts | 4 +- src/auto-reply/reply/typing-mode.ts | 2 +- src/auto-reply/status.test.ts | 10 +- src/auto-reply/status.ts | 8 +- src/auto-reply/thinking.shared.ts | 9 +- src/auto-reply/thinking.test.ts | 28 - src/auto-reply/thinking.ts | 6 +- src/auto-reply/types.ts | 7 - src/auto-reply/usage-bar/template.ts | 2 +- src/cli/argv.test.ts | 51 -- src/cli/argv.ts | 10 +- src/cli/clawhub-risk-acknowledgement.ts | 2 +- src/cli/cron-cli/schedule-options.ts | 2 +- src/cli/daemon-cli/response.ts | 6 +- src/cli/gateway-cli/qa-parent-watchdog.ts | 2 +- src/cli/gateway-cli/run.ts | 1 - src/cli/help-format.ts | 2 +- src/cli/nodes-camera.ts | 4 +- src/cli/nodes-screen.ts | 4 +- src/cli/plugins-cli.ts | 2 +- src/cli/plugins-location-bridges.ts | 2 +- src/cli/plugins-search-command.ts | 2 +- src/cli/ports.ts | 2 +- src/cli/precomputed-help.ts | 2 +- src/cli/program/command-descriptor-utils.ts | 4 +- src/cli/program/command-group-descriptors.ts | 2 +- src/cli/program/command-registry-core.ts | 7 +- src/cli/program/command-registry.ts | 6 - src/cli/program/core-command-descriptors.ts | 2 +- src/cli/program/register-command-groups.ts | 2 +- src/cli/program/register.subclis-core.ts | 3 - src/cli/program/register.subclis.ts | 3 - .../program/root-command-descriptions.test.ts | 7 +- src/cli/program/routes.ts | 1 - src/cli/shared/parse-port.ts | 1 - src/cli/startup-trace.ts | 2 +- .../update-cli/plugin-payload-validation.ts | 4 +- .../post-core-plugin-convergence.ts | 4 +- src/cli/update-cli/progress.ts | 2 +- src/commands/auth-choice.model-check.ts | 2 +- src/commands/auth-token.ts | 5 +- src/commands/backup-shared.ts | 8 +- src/commands/configure.gateway-auth.test.ts | 2 +- src/commands/configure.ts | 4 +- src/commands/crestodian-with-inference.ts | 2 +- src/commands/daemon-install-helpers.test.ts | 7 +- src/commands/daemon-install-helpers.ts | 2 - src/commands/doctor-completion.ts | 4 +- src/commands/doctor-config-flow.test.ts | 2 +- src/commands/doctor-plugin-registry.ts | 2 +- src/commands/doctor-session-snapshots.ts | 2 +- .../doctor-session-sqlite-github-issue.ts | 2 +- .../doctor-session-sqlite-migration-run.ts | 11 +- src/commands/doctor-session-sqlite-readers.ts | 12 +- .../doctor-session-sqlite-recover-report.ts | 2 +- src/commands/doctor-session-sqlite-types.ts | 6 +- src/commands/doctor-session-transcripts.ts | 2 +- src/commands/doctor-skills.test.ts | 4 +- src/commands/doctor-skills.ts | 5 - src/commands/doctor-sqlite-compact.ts | 2 +- src/commands/doctor-state-migrations.test.ts | 4 +- .../doctor/cron/legacy-store-migration.ts | 2 +- src/commands/doctor/cron/payload-migration.ts | 4 +- .../doctor/shared/channel-plugin-blockers.ts | 2 +- .../doctor/shared/codex-route-warnings.ts | 2 +- src/commands/doctor/shared/exec-safe-bins.ts | 4 +- .../legacy-config-state-migration-input.ts | 2 +- .../doctor/shared/legacy-tools-by-sender.ts | 2 +- .../shared/legacy-web-search-migrate.ts | 2 +- .../missing-configured-plugin-install.ts | 4 +- .../shared/plugin-dependency-cleanup.ts | 2 +- .../shared/plugin-registry-migration.ts | 9 +- .../doctor/shared/plugin-runtime-symlinks.ts | 4 +- .../doctor/shared/preview-warnings.ts | 2 +- .../doctor/shared/stale-auth-order.ts | 2 +- .../doctor/shared/stale-subagent-allowlist.ts | 2 +- src/commands/doctor/types.ts | 2 +- src/commands/gateway-status/output.ts | 2 +- src/commands/health.types.ts | 2 +- src/commands/models/list.auth-index.ts | 2 +- src/commands/models/load-config.ts | 2 +- src/commands/models/shared.ts | 4 +- src/commands/onboard-custom-config.test.ts | 17 +- src/commands/onboard-custom-config.ts | 5 - src/commands/onboard-custom.ts | 10 - src/commands/onboard-inference.ts | 8 +- .../onboard-non-interactive/api-keys.ts | 2 +- src/commands/onboard.test.ts | 6 +- src/commands/onboard.ts | 2 - src/commands/promos/claim.ts | 2 +- src/commands/reset.ts | 4 +- src/commands/runtime-plugin-install.ts | 10 +- src/commands/sessions-compact.ts | 2 +- src/commands/sessions.ts | 1 - src/commands/status-all/channels.ts | 2 +- src/commands/status-runtime-shared.test.ts | 105 --- src/commands/status-runtime-shared.ts | 4 +- src/commands/status.service-summary.test.ts | 2 +- src/commands/uninstall.ts | 2 +- src/commitments/types.ts | 2 +- src/context-engine/host-compat.ts | 2 +- src/context-engine/quarantine-health.ts | 2 +- src/context-engine/registry.ts | 6 +- src/context-engine/types.ts | 2 +- src/crestodian/agent-turn.ts | 4 +- src/crestodian/assistant-prompts.ts | 2 - src/crestodian/chat-engine.ts | 4 +- src/crestodian/inference-error.ts | 2 +- src/crestodian/inference-route.ts | 14 - src/crestodian/rescue-message.ts | 2 +- src/crestodian/verified-inference.ts | 4 +- src/cron/delivery-plan.ts | 4 +- src/cron/delivery.ts | 18 +- src/cron/isolated-agent.ts | 3 +- .../delivery-dispatch.double-announce.test.ts | 2 +- src/cron/isolated-agent/delivery-dispatch.ts | 4 +- src/cron/isolated-agent/helpers.ts | 2 +- src/cron/isolated-agent/model-selection.ts | 4 +- .../isolated-agent/run-execution.runtime.ts | 8 - src/cron/isolated-agent/run-session-state.ts | 2 +- src/cron/isolated-agent/run.runtime.ts | 3 +- .../source-delivery-fallback.ts | 2 +- src/cron/persisted-shape.ts | 2 +- src/cron/retry-hint.ts | 2 +- src/cron/service.delivery-plan.test.ts | 3 +- ...runs-one-shot-main-job-disables-it.test.ts | 3 +- src/cron/service.test-harness.ts | 3 +- src/cron/service.trigger-eval.test.ts | 3 +- src/cron/service.ts | 2 +- src/cron/service/agent-watchdog.ts | 2 +- src/cron/service/state.ts | 4 +- src/cron/service/timer.regression.test.ts | 2 +- src/cron/service/timer.ts | 7 +- src/cron/store.ts | 1 - src/cron/types.ts | 12 +- src/daemon/launchd-current-service.ts | 2 +- src/daemon/launchd-restart-handoff.ts | 1 - src/daemon/restart-logs.ts | 2 +- src/daemon/schtasks.ts | 2 +- src/daemon/service-runtime.ts | 2 +- src/daemon/service.ts | 7 - src/daemon/systemd.ts | 2 +- src/fleet/backup.runtime.ts | 8 +- src/fleet/cell-profile.ts | 6 +- src/fleet/containers.redaction.ts | 64 ++ src/fleet/containers.runtime.test.ts | 8 +- src/fleet/containers.runtime.ts | 77 +- src/fleet/doctor.runtime.ts | 4 +- src/fleet/registry.ts | 2 +- src/fleet/service-support.runtime.ts | 8 +- src/fleet/service.runtime.ts | 10 +- src/flows/doctor-lint-flow.ts | 2 +- src/flows/doctor-repair-flow.ts | 4 +- src/flows/doctor-tool-result-cap-advice.ts | 4 +- src/flows/health-check-runner-types.ts | 4 +- src/flows/health-checks.ts | 2 +- src/gateway/assistant-identity.test.ts | 3 +- src/gateway/control-ui.http.test.ts | 3 +- .../chat.directive-tags.test.ts | 13 - src/gateway/server-methods/tasks.test.ts | 4 +- .../server-runtime-subscriptions.test.ts | 4 +- src/gateway/session-message-events.test.ts | 7 +- src/gateway/sessions-history-http.test.ts | 7 +- src/gateway/test-helpers.server.ts | 6 +- .../bootstrap-extra-files/handler.test.ts | 6 +- .../bundled/session-memory/handler.test.ts | 2 +- src/hooks/gmail-watcher-lifecycle.ts | 2 +- src/hooks/gmail-watcher.ts | 2 +- src/hooks/hooks-status.ts | 4 +- src/hooks/hooks.ts | 6 +- src/hooks/install.ts | 2 +- src/hooks/update.ts | 10 +- .../heartbeat-runner.tool-response.test.ts | 2 +- .../state-migrations.channel-pairing.test.ts | 2 +- src/infra/state-migrations.test.ts | 2 +- src/llm/providers/stream-wrappers/moonshot.ts | 6 - .../stream-wrappers/reasoning-effort-utils.ts | 2 +- src/llm/stream.ts | 8 +- src/llm/utils/node-http-proxy.ts | 2 +- src/llm/utils/oauth/anthropic.ts | 2 +- src/llm/utils/oauth/github-copilot.ts | 6 +- src/llm/utils/oauth/index.ts | 13 - src/llm/utils/oauth/types.ts | 4 - src/mcp/channel-server.test.ts | 3 +- src/mcp/openclaw-tools-serve-config.ts | 2 +- src/media-understanding/local-audio.ts | 2 +- src/media-understanding/runtime-types.ts | 2 +- src/media-understanding/types.ts | 2 +- src/media/image-ops.ts | 4 +- src/media/parse.ts | 4 +- src/media/read-capability.ts | 2 +- src/memory-host-sdk/engine-qmd.ts | 3 - src/model-catalog/authority.test.ts | 71 -- src/model-catalog/authority.ts | 39 -- src/model-catalog/index.ts | 18 - src/model-catalog/provider-index/index.ts | 9 +- .../provider-index/normalize.test.ts | 3 +- src/music-generation/live-test-helpers.ts | 9 - src/music-generation/runtime.test.ts | 2 +- src/music-generation/runtime.ts | 2 - src/node-host/invoke.sanitize-env.test.ts | 3 +- src/node-host/invoke.ts | 2 +- src/node-host/runner.ts | 1 - .../pairing-store-sqlite.test-helpers.ts | 27 + src/pairing/pairing-store-sqlite.ts | 20 +- src/pairing/pairing-store.test.ts | 2 +- src/pairing/setup-code.ts | 10 +- src/plugin-sdk/delivery-queue-runtime.test.ts | 4 +- .../plugin-state-store.e2e.test.ts | 2 +- src/plugin-state/plugin-state-store.test.ts | 8 +- src/plugin-state/plugin-state-store.ts | 11 +- src/plugin-state/plugin-state-store.types.ts | 2 +- src/plugin-state/runtime-health-store.ts | 4 +- .../runtime/runtime-task-test-harness.ts | 4 +- src/process/child-process-bridge.ts | 2 +- .../gateway-work-admission.test-helpers.ts | 10 + src/process/gateway-work-admission.test.ts | 6 +- src/process/gateway-work-admission.ts | 15 +- src/process/linux-oom-score.test.ts | 102 +-- src/process/linux-oom-score.ts | 27 - src/process/supervisor/adapters/child.ts | 2 +- src/process/supervisor/adapters/pty.ts | 2 +- src/process/supervisor/index.ts | 11 +- src/proxy-capture/env.ts | 10 +- src/proxy-capture/store.sqlite.ts | 6 +- src/secrets/audit.ts | 14 +- src/secrets/auth-profiles-scan.ts | 4 +- src/secrets/channel-contract-api.ts | 4 +- src/secrets/channel-env-vars.ts | 1 - src/secrets/command-config.test.ts | 32 +- src/secrets/command-config.ts | 37 +- src/secrets/configure-plan.test.ts | 5 +- src/secrets/configure-plan.ts | 9 +- src/secrets/configure.ts | 2 +- src/secrets/legacy-secretref-env-marker.ts | 2 +- src/secrets/plan.ts | 2 +- src/secrets/provider-env-vars.ts | 1 - src/secrets/ref-contract.ts | 13 +- src/secrets/runtime-command-secrets.ts | 2 +- src/secrets/runtime-gateway-auth-surfaces.ts | 6 +- src/secrets/runtime-web-tools.shared.ts | 8 +- src/secrets/runtime-web-tools.ts | 9 - src/secrets/secret-value.ts | 2 +- src/secrets/storage-scan.ts | 2 +- src/secrets/target-registry-pattern.ts | 4 +- src/secrets/target-registry-query.ts | 10 +- src/secrets/unsupported-surface-policy.ts | 2 +- src/security/audit-extra.async.ts | 16 +- src/security/audit-extra.summary.ts | 2 +- src/security/audit-extra.sync.ts | 6 +- src/security/audit-gateway-config.ts | 2 +- src/security/audit-model-refs.ts | 2 +- src/security/audit.ts | 11 +- src/security/config-regex.ts | 2 +- src/security/dangerous-config-flags-core.ts | 2 +- src/security/exec-filesystem-policy.ts | 2 +- src/security/fix.ts | 10 +- src/security/install-policy.ts | 6 +- src/security/windows-acl.test.ts | 25 +- src/security/windows-acl.ts | 7 - src/sessions/agent-harness-session-key.ts | 2 +- src/sessions/input-provenance.ts | 8 +- src/sessions/model-overrides.ts | 4 +- src/sessions/session-chat-type-shared.ts | 2 +- src/sessions/session-chat-type.ts | 5 - src/sessions/session-key-utils.ts | 4 +- src/sessions/session-lifecycle-admission.ts | 2 +- src/sessions/session-state-events.ts | 6 +- src/sessions/transcript-events.test.ts | 3 +- src/sessions/transcript-events.ts | 11 +- .../user-turn-transcript-runtime-context.ts | 2 +- src/sessions/user-turn-transcript.ts | 7 - src/sessions/user-turn-transcript.types.ts | 2 +- src/shared/avatar-policy.test.ts | 14 - src/shared/avatar-policy.ts | 23 +- src/shared/custom-command-config.ts | 6 +- src/shared/device-pairing-access.ts | 2 +- src/shared/frontmatter.ts | 4 +- src/shared/lazy-runtime.ts | 1 - src/shared/session-types.ts | 4 +- src/shared/store-writer-queue.ts | 2 +- src/skills/lifecycle/install.ts | 4 +- src/skills/research/signals.test.ts | 14 +- src/skills/research/signals.ts | 18 +- src/skills/runtime/refresh.test.ts | 14 +- src/skills/runtime/refresh.ts | 8 +- src/skills/runtime/remote.test.ts | 3 +- src/skills/runtime/session-snapshot.ts | 4 +- src/skills/types.ts | 4 +- src/skills/workshop/curator.ts | 6 +- src/skills/workshop/service.ts | 2 +- src/skills/workshop/tool-policy-diagnostic.ts | 4 +- src/state/openclaw-agent-db.paths.ts | 2 +- src/status/codex-synthetic-usage.ts | 4 +- src/status/status-message.ts | 2 +- src/talk/agent-consult-runtime.test.ts | 6 +- src/talk/agent-consult-runtime.ts | 7 +- src/talk/agent-run-control.test.ts | 2 +- src/talk/agent-run-control.ts | 1 - src/talk/provider-types.ts | 8 +- src/talk/talk-session-controller.ts | 2 +- src/tasks/detached-task-runtime-contract.ts | 14 +- src/tasks/detached-task-runtime-state.ts | 2 +- src/tasks/detached-task-runtime.ts | 2 - src/tasks/native-subagent-task.ts | 6 +- src/tasks/runtime-internal.ts | 6 - src/tasks/task-boundaries.test.ts | 2 + src/tasks/task-flow-registry.store.ts | 6 +- src/tasks/task-flow-registry.ts | 4 +- src/tasks/task-flow-runtime-internal.ts | 3 +- src/tasks/task-registry-control.types.ts | 6 +- src/tasks/task-registry.audit.ts | 3 +- src/tasks/task-registry.ts | 2 +- src/tasks/task-runtime.test-helpers.ts | 9 + src/test-utils/channel-plugins.ts | 7 +- src/test-utils/vitest-spies.ts | 2 +- src/tools/diagnostics.ts | 2 +- src/tools/protocol.ts | 2 +- src/trajectory/paths.ts | 22 +- src/trajectory/runtime-store.sqlite.test.ts | 6 - src/trajectory/runtime-store.sqlite.ts | 41 +- src/trajectory/runtime.test.ts | 12 +- src/tts/directives.ts | 2 +- src/tui/commands.ts | 4 +- src/tui/gateway-chat.ts | 12 +- src/tui/tui-backend.ts | 4 +- src/tui/tui-types.ts | 6 +- src/utils/delivery-context.shared.ts | 2 +- src/utils/message-channel-constants.ts | 3 +- src/utils/message-channel.test.ts | 2 +- src/utils/message-channel.ts | 3 - src/utils/timer-delay.ts | 1 - src/wizard/i18n/index.ts | 4 +- src/wizard/prompts.ts | 2 +- src/wizard/session.ts | 2 +- src/wizard/setup.migration-import.ts | 4 +- src/wizard/setup.official-plugins.ts | 2 +- src/wizard/setup.post-install-migration.ts | 4 +- 406 files changed, 798 insertions(+), 2360 deletions(-) delete mode 100644 src/auto-reply/reply/exec.ts create mode 100644 src/fleet/containers.redaction.ts delete mode 100644 src/model-catalog/authority.test.ts delete mode 100644 src/model-catalog/authority.ts create mode 100644 src/pairing/pairing-store-sqlite.test-helpers.ts create mode 100644 src/process/gateway-work-admission.test-helpers.ts create mode 100644 src/tasks/task-runtime.test-helpers.ts diff --git a/scripts/deadcode-exports.baseline.mjs b/scripts/deadcode-exports.baseline.mjs index fa6f5f6f7da9..0fb0b576b9ef 100644 --- a/scripts/deadcode-exports.baseline.mjs +++ b/scripts/deadcode-exports.baseline.mjs @@ -1021,7 +1021,6 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "extensions/zalouser/src/zca-client.ts: ThreadType", "src/acp/control-plane/active-turns.ts: resetAcpActiveTurnsForTests", "src/acp/runtime/registry.ts: AcpRuntimeBackend", - "src/acp/runtime/session-meta.ts: resolveSessionStorePathForAcp", "src/agents/agent-bundle-lsp-runtime.ts: spawnLspServerProcess", "src/agents/agent-bundle-mcp-tools.ts: __testing", "src/agents/agent-bundle-mcp-tools.ts: BundleMcpToolRuntime", @@ -1532,43 +1531,18 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/audit/audit-event-store.ts: auditEventStoreLimits", "src/audit/audit-event-store.ts: testApi", "src/audit/audit-event-types.ts: AgentRunAuditEventInput", - "src/audit/audit-event-types.ts: AuditEventKind", - "src/audit/audit-event-types.ts: AuditEventStatus", - "src/audit/audit-event-types.ts: AuditInboundMessageFailureReasonCode", - "src/audit/audit-event-types.ts: AuditMessageDirection", "src/audit/audit-event-types.ts: InboundMessageAuditEventInput", "src/audit/audit-event-types.ts: OutboundMessageAuditEventInput", "src/audit/audit-event-types.ts: OutboundMessageAuditTerminal", - "src/audit/audit-event-types.ts: ToolActionFinishedAuditTerminal", "src/audit/audit-event-writer.ts: testApi", - "src/audit/audit-identity.ts: AuditIdentityKey", - "src/audit/audit-identity.ts: AuditIdentityKind", - "src/audit/audit-recorder.ts: AuditEventRecorder", "src/audit/message-audit-events.ts: resetMessageAuditEventsForTest", "src/auto-reply/command-detection.runtime-types.ts: IsControlCommandMessage", "src/auto-reply/command-detection.runtime-types.ts: ShouldComputeCommandAuthorized", "src/auto-reply/commands-registry.runtime-types.ts: ShouldHandleTextCommands", - "src/auto-reply/dispatch.ts: DispatchInboundResult", - "src/auto-reply/fallback-state.ts: FallbackNoticeState", - "src/auto-reply/fallback-state.ts: resolveActiveFallbackState", "src/auto-reply/reply-payload.ts: buildPairingQrReplyChannelData", - "src/auto-reply/reply-payload.ts: PairingQrReplyChannelData", - "src/auto-reply/reply.ts: extractElevatedDirective", - "src/auto-reply/reply.ts: extractExecDirective", - "src/auto-reply/reply.ts: extractQueueDirective", - "src/auto-reply/reply.ts: extractReasoningDirective", - "src/auto-reply/reply.ts: extractReplyToTag", - "src/auto-reply/reply.ts: extractThinkDirective", - "src/auto-reply/reply.ts: extractTraceDirective", - "src/auto-reply/reply.ts: extractVerboseDirective", - "src/auto-reply/reply.ts: GetReplyOptions", - "src/auto-reply/reply.ts: ReplyPayload", - "src/auto-reply/reply/abort.ts: __testing", "src/auto-reply/reply/abort.ts: getAbortMemory", "src/auto-reply/reply/abort.ts: getAbortMemorySizeForTest", "src/auto-reply/reply/abort.ts: resetAbortMemoryForTest", - "src/auto-reply/reply/abort.ts: resolveAbortCutoffFromContext", - "src/auto-reply/reply/abort.ts: shouldSkipMessageByAbortCutoff", "src/auto-reply/reply/abort.ts: testing", "src/auto-reply/reply/acp-reset-target.ts: testing", "src/auto-reply/reply/agent-runner-cli-dispatch.ts: ReasoningProgressPayload", @@ -1577,47 +1551,28 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/auto-reply/reply/agent-runner-execution.ts: buildContextOverflowRecoveryText", "src/auto-reply/reply/agent-runner-execution.ts: computeContextAwareReserveTokensFloor", "src/auto-reply/reply/agent-runner-execution.ts: MAX_LIVE_SWITCH_RETRIES", - "src/auto-reply/reply/agent-runner-memory.ts: SessionTranscriptUsageSnapshot", "src/auto-reply/reply/agent-runner-memory.ts: setAgentRunnerMemoryTestDeps", "src/auto-reply/reply/agent-runner-session-reset.ts: setAgentRunnerSessionResetTestDeps", "src/auto-reply/reply/agent-runner-utils.ts: buildEmbeddedRunBaseParams", "src/auto-reply/reply/agent-runner-utils.ts: resolveProviderScopedAuthProfile", "src/auto-reply/reply/block-reply-pipeline.ts: createBlockReplyPayloadKey", - "src/auto-reply/reply/commands-acp/shared.ts: ParsedSetCommandInput", - "src/auto-reply/reply/commands-acp/shared.ts: ParsedSingleValueCommandInput", - "src/auto-reply/reply/commands-acp/shared.ts: ParsedSpawnInput", - "src/auto-reply/reply/commands-acp/shared.ts: ParsedSteerInput", "src/auto-reply/reply/commands-diagnostics.ts: createDiagnosticsCommandHandler", - "src/auto-reply/reply/commands-info.ts: handleContextCommand", - "src/auto-reply/reply/commands-info.ts: handleWhoamiCommand", "src/auto-reply/reply/commands-login.ts: testing", "src/auto-reply/reply/commands-mcp.ts: createMcpCommandHandler", "src/auto-reply/reply/commands-name.ts: parseNameCommand", "src/auto-reply/reply/commands-setunset.ts: parseSetUnsetCommand", "src/auto-reply/reply/commands-setunset.ts: parseSetUnsetCommandAction", - "src/auto-reply/reply/commands-slash-parse.ts: ParsedSlashCommand", - "src/auto-reply/reply/commands-steer.runtime.ts: queueEmbeddedAgentMessage", - "src/auto-reply/reply/commands-subagents-dispatch.ts: COMMAND", "src/auto-reply/reply/commands-subagents/shared.ts: COMMAND", "src/auto-reply/reply/commands-tasks.ts: buildTasksReply", "src/auto-reply/reply/completion-delivery-policy.ts: resolveCompletionChatType", "src/auto-reply/reply/delivery-hints.ts: MESSAGE_TOOL_ONLY_DELIVERY_HINT", "src/auto-reply/reply/delivery-hints.ts: ROOM_EVENT_DELIVERY_HINT", - "src/auto-reply/reply/directive-handling.model-runtime.ts: ModelRuntimeDirectiveResolution", - "src/auto-reply/reply/directive-handling.model.ts: resolveModelSelectionFromDirective", - "src/auto-reply/reply/directive-handling.params.ts: HandleDirectiveOnlyCoreParams", - "src/auto-reply/reply/directive-handling.persist.ts: PersistedThinkingLevelRemap", - "src/auto-reply/reply/directives.ts: NoticeLevel", - "src/auto-reply/reply/dispatch-acp-delivery.ts: AcpDispatchDeliveryMeta", - "src/auto-reply/reply/dispatch-from-config.runtime.ts: updateSessionStoreEntry", - "src/auto-reply/reply/dispatch-from-config.ts: DispatchFromConfigParams", "src/auto-reply/reply/dispatch-from-config.ts: getDispatcherFinalOutcomeCounts", "src/auto-reply/reply/dispatch-from-config.ts: testing", "src/auto-reply/reply/dispatch-from-config.types.ts: DispatchReplyFromConfig", "src/auto-reply/reply/dispatcher-registry.ts: clearAllDispatchers", "src/auto-reply/reply/effective-reply-route.ts: EffectiveReplyRouteContext", "src/auto-reply/reply/effective-reply-route.ts: EffectiveReplyRouteEntry", - "src/auto-reply/reply/exec.ts: extractExecDirective", "src/auto-reply/reply/get-reply-directives-apply.ts: formatModelOverrideResetEvent", "src/auto-reply/reply/get-reply-fast-path.ts: markCompleteReplyConfig", "src/auto-reply/reply/get-reply-fast-path.ts: withFastReplyConfig", @@ -1625,97 +1580,40 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/auto-reply/reply/get-reply-run.ts: resolvePromptSessionContextForSystemEvent", "src/auto-reply/reply/get-reply-run.ts: resolvePromptSilentReplyConversationType", "src/auto-reply/reply/history.ts: appendHistoryEntry", - "src/auto-reply/reply/history.ts: HistoryMediaEntry", "src/auto-reply/reply/inbound-dedupe.ts: buildInboundDedupeKey", "src/auto-reply/reply/inbound-dedupe.ts: InboundDedupeClaimResult", - "src/auto-reply/reply/inbound-media.ts: InboundMediaContext", - "src/auto-reply/reply/mentions.ts: ExplicitMentionSignal", "src/auto-reply/reply/mentions.types.ts: BuildMentionRegexes", "src/auto-reply/reply/mentions.types.ts: MatchesMentionPatterns", "src/auto-reply/reply/mentions.types.ts: MatchesMentionWithExplicit", "src/auto-reply/reply/progress-narrator.ts: createProgressNarrator", "src/auto-reply/reply/progress-narrator.ts: ProgressNarrationInput", "src/auto-reply/reply/prompt-prelude.ts: buildReplyPromptBodies", - "src/auto-reply/reply/prompt-prelude.ts: ReplyPromptEnvelope", - "src/auto-reply/reply/prompt-prelude.ts: ReplyPromptEnvelopeBase", "src/auto-reply/reply/provider-request-error-classifier.ts: PROVIDER_AUTHENTICATION_ERROR_USER_MESSAGE", "src/auto-reply/reply/provider-request-error-classifier.ts: PROVIDER_INTERNAL_ERROR_USER_MESSAGE", "src/auto-reply/reply/provider-request-error-classifier.ts: PROVIDER_MODEL_UNAVAILABLE_USER_MESSAGE", "src/auto-reply/reply/provider-request-error-classifier.ts: PROVIDER_RATE_LIMIT_OR_QUOTA_ERROR_USER_MESSAGE", - "src/auto-reply/reply/provider-request-error-classifier.ts: ProviderRequestErrorClassification", - "src/auto-reply/reply/provider-request-error-classifier.ts: ProviderRequestErrorCode", - "src/auto-reply/reply/queue.ts: clearFollowupQueue", - "src/auto-reply/reply/queue.ts: EnqueueFollowupRunOptions", - "src/auto-reply/reply/queue.ts: extractQueueDirective", - "src/auto-reply/reply/queue.ts: isFollowupRunDeferredError", - "src/auto-reply/reply/queue.ts: QueueDedupeMode", - "src/auto-reply/reply/queue.ts: QueueDropPolicy", - "src/auto-reply/reply/queue.ts: QueueInsertPosition", - "src/auto-reply/reply/queue.ts: QueueMode", "src/auto-reply/reply/queue.ts: resetRecentQueuedMessageIdDedupe", "src/auto-reply/reply/queue/cleanup.ts: testing", "src/auto-reply/reply/queue/drain.ts: resolveFollowupAuthorizationKey", "src/auto-reply/reply/queue/enqueue.ts: resetRecentQueuedMessageIdDedupe", - "src/auto-reply/reply/queue/state.ts: FollowupQueueState", - "src/auto-reply/reply/queue/types.ts: QueueInsertPosition", "src/auto-reply/reply/reply-dispatcher.runtime-types.ts: CreateReplyDispatcherWithTyping", - "src/auto-reply/reply/reply-dispatcher.ts: ReplyDispatcher", - "src/auto-reply/reply/reply-dispatcher.ts: ReplyDispatchKind", - "src/auto-reply/reply/reply-operation-run-state.ts: ReplyOperationAdmissionSnapshot", "src/auto-reply/reply/reply-operation-run-state.ts: ReplyOptionsWithOperationRunState", "src/auto-reply/reply/reply-payloads-dedupe.ts: getMatchingMessagingToolReplyTargets", - "src/auto-reply/reply/reply-payloads.ts: shouldDedupeMessagingToolRepliesForRoute", "src/auto-reply/reply/reply-run-registry.ts: __testing", - "src/auto-reply/reply/reply-run-registry.ts: ReplyBackendCancelReason", - "src/auto-reply/reply/reply-run-registry.ts: ReplyBackendKind", - "src/auto-reply/reply/reply-run-registry.ts: ReplyBackendQueueMessageMismatch", - "src/auto-reply/reply/reply-run-registry.ts: ReplyOperationAbortCode", - "src/auto-reply/reply/reply-run-registry.ts: ReplyOperationFailureCode", - "src/auto-reply/reply/reply-run-registry.ts: ReplyOperationResult", - "src/auto-reply/reply/reply-run-registry.ts: ReplyOperationStaleReason", - "src/auto-reply/reply/reply-run-registry.ts: ReplyRunKey", - "src/auto-reply/reply/reply-run-registry.ts: ReplyRunRegistry", "src/auto-reply/reply/reply-run-registry.ts: testing", "src/auto-reply/reply/reply-threading.ts: createReplyToModeFilter", "src/auto-reply/reply/reply-threading.ts: resolveConfiguredReplyToMode", "src/auto-reply/reply/reply-threading.ts: resolveReplyToModeWithThreading", - "src/auto-reply/reply/reply-turn-admission.ts: ReplyTurnAdmission", - "src/auto-reply/reply/reply-turn-admission.ts: ReplyTurnKind", "src/auto-reply/reply/reply-usage-state.ts: clearReplyUsageStateForTest", - "src/auto-reply/reply/session-delivery.ts: LegacyMainDeliveryRetirement", - "src/auto-reply/reply/session-fork.ts: ForkedParentSessionEntry", "src/auto-reply/reply/session-fork.ts: ForkSessionEntryFromParentParams", "src/auto-reply/reply/session-fork.ts: ForkSessionEntryFromParentResult", "src/auto-reply/reply/session-fork.ts: ParentForkDecision", "src/auto-reply/reply/session-reset-prompt.ts: buildBareSessionResetPrompt", - "src/auto-reply/reply/session-updates.ts: drainFormattedSystemEvents", - "src/auto-reply/reply/session-updates.ts: resetResolvedSkillsCacheForTests", - "src/auto-reply/reply/session.ts: InitSessionStateParams", - "src/auto-reply/reply/session.ts: ReplySessionPreprocessingState", "src/auto-reply/reply/stage-sandbox-media.ts: appendScpStderrTail", "src/auto-reply/reply/stage-sandbox-media.ts: SCP_STDERR_TAIL_CHARS", "src/auto-reply/reply/stage-sandbox-media.ts: testing", "src/auto-reply/reply/stranded-reply-recovery.ts: STRANDED_REPLY_RETRY_MARKER", - "src/auto-reply/reply/typing-mode.ts: TypingModeContext", - "src/auto-reply/status.ts: buildStatusMessage", - "src/auto-reply/status.ts: CommandsMessageOptions", - "src/auto-reply/status.ts: CommandsMessageResult", - "src/auto-reply/status.ts: StatusArgs", - "src/auto-reply/thinking.shared.ts: ALL_THINKING_LEVELS", - "src/auto-reply/thinking.shared.ts: resolveMessagesResponseUsageDefault", - "src/auto-reply/thinking.shared.ts: ResponseUsageDefaultConfig", - "src/auto-reply/thinking.shared.ts: ResponseUsageInput", - "src/auto-reply/thinking.ts: resolveMessagesResponseUsageDefault", - "src/auto-reply/thinking.ts: ResponseUsageDefaultConfig", - "src/auto-reply/thinking.ts: ResponseUsageInput", - "src/auto-reply/thinking.ts: ThinkingLevelOption", - "src/auto-reply/types.ts: copyReplyPayloadMetadata", - "src/auto-reply/types.ts: markCommandReplyForDelivery", - "src/auto-reply/types.ts: markReplyPayloadForSourceSuppressionDelivery", - "src/auto-reply/types.ts: PartialReplyPayload", - "src/auto-reply/types.ts: setReplyPayloadMetadata", "src/auto-reply/usage-bar/template.ts: clearUsageBarTemplateCacheForTest", - "src/auto-reply/usage-bar/template.ts: UsageTemplateConfig", "src/channels/ids.ts: CHAT_CHANNEL_ALIASES", "src/channels/message-access/index.ts: resolveChannelIngressEffectiveAllowFromLists", "src/channels/message-access/runtime-types.ts: ChannelIngressSubjectIdentifier", @@ -1964,77 +1862,41 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/channels/turn/types.ts: InboundEventKind", "src/channels/turn/types.ts: ProjectedAllowlistAccessFacts", "src/channels/turn/types.ts: ProjectedEventAccessFacts", - "src/cli/argv.ts: hasHelpOrVersion", - "src/cli/argv.ts: NormalizeRootLogLevelArgvOptions", - "src/cli/argv.ts: NormalizeRootNoColorArgvOptions", "src/cli/channel-options.ts: testing", - "src/cli/clawhub-risk-acknowledgement.ts: ClawHubRiskAcknowledgementCliOptions", "src/cli/command-path-policy.ts: resolveCliCatalogCommandPath", "src/cli/command-secret-gateway.ts: testing", "src/cli/cron-cli/register.cron-simple.ts: loadCronJobForShow", - "src/cli/cron-cli/schedule-options.ts: CronEditScheduleRequest", "src/cli/daemon-cli/launchd-recovery.ts: LAUNCH_AGENT_RECOVERY_MESSAGE", "src/cli/daemon-cli/response.ts: buildDaemonHintItems", - "src/cli/daemon-cli/response.ts: DaemonAction", - "src/cli/daemon-cli/response.ts: DaemonHintItem", - "src/cli/daemon-cli/response.ts: DaemonHintKind", "src/cli/gateway-cli/call.ts: gatewayCallOpts", "src/cli/gateway-cli/qa-parent-watchdog.ts: QA_PARENT_PID_ENV", "src/cli/gateway-cli/qa-parent-watchdog.ts: QA_STAGED_RUNTIME_ROOT_ENV", "src/cli/gateway-cli/qa-parent-watchdog.ts: QA_TEMP_ROOT_ENV", - "src/cli/gateway-cli/qa-parent-watchdog.ts: QaParentWatchdogHandle", - "src/cli/gateway-cli/run.ts: __testing", "src/cli/gateway-cli/run.ts: testing", - "src/cli/help-format.ts: HelpExample", - "src/cli/nodes-camera.ts: CameraClipPayload", - "src/cli/nodes-camera.ts: CameraSnapPayload", "src/cli/nodes-camera.ts: writeUrlToFile", - "src/cli/nodes-screen.ts: ScreenRecordPayload", - "src/cli/nodes-screen.ts: ScreenSnapshotPayload", "src/cli/npm-resolution.ts: logPinnedNpmSpecMessages", "src/cli/npm-resolution.ts: resolvePinnedNpmInstallRecord", "src/cli/npm-resolution.ts: resolvePinnedNpmSpec", - "src/cli/plugins-cli.ts: PluginUninstallOptions", "src/cli/plugins-install-command.ts: loadConfigForInstall", "src/cli/plugins-list-format.ts: formatPluginLine", - "src/cli/plugins-location-bridges.ts: PersistedBundledPluginRecoveryLocation", - "src/cli/plugins-search-command.ts: PluginsSearchOptions", "src/cli/plugins-uninstall-command.ts: PluginUninstallOptions", - "src/cli/ports.ts: ForceFreePortResult", "src/cli/ports.ts: listPortListeners", "src/cli/ports.ts: parseLsofOutput", "src/cli/ports.ts: PortProcess", "src/cli/ports.ts: probePortFree", - "src/cli/precomputed-help.ts: PrecomputedSubcommandHelpName", "src/cli/precomputed-help.ts: resolvePrecomputedSubcommandHelpCommand", - "src/cli/program/command-descriptor-utils.ts: CommandDescriptorCatalog", - "src/cli/program/command-descriptor-utils.ts: CommandDescriptorLike", "src/cli/program/command-descriptor-utils.ts: getCommandDescriptorNames", "src/cli/program/command-descriptor-utils.ts: getCommandsWithSubcommands", "src/cli/program/command-descriptor-utils.ts: getParentDefaultHelpCommands", "src/cli/program/command-group-descriptors.ts: resolveCommandGroupEntries", - "src/cli/program/command-group-descriptors.ts: ResolvedCommandGroupEntry", - "src/cli/program/command-registry.ts: CommandRegistration", - "src/cli/program/command-registry.ts: getCoreCliCommandDescriptors", "src/cli/program/command-registry.ts: getCoreCliCommandNames", "src/cli/program/command-registry.ts: getCoreCliCommandsWithSubcommands", "src/cli/program/command-registry.ts: registerCoreCliCommands", "src/cli/program/command-tree.ts: removeCommand", - "src/cli/program/core-command-descriptors.ts: CoreCliCommandDescriptor", - "src/cli/program/register-command-groups.ts: CommandGroupPlaceholderOption", - "src/cli/program/register.subclis-core.ts: getSubCliCommandsWithSubcommands", - "src/cli/program/register.subclis.ts: getSubCliCommandsWithSubcommands", "src/cli/program/register.subclis.ts: getSubCliEntries", - "src/cli/program/routes.ts: RouteSpec", - "src/cli/shared/parse-port.ts: MAX_TCP_PORT", - "src/cli/shared/parse-port.ts: parseTcpPort", "src/cli/startup-metadata.ts: testing", - "src/cli/startup-trace.ts: GatewayStartupTraceSource", "src/cli/tagline.ts: DEFAULT_TAGLINE", - "src/cli/update-cli/plugin-payload-validation.ts: PluginPayloadSmokeFailureReason", - "src/cli/update-cli/plugin-payload-validation.ts: PluginPayloadSmokeResult", "src/cli/update-cli/progress.ts: inferUpdateFailureHints", - "src/cli/update-cli/progress.ts: ProgressController", "src/cli/update-cli/update-command.ts: buildInvalidConfigPostCoreUpdateResult", "src/cli/update-cli/update-command.ts: collectMissingPluginInstallPayloads", "src/cli/update-cli/update-command.ts: formatPostUpdateGatewayRecoveryInstructions", @@ -2051,28 +1913,16 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/commands/auth-choice-options.ts: buildAuthChoiceOptions", "src/commands/auth-choice.model-check.ts: DefaultModelAuthStatus", "src/commands/auth-choice.model-check.ts: DefaultModelCatalogFacts", - "src/commands/auth-choice.model-check.ts: ModelRouteObservation", - "src/commands/auth-token.ts: ANTHROPIC_SETUP_TOKEN_PREFIX", - "src/commands/backup-shared.ts: BackupAssetKind", - "src/commands/backup-shared.ts: BackupPlan", - "src/commands/backup-shared.ts: BackupSkipReason", "src/commands/backup-shared.ts: encodeAbsolutePathForBackupArchive", "src/commands/backup-shared.ts: formatBackupArchiveTimestamp", "src/commands/backup-shared.ts: resolveBackupPlanFromPaths", - "src/commands/backup-shared.ts: SkippedBackupAsset", - "src/commands/configure.ts: buildGatewayAuthConfig", - "src/commands/configure.ts: CONFIGURE_WIZARD_SECTIONS", - "src/commands/crestodian-with-inference.ts: CrestodianWithInferenceDeps", "src/commands/daemon-install-helpers.ts: collectPreservedExistingServiceEnvVars", - "src/commands/daemon-install-helpers.ts: resolveGatewayDevMode", "src/commands/daemon-install-plan.shared.ts: resolveDaemonOpenClawBinDir", "src/commands/daemon-install-plan.shared.ts: resolveGatewayDevMode", "src/commands/doctor-auth-oauth-sidecar.ts: testing", "src/commands/doctor-auth.ts: formatOAuthRefreshFailureDoctorLine", "src/commands/doctor-auth.ts: legacyCodexProviderOverrideToHealthFinding", "src/commands/doctor-auth.ts: resolveUnusableProfileHint", - "src/commands/doctor-completion.ts: DoctorCompletionOptions", - "src/commands/doctor-completion.ts: ShellCompletionStatusOptions", "src/commands/doctor-config-analysis.ts: collectImplicitFallbackClobberWarnings", "src/commands/doctor-disk-space.ts: buildDiskSpaceWarnings", "src/commands/doctor-heartbeat-main-session-repair.ts: clearTuiLastSessionPointers", @@ -2083,38 +1933,17 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/commands/doctor-platform-notes.ts: collectMacLaunchAgentOverrideWarning", "src/commands/doctor-platform-notes.ts: collectMacLaunchctlGatewayEnvOverrideWarning", "src/commands/doctor-platform-notes.ts: collectMacStaleOpenClawUpdateLaunchdJobsWarning", - "src/commands/doctor-plugin-registry.ts: PluginRegistryHealthIssue", "src/commands/doctor-sandbox.ts: resolveSandboxScript", "src/commands/doctor-session-snapshots.ts: resolveSessionSnapshotBundledSkillsDir", "src/commands/doctor-session-snapshots.ts: scanSessionStoreForStaleRuntimeSnapshotPaths", - "src/commands/doctor-session-snapshots.ts: SessionSnapshotHealthIssue", - "src/commands/doctor-session-sqlite-github-issue.ts: SessionSqliteGithubIssueCreateResult", - "src/commands/doctor-session-sqlite-migration-run.ts: listSessionSqliteMigrationManifestPaths", - "src/commands/doctor-session-sqlite-migration-run.ts: readSessionSqliteMigrationManifest", "src/commands/doctor-session-sqlite-migration-run.ts: SessionSqliteMigrationManifest", - "src/commands/doctor-session-sqlite-migration-run.ts: sessionSqliteMigrationTargetKey", - "src/commands/doctor-session-sqlite-migration-run.ts: SessionSqliteMigrationTargetManifest", - "src/commands/doctor-session-sqlite-readers.ts: ReadOnlySqliteDbStatsResult", - "src/commands/doctor-session-sqlite-readers.ts: ReadOnlySqliteExactSessionEntryResult", - "src/commands/doctor-session-sqlite-readers.ts: ReadOnlySqliteSessionEntriesResult", - "src/commands/doctor-session-sqlite-readers.ts: ReadOnlySqliteSessionSummary", - "src/commands/doctor-session-sqlite-readers.ts: ReadOnlySqliteTranscriptEventCountResult", - "src/commands/doctor-session-sqlite-readers.ts: TranscriptEventCountResult", - "src/commands/doctor-session-sqlite-recover-report.ts: SessionSqliteRecoverTargetValidator", - "src/commands/doctor-session-sqlite-types.ts: DoctorSessionSqliteCorruptRecovery", - "src/commands/doctor-session-sqlite-types.ts: DoctorSessionSqliteDbStats", - "src/commands/doctor-session-sqlite-types.ts: DoctorSessionSqliteLargestSession", "src/commands/doctor-session-state-providers.ts: applySessionRouteStateRepair", "src/commands/doctor-session-state-providers.ts: resolveConfiguredDoctorSessionStateRoute", "src/commands/doctor-session-state-providers.ts: scanSessionRouteStateOwners", "src/commands/doctor-session-state-providers.ts: storeMayContainPluginSessionRouteState", "src/commands/doctor-session-transcripts.ts: repairBrokenSessionTranscriptFile", - "src/commands/doctor-session-transcripts.ts: SessionTranscriptHealthIssue", - "src/commands/doctor-skills.ts: collectUnavailableAgentSkills", "src/commands/doctor-skills.ts: describeGhConfigDirHintFromDiscovery", - "src/commands/doctor-skills.ts: disableUnavailableSkillsInConfig", "src/commands/doctor-skills.ts: formatUnavailableSkillDoctorLines", - "src/commands/doctor-sqlite-compact.ts: DoctorSqliteCompactResult", "src/commands/doctor-state-sqlite-compact.ts: DoctorStateSqliteCompactReport", "src/commands/doctor-ui.ts: UiProtocolFreshnessIssue", "src/commands/doctor-whatsapp-responsiveness.ts: listLocalTuiProcesses", @@ -2123,104 +1952,47 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/commands/doctor/cron/legacy-delivery.ts: buildDeliveryPatchFromLegacyPayload", "src/commands/doctor/cron/legacy-delivery.ts: hasLegacyDeliveryHints", "src/commands/doctor/cron/legacy-delivery.ts: mergeLegacyDeliveryInto", - "src/commands/doctor/cron/legacy-store-migration.ts: LegacyCronArchiveResult", - "src/commands/doctor/cron/payload-migration.ts: UnresolvedAgentTurnShellToolPromptKind", "src/commands/doctor/cron/warnings.ts: collectCronDeliveryTargetAdvisory", - "src/commands/doctor/shared/channel-plugin-blockers.ts: ChannelPluginBlockerHit", "src/commands/doctor/shared/codex-native-assets.ts: scanCodexNativeAssets", - "src/commands/doctor/shared/codex-route-warnings.ts: DisabledCodexPluginRouteIssue", "src/commands/doctor/shared/codex-route-warnings.ts: repairCodexSessionStoreRoutes", "src/commands/doctor/shared/context-engine-host-compat.ts: collectConfiguredContextEngineAgentRunHosts", - "src/commands/doctor/shared/exec-safe-bins.ts: ExecSafeBinCoverageHit", - "src/commands/doctor/shared/exec-safe-bins.ts: ExecSafeBinTrustedDirHintHit", - "src/commands/doctor/shared/legacy-config-state-migration-input.ts: StateMigrationConfigInput", "src/commands/doctor/shared/legacy-oauth-sidecar.ts: legacyOAuthSidecarInternalTestUtils", - "src/commands/doctor/shared/legacy-tools-by-sender.ts: LegacyToolsBySenderKeyHit", - "src/commands/doctor/shared/legacy-web-search-migrate.ts: resolveLegacyGrokWebSearchModelTarget", - "src/commands/doctor/shared/missing-configured-plugin-install.ts: ConfiguredPluginInstallHealthIssue", - "src/commands/doctor/shared/missing-configured-plugin-install.ts: RepairMissingPluginInstallsResult", - "src/commands/doctor/shared/plugin-dependency-cleanup.ts: LegacyPluginDependencyStateIssue", "src/commands/doctor/shared/plugin-dependency-cleanup.ts: testing", "src/commands/doctor/shared/plugin-registry-migration.ts: FORCE_PLUGIN_REGISTRY_MIGRATION_ENV", - "src/commands/doctor/shared/plugin-registry-migration.ts: PluginRegistryInstallMigrationPreflight", - "src/commands/doctor/shared/plugin-registry-migration.ts: PluginRegistryInstallMigrationPreflightAction", - "src/commands/doctor/shared/plugin-registry-migration.ts: PluginRegistryInstallMigrationResult", "src/commands/doctor/shared/plugin-runtime-symlinks.ts: collectStalePluginRuntimeSymlinks", - "src/commands/doctor/shared/plugin-runtime-symlinks.ts: PluginRuntimeSymlinkOptions", - "src/commands/doctor/shared/plugin-runtime-symlinks.ts: StalePluginRuntimeSymlink", "src/commands/doctor/shared/plugin-runtime-symlinks.ts: stalePluginRuntimeSymlinkToHealthFinding", "src/commands/doctor/shared/preview-warnings.ts: collectChannelBoundMessageToolPolicyWarnings", "src/commands/doctor/shared/preview-warnings.ts: collectProfileConfiguredToolSectionWarnings", "src/commands/doctor/shared/preview-warnings.ts: collectVisibleReplyToolPolicyWarnings", - "src/commands/doctor/shared/preview-warnings.ts: DoctorPreviewNotes", "src/commands/doctor/shared/release-configured-plugin-installs.ts: collectReleaseConfiguredPluginIds", "src/commands/doctor/shared/release-configured-plugin-installs.ts: shouldRunConfiguredPluginInstallReleaseStep", "src/commands/doctor/shared/stale-auth-order.ts: repairStaleConfiguredAuthOrders", - "src/commands/doctor/shared/stale-auth-order.ts: scanStaleConfiguredAuthOrders", "src/commands/doctor/shared/stale-oauth-profile-shadows.ts: testing", - "src/commands/doctor/shared/stale-subagent-allowlist.ts: StaleSubagentAllowlistHit", - "src/commands/doctor/types.ts: DoctorAllowFromEntry", - "src/commands/gateway-status/output.ts: GatewayStatusWarning", - "src/commands/health.types.ts: ConfigReloadHealthSummary", "src/commands/migrate/selection.ts: MIGRATION_PLUGIN_NOT_SELECTED_REASON", "src/commands/migrate/selection.ts: MIGRATION_SKILL_NOT_SELECTED_REASON", "src/commands/migrate/selection.ts: MIGRATION_SKILL_SELECTION_ACCEPT", "src/commands/migrate/selection.ts: MIGRATION_SKILL_SELECTION_TOGGLE_ALL_OFF", "src/commands/migrate/selection.ts: MIGRATION_SKILL_SELECTION_TOGGLE_ALL_ON", - "src/commands/models/list.auth-index.ts: CreateModelListAuthIndexParams", - "src/commands/models/load-config.ts: LoadedModelsConfig", - "src/commands/models/shared.ts: PrimaryFallbackConfig", - "src/commands/models/shared.ts: UpdateConfigContext", - "src/commands/onboard-custom-config.ts: inferCustomModelSupportsImageInput", - "src/commands/onboard-custom.ts: applyCustomApiConfig", - "src/commands/onboard-custom.ts: buildAnthropicVerificationProbeRequest", - "src/commands/onboard-custom.ts: buildOpenAiVerificationProbeRequest", - "src/commands/onboard-custom.ts: CustomApiError", - "src/commands/onboard-custom.ts: inferCustomModelSupportsImageInput", - "src/commands/onboard-custom.ts: parseNonInteractiveCustomApiFlags", - "src/commands/onboard-custom.ts: resolveCustomModelImageInputInference", - "src/commands/onboard-custom.ts: resolveCustomProviderId", - "src/commands/onboard-inference.ts: DetectInferenceBackendsDeps", - "src/commands/onboard-inference.ts: DetectInferenceBackendsOptions", "src/commands/onboard-inference.ts: detectNativeCodexAppServer", - "src/commands/onboard-inference.ts: DetectNativeCodexAppServerOptions", - "src/commands/onboard-inference.ts: InferenceBackendCandidate", - "src/commands/onboard-non-interactive/api-keys.ts: NonInteractiveApiKeySource", "src/commands/onboard-non-interactive/local.ts: resolveGatewayHealthProbeToken", "src/commands/onboard-non-interactive/local.ts: resolveInstallDaemonGatewayHealthTiming", "src/commands/onboard-remote-gateway.ts: RemoteGatewayInferenceOnboardingDeps", "src/commands/onboard-remote-gateway.ts: RemoteGatewayInferenceTarget", "src/commands/onboard-skills.ts: testing", - "src/commands/onboard.ts: onboardCommand", "src/commands/onboarding-plugin-install.ts: testing", - "src/commands/promos/claim.ts: PromosClaimOptions", - "src/commands/reset.ts: ResetOptions", - "src/commands/reset.ts: ResetScope", - "src/commands/runtime-plugin-install.ts: RuntimePluginEnsureParams", - "src/commands/runtime-plugin-install.ts: RuntimePluginInstallDescriptor", "src/commands/runtime-plugin-install.ts: RuntimePluginInstallResult", - "src/commands/runtime-plugin-install.ts: RuntimePluginModelSelectionHelpers", - "src/commands/runtime-plugin-install.ts: RuntimePluginRepairParams", - "src/commands/runtime-plugin-install.ts: RuntimePluginSelection", "src/commands/session-store-targets.ts: resolveSessionStoreTargets", - "src/commands/sessions-compact.ts: SessionsCompactCliOptions", "src/commands/sessions-tail.ts: setSessionsTailFollowIntervalMsForTests", - "src/commands/sessions.ts: __testing", "src/commands/sessions.ts: testing", - "src/commands/status-all/channels.ts: ChannelRow", - "src/commands/status-runtime-shared.ts: resolveStatusLastHeartbeat", - "src/commands/status-runtime-shared.ts: resolveStatusRuntimeDetails", "src/commands/status.command.ts: resolvePairingRecoveryContext", "src/commands/status.scan.config-shared.ts: resolveStatusScanColdStart", "src/commands/status.scan.config-shared.ts: shouldSkipStatusScanMissingConfigFastPath", - "src/commands/uninstall.ts: UninstallOptions", "src/commitments/extraction.ts: validateCommitmentCandidates", "src/commitments/runtime.ts: configureCommitmentExtractionRuntime", "src/commitments/runtime.ts: drainCommitmentExtractionQueue", "src/commitments/runtime.ts: resetCommitmentExtractionRuntimeForTests", "src/commitments/store.ts: loadCommitmentStore", "src/commitments/store.ts: saveCommitmentStore", - "src/commitments/types.ts: CommitmentDueWindow", "src/compat/legacy-names.ts: MACOS_APP_SOURCES_DIR", "src/compat/legacy-names.ts: PROJECT_NAME", "src/config/backup-rotation.ts: cleanOrphanBackups", @@ -2437,119 +2209,58 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/config/zod-schema.proxy.ts: ProxyLoopbackModeSchema", "src/config/zod-schema.ts: installZodDefaultLocale", "src/config/zod-schema.ts: McpServerSchema", - "src/context-engine/host-compat.ts: ContextEngineHostSupportEvaluation", - "src/context-engine/quarantine-health.ts: PersistedContextEngineRuntimeQuarantine", "src/context-engine/registry.ts: clearContextEngineRuntimeQuarantine", - "src/context-engine/registry.ts: ContextEngineRegistration", - "src/context-engine/registry.ts: ContextEngineRegistrationLifecycle", "src/context-engine/registry.ts: ContextEngineRegistrationResult", - "src/context-engine/registry.ts: ContextEngineRuntimeQuarantine", "src/context-engine/registry.ts: getContextEngineFactory", "src/context-engine/registry.ts: listContextEngineIds", - "src/context-engine/types.ts: ContextEngineTranscriptStorageInfo", - "src/crestodian/agent-turn.ts: CRESTODIAN_AGENT_ID", "src/crestodian/agent-turn.ts: CrestodianAgentTurnDeps", "src/crestodian/agent-turn.ts: CrestodianAgentTurnDirective", - "src/crestodian/agent-turn.ts: CrestodianAgentTurnReply", "src/crestodian/agent-turn.ts: runCrestodianAgentTurnWithDeps", - "src/crestodian/assistant-prompts.ts: CRESTODIAN_ASSISTANT_MAX_TOKENS", - "src/crestodian/chat-engine.ts: CrestodianChatReply", - "src/crestodian/chat-engine.ts: CrestodianChatReplyAction", - "src/crestodian/inference-error.ts: CrestodianInferenceStage", - "src/crestodian/inference-route.ts: resolveCrestodianConfiguredRoute", - "src/crestodian/rescue-message.ts: CrestodianRescueMessageInput", - "src/crestodian/verified-inference.ts: CrestodianConfiguredRouteIdentity", - "src/crestodian/verified-inference.ts: crestodianRouteIdentity", "src/cron/command-output-summary.ts: cronCommandSummaryNeedsExternalRedaction", "src/cron/delivery-context.ts: cronDeliveryFromContext", "src/cron/delivery-preview.ts: resolveCronDeliveryPreview", - "src/cron/delivery.ts: CronAnnounceTarget", - "src/cron/delivery.ts: CronDeliveryPlan", - "src/cron/delivery.ts: CronFailureDeliveryPlan", - "src/cron/delivery.ts: CronFailureDestinationInput", "src/cron/isolated-agent.ts: RunCronAgentTurnResult", - "src/cron/isolated-agent/delivery-dispatch.ts: DispatchCronDeliveryState", "src/cron/isolated-agent/delivery-dispatch.ts: getCompletedDirectCronDeliveriesCountForTests", "src/cron/isolated-agent/delivery-dispatch.ts: resetCompletedDirectCronDeliveriesForTests", - "src/cron/isolated-agent/delivery-dispatch.ts: SuccessfulDeliveryTarget", - "src/cron/isolated-agent/helpers.ts: CronPayloadOutcome", "src/cron/isolated-agent/helpers.ts: pickDeliverablePayloads", "src/cron/isolated-agent/helpers.ts: pickLastDeliverablePayload", "src/cron/isolated-agent/helpers.ts: pickSummaryFromPayloads", - "src/cron/isolated-agent/model-selection.ts: ResolveCronModelSelectionParams", - "src/cron/isolated-agent/model-selection.ts: ResolveCronModelSelectionResult", - "src/cron/isolated-agent/run-execution.runtime.ts: getCliSessionId", "src/cron/isolated-agent/run-executor.ts: createCronPromptExecutor", - "src/cron/isolated-agent/run-session-state.ts: MutableCronSessionEntry", - "src/cron/isolated-agent/run.runtime.ts: DEFAULT_IDENTITY_FILENAME", - "src/cron/isolated-agent/run.runtime.ts: ResolvedAgentConfig", "src/cron/isolated-agent/run.ts: resolveCronDeliveryContext", "src/cron/isolated-agent/run.ts: RunCronAgentTurnResult", - "src/cron/isolated-agent/source-delivery-fallback.ts: CronSourceDeliveryResolvedTarget", "src/cron/job-session-bindings.ts: CronJobSessionBinding", - "src/cron/persisted-shape.ts: InvalidPersistedCronJobReason", - "src/cron/retry-hint.ts: CronRetryHint", "src/cron/run-diagnostics.ts: MISSING_WEB_SEARCH_PROVIDER_DIAGNOSTIC_MESSAGE", "src/cron/run-log.ts: getPendingCronRunLogWriteCountForTests", "src/cron/schedule.ts: clearCronScheduleCacheForTest", "src/cron/schedule.ts: getCronScheduleCacheMaxForTest", "src/cron/schedule.ts: getCronScheduleCacheSizeForTest", "src/cron/schedule.ts: hasCronInCacheForTest", - "src/cron/service.ts: CronServiceDeps", - "src/cron/service/agent-watchdog.ts: CronAgentWatchdog", - "src/cron/service/state.ts: CronDeclarativeAddResult", - "src/cron/service/state.ts: CronServiceDepsInternal", "src/cron/service/timeout-policy.ts: AGENT_TURN_SAFETY_TIMEOUT_MS", "src/cron/service/timeout-policy.ts: DEFAULT_JOB_TIMEOUT_MS", - "src/cron/service/timer.ts: CronTriggerEvalOutcome", - "src/cron/service/timer.ts: DEFAULT_JOB_TIMEOUT_MS", "src/cron/service/timer.ts: executeJobCore", - "src/cron/service/timer.ts: failureNotificationDeliveryFromJobState", - "src/cron/service/timer.ts: normalizeCronRunErrorText", "src/cron/service/timer.ts: onTimer", - "src/cron/service/timer.ts: wake", "src/cron/session-reaper.ts: resetReaperThrottle", "src/cron/session-reaper.ts: resolveRetentionMs", "src/cron/stagger.ts: isRecurringTopOfHourCronExpr", - "src/cron/store.ts: CronQuarantineFile", "src/cron/store/row-codec.ts: bindScheduleColumns", "src/cron/store/row-codec.ts: scheduleFromRow", - "src/cron/types.ts: CronCompletionDestination", - "src/cron/types.ts: CronFailureDestination", - "src/cron/types.ts: CronFailureDestinationPatch", - "src/cron/types.ts: CronSessionTarget", - "src/cron/types.ts: CronUsageSummary", - "src/cron/types.ts: CronWakeMode", "src/daemon/constants.ts: formatGatewayServiceDescription", "src/daemon/constants.ts: GATEWAY_SYSTEMD_SERVICE_NAME", "src/daemon/constants.ts: GATEWAY_WINDOWS_TASK_NAME", "src/daemon/constants.ts: normalizeGatewayProfile", "src/daemon/gateway-entrypoint.ts: buildGatewayInstallEntrypointCandidates", - "src/daemon/launchd-current-service.ts: CurrentProcessLaunchdServiceLabelOptions", "src/daemon/launchd-plist.ts: LAUNCH_AGENT_PROCESS_TYPE", "src/daemon/launchd-plist.ts: LAUNCH_AGENT_STDIN_PATH", "src/daemon/launchd-plist.ts: LAUNCH_AGENT_THROTTLE_INTERVAL_SECONDS", "src/daemon/launchd-plist.ts: LAUNCH_AGENT_UMASK_DECIMAL", - "src/daemon/launchd-restart-handoff.ts: isCurrentProcessLaunchdServiceLabel", "src/daemon/restart-logs.ts: GATEWAY_RESTART_LOG_FILENAME", - "src/daemon/restart-logs.ts: GatewayLogPaths", "src/daemon/schtasks.ts: parseSchtasksQuery", - "src/daemon/schtasks.ts: ScheduledTaskInfo", "src/daemon/service-env.ts: buildMinimalServicePath", "src/daemon/service-env.ts: getMinimalServicePathParts", "src/daemon/service-env.ts: isNodeVersionManagerRuntime", "src/daemon/service-env.ts: resolveLinuxSystemCaBundle", "src/daemon/service-layout.ts: resolveGatewayServiceEntrypoint", - "src/daemon/service-runtime.ts: GatewayServiceSystemdRuntime", "src/daemon/service.ts: GatewayServiceControlArgs", - "src/daemon/service.ts: GatewayServiceEnv", - "src/daemon/service.ts: GatewayServiceEnvArgs", - "src/daemon/service.ts: GatewayServiceManageArgs", - "src/daemon/service.ts: GatewayServiceReadOptions", - "src/daemon/service.ts: GatewayServiceRestartResult", - "src/daemon/service.ts: GatewayServiceStageArgs", - "src/daemon/service.ts: GatewayServiceStartResult", - "src/daemon/systemd.ts: InstalledSystemdGatewayScope", "src/daemon/systemd.ts: parseSystemdShow", "src/entry.compile-cache.ts: buildOpenClawCompileCacheRespawnPlan", "src/entry.compile-cache.ts: isNodeVersionAffectedByCompileCacheDeadlock", @@ -2557,52 +2268,18 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/entry.compile-cache.ts: resolveOpenClawCompileCacheDirectory", "src/entry.compile-cache.ts: runOpenClawCompileCacheRespawnPlan", "src/entry.compile-cache.ts: shouldEnableOpenClawCompileCache", - "src/fleet/backup.runtime.ts: DEFAULT_FLEET_BACKUP_MAX_BYTES", - "src/fleet/backup.runtime.ts: FLEET_BACKUP_MAX_ENTRIES", - "src/fleet/backup.runtime.ts: FleetBackupResult", - "src/fleet/backup.runtime.ts: FleetRestoreResult", "src/fleet/backup.runtime.ts: resolveRestoreOwner", - "src/fleet/cell-profile.ts: CellContainerArgOptions", "src/fleet/cell-profile.ts: FLEET_BASE_PORT", "src/fleet/cell-profile.ts: FLEET_CONTAINER_AUTH_SECRET_DIR", - "src/fleet/cell-profile.ts: FLEET_CONTAINER_HOME", "src/fleet/cell-profile.ts: FLEET_CONTAINER_STATE_DIR", - "src/fleet/cell-profile.ts: FLEET_MANAGED_ENV_KEYS", - "src/fleet/containers.runtime.ts: __test", - "src/fleet/containers.runtime.ts: CellContainerProfile", "src/fleet/containers.runtime.ts: FleetContainerCommandExecutor", - "src/fleet/containers.runtime.ts: FleetContainerCommandOptions", - "src/fleet/containers.runtime.ts: FleetContainerCommandResult", - "src/fleet/containers.runtime.ts: FleetContainerLogsOptions", - "src/fleet/containers.runtime.ts: FleetContainerRuntimeName", "src/fleet/containers.runtime.ts: FleetContainerStreamExecutor", - "src/fleet/containers.runtime.ts: FleetContainerStreamResult", - "src/fleet/doctor.runtime.ts: FleetDoctorCellReport", - "src/fleet/doctor.runtime.ts: FleetDoctorFinding", - "src/fleet/registry.ts: FleetCellOperationLease", "src/fleet/registry.ts: ReserveFleetCellParams", - "src/fleet/service-support.runtime.ts: FleetHealthResult", - "src/fleet/service-support.runtime.ts: rebuildInspectedEnvironment", - "src/fleet/service-support.runtime.ts: requirePidsLimit", - "src/fleet/service-support.runtime.ts: requirePositiveResource", - "src/fleet/service.runtime.ts: FleetActionResult", - "src/fleet/service.runtime.ts: FleetCreateResult", - "src/fleet/service.runtime.ts: FleetListEntry", - "src/fleet/service.runtime.ts: FleetService", "src/fleet/service.runtime.ts: FleetServiceOptions", - "src/fleet/service.runtime.ts: FleetStatusResult", "src/flows/doctor-health-contributions.ts: createDoctorHealthContribution", "src/flows/doctor-health-contributions.ts: resolveDoctorHealthContributions", "src/flows/doctor-health-contributions.ts: shouldSkipLegacyUpdateDoctorConfigWrite", - "src/flows/doctor-lint-flow.ts: DoctorLintRunResult", - "src/flows/doctor-repair-flow.ts: DoctorRepairRunOptions", - "src/flows/doctor-repair-flow.ts: DoctorRepairRunResult", - "src/flows/doctor-tool-result-cap-advice.ts: ToolResultCapDoctorAdviceParams", - "src/flows/doctor-tool-result-cap-advice.ts: ToolResultCapDoctorIssue", "src/flows/health-check-adapter.ts: defineSplitHealthCheck", - "src/flows/health-check-runner-types.ts: HealthCheckRunContext", - "src/flows/health-check-runner-types.ts: HealthCheckSelectionOptions", - "src/flows/health-checks.ts: HealthCheckMode", "src/gateway/active-sessions-shutdown-tracker.ts: ActiveSessionForShutdown", "src/gateway/active-sessions-shutdown-tracker.ts: clearActiveSessionsForShutdownTracker", "src/gateway/approval-session-audience.ts: ApprovalSessionAudienceSources", @@ -2923,21 +2600,9 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/hooks/bundled/session-memory/transcript.ts: sanitizeSessionMemoryTranscriptText", "src/hooks/gmail-setup-utils.ts: resetGmailSetupUtilsCachesForTest", "src/hooks/gmail-setup-utils.ts: resolvePythonExecutablePath", - "src/hooks/gmail-watcher-lifecycle.ts: GMailWatcherLog", - "src/hooks/gmail-watcher.ts: GmailWatcherStartResult", - "src/hooks/hooks-status.ts: HookInstallOption", - "src/hooks/hooks-status.ts: HookStatusConfigCheck", - "src/hooks/hooks.ts: AgentBootstrapHookContext", - "src/hooks/hooks.ts: createHookEvent", - "src/hooks/install.ts: HookInstallLogger", "src/hooks/install.ts: installHooksFromArchive", "src/hooks/internal-hook-types.ts: KNOWN_INTERNAL_HOOK_EVENT_KEYS", "src/hooks/module-loader.ts: resolveFileModuleUrl", - "src/hooks/update.ts: HookPackUpdateIntegrityDriftParams", - "src/hooks/update.ts: HookPackUpdateLogger", - "src/hooks/update.ts: HookPackUpdateOutcome", - "src/hooks/update.ts: HookPackUpdateStatus", - "src/hooks/update.ts: HookPackUpdateSummary", "src/hooks/workspace.ts: loadHookEntriesFromDir", "src/image-generation/runtime-types.ts: ListRuntimeImageGenerationProvidersParams", "src/image-generation/runtime-types.ts: RuntimeImageGenerationProvider", @@ -3323,39 +2988,14 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/infra/windows-shell-command.ts: RebuiltShellCommandResult", "src/infra/windows-shell-command.ts: ShellSegmentRenderResult", "src/llm/providers/stream-wrappers/anthropic-family-cache-semantics.ts: isAnthropicBedrockModel", - "src/llm/providers/stream-wrappers/moonshot.ts: createMoonshotThinkingWrapper", - "src/llm/providers/stream-wrappers/moonshot.ts: resolveMoonshotThinkingKeep", - "src/llm/providers/stream-wrappers/moonshot.ts: resolveMoonshotThinkingType", - "src/llm/providers/stream-wrappers/reasoning-effort-utils.ts: ReasoningEffort", - "src/llm/stream.ts: getEnvApiKey", - "src/llm/utils/node-http-proxy.ts: NodeHttpProxyAgents", "src/llm/utils/node-http-proxy.ts: resolveHttpProxyUrlForTarget", "src/llm/utils/node-http-proxy.ts: UNSUPPORTED_PROXY_PROTOCOL_MESSAGE", - "src/llm/utils/oauth/anthropic.ts: loginAnthropic", "src/llm/utils/oauth/anthropic.ts: refreshAnthropicToken", "src/llm/utils/oauth/anthropic.ts: testing", - "src/llm/utils/oauth/github-copilot.ts: getGitHubCopilotBaseUrl", - "src/llm/utils/oauth/github-copilot.ts: loginGitHubCopilot", - "src/llm/utils/oauth/github-copilot.ts: normalizeDomain", "src/llm/utils/oauth/github-copilot.ts: refreshGitHubCopilotToken", "src/llm/utils/oauth/github-copilot.ts: testing", - "src/llm/utils/oauth/index.ts: anthropicOAuthProvider", - "src/llm/utils/oauth/index.ts: getGitHubCopilotBaseUrl", - "src/llm/utils/oauth/index.ts: githubCopilotOAuthProvider", - "src/llm/utils/oauth/index.ts: loginAnthropic", - "src/llm/utils/oauth/index.ts: loginGitHubCopilot", - "src/llm/utils/oauth/index.ts: loginOpenAICodex", - "src/llm/utils/oauth/index.ts: normalizeDomain", - "src/llm/utils/oauth/index.ts: openaiCodexOAuthProvider", - "src/llm/utils/oauth/index.ts: refreshAnthropicToken", - "src/llm/utils/oauth/index.ts: refreshGitHubCopilotToken", - "src/llm/utils/oauth/index.ts: refreshOpenAICodexToken", "src/llm/utils/oauth/openai-chatgpt.ts: loginOpenAICodex", "src/llm/utils/oauth/openai-chatgpt.ts: refreshOpenAICodexToken", - "src/llm/utils/oauth/types.ts: OAuthAuthInfo", - "src/llm/utils/oauth/types.ts: OAuthProviderInfo", - "src/llm/utils/oauth/types.ts: OAuthSelectOption", - "src/llm/utils/oauth/types.ts: OAuthSelectPrompt", "src/logging/diagnostic-phase.ts: recordDiagnosticPhase", "src/logging/diagnostic-run-activity.ts: markDiagnosticModelStartedForTest", "src/logging/diagnostic-run-activity.ts: markDiagnosticRunProgressForTest", @@ -3370,59 +3010,23 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/mcp/channel-server.ts: createOpenClawChannelMcpServer", "src/mcp/channel-server.ts: OpenClawChannelBridge", "src/mcp/openclaw-tools-serve-config.ts: OPENCLAW_TOOLS_MCP_CRESTODIAN_SURFACE_ENV", - "src/mcp/openclaw-tools-serve-config.ts: OPENCLAW_TOOLS_MCP_TOOL_IDS", "src/mcp/openclaw-tools-serve-config.ts: OpenClawToolsMcpToolId", "src/mcp/openclaw-tools-serve-config.ts: resolveOpenClawToolsMcpCrestodianApproval", "src/mcp/openclaw-tools-serve-config.ts: resolveOpenClawToolsMcpCrestodianSurface", "src/mcp/openclaw-tools-serve-config.ts: resolveOpenClawToolsMcpToolSelection", "src/media-understanding/apply.ts: sanitizeMimeType", - "src/media-understanding/local-audio.ts: LocalAudioCandidate", "src/media-understanding/local-audio.ts: LocalAudioSelection", "src/media-understanding/runner.entries.ts: formatMissingProviderHint", - "src/media-understanding/runtime-types.ts: MediaUnderstandingScopeContext", - "src/media-understanding/types.ts: MediaUnderstandingDocumentModelDefaults", - "src/media/image-ops.ts: ResizeToJpegParams", - "src/media/image-ops.ts: ResizeToPngParams", "src/media/input-files.ts: fetchWithGuard", - "src/media/parse.ts: MEDIA_TOKEN_RE", - "src/media/parse.ts: normalizeMediaSource", "src/media/parse.ts: SplitMediaFromOutputOptions", - "src/media/read-capability.ts: createAgentScopedHostMediaReadFile", - "src/memory-host-sdk/engine-qmd.ts: QmdBinaryAvailability", - "src/memory-host-sdk/engine-qmd.ts: QmdBinaryUnavailable", - "src/memory-host-sdk/engine-qmd.ts: QmdBinaryUnavailableReason", "src/memory/root-memory-files.ts: resolveCanonicalRootMemoryFile", "src/memory/root-memory-files.ts: shouldSkipRootMemoryAuxiliaryPath", - "src/model-catalog/authority.ts: mergeModelCatalogRowsByAuthority", - "src/model-catalog/index.ts: mergeModelCatalogRowsByAuthority", - "src/model-catalog/index.ts: ModelCatalog", - "src/model-catalog/index.ts: ModelCatalogAlias", - "src/model-catalog/index.ts: ModelCatalogCost", - "src/model-catalog/index.ts: ModelCatalogDiscovery", - "src/model-catalog/index.ts: ModelCatalogInput", - "src/model-catalog/index.ts: ModelCatalogModel", - "src/model-catalog/index.ts: ModelCatalogProvider", - "src/model-catalog/index.ts: ModelCatalogSource", - "src/model-catalog/index.ts: ModelCatalogStatus", - "src/model-catalog/index.ts: ModelCatalogSuppression", - "src/model-catalog/index.ts: ModelCatalogTieredCost", - "src/model-catalog/index.ts: NormalizedModelCatalogRow", - "src/model-catalog/index.ts: UnifiedModelCatalogEntry", - "src/model-catalog/index.ts: UnifiedModelCatalogKind", - "src/model-catalog/index.ts: UnifiedModelCatalogSource", - "src/model-catalog/provider-index/index.ts: normalizeOpenClawProviderIndex", - "src/model-catalog/provider-index/index.ts: OpenClawProviderIndexPlugin", - "src/model-catalog/provider-index/index.ts: OpenClawProviderIndexPluginInstall", - "src/model-catalog/provider-index/index.ts: OpenClawProviderIndexProviderAuthChoice", "src/music-generation/capabilities.ts: resolveMusicGenerationMode", "src/music-generation/runtime-types.ts: ListRuntimeMusicGenerationProvidersParams", "src/music-generation/runtime-types.ts: RuntimeMusicGenerationProvider", - "src/music-generation/runtime.ts: GenerateMusicParams", - "src/music-generation/runtime.ts: GenerateMusicRuntimeResult", "src/music-generation/runtime.ts: MusicGenerationRuntimeDeps", "src/node-host/exec-policy.ts: formatSystemRunAllowlistMissMessage", "src/node-host/invoke-system-run.ts: HandleSystemRunInvokeOptions", - "src/node-host/invoke.ts: boundMcpToolResultPayload", "src/node-host/invoke.ts: buildNodeEventParams", "src/node-host/invoke.ts: decodeCapturedOutputBuffer", "src/node-host/invoke.ts: sanitizeEnv", @@ -3430,38 +3034,18 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/node-host/mcp.ts: buildNodeMcpToolDescriptors", "src/node-host/mcp.ts: countConfiguredNodeHostMcpServers", "src/node-host/mcp.ts: NodeHostMcpErrorCode", - "src/node-host/runner.ts: buildNodeEventParams", "src/node-host/runner.ts: buildNodeInvokeResultParams", "src/node-host/runner.ts: handleNodeHostReconnectPaused", "src/node-host/runner.ts: resolveNodeHostGatewayCredentials", "src/node-host/runner.ts: resolveNodeHostGatewayDeviceFamily", "src/node-host/runner.ts: resolveNodeHostGatewayPlatform", "src/node-host/runner.ts: shouldExitNodeHostOnReconnectPaused", - "src/pairing/pairing-store-sqlite.ts: ChannelPairingState", - "src/pairing/pairing-store-sqlite.ts: readChannelPairingStateSnapshot", - "src/pairing/pairing-store-sqlite.ts: writeChannelPairingStateSnapshot", "src/pairing/pairing-store.types.ts: ReadChannelAllowFromStoreForAccount", "src/pairing/pairing-store.types.ts: UpsertChannelPairingRequestForAccount", - "src/pairing/setup-code.ts: PairingSetupCommandResult", - "src/pairing/setup-code.ts: PairingSetupCommandRunner", - "src/pairing/setup-code.ts: PairingSetupPayload", - "src/pairing/setup-code.ts: PairingSetupResolution", - "src/pairing/setup-code.ts: ResolvePairingSetupOptions", "src/plugin-state/plugin-state-store.sqlite.ts: probePluginStateStore", "src/plugin-state/plugin-state-store.sqlite.ts: seedPluginStateDatabaseEntriesForTests", "src/plugin-state/plugin-state-store.sqlite.ts: setMaxPluginStateEntriesPerPluginForTests", "src/plugin-state/plugin-state-store.ts: clearPluginStateStoreForTests", - "src/plugin-state/plugin-state-store.ts: PluginStateOverflowPolicy", - "src/plugin-state/plugin-state-store.ts: PluginStateStoreError", - "src/plugin-state/plugin-state-store.ts: PluginStateStoreErrorCode", - "src/plugin-state/plugin-state-store.ts: PluginStateStoreOperation", - "src/plugin-state/plugin-state-store.ts: PluginStateStoreProbeResult", - "src/plugin-state/plugin-state-store.ts: PluginStateStoreProbeStep", - "src/plugin-state/plugin-state-store.ts: probePluginStateStore", - "src/plugin-state/plugin-state-store.ts: setMaxPluginStateEntriesPerPluginForTests", - "src/plugin-state/plugin-state-store.types.ts: PluginStateStoreErrorOptions", - "src/plugin-state/runtime-health-store.ts: RuntimeHealthStore", - "src/plugin-state/runtime-health-store.ts: RuntimeHealthStoreOptions", "src/plugins/activation-context.ts: BundledPluginCompatibleActivationInputs", "src/plugins/activation-context.ts: BundledPluginCompatibleLoadValues", "src/plugins/activation-context.ts: PluginActivationCompatConfig", @@ -4005,184 +3589,45 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/plugins/web-provider-types.ts: WebFetchProviderConfiguredCredentialFallback", "src/plugins/web-provider-types.ts: WebSearchProviderConfiguredCredentialFallback", "src/plugins/worker-provider-registry.ts: listWorkerProviderRegistrations", - "src/process/child-process-bridge.ts: ChildProcessBridgeOptions", "src/process/command-queue.ts: CommandLaneTaskTimeoutError", "src/process/command-queue.ts: resetCommandQueueStateForTest", - "src/process/gateway-work-admission.ts: GatewayRootWorkAdmissionLease", - "src/process/gateway-work-admission.ts: GatewaySuspendAdmissionLease", - "src/process/gateway-work-admission.ts: GatewaySuspendAdmissionPhase", - "src/process/gateway-work-admission.ts: runWithGatewayRootWorkAdmission", "src/process/gateway-work-admission.ts: tryBeginGatewayIndependentRootWorkAdmission", - "src/process/linux-oom-score.ts: hardenedEnvForChildOomWrap", - "src/process/linux-oom-score.ts: wrapArgvForChildOomScoreRaise", - "src/process/supervisor/adapters/child.ts: ChildAdapter", - "src/process/supervisor/adapters/pty.ts: PtyAdapter", - "src/process/supervisor/index.ts: createProcessSupervisor", - "src/process/supervisor/index.ts: RunExit", - "src/process/supervisor/index.ts: RunRecord", - "src/process/supervisor/index.ts: RunState", - "src/process/supervisor/index.ts: SpawnInput", - "src/process/supervisor/index.ts: TerminationReason", - "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_BLOB_DIR", - "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_CERT_DIR", - "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_DB_PATH", "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_ENABLED", - "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_REQUIRE", "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_SESSION_ID", - "src/proxy-capture/env.ts: OPENCLAW_DEBUG_PROXY_URL", "src/proxy-capture/proxy-server.ts: assertDebugProxyDirectUpstreamAllowed", "src/proxy-capture/proxy-server.ts: parseConnectTarget", - "src/proxy-capture/store.sqlite.ts: DebugProxyCaptureStoreOptions", - "src/proxy-capture/store.sqlite.ts: LegacyDebugProxyCaptureStore", - "src/proxy-capture/store.sqlite.ts: SharedDebugProxyCaptureStore", "src/realtime-transcription/websocket-session.ts: REALTIME_TRANSCRIPTION_WS_MAX_PAYLOAD_BYTES", - "src/secrets/audit.ts: SecretsAuditCode", - "src/secrets/audit.ts: SecretsAuditFinding", - "src/secrets/audit.ts: SecretsAuditReport", - "src/secrets/audit.ts: SecretsAuditSeverity", - "src/secrets/audit.ts: SecretsAuditStatus", - "src/secrets/auth-profiles-scan.ts: AuthProfileCredentialType", - "src/secrets/auth-profiles-scan.ts: AuthProfileCredentialVisit", - "src/secrets/channel-contract-api.ts: BundledChannelSecretContractApi", - "src/secrets/channel-contract-api.ts: BundledChannelSecurityContractApi", "src/secrets/channel-contract-api.ts: loadBundledChannelSecretContractApi", "src/secrets/channel-contract-api.ts: loadBundledChannelSecurityContractApi", - "src/secrets/channel-env-vars.ts: isSafeChannelEnvVarTriggerName", - "src/secrets/command-config.ts: AnalyzeAssignmentsFromSnapshotResult", - "src/secrets/command-config.ts: collectCommandSecretAssignmentsFromSnapshot", - "src/secrets/command-config.ts: ResolveAssignmentsFromSnapshotResult", - "src/secrets/configure-plan.ts: buildConfigureCandidates", - "src/secrets/configure-plan.ts: ConfigureProviderChanges", - "src/secrets/configure-plan.ts: ConfigureSelectedTarget", - "src/secrets/configure.ts: SecretsConfigureResult", - "src/secrets/legacy-secretref-env-marker.ts: LegacySecretRefEnvMarkerCandidate", - "src/secrets/plan.ts: SecretsPlanTargetType", - "src/secrets/provider-env-vars.ts: __testing", "src/secrets/provider-env-vars.ts: PROVIDER_AUTH_ENV_VAR_CANDIDATES", "src/secrets/provider-env-vars.ts: PROVIDER_ENV_VARS", "src/secrets/provider-env-vars.ts: resolveProviderAuthEvidence", "src/secrets/provider-env-vars.ts: testing", - "src/secrets/ref-contract.ts: EXEC_SECRET_REF_ID_JSON_SCHEMA_PATTERN", - "src/secrets/ref-contract.ts: ExecSecretRefIdValidationReason", - "src/secrets/ref-contract.ts: ExecSecretRefIdValidationResult", - "src/secrets/ref-contract.ts: FILE_SECRET_REF_ID_ABSOLUTE_JSON_SCHEMA_PATTERN", - "src/secrets/ref-contract.ts: FILE_SECRET_REF_ID_INVALID_ESCAPE_JSON_SCHEMA_PATTERN", - "src/secrets/ref-contract.ts: SecretRefDefaultsCarrier", - "src/secrets/runtime-command-secrets.ts: CommandSecretProviderOverrides", - "src/secrets/runtime-gateway-auth-surfaces.ts: GatewayAuthSurfacePath", - "src/secrets/runtime-gateway-auth-surfaces.ts: GatewayAuthSurfaceState", - "src/secrets/runtime-gateway-auth-surfaces.ts: GatewayAuthSurfaceStateMap", - "src/secrets/runtime-web-tools.shared.ts: ResolveRuntimeWebProviderSurfaceParams", - "src/secrets/runtime-web-tools.shared.ts: RuntimeWebProviderMetadataBase", - "src/secrets/runtime-web-tools.shared.ts: RuntimeWebProviderSelectionParams", - "src/secrets/runtime-web-tools.shared.ts: RuntimeWebProviderSurface", - "src/secrets/runtime-web-tools.ts: RuntimeWebDiagnostic", - "src/secrets/runtime-web-tools.ts: RuntimeWebDiagnosticCode", - "src/secrets/runtime-web-tools.ts: RuntimeWebFetchMetadata", - "src/secrets/runtime-web-tools.ts: RuntimeWebSearchMetadata", - "src/secrets/runtime-web-tools.ts: RuntimeWebToolsMetadata", - "src/secrets/secret-value.ts: SecretExpectedResolvedValue", - "src/secrets/storage-scan.ts: ReadJsonObjectOptions", "src/secrets/target-registry-data.ts: getSourceSecretTargetRegistry", - "src/secrets/target-registry-pattern.ts: ExpandedPathMatch", "src/secrets/target-registry-pattern.ts: parsePathPattern", - "src/secrets/target-registry-pattern.ts: PathPatternToken", - "src/secrets/target-registry-query.ts: AuthProfileType", - "src/secrets/target-registry-query.ts: SecretTargetConfigFile", - "src/secrets/target-registry-query.ts: SecretTargetExpected", - "src/secrets/target-registry-query.ts: SecretTargetRegistryEntry", - "src/secrets/target-registry-query.ts: SecretTargetShape", - "src/secrets/target-registry-types.ts: AuthProfileType", - "src/secrets/target-registry-types.ts: SecretTargetExpected", - "src/secrets/target-registry-types.ts: SecretTargetShape", "src/secrets/unsupported-surface-policy.ts: getUnsupportedSecretRefSurfacePatterns", - "src/secrets/unsupported-surface-policy.ts: UnsupportedSecretRefConfigCandidate", - "src/security/audit-extra.async.ts: collectPluginsTrustFindings", - "src/security/audit-extra.async.ts: SecurityAuditFinding", - "src/security/audit-extra.summary.ts: SecurityAuditFinding", - "src/security/audit-extra.sync.ts: GatewayHttpNoAuthAuditOptions", - "src/security/audit-extra.sync.ts: HooksHardeningAuditOptions", - "src/security/audit-extra.sync.ts: SecurityAuditFinding", - "src/security/audit-gateway-config.ts: CollectGatewayConfigFindingsOptions", - "src/security/audit-model-refs.ts: AuditModelRef", - "src/security/audit.ts: AuditExecutionContext", "src/security/audit.ts: collectElevatedFindings", "src/security/audit.ts: collectExecRuntimeFindings", "src/security/audit.ts: collectFilesystemFindings", "src/security/audit.ts: collectGatewayConfigFindings", "src/security/audit.ts: collectLoggingFindings", "src/security/audit.ts: collectPluginSecurityAuditFindings", - "src/security/audit.ts: SecurityAuditFinding", - "src/security/audit.ts: SecurityAuditOptions", - "src/security/audit.ts: SecurityAuditSeverity", - "src/security/audit.ts: SecurityAuditSummary", - "src/security/config-regex.ts: CompiledConfigRegex", - "src/security/dangerous-config-flags-core.ts: DangerousConfigFlagContractInputs", - "src/security/exec-filesystem-policy.ts: ExecFilesystemPolicyDriftHit", "src/security/fix.ts: applySecurityFixConfigMutations", "src/security/fix.ts: collectSecurityPermissionTargets", - "src/security/fix.ts: SecurityFixAction", - "src/security/fix.ts: SecurityFixChmodAction", - "src/security/fix.ts: SecurityFixIcaclsAction", - "src/security/fix.ts: SecurityFixResult", - "src/security/fix.ts: SecurityPermissionTarget", "src/security/install-policy.ts: InstallPolicyRequest", - "src/security/install-policy.ts: InstallPolicyResult", - "src/security/install-policy.ts: InstallPolicyTarget", - "src/security/install-policy.ts: InstallPolicyValidationIssue", - "src/security/windows-acl.ts: formatWindowsAclSummary", - "src/security/windows-acl.ts: inspectWindowsAcl", - "src/security/windows-acl.ts: parseIcaclsOutput", - "src/security/windows-acl.ts: resolveWindowsUserPrincipal", - "src/security/windows-acl.ts: summarizeWindowsAcl", - "src/security/windows-acl.ts: WindowsAclEntry", - "src/security/windows-acl.ts: WindowsAclSummary", - "src/sessions/agent-harness-session-key.ts: AGENT_HARNESS_SESSION_KEY_PREFIX", - "src/sessions/input-provenance.ts: INPUT_PROVENANCE_KIND_VALUES", - "src/sessions/input-provenance.ts: InputProvenanceKind", - "src/sessions/model-overrides.ts: assertModelSelectionUnlocked", - "src/sessions/model-overrides.ts: ModelOverrideSelection", - "src/sessions/session-chat-type-shared.ts: CanonicalSessionPeerShape", - "src/sessions/session-chat-type.ts: deriveSessionChatTypeFromKey", - "src/sessions/session-chat-type.ts: SessionKeyChatType", "src/sessions/session-key-utils.ts: isCasePreservingPeer", - "src/sessions/session-key-utils.ts: ParsedCronRunScopeSuffix", - "src/sessions/session-key-utils.ts: ParsedSessionDeliveryRoute", "src/sessions/session-lifecycle-admission.ts: runExclusiveSessionLifecycle", - "src/sessions/session-lifecycle-admission.ts: SessionLifecycleMutationKind", "src/sessions/session-state-events.ts: pruneSessionStateEvents", "src/sessions/session-state-events.ts: recordSessionStateEvent", - "src/sessions/session-state-events.ts: SessionStateEventInput", - "src/sessions/session-state-events.ts: SessionStateEventKind", - "src/sessions/session-state-events.ts: SessionStateEventRecord", "src/sessions/session-state-events.ts: sessionStateEventStoreLimits", - "src/sessions/transcript-events.ts: emitInternalSessionTranscriptUpdate", - "src/sessions/transcript-events.ts: SessionTranscriptUpdateTarget", - "src/sessions/user-turn-transcript-runtime-context.ts: RuntimeUserTurnTranscriptContext", - "src/sessions/user-turn-transcript.ts: attachRuntimeUserTurnTranscriptContext", - "src/sessions/user-turn-transcript.ts: attachRuntimeUserTurnTranscriptRecorder", "src/sessions/user-turn-transcript.ts: persistUserTurnTranscript", - "src/sessions/user-turn-transcript.ts: RuntimeUserTurnTranscriptContext", - "src/sessions/user-turn-transcript.ts: takeRuntimeUserTurnTranscriptContext", - "src/sessions/user-turn-transcript.ts: takeRuntimeUserTurnTranscriptRecorder", - "src/sessions/user-turn-transcript.types.ts: UserTurnTranscriptPersistenceTarget", - "src/shared/avatar-policy.ts: AVATAR_MAX_DATA_URL_CHARS", - "src/shared/avatar-policy.ts: isAvatarImageDataUrl", - "src/shared/avatar-policy.ts: isWorkspaceRelativeAvatarPath", "src/shared/config-eval.ts: evaluateRuntimeRequires", "src/shared/config-eval.ts: isTruthy", "src/shared/config-eval.ts: resolveConfigPath", "src/shared/config-eval.ts: resolveRuntimePlatform", - "src/shared/custom-command-config.ts: CustomCommandConfig", - "src/shared/custom-command-config.ts: CustomCommandInput", - "src/shared/custom-command-config.ts: CustomCommandIssue", "src/shared/device-auth-store.ts: DeviceAuthStoreAdapter", - "src/shared/device-pairing-access.ts: PendingDeviceApprovalState", "src/shared/entry-status.ts: evaluateEntryMetadataRequirements", "src/shared/entry-status.ts: evaluateEntryMetadataRequirementsForCurrentPlatform", - "src/shared/frontmatter.ts: OpenClawManifestRequires", - "src/shared/frontmatter.ts: ParsedOpenClawManifestInstallBase", - "src/shared/lazy-runtime.ts: LazyPromiseLoader", "src/shared/node-match.ts: normalizeNodeKey", "src/shared/requirements.ts: buildConfigChecks", "src/shared/requirements.ts: evaluateRequirements", @@ -4192,10 +3637,7 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/shared/requirements.ts: resolveMissingEnv", "src/shared/requirements.ts: resolveMissingOs", "src/shared/runtime-import.ts: resolveRuntimeImportSpecifier", - "src/shared/session-types.ts: GatewayAgentIdentity", - "src/shared/session-types.ts: GatewayAgentModel", "src/shared/silent-reply-policy.ts: DEFAULT_SILENT_REPLY_POLICY", - "src/shared/store-writer-queue.ts: StoreWriterTask", "src/shared/subagents-format.ts: formatTokenShort", "src/shared/subagents-format.ts: resolveIoTokens", "src/skills/discovery/chat-commands.ts: testing", @@ -4204,26 +3646,15 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/skills/discovery/skill-index.ts: isSkillRuntimeVisible", "src/skills/discovery/skill-index.ts: isSkillUserInvocable", "src/skills/lifecycle/gh-config-discovery.ts: GhConfigDirMismatch", - "src/skills/lifecycle/install.ts: SkillInstallRequest", - "src/skills/lifecycle/install.ts: SkillInstallResult", "src/skills/lifecycle/install.ts: testing", "src/skills/lifecycle/upload-store.ts: createSkillUploadStore", "src/skills/lifecycle/upload-store.ts: MAX_ACTIVE_SKILL_UPLOADS", "src/skills/loading/plugin-skills.ts: testing", - "src/skills/research/signals.ts: extractDurableInstructionProposals", - "src/skills/research/signals.ts: WorkspaceSkillSummary", "src/skills/runtime/refresh.ts: bumpSkillsSnapshotVersion", - "src/skills/runtime/refresh.ts: getSkillsSnapshotVersion", "src/skills/runtime/refresh.ts: resetSkillsRefreshForTest", "src/skills/runtime/refresh.ts: shouldIgnoreSkillsWatchPath", - "src/skills/runtime/refresh.ts: shouldRefreshSnapshotForVersion", - "src/skills/runtime/refresh.ts: SkillsChangeEvent", "src/skills/runtime/remote-skills.ts: resetRemoteNodeSkillsForTests", "src/skills/runtime/session-snapshot.ts: resetResolvedSkillsCacheForTests", - "src/skills/runtime/session-snapshot.ts: ReusableSkillSnapshotParams", - "src/skills/runtime/session-snapshot.ts: ReusableSkillSnapshotResult", - "src/skills/types.ts: SkillCommandDispatchSpec", - "src/skills/types.ts: SkillExposure", "src/skills/workshop/curator.ts: ARCHIVE_AFTER_MS", "src/skills/workshop/curator.ts: CURATOR_INITIAL_DELAY_MS", "src/skills/workshop/curator.ts: CURATOR_SWEEP_INTERVAL_MS", @@ -4231,126 +3662,47 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/skills/workshop/curator.ts: recordSkillUsage", "src/skills/workshop/curator.ts: registerSkillUsageTracking", "src/skills/workshop/curator.ts: runSkillCuratorSweep", - "src/skills/workshop/curator.ts: SkillCuratorSweepResult", - "src/skills/workshop/curator.ts: SkillLifecycleState", - "src/skills/workshop/curator.ts: SkillOverlapCandidate", "src/skills/workshop/curator.ts: STALE_AFTER_MS", - "src/skills/workshop/service.ts: WritableWorkspaceSkillSummary", - "src/skills/workshop/tool-policy-diagnostic.ts: SkillWorkshopToolPolicyAvailability", - "src/skills/workshop/tool-policy-diagnostic.ts: SkillWorkshopToolPolicyDiagnostic", - "src/state/openclaw-agent-db.paths.ts: OpenClawAgentSqlitePathOptions", - "src/status/codex-synthetic-usage.ts: CODEX_SYNTHETIC_USAGE_HOOK_PROVIDER", - "src/status/codex-synthetic-usage.ts: CODEX_SYNTHETIC_USAGE_PROVIDER", - "src/status/status-message.ts: StatusArgs", "src/status/status-text.ts: resolveStatusChannelFeatureLine", - "src/talk/agent-consult-runtime.ts: RealtimeVoiceAgentConsultContextMode", - "src/talk/agent-consult-runtime.ts: resolveRealtimeVoiceAgentConsultTools", - "src/talk/agent-consult-runtime.ts: resolveRealtimeVoiceAgentConsultToolsAllow", "src/talk/agent-consult-runtime.ts: setRealtimeVoiceAgentConsultDepsForTest", - "src/talk/agent-run-control.ts: RealtimeVoiceAgentRunActivity", - "src/talk/provider-types.ts: RealtimeVoiceBrowserGatewayRelaySession", - "src/talk/provider-types.ts: RealtimeVoiceBrowserJsonPcmWebSocketSession", - "src/talk/provider-types.ts: RealtimeVoiceBrowserManagedRoomSession", - "src/talk/provider-types.ts: RealtimeVoiceBrowserWebRtcSdpSession", - "src/talk/talk-session-controller.ts: TalkEventContext", "src/tasks/cron-task-cancel.ts: CRON_TASK_RUN_SETTLEMENT_TRACKING_MAX_MS", "src/tasks/cron-task-cancel.ts: resetActiveCronTaskRunsForTests", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskCancelParams", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskCancelResult", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskCompleteParams", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskDeliveryStatusParams", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskFailParams", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskProgressParams", - "src/tasks/detached-task-runtime-contract.ts: DetachedTaskStartParams", "src/tasks/detached-task-runtime-state.ts: DetachedTaskLifecycleRuntime", - "src/tasks/detached-task-runtime-state.ts: DetachedTaskLifecycleRuntimeRegistration", "src/tasks/detached-task-runtime.ts: cancelDetachedTaskRunById", - "src/tasks/detached-task-runtime.ts: DetachedTaskLifecycleRuntime", - "src/tasks/detached-task-runtime.ts: DetachedTaskLifecycleRuntimeRegistration", "src/tasks/detached-task-runtime.ts: getDetachedTaskLifecycleRuntimeRegistration", "src/tasks/detached-task-runtime.ts: registerDetachedTaskRuntime", "src/tasks/detached-task-runtime.ts: resetDetachedTaskLifecycleRuntimeForTests", "src/tasks/detached-task-runtime.ts: setDetachedTaskLifecycleRuntime", "src/tasks/generated-media-task-activity.ts: resetGeneratedMediaTaskActivityForTests", - "src/tasks/native-subagent-task.ts: COPILOT_NATIVE_SUBAGENT_RUN_ID_PREFIX", - "src/tasks/native-subagent-task.ts: COPILOT_NATIVE_SUBAGENT_TASK_KIND", - "src/tasks/native-subagent-task.ts: NativeSubagentTaskDefinition", - "src/tasks/runtime-internal.ts: findLatestTaskForFlowId", - "src/tasks/runtime-internal.ts: reloadTaskRegistryFromStore", - "src/tasks/runtime-internal.ts: resetTaskRegistryControlRuntimeForTests", - "src/tasks/runtime-internal.ts: resetTaskRegistryDeliveryRuntimeForTests", "src/tasks/runtime-internal.ts: resetTaskRegistryForTests", - "src/tasks/runtime-internal.ts: setTaskRegistryControlRuntimeForTests", - "src/tasks/runtime-internal.ts: setTaskRegistryDeliveryRuntimeForTests", "src/tasks/task-executor.ts: runTaskInFlow", "src/tasks/task-flow-registry.store.ts: configureTaskFlowRegistryRuntime", - "src/tasks/task-flow-registry.store.ts: TaskFlowRegistryObservers", - "src/tasks/task-flow-registry.store.ts: TaskFlowRegistryStore", - "src/tasks/task-flow-registry.store.ts: TaskFlowRegistryStoreSnapshot", "src/tasks/task-flow-registry.ts: createFlowRecord", - "src/tasks/task-flow-registry.ts: CreateFlowRecordParams", "src/tasks/task-flow-registry.ts: resetTaskFlowRegistryForTests", "src/tasks/task-flow-registry.ts: syncFlowFromTask", - "src/tasks/task-flow-registry.ts: TaskFlowSyncResult", "src/tasks/task-flow-runtime-internal.ts: resetTaskFlowRegistryForTests", - "src/tasks/task-flow-runtime-internal.ts: syncFlowFromTask", - "src/tasks/task-flow-runtime-internal.ts: TaskFlowSyncResult", - "src/tasks/task-registry-control.types.ts: CancelAcpSessionAdmin", - "src/tasks/task-registry-control.types.ts: KillSubagentRunAdmin", - "src/tasks/task-registry-control.types.ts: KillSubagentRunAdminResult", - "src/tasks/task-registry.audit.ts: createEmptyTaskAuditSummary", - "src/tasks/task-registry.audit.ts: TaskAuditOptions", "src/tasks/task-registry.ts: findLatestTaskForFlowId", "src/tasks/task-registry.ts: findLatestTaskForRelatedSessionKey", "src/tasks/task-registry.ts: maybeDeliverTaskStateChangeUpdate", - "src/tasks/task-registry.ts: ParentFlowLinkErrorCode", "src/tasks/task-registry.ts: resetTaskRegistryControlRuntimeForTests", "src/tasks/task-registry.ts: resetTaskRegistryDeliveryRuntimeForTests", "src/tasks/task-registry.ts: resetTaskRegistryForTests", "src/tasks/task-registry.ts: setTaskRegistryControlRuntimeForTests", "src/tasks/task-registry.ts: setTaskRegistryDeliveryRuntimeForTests", - "src/tools/diagnostics.ts: ToolPlanContractErrorCode", - "src/tools/protocol.ts: ToolProtocolDescriptor", - "src/trajectory/paths.ts: resolveTrajectoryPointerOpenFlags", - "src/trajectory/runtime-store.sqlite.ts: loadSqliteTrajectoryRuntimeEventsSync", - "src/trajectory/runtime-store.sqlite.ts: readSqliteTrajectoryRuntimeStatsSync", - "src/trajectory/runtime-store.sqlite.ts: SqliteTrajectoryRuntimeEventRow", - "src/trajectory/runtime-store.sqlite.ts: SqliteTrajectoryRuntimeStats", - "src/tts/directives.ts: TtsDirectiveTextStreamCleaner", - "src/tui/commands.ts: ParsedCommand", - "src/tui/commands.ts: SlashCommandOptions", "src/tui/components/filterable-select-list.ts: FilterableSelectListTheme", - "src/tui/gateway-chat.ts: GatewayAgentsList", - "src/tui/gateway-chat.ts: GatewayConnectionOptions", - "src/tui/gateway-chat.ts: GatewayEvent", - "src/tui/gateway-chat.ts: GatewayModelChoice", - "src/tui/gateway-chat.ts: GatewaySessionList", "src/tui/gateway-chat.ts: resolveBoundGatewayConnection", - "src/tui/gateway-chat.ts: ResolvedGatewayConnection", "src/tui/gateway-chat.ts: resolveGatewayConnection", "src/tui/theme/theme.ts: lightMode", "src/tui/theme/theme.ts: lightPalette", "src/tui/theme/theme.ts: palette", - "src/tui/tui-backend.ts: TuiGoalCommandOptions", - "src/tui/tui-backend.ts: TuiTaskSuggestionActionCapabilities", "src/tui/tui-busy-notice.ts: TUI_AGENT_BUSY_MESSAGE", "src/tui/tui-last-session.ts: isHeartbeatLikeTuiSession", "src/tui/tui-last-session.ts: resolveTuiLastSessionStatePath", "src/tui/tui-plugin-approvals.ts: parseTuiPluginApproval", "src/tui/tui-task-suggestions.ts: parseTuiTaskSuggestion", - "src/tui/tui-types.ts: QueuedMessage", - "src/tui/tui-types.ts: QueuedMessageMode", - "src/tui/tui-types.ts: TuiExitReason", "src/tui/tui-waiting.ts: pickWaitingPhrase", - "src/utils/delivery-context.shared.ts: DeliveryContextSessionSource", - "src/utils/message-channel-constants.ts: InternalMessageChannel", "src/utils/message-channel-constants.ts: NATIVE_APPROVAL_CHANNELS", - "src/utils/message-channel-constants.ts: NativeApprovalChannel", - "src/utils/message-channel.ts: InternalMessageChannel", - "src/utils/message-channel.ts: NATIVE_APPROVAL_CHANNELS", - "src/utils/message-channel.ts: NativeApprovalChannel", "src/utils/queue-helpers.ts: clearQueueSummaryState", - "src/utils/timer-delay.ts: resolveFiniteTimeoutDelayMs", "src/video-generation/runtime-types.ts: ListRuntimeVideoGenerationProvidersParams", "src/video-generation/runtime-types.ts: RuntimeVideoGenerationProvider", "src/web-search/runtime-types.ts: ListWebSearchProvidersParams", @@ -4359,20 +3711,10 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/wizard/i18n/index.ts: listWizardI18nKeys", "src/wizard/i18n/index.ts: resolveWizardLocale", "src/wizard/i18n/index.ts: resolveWizardLocaleFromEnv", - "src/wizard/i18n/index.ts: WIZARD_DEFAULT_LOCALE", "src/wizard/i18n/index.ts: WIZARD_SUPPORTED_LOCALES", - "src/wizard/i18n/index.ts: WizardLocale", - "src/wizard/i18n/index.ts: WizardTranslationMap", - "src/wizard/prompts.ts: WizardDeviceCodeParams", - "src/wizard/session.ts: WizardStepOption", "src/wizard/setup.migration-import.ts: inspectSetupMigrationFreshness", - "src/wizard/setup.migration-import.ts: SetupMigrationDetection", - "src/wizard/setup.migration-import.ts: SetupMigrationOption", - "src/wizard/setup.official-plugins.ts: OfficialPluginOnboardingInstallEntry", "src/wizard/setup.official-plugins.ts: resolveOfficialPluginOnboardingInstallEntries", "src/wizard/setup.official-plugins.ts: testing", - "src/wizard/setup.post-install-migration.ts: PostInstallMigrationOptions", - "src/wizard/setup.post-install-migration.ts: PostInstallMigrationResult", "ui/src/api/gateway.ts: CONTROL_UI_BOOTSTRAP_OPERATOR_SCOPES", "ui/src/api/gateway.ts: CONTROL_UI_OPERATOR_SCOPES", "ui/src/api/gateway.ts: isNonRecoverableConnectError", diff --git a/src/acp/runtime/adapter-contract.testkit.ts b/src/acp/runtime/adapter-contract.testkit.ts index 8f53b1d4fe38..e5ab1fd202a4 100644 --- a/src/acp/runtime/adapter-contract.testkit.ts +++ b/src/acp/runtime/adapter-contract.testkit.ts @@ -6,7 +6,7 @@ import { expect } from "vitest"; import { toAcpRuntimeError } from "./errors.js"; /** Inputs and optional assertions for the shared ACP runtime adapter contract. */ -export type AcpRuntimeAdapterContractParams = { +type AcpRuntimeAdapterContractParams = { createRuntime: () => Promise | AcpRuntime; agentId?: string; successPrompt?: string; diff --git a/src/acp/runtime/session-meta.ts b/src/acp/runtime/session-meta.ts index c0b87df3fc49..bfe02383abc8 100644 --- a/src/acp/runtime/session-meta.ts +++ b/src/acp/runtime/session-meta.ts @@ -73,7 +73,7 @@ function resolveStoreSessionKey( } /** Resolves the session store path that owns an ACP session key. */ -export function resolveSessionStorePathForAcp(params: { +function resolveSessionStorePathForAcp(params: { sessionKey: string; cfg?: OpenClawConfig; env?: NodeJS.ProcessEnv; diff --git a/src/agents/anthropic.setup-token.live.test.ts b/src/agents/anthropic.setup-token.live.test.ts index 84e0271d75c4..4c9b352a1d0f 100644 --- a/src/agents/anthropic.setup-token.live.test.ts +++ b/src/agents/anthropic.setup-token.live.test.ts @@ -9,11 +9,9 @@ import os from "node:os"; import path from "node:path"; import { completeSimple, type Model } from "openclaw/plugin-sdk/llm"; import { describe, expect, it } from "vitest"; -import { - ANTHROPIC_SETUP_TOKEN_PREFIX, - validateAnthropicSetupToken, -} from "../commands/auth-token.js"; +import { validateAnthropicSetupToken } from "../commands/auth-token.js"; import { getRuntimeConfig } from "../config/config.js"; +import { ANTHROPIC_SETUP_TOKEN_PREFIX } from "../plugins/provider-auth-token.js"; import { discoverAuthStorage, discoverModels } from "./agent-model-discovery.js"; import { resolveDefaultAgentDir } from "./agent-scope.js"; import { diff --git a/src/agents/bash-tools.exec-foreground-failures.test.ts b/src/agents/bash-tools.exec-foreground-failures.test.ts index 82236085f0ed..94519b534df1 100644 --- a/src/agents/bash-tools.exec-foreground-failures.test.ts +++ b/src/agents/bash-tools.exec-foreground-failures.test.ts @@ -8,7 +8,8 @@ import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createTempDirTracker } from "../../test/helpers/temp-dir.js"; -import type { ProcessSupervisor, SpawnInput } from "../process/supervisor/index.js"; +import type { ProcessSupervisor } from "../process/supervisor/index.js"; +import type { SpawnInput } from "../process/supervisor/types.js"; import { captureEnv } from "../test-utils/env.js"; import { resetProcessRegistryForTests } from "./bash-process-registry.js"; import { createExecTool } from "./bash-tools.exec.js"; diff --git a/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts b/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts index 007e12843fb6..8b7b2f82ca0b 100644 --- a/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts +++ b/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts @@ -10,7 +10,8 @@ import { type DiagnosticExecProcessCompletedEvent, type DiagnosticEventPayload, } from "../infra/diagnostic-events.js"; -import type { ManagedRun, SpawnInput } from "../process/supervisor/index.js"; +import type { ManagedRun } from "../process/supervisor/index.js"; +import type { SpawnInput } from "../process/supervisor/types.js"; let listRunningSessions: typeof import("./bash-process-registry.js").listRunningSessions; let resetProcessRegistryForTests: typeof import("./bash-process-registry.js").resetProcessRegistryForTests; diff --git a/src/agents/embedded-agent-runner-extraparams-moonshot.test.ts b/src/agents/embedded-agent-runner-extraparams-moonshot.test.ts index 71e5c14d9204..3a41771456dc 100644 --- a/src/agents/embedded-agent-runner-extraparams-moonshot.test.ts +++ b/src/agents/embedded-agent-runner-extraparams-moonshot.test.ts @@ -6,7 +6,7 @@ import { createMoonshotThinkingWrapper, resolveMoonshotThinkingKeep, resolveMoonshotThinkingType, -} from "../llm/providers/stream-wrappers/moonshot.js"; +} from "../llm/providers/stream-wrappers/moonshot-thinking.js"; import { runExtraParamsPayloadCase } from "./embedded-agent-runner-extraparams.test-support.js"; import { testing as extraParamsTesting } from "./embedded-agent-runner/extra-params.js"; diff --git a/src/agents/embedded-agent-runner.guard.test.ts b/src/agents/embedded-agent-runner.guard.test.ts index 9a7175071ec8..0719ed4f8404 100644 --- a/src/agents/embedded-agent-runner.guard.test.ts +++ b/src/agents/embedded-agent-runner.guard.test.ts @@ -11,10 +11,8 @@ import { createMockPluginRegistry } from "openclaw/plugin-sdk/plugin-test-runtim import { afterEach, describe, expect, it } from "vitest"; import { useAutoCleanupTempDirTracker } from "../../test/helpers/temp-dir.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; -import { - attachRuntimeUserTurnTranscriptContext, - createUserTurnTranscriptRecorder, -} from "../sessions/user-turn-transcript.js"; +import { attachRuntimeUserTurnTranscriptContext } from "../sessions/user-turn-transcript-runtime-context.js"; +import { createUserTurnTranscriptRecorder } from "../sessions/user-turn-transcript.js"; import { createTestUserTurnTranscriptTarget } from "../sessions/user-turn-transcript.test-support.js"; import { guardSessionManager } from "./session-tool-result-guard-wrapper.js"; import { sanitizeToolUseResultPairing } from "./session-transcript-repair.js"; diff --git a/src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts b/src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts index 92364a210b43..2a3ebdbcac59 100644 --- a/src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts +++ b/src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts @@ -4,7 +4,8 @@ import { completeTaskRunByRunId, createRunningTaskRun, } from "../../../tasks/detached-task-runtime.js"; -import { resetTaskRegistryForTests, type TaskRecord } from "../../../tasks/runtime-internal.js"; +import type { TaskRecord } from "../../../tasks/runtime-internal.js"; +import { resetTaskRegistryForTests } from "../../../tasks/task-registry.js"; import { requiresCompletionRequiredAsyncTaskWait, shouldWaitForCompletionRequiredAsyncTasks, diff --git a/src/agents/identity-avatar-file.test.ts b/src/agents/identity-avatar-file.test.ts index a05dd145b348..5d8afb44bca7 100644 --- a/src/agents/identity-avatar-file.test.ts +++ b/src/agents/identity-avatar-file.test.ts @@ -4,7 +4,8 @@ import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import { useAutoCleanupTempDirTracker } from "../../test/helpers/temp-dir.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; -import { AVATAR_MAX_BYTES, AVATAR_MAX_DATA_URL_CHARS } from "../shared/avatar-policy.js"; +import { AVATAR_MAX_DATA_URL_CHARS } from "../shared/avatar-limits.js"; +import { AVATAR_MAX_BYTES } from "../shared/avatar-policy.js"; import { openLocalAgentAvatarFile, readOpenedLocalAgentAvatarDataUrl, diff --git a/src/agents/identity-avatar.test.ts b/src/agents/identity-avatar.test.ts index 21aa4cf6688d..0ab18fcfafb3 100644 --- a/src/agents/identity-avatar.test.ts +++ b/src/agents/identity-avatar.test.ts @@ -4,7 +4,8 @@ import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; -import { AVATAR_MAX_BYTES, AVATAR_MAX_DATA_URL_CHARS } from "../shared/avatar-policy.js"; +import { AVATAR_MAX_DATA_URL_CHARS } from "../shared/avatar-limits.js"; +import { AVATAR_MAX_BYTES } from "../shared/avatar-policy.js"; import { resolveAgentAvatar, resolvePublicAgentAvatarSource } from "./identity-avatar.js"; async function writeFile(filePath: string, contents = "avatar") { diff --git a/src/agents/sessions/sdk.test.ts b/src/agents/sessions/sdk.test.ts index e634951280bb..94fe70730d42 100644 --- a/src/agents/sessions/sdk.test.ts +++ b/src/agents/sessions/sdk.test.ts @@ -4,10 +4,7 @@ import { createAssistantMessageEventStream, type AssistantMessage } from "opencl import { Type } from "typebox"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { Model, SimpleStreamOptions } from "../../llm/types.js"; -import { - createUserTurnTranscriptRecorder, - takeRuntimeUserTurnTranscriptContext, -} from "../../sessions/user-turn-transcript.js"; +import { createUserTurnTranscriptRecorder } from "../../sessions/user-turn-transcript.js"; import { createTestUserTurnTranscriptTarget } from "../../sessions/user-turn-transcript.test-support.js"; const thinkingMocks = vi.hoisted(() => ({ @@ -23,6 +20,7 @@ vi.mock("../../auto-reply/thinking.js", () => ({ vi.mock("../../llm/stream.js", () => ({ streamSimple: streamMocks.streamSimple, })); +import { takeRuntimeUserTurnTranscriptContext } from "../../sessions/user-turn-transcript-runtime-context.js"; import { AuthStorage } from "./auth-storage.js"; import { createExtensionRuntime } from "./extensions/loader.js"; import type { LoadExtensionsResult, ToolDefinition } from "./extensions/types.js"; diff --git a/src/audit/audit-event-types.ts b/src/audit/audit-event-types.ts index a50e3925ad2f..e248e2f0cfa5 100644 --- a/src/audit/audit-event-types.ts +++ b/src/audit/audit-event-types.ts @@ -2,9 +2,9 @@ export const AUDIT_EVENT_SCHEMA_VERSION = 1 as const; -export type AuditEventKind = "agent_run" | "tool_action" | "message"; +type AuditEventKind = "agent_run" | "tool_action" | "message"; -export type AuditEventStatus = +type AuditEventStatus = | "started" | "succeeded" | "failed" @@ -13,7 +13,7 @@ export type AuditEventStatus = | "blocked" | "unknown"; -export type AuditMessageDirection = "inbound" | "outbound"; +type AuditMessageDirection = "inbound" | "outbound"; export type AuditMessageConversationKind = "direct" | "group" | "channel" | "unknown"; export type AuditMessageDeliveryKind = "text" | "media" | "other"; export type AuditMessageFailureStage = "platform_send" | "queue" | "unknown"; @@ -41,7 +41,7 @@ export const AUDIT_INBOUND_MESSAGE_SKIPPED_REASONS = [ export type AuditInboundMessageSkippedReasonCode = (typeof AUDIT_INBOUND_MESSAGE_SKIPPED_REASONS)[number]; -export type AuditInboundMessageFailureReasonCode = "acp_dispatch_failed" | "plugin_bound_error"; +type AuditInboundMessageFailureReasonCode = "acp_dispatch_failed" | "plugin_bound_error"; export const AUDIT_OUTBOUND_MESSAGE_SUPPRESSED_REASONS = [ "cancelled_by_message_sending_hook", @@ -85,7 +85,7 @@ export type AgentRunAuditEventInput = AuditEventInputBase & AgentAuditAttribution & AgentRunAuditLifecycle & { kind: "agent_run" }; -export type ToolActionFinishedAuditTerminal = +type ToolActionFinishedAuditTerminal = | { status: "succeeded"; errorCode?: never } | { status: "failed"; errorCode: "tool_failed" } | { status: "cancelled"; errorCode: "tool_cancelled" } diff --git a/src/audit/audit-identity.ts b/src/audit/audit-identity.ts index 7309e1352575..bd1391bbdcd7 100644 --- a/src/audit/audit-identity.ts +++ b/src/audit/audit-identity.ts @@ -29,12 +29,12 @@ const AUDIT_IDENTITY_DOMAIN = "openclaw.audit.identity.v1"; // around a nested creation would leave a cached key that was never persisted. const identityByDatabase = new WeakMap(); -export type AuditIdentityKey = { +type AuditIdentityKey = { keyId: string; key: Uint8Array; }; -export type AuditIdentityKind = "account" | "actor" | "conversation" | "message" | "target"; +type AuditIdentityKind = "account" | "actor" | "conversation" | "message" | "target"; function registerAuditIdentityKeyForRedaction(key: Uint8Array): void { const bytes = Buffer.from(key); diff --git a/src/audit/audit-recorder.ts b/src/audit/audit-recorder.ts index 08e8535df31f..d2aa84aa5df0 100644 --- a/src/audit/audit-recorder.ts +++ b/src/audit/audit-recorder.ts @@ -12,7 +12,7 @@ import type { TrustedMessageAuditEvent } from "./message-audit-events.js"; const log = createSubsystemLogger("audit/events"); let persistenceFailureWarned = false; -export type AuditEventRecorder = AgentEventAuditRecorder & { +type AuditEventRecorder = AgentEventAuditRecorder & { recordMessage: (event: TrustedMessageAuditEvent) => void; }; diff --git a/src/auto-reply/dispatch.test.ts b/src/auto-reply/dispatch.test.ts index b17d86f600b9..93989a893fd0 100644 --- a/src/auto-reply/dispatch.test.ts +++ b/src/auto-reply/dispatch.test.ts @@ -4,7 +4,8 @@ import type { OpenClawConfig } from "../config/config.js"; import { onDiagnosticEvent, resetDiagnosticEventsForTest } from "../infra/diagnostic-events.js"; import { registerReplyDispatcherSettledTask } from "./dispatch-dispatcher.js"; import { getReplyPayloadMetadata, setReplyPayloadMetadata } from "./reply-payload.js"; -import type { ReplyDispatchBeforeDeliver, ReplyDispatcher } from "./reply/reply-dispatcher.js"; +import type { ReplyDispatchBeforeDeliver } from "./reply/reply-dispatcher.js"; +import type { ReplyDispatcher } from "./reply/reply-dispatcher.types.js"; import { buildTestCtx } from "./reply/test-ctx.js"; type DispatchReplyFromConfigFn = diff --git a/src/auto-reply/dispatch.ts b/src/auto-reply/dispatch.ts index 52eef112bd4a..6ecbaad397dd 100644 --- a/src/auto-reply/dispatch.ts +++ b/src/auto-reply/dispatch.ts @@ -467,7 +467,7 @@ function buildDispatchTimelineAttributes(ctx: MsgContext | FinalizedMsgContext) }; } -export type DispatchInboundResult = DispatchFromConfigResult; +type DispatchInboundResult = DispatchFromConfigResult; export { settleReplyDispatcher, withReplyDispatcher } from "./dispatch-dispatcher.js"; function finalizeDispatchResult( diff --git a/src/auto-reply/fallback-state.test.ts b/src/auto-reply/fallback-state.test.ts index cc60b18b0505..38ea63eeeccf 100644 --- a/src/auto-reply/fallback-state.test.ts +++ b/src/auto-reply/fallback-state.test.ts @@ -2,11 +2,10 @@ import { afterEach, describe, expect, it } from "vitest"; import { testing as cliBackendsTesting } from "../agents/cli-backends.js"; import { - buildFallbackNotice, resolveActiveFallbackState, - resolveFallbackTransition, type FallbackNoticeState, -} from "./fallback-state.js"; +} from "../status/fallback-notice-state.js"; +import { buildFallbackNotice, resolveFallbackTransition } from "./fallback-state.js"; const baseAttempt = { provider: "demo-primary", diff --git a/src/auto-reply/fallback-state.ts b/src/auto-reply/fallback-state.ts index e443c243f4dc..1f1ea22dfdbe 100644 --- a/src/auto-reply/fallback-state.ts +++ b/src/auto-reply/fallback-state.ts @@ -8,11 +8,6 @@ import type { FallbackNoticeState } from "../status/fallback-notice-state.js"; import { formatProviderModelRef } from "./model-runtime.js"; import type { RuntimeFallbackAttempt } from "./reply/agent-runner-execution.js"; -export { - resolveActiveFallbackState, - type FallbackNoticeState, -} from "../status/fallback-notice-state.js"; - const FALLBACK_REASON_PART_MAX = 80; const TRANSIENT_FALLBACK_REASONS = new Set([ "rate_limit", diff --git a/src/auto-reply/reply-payload.ts b/src/auto-reply/reply-payload.ts index 31ca3115dc52..53c291ee8499 100644 --- a/src/auto-reply/reply-payload.ts +++ b/src/auto-reply/reply-payload.ts @@ -73,7 +73,7 @@ export type ReplyPayload = { // through Plugin SDK; this is not a third-party plugin contract. const PAIRING_QR_REPLY_CHANNEL_DATA_KEY = "openclawPairingQr"; -export type PairingQrReplyChannelData = { +type PairingQrReplyChannelData = { setupCode: string; expiresAtMs: number; }; diff --git a/src/auto-reply/reply.ts b/src/auto-reply/reply.ts index 85bed48e3873..43c0b2013746 100644 --- a/src/auto-reply/reply.ts +++ b/src/auto-reply/reply.ts @@ -1,13 +1,2 @@ // Public auto-reply API barrel for directives and reply execution. -export { - extractElevatedDirective, - extractReasoningDirective, - extractTraceDirective, - extractThinkDirective, - extractVerboseDirective, -} from "./reply/directives.js"; export { getReplyFromConfig } from "./reply/get-reply.js"; -export { extractExecDirective } from "./reply/exec.js"; -export { extractQueueDirective } from "./reply/queue.js"; -export { extractReplyToTag } from "./reply/reply-tags.js"; -export type { GetReplyOptions, ReplyPayload } from "./types.js"; diff --git a/src/auto-reply/reply/abort.test.ts b/src/auto-reply/reply/abort.test.ts index f6b6aed1ca26..14e8b0e74183 100644 --- a/src/auto-reply/reply/abort.test.ts +++ b/src/auto-reply/reply/abort.test.ts @@ -10,6 +10,7 @@ import { type SessionAbortTargetResult, } from "../../config/sessions/session-accessor.js"; import { createSuiteTempRootTracker } from "../../test-helpers/temp-dir.js"; +import { resolveAbortCutoffFromContext, shouldSkipMessageByAbortCutoff } from "./abort-cutoff.js"; import { testing as abortTesting, formatAbortReplyText, @@ -18,10 +19,8 @@ import { isAbortRequestText, isAbortTrigger, resetAbortMemoryForTest, - resolveAbortCutoffFromContext, setAbortMemory, stopSubagentsForRequester, - shouldSkipMessageByAbortCutoff, tryFastAbortFromMessage, } from "./abort.js"; import { testing as acpResetTargetTesting } from "./acp-reset-target.js"; diff --git a/src/auto-reply/reply/abort.ts b/src/auto-reply/reply/abort.ts index dde0b7fc5f73..b16434d026ab 100644 --- a/src/auto-reply/reply/abort.ts +++ b/src/auto-reply/reply/abort.ts @@ -53,7 +53,6 @@ import { stripMentions, stripStructuralPrefixes } from "./mentions.js"; import { clearSessionQueues } from "./queue.js"; import { replyRunRegistry } from "./reply-run-registry.js"; -export { resolveAbortCutoffFromContext, shouldSkipMessageByAbortCutoff } from "./abort-cutoff.js"; export { getAbortMemory, getAbortMemorySizeForTest, @@ -521,4 +520,3 @@ export async function tryFastAbortFromMessage(params: { const { stopped } = stopSubagentsForRequester({ cfg, requesterSessionKey }); return { handled: true, aborted: false, stoppedSubagents: stopped }; } -export { testing as __testing }; diff --git a/src/auto-reply/reply/agent-runner-memory.ts b/src/auto-reply/reply/agent-runner-memory.ts index b0a4dc050ed8..fde5edf5ce99 100644 --- a/src/auto-reply/reply/agent-runner-memory.ts +++ b/src/auto-reply/reply/agent-runner-memory.ts @@ -366,7 +366,7 @@ function truncateMemoryFlushErrorMessage(err: unknown): string { } /** Usage snapshot read from a session transcript before compaction. */ -export type SessionTranscriptUsageSnapshot = { +type SessionTranscriptUsageSnapshot = { promptTokens?: number; outputTokens?: number; trailingBytesTokens?: number; diff --git a/src/auto-reply/reply/commands-acp/shared.ts b/src/auto-reply/reply/commands-acp/shared.ts index 7416e936181e..83aad19c4e95 100644 --- a/src/auto-reply/reply/commands-acp/shared.ts +++ b/src/auto-reply/reply/commands-acp/shared.ts @@ -56,7 +56,7 @@ export type AcpAction = export type AcpSpawnThreadMode = "auto" | "here" | "off"; export type AcpSpawnBindMode = "here" | "off"; -export type ParsedSpawnInput = { +type ParsedSpawnInput = { agentId: string; mode: AcpRuntimeSessionMode; thread: AcpSpawnThreadMode; @@ -65,17 +65,17 @@ export type ParsedSpawnInput = { label?: string; }; -export type ParsedSteerInput = { +type ParsedSteerInput = { sessionToken?: string; instruction: string; }; -export type ParsedSingleValueCommandInput = { +type ParsedSingleValueCommandInput = { value: string; sessionToken?: string; }; -export type ParsedSetCommandInput = { +type ParsedSetCommandInput = { key: string; value: string; sessionToken?: string; diff --git a/src/auto-reply/reply/commands-info.ts b/src/auto-reply/reply/commands-info.ts index fb2beb8c26b6..081b15a231d3 100644 --- a/src/auto-reply/reply/commands-info.ts +++ b/src/auto-reply/reply/commands-info.ts @@ -22,8 +22,6 @@ import { buildStatusPluginsReply, buildStatusReply } from "./commands-status.js" import type { CommandHandler, HandleCommandsParams } from "./commands-types.js"; import { extractExplicitGroupId } from "./group-id.js"; import { resolveReplyToMode } from "./reply-threading.js"; -export { handleContextCommand } from "./commands-context-command.js"; -export { handleWhoamiCommand } from "./commands-whoami.js"; async function resolveSkillCommands( params: HandleCommandsParams, diff --git a/src/auto-reply/reply/commands-slash-parse.ts b/src/auto-reply/reply/commands-slash-parse.ts index feddaf2037e5..d94033e72c97 100644 --- a/src/auto-reply/reply/commands-slash-parse.ts +++ b/src/auto-reply/reply/commands-slash-parse.ts @@ -9,7 +9,7 @@ type SlashCommandParseResult = | { kind: "parsed"; action: string; args: string }; /** Public slash-command parse result returned to command handlers. */ -export type ParsedSlashCommand = +type ParsedSlashCommand = | { ok: true; action: string; args: string } | { ok: false; message: string }; diff --git a/src/auto-reply/reply/commands-steer.runtime.ts b/src/auto-reply/reply/commands-steer.runtime.ts index 9c4ca4458b10..1c33aeca16cd 100644 --- a/src/auto-reply/reply/commands-steer.runtime.ts +++ b/src/auto-reply/reply/commands-steer.runtime.ts @@ -2,7 +2,6 @@ export { formatEmbeddedAgentQueueFailureSummary, isEmbeddedAgentRunActive, - queueEmbeddedAgentMessage, queueEmbeddedAgentMessageWithOutcomeAsync, resolveActiveEmbeddedRunSessionId, resolveActiveEmbeddedRunSessionIdBySessionFile, diff --git a/src/auto-reply/reply/commands-subagents-dispatch.ts b/src/auto-reply/reply/commands-subagents-dispatch.ts index 03ae3dc407d5..8fa6fda24a93 100644 --- a/src/auto-reply/reply/commands-subagents-dispatch.ts +++ b/src/auto-reply/reply/commands-subagents-dispatch.ts @@ -3,7 +3,6 @@ import type { SubagentRunRecord } from "../../agents/subagent-registry.types.js" import type { HandleCommandsParams } from "./commands-types.js"; export { - COMMAND, resolveHandledPrefix, resolveRequesterSessionKey, resolveSubagentsAction, diff --git a/src/auto-reply/reply/commands-subagents-routing.test.ts b/src/auto-reply/reply/commands-subagents-routing.test.ts index 6e753763f2c2..8afb60609eb5 100644 --- a/src/auto-reply/reply/commands-subagents-routing.test.ts +++ b/src/auto-reply/reply/commands-subagents-routing.test.ts @@ -10,13 +10,13 @@ import { createOutboundTestPlugin, createTestRegistry } from "../../test-utils/c import { resolveCommandAuthorization } from "../command-auth.js"; import type { MsgContext } from "../templating.js"; import { - COMMAND, resolveHandledPrefix, resolveRequesterSessionKey, resolveSubagentsAction, stopWithText, } from "./commands-subagents-dispatch.js"; import { handleSubagentsCommand } from "./commands-subagents.js"; +import { COMMAND } from "./commands-subagents/shared.js"; import type { HandleCommandsParams } from "./commands-types.js"; const listControlledSubagentRunsMock = vi.hoisted(() => vi.fn(() => [])); diff --git a/src/auto-reply/reply/directive-handling.model-runtime.ts b/src/auto-reply/reply/directive-handling.model-runtime.ts index f7c94f5d6ea3..9f9901e58b86 100644 --- a/src/auto-reply/reply/directive-handling.model-runtime.ts +++ b/src/auto-reply/reply/directive-handling.model-runtime.ts @@ -11,7 +11,7 @@ import { import type { SessionEntry } from "../../config/sessions/types.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; -export type ModelRuntimeDirectiveResolution = +type ModelRuntimeDirectiveResolution = | { kind: "unchanged" } | { kind: "clear" } | { kind: "set"; runtime: string } diff --git a/src/auto-reply/reply/directive-handling.model.test.ts b/src/auto-reply/reply/directive-handling.model.test.ts index 8b54eece76a9..54c068aa93ba 100644 --- a/src/auto-reply/reply/directive-handling.model.test.ts +++ b/src/auto-reply/reply/directive-handling.model.test.ts @@ -305,15 +305,16 @@ import type { ElevatedLevel } from "../thinking.js"; let handleDirectiveOnly: typeof import("./directive-handling.impl.js").handleDirectiveOnly; let cliBackendsTesting: typeof import("../../agents/cli-backends.js").testing; let maybeHandleModelDirectiveInfo: typeof import("./directive-handling.model.js").maybeHandleModelDirectiveInfo; -let resolveModelSelectionFromDirective: typeof import("./directive-handling.model.js").resolveModelSelectionFromDirective; +let resolveModelSelectionFromDirective: typeof import("./directive-handling.model-selection.js").resolveModelSelectionFromDirective; let parseInlineDirectives: typeof import("./directive-handling.parse.js").parseInlineDirectives; let persistInlineDirectives: typeof import("./directive-handling.persist.js").persistInlineDirectives; beforeAll(async () => { ({ testing: cliBackendsTesting } = await import("../../agents/cli-backends.js")); ({ handleDirectiveOnly } = await import("./directive-handling.impl.js")); - ({ maybeHandleModelDirectiveInfo, resolveModelSelectionFromDirective } = - await import("./directive-handling.model.js")); + ({ maybeHandleModelDirectiveInfo } = await import("./directive-handling.model.js")); + ({ resolveModelSelectionFromDirective } = + await import("./directive-handling.model-selection.js")); ({ parseInlineDirectives } = await import("./directive-handling.parse.js")); ({ persistInlineDirectives } = await import("./directive-handling.persist.js")); }); diff --git a/src/auto-reply/reply/directive-handling.model.ts b/src/auto-reply/reply/directive-handling.model.ts index bdc17c88d9f2..ed24b6358395 100644 --- a/src/auto-reply/reply/directive-handling.model.ts +++ b/src/auto-reply/reply/directive-handling.model.ts @@ -32,7 +32,6 @@ import { type ModelPickerCatalogEntry, resolveProviderEndpointLabel, } from "./directive-handling.model-picker.js"; -export { resolveModelSelectionFromDirective } from "./directive-handling.model-selection.js"; import type { InlineDirectives } from "./directive-handling.parse.js"; function isMissingAuthLabel(auth: { label: string; source: string }): boolean { diff --git a/src/auto-reply/reply/directive-handling.params.ts b/src/auto-reply/reply/directive-handling.params.ts index 69248bab15f5..6786bf9ae84a 100644 --- a/src/auto-reply/reply/directive-handling.params.ts +++ b/src/auto-reply/reply/directive-handling.params.ts @@ -9,7 +9,7 @@ import type { InlineDirectives } from "./directive-handling.parse.js"; import type { ElevatedLevel, ReasoningLevel, ThinkLevel, VerboseLevel } from "./directives.js"; /** Core directive handler inputs that do not depend on the inbound message shape. */ -export type HandleDirectiveOnlyCoreParams = { +type HandleDirectiveOnlyCoreParams = { cfg: OpenClawConfig; directives: InlineDirectives; sessionEntry: SessionEntry; diff --git a/src/auto-reply/reply/directive-handling.persist.ts b/src/auto-reply/reply/directive-handling.persist.ts index 21b7e5287810..ed3209e19fbf 100644 --- a/src/auto-reply/reply/directive-handling.persist.ts +++ b/src/auto-reply/reply/directive-handling.persist.ts @@ -41,7 +41,7 @@ import { resolveContextTokens } from "./model-selection.js"; import { refreshQueuedFollowupSession } from "./queue.js"; import { persistReplySessionEntry } from "./session-entry-persistence.js"; -export type PersistedThinkingLevelRemap = { +type PersistedThinkingLevelRemap = { from: ThinkLevel; to: ThinkLevel; provider: string; diff --git a/src/auto-reply/reply/directives.ts b/src/auto-reply/reply/directives.ts index 83bdd26c4b9e..6d814cca5b30 100644 --- a/src/auto-reply/reply/directives.ts +++ b/src/auto-reply/reply/directives.ts @@ -1,7 +1,7 @@ // Defines reply directive parsing constants and text-matching helpers. import type { FastMode } from "@openclaw/normalization-core/string-coerce"; import { escapeRegExp } from "../../utils.js"; -import type { NoticeLevel, ReasoningLevel, TraceLevel } from "../thinking.js"; +import type { ReasoningLevel, TraceLevel } from "../thinking.js"; import { type ElevatedLevel, normalizeFastMode, @@ -228,5 +228,5 @@ export function extractStatusDirective(body?: string): { return extractSimpleDirective(body, STATUS_DIRECTIVE_PATTERN); } -export type { ElevatedLevel, NoticeLevel, ReasoningLevel, ThinkLevel, TraceLevel, VerboseLevel }; +export type { ElevatedLevel, ReasoningLevel, ThinkLevel, TraceLevel, VerboseLevel }; export { extractExecDirective } from "./exec/directive.js"; diff --git a/src/auto-reply/reply/dispatch-acp-delivery.test.ts b/src/auto-reply/reply/dispatch-acp-delivery.test.ts index 3efa6124d5aa..1456775fdb46 100644 --- a/src/auto-reply/reply/dispatch-acp-delivery.test.ts +++ b/src/auto-reply/reply/dispatch-acp-delivery.test.ts @@ -3,7 +3,8 @@ import { expectDefined } from "@openclaw/normalization-core"; import { beforeEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../config/config.js"; import { createAcpDispatchDeliveryCoordinator } from "./dispatch-acp-delivery.js"; -import { createReplyDispatcher, type ReplyDispatcher } from "./reply-dispatcher.js"; +import { createReplyDispatcher } from "./reply-dispatcher.js"; +import type { ReplyDispatcher } from "./reply-dispatcher.types.js"; import { buildTestCtx } from "./test-ctx.js"; import { createAcpTestConfig } from "./test-fixtures/acp-runtime.js"; diff --git a/src/auto-reply/reply/dispatch-acp-delivery.ts b/src/auto-reply/reply/dispatch-acp-delivery.ts index 61b6da2f2230..11e08130bcac 100644 --- a/src/auto-reply/reply/dispatch-acp-delivery.ts +++ b/src/auto-reply/reply/dispatch-acp-delivery.ts @@ -53,7 +53,7 @@ function loadMessageActionRuntime() { return messageActionRuntimeLoader.load(); } -export type AcpDispatchDeliveryMeta = { +type AcpDispatchDeliveryMeta = { toolCallId?: string; allowEdit?: boolean; skipTts?: boolean; diff --git a/src/auto-reply/reply/dispatch-acp.test.ts b/src/auto-reply/reply/dispatch-acp.test.ts index 202a0a3d7fd5..7aee42ac4610 100644 --- a/src/auto-reply/reply/dispatch-acp.test.ts +++ b/src/auto-reply/reply/dispatch-acp.test.ts @@ -19,7 +19,7 @@ import { appendRecentHistoryImageContext, resolveRecentInboundHistoryImages, } from "./history-media.js"; -import type { ReplyDispatcher } from "./reply-dispatcher.js"; +import type { ReplyDispatcher } from "./reply-dispatcher.types.js"; import { buildTestCtx } from "./test-ctx.js"; import { createAcpSessionMeta, createAcpTestConfig } from "./test-fixtures/acp-runtime.js"; diff --git a/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts b/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts index d19f7d0b1336..628eeafb2e99 100644 --- a/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts @@ -4,7 +4,8 @@ import { clearAgentHarnesses } from "../../agents/harness/registry.js"; import type { PluginHookReplyDispatchResult } from "../../plugins/hooks.js"; import { createInternalHookEventPayload } from "../../test-utils/internal-hook-event-payload.js"; import { withReplyDispatcher } from "../dispatch-dispatcher.js"; -import { setReplyPayloadMetadata, type ReplyPayload } from "../types.js"; +import { setReplyPayloadMetadata } from "../reply-payload.js"; +import type { ReplyPayload } from "../types.js"; import { acpManagerRuntimeMocks, acpMocks, diff --git a/src/auto-reply/reply/dispatch-from-config.runtime.ts b/src/auto-reply/reply/dispatch-from-config.runtime.ts index 80c99d814f97..e935cd000223 100644 --- a/src/auto-reply/reply/dispatch-from-config.runtime.ts +++ b/src/auto-reply/reply/dispatch-from-config.runtime.ts @@ -1,5 +1,6 @@ /** Runtime-only dispatch dependencies shared by config-driven reply delivery. */ -import { loadSessionEntry, updateSessionEntry } from "../../config/sessions/session-accessor.js"; +/** Runtime-only dispatch dependencies shared by config-driven reply delivery. */ +import { loadSessionEntry } from "../../config/sessions/session-accessor.js"; import type { SessionEntry } from "../../config/sessions/types.js"; export { resolveStorePath } from "../../config/sessions/paths.js"; @@ -14,25 +15,3 @@ export function loadSessionStoreEntry(params: { }): SessionEntry | undefined { return loadSessionEntry(params); } - -export async function updateSessionStoreEntry(params: { - storePath: string; - sessionKey: string; - skipMaintenance?: boolean; - takeCacheOwnership?: boolean; - update: ( - entry: SessionEntry, - ) => Promise | null> | Partial | null; -}): Promise { - return await updateSessionEntry( - { - storePath: params.storePath, - sessionKey: params.sessionKey, - }, - params.update, - { - skipMaintenance: params.skipMaintenance, - takeCacheOwnership: params.takeCacheOwnership, - }, - ); -} diff --git a/src/auto-reply/reply/dispatch-from-config.shared.test-harness.ts b/src/auto-reply/reply/dispatch-from-config.shared.test-harness.ts index 202d9823f069..3e5e8cbcdd38 100644 --- a/src/auto-reply/reply/dispatch-from-config.shared.test-harness.ts +++ b/src/auto-reply/reply/dispatch-from-config.shared.test-harness.ts @@ -15,7 +15,8 @@ import { } from "../../test-utils/channel-plugins.js"; import { copyReplyPayloadMetadata } from "../reply-payload.js"; import type { ReplyPayload } from "../types.js"; -import type { ReplyDispatchBeforeDeliver, ReplyDispatcher } from "./reply-dispatcher.js"; +import type { ReplyDispatchBeforeDeliver } from "./reply-dispatcher.js"; +import type { ReplyDispatcher } from "./reply-dispatcher.types.js"; import { buildTestCtx } from "./test-ctx.js"; type AbortResult = { diff --git a/src/auto-reply/reply/dispatch-from-config.test.ts b/src/auto-reply/reply/dispatch-from-config.test.ts index bd30d15c29bc..86a75709fe0e 100644 --- a/src/auto-reply/reply/dispatch-from-config.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.test.ts @@ -36,9 +36,9 @@ import { } from "../../test-utils/channel-plugins.js"; import { createInternalHookEventPayload } from "../../test-utils/internal-hook-event-payload.js"; import { settleReplyDispatcher } from "../dispatch-dispatcher.js"; -import { getReplyPayloadMetadata } from "../reply-payload.js"; +import { getReplyPayloadMetadata, setReplyPayloadMetadata } from "../reply-payload.js"; import type { MsgContext } from "../templating.js"; -import { setReplyPayloadMetadata, type GetReplyOptions, type ReplyPayload } from "../types.js"; +import type { GetReplyOptions, ReplyPayload } from "../types.js"; import { markCommandSessionMetadataChanged } from "./command-session-metadata.js"; import { acpManagerRuntimeMocks, @@ -65,7 +65,8 @@ import { ttsMocks, } from "./dispatch-from-config.shared.test-harness.js"; import { PROVIDER_CONVERSATION_STATE_ERROR_USER_MESSAGE } from "./provider-request-error-classifier.js"; -import { createReplyDispatcher, type ReplyDispatcher } from "./reply-dispatcher.js"; +import { createReplyDispatcher } from "./reply-dispatcher.js"; +import type { ReplyDispatcher } from "./reply-dispatcher.types.js"; import { resolveRoutedDeliveryThreadId } from "./routed-delivery-thread.js"; import { buildTestCtx } from "./test-ctx.js"; @@ -9752,12 +9753,11 @@ describe("dispatchReplyFromConfig", () => { const dispatcher = createDispatcher(); const ctx = buildTestCtx({ Provider: "whatsapp" }); const onBlockReplyQueued = vi.fn(); - const { setReplyPayloadMetadata: setReplyPayloadMetadataLocal } = await import("../types.js"); const replyResolver = async ( _ctx: MsgContext, opts?: GetReplyOptions, ): Promise => { - const payload = setReplyPayloadMetadataLocal({ text: "Alpha" }, { assistantMessageIndex: 7 }); + const payload = setReplyPayloadMetadata({ text: "Alpha" }, { assistantMessageIndex: 7 }); await opts?.onBlockReply?.(payload); return undefined; }; diff --git a/src/auto-reply/reply/dispatch-from-config.ts b/src/auto-reply/reply/dispatch-from-config.ts index 10aa425c5488..368f1c360377 100644 --- a/src/auto-reply/reply/dispatch-from-config.ts +++ b/src/auto-reply/reply/dispatch-from-config.ts @@ -1597,10 +1597,7 @@ function createReplyHotPathTimingTracker(options: { profilerEnabled?: boolean } }; } -export type { - DispatchFromConfigParams, - DispatchFromConfigResult, -} from "./dispatch-from-config.types.js"; +export type { DispatchFromConfigResult } from "./dispatch-from-config.types.js"; /** Dispatches a reply from config, context, command handling, agent run, and delivery policy. */ export async function dispatchReplyFromConfig( diff --git a/src/auto-reply/reply/exec.ts b/src/auto-reply/reply/exec.ts deleted file mode 100644 index f5a7d1f7bd08..000000000000 --- a/src/auto-reply/reply/exec.ts +++ /dev/null @@ -1,2 +0,0 @@ -/** Public exec directive parser barrel for reply command handling. */ -export { extractExecDirective } from "./exec/directive.js"; diff --git a/src/auto-reply/reply/followup-runner.test.ts b/src/auto-reply/reply/followup-runner.test.ts index 22fd3861f2dd..9e6dcd099bc3 100644 --- a/src/auto-reply/reply/followup-runner.test.ts +++ b/src/auto-reply/reply/followup-runner.test.ts @@ -38,7 +38,7 @@ let loadSessionStore: typeof import("../../config/sessions/store.js").loadSessio let saveSessionStore: typeof import("../../config/sessions/store.js").saveSessionStore; let replaceSessionEntrySync: typeof import("../../config/sessions/session-accessor.js").replaceSessionEntrySync; let clearSessionStoreCacheForTest: typeof import("../../config/sessions/store.js").clearSessionStoreCacheForTest; -let clearFollowupQueue: typeof import("./queue.js").clearFollowupQueue; +let clearFollowupQueue: typeof import("./queue/state.js").clearFollowupQueue; let enqueueFollowupRun: typeof import("./queue.js").enqueueFollowupRun; let sessionRunAccounting: typeof import("./session-run-accounting.js"); let setRuntimeConfigSnapshot: typeof import("../../config/config.js").setRuntimeConfigSnapshot; @@ -504,7 +504,8 @@ async function loadFreshFollowupRunnerModuleForTest() { ({ clearSessionStoreCacheForTest, loadSessionStore, saveSessionStore } = await import("../../config/sessions/store.js")); ({ replaceSessionEntrySync } = await import("../../config/sessions/session-accessor.js")); - ({ clearFollowupQueue, enqueueFollowupRun } = await import("./queue.js")); + ({ clearFollowupQueue } = await import("./queue/state.js")); + ({ enqueueFollowupRun } = await import("./queue.js")); sessionRunAccounting = await import("./session-run-accounting.js"); ({ createMockFollowupRun, createMockTypingController } = await import("./test-helpers.js")); ({ diff --git a/src/auto-reply/reply/history.ts b/src/auto-reply/reply/history.ts index eff822be4618..7f1fa3cdbceb 100644 --- a/src/auto-reply/reply/history.ts +++ b/src/auto-reply/reply/history.ts @@ -29,7 +29,7 @@ export function evictOldHistoryKeys( } } -export type { HistoryEntry, HistoryMediaEntry } from "./history.types.js"; +export type { HistoryEntry } from "./history.types.js"; /** Wraps previous chat history and the current message in the prompt context marker format. */ export function buildHistoryContext(params: { diff --git a/src/auto-reply/reply/inbound-media.ts b/src/auto-reply/reply/inbound-media.ts index 10007b8c3914..39808de7228e 100644 --- a/src/auto-reply/reply/inbound-media.ts +++ b/src/auto-reply/reply/inbound-media.ts @@ -2,7 +2,7 @@ import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce"; /** Minimal inbound media fields used by media/audio detection. */ -export type InboundMediaContext = { +type InboundMediaContext = { Body?: unknown; BodyForCommands?: unknown; CommandBody?: unknown; diff --git a/src/auto-reply/reply/mentions.ts b/src/auto-reply/reply/mentions.ts index f48d5baf65a5..fb18ac7d85db 100644 --- a/src/auto-reply/reply/mentions.ts +++ b/src/auto-reply/reply/mentions.ts @@ -16,7 +16,7 @@ import { compileConfigRegexes, type ConfigRegexRejectReason } from "../../securi import { escapeRegExp } from "../../utils.js"; import type { MsgContext } from "../templating.js"; import type { BuildMentionRegexesOptions, ExplicitMentionSignal } from "./mentions.types.js"; -export type { BuildMentionRegexesOptions, ExplicitMentionSignal } from "./mentions.types.js"; +export type { BuildMentionRegexesOptions } from "./mentions.types.js"; function deriveMentionPatterns(identity?: { name?: string; emoji?: string }) { const patterns: string[] = []; diff --git a/src/auto-reply/reply/prompt-prelude.ts b/src/auto-reply/reply/prompt-prelude.ts index a66b65aa86e2..92f3c5d0ef7f 100644 --- a/src/auto-reply/reply/prompt-prelude.ts +++ b/src/auto-reply/reply/prompt-prelude.ts @@ -81,7 +81,7 @@ export function buildReplyPromptBodies(params: { type ReplyPromptEnvelopeStartupAction = "new" | "reset"; /** Full prompt envelope passed into reply run preparation. */ -export type ReplyPromptEnvelope = ReturnType & { +type ReplyPromptEnvelope = ReturnType & { /** Model-visible body before media, thread context, and inter-session annotation are applied. */ effectiveBaseBody: string; /** User-visible body persisted to transcript before media/inter-session annotation. */ @@ -91,7 +91,7 @@ export type ReplyPromptEnvelope = ReturnType & { }; /** Base prompt envelope fields before body variants are added. */ -export type ReplyPromptEnvelopeBase = { +type ReplyPromptEnvelopeBase = { /** Model-visible body before media, thread context, and inter-session annotation are applied. */ effectiveBaseBody: string; /** User-visible body persisted to transcript before media/inter-session annotation. */ diff --git a/src/auto-reply/reply/provider-request-error-classifier.ts b/src/auto-reply/reply/provider-request-error-classifier.ts index acefa3e2b21f..9b7656086163 100644 --- a/src/auto-reply/reply/provider-request-error-classifier.ts +++ b/src/auto-reply/reply/provider-request-error-classifier.ts @@ -8,7 +8,7 @@ import { isFailoverError } from "../../agents/failover-error.js"; import { formatErrorMessage } from "../../infra/errors.js"; /** Provider request error classes that get a specialized user-facing reply. */ -export type ProviderRequestErrorCode = +type ProviderRequestErrorCode = | "provider_authentication_error" | "provider_conversation_state_error" | "provider_internal_error" @@ -16,7 +16,7 @@ export type ProviderRequestErrorCode = | "provider_rate_limit_or_quota_error"; /** Structured provider error classification for reply failure handling. */ -export type ProviderRequestErrorClassification = { +type ProviderRequestErrorClassification = { code: ProviderRequestErrorCode; userMessage: string; technicalMessage: string; diff --git a/src/auto-reply/reply/queue.collect.test.ts b/src/auto-reply/reply/queue.collect.test.ts index fd440fbeb8cc..8aea18a91e2a 100644 --- a/src/auto-reply/reply/queue.collect.test.ts +++ b/src/auto-reply/reply/queue.collect.test.ts @@ -13,7 +13,6 @@ import { createTestUserTurnTranscriptTarget } from "../../sessions/user-turn-tra import type { FollowupRun, QueueSettings } from "./queue.js"; import { admitFollowupRunLifecycle, - clearFollowupQueue, completeFollowupRunLifecycle, enqueueFollowupRun, FollowupRunDeferredError, @@ -26,7 +25,7 @@ import { installQueueRuntimeErrorSilencer, } from "./queue.test-helpers.js"; import { resolveFollowupAuthorizationKey } from "./queue/drain.js"; -import { getExistingFollowupQueue } from "./queue/state.js"; +import { clearFollowupQueue, getExistingFollowupQueue } from "./queue/state.js"; installQueueRuntimeErrorSilencer(); diff --git a/src/auto-reply/reply/queue.dedupe.test.ts b/src/auto-reply/reply/queue.dedupe.test.ts index a1f90dea65c8..f8c339e5bb95 100644 --- a/src/auto-reply/reply/queue.dedupe.test.ts +++ b/src/auto-reply/reply/queue.dedupe.test.ts @@ -2,16 +2,13 @@ import { importFreshModule } from "openclaw/plugin-sdk/test-fixtures"; import { beforeEach, describe, expect, it } from "vitest"; import type { FollowupRun, QueueSettings } from "./queue.js"; -import { - enqueueFollowupRun, - resetRecentQueuedMessageIdDedupe, - scheduleFollowupDrain, -} from "./queue.js"; +import { enqueueFollowupRun, scheduleFollowupDrain } from "./queue.js"; import { createDeferred, createQueueTestRun as createRun, installQueueRuntimeErrorSilencer, } from "./queue.test-helpers.js"; +import { resetRecentQueuedMessageIdDedupe } from "./queue/enqueue.js"; installQueueRuntimeErrorSilencer(); diff --git a/src/auto-reply/reply/queue.drain-restart.test.ts b/src/auto-reply/reply/queue.drain-restart.test.ts index 939409ed35ee..44d701eaa47d 100644 --- a/src/auto-reply/reply/queue.drain-restart.test.ts +++ b/src/auto-reply/reply/queue.drain-restart.test.ts @@ -11,7 +11,6 @@ import { import { captureEnv, setTestEnvValue } from "../../test-utils/env.js"; import type { FollowupRun, QueueSettings } from "./queue.js"; import { - clearFollowupQueue, clearSessionQueues, enqueueFollowupRun, FollowupRunDeferredError, @@ -22,7 +21,7 @@ import { createQueueTestRun as createRun, installQueueRuntimeErrorSilencer, } from "./queue.test-helpers.js"; -import { getExistingFollowupQueue } from "./queue/state.js"; +import { clearFollowupQueue, getExistingFollowupQueue } from "./queue/state.js"; installQueueRuntimeErrorSilencer(); diff --git a/src/auto-reply/reply/queue.in-flight.test.ts b/src/auto-reply/reply/queue.in-flight.test.ts index f639751349df..d1e3fc1d677b 100644 --- a/src/auto-reply/reply/queue.in-flight.test.ts +++ b/src/auto-reply/reply/queue.in-flight.test.ts @@ -1,14 +1,13 @@ // Proves queue caps and depth describe pending work while active identities remain in shared state. import { afterEach, describe, expect, it, vi } from "vitest"; import { - clearFollowupQueue, completeFollowupRunLifecycle, enqueueFollowupRun, getFollowupQueueDepth, scheduleFollowupDrain, } from "./queue.js"; import { createDeferred, createQueueTestRun as createRun } from "./queue.test-helpers.js"; -import { getExistingFollowupQueue } from "./queue/state.js"; +import { clearFollowupQueue, getExistingFollowupQueue } from "./queue/state.js"; import type { FollowupRun, QueueDropPolicy, QueueSettings } from "./queue/types.js"; describe("followup queue in-flight ownership", () => { diff --git a/src/auto-reply/reply/queue.ts b/src/auto-reply/reply/queue.ts index 0f2bfaf08316..8f2756af6e99 100644 --- a/src/auto-reply/reply/queue.ts +++ b/src/auto-reply/reply/queue.ts @@ -1,5 +1,5 @@ /** Public queue API for deferred auto-reply follow-up runs. */ -export { extractQueueDirective } from "./queue/directive.js"; + export { clearSessionQueues } from "./queue/cleanup.js"; export type { ClearSessionQueueResult } from "./queue/cleanup.js"; export { scheduleFollowupDrain } from "./queue/drain.js"; @@ -9,16 +9,8 @@ export { resetRecentQueuedMessageIdDedupe, } from "./queue/enqueue.js"; export { resolveQueueSettings } from "./queue/settings-runtime.js"; -export { clearFollowupQueue, refreshQueuedFollowupSession } from "./queue/state.js"; -export type { - EnqueueFollowupRunOptions, - FollowupRun, - QueueDedupeMode, - QueueInsertPosition, - QueueDropPolicy, - QueueMode, - QueueSettings, -} from "./queue/types.js"; +export { refreshQueuedFollowupSession } from "./queue/state.js"; +export type { FollowupRun, QueueSettings } from "./queue/types.js"; export { isFollowupRunAborted } from "./queue/types.js"; export { admitFollowupRunLifecycle, completeFollowupRunLifecycle } from "./queue/types.js"; -export { FollowupRunDeferredError, isFollowupRunDeferredError } from "./queue/types.js"; +export { FollowupRunDeferredError } from "./queue/types.js"; diff --git a/src/auto-reply/reply/queue/state.ts b/src/auto-reply/reply/queue/state.ts index 501d4840a0a5..e4ebff9d941f 100644 --- a/src/auto-reply/reply/queue/state.ts +++ b/src/auto-reply/reply/queue/state.ts @@ -16,7 +16,7 @@ import { type QueueSettings, } from "./types.js"; -export type FollowupQueueState = { +type FollowupQueueState = { abortController: AbortController; items: FollowupRun[]; draining: boolean; diff --git a/src/auto-reply/reply/queue/types.ts b/src/auto-reply/reply/queue/types.ts index a148a8334896..cdca16364b89 100644 --- a/src/auto-reply/reply/queue/types.ts +++ b/src/auto-reply/reply/queue/types.ts @@ -37,7 +37,7 @@ export type QueueSettings = { export type QueueDedupeMode = "message-id" | "prompt" | "none"; -export type QueueInsertPosition = "tail" | "front"; +type QueueInsertPosition = "tail" | "front"; export type EnqueueFollowupRunOptions = { position?: QueueInsertPosition; diff --git a/src/auto-reply/reply/reply-dispatcher.ts b/src/auto-reply/reply/reply-dispatcher.ts index e873779a02bc..6ae07db06db4 100644 --- a/src/auto-reply/reply/reply-dispatcher.ts +++ b/src/auto-reply/reply/reply-dispatcher.ts @@ -22,8 +22,6 @@ import type { import type { ResponsePrefixContext } from "./response-prefix-template.js"; import type { TypingController } from "./typing.js"; -export type { ReplyDispatchKind, ReplyDispatcher } from "./reply-dispatcher.types.js"; - type ReplyDispatchErrorHandler = ( err: unknown, info: ReplyDispatchRuntimeInfo, diff --git a/src/auto-reply/reply/reply-operation-run-state.ts b/src/auto-reply/reply/reply-operation-run-state.ts index e2ed5fcaa297..ff51d41275fc 100644 --- a/src/auto-reply/reply/reply-operation-run-state.ts +++ b/src/auto-reply/reply/reply-operation-run-state.ts @@ -1,4 +1,4 @@ -export type ReplyOperationAdmissionSnapshot = +type ReplyOperationAdmissionSnapshot = | { status: "owned" } | { status: "skipped"; reason: "active-run" | "aborted" | "lifecycle-invalidated" }; diff --git a/src/auto-reply/reply/reply-payloads.test.ts b/src/auto-reply/reply/reply-payloads.test.ts index f5bc64997a62..03627c33b78e 100644 --- a/src/auto-reply/reply/reply-payloads.test.ts +++ b/src/auto-reply/reply/reply-payloads.test.ts @@ -4,10 +4,10 @@ import { describe, expect, it, vi } from "vitest"; import { resetPluginRuntimeStateForTest, setActivePluginRegistry } from "../../plugins/runtime.js"; import { createOutboundTestPlugin, createTestRegistry } from "../../test-utils/channel-plugins.js"; import { getReplyPayloadMetadata, setReplyPayloadMetadata } from "../reply-payload.js"; +import { shouldDedupeMessagingToolRepliesForRoute } from "./reply-payloads-dedupe.js"; import { filterMessagingToolMediaDuplicates, resolveMessagingToolPayloadDedupe, - shouldDedupeMessagingToolRepliesForRoute, } from "./reply-payloads.js"; function targetsMatchTelegramReplySuppression(params: { diff --git a/src/auto-reply/reply/reply-payloads.ts b/src/auto-reply/reply/reply-payloads.ts index de83c3b5e8cf..a80ec41923fc 100644 --- a/src/auto-reply/reply/reply-payloads.ts +++ b/src/auto-reply/reply/reply-payloads.ts @@ -10,5 +10,4 @@ export { filterMessagingToolDuplicates, filterMessagingToolMediaDuplicates, resolveMessagingToolPayloadDedupe, - shouldDedupeMessagingToolRepliesForRoute, } from "./reply-payloads-dedupe.js"; diff --git a/src/auto-reply/reply/reply-run-registry.ts b/src/auto-reply/reply/reply-run-registry.ts index 752d8003ec2d..66a12f7be93f 100644 --- a/src/auto-reply/reply/reply-run-registry.ts +++ b/src/auto-reply/reply/reply-run-registry.ts @@ -20,11 +20,11 @@ import type { } from "../get-reply-options.types.js"; import type { ReplyFollowupAdmissionBarrierTimeoutPolicy } from "./reply-dispatcher.types.js"; -export type ReplyRunKey = string; +type ReplyRunKey = string; -export type ReplyBackendKind = "embedded" | "cli"; +type ReplyBackendKind = "embedded" | "cli"; -export type ReplyBackendCancelReason = "user_abort" | "restart" | "superseded"; +type ReplyBackendCancelReason = "user_abort" | "restart" | "superseded"; export type ReplyBackendQueueMessageOptions = { steeringMode?: "all"; @@ -53,7 +53,7 @@ export type ReplyBackendHandle = { isCompacting?: () => boolean; }; -export type ReplyBackendQueueMessageMismatch = +type ReplyBackendQueueMessageMismatch = | "source_reply_delivery_mode_mismatch" | "task_suggestion_delivery_mode_mismatch"; @@ -90,7 +90,7 @@ export type ReplyOperationPhase = | "failed" | "aborted"; -export type ReplyOperationFailureCode = +type ReplyOperationFailureCode = | "gateway_draining" | "command_lane_cleared" | "aborted_by_user" @@ -98,9 +98,9 @@ export type ReplyOperationFailureCode = | "run_stalled" | "run_failed"; -export type ReplyOperationAbortCode = "aborted_by_user" | "aborted_for_restart"; +type ReplyOperationAbortCode = "aborted_by_user" | "aborted_for_restart"; -export type ReplyOperationResult = +type ReplyOperationResult = | { kind: "completed" } | { kind: "failed"; code: ReplyOperationFailureCode; cause?: unknown } | { kind: "aborted"; code: ReplyOperationAbortCode }; @@ -182,7 +182,7 @@ export type ReplyOperation = { abortForRestart(): boolean; }; -export type ReplyRunRegistry = { +type ReplyRunRegistry = { begin(params: { sessionKey: string; sessionId: string; @@ -238,7 +238,7 @@ export const REPLY_RUN_IDLE_SETTLE_TIMEOUT_MS = 15_000; // Without this, abort/failure can leave the session wedged until process restart. export const REPLY_RUN_TERMINAL_SETTLE_TIMEOUT_MS = 60_000; -export type ReplyOperationStaleReason = "terminal_unreleased" | "no_activity" | "stuck_recovery"; +type ReplyOperationStaleReason = "terminal_unreleased" | "no_activity" | "stuck_recovery"; export class ReplyRunAlreadyActiveError extends Error { constructor(sessionKey: string) { diff --git a/src/auto-reply/reply/reply-turn-admission.ts b/src/auto-reply/reply/reply-turn-admission.ts index 574d44f7daf8..0a425e36b575 100644 --- a/src/auto-reply/reply/reply-turn-admission.ts +++ b/src/auto-reply/reply/reply-turn-admission.ts @@ -26,10 +26,10 @@ import { } from "./reply-run-registry.js"; /** Kinds of turns that compete for one reply run slot per session. */ -export type ReplyTurnKind = "visible" | "heartbeat" | "queued_followup"; +type ReplyTurnKind = "visible" | "heartbeat" | "queued_followup"; /** Admission result for a reply turn attempting to own the session run slot. */ -export type ReplyTurnAdmission = +type ReplyTurnAdmission = | { status: "owned"; operation: ReplyOperation; sessionEntry?: SessionEntry } | { status: "skipped"; diff --git a/src/auto-reply/reply/session-delivery.ts b/src/auto-reply/reply/session-delivery.ts index bee050164855..82d96ed99e4a 100644 --- a/src/auto-reply/reply/session-delivery.ts +++ b/src/auto-reply/reply/session-delivery.ts @@ -19,7 +19,7 @@ import { } from "../../utils/message-channel.js"; import type { MsgContext } from "../templating.js"; -export type LegacyMainDeliveryRetirement = { +type LegacyMainDeliveryRetirement = { key: string; entry: SessionEntry; }; diff --git a/src/auto-reply/reply/session-fork.ts b/src/auto-reply/reply/session-fork.ts index 0c9f677911e0..9437b339960d 100644 --- a/src/auto-reply/reply/session-fork.ts +++ b/src/auto-reply/reply/session-fork.ts @@ -45,7 +45,7 @@ type ForkSessionFromParentParams = { targetStorePath?: string; }; -export type ForkedParentSessionEntry = ParentForkedSessionTranscript; +type ForkedParentSessionEntry = ParentForkedSessionTranscript; export type ForkSessionEntryFromParentResult = | { diff --git a/src/auto-reply/reply/session-updates.ts b/src/auto-reply/reply/session-updates.ts index 91a0a1cea6a2..b1937ba92365 100644 --- a/src/auto-reply/reply/session-updates.ts +++ b/src/auto-reply/reply/session-updates.ts @@ -22,8 +22,6 @@ import { getRemoteSkillEligibility } from "../../skills/runtime/remote.js"; import { resolveReusableWorkspaceSkillSnapshot } from "../../skills/runtime/session-snapshot.js"; import type { ReplySessionEntryHandle } from "./session-entry-handle.js"; import { buildSessionEndHookPayload, buildSessionStartHookPayload } from "./session-hooks.js"; -export { drainFormattedSystemEvents } from "./session-system-events.js"; -export { resetResolvedSkillsCacheForTests } from "../../skills/runtime/session-snapshot.js"; async function persistSessionEntryUpdate(params: { expectedSessionId: string | undefined; diff --git a/src/auto-reply/reply/session.test.ts b/src/auto-reply/reply/session.test.ts index e3cfb1904614..0371a9389193 100644 --- a/src/auto-reply/reply/session.test.ts +++ b/src/auto-reply/reply/session.test.ts @@ -45,7 +45,7 @@ import { import { withEnvAsync } from "../../test-utils/env.js"; import { createSessionConversationTestRegistry } from "../../test-utils/session-conversation-registry.js"; import { replyRunRegistry } from "./reply-run-registry.js"; -import { drainFormattedSystemEvents } from "./session-updates.js"; +import { drainFormattedSystemEvents } from "./session-system-events.js"; import { persistSessionUsageUpdate } from "./session-usage.js"; import { initSessionState, resolveReplySessionPreprocessingState } from "./session.js"; diff --git a/src/auto-reply/reply/session.ts b/src/auto-reply/reply/session.ts index 834990aaa3a7..f9c3f2b050fa 100644 --- a/src/auto-reply/reply/session.ts +++ b/src/auto-reply/reply/session.ts @@ -198,7 +198,7 @@ export type SessionInitResult = { triggerBodyNormalized: string; }; -export type InitSessionStateParams = { +type InitSessionStateParams = { abortSignal?: AbortSignal; cfg: OpenClawConfig; commandAuthorized: boolean; @@ -322,7 +322,7 @@ function resolveInitSessionStateAttemptContext( }; } -export type ReplySessionPreprocessingState = { +type ReplySessionPreprocessingState = { sessionEntry?: SessionEntry; sessionKey: string; storePath: string; diff --git a/src/auto-reply/reply/typing-mode.ts b/src/auto-reply/reply/typing-mode.ts index 8df0e98dfac1..396dcd895101 100644 --- a/src/auto-reply/reply/typing-mode.ts +++ b/src/auto-reply/reply/typing-mode.ts @@ -7,7 +7,7 @@ import type { TypingPolicy } from "../types.js"; import type { TypingController } from "./typing.js"; /** Inputs that decide when a channel typing indicator should be shown. */ -export type TypingModeContext = { +type TypingModeContext = { configured?: TypingMode; isGroupChat: boolean; wasMentioned: boolean; diff --git a/src/auto-reply/status.test.ts b/src/auto-reply/status.test.ts index 83f9cd9ac82b..ce0a650f9568 100644 --- a/src/auto-reply/status.test.ts +++ b/src/auto-reply/status.test.ts @@ -11,14 +11,12 @@ import { } from "../agents/context-cache.js"; import type { OpenClawConfig } from "../config/config.js"; import { applyModelOverrideToSessionEntry } from "../sessions/model-overrides.js"; -import { createSuccessfulImageMediaDecision } from "./media-understanding.test-fixtures.js"; import { - buildCommandsMessage, - buildCommandsMessagePaginated, - buildHelpMessage, buildStatusMessage as buildStatusMessageRaw, -} from "./status.js"; -import type { buildStatusMessage as BuildStatusMessage } from "./status.js"; + type buildStatusMessage as BuildStatusMessage, +} from "../status/status-message.js"; +import { createSuccessfulImageMediaDecision } from "./media-understanding.test-fixtures.js"; +import { buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage } from "./status.js"; const buildStatusMessage: typeof BuildStatusMessage = (args) => buildStatusMessageRaw({ diff --git a/src/auto-reply/status.ts b/src/auto-reply/status.ts index a965dab99a77..a041ba5b192c 100644 --- a/src/auto-reply/status.ts +++ b/src/auto-reply/status.ts @@ -7,14 +7,8 @@ export { buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage, - type CommandsMessageOptions, - type CommandsMessageResult, } from "./command-status-builders.js"; -export { - buildStatusMessage, - formatContextUsageShort, - type StatusArgs, -} from "../status/status-message.js"; +export { formatContextUsageShort } from "../status/status-message.js"; export { formatTokenCount } from "../utils/usage-format.js"; type ToolsMessageItem = { diff --git a/src/auto-reply/thinking.shared.ts b/src/auto-reply/thinking.shared.ts index 74522be9d335..e752e26dfe59 100644 --- a/src/auto-reply/thinking.shared.ts +++ b/src/auto-reply/thinking.shared.ts @@ -22,7 +22,6 @@ export type ThinkLevel = | "ultra"; export type VerboseLevel = "off" | "on" | "full"; export type TraceLevel = "off" | "on" | "raw"; -export type NoticeLevel = "off" | "on" | "full"; export type ElevatedLevel = "off" | "on" | "ask" | "full"; export type ReasoningLevel = "off" | "on" | "stream"; type UsageDisplayLevel = "off" | "tokens" | "full"; @@ -40,7 +39,7 @@ export type ThinkingCatalogEntry = { }; /** Complete canonical level set accepted by user-facing thinking controls. */ -export const ALL_THINKING_LEVELS: readonly ThinkLevel[] = [ +const ALL_THINKING_LEVELS: readonly ThinkLevel[] = [ "off", "minimal", "low", @@ -200,12 +199,12 @@ export function resolveResponseUsageMode(raw?: string | null): UsageDisplayLevel return normalizeUsageDisplay(raw) ?? "off"; } -export type ResponseUsageInput = "on" | "off" | "tokens" | "full"; -export type ResponseUsageDefaultConfig = +type ResponseUsageInput = "on" | "off" | "tokens" | "full"; +type ResponseUsageDefaultConfig = | ResponseUsageInput | { default?: ResponseUsageInput; [channel: string]: ResponseUsageInput | undefined }; -export function resolveMessagesResponseUsageDefault( +function resolveMessagesResponseUsageDefault( configured: ResponseUsageDefaultConfig | undefined, channel?: string, ): ResponseUsageInput | undefined { diff --git a/src/auto-reply/thinking.test.ts b/src/auto-reply/thinking.test.ts index 8a9b3a8732ca..c23b28c7f336 100644 --- a/src/auto-reply/thinking.test.ts +++ b/src/auto-reply/thinking.test.ts @@ -25,7 +25,6 @@ const { formatThinkingLevels, resolveSupportedThinkingLevel, resolveThinkingDefaultForModel, - resolveMessagesResponseUsageDefault, resolveEffectiveResponseUsage, } = await import("./thinking.js"); @@ -847,33 +846,6 @@ describe("normalizeReasoningLevel", () => { }); }); -describe("resolveMessagesResponseUsageDefault", () => { - it("returns undefined when unset (preserves off-by-default behavior)", () => { - expect(resolveMessagesResponseUsageDefault(undefined)).toBeUndefined(); - expect(resolveMessagesResponseUsageDefault(undefined, "discord")).toBeUndefined(); - }); - - it("returns a bare string default for any channel", () => { - expect(resolveMessagesResponseUsageDefault("full")).toBe("full"); - expect(resolveMessagesResponseUsageDefault("full", "telegram")).toBe("full"); - }); - - it("resolves the channel entry from a map", () => { - const cfg = { default: "off", discord: "full", telegram: "tokens" } as const; - expect(resolveMessagesResponseUsageDefault(cfg, "discord")).toBe("full"); - expect(resolveMessagesResponseUsageDefault(cfg, "telegram")).toBe("tokens"); - }); - - it("falls back to default for an unmapped channel", () => { - const cfg = { default: "tokens", discord: "full" } as const; - expect(resolveMessagesResponseUsageDefault(cfg, "whatsapp")).toBe("tokens"); - }); - - it("returns undefined for a map with neither the channel nor a default", () => { - expect(resolveMessagesResponseUsageDefault({ discord: "full" }, "telegram")).toBeUndefined(); - }); -}); - describe("resolveEffectiveResponseUsage", () => { it("returns off when session is unset and no config is provided", () => { expect(resolveEffectiveResponseUsage(undefined, undefined)).toBe("off"); diff --git a/src/auto-reply/thinking.ts b/src/auto-reply/thinking.ts index ac08ad36a6f6..fa78c0c331b8 100644 --- a/src/auto-reply/thinking.ts +++ b/src/auto-reply/thinking.ts @@ -18,16 +18,12 @@ export { normalizeUsageDisplay, normalizeVerboseLevel, resolveEffectiveResponseUsage, - resolveMessagesResponseUsageDefault, resolveResponseUsageMode, } from "./thinking.shared.js"; export type { ElevatedLevel, FastMode, - NoticeLevel, ReasoningLevel, - ResponseUsageDefaultConfig, - ResponseUsageInput, TraceLevel, ThinkLevel, ThinkingCatalogEntry, @@ -46,7 +42,7 @@ import { import type { ProviderThinkingProfile } from "../plugins/provider-thinking.types.js"; /** UI-facing thinking level option. */ -export type ThinkingLevelOption = { +type ThinkingLevelOption = { id: ThinkLevel; label: string; }; diff --git a/src/auto-reply/types.ts b/src/auto-reply/types.ts index 4740a6ab732f..ff4ce3109bd3 100644 --- a/src/auto-reply/types.ts +++ b/src/auto-reply/types.ts @@ -2,14 +2,7 @@ export type { BlockReplyContext, GetReplyOptions, - PartialReplyPayload, ReplyThreadingPolicy, TypingPolicy, } from "./get-reply-options.types.js"; -export { - copyReplyPayloadMetadata, - markCommandReplyForDelivery, - markReplyPayloadForSourceSuppressionDelivery, - setReplyPayloadMetadata, -} from "./reply-payload.js"; export type { ReplyPayload } from "./reply-payload.js"; diff --git a/src/auto-reply/usage-bar/template.ts b/src/auto-reply/usage-bar/template.ts index a39cea8fca85..1e816a28343d 100644 --- a/src/auto-reply/usage-bar/template.ts +++ b/src/auto-reply/usage-bar/template.ts @@ -6,7 +6,7 @@ import { createSubsystemLogger } from "../../logging/subsystem.js"; import { DEFAULT_USAGE_BAR_TEMPLATE } from "./default-template.js"; import type { UsageBarTemplate } from "./translator.js"; -export type UsageTemplateConfig = string | Record | undefined; +type UsageTemplateConfig = string | Record | undefined; type CacheEntry = { template: UsageBarTemplate | undefined; watcher?: FSWatcher }; const fileCache = new Map(); diff --git a/src/cli/argv.test.ts b/src/cli/argv.test.ts index b1ade1034a7d..8ed41195bde5 100644 --- a/src/cli/argv.test.ts +++ b/src/cli/argv.test.ts @@ -8,7 +8,6 @@ import { getPrimaryCommand, getPositiveIntFlagValue, getVerboseFlag, - hasHelpOrVersion, hasFlag, isHelpOrVersionInvocation, isRootHelpInvocation, @@ -21,56 +20,6 @@ import { } from "./argv.js"; describe("argv helpers", () => { - it.each([ - { - name: "help flag", - argv: ["node", "openclaw", "--help"], - expected: true, - }, - { - name: "version flag", - argv: ["node", "openclaw", "-V"], - expected: true, - }, - { - name: "normal command", - argv: ["node", "openclaw", "status"], - expected: false, - }, - { - name: "root -v alias", - argv: ["node", "openclaw", "-v"], - expected: true, - }, - { - name: "root -v alias with profile", - argv: ["node", "openclaw", "--profile", "work", "-v"], - expected: true, - }, - { - name: "root -v alias with log-level", - argv: ["node", "openclaw", "--log-level", "debug", "-v"], - expected: true, - }, - { - name: "subcommand -v should not be treated as version", - argv: ["node", "openclaw", "acp", "-v"], - expected: false, - }, - { - name: "root -v alias with equals profile", - argv: ["node", "openclaw", "--profile=work", "-v"], - expected: true, - }, - { - name: "subcommand path after global root flags should not be treated as version", - argv: ["node", "openclaw", "--dev", "skills", "list", "-v"], - expected: false, - }, - ])("detects help/version flags: $name", ({ argv, expected }) => { - expect(hasHelpOrVersion(argv)).toBe(expected); - }); - it.each([ { name: "known command group help command help flag", diff --git a/src/cli/argv.ts b/src/cli/argv.ts index 20e7e12d628a..c6d70bae50d9 100644 --- a/src/cli/argv.ts +++ b/src/cli/argv.ts @@ -22,12 +22,6 @@ const ROOT_COMMANDS_WITH_SUBCOMMANDS: ReadonlySet = new Set( ), ); -export function hasHelpOrVersion(argv: string[]): boolean { - return ( - argv.some((arg) => HELP_FLAGS.has(arg) || VERSION_FLAGS.has(arg)) || hasRootVersionAlias(argv) - ); -} - export function isHelpOrVersionInvocation(argv: string[]): boolean { if (hasRootVersionAlias(argv)) { return true; @@ -265,14 +259,14 @@ export function normalizeRootHelpTargetArgv(argv: string[]): string[] { return [runtimePath, entryPath, ...rootOptions, ...targetPath, "--help"]; } -export type NormalizeRootNoColorArgvOptions = { +type NormalizeRootNoColorArgvOptions = { shouldPreserveNoColor?: (params: { remainingArgs: readonly string[]; noColorIndex: number; }) => boolean; }; -export type NormalizeRootLogLevelArgvOptions = { +type NormalizeRootLogLevelArgvOptions = { shouldPreserveLogLevel?: (params: { remainingArgs: readonly string[]; logLevelIndex: number; diff --git a/src/cli/clawhub-risk-acknowledgement.ts b/src/cli/clawhub-risk-acknowledgement.ts index 403e81d1cfb9..0b9164022ffc 100644 --- a/src/cli/clawhub-risk-acknowledgement.ts +++ b/src/cli/clawhub-risk-acknowledgement.ts @@ -2,7 +2,7 @@ import { sanitizeTerminalText } from "../../packages/terminal-core/src/safe-text import type { ClawHubRiskAcknowledgementRequest } from "../infra/clawhub-install-trust.js"; import { promptText, promptYesNo } from "./prompt.js"; -export type ClawHubRiskAcknowledgementCliOptions = { +type ClawHubRiskAcknowledgementCliOptions = { acknowledgeClawHubRisk?: boolean; }; diff --git a/src/cli/cron-cli/schedule-options.ts b/src/cli/cron-cli/schedule-options.ts index cfdfd93bfe3e..b6112d35e588 100644 --- a/src/cli/cron-cli/schedule-options.ts +++ b/src/cli/cron-cli/schedule-options.ts @@ -29,7 +29,7 @@ type NormalizedScheduleOptions = { }; /** Normalized schedule edit request, including patch-only updates for cron metadata. */ -export type CronEditScheduleRequest = +type CronEditScheduleRequest = | { kind: "direct"; schedule: CronSchedule } | { kind: "patch-existing-cron"; staggerMs: number | undefined; tz: string | undefined } | { kind: "none" }; diff --git a/src/cli/daemon-cli/response.ts b/src/cli/daemon-cli/response.ts index 4cbebd12904e..f34b6d643b20 100644 --- a/src/cli/daemon-cli/response.ts +++ b/src/cli/daemon-cli/response.ts @@ -10,10 +10,10 @@ import { isWSL } from "../../infra/wsl.js"; import { defaultRuntime } from "../../runtime.js"; /** Gateway service action emitted by lifecycle commands. */ -export type DaemonAction = "install" | "uninstall" | "start" | "stop" | "restart"; +type DaemonAction = "install" | "uninstall" | "start" | "stop" | "restart"; /** Stable hint category for machine-readable daemon command output. */ -export type DaemonHintKind = +type DaemonHintKind = | "install" | "container-restart" | "container-foreground" @@ -23,7 +23,7 @@ export type DaemonHintKind = | "generic"; /** Classified daemon recovery hint item. */ -export type DaemonHintItem = { +type DaemonHintItem = { kind: DaemonHintKind; text: string; }; diff --git a/src/cli/gateway-cli/qa-parent-watchdog.ts b/src/cli/gateway-cli/qa-parent-watchdog.ts index 4c7bd8c9da71..61c1a00aa9ab 100644 --- a/src/cli/gateway-cli/qa-parent-watchdog.ts +++ b/src/cli/gateway-cli/qa-parent-watchdog.ts @@ -31,7 +31,7 @@ type QaParentWatchdogDeps = { setInterval?: (callback: () => void, ms: number) => QaParentWatchdogTimer; }; -export type QaParentWatchdogHandle = { +type QaParentWatchdogHandle = { parentPid: number; stop: () => void; }; diff --git a/src/cli/gateway-cli/run.ts b/src/cli/gateway-cli/run.ts index 55fed1c920a6..9b8e0cce95e6 100644 --- a/src/cli/gateway-cli/run.ts +++ b/src/cli/gateway-cli/run.ts @@ -1098,4 +1098,3 @@ export const testing = { resolveGatewayStartupFailureExitCode, runGatewayLoopWithSupervisedLockRecovery, }; -export { testing as __testing }; diff --git a/src/cli/help-format.ts b/src/cli/help-format.ts index 72c5b5691a52..8b61a619375a 100644 --- a/src/cli/help-format.ts +++ b/src/cli/help-format.ts @@ -2,7 +2,7 @@ import { theme } from "../../packages/terminal-core/src/theme.js"; /** Command plus short description tuple used in help epilogues. */ -export type HelpExample = readonly [command: string, description: string]; +type HelpExample = readonly [command: string, description: string]; function formatHelpExample(command: string, description: string): string { return ` ${theme.command(command)}\n ${theme.muted(description)}`; diff --git a/src/cli/nodes-camera.ts b/src/cli/nodes-camera.ts index 9c426758f9ab..91680793691d 100644 --- a/src/cli/nodes-camera.ts +++ b/src/cli/nodes-camera.ts @@ -24,7 +24,7 @@ const CAMERA_URL_DOWNLOAD_TIMEOUT_MS = 15 * 60_000; export type CameraFacing = "front" | "back"; /** Validated still-image payload from `nodes camera snap`. */ -export type CameraSnapPayload = { +type CameraSnapPayload = { format: string; base64?: string; url?: string; @@ -33,7 +33,7 @@ export type CameraSnapPayload = { }; /** Validated video payload from `nodes camera clip`. */ -export type CameraClipPayload = { +type CameraClipPayload = { format: string; base64?: string; url?: string; diff --git a/src/cli/nodes-screen.ts b/src/cli/nodes-screen.ts index e5f5d4eaed67..a265bb45740e 100644 --- a/src/cli/nodes-screen.ts +++ b/src/cli/nodes-screen.ts @@ -4,7 +4,7 @@ import { writeBase64ToFile } from "./nodes-camera.js"; import { asRecord, asString, resolveTempPathParts } from "./nodes-media-utils.js"; /** Validated payload returned by `nodes screen record` RPC calls. */ -export type ScreenRecordPayload = { +type ScreenRecordPayload = { format: string; base64: string; durationMs?: number; @@ -47,7 +47,7 @@ export async function writeScreenRecordToFile( } /** Validated payload returned by `nodes screen snapshot` RPC calls. */ -export type ScreenSnapshotPayload = { +type ScreenSnapshotPayload = { format: string; base64: string; /** Node-issued token binding this image to one physical display geometry. */ diff --git a/src/cli/plugins-cli.ts b/src/cli/plugins-cli.ts index 974ebb35db80..f285a1e33971 100644 --- a/src/cli/plugins-cli.ts +++ b/src/cli/plugins-cli.ts @@ -45,7 +45,7 @@ type PluginSearchOptions = { limit?: number; }; -export type PluginUninstallOptions = { +type PluginUninstallOptions = { keepFiles?: boolean; /** @deprecated Use keepFiles. */ keepConfig?: boolean; diff --git a/src/cli/plugins-location-bridges.ts b/src/cli/plugins-location-bridges.ts index 05bf0fc03dc4..13a47fa4476b 100644 --- a/src/cli/plugins-location-bridges.ts +++ b/src/cli/plugins-location-bridges.ts @@ -12,7 +12,7 @@ import { resolveOfficialExternalPluginInstall, } from "../plugins/official-external-plugin-catalog.js"; -export type PersistedBundledPluginRecoveryLocation = { +type PersistedBundledPluginRecoveryLocation = { pluginId: string; loadPaths: readonly string[]; }; diff --git a/src/cli/plugins-search-command.ts b/src/cli/plugins-search-command.ts index ee633ab59105..bd594baa4bfd 100644 --- a/src/cli/plugins-search-command.ts +++ b/src/cli/plugins-search-command.ts @@ -7,7 +7,7 @@ import { searchInstallablePluginPackages } from "../plugins/catalog-search.js"; import { defaultRuntime, writeRuntimeJson, type RuntimeEnv } from "../runtime.js"; /** Options accepted by `openclaw plugins search`. */ -export type PluginsSearchOptions = { +type PluginsSearchOptions = { json?: boolean; limit?: number; }; diff --git a/src/cli/ports.ts b/src/cli/ports.ts index 6565534b4ae8..1cc6a52bb4ff 100644 --- a/src/cli/ports.ts +++ b/src/cli/ports.ts @@ -12,7 +12,7 @@ import { sleep } from "../utils.js"; export type PortProcess = { pid: number; command?: string }; -export type ForceFreePortResult = { +type ForceFreePortResult = { killed: PortProcess[]; waitedMs: number; escalatedToSigkill: boolean; diff --git a/src/cli/precomputed-help.ts b/src/cli/precomputed-help.ts index 39dd0f907b9f..d25d412392f7 100644 --- a/src/cli/precomputed-help.ts +++ b/src/cli/precomputed-help.ts @@ -2,7 +2,7 @@ import { consumeRootOptionToken } from "../infra/cli-root-options.js"; import { getCommandPathWithRootOptions, hasFlag } from "./argv.js"; import type { RootHelpRenderOptions } from "./program/root-help.js"; -export type PrecomputedSubcommandHelpName = +type PrecomputedSubcommandHelpName = | "doctor" | "gateway" | "models" diff --git a/src/cli/program/command-descriptor-utils.ts b/src/cli/program/command-descriptor-utils.ts index 7a4a0e2d62fa..e872e2de3f55 100644 --- a/src/cli/program/command-descriptor-utils.ts +++ b/src/cli/program/command-descriptor-utils.ts @@ -4,12 +4,12 @@ import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; import type { NamedCommandDescriptor } from "./command-group-descriptors.js"; /** Minimal descriptor shape used before a command is fully registered. */ -export type CommandDescriptorLike = Pick; +type CommandDescriptorLike = Pick; const SAFE_COMMAND_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/; /** Descriptor catalog plus derived name lists used by lazy command registration. */ -export type CommandDescriptorCatalog = { +type CommandDescriptorCatalog = { descriptors: readonly TDescriptor[]; getDescriptors: () => readonly TDescriptor[]; getNames: () => string[]; diff --git a/src/cli/program/command-group-descriptors.ts b/src/cli/program/command-group-descriptors.ts index a82e8128da60..33599e121ca4 100644 --- a/src/cli/program/command-group-descriptors.ts +++ b/src/cli/program/command-group-descriptors.ts @@ -16,7 +16,7 @@ export type CommandGroupDescriptorSpec = { }; /** Resolved group entry after descriptor lookup. */ -export type ResolvedCommandGroupEntry = { +type ResolvedCommandGroupEntry = { placeholders: TDescriptor[]; register: TRegister; }; diff --git a/src/cli/program/command-registry-core.ts b/src/cli/program/command-registry-core.ts index 04a608b34027..4c2db15e746c 100644 --- a/src/cli/program/command-registry-core.ts +++ b/src/cli/program/command-registry-core.ts @@ -20,7 +20,7 @@ import { type CommandGroupEntry, } from "./register-command-groups.js"; -export { getCoreCliCommandDescriptors, getCoreCliCommandsWithSubcommands }; +export { getCoreCliCommandsWithSubcommands }; type CommandRegisterParams = { program: Command; @@ -28,11 +28,6 @@ type CommandRegisterParams = { argv: string[]; }; -export type CommandRegistration = { - id: string; - register: (params: CommandRegisterParams) => void; -}; - function withProgramOnlySpecs( specs: readonly CommandGroupDescriptorSpec<(program: Command) => Promise | void>[], ): CommandGroupDescriptorSpec<(params: CommandRegisterParams) => Promise>[] { diff --git a/src/cli/program/command-registry.ts b/src/cli/program/command-registry.ts index 9e331388ac63..6fea4c3eb017 100644 --- a/src/cli/program/command-registry.ts +++ b/src/cli/program/command-registry.ts @@ -1,10 +1,8 @@ // Program command registry facade: exports core descriptors and registers core plus sub-CLIs. import type { Command } from "commander"; import { - getCoreCliCommandDescriptors, getCoreCliCommandNames, getCoreCliCommandsWithSubcommands, - type CommandRegistration, registerCoreCliByName, registerCoreCliCommands, } from "./command-registry-core.js"; @@ -12,16 +10,12 @@ import type { ProgramContext } from "./context.js"; import { registerSubCliCommands } from "./register.subclis.js"; export { - getCoreCliCommandDescriptors, getCoreCliCommandNames, getCoreCliCommandsWithSubcommands, registerCoreCliByName, registerCoreCliCommands, }; -/** Core command registration contract re-exported for program builders and tests. */ -export type { CommandRegistration }; - /** Register all root-program commands for the current argv shape. */ export function registerProgramCommands( program: Command, diff --git a/src/cli/program/core-command-descriptors.ts b/src/cli/program/core-command-descriptors.ts index caf10b2f10f5..8622c1dd7569 100644 --- a/src/cli/program/core-command-descriptors.ts +++ b/src/cli/program/core-command-descriptors.ts @@ -3,7 +3,7 @@ import { defineCommandDescriptorCatalog } from "./command-descriptor-utils.js"; import type { NamedCommandDescriptor } from "./command-group-descriptors.js"; /** Descriptor shape for root commands owned by the core CLI. */ -export type CoreCliCommandDescriptor = NamedCommandDescriptor; +type CoreCliCommandDescriptor = NamedCommandDescriptor; const coreCliCommandCatalog = defineCommandDescriptorCatalog([ { diff --git a/src/cli/program/register-command-groups.ts b/src/cli/program/register-command-groups.ts index 2aa6127ecd4f..29aea366389c 100644 --- a/src/cli/program/register-command-groups.ts +++ b/src/cli/program/register-command-groups.ts @@ -12,7 +12,7 @@ export type CommandGroupPlaceholder = { }; /** Commander option metadata attached to a lazy placeholder. */ -export type CommandGroupPlaceholderOption = { +type CommandGroupPlaceholderOption = { flags: string; description: string; }; diff --git a/src/cli/program/register.subclis-core.ts b/src/cli/program/register.subclis-core.ts index 5f8a1121220d..a0185fbd15dc 100644 --- a/src/cli/program/register.subclis-core.ts +++ b/src/cli/program/register.subclis-core.ts @@ -20,13 +20,10 @@ import { type CommandGroupEntry, } from "./register-command-groups.js"; import { - getSubCliCommandsWithSubcommands, getSubCliEntries as getSubCliEntryDescriptors, type SubCliDescriptor, } from "./subcli-descriptors.js"; -export { getSubCliCommandsWithSubcommands }; - export type SubCliRegistrationContext = { purpose?: "runtime" | "completion"; }; diff --git a/src/cli/program/register.subclis.ts b/src/cli/program/register.subclis.ts index 0f13c81349d0..a671a0da5d5c 100644 --- a/src/cli/program/register.subclis.ts +++ b/src/cli/program/register.subclis.ts @@ -21,13 +21,10 @@ import { type SubCliRegistrationContext, } from "./register.subclis-core.js"; import { - getSubCliCommandsWithSubcommands, getSubCliEntries as getSubCliEntryDescriptors, type SubCliDescriptor, } from "./subcli-descriptors.js"; -export { getSubCliCommandsWithSubcommands }; - type SubCliRegistrar = ( program: Command, argv: string[], diff --git a/src/cli/program/root-command-descriptions.test.ts b/src/cli/program/root-command-descriptions.test.ts index ae7ef6c0b19c..3e7c8b9979df 100644 --- a/src/cli/program/root-command-descriptions.test.ts +++ b/src/cli/program/root-command-descriptions.test.ts @@ -2,12 +2,9 @@ // registered Commander commands. Keep those user-facing descriptions aligned. import { Command } from "commander"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { - getCoreCliCommandDescriptors, - getCoreCliCommandNames, - registerCoreCliByName, -} from "./command-registry-core.js"; +import { getCoreCliCommandNames, registerCoreCliByName } from "./command-registry-core.js"; import { createProgramContext } from "./context.js"; +import { getCoreCliCommandDescriptors } from "./core-command-descriptors.js"; import { getSubCliEntries, registerSubCliByName } from "./register.subclis.js"; describe("root command descriptions", () => { diff --git a/src/cli/program/routes.ts b/src/cli/program/routes.ts index b7e73b40818a..e2c88b5843bc 100644 --- a/src/cli/program/routes.ts +++ b/src/cli/program/routes.ts @@ -2,7 +2,6 @@ import { routedCommands, type RouteSpec } from "./route-specs.js"; /** Routed command contract re-exported for callers that only need route lookup. */ -export type { RouteSpec } from "./route-specs.js"; /** Find the first route matching a command path and parseable argv. */ export function findRoutedCommand(path: string[], argv?: string[]): RouteSpec | null { diff --git a/src/cli/shared/parse-port.ts b/src/cli/shared/parse-port.ts index ef4020eca112..9b0fe6c65b0f 100644 --- a/src/cli/shared/parse-port.ts +++ b/src/cli/shared/parse-port.ts @@ -2,7 +2,6 @@ import { parseTcpPort } from "../../infra/tcp-port.js"; /** Re-export the canonical TCP port parser and limit for CLI callers. */ -export { MAX_TCP_PORT, parseTcpPort } from "../../infra/tcp-port.js"; /** Parse a TCP port from unknown CLI/config input, returning null for invalid values. */ export function parsePort(raw: unknown): number | null { diff --git a/src/cli/startup-trace.ts b/src/cli/startup-trace.ts index 9978bcd1e6a3..1616b73dc0c1 100644 --- a/src/cli/startup-trace.ts +++ b/src/cli/startup-trace.ts @@ -2,7 +2,7 @@ import process from "node:process"; import { isTruthyEnvValue } from "../infra/env.js"; -export type GatewayStartupTraceSource = "entry" | "cli.main"; +type GatewayStartupTraceSource = "entry" | "cli.main"; export function createGatewayStartupTrace( argv: string[], diff --git a/src/cli/update-cli/plugin-payload-validation.ts b/src/cli/update-cli/plugin-payload-validation.ts index 4337ca59edc8..96876c4e5eec 100644 --- a/src/cli/update-cli/plugin-payload-validation.ts +++ b/src/cli/update-cli/plugin-payload-validation.ts @@ -9,7 +9,7 @@ import { validatePackageExtensionEntriesForInstall } from "../../plugins/package import { auditOpenClawPeerDependencyLink } from "../../plugins/plugin-peer-link.js"; import { resolveUserPath } from "../../utils.js"; -export type PluginPayloadSmokeFailureReason = +type PluginPayloadSmokeFailureReason = | "missing-install-path" | "missing-package-dir" | "missing-package-json" @@ -27,7 +27,7 @@ export type PluginPayloadSmokeFailure = { detail: string; }; -export type PluginPayloadSmokeResult = { +type PluginPayloadSmokeResult = { checked: string[]; failures: PluginPayloadSmokeFailure[]; }; diff --git a/src/cli/update-cli/post-core-plugin-convergence.ts b/src/cli/update-cli/post-core-plugin-convergence.ts index e0de0d30e474..543da3c03b03 100644 --- a/src/cli/update-cli/post-core-plugin-convergence.ts +++ b/src/cli/update-cli/post-core-plugin-convergence.ts @@ -19,14 +19,14 @@ import { type PluginPayloadSmokeFailure, } from "./plugin-payload-validation.js"; -export type PostCoreConvergenceWarning = { +type PostCoreConvergenceWarning = { pluginId?: string; reason: string; message: string; guidance: string[]; }; -export type PostCoreConvergenceResult = { +type PostCoreConvergenceResult = { changes: string[]; notices?: PostCoreConvergenceWarning[]; warnings: PostCoreConvergenceWarning[]; diff --git a/src/cli/update-cli/progress.ts b/src/cli/update-cli/progress.ts index de3232158a42..4a34c60c2abf 100644 --- a/src/cli/update-cli/progress.ts +++ b/src/cli/update-cli/progress.ts @@ -115,7 +115,7 @@ export function inferUpdateFailureHints(result: UpdateRunResult): string[] { } /** Runner-facing progress callbacks plus terminal spinner cleanup. */ -export type ProgressController = { +type ProgressController = { progress: UpdateStepProgress; stop: () => void; }; diff --git a/src/commands/auth-choice.model-check.ts b/src/commands/auth-choice.model-check.ts index 4ec2cca7db9f..db66796b7c01 100644 --- a/src/commands/auth-choice.model-check.ts +++ b/src/commands/auth-choice.model-check.ts @@ -11,7 +11,7 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { ProviderModelRouteAuthRequirement } from "../plugin-sdk/provider-model-types.js"; import type { WizardPrompter } from "../wizard/prompts.js"; -export type ModelRouteObservation = { +type ModelRouteObservation = { api?: ModelApi | null; baseUrl?: unknown; }; diff --git a/src/commands/auth-token.ts b/src/commands/auth-token.ts index b1789683209c..ab54c4299df3 100644 --- a/src/commands/auth-token.ts +++ b/src/commands/auth-token.ts @@ -1,5 +1,2 @@ // Public command-level barrel for provider setup-token validation helpers. -export { - ANTHROPIC_SETUP_TOKEN_PREFIX, - validateAnthropicSetupToken, -} from "../plugins/provider-auth-token.js"; +export { validateAnthropicSetupToken } from "../plugins/provider-auth-token.js"; diff --git a/src/commands/backup-shared.ts b/src/commands/backup-shared.ts index 245868ac01d5..7bb4a5f6cc77 100644 --- a/src/commands/backup-shared.ts +++ b/src/commands/backup-shared.ts @@ -10,8 +10,8 @@ import { import { pathExists, shortenHomePath } from "../utils.js"; import { buildCleanupPlan, isPathWithin } from "./cleanup-utils.js"; -export type BackupAssetKind = "state" | "config" | "credentials" | "workspace"; -export type BackupSkipReason = "covered" | "missing"; +type BackupAssetKind = "state" | "config" | "credentials" | "workspace"; +type BackupSkipReason = "covered" | "missing"; export type BackupAsset = { kind: BackupAssetKind; @@ -20,7 +20,7 @@ export type BackupAsset = { archivePath: string; }; -export type SkippedBackupAsset = { +type SkippedBackupAsset = { kind: BackupAssetKind; sourcePath: string; displayPath: string; @@ -28,7 +28,7 @@ export type SkippedBackupAsset = { coveredBy?: string; }; -export type BackupPlan = { +type BackupPlan = { stateDir: string; configPath: string; oauthDir: string; diff --git a/src/commands/configure.gateway-auth.test.ts b/src/commands/configure.gateway-auth.test.ts index 15abc7b3c7d3..307295b4ad12 100644 --- a/src/commands/configure.gateway-auth.test.ts +++ b/src/commands/configure.gateway-auth.test.ts @@ -1,6 +1,6 @@ // Configure gateway auth tests cover gateway auth config generation and token handling. import { describe, expect, it } from "vitest"; -import { buildGatewayAuthConfig } from "./configure.js"; +import { buildGatewayAuthConfig } from "./configure.gateway-auth.js"; function expectGeneratedTokenFromInput( token: string | undefined, diff --git a/src/commands/configure.ts b/src/commands/configure.ts index d327a0ecc5e2..601f1a843f9b 100644 --- a/src/commands/configure.ts +++ b/src/commands/configure.ts @@ -1,4 +1,2 @@ -// Public configure command barrel for wizard entry points and shared config helpers. +// Public configure command barrel for wizard entry points. export { configureCommandFromSectionsArg } from "./configure.commands.js"; -export { buildGatewayAuthConfig } from "./configure.gateway-auth.js"; -export { CONFIGURE_WIZARD_SECTIONS } from "./configure.shared.js"; diff --git a/src/commands/crestodian-with-inference.ts b/src/commands/crestodian-with-inference.ts index 8076a757275a..839e6136b8ab 100644 --- a/src/commands/crestodian-with-inference.ts +++ b/src/commands/crestodian-with-inference.ts @@ -14,7 +14,7 @@ type VerifySetupInference = (params: { }) => Promise; type RunGuidedOnboarding = typeof import("./onboard-guided.js").runGuidedOnboarding; -export type CrestodianWithInferenceDeps = { +type CrestodianWithInferenceDeps = { verifyInference?: VerifySetupInference; runGuidedOnboarding?: RunGuidedOnboarding; runCrestodian?: RunCrestodian; diff --git a/src/commands/daemon-install-helpers.test.ts b/src/commands/daemon-install-helpers.test.ts index b362287f9b75..10a8becf9985 100644 --- a/src/commands/daemon-install-helpers.test.ts +++ b/src/commands/daemon-install-helpers.test.ts @@ -84,11 +84,8 @@ vi.mock("../plugins/plugin-registry.js", async (importActual) => { }; }); -import { - buildGatewayInstallPlan, - gatewayInstallErrorHint, - resolveGatewayDevMode, -} from "./daemon-install-helpers.js"; +import { buildGatewayInstallPlan, gatewayInstallErrorHint } from "./daemon-install-helpers.js"; +import { resolveGatewayDevMode } from "./daemon-install-plan.shared.js"; afterEach(() => { vi.resetAllMocks(); diff --git a/src/commands/daemon-install-helpers.ts b/src/commands/daemon-install-helpers.ts index 43066291a2da..33091ae8ac47 100644 --- a/src/commands/daemon-install-helpers.ts +++ b/src/commands/daemon-install-helpers.ts @@ -53,8 +53,6 @@ import { import type { DaemonInstallWarnFn } from "./daemon-install-runtime-warning.js"; import type { GatewayDaemonRuntime } from "./daemon-runtime.js"; -export { resolveGatewayDevMode } from "./daemon-install-plan.shared.js"; - type GatewayInstallPlan = { programArguments: string[]; workingDirectory?: string; diff --git a/src/commands/doctor-completion.ts b/src/commands/doctor-completion.ts index c5c7bc722df5..2769d002667f 100644 --- a/src/commands/doctor-completion.ts +++ b/src/commands/doctor-completion.ts @@ -23,7 +23,7 @@ import type { DoctorPrompter } from "./doctor-prompter.js"; const COMPLETION_CACHE_WRITE_TIMEOUT_MS = 30_000; -export type ShellCompletionStatusOptions = { +type ShellCompletionStatusOptions = { shell?: CompletionShell; }; @@ -203,7 +203,7 @@ export function shellCompletionStatusToRepairEffects( return effects; } -export type DoctorCompletionOptions = { +type DoctorCompletionOptions = { nonInteractive?: boolean; }; diff --git a/src/commands/doctor-config-flow.test.ts b/src/commands/doctor-config-flow.test.ts index 0f7b96d8f560..60dadcec43a5 100644 --- a/src/commands/doctor-config-flow.test.ts +++ b/src/commands/doctor-config-flow.test.ts @@ -4,7 +4,7 @@ import path from "node:path"; import { expectDefined } from "@openclaw/normalization-core"; import { withTempHome } from "openclaw/plugin-sdk/test-env"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { writeChannelPairingStateSnapshot } from "../pairing/pairing-store-sqlite.js"; +import { writeChannelPairingStateSnapshot } from "../pairing/pairing-store-sqlite.test-helpers.js"; import { closeOpenClawStateDatabaseForTest } from "../state/openclaw-state-db.js"; import { loadAndMaybeMigrateDoctorConfig } from "./doctor-config-flow.js"; import { diff --git a/src/commands/doctor-plugin-registry.ts b/src/commands/doctor-plugin-registry.ts index 604255556f16..9b5ef4636b6e 100644 --- a/src/commands/doctor-plugin-registry.ts +++ b/src/commands/doctor-plugin-registry.ts @@ -57,7 +57,7 @@ type PluginRegistryDoctorNoteLogger = { warn: (message: string) => void; }; -export type PluginRegistryHealthIssue = +type PluginRegistryHealthIssue = | { kind: "registry-missing-or-stale"; path: string; diff --git a/src/commands/doctor-session-snapshots.ts b/src/commands/doctor-session-snapshots.ts index bbe492e3f8ba..37ce278a4252 100644 --- a/src/commands/doctor-session-snapshots.ts +++ b/src/commands/doctor-session-snapshots.ts @@ -35,7 +35,7 @@ type StaleSessionSnapshotPathFinding = { expectedPath: string; }; -export type SessionSnapshotHealthIssue = StaleSessionSnapshotPathFinding & { +type SessionSnapshotHealthIssue = StaleSessionSnapshotPathFinding & { storePath: string; }; diff --git a/src/commands/doctor-session-sqlite-github-issue.ts b/src/commands/doctor-session-sqlite-github-issue.ts index 2c047629cd61..766e7af23914 100644 --- a/src/commands/doctor-session-sqlite-github-issue.ts +++ b/src/commands/doctor-session-sqlite-github-issue.ts @@ -2,7 +2,7 @@ import { spawnSync, type SpawnSyncReturns } from "node:child_process"; import type { SessionSqliteMigrationFailureIssue } from "./doctor-session-sqlite-types.js"; -export type SessionSqliteGithubIssueCreateResult = +type SessionSqliteGithubIssueCreateResult = | { ok: true; url: string } | { fallbackUrl: string; message: string; ok: false }; diff --git a/src/commands/doctor-session-sqlite-migration-run.ts b/src/commands/doctor-session-sqlite-migration-run.ts index 1f6e8dd00807..427e7d17c735 100644 --- a/src/commands/doctor-session-sqlite-migration-run.ts +++ b/src/commands/doctor-session-sqlite-migration-run.ts @@ -32,7 +32,7 @@ export type SessionSqliteMigrationTargetInput = { storePath: string; }; -export type SessionSqliteMigrationTargetManifest = SessionSqliteMigrationTargetInput & { +type SessionSqliteMigrationTargetManifest = SessionSqliteMigrationTargetInput & { completedMoves: SessionSqliteMigrationMove[]; issues: DoctorSessionSqliteIssue[]; plannedMoves: SessionSqliteMigrationMove[]; @@ -470,10 +470,7 @@ export function createSessionSqliteMigrationFailureIssue( }; } -export function sessionSqliteMigrationTargetKey(target: { - agentId: string; - storePath: string; -}): string { +function sessionSqliteMigrationTargetKey(target: { agentId: string; storePath: string }): string { return `${target.agentId}\u0000${canonicalMigrationFilePath(target.storePath)}`; } @@ -672,7 +669,7 @@ function filterRestoreManifestTargets( ); } -export function listSessionSqliteMigrationManifestPaths(env: NodeJS.ProcessEnv): string[] { +function listSessionSqliteMigrationManifestPaths(env: NodeJS.ProcessEnv): string[] { const runsDir = resolveSessionSqliteMigrationRunsDir(env); let entries: string[]; try { @@ -687,7 +684,7 @@ export function listSessionSqliteMigrationManifestPaths(env: NodeJS.ProcessEnv): .toSorted((left, right) => right.localeCompare(left)); } -export function readSessionSqliteMigrationManifest( +function readSessionSqliteMigrationManifest( manifestPath: string, ): SessionSqliteMigrationManifest | undefined { try { diff --git a/src/commands/doctor-session-sqlite-readers.ts b/src/commands/doctor-session-sqlite-readers.ts index b0dd04df0d02..4e160faaba0c 100644 --- a/src/commands/doctor-session-sqlite-readers.ts +++ b/src/commands/doctor-session-sqlite-readers.ts @@ -10,25 +10,25 @@ import type { SessionEntry } from "../config/sessions/types.js"; import { requireNodeSqlite } from "../infra/node-sqlite.js"; import { resolveOpenClawAgentSqlitePath } from "../state/openclaw-agent-db.js"; -export type ReadOnlySqliteSessionSummary = { +type ReadOnlySqliteSessionSummary = { entry: SessionEntry; sessionKey: string; }; -export type ReadOnlySqliteSessionEntriesResult = +type ReadOnlySqliteSessionEntriesResult = | { exists: false; ok: true; summaries: [] } | { exists: true; ok: true; summaries: ReadOnlySqliteSessionSummary[] } | { error: unknown; exists: true; ok: false }; -export type ReadOnlySqliteExactSessionEntryResult = +type ReadOnlySqliteExactSessionEntryResult = | { entry?: ReadOnlySqliteSessionSummary; ok: true } | { error: unknown; ok: false }; -export type ReadOnlySqliteTranscriptEventCountResult = +type ReadOnlySqliteTranscriptEventCountResult = | { events: number; exists: boolean; ok: true } | { error: unknown; exists: true; ok: false }; -export type ReadOnlySqliteDbStatsResult = +type ReadOnlySqliteDbStatsResult = | { ok: true; stats: { @@ -41,7 +41,7 @@ export type ReadOnlySqliteDbStatsResult = } | { error: unknown; ok: false }; -export type TranscriptEventCountResult = +type TranscriptEventCountResult = | { status: "ok"; events: number } | { status: "missing" } | { status: "malformed"; message: string }; diff --git a/src/commands/doctor-session-sqlite-recover-report.ts b/src/commands/doctor-session-sqlite-recover-report.ts index efea18719018..1bd52f887e20 100644 --- a/src/commands/doctor-session-sqlite-recover-report.ts +++ b/src/commands/doctor-session-sqlite-recover-report.ts @@ -23,7 +23,7 @@ import type { DoctorSessionSqliteTargetReport, } from "./doctor-session-sqlite-types.js"; -export type SessionSqliteRecoverTargetValidator = ( +type SessionSqliteRecoverTargetValidator = ( target: SessionStoreTarget, ) => Promise; diff --git a/src/commands/doctor-session-sqlite-types.ts b/src/commands/doctor-session-sqlite-types.ts index 4826e935e6f3..89d224ba22f9 100644 --- a/src/commands/doctor-session-sqlite-types.ts +++ b/src/commands/doctor-session-sqlite-types.ts @@ -20,13 +20,13 @@ export type DoctorSessionSqliteRestoreReport = { skippedFiles: string[]; }; -export type DoctorSessionSqliteLargestSession = { +type DoctorSessionSqliteLargestSession = { events: number; rowBytes: number; sessionId: string; }; -export type DoctorSessionSqliteDbStats = { +type DoctorSessionSqliteDbStats = { dbSizeBytes: number; integrityCheck?: string; largestSessions: DoctorSessionSqliteLargestSession[]; @@ -46,7 +46,7 @@ export type DoctorSessionSqliteCompactReport = { walSizeBeforeBytes: number; }; -export type DoctorSessionSqliteCorruptRecovery = { +type DoctorSessionSqliteCorruptRecovery = { movedFiles: string[]; skippedFiles: string[]; }; diff --git a/src/commands/doctor-session-transcripts.ts b/src/commands/doctor-session-transcripts.ts index 51017502ea92..440a2b75b13d 100644 --- a/src/commands/doctor-session-transcripts.ts +++ b/src/commands/doctor-session-transcripts.ts @@ -39,7 +39,7 @@ type TranscriptRepairResult = { reason?: string; }; -export type SessionTranscriptHealthIssue = TranscriptRepairResult & { +type SessionTranscriptHealthIssue = TranscriptRepairResult & { broken: true; }; diff --git a/src/commands/doctor-skills.test.ts b/src/commands/doctor-skills.test.ts index 53ed8acb701c..5d2c5f362597 100644 --- a/src/commands/doctor-skills.test.ts +++ b/src/commands/doctor-skills.test.ts @@ -6,8 +6,10 @@ import type { SkillStatusEntry, SkillStatusReport } from "../skills/discovery/st import type { GhConfigDiscoveryInput } from "../skills/lifecycle/gh-config-discovery.js"; import { collectUnavailableAgentSkills, - describeGhConfigDirHintFromDiscovery, disableUnavailableSkillsInConfig, +} from "./doctor-skills-core.js"; +import { + describeGhConfigDirHintFromDiscovery, formatUnavailableSkillDoctorLines, } from "./doctor-skills.js"; diff --git a/src/commands/doctor-skills.ts b/src/commands/doctor-skills.ts index cd831df72a54..6ecf2d8a5ee2 100644 --- a/src/commands/doctor-skills.ts +++ b/src/commands/doctor-skills.ts @@ -19,11 +19,6 @@ import { formatMissingSkillSummary, } from "./doctor-skills-core.js"; -export { - collectUnavailableAgentSkills, - disableUnavailableSkillsInConfig, -} from "./doctor-skills-core.js"; - function formatInstallHints(skill: SkillStatusEntry): string[] { if (skill.install.length === 0) { return []; diff --git a/src/commands/doctor-sqlite-compact.ts b/src/commands/doctor-sqlite-compact.ts index 9794387a917d..e4f0dca60fe9 100644 --- a/src/commands/doctor-sqlite-compact.ts +++ b/src/commands/doctor-sqlite-compact.ts @@ -13,7 +13,7 @@ export type DoctorSqliteCompactSnapshot = { walSizeBytes: number; }; -export type DoctorSqliteCompactResult = { +type DoctorSqliteCompactResult = { after: DoctorSqliteCompactSnapshot; before: DoctorSqliteCompactSnapshot; integrityCheck: "ok"; diff --git a/src/commands/doctor-state-migrations.test.ts b/src/commands/doctor-state-migrations.test.ts index b7b87df1c0ce..d73ddbbb89b0 100644 --- a/src/commands/doctor-state-migrations.test.ts +++ b/src/commands/doctor-state-migrations.test.ts @@ -9,12 +9,12 @@ import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; import type { SessionEntry } from "../config/sessions/types.js"; import { requireNodeSqlite } from "../infra/node-sqlite.js"; -import { readChannelPairingStateSnapshot } from "../pairing/pairing-store-sqlite.js"; +import { readChannelPairingStateSnapshot } from "../pairing/pairing-store-sqlite.test-helpers.js"; import { createPluginStateKeyedStore, resetPluginStateStoreForTests, - setMaxPluginStateEntriesPerPluginForTests, } from "../plugin-state/plugin-state-store.js"; +import { setMaxPluginStateEntriesPerPluginForTests } from "../plugin-state/plugin-state-store.sqlite.js"; import { seedPluginStateEntriesForTests } from "../plugin-state/plugin-state-store.test-helpers.js"; import { readPersistedInstalledPluginIndex, diff --git a/src/commands/doctor/cron/legacy-store-migration.ts b/src/commands/doctor/cron/legacy-store-migration.ts index 354a139aed4a..da0347fcb747 100644 --- a/src/commands/doctor/cron/legacy-store-migration.ts +++ b/src/commands/doctor/cron/legacy-store-migration.ts @@ -514,7 +514,7 @@ export async function legacyCronStoreFilesExist(storePath: string): Promise }; diff --git a/src/commands/doctor/cron/payload-migration.ts b/src/commands/doctor/cron/payload-migration.ts index 4b0ad55581f7..d1fc69810e86 100644 --- a/src/commands/doctor/cron/payload-migration.ts +++ b/src/commands/doctor/cron/payload-migration.ts @@ -12,9 +12,7 @@ type LegacyAgentTurnCommandPayload = { timeoutSeconds?: number; }; -export type UnresolvedAgentTurnShellToolPromptKind = - | "commandPromptWithoutShellAccess" - | "shellToolPrompt"; +type UnresolvedAgentTurnShellToolPromptKind = "commandPromptWithoutShellAccess" | "shellToolPrompt"; const LEGACY_AGENT_TURN_COMMAND_MARKER_RE = /\bCommand to run\s*:/iu; const LEGACY_AGENT_TURN_COMMAND_FIELD_RE = /^\s*-\s*(command|workdir|timeout)\s*:\s*(.*?)\s*$/iu; diff --git a/src/commands/doctor/shared/channel-plugin-blockers.ts b/src/commands/doctor/shared/channel-plugin-blockers.ts index e45410452e35..329d0fa0338a 100644 --- a/src/commands/doctor/shared/channel-plugin-blockers.ts +++ b/src/commands/doctor/shared/channel-plugin-blockers.ts @@ -23,7 +23,7 @@ import { isSafeChannelEnvVarTriggerName } from "../../../secrets/channel-env-var const CHANNEL_PLUGIN_BLOCKERS_CHECK_ID = "core/doctor/channel-plugin-blockers"; -export type ChannelPluginBlockerHit = { +type ChannelPluginBlockerHit = { /** Normalized configured channel id whose backing plugin is unavailable. */ channelId: string; /** Plugin id that would provide the configured channel. */ diff --git a/src/commands/doctor/shared/codex-route-warnings.ts b/src/commands/doctor/shared/codex-route-warnings.ts index fa23f4a5cac8..a916363bb6c8 100644 --- a/src/commands/doctor/shared/codex-route-warnings.ts +++ b/src/commands/doctor/shared/codex-route-warnings.ts @@ -45,7 +45,7 @@ type DisabledCodexPluginRouteHit = { modelRef: string; canonicalModel: string; }; -export type DisabledCodexPluginRouteIssue = { +type DisabledCodexPluginRouteIssue = { /** Config path that selects a model requiring the Codex plugin runtime. */ path: string; /** Original model reference from config. */ diff --git a/src/commands/doctor/shared/exec-safe-bins.ts b/src/commands/doctor/shared/exec-safe-bins.ts index a87f6e6db485..89e273259d03 100644 --- a/src/commands/doctor/shared/exec-safe-bins.ts +++ b/src/commands/doctor/shared/exec-safe-bins.ts @@ -17,7 +17,7 @@ import { import { getTrustedSafeBinDirs, isTrustedSafeBinPath } from "../../../infra/exec-safe-bin-trust.js"; import { asObjectRecord } from "./object.js"; -export type ExecSafeBinCoverageHit = { +type ExecSafeBinCoverageHit = { /** Config scope that owns the safeBins entry. */ scopePath: string; /** Normalized binary name from safeBins. */ @@ -38,7 +38,7 @@ type ExecSafeBinScopeRef = { trustedSafeBinDirs: ReadonlySet; }; -export type ExecSafeBinTrustedDirHintHit = { +type ExecSafeBinTrustedDirHintHit = { /** Config scope that owns the safeBins entry. */ scopePath: string; /** Binary name configured in safeBins. */ diff --git a/src/commands/doctor/shared/legacy-config-state-migration-input.ts b/src/commands/doctor/shared/legacy-config-state-migration-input.ts index 4c5b12f6801b..31de1dbd878a 100644 --- a/src/commands/doctor/shared/legacy-config-state-migration-input.ts +++ b/src/commands/doctor/shared/legacy-config-state-migration-input.ts @@ -2,7 +2,7 @@ import type { ConfigFileSnapshot } from "../../../config/types.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { migrateLegacyConfig } from "./legacy-config-migrate.js"; -export type StateMigrationConfigInput = { +type StateMigrationConfigInput = { cfg?: OpenClawConfig; pluginDoctorConfig?: OpenClawConfig; }; diff --git a/src/commands/doctor/shared/legacy-tools-by-sender.ts b/src/commands/doctor/shared/legacy-tools-by-sender.ts index 5ee128d17092..98d47c2447bc 100644 --- a/src/commands/doctor/shared/legacy-tools-by-sender.ts +++ b/src/commands/doctor/shared/legacy-tools-by-sender.ts @@ -5,7 +5,7 @@ import { parseToolsBySenderTypedKey } from "../../../config/types.tools.js"; import { formatConfigPath, resolveConfigPathTarget } from "../../doctor-config-analysis.js"; import { asObjectRecord } from "./object.js"; -export type LegacyToolsBySenderKeyHit = { +type LegacyToolsBySenderKeyHit = { /** Path parts pointing to the containing toolsBySender object. */ toolsBySenderPath: Array; /** Formatted config path for user-facing warnings. */ diff --git a/src/commands/doctor/shared/legacy-web-search-migrate.ts b/src/commands/doctor/shared/legacy-web-search-migrate.ts index 570d89374904..60f7fb759af9 100644 --- a/src/commands/doctor/shared/legacy-web-search-migrate.ts +++ b/src/commands/doctor/shared/legacy-web-search-migrate.ts @@ -50,7 +50,7 @@ const RETIRED_GROK_CODE_MODELS = new Set([ "grok-code-fast-1-0825", ]); -export function resolveLegacyGrokWebSearchModelTarget(model: unknown): string | undefined { +function resolveLegacyGrokWebSearchModelTarget(model: unknown): string | undefined { if (typeof model !== "string") { return undefined; } diff --git a/src/commands/doctor/shared/missing-configured-plugin-install.ts b/src/commands/doctor/shared/missing-configured-plugin-install.ts index 460cfd91137a..ad9ca70e4fac 100644 --- a/src/commands/doctor/shared/missing-configured-plugin-install.ts +++ b/src/commands/doctor/shared/missing-configured-plugin-install.ts @@ -995,7 +995,7 @@ function recordClawHubPackageName(value: string | undefined): string | undefined type InstallCandidateRepairReason = "stale-version-bound-runtime"; -export type ConfiguredPluginInstallHealthIssue = +type ConfiguredPluginInstallHealthIssue = | { kind: "missing-install-record"; pluginId: string; @@ -1775,7 +1775,7 @@ function assertNeverConfiguredPluginInstallIssue(issue: never): never { ); } -export type RepairMissingPluginInstallsResult = { +type RepairMissingPluginInstallsResult = { /** User-facing repair notes for installed or recovered plugin records. */ changes: string[]; /** User-facing warnings for failed or skipped plugin install repairs. */ diff --git a/src/commands/doctor/shared/plugin-dependency-cleanup.ts b/src/commands/doctor/shared/plugin-dependency-cleanup.ts index 48772c7d59a5..73bec0d655a8 100644 --- a/src/commands/doctor/shared/plugin-dependency-cleanup.ts +++ b/src/commands/doctor/shared/plugin-dependency-cleanup.ts @@ -19,7 +19,7 @@ interface CleanupTarget { readonly rawPath?: string; } -export interface LegacyPluginDependencyStateIssue { +interface LegacyPluginDependencyStateIssue { readonly kind: "legacy-plugin-dependency-state"; readonly path: string; } diff --git a/src/commands/doctor/shared/plugin-registry-migration.ts b/src/commands/doctor/shared/plugin-registry-migration.ts index f164df4b8a59..4ae5f7dae2dc 100644 --- a/src/commands/doctor/shared/plugin-registry-migration.ts +++ b/src/commands/doctor/shared/plugin-registry-migration.ts @@ -30,12 +30,9 @@ const DOCTOR_PLUGIN_ID_ALIASES: Readonly> = { openai: ["openai-codex"], }; -export type PluginRegistryInstallMigrationPreflightAction = - | "disabled" - | "skip-existing" - | "migrate"; +type PluginRegistryInstallMigrationPreflightAction = "disabled" | "skip-existing" | "migrate"; -export type PluginRegistryInstallMigrationPreflight = { +type PluginRegistryInstallMigrationPreflight = { /** Migration action selected before reading or writing registry state. */ action: PluginRegistryInstallMigrationPreflightAction; /** Persisted plugin index path that migration will inspect or write. */ @@ -46,7 +43,7 @@ export type PluginRegistryInstallMigrationPreflight = { deprecationWarnings: readonly string[]; }; -export type PluginRegistryInstallMigrationResult = +type PluginRegistryInstallMigrationResult = | { status: "disabled" | "skip-existing" | "dry-run"; migrated: false; diff --git a/src/commands/doctor/shared/plugin-runtime-symlinks.ts b/src/commands/doctor/shared/plugin-runtime-symlinks.ts index 53e210586f95..9aa350ebdafa 100644 --- a/src/commands/doctor/shared/plugin-runtime-symlinks.ts +++ b/src/commands/doctor/shared/plugin-runtime-symlinks.ts @@ -29,7 +29,7 @@ interface StatsLike { isSymbolicLink(): boolean; } -export interface StalePluginRuntimeSymlink { +interface StalePluginRuntimeSymlink { /** Package or scoped package name for the stale symlink. */ readonly name: string; /** Symlink path under the containing node_modules directory. */ @@ -38,7 +38,7 @@ export interface StalePluginRuntimeSymlink { readonly target: string; } -export interface PluginRuntimeSymlinkOptions { +interface PluginRuntimeSymlinkOptions { /** Filesystem adapter for tests and doctor cleanup callers. */ readonly fs?: FsLike; /** Roots already classified as stale by plugin dependency cleanup. */ diff --git a/src/commands/doctor/shared/preview-warnings.ts b/src/commands/doctor/shared/preview-warnings.ts index ec57acadcf32..8782c5286d6c 100644 --- a/src/commands/doctor/shared/preview-warnings.ts +++ b/src/commands/doctor/shared/preview-warnings.ts @@ -668,7 +668,7 @@ export function collectProfileConfiguredToolSectionWarnings(cfg: OpenClawConfig) return warnings; } -export type DoctorPreviewNotes = { +type DoctorPreviewNotes = { /** Non-warning doctor notes shown during preview. */ infoNotes: string[]; /** Warning notes shown during preview. */ diff --git a/src/commands/doctor/shared/stale-auth-order.ts b/src/commands/doctor/shared/stale-auth-order.ts index 1fe02ae2916f..ea9eab0b60fc 100644 --- a/src/commands/doctor/shared/stale-auth-order.ts +++ b/src/commands/doctor/shared/stale-auth-order.ts @@ -496,7 +496,7 @@ function removeAuthOrderKeys(cfg: OpenClawConfig, providers: ReadonlySet } /** Find nonempty config orders that only reference removed profiles. */ -export function scanStaleConfiguredAuthOrders(params: { +function scanStaleConfiguredAuthOrders(params: { cfg: OpenClawConfig; stores: readonly AuthProfileStore[]; activeStores?: readonly AuthProfileStore[]; diff --git a/src/commands/doctor/shared/stale-subagent-allowlist.ts b/src/commands/doctor/shared/stale-subagent-allowlist.ts index 6f27e913a694..8f76f4ca17ba 100644 --- a/src/commands/doctor/shared/stale-subagent-allowlist.ts +++ b/src/commands/doctor/shared/stale-subagent-allowlist.ts @@ -3,7 +3,7 @@ import { listAgentIds } from "../../../agents/agent-scope-config.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import { normalizeAgentId, normalizeOptionalAgentId } from "../../../routing/session-key.js"; -export type StaleSubagentAllowlistHit = { +type StaleSubagentAllowlistHit = { /** Config path containing the stale allowAgents entry. */ pathLabel: string; /** Original configured agent id. */ diff --git a/src/commands/doctor/types.ts b/src/commands/doctor/types.ts index 59cbb19730af..d01b79a7fe6e 100644 --- a/src/commands/doctor/types.ts +++ b/src/commands/doctor/types.ts @@ -1,4 +1,4 @@ /** Shared doctor JSON shapes used by repair modules that inspect loose config records. */ export type DoctorAccountRecord = Record; -export type DoctorAllowFromEntry = string | number; +type DoctorAllowFromEntry = string | number; export type DoctorAllowFromList = DoctorAllowFromEntry[]; diff --git a/src/commands/gateway-status/output.ts b/src/commands/gateway-status/output.ts index cac458025a29..c4b111be8b81 100644 --- a/src/commands/gateway-status/output.ts +++ b/src/commands/gateway-status/output.ts @@ -14,7 +14,7 @@ import { import type { GatewayStatusProbedTarget } from "./probe-run.js"; /** Warning emitted when gateway status finds degraded or surprising probe state. */ -export type GatewayStatusWarning = { +type GatewayStatusWarning = { code: string; message: string; details?: string[]; diff --git a/src/commands/health.types.ts b/src/commands/health.types.ts index 5e3eb36d3f2e..1151a9db04bf 100644 --- a/src/commands/health.types.ts +++ b/src/commands/health.types.ts @@ -69,7 +69,7 @@ type ModelPricingHealthSummary = import("../gateway/model-pricing-cache-state.js").GatewayModelPricingHealth; /** Config hot-reload watcher status, present only when a reloader is running. */ -export type ConfigReloadHealthSummary = { +type ConfigReloadHealthSummary = { hotReloadStatus: import("../gateway/config-reload-status.types.js").GatewayHotReloadStatus; }; diff --git a/src/commands/models/list.auth-index.ts b/src/commands/models/list.auth-index.ts index 51672d6a316f..c703dd8078a8 100644 --- a/src/commands/models/list.auth-index.ts +++ b/src/commands/models/list.auth-index.ts @@ -17,7 +17,7 @@ export type ModelListAuthIndex = { evaluateModelAuth(provider: string, ref?: ModelListAuthRef): ModelListAuthEvaluation; }; -export type CreateModelListAuthIndexParams = { +type CreateModelListAuthIndexParams = { cfg: OpenClawConfig; authStore: AuthProfileStore; agentDir?: string; diff --git a/src/commands/models/load-config.ts b/src/commands/models/load-config.ts index d1633d47308c..8a45116df024 100644 --- a/src/commands/models/load-config.ts +++ b/src/commands/models/load-config.ts @@ -10,7 +10,7 @@ import { } from "./load-config.runtime.js"; /** Source and resolved config pair returned by model command config loading. */ -export type LoadedModelsConfig = { +type LoadedModelsConfig = { sourceConfig: OpenClawConfig; resolvedConfig: OpenClawConfig; diagnostics: string[]; diff --git a/src/commands/models/shared.ts b/src/commands/models/shared.ts index aff7b24b109b..0540be1c8bc4 100644 --- a/src/commands/models/shared.ts +++ b/src/commands/models/shared.ts @@ -64,7 +64,7 @@ export async function loadValidConfigOrThrow(): Promise { } /** Runtime config snapshot supplied to model config mutators. */ -export type UpdateConfigContext = { +type UpdateConfigContext = { runtimeConfig: OpenClawConfig; }; @@ -179,7 +179,7 @@ export function resolveModelsTargetAgent( } /** Normalized primary/fallback config shape used by text and image defaults. */ -export type PrimaryFallbackConfig = { primary?: string; fallbacks?: string[] }; +type PrimaryFallbackConfig = { primary?: string; fallbacks?: string[] }; /** Upserts the canonical model entry and folds legacy key metadata into it. */ export function upsertCanonicalModelConfigEntry( diff --git a/src/commands/onboard-custom-config.test.ts b/src/commands/onboard-custom-config.test.ts index e30548d4e105..fe986cdc3dbf 100644 --- a/src/commands/onboard-custom-config.test.ts +++ b/src/commands/onboard-custom-config.test.ts @@ -6,7 +6,6 @@ import { applyCustomApiConfig, buildAnthropicVerificationProbeRequest, buildOpenAiVerificationProbeRequest, - inferCustomModelSupportsImageInput, parseNonInteractiveCustomApiFlags, resolveCustomModelImageInputInference, } from "./onboard-custom-config.js"; @@ -549,21 +548,7 @@ describe("parseNonInteractiveCustomApiFlags", () => { }); }); -describe("inferCustomModelSupportsImageInput", () => { - it.each(["gpt-4o", "claude-sonnet-4-6", "gemini-3-flash", "qwen2.5-vl", "llava"])( - "detects likely vision model %s", - (modelId) => { - expect(inferCustomModelSupportsImageInput(modelId)).toBe(true); - }, - ); - - it.each(["llama3", "deepseek-v3", "evolvable-text-model"])( - "does not over-match text model %s", - (modelId) => { - expect(inferCustomModelSupportsImageInput(modelId)).toBe(false); - }, - ); - +describe("resolveCustomModelImageInputInference", () => { it("reports confidence for known text and unknown custom models", () => { expect(resolveCustomModelImageInputInference("llama3")).toEqual({ supportsImageInput: false, diff --git a/src/commands/onboard-custom-config.ts b/src/commands/onboard-custom-config.ts index 0b2f0bee0e9f..d6a350c340c4 100644 --- a/src/commands/onboard-custom-config.ts +++ b/src/commands/onboard-custom-config.ts @@ -83,11 +83,6 @@ export function resolveCustomModelImageInputInference( return { supportsImageInput: false, confidence: "unknown" }; } -/** Returns whether a custom model id is known to support image input. */ -export function inferCustomModelSupportsImageInput(modelId: string): boolean { - return resolveCustomModelImageInputInference(modelId).supportsImageInput; -} - function resolveCustomModelSupportsImageInput(params: { modelId: string; explicit?: boolean; diff --git a/src/commands/onboard-custom.ts b/src/commands/onboard-custom.ts index 464a056ea990..037b7b0ff4a8 100644 --- a/src/commands/onboard-custom.ts +++ b/src/commands/onboard-custom.ts @@ -26,16 +26,6 @@ import { type CustomApiCompatibility, type CustomApiResult, } from "./onboard-custom-config.js"; -export { - applyCustomApiConfig, - buildAnthropicVerificationProbeRequest, - buildOpenAiVerificationProbeRequest, - CustomApiError, - inferCustomModelSupportsImageInput, - parseNonInteractiveCustomApiFlags, - resolveCustomModelImageInputInference, - resolveCustomProviderId, -} from "./onboard-custom-config.js"; import type { SecretInputMode } from "./onboard-types.js"; const VERIFY_TIMEOUT_MS = 30_000; diff --git a/src/commands/onboard-inference.ts b/src/commands/onboard-inference.ts index d7168fe15bdf..f719f1a4df86 100644 --- a/src/commands/onboard-inference.ts +++ b/src/commands/onboard-inference.ts @@ -33,7 +33,7 @@ export type InferenceBackendKind = | "codex-cli" | "gemini-cli"; -export type InferenceBackendCandidate = { +type InferenceBackendCandidate = { kind: InferenceBackendKind; modelRef: string; /** Short human label, e.g. "Claude Code CLI". */ @@ -47,7 +47,7 @@ export type InferenceBackendCandidate = { credentials?: boolean; }; -export type DetectInferenceBackendsDeps = { +type DetectInferenceBackendsDeps = { probeLocalCommand?: typeof probeLocalCommand; readClaudeCliCredentials?: () => { type: string } | null; readCodexCliCredentials?: () => { type: string } | null; @@ -55,14 +55,14 @@ export type DetectInferenceBackendsDeps = { randomInt?: (maxExclusive: number) => number; }; -export type DetectInferenceBackendsOptions = { +type DetectInferenceBackendsOptions = { config?: OpenClawConfig; env?: NodeJS.ProcessEnv; platform?: NodeJS.Platform; deps?: DetectInferenceBackendsDeps; }; -export type DetectNativeCodexAppServerOptions = { +type DetectNativeCodexAppServerOptions = { env?: NodeJS.ProcessEnv; platform?: NodeJS.Platform; probeLocalCommand?: typeof probeLocalCommand; diff --git a/src/commands/onboard-non-interactive/api-keys.ts b/src/commands/onboard-non-interactive/api-keys.ts index 6917922ead98..12d1e6336d5b 100644 --- a/src/commands/onboard-non-interactive/api-keys.ts +++ b/src/commands/onboard-non-interactive/api-keys.ts @@ -18,7 +18,7 @@ import { normalizeOptionalSecretInput } from "../../utils/normalize-secret-input import type { SecretInputMode } from "../onboard-types.js"; /** Source that supplied a non-interactive provider API key. */ -export type NonInteractiveApiKeySource = "flag" | "env" | "profile"; +type NonInteractiveApiKeySource = "flag" | "env" | "profile"; function parseEnvVarNameFromSourceLabel(source: string | undefined): string | undefined { if (!source) { diff --git a/src/commands/onboard.test.ts b/src/commands/onboard.test.ts index c2c541163be7..865cdc0d6a59 100644 --- a/src/commands/onboard.test.ts +++ b/src/commands/onboard.test.ts @@ -3,7 +3,7 @@ import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; import { formatCliCommand } from "../cli/command-format.js"; import type { RuntimeEnv } from "../runtime.js"; -import { onboardCommand, setupWizardCommand } from "./onboard.js"; +import { setupWizardCommand } from "./onboard.js"; const mocks = vi.hoisted(() => ({ runInteractiveSetup: vi.fn(async () => {}), @@ -178,10 +178,6 @@ describe("setupWizardCommand", () => { expect(mocks.runNonInteractiveSetup).not.toHaveBeenCalled(); }); - it("keeps onboardCommand as an alias for setupWizardCommand", () => { - expect(onboardCommand).toBe(setupWizardCommand); - }); - it("routes flagless interactive onboarding to the guided flow", async () => { const runtime = makeRuntime(); diff --git a/src/commands/onboard.ts b/src/commands/onboard.ts index 9ca637789ae1..4b5f0271ab74 100644 --- a/src/commands/onboard.ts +++ b/src/commands/onboard.ts @@ -167,5 +167,3 @@ export async function setupWizardCommand( await runGuidedOnboarding(normalizedOpts, runtime); } - -export const onboardCommand = setupWizardCommand; diff --git a/src/commands/promos/claim.ts b/src/commands/promos/claim.ts index 357ac2c2447a..1dbccb1512d8 100644 --- a/src/commands/promos/claim.ts +++ b/src/commands/promos/claim.ts @@ -35,7 +35,7 @@ import { upsertCanonicalModelConfigEntry, } from "../models/shared.js"; -export type PromosClaimOptions = { +type PromosClaimOptions = { apiKey?: string; setDefault?: boolean; }; diff --git a/src/commands/reset.ts b/src/commands/reset.ts index e43b75f85cb2..e326524ffc30 100644 --- a/src/commands/reset.ts +++ b/src/commands/reset.ts @@ -23,10 +23,10 @@ import { removeWorkspaceDirs, } from "./cleanup-utils.js"; -export type ResetScope = "config" | "config+creds+sessions" | "full"; +type ResetScope = "config" | "config+creds+sessions" | "full"; /** CLI options accepted by `openclaw reset`. */ -export type ResetOptions = { +type ResetOptions = { scope?: ResetScope; yes?: boolean; nonInteractive?: boolean; diff --git a/src/commands/runtime-plugin-install.ts b/src/commands/runtime-plugin-install.ts index 62b16ff4b16f..ad812955d330 100644 --- a/src/commands/runtime-plugin-install.ts +++ b/src/commands/runtime-plugin-install.ts @@ -15,7 +15,7 @@ import { resolveUserPath } from "../utils.js"; import type { WizardPrompter } from "../wizard/prompts.js"; /** Static install metadata for a runtime plugin required by model selection. */ -export type RuntimePluginInstallDescriptor = { +type RuntimePluginInstallDescriptor = { pluginId: string; label: string; npmSpec: string; @@ -32,14 +32,14 @@ export type RuntimePluginInstallResult = { }; /** Predicate that decides whether a config/model pair needs the runtime plugin. */ -export type RuntimePluginSelection = (params: { +type RuntimePluginSelection = (params: { cfg: OpenClawConfig; model?: string; agentId?: string; }) => boolean; /** Parameters for installing or enabling a runtime plugin during setup. */ -export type RuntimePluginEnsureParams = { +type RuntimePluginEnsureParams = { cfg: OpenClawConfig; model?: string; agentId?: string; @@ -49,7 +49,7 @@ export type RuntimePluginEnsureParams = { }; /** Parameters for doctor-style runtime plugin repair. */ -export type RuntimePluginRepairParams = { +type RuntimePluginRepairParams = { cfg: OpenClawConfig; model?: string; agentId?: string; @@ -57,7 +57,7 @@ export type RuntimePluginRepairParams = { }; /** Convenience helpers bound to one runtime plugin descriptor. */ -export type RuntimePluginModelSelectionHelpers = { +type RuntimePluginModelSelectionHelpers = { ensure: (params: RuntimePluginEnsureParams) => Promise; repair: ( params: RuntimePluginRepairParams, diff --git a/src/commands/sessions-compact.ts b/src/commands/sessions-compact.ts index ce2ab618dd5e..168bd1421c42 100644 --- a/src/commands/sessions-compact.ts +++ b/src/commands/sessions-compact.ts @@ -11,7 +11,7 @@ import { callGatewayCli, type GatewayRpcOpts } from "../cli/gateway-cli/call.js" import { formatErrorMessage } from "../infra/errors.js"; import { type RuntimeEnv, writeRuntimeJson } from "../runtime.js"; -export type SessionsCompactCliOptions = { +type SessionsCompactCliOptions = { key: string; agent?: string; maxLines?: number; diff --git a/src/commands/sessions.ts b/src/commands/sessions.ts index fede21898881..15f491328bec 100644 --- a/src/commands/sessions.ts +++ b/src/commands/sessions.ts @@ -550,4 +550,3 @@ export async function sessionsCommand( export const testing = { parseSessionsLimit, } as const; -export { testing as __testing }; diff --git a/src/commands/status-all/channels.ts b/src/commands/status-all/channels.ts index 2a2474a68fe4..0afe98bee5c2 100644 --- a/src/commands/status-all/channels.ts +++ b/src/commands/status-all/channels.ts @@ -33,7 +33,7 @@ import { } from "./channels-token-summary.js"; import { formatTimeAgo } from "./format.js"; -export type ChannelRow = { +type ChannelRow = { id: ChannelId; label: string; enabled: boolean; diff --git a/src/commands/status-runtime-shared.test.ts b/src/commands/status-runtime-shared.test.ts index 98d3a8b048a0..7110a40c1d8f 100644 --- a/src/commands/status-runtime-shared.test.ts +++ b/src/commands/status-runtime-shared.test.ts @@ -3,8 +3,6 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { resolveStatusGatewayHealth, resolveStatusGatewayHealthSafe, - resolveStatusLastHeartbeat, - resolveStatusRuntimeDetails, resolveStatusRuntimeSnapshot, resolveStatusSecurityAudit, resolveStatusServiceSummaries, @@ -374,35 +372,6 @@ describe("status-runtime-shared", () => { }); }); - it("returns null for heartbeat when the gateway is unreachable", async () => { - expect( - await resolveStatusLastHeartbeat({ - config: { gateway: {} }, - timeoutMs: 1000, - gatewayReachable: false, - }), - ).toBeNull(); - expect(mocks.callGateway).not.toHaveBeenCalled(); - }); - - it("catches heartbeat gateway errors and returns null", async () => { - mocks.callGateway.mockRejectedValueOnce(new Error("boom")); - - expect( - await resolveStatusLastHeartbeat({ - config: { gateway: {} }, - timeoutMs: 1000, - gatewayReachable: true, - }), - ).toBeNull(); - expect(mocks.callGateway).toHaveBeenCalledWith({ - method: "last-heartbeat", - params: {}, - timeoutMs: 1000, - config: { gateway: {} }, - }); - }); - it("resolves daemon summaries together", async () => { await expect(resolveStatusServiceSummaries()).resolves.toEqual([ { label: "LaunchAgent" }, @@ -410,80 +379,6 @@ describe("status-runtime-shared", () => { ]); }); - it("resolves shared runtime details with optional usage and deep fields", async () => { - await expect( - resolveStatusRuntimeDetails({ - config: { gateway: {} }, - timeoutMs: 1234, - usage: true, - deep: true, - gatewayReachable: true, - }), - ).resolves.toEqual({ - usage: { providers: [] }, - health: { ok: true }, - lastHeartbeat: { ok: true }, - gatewayService: { label: "LaunchAgent" }, - nodeService: { label: "node" }, - }); - const usageCall = requireProviderUsageCall(); - expect(usageCall.timeoutMs).toBe(1234); - expect(usageCall.config).toEqual({ gateway: {} }); - expect(usageCall.agentDir).toContain("main"); - expect(mocks.callGateway).toHaveBeenNthCalledWith(1, { - method: "health", - params: { probe: true }, - timeoutMs: 1234, - config: { gateway: {} }, - }); - expect(mocks.callGateway).toHaveBeenNthCalledWith(2, { - method: "last-heartbeat", - params: {}, - timeoutMs: 1234, - config: { gateway: {} }, - }); - }); - - it("skips optional runtime details when flags are off", async () => { - await expect( - resolveStatusRuntimeDetails({ - config: { gateway: {} }, - timeoutMs: 1234, - usage: false, - deep: false, - gatewayReachable: true, - }), - ).resolves.toEqual({ - usage: undefined, - health: undefined, - lastHeartbeat: null, - gatewayService: { label: "LaunchAgent" }, - nodeService: { label: "node" }, - }); - expect(mocks.loadProviderUsageSummary).not.toHaveBeenCalled(); - expect(mocks.callGateway).not.toHaveBeenCalled(); - }); - - it("suppresses health failures inside shared runtime details", async () => { - mocks.callGateway.mockRejectedValueOnce(new Error("boom")); - - await expect( - resolveStatusRuntimeDetails({ - config: { gateway: {} }, - timeoutMs: 1234, - deep: true, - gatewayReachable: false, - suppressHealthErrors: true, - }), - ).resolves.toEqual({ - usage: undefined, - health: undefined, - lastHeartbeat: null, - gatewayService: { label: "LaunchAgent" }, - nodeService: { label: "node" }, - }); - }); - it("resolves the shared runtime snapshot with security audit and runtime details", async () => { await expect( resolveStatusRuntimeSnapshot({ diff --git a/src/commands/status-runtime-shared.ts b/src/commands/status-runtime-shared.ts index 85baea16bee5..9f003eb47dd4 100644 --- a/src/commands/status-runtime-shared.ts +++ b/src/commands/status-runtime-shared.ts @@ -203,7 +203,7 @@ export async function resolveStatusGatewayDiagnosticsSafe(params: { } /** Reads the most recent gateway heartbeat only when the gateway probe succeeded. */ -export async function resolveStatusLastHeartbeat(params: { +async function resolveStatusLastHeartbeat(params: { config: OpenClawConfig; timeoutMs?: number; gatewayReachable: boolean; @@ -241,7 +241,7 @@ type StatusNodeServiceSummary = Awaited>; /** Resolves optional usage/deep runtime details plus service summaries for status output. */ -export async function resolveStatusRuntimeDetails(params: { +async function resolveStatusRuntimeDetails(params: { config: OpenClawConfig; timeoutMs?: number; usage?: boolean; diff --git a/src/commands/status.service-summary.test.ts b/src/commands/status.service-summary.test.ts index 1e8a07b58285..0bd11f4d5732 100644 --- a/src/commands/status.service-summary.test.ts +++ b/src/commands/status.service-summary.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs/promises"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; +import type { GatewayServiceEnvArgs } from "../daemon/service-types.js"; import { resolveGatewayService, type GatewayService } from "../daemon/service.js"; -import type { GatewayServiceEnvArgs } from "../daemon/service.js"; import { createMockGatewayService } from "../daemon/service.test-helpers.js"; import { withTempDir } from "../test-helpers/temp-dir.js"; import { withMockedPlatform } from "../test-utils/vitest-spies.js"; diff --git a/src/commands/uninstall.ts b/src/commands/uninstall.ts index 5fd73ddd2eec..4ec82776841c 100644 --- a/src/commands/uninstall.ts +++ b/src/commands/uninstall.ts @@ -24,7 +24,7 @@ import { type UninstallScope = "service" | "state" | "workspace" | "app"; -export type UninstallOptions = { +type UninstallOptions = { service?: boolean; state?: boolean; workspace?: boolean; diff --git a/src/commitments/types.ts b/src/commitments/types.ts index b750d7a204e2..8607677ce51b 100644 --- a/src/commitments/types.ts +++ b/src/commitments/types.ts @@ -17,7 +17,7 @@ export type CommitmentScope = { senderId?: string; }; -export type CommitmentDueWindow = { +type CommitmentDueWindow = { earliestMs: number; latestMs: number; timezone: string; diff --git a/src/context-engine/host-compat.ts b/src/context-engine/host-compat.ts index ecb6349e4f74..eee01397d07d 100644 --- a/src/context-engine/host-compat.ts +++ b/src/context-engine/host-compat.ts @@ -46,7 +46,7 @@ export const CODEX_APP_SERVER_CONTEXT_ENGINE_HOST = { ], } as const satisfies ContextEngineHostSupport; -export type ContextEngineHostSupportEvaluation = +type ContextEngineHostSupportEvaluation = | { ok: true; requirements?: ContextEngineHostRequirements; diff --git a/src/context-engine/quarantine-health.ts b/src/context-engine/quarantine-health.ts index f1a0ae322476..5acd357f85d0 100644 --- a/src/context-engine/quarantine-health.ts +++ b/src/context-engine/quarantine-health.ts @@ -6,7 +6,7 @@ import { type RuntimeHealthRecordEnvelope, } from "../plugin-state/runtime-health-store.js"; -export type PersistedContextEngineRuntimeQuarantine = { +type PersistedContextEngineRuntimeQuarantine = { engineId: string; owner?: string; operation: string; diff --git a/src/context-engine/registry.ts b/src/context-engine/registry.ts index 09d0e78a65b5..698a1e32d1c0 100644 --- a/src/context-engine/registry.ts +++ b/src/context-engine/registry.ts @@ -46,8 +46,8 @@ export type ContextEngineFactory = ( ctx: ContextEngineFactoryContext, ) => ContextEngine | Promise; export type ContextEngineRegistrationResult = { ok: true } | { ok: false; existingOwner: string }; -export type ContextEngineRegistrationLifecycle = "runtime" | "readOnlyDiscovery"; -export type ContextEngineRegistration = { +type ContextEngineRegistrationLifecycle = "runtime" | "readOnlyDiscovery"; +type ContextEngineRegistration = { factory: ContextEngineFactory; owner: string; lifecycle: ContextEngineRegistrationLifecycle; @@ -413,7 +413,7 @@ const CONTEXT_ENGINE_REGISTRY_STATE = Symbol.for("openclaw.contextEngineRegistry const CORE_CONTEXT_ENGINE_OWNER = "core"; const PUBLIC_CONTEXT_ENGINE_OWNER = "public-sdk"; -export type ContextEngineRuntimeQuarantine = { +type ContextEngineRuntimeQuarantine = { engineId: string; owner?: string; operation: string; diff --git a/src/context-engine/types.ts b/src/context-engine/types.ts index 86df58c56673..f7faf10f5239 100644 --- a/src/context-engine/types.ts +++ b/src/context-engine/types.ts @@ -290,7 +290,7 @@ export type ContextEnginePromptCacheInfo = { expiresAt?: number; }; -export type ContextEngineTranscriptStorageInfo = { +type ContextEngineTranscriptStorageInfo = { /** * Authoritative transcript backend for this runtime turn. * diff --git a/src/crestodian/agent-turn.ts b/src/crestodian/agent-turn.ts index c7eaa02566f0..59b2e4d4a89c 100644 --- a/src/crestodian/agent-turn.ts +++ b/src/crestodian/agent-turn.ts @@ -27,7 +27,7 @@ import { * Turns share one persistent session so the conversation has genuine * multi-turn memory. Inference setup must succeed before this runner is entered. */ -export const CRESTODIAN_AGENT_ID = "crestodian"; +const CRESTODIAN_AGENT_ID = "crestodian"; const AGENT_TURN_TIMEOUT_MS = 120_000; const CRESTODIAN_MCP_TOOL_NAME = "mcp__openclaw__crestodian"; @@ -35,7 +35,7 @@ const CRESTODIAN_MCP_TOOL_NAME = "mcp__openclaw__crestodian"; export type CrestodianAgentTurnDirective = import("../agents/tools/crestodian-tool.js").CrestodianToolDirective; -export type CrestodianAgentTurnReply = { +type CrestodianAgentTurnReply = { text: string; modelLabel?: string; /** Interactive handoff the tool requested; the host chat executes it. */ diff --git a/src/crestodian/assistant-prompts.ts b/src/crestodian/assistant-prompts.ts index 3d9f1adb7dc1..c90d8fbaba9f 100644 --- a/src/crestodian/assistant-prompts.ts +++ b/src/crestodian/assistant-prompts.ts @@ -11,8 +11,6 @@ import type { CrestodianOverview } from "./overview.js"; */ /** Timeout for one assistant turn (local CLI backends cold-start slowly). */ export const CRESTODIAN_ASSISTANT_TIMEOUT_MS = 30_000; -/** Maximum assistant response budget. */ -export const CRESTODIAN_ASSISTANT_MAX_TOKENS = 700; /** System prompt: persona plus the closed command vocabulary. */ export const CRESTODIAN_ASSISTANT_SYSTEM_PROMPT = [ diff --git a/src/crestodian/chat-engine.ts b/src/crestodian/chat-engine.ts index ffe65af21a11..c1c1545a69e8 100644 --- a/src/crestodian/chat-engine.ts +++ b/src/crestodian/chat-engine.ts @@ -67,9 +67,9 @@ export type CrestodianChatEngineOptions = { readonly verifiedInference: CrestodianVerifiedInferenceBinding; }; -export type CrestodianChatReplyAction = "none" | "exit" | "open-tui" | "open-setup"; +type CrestodianChatReplyAction = "none" | "exit" | "open-tui" | "open-setup"; -export type CrestodianChatReply = { +type CrestodianChatReply = { text: string; action: CrestodianChatReplyAction; /** The next hosted-wizard reply contains a secret and must be masked/redacted by hosts. */ diff --git a/src/crestodian/inference-error.ts b/src/crestodian/inference-error.ts index 3422c3a51a84..d07f3230d374 100644 --- a/src/crestodian/inference-error.ts +++ b/src/crestodian/inference-error.ts @@ -1,4 +1,4 @@ -export type CrestodianInferenceStage = "agent-turn" | "planner" | "conversation"; +type CrestodianInferenceStage = "agent-turn" | "planner" | "conversation"; /** Safe public error for a Crestodian turn that could not complete with intelligence. */ export class CrestodianInferenceUnavailableError extends Error { diff --git a/src/crestodian/inference-route.ts b/src/crestodian/inference-route.ts index 3c2e22683be7..1249cbc6d2ea 100644 --- a/src/crestodian/inference-route.ts +++ b/src/crestodian/inference-route.ts @@ -89,20 +89,6 @@ function projectCrestodianExecutionConfig( }; } -/** Return the authored default-agent route; never synthesize the product fallback model. */ -export async function resolveCrestodianConfiguredRoute( - deps: CrestodianConfiguredRouteDeps = {}, -): Promise { - const readSnapshot = - deps.readConfigFileSnapshot ?? (await import("../config/config.js")).readConfigFileSnapshot; - const snapshot = await readSnapshot(); - if (!snapshot.exists || !snapshot.valid) { - return null; - } - const runConfig = snapshot.runtimeConfig ?? snapshot.config ?? {}; - return await resolveCrestodianConfiguredRouteFromConfig(runConfig); -} - export async function resolveCrestodianConfiguredRouteFromConfig( runConfig: OpenClawConfig, ): Promise { diff --git a/src/crestodian/rescue-message.ts b/src/crestodian/rescue-message.ts index ce04825019c0..fc24f9876884 100644 --- a/src/crestodian/rescue-message.ts +++ b/src/crestodian/rescue-message.ts @@ -38,7 +38,7 @@ type RescuePendingOperation = { }; /** Input required to process one possible `/crestodian` rescue message. */ -export type CrestodianRescueMessageInput = { +type CrestodianRescueMessageInput = { cfg: OpenClawConfig; command: CommandContext; commandBody: string; diff --git a/src/crestodian/verified-inference.ts b/src/crestodian/verified-inference.ts index fa0d1325ef71..72698608b7de 100644 --- a/src/crestodian/verified-inference.ts +++ b/src/crestodian/verified-inference.ts @@ -46,7 +46,7 @@ import { type DistributiveOmit = T extends unknown ? Omit : never; -export type CrestodianConfiguredRouteIdentity = DistributiveOmit< +type CrestodianConfiguredRouteIdentity = DistributiveOmit< CrestodianConfiguredRoute, "runConfig" | "authProfileId" >; @@ -204,7 +204,7 @@ async function resolveAgentHarnessAuthBindingFingerprint(params: { return getRegisteredAgentHarness(params.harnessId)?.harness.authBinding?.fingerprint(input); } -export function crestodianRouteIdentity( +function crestodianRouteIdentity( route: CrestodianConfiguredRoute, ): CrestodianConfiguredRouteIdentity { const { runConfig: _runConfig, authProfileId: _authProfileId, ...identity } = route; diff --git a/src/cron/delivery-plan.ts b/src/cron/delivery-plan.ts index a0bcc8846316..02f2ef0ee556 100644 --- a/src/cron/delivery-plan.ts +++ b/src/cron/delivery-plan.ts @@ -124,7 +124,7 @@ export function resolveCronDeliveryPlan(job: CronJob): CronDeliveryPlan { } /** Normalized destination for notifying about cron execution failures. */ -export type CronFailureDeliveryPlan = { +type CronFailureDeliveryPlan = { mode: "announce" | "webhook"; channel?: CronMessageChannel; to?: string; @@ -132,7 +132,7 @@ export type CronFailureDeliveryPlan = { }; /** Job-level failure destination override fields before global defaults are merged. */ -export type CronFailureDestinationInput = { +type CronFailureDestinationInput = { channel?: CronMessageChannel; to?: string; accountId?: string; diff --git a/src/cron/delivery.ts b/src/cron/delivery.ts index ca6ab23d10da..b03e9fca3914 100644 --- a/src/cron/delivery.ts +++ b/src/cron/delivery.ts @@ -7,13 +7,7 @@ import { formatErrorMessage } from "../infra/errors.js"; import { resolveAgentOutboundIdentity } from "../infra/outbound/identity.js"; import { buildOutboundSessionContext } from "../infra/outbound/session-context.js"; import { getChildLogger } from "../logging.js"; -import { - resolveFailureDestination, - type CronFailureDeliveryPlan, - type CronFailureDestinationInput, - type CronDeliveryPlan, - resolveCronDeliveryPlan, -} from "./delivery-plan.js"; +import { resolveFailureDestination, resolveCronDeliveryPlan } from "./delivery-plan.js"; import { resolveDeliveryTarget, type DeliveryTargetResolution, @@ -21,19 +15,13 @@ import { import { resolveCronNotificationSessionKey } from "./session-target.js"; import type { CronMessageChannel } from "./types.js"; -export { - resolveCronDeliveryPlan, - resolveFailureDestination, - type CronDeliveryPlan, - type CronFailureDeliveryPlan, - type CronFailureDestinationInput, -}; +export { resolveCronDeliveryPlan, resolveFailureDestination }; const FAILURE_NOTIFICATION_TIMEOUT_MS = 30_000; const cronDeliveryLogger = getChildLogger({ subsystem: "cron-delivery" }); /** Channel target metadata used for cron announcements and failure notifications. */ -export type CronAnnounceTarget = { +type CronAnnounceTarget = { channel?: string; to?: string; accountId?: string; diff --git a/src/cron/isolated-agent.ts b/src/cron/isolated-agent.ts index 0e7a1e95b3a8..5fb048adf42d 100644 --- a/src/cron/isolated-agent.ts +++ b/src/cron/isolated-agent.ts @@ -1,2 +1,3 @@ // Public facade for isolated cron agent turn execution. -export { type RunCronAgentTurnResult, runCronIsolatedAgentTurn } from "./isolated-agent/run.js"; +export { runCronIsolatedAgentTurn } from "./isolated-agent/run.js"; +export type { RunCronAgentTurnResult } from "./isolated-agent/run.types.js"; diff --git a/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts b/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts index 86ba15ec07ce..2229c34be0bb 100644 --- a/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts +++ b/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts @@ -163,7 +163,7 @@ import { resetCompletedDirectCronDeliveriesForTests, } from "./delivery-dispatch.js"; import type { DeliveryTargetResolution } from "./delivery-target.js"; -import type { RunCronAgentTurnResult } from "./run.js"; +import type { RunCronAgentTurnResult } from "./run.types.js"; import { expectsSubagentFollowup, isLikelyInterimCronMessage } from "./subagent-followup-hints.js"; import { readDescendantSubagentFallbackReply, diff --git a/src/cron/isolated-agent/delivery-dispatch.ts b/src/cron/isolated-agent/delivery-dispatch.ts index c8b1e5ec0687..4fa8c002997c 100644 --- a/src/cron/isolated-agent/delivery-dispatch.ts +++ b/src/cron/isolated-agent/delivery-dispatch.ts @@ -106,7 +106,7 @@ export function resolveCronDeliveryBestEffort(job: CronJob): boolean { } /** Successful delivery-target resolution consumed by announce/direct delivery dispatch. */ -export type SuccessfulDeliveryTarget = Extract; +type SuccessfulDeliveryTarget = Extract; type DispatchCronDeliveryParams = { cfg: OpenClawConfig; @@ -156,7 +156,7 @@ type DirectCronTranscriptMirror = { }; /** Mutable delivery-dispatch accumulator returned to the isolated cron runner. */ -export type DispatchCronDeliveryState = { +type DispatchCronDeliveryState = { result?: RunCronAgentTurnResult; delivered: boolean; deliveryAttempted: boolean; diff --git a/src/cron/isolated-agent/helpers.ts b/src/cron/isolated-agent/helpers.ts index 46ce40edb635..f18601750c6e 100644 --- a/src/cron/isolated-agent/helpers.ts +++ b/src/cron/isolated-agent/helpers.ts @@ -13,7 +13,7 @@ type DeliveryPayload = Pick< >; /** Normalized cron run payload state used for summaries, delivery, and failure classification. */ -export type CronPayloadOutcome = { +type CronPayloadOutcome = { summary?: string; outputText?: string; synthesizedText?: string; diff --git a/src/cron/isolated-agent/model-selection.ts b/src/cron/isolated-agent/model-selection.ts index 39423a4133ea..7a2987755c25 100644 --- a/src/cron/isolated-agent/model-selection.ts +++ b/src/cron/isolated-agent/model-selection.ts @@ -22,7 +22,7 @@ type CronSessionModelOverrides = { type CronModelSelectionSource = "default" | "subagent" | "agent" | "hook" | "payload" | "session"; /** Inputs used to resolve the model for one isolated cron run. */ -export type ResolveCronModelSelectionParams = { +type ResolveCronModelSelectionParams = { cfg: OpenClawConfig; cfgWithAgentDefaults: OpenClawConfig; agentConfigOverride?: Pick; @@ -33,7 +33,7 @@ export type ResolveCronModelSelectionParams = { }; /** Resolved provider/model pair plus the precedence source that selected it. */ -export type ResolveCronModelSelectionResult = +type ResolveCronModelSelectionResult = | { ok: true; provider: string; diff --git a/src/cron/isolated-agent/run-execution.runtime.ts b/src/cron/isolated-agent/run-execution.runtime.ts index ac34256c4d14..d7a969c41b2e 100644 --- a/src/cron/isolated-agent/run-execution.runtime.ts +++ b/src/cron/isolated-agent/run-execution.runtime.ts @@ -27,14 +27,6 @@ async function loadCronExecutionCliRuntime() { return await cronExecutionCliRuntimeLoader.load(); } -/** Lazily resolves CLI session ids without loading the cron CLI runner at module import time. */ -export async function getCliSessionId( - ...args: Parameters -): Promise> { - const runtime = await loadCronExecutionCliRuntime(); - return runtime.getCliSessionId(...args); -} - /** Lazily resolves complete CLI bindings so cron continuations preserve reuse metadata. */ export async function getCliSessionBinding( ...args: Parameters diff --git a/src/cron/isolated-agent/run-session-state.ts b/src/cron/isolated-agent/run-session-state.ts index cf07bcf2c7f4..75543845cff2 100644 --- a/src/cron/isolated-agent/run-session-state.ts +++ b/src/cron/isolated-agent/run-session-state.ts @@ -13,7 +13,7 @@ import type { resolveCronSession } from "./session.js"; type MutableSessionStore = Record; /** Mutable cron session entry updated by an isolated run before persistence. */ -export type MutableCronSessionEntry = SessionEntry; +type MutableCronSessionEntry = SessionEntry; /** Resolved cron session plus its mutable backing store and active entry. */ export type MutableCronSession = ReturnType & { store: MutableSessionStore; diff --git a/src/cron/isolated-agent/run.runtime.ts b/src/cron/isolated-agent/run.runtime.ts index e6d0a6729d8f..9aa389f8f815 100644 --- a/src/cron/isolated-agent/run.runtime.ts +++ b/src/cron/isolated-agent/run.runtime.ts @@ -4,7 +4,6 @@ export { resolveAgentDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, - type ResolvedAgentConfig, } from "../../agents/agent-scope-config.js"; export { resolveCronStyleNow } from "../../agents/current-time.js"; export { DEFAULT_CONTEXT_TOKENS } from "../../agents/defaults.js"; @@ -14,7 +13,7 @@ export { resolveSessionRuntimeOverrideForProvider } from "../../agents/session-r export { resolveEffectiveAgentRuntime } from "../../agents/thinking-runtime.js"; export { resolveAgentTimeoutMs } from "../../agents/timeout.js"; export { deriveSessionTotalTokens, hasNonzeroUsage } from "../../agents/usage.js"; -export { DEFAULT_IDENTITY_FILENAME, ensureAgentWorkspace } from "../../agents/workspace.js"; +export { ensureAgentWorkspace } from "../../agents/workspace.js"; export { isThinkingLevelSupported, normalizeThinkLevel, diff --git a/src/cron/isolated-agent/source-delivery-fallback.ts b/src/cron/isolated-agent/source-delivery-fallback.ts index c749d4b6d8c9..6de288699a53 100644 --- a/src/cron/isolated-agent/source-delivery-fallback.ts +++ b/src/cron/isolated-agent/source-delivery-fallback.ts @@ -4,7 +4,7 @@ import { resolveCronDeliveryPlan } from "../delivery-plan.js"; import type { CronDeliveryPlan } from "../delivery-plan.js"; import type { CronJob } from "../types.js"; -export type CronSourceDeliveryResolvedTarget = { +type CronSourceDeliveryResolvedTarget = { channel?: string; accountId?: string; to?: string; diff --git a/src/cron/persisted-shape.ts b/src/cron/persisted-shape.ts index 65704e0e3e7a..3163ebf79071 100644 --- a/src/cron/persisted-shape.ts +++ b/src/cron/persisted-shape.ts @@ -2,7 +2,7 @@ import { parseAbsoluteTimeMs } from "./parse.js"; /** Structural rejection code for persisted cron jobs that cannot be loaded safely. */ -export type InvalidPersistedCronJobReason = +type InvalidPersistedCronJobReason = | "missing-id" | "missing-schedule" | "invalid-schedule" diff --git a/src/cron/retry-hint.ts b/src/cron/retry-hint.ts index 0e66da13fcdb..ca723092e6ab 100644 --- a/src/cron/retry-hint.ts +++ b/src/cron/retry-hint.ts @@ -2,7 +2,7 @@ import type { CronRetryOn } from "../config/types.cron.js"; /** Cron retry classifier output consumed by scheduler retry policy. */ -export type CronRetryHint = { +type CronRetryHint = { retryable: boolean; category?: CronRetryOn; }; diff --git a/src/cron/service.delivery-plan.test.ts b/src/cron/service.delivery-plan.test.ts index d2bafc3e2078..b13f6090ba6e 100644 --- a/src/cron/service.delivery-plan.test.ts +++ b/src/cron/service.delivery-plan.test.ts @@ -1,12 +1,13 @@ // Cron service delivery plan tests cover target selection for scheduled job output. import { describe, expect, it, vi } from "vitest"; import type { ChannelId } from "../channels/plugins/types.js"; -import { CronService, type CronServiceDeps } from "./service.js"; +import { CronService } from "./service.js"; import { createCronStoreHarness, createNoopLogger, withCronServiceForTest, } from "./service.test-harness.js"; +import type { CronServiceDeps } from "./service/state.js"; const noopLogger = createNoopLogger(); const { makeStorePath } = createCronStoreHarness({ prefix: "openclaw-cron-delivery-" }); diff --git a/src/cron/service.runs-one-shot-main-job-disables-it.test.ts b/src/cron/service.runs-one-shot-main-job-disables-it.test.ts index 2bca027be0c9..8355292e8ddb 100644 --- a/src/cron/service.runs-one-shot-main-job-disables-it.test.ts +++ b/src/cron/service.runs-one-shot-main-job-disables-it.test.ts @@ -12,7 +12,7 @@ import { peekSystemEventEntries, resetSystemEventsForTest, } from "../infra/system-events.js"; -import type { CronEvent, CronServiceDeps } from "./service.js"; +import type { CronEvent } from "./service.js"; import { CronService } from "./service.js"; import { createCronStoreHarness, @@ -20,6 +20,7 @@ import { createNoopLogger, installCronTestHooks, } from "./service.test-harness.js"; +import type { CronServiceDeps } from "./service/state.js"; const noopLogger = createNoopLogger(); installCronTestHooks({ logger: noopLogger }); diff --git a/src/cron/service.test-harness.ts b/src/cron/service.test-harness.ts index 224458f66532..dacfaee0c42f 100644 --- a/src/cron/service.test-harness.ts +++ b/src/cron/service.test-harness.ts @@ -4,9 +4,10 @@ import os from "node:os"; import path from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, vi } from "vitest"; import type { MockFn } from "../test-utils/vitest-mock-fn.js"; -import type { CronEvent, CronServiceDeps } from "./service.js"; +import type { CronEvent } from "./service.js"; import { CronService } from "./service.js"; import { createCronServiceState, type CronServiceState } from "./service/state.js"; +import type { CronServiceDeps } from "./service/state.js"; import { saveCronStore } from "./store.js"; import type { CronJob } from "./types.js"; diff --git a/src/cron/service.trigger-eval.test.ts b/src/cron/service.trigger-eval.test.ts index 28208f14145f..53ae946ed800 100644 --- a/src/cron/service.trigger-eval.test.ts +++ b/src/cron/service.trigger-eval.test.ts @@ -1,9 +1,10 @@ import { describe, expect, it, vi } from "vitest"; import { appendCronRunLog, readCronRunLogEntriesSync } from "./run-log.js"; -import type { CronEvent, CronServiceDeps } from "./service.js"; +import type { CronEvent } from "./service.js"; import { CronService } from "./service.js"; import { setupCronServiceSuite } from "./service.test-harness.js"; import { computeJobNextRunAtMs } from "./service/jobs.js"; +import type { CronServiceDeps } from "./service/state.js"; import { loadCronStore } from "./store.js"; import type { CronJobCreate } from "./types.js"; diff --git a/src/cron/service.ts b/src/cron/service.ts index 331848c7de15..608e2987d302 100644 --- a/src/cron/service.ts +++ b/src/cron/service.ts @@ -15,7 +15,7 @@ import { } from "./service/state.js"; import type { CronJob, CronJobCreate, CronJobPatch } from "./types.js"; -export type { CronEvent, CronServiceDeps } from "./service/state.js"; +export type { CronEvent } from "./service/state.js"; /** Public cron service facade that owns mutable scheduler state and delegates to locked ops. */ export class CronService implements CronServiceContract { diff --git a/src/cron/service/agent-watchdog.ts b/src/cron/service/agent-watchdog.ts index 6c69c58d4148..f82ac0775d2a 100644 --- a/src/cron/service/agent-watchdog.ts +++ b/src/cron/service/agent-watchdog.ts @@ -46,7 +46,7 @@ const CRON_AGENT_PHASE_WATCHDOG_STAGE = { } as const satisfies Record; /** Handle for feeding isolated-agent progress into cron timeout watchdogs. */ -export type CronAgentWatchdog = { +type CronAgentWatchdog = { start: () => void; noteLaneWait: () => void; noteLaneAdmitted: () => void; diff --git a/src/cron/service/state.ts b/src/cron/service/state.ts index 66928945ff1a..7a45b89cf66a 100644 --- a/src/cron/service/state.ts +++ b/src/cron/service/state.ts @@ -194,7 +194,7 @@ export type CronServiceDeps = { }; /** Cron deps after optional defaults have been made concrete. */ -export type CronServiceDepsInternal = Omit & { +type CronServiceDepsInternal = Omit & { nowMs: () => number; }; @@ -296,7 +296,7 @@ export type CronRunResult = export type CronRemoveResult = { ok: true; removed: boolean } | { ok: false; removed: false }; /** Created cron job returned by service mutation calls. */ -export type CronDeclarativeAddResult = CronJob & { +type CronDeclarativeAddResult = CronJob & { created: boolean; updated?: boolean; job: CronJob; diff --git a/src/cron/service/timer.regression.test.ts b/src/cron/service/timer.regression.test.ts index 9f5988d6e0bb..a5db51bc0c8a 100644 --- a/src/cron/service/timer.regression.test.ts +++ b/src/cron/service/timer.regression.test.ts @@ -40,8 +40,8 @@ import type { import { computeJobNextRunAtMs } from "./jobs.js"; import { run as runManualCronJob } from "./ops.js"; import { createCronServiceState, type CronEvent } from "./state.js"; +import { DEFAULT_JOB_TIMEOUT_MS } from "./timeout-policy.js"; import { - DEFAULT_JOB_TIMEOUT_MS, applyJobResult, executeJobCore, executeJobCoreWithTimeout, diff --git a/src/cron/service/timer.ts b/src/cron/service/timer.ts index caae5e147430..f5850c218ff0 100644 --- a/src/cron/service/timer.ts +++ b/src/cron/service/timer.ts @@ -92,11 +92,6 @@ import { } from "./task-runs.js"; import { resolveCronJobTimeoutMs } from "./timeout-policy.js"; -export { DEFAULT_JOB_TIMEOUT_MS } from "./timeout-policy.js"; -export { normalizeCronRunErrorText } from "./execution-errors.js"; -export { failureNotificationDeliveryFromJobState } from "./failure-alerts.js"; -export { wake } from "./wake.js"; - const MAX_TIMER_DELAY_MS = 60_000; const HEARTBEAT_SKIP_DISABLED = "disabled"; @@ -128,7 +123,7 @@ type TimedCronRunOutcome = CronRunOutcome & triggerEval?: CronTriggerEvalOutcome; }; -export type CronTriggerEvalOutcome = { +type CronTriggerEvalOutcome = { fired: boolean; stateChanged: boolean; state?: unknown; diff --git a/src/cron/store.ts b/src/cron/store.ts index a2904e6466eb..f0377bc62f47 100644 --- a/src/cron/store.ts +++ b/src/cron/store.ts @@ -29,7 +29,6 @@ import type { } from "./store/types.js"; export type { CronConfigJobRuntimeEntry, - CronQuarantineFile, LoadedCronStore, QuarantinedCronConfigJob, } from "./store/types.js"; diff --git a/src/cron/types.ts b/src/cron/types.ts index 62229b68a10c..b2f37ebf0423 100644 --- a/src/cron/types.ts +++ b/src/cron/types.ts @@ -32,10 +32,10 @@ export type CronSchedule = }; /** Runtime target that decides whether a job joins main, isolated, or a named session. */ -export type CronSessionTarget = "main" | "isolated" | "current" | `session:${string}`; +type CronSessionTarget = "main" | "isolated" | "current" | `session:${string}`; /** Wake policy for main-session jobs waiting on heartbeat/user activity. */ -export type CronWakeMode = "next-heartbeat" | "now"; +type CronWakeMode = "next-heartbeat" | "now"; /** Messaging channel id accepted by cron delivery settings. */ export type CronMessageChannel = ChannelId; @@ -60,13 +60,13 @@ export type CronDelivery = { }; /** Webhook completion destination used alongside chat delivery. */ -export type CronCompletionDestination = { +type CronCompletionDestination = { mode: "webhook"; to?: string; }; /** Destination override for failed-run notifications. */ -export type CronFailureDestination = { +type CronFailureDestination = { channel?: CronMessageChannel; to?: string; accountId?: string; @@ -74,7 +74,7 @@ export type CronFailureDestination = { }; /** Partial failure-destination update shape; null clears individual override fields. */ -export type CronFailureDestinationPatch = { +type CronFailureDestinationPatch = { channel?: CronMessageChannel | null; to?: string | null; accountId?: string | null; @@ -138,7 +138,7 @@ export type CronDeliveryPreview = { }; /** Token usage summary copied from the agent runner when available. */ -export type CronUsageSummary = { +type CronUsageSummary = { input_tokens?: number; output_tokens?: number; total_tokens?: number; diff --git a/src/daemon/launchd-current-service.ts b/src/daemon/launchd-current-service.ts index ab6ea25691d9..855210b0d7c5 100644 --- a/src/daemon/launchd-current-service.ts +++ b/src/daemon/launchd-current-service.ts @@ -1,7 +1,7 @@ /** Detects whether the current process is running inside a launchd service label. */ import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce"; -export type CurrentProcessLaunchdServiceLabelOptions = { +type CurrentProcessLaunchdServiceLabelOptions = { allowConfiguredLabelFallback?: boolean; }; diff --git a/src/daemon/launchd-restart-handoff.ts b/src/daemon/launchd-restart-handoff.ts index 2838f1968bf1..483c7e470b1f 100644 --- a/src/daemon/launchd-restart-handoff.ts +++ b/src/daemon/launchd-restart-handoff.ts @@ -8,7 +8,6 @@ import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js"; import { formatErrorMessage } from "../infra/errors.js"; import { sanitizeHostExecEnv } from "../infra/host-env-security.js"; import { resolveGatewayLaunchAgentLabel } from "./constants.js"; -export { isCurrentProcessLaunchdServiceLabel } from "./launchd-current-service.js"; import { renderPosixRestartLogSetup } from "./restart-logs.js"; type LaunchdRestartHandoffMode = "kickstart" | "reload" | "start-after-exit"; diff --git a/src/daemon/restart-logs.ts b/src/daemon/restart-logs.ts index 3a2e220c6f44..e6fda70f3532 100644 --- a/src/daemon/restart-logs.ts +++ b/src/daemon/restart-logs.ts @@ -7,7 +7,7 @@ import type { GatewayServiceEnv } from "./service-types.js"; export const GATEWAY_RESTART_LOG_FILENAME = "gateway-restart.log"; -export type GatewayLogPaths = { +type GatewayLogPaths = { logDir: string; stdoutPath: string; stderrPath: string; diff --git a/src/daemon/schtasks.ts b/src/daemon/schtasks.ts index 13af56dbd262..66c53b9a0c4c 100644 --- a/src/daemon/schtasks.ts +++ b/src/daemon/schtasks.ts @@ -301,7 +301,7 @@ export async function readScheduledTaskCommand( } } -export type ScheduledTaskInfo = { +type ScheduledTaskInfo = { status?: string; lastRunTime?: string; lastRunResult?: string; diff --git a/src/daemon/service-runtime.ts b/src/daemon/service-runtime.ts index ec395ea1c4d6..b1f6f5aee104 100644 --- a/src/daemon/service-runtime.ts +++ b/src/daemon/service-runtime.ts @@ -2,7 +2,7 @@ import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce"; /** systemd supervision fields used to spot unhealthy or given-up gateway service state. */ -export type GatewayServiceSystemdRuntime = { +type GatewayServiceSystemdRuntime = { unit?: string; killMode?: string; tasksCurrent?: number; diff --git a/src/daemon/service.ts b/src/daemon/service.ts index 2f0260eb80c0..e64b2baabb72 100644 --- a/src/daemon/service.ts +++ b/src/daemon/service.ts @@ -54,15 +54,8 @@ import { export type { GatewayServiceCommandConfig, GatewayServiceControlArgs, - GatewayServiceEnv, - GatewayServiceEnvArgs, GatewayServiceInstallArgs, - GatewayServiceManageArgs, - GatewayServiceReadOptions, - GatewayServiceRestartResult, GatewayServiceStartRepairIssue, - GatewayServiceStartResult, - GatewayServiceStageArgs, GatewayServiceState, } from "./service-types.js"; diff --git a/src/daemon/systemd.ts b/src/daemon/systemd.ts index b4d4aab2ae86..40189424681a 100644 --- a/src/daemon/systemd.ts +++ b/src/daemon/systemd.ts @@ -103,7 +103,7 @@ async function findSystemSystemdUnitPath(env: GatewayServiceEnv): Promise longest; length -= 1) { + if (value.startsWith(text.slice(text.length - length))) { + longest = length; + break; + } + } + } + return longest; +} + +export function createRedactingStreamWriter( + target: NodeJS.WriteStream, + redactValues: readonly string[], +): { write: (chunk: Buffer) => boolean; flush: () => void } { + const decoder = new StringDecoder("utf8"); + let pending = ""; + const redact = (text: string): string => { + let redacted = text; + for (const value of redactValues) { + if (value) { + redacted = redacted.replaceAll(value, ""); + } + } + return redacted; + }; + // Returns the raw target.write() backpressure signal so callers can pause + // the child stream instead of buffering a noisy follow stream without bound. + const emit = (text: string): boolean => { + if (!text) { + return true; + } + return target.write(redact(text)); + }; + return { + // Emit everything except a possible secret prefix at the tail on every + // chunk, so unterminated output (progress lines, prompts) streams live + // instead of stalling until a newline arrives. + write: (chunk) => { + pending += decoder.write(chunk); + const keep = secretPrefixSuffixLength(pending, redactValues); + const cut = pending.length - keep; + if (cut <= 0) { + return true; + } + const writable = emit(pending.slice(0, cut)); + pending = pending.slice(cut); + return writable; + }, + flush: () => { + emit(pending + decoder.end()); + pending = ""; + }, + }; +} diff --git a/src/fleet/containers.runtime.test.ts b/src/fleet/containers.runtime.test.ts index ace9b6bb3847..f687ff09cac4 100644 --- a/src/fleet/containers.runtime.test.ts +++ b/src/fleet/containers.runtime.test.ts @@ -19,10 +19,10 @@ const profileMocks = vi.hoisted(() => ({ vi.mock("./cell-profile.js", () => profileMocks); +import type { CellContainerProfile } from "./cell-profile.js"; +import { createRedactingStreamWriter } from "./containers.redaction.js"; import { - __test as containersTestApi, createFleetContainerRuntime, - type CellContainerProfile, type FleetContainerCommandExecutor, type FleetContainerStreamExecutor, } from "./containers.runtime.js"; @@ -510,7 +510,7 @@ describe("fleet container runtime", () => { it("redacts secrets from streamed log output, including across chunk boundaries", () => { const written: string[] = []; const target = { write: (text: string) => written.push(text) } as unknown as NodeJS.WriteStream; - const writer = containersTestApi.createRedactingStreamWriter(target, ["gw-secret-token"]); + const writer = createRedactingStreamWriter(target, ["gw-secret-token"]); writer.write(Buffer.from("boot ok\ntoken=gw-sec")); writer.write(Buffer.from("ret-token done\ntail without newline")); writer.flush(); @@ -523,7 +523,7 @@ describe("fleet container runtime", () => { it("never splits a secret across a forced long-line flush", () => { const written: string[] = []; const target = { write: (text: string) => written.push(text) } as unknown as NodeJS.WriteStream; - const writer = containersTestApi.createRedactingStreamWriter(target, ["gw-secret-token"]); + const writer = createRedactingStreamWriter(target, ["gw-secret-token"]); // An unterminated line ending exactly in a secret prefix at the flush point. writer.write(Buffer.from(`${"x".repeat(64 * 1024)}gw-sec`)); writer.write(Buffer.from("ret-token trailing")); diff --git a/src/fleet/containers.runtime.ts b/src/fleet/containers.runtime.ts index 8fe8f2c9f4d5..c8a0f5a0d907 100644 --- a/src/fleet/containers.runtime.ts +++ b/src/fleet/containers.runtime.ts @@ -2,7 +2,6 @@ import { spawn } from "node:child_process"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { StringDecoder } from "node:string_decoder"; import { attachChildProcessBridge } from "../process/child-process-bridge.js"; import { runCommandWithTimeout } from "../process/exec.js"; import { @@ -12,15 +11,14 @@ import { type CellContainerProfile, type FleetContainerRuntimeName, } from "./cell-profile.js"; +import { createRedactingStreamWriter } from "./containers.redaction.js"; -export type { CellContainerProfile, FleetContainerRuntimeName } from "./cell-profile.js"; - -export type FleetContainerCommandOptions = { +type FleetContainerCommandOptions = { allowFailure?: boolean; redactValues?: readonly string[]; }; -export type FleetContainerCommandResult = { +type FleetContainerCommandResult = { stdout: string; stderr: string; code: number; @@ -32,7 +30,7 @@ export type FleetContainerCommandExecutor = ( options: FleetContainerCommandOptions, ) => Promise; -export type FleetContainerStreamResult = { +type FleetContainerStreamResult = { code: number | null; signal: NodeJS.Signals | null; }; @@ -54,7 +52,7 @@ export type FleetContainerStreamExecutor = ( options: { redactValues: readonly string[] }, ) => Promise; -export type FleetContainerLogsOptions = { +type FleetContainerLogsOptions = { follow?: boolean; tail?: number; since?: string; @@ -490,68 +488,6 @@ const defaultFleetContainerCommandExecutor: FleetContainerCommandExecutor = asyn return normalized; }; -// Longest suffix of `text` that is a proper prefix of any secret. Retaining it -// across emissions guarantees no complete secret is ever split between two -// emitted chunks, and emitted text can never grow into a match later. -function secretPrefixSuffixLength(text: string, redactValues: readonly string[]): number { - let longest = 0; - for (const value of redactValues) { - const max = Math.min(value.length - 1, text.length); - for (let length = max; length > longest; length -= 1) { - if (value.startsWith(text.slice(text.length - length))) { - longest = length; - break; - } - } - } - return longest; -} - -function createRedactingStreamWriter( - target: NodeJS.WriteStream, - redactValues: readonly string[], -): { write: (chunk: Buffer) => boolean; flush: () => void } { - const decoder = new StringDecoder("utf8"); - let pending = ""; - const redact = (text: string): string => { - let redacted = text; - for (const value of redactValues) { - if (value) { - redacted = redacted.replaceAll(value, ""); - } - } - return redacted; - }; - // Returns the raw target.write() backpressure signal so callers can pause - // the child stream instead of buffering a noisy follow stream without bound. - const emit = (text: string): boolean => { - if (!text) { - return true; - } - return target.write(redact(text)); - }; - return { - // Emit everything except a possible secret prefix at the tail on every - // chunk, so unterminated output (progress lines, prompts) streams live - // instead of stalling until a newline arrives. - write: (chunk) => { - pending += decoder.write(chunk); - const keep = secretPrefixSuffixLength(pending, redactValues); - const cut = pending.length - keep; - if (cut <= 0) { - return true; - } - const writable = emit(pending.slice(0, cut)); - pending = pending.slice(cut); - return writable; - }, - flush: () => { - emit(pending + decoder.end()); - pending = ""; - }, - }; -} - const defaultFleetContainerStreamExecutor: FleetContainerStreamExecutor = ( runtime, args, @@ -601,9 +537,6 @@ const defaultFleetContainerStreamExecutor: FleetContainerStreamExecutor = ( }); }); -const testApi = { createRedactingStreamWriter }; -export { testApi as __test }; - function isMissingContainerError(stderr: string): boolean { const normalized = stderr.toLowerCase(); return ( diff --git a/src/fleet/doctor.runtime.ts b/src/fleet/doctor.runtime.ts index e268ffc15911..b505e437cb7e 100644 --- a/src/fleet/doctor.runtime.ts +++ b/src/fleet/doctor.runtime.ts @@ -14,13 +14,13 @@ import type { FleetContainerRuntime } from "./containers.runtime.js"; import { listFleetCells } from "./registry.js"; import { probeCellHealth, requireCell } from "./service-support.runtime.js"; -export type FleetDoctorFinding = { +type FleetDoctorFinding = { check: string; status: "pass" | "warn" | "fail"; detail: string; }; -export type FleetDoctorCellReport = { tenant: string; findings: FleetDoctorFinding[] }; +type FleetDoctorCellReport = { tenant: string; findings: FleetDoctorFinding[] }; function finding( check: string, diff --git a/src/fleet/registry.ts b/src/fleet/registry.ts index 99bb0d30b362..be2b18b73c21 100644 --- a/src/fleet/registry.ts +++ b/src/fleet/registry.ts @@ -34,7 +34,7 @@ type FleetRegistryDatabase = Pick void; release: () => void; owner: string; diff --git a/src/fleet/service-support.runtime.ts b/src/fleet/service-support.runtime.ts index 40a655241d38..abb80cdc5799 100644 --- a/src/fleet/service-support.runtime.ts +++ b/src/fleet/service-support.runtime.ts @@ -36,7 +36,7 @@ const HEALTH_TIMEOUT_MS = 1_000; const CELL_CONFIG_MAX_BYTES = 4 * 1024 * 1024; const FLEET_OPERATION_HEARTBEAT_MS = 60_000; -export type FleetHealthResult = +type FleetHealthResult = | { status: "ok"; url: string; httpStatus: number } | { status: "failed"; url: string; error: string; httpStatus?: number } | { status: "skipped"; url: string; reason: string }; @@ -341,7 +341,7 @@ export function assertCurrentReservation(env: NodeJS.ProcessEnv, expected: Fleet } } -export function requirePositiveResource( +function requirePositiveResource( value: string, label: string, context: "upgrade" | "restore" = "upgrade", @@ -375,7 +375,7 @@ export function requireInspectedAttemptId( return attemptId; } -export function requirePidsLimit( +function requirePidsLimit( value: number | undefined, context: "upgrade" | "restore" = "upgrade", ): number { @@ -385,7 +385,7 @@ export function requirePidsLimit( return value; } -export function rebuildInspectedEnvironment( +function rebuildInspectedEnvironment( environment: Readonly>, labels: Readonly>, token: string, diff --git a/src/fleet/service.runtime.ts b/src/fleet/service.runtime.ts index bcb58c140556..53330644eac6 100644 --- a/src/fleet/service.runtime.ts +++ b/src/fleet/service.runtime.ts @@ -98,7 +98,7 @@ export type FleetCreateOptions = { start?: boolean; }; -export type FleetCreateResult = { +type FleetCreateResult = { tenant: string; containerName: string; port: number; @@ -111,7 +111,7 @@ export type FleetCreateResult = { nextStep: string; }; -export type FleetListEntry = { +type FleetListEntry = { tenant: string; state: string; port: number; @@ -124,7 +124,7 @@ export type FleetHealthResult = | { status: "failed"; url: string; error: string; httpStatus?: number } | { status: "skipped"; url: string; reason: string }; -export type FleetStatusResult = { +type FleetStatusResult = { tenant: string; containerName: string; runtime: FleetContainerRuntimeName; @@ -149,7 +149,7 @@ export type FleetLogsOptions = { since?: string; }; -export type FleetActionResult = { +type FleetActionResult = { tenant: string; action: FleetLifecycleAction | "upgrade" | "rm"; image?: string; @@ -796,5 +796,3 @@ export function createFleetService(options: FleetServiceOptions = {}) { }, }; } - -export type FleetService = ReturnType; diff --git a/src/flows/doctor-lint-flow.ts b/src/flows/doctor-lint-flow.ts index b7bf33bd95f0..4f920f8a5fc4 100644 --- a/src/flows/doctor-lint-flow.ts +++ b/src/flows/doctor-lint-flow.ts @@ -18,7 +18,7 @@ export interface DoctorLintRunOptions { readonly includeAllChecks?: boolean; } -export interface DoctorLintRunResult { +interface DoctorLintRunResult { readonly findings: readonly HealthFinding[]; readonly checksRun: number; readonly checksSkipped: number; diff --git a/src/flows/doctor-repair-flow.ts b/src/flows/doctor-repair-flow.ts index b09b473da269..a87a86075d81 100644 --- a/src/flows/doctor-repair-flow.ts +++ b/src/flows/doctor-repair-flow.ts @@ -18,13 +18,13 @@ import type { } from "./health-checks.js"; // Repair runner for structured doctor health checks; carries config between checks. -export interface DoctorRepairRunOptions { +interface DoctorRepairRunOptions { readonly checks?: readonly HealthCheckInput[]; readonly dryRun?: boolean; readonly diff?: boolean; } -export interface DoctorRepairRunResult { +interface DoctorRepairRunResult { readonly config: OpenClawConfig; readonly findings: readonly HealthFinding[]; readonly remainingFindings: readonly HealthFinding[]; diff --git a/src/flows/doctor-tool-result-cap-advice.ts b/src/flows/doctor-tool-result-cap-advice.ts index 46347ed6c5e1..c770c56e742c 100644 --- a/src/flows/doctor-tool-result-cap-advice.ts +++ b/src/flows/doctor-tool-result-cap-advice.ts @@ -7,7 +7,7 @@ import type { HealthFinding } from "./health-checks.js"; const TOOL_RESULT_CAP_CHECK_ID = "core/doctor/tool-result-cap"; -export type ToolResultCapDoctorIssue = { +type ToolResultCapDoctorIssue = { kind: "configured-above-runtime-ceiling" | "configured-below-auto-cap"; contextWindowTokens: number; modelKey: string; @@ -20,7 +20,7 @@ export type ToolResultCapDoctorIssue = { }; // Doctor advice for explicit live tool-result caps that fight model-window defaults. -export type ToolResultCapDoctorAdviceParams = { +type ToolResultCapDoctorAdviceParams = { contextWindowTokens: number; modelKey: string; configuredCap?: number; diff --git a/src/flows/health-check-runner-types.ts b/src/flows/health-check-runner-types.ts index 2f90ab87130d..20c44373776f 100644 --- a/src/flows/health-check-runner-types.ts +++ b/src/flows/health-check-runner-types.ts @@ -10,7 +10,7 @@ import type { } from "./health-checks.js"; // Runnable health-check contracts used by doctor lint/fix orchestration. -export interface HealthCheckRunContext extends HealthCheckContext { +interface HealthCheckRunContext extends HealthCheckContext { readonly repair: boolean; readonly diff?: boolean; readonly previewRepair?: boolean; @@ -26,7 +26,7 @@ export interface HealthCheckRunResult extends Omit ({ mockState.emittedTranscriptUpdates.push(update); }, ), - emitInternalSessionTranscriptUpdate: vi.fn( - (update: { - sessionFile?: string; - target?: { agentId: string; sessionId: string; sessionKey: string }; - agentId?: string; - sessionId?: string; - sessionKey?: string; - message?: unknown; - messageId?: string; - }) => { - mockState.emittedTranscriptUpdates.push(update); - }, - ), })); vi.mock("../../agents/sandbox/context.js", async () => { diff --git a/src/gateway/server-methods/tasks.test.ts b/src/gateway/server-methods/tasks.test.ts index 03a5e8ef6a4e..285c024eea8f 100644 --- a/src/gateway/server-methods/tasks.test.ts +++ b/src/gateway/server-methods/tasks.test.ts @@ -12,11 +12,13 @@ import { getTaskById, markTaskTerminalById, recordTaskProgressByRunId, +} from "../../tasks/runtime-internal.js"; +import { reloadTaskRegistryFromStore, resetTaskRegistryControlRuntimeForTests, resetTaskRegistryForTests, setTaskRegistryControlRuntimeForTests, -} from "../../tasks/runtime-internal.js"; +} from "../../tasks/task-registry.js"; import { saveTaskRegistryStateToSqlite } from "../../tasks/task-registry.store.sqlite.js"; import type { TaskRecord } from "../../tasks/task-registry.types.js"; import { captureEnv, setTestEnvValue } from "../../test-utils/env.js"; diff --git a/src/gateway/server-runtime-subscriptions.test.ts b/src/gateway/server-runtime-subscriptions.test.ts index 99853ec71ddf..e83aba96ff09 100644 --- a/src/gateway/server-runtime-subscriptions.test.ts +++ b/src/gateway/server-runtime-subscriptions.test.ts @@ -8,7 +8,7 @@ import { import type { SubsystemLogger } from "../logging/subsystem.js"; import { emitSessionLifecycleEvent } from "../sessions/session-lifecycle-events.js"; import { - emitInternalSessionTranscriptUpdate, + emitSessionTranscriptUpdate, type InternalSessionTranscriptUpdate, } from "../sessions/transcript-events.js"; import { createTaskRecord, resetTaskRegistryForTests } from "../tasks/task-registry.js"; @@ -168,7 +168,7 @@ describe("startGatewayEventSubscriptions", () => { it("logs transcript handler failures", async () => { unsubs = startGatewayEventSubscriptions(createParams()); - emitInternalSessionTranscriptUpdate({ + emitSessionTranscriptUpdate({ sessionFile: "/tmp/sess.jsonl", sessionKey: "agent:main:main", } as InternalSessionTranscriptUpdate); diff --git a/src/gateway/session-message-events.test.ts b/src/gateway/session-message-events.test.ts index 8a05d348c700..0fa3bdc83392 100644 --- a/src/gateway/session-message-events.test.ts +++ b/src/gateway/session-message-events.test.ts @@ -20,10 +20,7 @@ import { import { rawDataToString } from "../infra/ws.js"; import { emitSessionLifecycleEvent } from "../sessions/session-lifecycle-events.js"; import * as transcriptEvents from "../sessions/transcript-events.js"; -import { - emitInternalSessionTranscriptUpdate, - emitSessionTranscriptUpdate, -} from "../sessions/transcript-events.js"; +import { emitSessionTranscriptUpdate } from "../sessions/transcript-events.js"; import { testState } from "./test-helpers.runtime-state.js"; import { connectOk, @@ -566,7 +563,7 @@ describe("session.message websocket events", () => { await withOperatorSessionSubscriber(async (ws) => { const messageEventPromise = waitForSessionMessageEvent(ws, "agent:main:main"); - emitInternalSessionTranscriptUpdate({ + emitSessionTranscriptUpdate({ target: { agentId: "main", sessionId: "sess-main", diff --git a/src/gateway/sessions-history-http.test.ts b/src/gateway/sessions-history-http.test.ts index 1b406c73116a..5ec5485be3c7 100644 --- a/src/gateway/sessions-history-http.test.ts +++ b/src/gateway/sessions-history-http.test.ts @@ -12,10 +12,7 @@ import { appendExactAssistantMessageToSessionTranscript, } from "../config/sessions/transcript.js"; import { executeSqliteQuerySync, getNodeSqliteKysely } from "../infra/kysely-sync.js"; -import { - emitInternalSessionTranscriptUpdate, - emitSessionTranscriptUpdate, -} from "../sessions/transcript-events.js"; +import { emitSessionTranscriptUpdate } from "../sessions/transcript-events.js"; import { OPENCLAW_TRANSCRIPT_ARTIFACT_API } from "../shared/transcript-only-openclaw-assistant.js"; import type { DB as OpenClawAgentKyselyDatabase } from "../state/openclaw-agent-db.generated.js"; import { runOpenClawAgentWriteTransaction } from "../state/openclaw-agent-db.js"; @@ -883,7 +880,7 @@ describe("session history HTTP endpoints", () => { const stream = await openSessionHistorySse(harness.port, "agent:main:main"); await expectHistoryEventTexts(stream, ["first message"]); - emitInternalSessionTranscriptUpdate({ + emitSessionTranscriptUpdate({ target: { agentId: "main", sessionId: "sess-main", diff --git a/src/gateway/test-helpers.server.ts b/src/gateway/test-helpers.server.ts index e31968e4ffb8..49cc5a588fd0 100644 --- a/src/gateway/test-helpers.server.ts +++ b/src/gateway/test-helpers.server.ts @@ -46,8 +46,10 @@ import { toAgentStoreSessionKey, } from "../routing/session-key.js"; import { createLazyRuntimeModule } from "../shared/lazy-runtime.js"; -import { resetTaskRegistryForTests } from "../tasks/runtime-internal.js"; -import { resetTaskFlowRegistryForTests } from "../tasks/task-flow-runtime-internal.js"; +import { + resetTaskFlowRegistryForTests, + resetTaskRegistryForTests, +} from "../tasks/task-runtime.test-helpers.js"; import { captureEnv } from "../test-utils/env.js"; import { getDeterministicFreePortBlock } from "../test-utils/ports.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; diff --git a/src/hooks/bundled/bootstrap-extra-files/handler.test.ts b/src/hooks/bundled/bootstrap-extra-files/handler.test.ts index ef8fb3571ad5..f8cdd3e7b750 100644 --- a/src/hooks/bundled/bootstrap-extra-files/handler.test.ts +++ b/src/hooks/bundled/bootstrap-extra-files/handler.test.ts @@ -4,8 +4,10 @@ import path from "node:path"; import { describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../../../config/config.js"; import { makeTempWorkspace, writeWorkspaceFile } from "../../../test-helpers/workspace.js"; -import type { AgentBootstrapHookContext } from "../../hooks.js"; -import { createHookEvent } from "../../hooks.js"; +import { + type AgentBootstrapHookContext, + createInternalHookEvent as createHookEvent, +} from "../../internal-hooks.js"; import handler from "./handler.js"; function createBootstrapExtraConfig(paths: string[]): OpenClawConfig { diff --git a/src/hooks/bundled/session-memory/handler.test.ts b/src/hooks/bundled/session-memory/handler.test.ts index 83e507f35483..9ffaca047dba 100644 --- a/src/hooks/bundled/session-memory/handler.test.ts +++ b/src/hooks/bundled/session-memory/handler.test.ts @@ -9,7 +9,7 @@ import { replaceTranscriptEvents } from "../../../config/sessions/session-access import { formatSqliteSessionFileMarker } from "../../../config/sessions/sqlite-marker.js"; import { writeWorkspaceFile } from "../../../test-helpers/workspace.js"; import { withEnvAsync } from "../../../test-utils/env.js"; -import { createHookEvent } from "../../hooks.js"; +import { createInternalHookEvent as createHookEvent } from "../../internal-hooks.js"; import { generateSlugViaLLM } from "../../llm-slug-generator.js"; import { findPreviousSessionFile, diff --git a/src/hooks/gmail-watcher-lifecycle.ts b/src/hooks/gmail-watcher-lifecycle.ts index 6c22bce03ac6..b522004d8b82 100644 --- a/src/hooks/gmail-watcher-lifecycle.ts +++ b/src/hooks/gmail-watcher-lifecycle.ts @@ -4,7 +4,7 @@ import { isTruthyEnvValue } from "../infra/env.js"; import { startGmailWatcher } from "./gmail-watcher.js"; /** Logging surface used while starting the Gmail watcher during gateway startup. */ -export type GMailWatcherLog = { +type GMailWatcherLog = { info: (msg: string) => void; warn: (msg: string) => void; error: (msg: string) => void; diff --git a/src/hooks/gmail-watcher.ts b/src/hooks/gmail-watcher.ts index 6e58dfa14f25..7b5b7fbd45f9 100644 --- a/src/hooks/gmail-watcher.ts +++ b/src/hooks/gmail-watcher.ts @@ -177,7 +177,7 @@ function settleProcess(proc: ChildProcess): Promise { }); } -export type GmailWatcherStartResult = { +type GmailWatcherStartResult = { started: boolean; reason?: string; }; diff --git a/src/hooks/hooks-status.ts b/src/hooks/hooks-status.ts index 4d7c33aa84ae..a551fc5c199c 100644 --- a/src/hooks/hooks-status.ts +++ b/src/hooks/hooks-status.ts @@ -15,9 +15,9 @@ import { import type { HookEligibilityContext, HookEntry, HookInstallSpec } from "./types.js"; import { loadWorkspaceHookEntries } from "./workspace.js"; -export type HookStatusConfigCheck = RequirementConfigCheck; +type HookStatusConfigCheck = RequirementConfigCheck; -export type HookInstallOption = { +type HookInstallOption = { id: string; kind: HookInstallSpec["kind"]; label: string; diff --git a/src/hooks/hooks.ts b/src/hooks/hooks.ts index 706af3daa6ad..01bf62af7612 100644 --- a/src/hooks/hooks.ts +++ b/src/hooks/hooks.ts @@ -2,8 +2,4 @@ export type HookHandler = import("./internal-hook-types.js").InternalHookHandler; /** Public hook API facade for hook modules that should not import internals directly. */ -export type { AgentBootstrapHookContext } from "./internal-hooks.js"; -export { - createInternalHookEvent as createHookEvent, - isAgentBootstrapEvent, -} from "./internal-hooks.js"; +export { isAgentBootstrapEvent } from "./internal-hooks.js"; diff --git a/src/hooks/install.ts b/src/hooks/install.ts index defe285ebd2e..a5fb514f1c46 100644 --- a/src/hooks/install.ts +++ b/src/hooks/install.ts @@ -25,7 +25,7 @@ const HOOK_MD_MAX_BYTES = 1024 * 1024; const loadHookInstallRuntime = createLazyRuntimeModule(() => import("./install.runtime.js")); /** Logger contract used by hook install and update operations. */ -export type HookInstallLogger = { +type HookInstallLogger = { info?: (message: string) => void; warn?: (message: string) => void; }; diff --git a/src/hooks/update.ts b/src/hooks/update.ts index a83797b95cfc..ee48f37787db 100644 --- a/src/hooks/update.ts +++ b/src/hooks/update.ts @@ -13,16 +13,16 @@ import { import { recordHookInstall } from "./installs.js"; /** Logger contract for hook pack update operations. */ -export type HookPackUpdateLogger = { +type HookPackUpdateLogger = { info?: (message: string) => void; warn?: (message: string) => void; }; /** Per-pack update status emitted by updateNpmInstalledHookPacks. */ -export type HookPackUpdateStatus = "updated" | "unchanged" | "skipped" | "error"; +type HookPackUpdateStatus = "updated" | "unchanged" | "skipped" | "error"; /** Outcome for one hook pack update attempt. */ -export type HookPackUpdateOutcome = { +type HookPackUpdateOutcome = { hookId: string; status: HookPackUpdateStatus; message: string; @@ -31,14 +31,14 @@ export type HookPackUpdateOutcome = { }; /** Aggregate update result with the possibly updated config. */ -export type HookPackUpdateSummary = { +type HookPackUpdateSummary = { config: OpenClawConfig; changed: boolean; outcomes: HookPackUpdateOutcome[]; }; /** Integrity drift payload enriched with hook pack identity and dry-run state. */ -export type HookPackUpdateIntegrityDriftParams = HookNpmIntegrityDriftParams & { +type HookPackUpdateIntegrityDriftParams = HookNpmIntegrityDriftParams & { hookId: string; resolvedSpec?: string; resolvedVersion?: string; diff --git a/src/infra/heartbeat-runner.tool-response.test.ts b/src/infra/heartbeat-runner.tool-response.test.ts index 1c3456a648cc..f46111171d01 100644 --- a/src/infra/heartbeat-runner.tool-response.test.ts +++ b/src/infra/heartbeat-runner.tool-response.test.ts @@ -7,11 +7,11 @@ import { createHeartbeatToolResponsePayload, type HeartbeatToolResponse, } from "../auto-reply/heartbeat-tool-response.js"; +import { markReplyPayloadForSourceSuppressionDelivery } from "../auto-reply/reply-payload.js"; import { GENERIC_EXTERNAL_RUN_FAILURE_TEXT, HEARTBEAT_EXTERNAL_RUN_FAILURE_TEXT, } from "../auto-reply/reply/agent-runner-failure-copy.js"; -import { markReplyPayloadForSourceSuppressionDelivery } from "../auto-reply/types.js"; import type { OpenClawConfig } from "../config/config.js"; import { getLastHeartbeatEvent, resetHeartbeatEventsForTest } from "./heartbeat-events.js"; import { runHeartbeatOnce, testing, type HeartbeatDeps } from "./heartbeat-runner.js"; diff --git a/src/infra/state-migrations.channel-pairing.test.ts b/src/infra/state-migrations.channel-pairing.test.ts index 652be3dc06ab..1a763084d7f4 100644 --- a/src/infra/state-migrations.channel-pairing.test.ts +++ b/src/infra/state-migrations.channel-pairing.test.ts @@ -5,7 +5,7 @@ import { resolveOAuthDir } from "../config/paths.js"; import { readChannelPairingStateSnapshot, writeChannelPairingStateSnapshot, -} from "../pairing/pairing-store-sqlite.js"; +} from "../pairing/pairing-store-sqlite.test-helpers.js"; import { closeOpenClawStateDatabaseForTest } from "../state/openclaw-state-db.js"; import { createTrackedTempDirs } from "../test-utils/tracked-temp-dirs.js"; import { diff --git a/src/infra/state-migrations.test.ts b/src/infra/state-migrations.test.ts index 23367cea89b0..b49823db43dc 100644 --- a/src/infra/state-migrations.test.ts +++ b/src/infra/state-migrations.test.ts @@ -7,7 +7,7 @@ import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import { readAcpSessionMetaForEntry } from "../acp/runtime/session-meta.js"; import type { OpenClawConfig } from "../config/config.js"; import * as sessionStore from "../config/sessions.js"; -import { readChannelPairingStateSnapshot } from "../pairing/pairing-store-sqlite.js"; +import { readChannelPairingStateSnapshot } from "../pairing/pairing-store-sqlite.test-helpers.js"; import type { DB as OpenClawStateKyselyDatabase } from "../state/openclaw-state-db.generated.js"; import { closeOpenClawStateDatabaseForTest, diff --git a/src/llm/providers/stream-wrappers/moonshot.ts b/src/llm/providers/stream-wrappers/moonshot.ts index 1e3fecea1ad5..ad9dd484ce6e 100644 --- a/src/llm/providers/stream-wrappers/moonshot.ts +++ b/src/llm/providers/stream-wrappers/moonshot.ts @@ -4,12 +4,6 @@ import type { ThinkLevel } from "../../../auto-reply/thinking.js"; import { streamSimple } from "../../stream.js"; import { streamWithPayloadPatch } from "./stream-payload-utils.js"; -export { - createMoonshotThinkingWrapper, - resolveMoonshotThinkingKeep, - resolveMoonshotThinkingType, -} from "./moonshot-thinking.js"; - /** Detects SiliconFlow Pro models that require thinking=null instead of thinking="off". */ export function shouldApplySiliconFlowThinkingOffCompat(params: { provider: string; diff --git a/src/llm/providers/stream-wrappers/reasoning-effort-utils.ts b/src/llm/providers/stream-wrappers/reasoning-effort-utils.ts index 8a9a36579199..b48844032e2c 100644 --- a/src/llm/providers/stream-wrappers/reasoning-effort-utils.ts +++ b/src/llm/providers/stream-wrappers/reasoning-effort-utils.ts @@ -2,7 +2,7 @@ import type { ThinkLevel } from "../../../auto-reply/thinking.js"; /** Reasoning effort values accepted by OpenAI-compatible providers. */ -export type ReasoningEffort = "none" | "minimal" | "low" | "medium" | "high" | "xhigh"; +type ReasoningEffort = "none" | "minimal" | "low" | "medium" | "high" | "xhigh"; /** Maps OpenClaw thinking levels onto provider reasoning-effort labels. */ export function mapThinkingLevelToReasoningEffort(thinkingLevel: ThinkLevel): ReasoningEffort { diff --git a/src/llm/stream.ts b/src/llm/stream.ts index 55f3ef9d84bf..bc4e8128ef29 100644 --- a/src/llm/stream.ts +++ b/src/llm/stream.ts @@ -8,10 +8,4 @@ import "./ai-transport-host.js"; registerBuiltInApiProviders(defaultApiRegistry); -export { - complete, - completeSimple, - getEnvApiKey, - stream, - streamSimple, -} from "@openclaw/ai/internal/runtime"; +export { complete, completeSimple, stream, streamSimple } from "@openclaw/ai/internal/runtime"; diff --git a/src/llm/utils/node-http-proxy.ts b/src/llm/utils/node-http-proxy.ts index 0816cf9e21df..a2acf2430af3 100644 --- a/src/llm/utils/node-http-proxy.ts +++ b/src/llm/utils/node-http-proxy.ts @@ -8,7 +8,7 @@ import { } from "../../infra/net/node-proxy-agent.js"; /** HTTP(S) agent pair for Node fetch/client integrations that accept explicit agents. */ -export interface NodeHttpProxyAgents { +interface NodeHttpProxyAgents { httpAgent: HttpAgent; httpsAgent: HttpsAgent; } diff --git a/src/llm/utils/oauth/anthropic.ts b/src/llm/utils/oauth/anthropic.ts index 3af4a61e159a..f6d4a950d03d 100644 --- a/src/llm/utils/oauth/anthropic.ts +++ b/src/llm/utils/oauth/anthropic.ts @@ -301,7 +301,7 @@ async function exchangeAuthorizationCode( /** * Login with Anthropic OAuth (authorization code + PKCE) */ -export async function loginAnthropic(options: { +async function loginAnthropic(options: { onAuth: (info: { url: string; instructions?: string }) => void; onPrompt: (prompt: OAuthPrompt) => Promise; onProgress?: (message: string) => void; diff --git a/src/llm/utils/oauth/github-copilot.ts b/src/llm/utils/oauth/github-copilot.ts index 870d30de9c8f..ec84ae238a22 100644 --- a/src/llm/utils/oauth/github-copilot.ts +++ b/src/llm/utils/oauth/github-copilot.ts @@ -75,7 +75,7 @@ function resolveExpiresAtFromEpochSeconds(value: unknown): number | undefined { return resolveExpiresAtMsFromEpochSeconds(value, { bufferMs: 5 * 60 * 1000 }); } -export function normalizeDomain(input: string): string | null { +function normalizeDomain(input: string): string | null { const trimmed = input.trim(); if (!trimmed) { return null; @@ -116,7 +116,7 @@ function getBaseUrlFromToken(token: string): string | null { return `https://${apiHost}`; } -export function getGitHubCopilotBaseUrl(token?: string, enterpriseDomain?: string): string { +function getGitHubCopilotBaseUrl(token?: string, enterpriseDomain?: string): string { // If we have a token, extract the base URL from proxy-ep if (token) { const urlFromToken = getBaseUrlFromToken(token); @@ -508,7 +508,7 @@ async function enableAllGitHubCopilotModels( * @param options.onProgress - Optional progress callback * @param options.signal - Optional AbortSignal for cancellation */ -export async function loginGitHubCopilot(options: { +async function loginGitHubCopilot(options: { onAuth: (url: string, instructions?: string) => void; onPrompt: (prompt: { message: string; diff --git a/src/llm/utils/oauth/index.ts b/src/llm/utils/oauth/index.ts index 00f82a887cfa..a878c2b9db7d 100644 --- a/src/llm/utils/oauth/index.ts +++ b/src/llm/utils/oauth/index.ts @@ -8,21 +8,8 @@ */ // Anthropic -export { anthropicOAuthProvider, loginAnthropic, refreshAnthropicToken } from "./anthropic.js"; // GitHub Copilot -export { - getGitHubCopilotBaseUrl, - githubCopilotOAuthProvider, - loginGitHubCopilot, - normalizeDomain, - refreshGitHubCopilotToken, -} from "./github-copilot.js"; // OpenAI Codex (ChatGPT OAuth) -export { - loginOpenAICodex, - openaiCodexOAuthProvider, - refreshOpenAICodexToken, -} from "./openai-chatgpt.js"; export * from "./types.js"; diff --git a/src/llm/utils/oauth/types.ts b/src/llm/utils/oauth/types.ts index 984c139d7313..ba7de2632e12 100644 --- a/src/llm/utils/oauth/types.ts +++ b/src/llm/utils/oauth/types.ts @@ -1,13 +1,9 @@ // OAuth type facade for core and provider login integrations. export type { - OAuthAuthInfo, OAuthCredentials, OAuthLoginCallbacks, OAuthPrompt, OAuthProvider, OAuthProviderId, - OAuthProviderInfo, OAuthProviderInterface, - OAuthSelectOption, - OAuthSelectPrompt, } from "../../../plugin-sdk/provider-oauth-runtime.js"; diff --git a/src/mcp/channel-server.test.ts b/src/mcp/channel-server.test.ts index e69761b01910..7f8b201f8806 100644 --- a/src/mcp/channel-server.test.ts +++ b/src/mcp/channel-server.test.ts @@ -4,7 +4,8 @@ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; import { describe, expect, test, vi } from "vitest"; import { z } from "zod"; import { shouldRetryInitialMcpGatewayConnect } from "./channel-bridge.js"; -import { createOpenClawChannelMcpServer, OpenClawChannelBridge } from "./channel-server.js"; +import { OpenClawChannelBridge } from "./channel-bridge.js"; +import { createOpenClawChannelMcpServer } from "./channel-server.js"; import { extractAttachmentsFromMessage } from "./channel-shared.js"; const ClaudeChannelNotificationSchema = z.object({ diff --git a/src/mcp/openclaw-tools-serve-config.ts b/src/mcp/openclaw-tools-serve-config.ts index fea43b584534..97a825d1f222 100644 --- a/src/mcp/openclaw-tools-serve-config.ts +++ b/src/mcp/openclaw-tools-serve-config.ts @@ -17,7 +17,7 @@ export const OPENCLAW_TOOLS_MCP_CRESTODIAN_APPROVAL_ARMED_ENV = "OPENCLAW_TOOLS_MCP_CRESTODIAN_APPROVAL_ARMED"; export const OPENCLAW_TOOLS_MCP_CRESTODIAN_PROPOSAL_ENV = "OPENCLAW_TOOLS_MCP_CRESTODIAN_PROPOSAL"; -export const OPENCLAW_TOOLS_MCP_TOOL_IDS = ["cron", "crestodian"] as const; +const OPENCLAW_TOOLS_MCP_TOOL_IDS = ["cron", "crestodian"] as const; export type OpenClawToolsMcpToolId = (typeof OPENCLAW_TOOLS_MCP_TOOL_IDS)[number]; function isOpenClawToolsMcpToolId(value: string): value is OpenClawToolsMcpToolId { diff --git a/src/media-understanding/local-audio.ts b/src/media-understanding/local-audio.ts index 0699a3265f23..900a8de5a7a9 100644 --- a/src/media-understanding/local-audio.ts +++ b/src/media-understanding/local-audio.ts @@ -6,7 +6,7 @@ import { runExec } from "../process/exec.js"; import { getOrCreatePromise } from "../shared/lazy-promise.js"; import { fileExists } from "./fs.js"; -export type LocalAudioCandidate = { +type LocalAudioCandidate = { id: "parakeet-mlx" | "whisper-cli" | "sherpa-onnx-offline" | "whisper"; command: string; resolvedCommand?: string; diff --git a/src/media-understanding/runtime-types.ts b/src/media-understanding/runtime-types.ts index e31261fad70a..4ada7b08c228 100644 --- a/src/media-understanding/runtime-types.ts +++ b/src/media-understanding/runtime-types.ts @@ -24,7 +24,7 @@ export type RunMediaUnderstandingFileParams = { scopeContext?: MediaUnderstandingScopeContext; }; -export type MediaUnderstandingScopeContext = { +type MediaUnderstandingScopeContext = { sessionKey?: string; channel?: string; chatType?: string; diff --git a/src/media-understanding/types.ts b/src/media-understanding/types.ts index 5d90a349ef53..16f6b16d0fcc 100644 --- a/src/media-understanding/types.ts +++ b/src/media-understanding/types.ts @@ -227,7 +227,7 @@ export type StructuredExtractionResult = { contentType?: "json" | "text"; }; -export type MediaUnderstandingDocumentModelDefaults = { +type MediaUnderstandingDocumentModelDefaults = { textExtraction?: string; image?: string | false; }; diff --git a/src/media/image-ops.ts b/src/media/image-ops.ts index 785e141f77cf..ed64d3442b9e 100644 --- a/src/media/image-ops.ts +++ b/src/media/image-ops.ts @@ -32,7 +32,7 @@ export class ImageProcessorUnavailableError extends Error { } /** JPEG resize request passed through the media-runtime/plugin SDK surface. */ -export type ResizeToJpegParams = { +type ResizeToJpegParams = { buffer: Buffer; maxSide: number; quality: number; @@ -40,7 +40,7 @@ export type ResizeToJpegParams = { }; /** PNG resize request passed through the media-runtime/plugin SDK surface. */ -export type ResizeToPngParams = { +type ResizeToPngParams = { buffer: Buffer; maxSide: number; compressionLevel?: number; diff --git a/src/media/parse.ts b/src/media/parse.ts index 8a30e6073b4f..aa9bc39a7004 100644 --- a/src/media/parse.ts +++ b/src/media/parse.ts @@ -15,7 +15,7 @@ import { parseFenceSpans } from "../../packages/markdown-core/src/fences.js"; import { parseAudioTag } from "./audio-tags.js"; /** Captures legacy MEDIA: attachment directives from model/tool output. */ -export const MEDIA_TOKEN_RE = /\bMEDIA:\s*`?([^\n]+)`?/gi; +const MEDIA_TOKEN_RE = /\bMEDIA:\s*`?([^\n]+)`?/gi; /** Ordered output segment emitted after visible text and extracted media are separated. */ type ParsedMediaOutputSegment = @@ -37,7 +37,7 @@ export type SplitMediaFromOutputOptions = { const FILE_URL_PREFIX_RE = /^file:\/\//i; /** Converts file URLs into plain local paths before downstream media validation. */ -export function normalizeMediaSource(src: string): string { +function normalizeMediaSource(src: string): string { return src.replace(FILE_URL_PREFIX_RE, ""); } diff --git a/src/media/read-capability.ts b/src/media/read-capability.ts index d9c28896d1a8..adcb45db8462 100644 --- a/src/media/read-capability.ts +++ b/src/media/read-capability.ts @@ -62,7 +62,7 @@ function isAgentScopedHostMediaReadAllowed( } /** Creates a host reader bound to the agent workspace and configured local-file safety checks. */ -export function createAgentScopedHostMediaReadFile( +function createAgentScopedHostMediaReadFile( params: { cfg: OpenClawConfig; agentId?: string; diff --git a/src/memory-host-sdk/engine-qmd.ts b/src/memory-host-sdk/engine-qmd.ts index f43380495fe5..4ec9a5f110fd 100644 --- a/src/memory-host-sdk/engine-qmd.ts +++ b/src/memory-host-sdk/engine-qmd.ts @@ -5,7 +5,4 @@ export { checkQmdBinaryAvailability, resolveQmdBinaryUnavailableReason, - type QmdBinaryAvailability, - type QmdBinaryUnavailable, - type QmdBinaryUnavailableReason, } from "../../packages/memory-host-sdk/src/engine-qmd.js"; diff --git a/src/model-catalog/authority.test.ts b/src/model-catalog/authority.test.ts deleted file mode 100644 index 6ad0bcc619a3..000000000000 --- a/src/model-catalog/authority.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -// Model-catalog authority tests cover precedence between config, manifest, cache, runtime, and preview rows. -import { describe, expect, it } from "vitest"; -import { mergeModelCatalogRowsByAuthority } from "./index.js"; -import type { ModelCatalogSource, NormalizedModelCatalogRow } from "./index.js"; - -function row(source: ModelCatalogSource, name: string): NormalizedModelCatalogRow { - return { - provider: "moonshot", - id: "kimi-k2.6", - ref: "moonshot/kimi-k2.6", - mergeKey: "moonshot::kimi-k2.6", - name, - source, - input: ["text"], - reasoning: false, - status: source === "provider-index" ? "preview" : "available", - }; -} - -function expectSelectedRow( - rows: NormalizedModelCatalogRow[], - expected: { name: string; source: ModelCatalogSource }, -) { - expect(rows).toHaveLength(1); - const [selected] = rows; - if (!selected) { - throw new Error("missing selected catalog row"); - } - expect(selected.name).toBe(expected.name); - expect(selected.source).toBe(expected.source); -} - -describe("model catalog authority", () => { - it("keeps user config above manifest, cache, and provider-index preview rows", () => { - expectSelectedRow( - mergeModelCatalogRowsByAuthority([ - row("provider-index", "Preview"), - row("cache", "Cached"), - row("manifest", "Manifest"), - row("config", "Configured"), - ]), - { name: "Configured", source: "config" }, - ); - }); - - it("keeps installed manifest rows above cache and provider-index preview rows", () => { - expectSelectedRow( - mergeModelCatalogRowsByAuthority([ - row("provider-index", "Preview"), - row("runtime-refresh", "Refreshed"), - row("cache", "Cached"), - row("manifest", "Manifest"), - ]), - { name: "Manifest", source: "manifest" }, - ); - }); - - it("uses cache rows above provider-index preview rows", () => { - expectSelectedRow( - mergeModelCatalogRowsByAuthority([row("provider-index", "Preview"), row("cache", "Cached")]), - { name: "Cached", source: "cache" }, - ); - }); - - it("uses provider-index preview rows when no higher-authority row exists", () => { - expectSelectedRow(mergeModelCatalogRowsByAuthority([row("provider-index", "Preview")]), { - name: "Preview", - source: "provider-index", - }); - }); -}); diff --git a/src/model-catalog/authority.ts b/src/model-catalog/authority.ts deleted file mode 100644 index e4b96bf345d5..000000000000 --- a/src/model-catalog/authority.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Model-catalog authority merging chooses the strongest source for duplicate provider/model rows. -import type { - ModelCatalogSource, - NormalizedModelCatalogRow, -} from "@openclaw/model-catalog-core/model-catalog-types"; - -// Source authority decides which duplicate catalog row survives when providers, -// manifests, config, and cache all describe the same provider/model merge key. -const MODEL_CATALOG_SOURCE_AUTHORITY: Readonly> = { - config: 0, - manifest: 1, - cache: 2, - "runtime-refresh": 2, - "provider-index": 3, -}; - -function compareModelCatalogSourceAuthority( - left: ModelCatalogSource, - right: ModelCatalogSource, -): number { - return MODEL_CATALOG_SOURCE_AUTHORITY[left] - MODEL_CATALOG_SOURCE_AUTHORITY[right]; -} - -export function mergeModelCatalogRowsByAuthority( - rows: Iterable, -): NormalizedModelCatalogRow[] { - const byMergeKey = new Map(); - for (const row of rows) { - const existing = byMergeKey.get(row.mergeKey); - // Lower numeric authority wins: explicit config beats manifest/runtime - // discovery, while provider-index preview data is the weakest source. - if (!existing || compareModelCatalogSourceAuthority(row.source, existing.source) < 0) { - byMergeKey.set(row.mergeKey, row); - } - } - return [...byMergeKey.values()].toSorted( - (left, right) => left.provider.localeCompare(right.provider) || left.id.localeCompare(right.id), - ); -} diff --git a/src/model-catalog/index.ts b/src/model-catalog/index.ts index 1d1f3a7dd75c..3f87ce3613bf 100644 --- a/src/model-catalog/index.ts +++ b/src/model-catalog/index.ts @@ -1,6 +1,5 @@ // Public model-catalog facade. Keep exports here curated so callers use the // normalized planning APIs instead of reaching into provider-index internals. -export { mergeModelCatalogRowsByAuthority } from "./authority.js"; export { loadOpenClawProviderIndex } from "./provider-index/index.js"; export { planManifestModelCatalogRows, @@ -8,21 +7,4 @@ export { } from "./manifest-planner.js"; export { planProviderIndexModelCatalogRows } from "./provider-index-planner.js"; export type { ManifestModelCatalogSuppressionEntry } from "./manifest-planner.js"; -export type { - ModelCatalog, - ModelCatalogAlias, - ModelCatalogCost, - ModelCatalogDiscovery, - ModelCatalogInput, - ModelCatalogModel, - ModelCatalogProvider, - ModelCatalogSource, - ModelCatalogStatus, - ModelCatalogSuppression, - ModelCatalogTieredCost, - NormalizedModelCatalogRow, - UnifiedModelCatalogEntry, - UnifiedModelCatalogKind, - UnifiedModelCatalogSource, -} from "@openclaw/model-catalog-core/model-catalog-types"; export type { OpenClawProviderIndexProvider } from "./provider-index/index.js"; diff --git a/src/model-catalog/provider-index/index.ts b/src/model-catalog/provider-index/index.ts index 92df8c2a287d..d2a3a92e9190 100644 --- a/src/model-catalog/provider-index/index.ts +++ b/src/model-catalog/provider-index/index.ts @@ -1,10 +1,3 @@ // Provider-index public facade for normalized provider discovery metadata. export { loadOpenClawProviderIndex } from "./load.js"; -export { normalizeOpenClawProviderIndex } from "./normalize.js"; -export type { - OpenClawProviderIndex, - OpenClawProviderIndexPluginInstall, - OpenClawProviderIndexPlugin, - OpenClawProviderIndexProviderAuthChoice, - OpenClawProviderIndexProvider, -} from "./types.js"; +export type { OpenClawProviderIndex, OpenClawProviderIndexProvider } from "./types.js"; diff --git a/src/model-catalog/provider-index/normalize.test.ts b/src/model-catalog/provider-index/normalize.test.ts index d292512d7812..9a6bfc3892d2 100644 --- a/src/model-catalog/provider-index/normalize.test.ts +++ b/src/model-catalog/provider-index/normalize.test.ts @@ -1,6 +1,7 @@ // Provider-index normalization tests cover preview catalogs, install metadata, auth choices, and malformed input. import { describe, expect, it } from "vitest"; -import { loadOpenClawProviderIndex, normalizeOpenClawProviderIndex } from "./index.js"; +import { loadOpenClawProviderIndex } from "./index.js"; +import { normalizeOpenClawProviderIndex } from "./normalize.js"; describe("OpenClaw provider index", () => { it("normalizes provider preview catalog rows through model catalog validation", () => { diff --git a/src/music-generation/live-test-helpers.ts b/src/music-generation/live-test-helpers.ts index 1582d295920b..6fdbb3c27942 100644 --- a/src/music-generation/live-test-helpers.ts +++ b/src/music-generation/live-test-helpers.ts @@ -1,9 +1,6 @@ // Live-test helpers for music generation provider configuration. import type { OpenClawConfig } from "../config/types.js"; import { - parseLiveCsvFilter, - parseProviderModelMap, - redactLiveApiKey, resolveConfiguredLiveProviderModels, resolveLiveAuthStore, } from "../media-generation/live-test-helpers.js"; @@ -14,7 +11,6 @@ import { * This module adapts the shared media live-test parsing/auth helpers to the * music-generation config key and default provider model list. */ -export { parseProviderModelMap, redactLiveApiKey }; /** Default live model refs used when a provider is enabled but not explicitly mapped. */ export const DEFAULT_LIVE_MUSIC_MODELS: Record = { @@ -24,11 +20,6 @@ export const DEFAULT_LIVE_MUSIC_MODELS: Record = { openrouter: "openrouter/google/lyria-3-pro-preview", }; -/** Parse a comma-separated provider/model filter for live music tests. */ -export function parseCsvFilter(raw?: string): Set | null { - return parseLiveCsvFilter(raw); -} - /** Resolve configured provider/model refs from the musicGenerationModel defaults. */ export function resolveConfiguredLiveMusicModels(cfg: OpenClawConfig): Map { return resolveConfiguredLiveProviderModels(cfg.agents?.defaults?.musicGenerationModel); diff --git a/src/music-generation/runtime.test.ts b/src/music-generation/runtime.test.ts index 4366d0fb1208..81623d412e06 100644 --- a/src/music-generation/runtime.test.ts +++ b/src/music-generation/runtime.test.ts @@ -1,10 +1,10 @@ // Tests music generation runtime dispatch and provider fallback behavior. import { beforeEach, describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../config/types.js"; +import type { GenerateMusicParams } from "./runtime-types.js"; import { generateMusic, listRuntimeMusicGenerationProviders, - type GenerateMusicParams, type MusicGenerationRuntimeDeps, } from "./runtime.js"; import type { MusicGenerationProvider } from "./types.js"; diff --git a/src/music-generation/runtime.ts b/src/music-generation/runtime.ts index b9533866ab7d..2a3b44ff6059 100644 --- a/src/music-generation/runtime.ts +++ b/src/music-generation/runtime.ts @@ -34,8 +34,6 @@ export type MusicGenerationRuntimeDeps = { log?: Pick; }; -export type { GenerateMusicParams, GenerateMusicRuntimeResult } from "./runtime-types.js"; - /** List runtime-visible music generation providers for a config snapshot. */ export function listRuntimeMusicGenerationProviders( params?: { config?: OpenClawConfig }, diff --git a/src/node-host/invoke.sanitize-env.test.ts b/src/node-host/invoke.sanitize-env.test.ts index 8c5b912db8bd..fd695e6eceac 100644 --- a/src/node-host/invoke.sanitize-env.test.ts +++ b/src/node-host/invoke.sanitize-env.test.ts @@ -3,7 +3,8 @@ import { describe, expect, it } from "vitest"; import { parseWindowsCodePage } from "../infra/windows-encoding.js"; import { withEnv } from "../test-utils/env.js"; import { decodeCapturedOutputBuffer, sanitizeEnv } from "./invoke.js"; -import { buildNodeEventParams, buildNodeInvokeResultParams } from "./runner.js"; +import { buildNodeEventParams } from "./invoke.js"; +import { buildNodeInvokeResultParams } from "./runner.js"; describe("node-host sanitizeEnv", () => { it("ignores PATH overrides", () => { diff --git a/src/node-host/invoke.ts b/src/node-host/invoke.ts index 62a5c9174418..1cb05bcc9cfb 100644 --- a/src/node-host/invoke.ts +++ b/src/node-host/invoke.ts @@ -946,7 +946,7 @@ function serializedJsonBytes(value: unknown): number { } /** Keeps MCP text/image content while bounding text sent through node.invoke. */ -export function boundMcpToolResultPayload(result: { +function boundMcpToolResultPayload(result: { content: readonly unknown[]; structuredContent?: Record; }): { content: McpInvokeContentBlock[]; structuredContent?: Record } { diff --git a/src/node-host/runner.ts b/src/node-host/runner.ts index e7c95ec93649..dd7f87e2204a 100644 --- a/src/node-host/runner.ts +++ b/src/node-host/runner.ts @@ -20,7 +20,6 @@ import { coerceNodeInvokePayload, buildNodeInvokeResultParams } from "./invoke.j import { prepareNodeHostRuntime, type NodeHostInventory } from "./runtime.js"; export { buildNodeInvokeResultParams }; -export { buildNodeEventParams } from "./invoke.js"; type NodeHostRunOptions = { gatewayHost: string; diff --git a/src/pairing/pairing-store-sqlite.test-helpers.ts b/src/pairing/pairing-store-sqlite.test-helpers.ts new file mode 100644 index 000000000000..a9ab678a8a2d --- /dev/null +++ b/src/pairing/pairing-store-sqlite.test-helpers.ts @@ -0,0 +1,27 @@ +import { runOpenClawStateWriteTransaction } from "../state/openclaw-state-db.js"; +import { + readChannelPairingState, + sqliteOptionsForEnv, + writeChannelPairingStateToDatabase, +} from "./pairing-store-sqlite.js"; +import type { PairingChannel } from "./pairing-store.types.js"; + +type ChannelPairingState = ReturnType; + +export function readChannelPairingStateSnapshot( + channel: PairingChannel, + env: NodeJS.ProcessEnv = process.env, +): ChannelPairingState { + return readChannelPairingState(channel, env); +} + +export function writeChannelPairingStateSnapshot( + channel: PairingChannel, + state: ChannelPairingState, + env: NodeJS.ProcessEnv = process.env, +): void { + runOpenClawStateWriteTransaction( + (database) => writeChannelPairingStateToDatabase(database, channel, state), + sqliteOptionsForEnv(env), + ); +} diff --git a/src/pairing/pairing-store-sqlite.ts b/src/pairing/pairing-store-sqlite.ts index cf567ba2a53c..4716de83a131 100644 --- a/src/pairing/pairing-store-sqlite.ts +++ b/src/pairing/pairing-store-sqlite.ts @@ -24,7 +24,7 @@ type PairingDatabase = Pick< "channel_pairing_allow_entries" | "channel_pairing_requests" >; -export type ChannelPairingState = { +type ChannelPairingState = { version: 1; requests: PairingRequest[]; allowFrom?: Record; @@ -202,24 +202,6 @@ export function writeChannelPairingStateToDatabase( } } -export function readChannelPairingStateSnapshot( - channel: PairingChannel, - env: NodeJS.ProcessEnv = process.env, -): ChannelPairingState { - return readChannelPairingState(channel, env); -} - -export function writeChannelPairingStateSnapshot( - channel: PairingChannel, - state: ChannelPairingState, - env: NodeJS.ProcessEnv = process.env, -): void { - runOpenClawStateWriteTransaction( - (database) => writeChannelPairingStateToDatabase(database, channel, state), - sqliteOptionsForEnv(env), - ); -} - export function updateChannelPairingStateSnapshot( channel: PairingChannel, env: NodeJS.ProcessEnv, diff --git a/src/pairing/pairing-store.test.ts b/src/pairing/pairing-store.test.ts index 33b56be66c34..abe6cb4aabcd 100644 --- a/src/pairing/pairing-store.test.ts +++ b/src/pairing/pairing-store.test.ts @@ -25,7 +25,7 @@ vi.mock("../channels/plugins/pairing.js", () => ({ import { readChannelPairingStateSnapshot, writeChannelPairingStateSnapshot, -} from "./pairing-store-sqlite.js"; +} from "./pairing-store-sqlite.test-helpers.js"; import { addChannelAllowFromStoreEntry, approveChannelPairingCode, diff --git a/src/pairing/setup-code.ts b/src/pairing/setup-code.ts index 08ebe955f953..a5f236f89bb8 100644 --- a/src/pairing/setup-code.ts +++ b/src/pairing/setup-code.ts @@ -34,7 +34,7 @@ import { resolveTailscalePublishedHost, } from "../shared/tailscale-status.js"; -export type PairingSetupPayload = { +type PairingSetupPayload = { url: string; urls?: string[]; bootstrapToken: string; @@ -42,18 +42,18 @@ export type PairingSetupPayload = { const PAIRING_SETUP_MAX_URLS = 8; -export type PairingSetupCommandResult = { +type PairingSetupCommandResult = { code: number | null; stdout: string; stderr?: string; }; -export type PairingSetupCommandRunner = ( +type PairingSetupCommandRunner = ( argv: string[], opts: { timeoutMs: number; maxOutputBytes?: number }, ) => Promise; -export type ResolvePairingSetupOptions = { +type ResolvePairingSetupOptions = { env?: NodeJS.ProcessEnv; publicUrl?: string; preferRemoteUrl?: boolean; @@ -64,7 +64,7 @@ export type ResolvePairingSetupOptions = { networkInterfaces?: () => ReturnType; }; -export type PairingSetupResolution = +type PairingSetupResolution = | { ok: true; payload: PairingSetupPayload; diff --git a/src/plugin-sdk/delivery-queue-runtime.test.ts b/src/plugin-sdk/delivery-queue-runtime.test.ts index 59ac56224d8f..ca90469d2f63 100644 --- a/src/plugin-sdk/delivery-queue-runtime.test.ts +++ b/src/plugin-sdk/delivery-queue-runtime.test.ts @@ -6,9 +6,9 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import { getActiveGatewayRootWorkCount, resetGatewayWorkAdmission, - runWithGatewayRootWorkAdmission, tryBeginGatewaySuspendAdmission, } from "../process/gateway-work-admission.js"; +import { runWithGatewayRootWorkAdmissionForTest } from "../process/gateway-work-admission.test-helpers.js"; const mocks = vi.hoisted(() => ({ coreDrainPendingDeliveries: vi.fn(async () => {}), @@ -91,7 +91,7 @@ describe("plugin-sdk delivery queue drainPendingDeliveries", () => { }); const deliver = vi.fn(async () => []); - await runWithGatewayRootWorkAdmission(async () => { + await runWithGatewayRootWorkAdmissionForTest(async () => { expect(getActiveGatewayRootWorkCount()).toBe(1); const pending = drainPendingDeliveries({ drainKey: "demo:test", diff --git a/src/plugin-state/plugin-state-store.e2e.test.ts b/src/plugin-state/plugin-state-store.e2e.test.ts index 3bbad1ec5fc6..8b3caca2391d 100644 --- a/src/plugin-state/plugin-state-store.e2e.test.ts +++ b/src/plugin-state/plugin-state-store.e2e.test.ts @@ -6,10 +6,10 @@ import { withOpenClawTestState } from "../test-utils/openclaw-test-state.js"; import { closePluginStateDatabase, createPluginStateKeyedStore, - probePluginStateStore, resetPluginStateStoreForTests, sweepExpiredPluginStateEntries, } from "./plugin-state-store.js"; +import { probePluginStateStore } from "./plugin-state-store.sqlite.js"; afterEach(() => { vi.useRealTimers(); diff --git a/src/plugin-state/plugin-state-store.test.ts b/src/plugin-state/plugin-state-store.test.ts index 8913e000318f..a105e523ad7d 100644 --- a/src/plugin-state/plugin-state-store.test.ts +++ b/src/plugin-state/plugin-state-store.test.ts @@ -16,13 +16,15 @@ import { createCorePluginStateSyncKeyedStore, createPluginStateKeyedStore, createPluginStateSyncKeyedStore, - PluginStateStoreError, - probePluginStateStore, resetPluginStateStoreForTests, - setMaxPluginStateEntriesPerPluginForTests, sweepExpiredPluginStateEntries, } from "./plugin-state-store.js"; +import { + probePluginStateStore, + setMaxPluginStateEntriesPerPluginForTests, +} from "./plugin-state-store.sqlite.js"; import { seedPluginStateEntriesForTests } from "./plugin-state-store.test-helpers.js"; +import { PluginStateStoreError } from "./plugin-state-store.types.js"; let testState: OpenClawTestState | undefined; diff --git a/src/plugin-state/plugin-state-store.ts b/src/plugin-state/plugin-state-store.ts index cf814b83204c..ad02ce98d076 100644 --- a/src/plugin-state/plugin-state-store.ts +++ b/src/plugin-state/plugin-state-store.ts @@ -23,27 +23,22 @@ import type { } from "./plugin-state-store.types.js"; import { PluginStateStoreError } from "./plugin-state-store.types.js"; +// Public plugin-state facade over the sqlite-backed store. It validates plugin +// ids, namespaces, JSON values, TTLs, and per-plugin limits before persistence. // Public plugin-state facade over the sqlite-backed store. It validates plugin // ids, namespaces, JSON values, TTLs, and per-plugin limits before persistence. export type { OpenKeyedStoreOptions, PluginStateEntry, PluginStateKeyedStore, - PluginStateOverflowPolicy, PluginStateSyncKeyedStore, - PluginStateStoreErrorCode, - PluginStateStoreOperation, - PluginStateStoreProbeResult, - PluginStateStoreProbeStep, } from "./plugin-state-store.types.js"; -export { PluginStateStoreError } from "./plugin-state-store.types.js"; + export { closePluginStateDatabase, countPluginStateLiveEntries, isPluginStateDatabaseOpen, MAX_PLUGIN_STATE_ENTRIES_PER_PLUGIN, - probePluginStateStore, - setMaxPluginStateEntriesPerPluginForTests, sweepExpiredPluginStateEntries, } from "./plugin-state-store.sqlite.js"; diff --git a/src/plugin-state/plugin-state-store.types.ts b/src/plugin-state/plugin-state-store.types.ts index 3431173c773a..abcac4be874a 100644 --- a/src/plugin-state/plugin-state-store.types.ts +++ b/src/plugin-state/plugin-state-store.types.ts @@ -73,7 +73,7 @@ export type PluginStateStoreOperation = | "probe" | "close"; -export type PluginStateStoreErrorOptions = { +type PluginStateStoreErrorOptions = { code: PluginStateStoreErrorCode; operation: PluginStateStoreOperation; path?: string; diff --git a/src/plugin-state/runtime-health-store.ts b/src/plugin-state/runtime-health-store.ts index 949c091a35c9..8aa524555dec 100644 --- a/src/plugin-state/runtime-health-store.ts +++ b/src/plugin-state/runtime-health-store.ts @@ -19,7 +19,7 @@ export type RuntimeHealthRecordEnvelope = { // PID) can never match records written by its predecessor. const currentProcessToken = randomUUID(); -export type RuntimeHealthStoreOptions = { +type RuntimeHealthStoreOptions = { ownerId: `core:${string}`; namespace: string; maxEntries: number; @@ -33,7 +33,7 @@ export type RuntimeHealthStoreOptions = { pick: "earliest" | "latest"; }; -export type RuntimeHealthStore = { +type RuntimeHealthStore = { /** Persists a record under the key, overwriting any prior value. */ register(key: string, record: T): void; /** One record per display group, restricted to live recorder processes. */ diff --git a/src/plugins/runtime/runtime-task-test-harness.ts b/src/plugins/runtime/runtime-task-test-harness.ts index 2dcdd65469e2..0cda4e9b4a36 100644 --- a/src/plugins/runtime/runtime-task-test-harness.ts +++ b/src/plugins/runtime/runtime-task-test-harness.ts @@ -2,13 +2,13 @@ import { vi } from "vitest"; import { resetDetachedTaskLifecycleRuntimeForTests } from "../../tasks/detached-task-runtime.js"; import { + resetTaskFlowRegistryForTests, resetTaskRegistryControlRuntimeForTests, resetTaskRegistryDeliveryRuntimeForTests, resetTaskRegistryForTests, setTaskRegistryControlRuntimeForTests, setTaskRegistryDeliveryRuntimeForTests, -} from "../../tasks/runtime-internal.js"; -import { resetTaskFlowRegistryForTests } from "../../tasks/task-flow-runtime-internal.js"; +} from "../../tasks/task-runtime.test-helpers.js"; const runtimeTaskMocks = vi.hoisted(() => ({ sendMessageMock: vi.fn(), diff --git a/src/process/child-process-bridge.ts b/src/process/child-process-bridge.ts index 6ce80cec1d9b..8aa5c699a732 100644 --- a/src/process/child-process-bridge.ts +++ b/src/process/child-process-bridge.ts @@ -3,7 +3,7 @@ import type { ChildProcess } from "node:child_process"; import process from "node:process"; /** Signal forwarding options for a child process bridge. */ -export type ChildProcessBridgeOptions = { +type ChildProcessBridgeOptions = { signals?: NodeJS.Signals[]; onSignal?: (signal: NodeJS.Signals) => void; }; diff --git a/src/process/gateway-work-admission.test-helpers.ts b/src/process/gateway-work-admission.test-helpers.ts new file mode 100644 index 000000000000..f9e281205301 --- /dev/null +++ b/src/process/gateway-work-admission.test-helpers.ts @@ -0,0 +1,10 @@ +import { beginGatewayRootWorkAdmissionWhenOpen } from "./gateway-work-admission.js"; + +export async function runWithGatewayRootWorkAdmissionForTest(run: () => Promise): Promise { + const admission = await beginGatewayRootWorkAdmissionWhenOpen(); + try { + return await admission.run(run); + } finally { + admission.release(); + } +} diff --git a/src/process/gateway-work-admission.test.ts b/src/process/gateway-work-admission.test.ts index 291b90a60c0e..c808112f7256 100644 --- a/src/process/gateway-work-admission.test.ts +++ b/src/process/gateway-work-admission.test.ts @@ -10,11 +10,11 @@ import { retainGatewayRootWorkAdmissionContinuation, resetGatewayWorkAdmission, runWithGatewayIndependentRootWorkContinuation, - runWithGatewayRootWorkAdmission, tryBeginGatewayRootWorkAdmission, tryBeginGatewaySuspendAdmission, waitForActiveGatewayRootWork, } from "./gateway-work-admission.js"; +import { runWithGatewayRootWorkAdmissionForTest } from "./gateway-work-admission.test-helpers.js"; beforeEach(resetGatewayWorkAdmission); afterEach(resetGatewayWorkAdmission); @@ -199,7 +199,7 @@ it("defers required internal root work until suspension reopens", async () => { const suspension = tryBeginGatewaySuspendAdmission(() => {}); expect(suspension?.commit()).toBe(true); const entered = vi.fn(); - const pending = runWithGatewayRootWorkAdmission(async () => { + const pending = runWithGatewayRootWorkAdmissionForTest(async () => { entered(); expect(getActiveGatewayRootWorkCount()).toBe(1); }); @@ -237,7 +237,7 @@ it("retires surviving root records across an in-process reset", async () => { it("does not wake deferred internal work into a restart drain", async () => { const suspension = tryBeginGatewaySuspendAdmission(() => {}); expect(suspension?.commit()).toBe(true); - const pending = runWithGatewayRootWorkAdmission(async () => {}); + const pending = runWithGatewayRootWorkAdmissionForTest(async () => {}); markGatewayRestartDraining(); diff --git a/src/process/gateway-work-admission.ts b/src/process/gateway-work-admission.ts index 12df69c9c02e..0cbba648352b 100644 --- a/src/process/gateway-work-admission.ts +++ b/src/process/gateway-work-admission.ts @@ -2,7 +2,7 @@ import { AsyncLocalStorage } from "node:async_hooks"; import { resolveGlobalSingleton } from "../shared/global-singleton.js"; -export type GatewaySuspendAdmissionPhase = "accepting" | "preparing" | "prepared"; +type GatewaySuspendAdmissionPhase = "accepting" | "preparing" | "prepared"; export class GatewayDrainingError extends Error { constructor() { @@ -44,13 +44,13 @@ const GATEWAY_WORK_ADMISSION_STATE = resolveGlobalSingleton( }), ); -export type GatewayRootWorkAdmissionLease = { +type GatewayRootWorkAdmissionLease = { ownsRoot: boolean; release: () => void; run: (run: () => Promise) => Promise; }; -export type GatewaySuspendAdmissionLease = { +type GatewaySuspendAdmissionLease = { commit: () => boolean; rollback: () => boolean; release: () => boolean; @@ -244,15 +244,6 @@ export async function beginGatewayRootWorkAdmissionWhenOpen(): Promise(run: () => Promise): Promise { - const admission = await beginGatewayRootWorkAdmissionWhenOpen(); - try { - return await admission.run(run); - } finally { - admission.release(); - } -} - export async function runWithGatewayIndependentRootWorkAdmission( run: () => Promise, ): Promise { diff --git a/src/process/linux-oom-score.test.ts b/src/process/linux-oom-score.test.ts index b948b796b4fe..4a1daee91cdb 100644 --- a/src/process/linux-oom-score.test.ts +++ b/src/process/linux-oom-score.test.ts @@ -1,60 +1,9 @@ // Linux OOM score tests cover best-effort process OOM score adjustment. import { describe, expect, it } from "vitest"; -import { - hardenedEnvForChildOomWrap, - prepareOomScoreAdjustedSpawn, - wrapArgvForChildOomScoreRaise, -} from "./linux-oom-score.js"; +import { prepareOomScoreAdjustedSpawn } from "./linux-oom-score.js"; -const argv = ["/usr/bin/node", "--max-old-space-size=256", "run.js", "arg with spaces"]; const wrapScript = 'echo 1000 > /proc/self/oom_score_adj 2>/dev/null; exec "$0" "$@"'; const linux = { platform: "linux", env: {}, shellAvailable: () => true } as const; -const linuxNoShell = { platform: "linux", env: {}, shellAvailable: () => false } as const; - -describe("wrapArgvForChildOomScoreRaise", () => { - it("wraps argv on linux with default env", () => { - const result = wrapArgvForChildOomScoreRaise(argv, linux); - expect(result.slice(0, 3)).toEqual(["/bin/sh", "-c", wrapScript]); - expect(result.slice(3)).toEqual(argv); - }); - - it("returns argv unchanged on non-linux platforms", () => { - for (const platform of ["darwin", "win32", "freebsd"] as const) { - expect( - wrapArgvForChildOomScoreRaise(argv, { platform, env: {}, shellAvailable: () => true }), - ).toEqual(argv); - } - }); - - it("respects the OPENCLAW_CHILD_OOM_SCORE_ADJ opt-out", () => { - for (const value of ["0", "false", "FALSE", "no", "off"]) { - expect( - wrapArgvForChildOomScoreRaise(argv, { - ...linux, - env: { OPENCLAW_CHILD_OOM_SCORE_ADJ: value }, - }), - ).toEqual(argv); - } - }); - - it("skips wrap when /bin/sh is unavailable (distroless/scratch)", () => { - expect(wrapArgvForChildOomScoreRaise(argv, linuxNoShell)).toEqual(argv); - }); - - it("does not double-wrap already-wrapped argv", () => { - const once = wrapArgvForChildOomScoreRaise(argv, linux); - const twice = wrapArgvForChildOomScoreRaise(once, linux); - expect(twice).toEqual(once); - }); - - it("returns empty argv unchanged", () => { - expect(wrapArgvForChildOomScoreRaise([], linux)).toStrictEqual([]); - }); - - it("skips wrap for command names that exec could parse as options", () => { - expect(wrapArgvForChildOomScoreRaise(["-p", "node"], linux)).toEqual(["-p", "node"]); - }); -}); describe("prepareOomScoreAdjustedSpawn", () => { it("returns command, args, and hardened env when wrap applies", () => { @@ -85,22 +34,47 @@ describe("prepareOomScoreAdjustedSpawn", () => { wrapped: false, }); }); -}); -describe("hardenedEnvForChildOomWrap", () => { - const tainted = { PATH: "/usr/bin", BASH_ENV: "/tmp/evil.sh", ENV: "/tmp/evil", CDPATH: "/tmp" }; + it.each(["0", "false", "FALSE", "no", "off"])( + "respects the OPENCLAW_CHILD_OOM_SCORE_ADJ=%s opt-out", + (value) => { + expect( + prepareOomScoreAdjustedSpawn("/usr/bin/node", ["run.js"], { + ...linux, + env: { OPENCLAW_CHILD_OOM_SCORE_ADJ: value }, + }), + ).toMatchObject({ command: "/usr/bin/node", args: ["run.js"], wrapped: false }); + }, + ); - it("strips shell-init keys when wrap applies", () => { - expect(hardenedEnvForChildOomWrap(tainted, linux)).toEqual({ PATH: "/usr/bin" }); + it("skips wrapping when the shell is unavailable", () => { + expect( + prepareOomScoreAdjustedSpawn("/usr/bin/node", ["run.js"], { + ...linux, + shellAvailable: () => false, + }), + ).toMatchObject({ command: "/usr/bin/node", args: ["run.js"], wrapped: false }); }); - it("preserves baseEnv (including undefined) when wrap does not apply", () => { - expect(hardenedEnvForChildOomWrap(tainted, linuxNoShell)).toBe(tainted); + it("does not double-wrap an adjusted command", () => { expect( - hardenedEnvForChildOomWrap(undefined, { platform: "darwin", shellAvailable: () => true }), - ).toBeUndefined(); - expect( - hardenedEnvForChildOomWrap(tainted, { ...linux, env: { OPENCLAW_CHILD_OOM_SCORE_ADJ: "0" } }), - ).toBe(tainted); + prepareOomScoreAdjustedSpawn("/bin/sh", ["-c", wrapScript, "/usr/bin/node", "run.js"], { + ...linux, + env: { PATH: "/usr/bin", BASH_ENV: "/tmp/bashenv" }, + }), + ).toEqual({ + command: "/bin/sh", + args: ["-c", wrapScript, "/usr/bin/node", "run.js"], + env: { PATH: "/usr/bin" }, + wrapped: true, + }); + }); + + it("does not pass command names that look like shell options to exec", () => { + expect(prepareOomScoreAdjustedSpawn("-p", ["node"], linux)).toMatchObject({ + command: "-p", + args: ["node"], + wrapped: false, + }); }); }); diff --git a/src/process/linux-oom-score.ts b/src/process/linux-oom-score.ts index 97b23de293d2..b0619125195b 100644 --- a/src/process/linux-oom-score.ts +++ b/src/process/linux-oom-score.ts @@ -115,30 +115,3 @@ export function prepareOomScoreAdjustedSpawn( wrapped: true, }; } - -export function wrapArgvForChildOomScoreRaise( - argv: readonly string[], - options?: OomWrapOptions, -): string[] { - const copy = [...argv]; - if (copy.length === 0) { - return copy; - } - const spawn = prepareOomScoreAdjustedSpawn(copy[0] ?? "", copy.slice(1), options); - return [spawn.command, ...spawn.args]; -} - -/** - * Returns `baseEnv` with shell-init keys stripped when argv will be wrapped. - * Unchanged (including `undefined`) when no wrap applies, so non-Linux and - * opted-out paths keep exact inherited-env semantics. - */ -export function hardenedEnvForChildOomWrap( - baseEnv: NodeJS.ProcessEnv | undefined, - options?: OomWrapOptions, -): NodeJS.ProcessEnv | undefined { - if (!shouldWrapChildForOomScore(options)) { - return baseEnv; - } - return hardenShellEnv(baseEnv); -} diff --git a/src/process/supervisor/adapters/child.ts b/src/process/supervisor/adapters/child.ts index 3b0db3fe91ce..2adac1357224 100644 --- a/src/process/supervisor/adapters/child.ts +++ b/src/process/supervisor/adapters/child.ts @@ -65,7 +65,7 @@ function resolveChildInvocation(params: { }; } -export type ChildAdapter = SpawnProcessAdapter; +type ChildAdapter = SpawnProcessAdapter; function isServiceManagedRuntime(): boolean { return Boolean(process.env.OPENCLAW_SERVICE_MARKER?.trim()); diff --git a/src/process/supervisor/adapters/pty.ts b/src/process/supervisor/adapters/pty.ts index 397f9a18195d..40c31541ad50 100644 --- a/src/process/supervisor/adapters/pty.ts +++ b/src/process/supervisor/adapters/pty.ts @@ -35,7 +35,7 @@ type PtyModule = { }; }; -export type PtyAdapter = SpawnProcessAdapter; +type PtyAdapter = SpawnProcessAdapter; const loadPtyModule = createLazyRuntimeModule( () => import("@lydell/node-pty") as Promise as Promise, diff --git a/src/process/supervisor/index.ts b/src/process/supervisor/index.ts index b9d80f85b5ef..d444b4943c01 100644 --- a/src/process/supervisor/index.ts +++ b/src/process/supervisor/index.ts @@ -13,13 +13,4 @@ export function getProcessSupervisor(): ProcessSupervisor { return singleton; } -export { createProcessSupervisor } from "./supervisor.js"; -export type { - ManagedRun, - ProcessSupervisor, - RunExit, - RunRecord, - RunState, - SpawnInput, - TerminationReason, -} from "./types.js"; +export type { ManagedRun, ProcessSupervisor } from "./types.js"; diff --git a/src/proxy-capture/env.ts b/src/proxy-capture/env.ts index d1a829185841..5f3f0aef5fda 100644 --- a/src/proxy-capture/env.ts +++ b/src/proxy-capture/env.ts @@ -12,14 +12,14 @@ import { // Environment contract for debug proxy capture. These vars are passed to child // processes and provider transports so capture sessions share one store/proxy. export const OPENCLAW_DEBUG_PROXY_ENABLED = "OPENCLAW_DEBUG_PROXY_ENABLED"; -export const OPENCLAW_DEBUG_PROXY_URL = "OPENCLAW_DEBUG_PROXY_URL"; +const OPENCLAW_DEBUG_PROXY_URL = "OPENCLAW_DEBUG_PROXY_URL"; /** @deprecated Capture storage now lives in the shared state database. */ -export const OPENCLAW_DEBUG_PROXY_DB_PATH = "OPENCLAW_DEBUG_PROXY_DB_PATH"; +const OPENCLAW_DEBUG_PROXY_DB_PATH = "OPENCLAW_DEBUG_PROXY_DB_PATH"; /** @deprecated Capture payloads now live in the shared state database. */ -export const OPENCLAW_DEBUG_PROXY_BLOB_DIR = "OPENCLAW_DEBUG_PROXY_BLOB_DIR"; -export const OPENCLAW_DEBUG_PROXY_CERT_DIR = "OPENCLAW_DEBUG_PROXY_CERT_DIR"; +const OPENCLAW_DEBUG_PROXY_BLOB_DIR = "OPENCLAW_DEBUG_PROXY_BLOB_DIR"; +const OPENCLAW_DEBUG_PROXY_CERT_DIR = "OPENCLAW_DEBUG_PROXY_CERT_DIR"; export const OPENCLAW_DEBUG_PROXY_SESSION_ID = "OPENCLAW_DEBUG_PROXY_SESSION_ID"; -export const OPENCLAW_DEBUG_PROXY_REQUIRE = "OPENCLAW_DEBUG_PROXY_REQUIRE"; +const OPENCLAW_DEBUG_PROXY_REQUIRE = "OPENCLAW_DEBUG_PROXY_REQUIRE"; export type DebugProxySettings = { enabled: boolean; diff --git a/src/proxy-capture/store.sqlite.ts b/src/proxy-capture/store.sqlite.ts index 569654b366db..02f05ad7985e 100644 --- a/src/proxy-capture/store.sqlite.ts +++ b/src/proxy-capture/store.sqlite.ts @@ -30,7 +30,7 @@ import type { } from "./types.js"; // Capture rows and compressed payload BLOBs live in the shared global state DB. -export type DebugProxyCaptureStoreOptions = { +type DebugProxyCaptureStoreOptions = { env?: NodeJS.ProcessEnv; }; @@ -792,11 +792,11 @@ export type DebugProxyCaptureStore = Omit & { +type LegacyDebugProxyCaptureStore = Omit & { persistPayload(data: Buffer, contentType?: string): CaptureBlobRecord; }; -export type SharedDebugProxyCaptureStore = Omit & { +type SharedDebugProxyCaptureStore = Omit & { persistPayload(data: Buffer, contentType?: string): SharedCaptureBlobRecord; }; diff --git a/src/secrets/audit.ts b/src/secrets/audit.ts index 361966bf3ecd..911d87b3bf39 100644 --- a/src/secrets/audit.ts +++ b/src/secrets/audit.ts @@ -44,17 +44,13 @@ import { import { discoverConfigSecretTargets } from "./target-registry.js"; /** Stable finding codes emitted by `openclaw secrets audit`. */ -export type SecretsAuditCode = - | "PLAINTEXT_FOUND" - | "REF_UNRESOLVED" - | "REF_SHADOWED" - | "LEGACY_RESIDUE"; +type SecretsAuditCode = "PLAINTEXT_FOUND" | "REF_UNRESOLVED" | "REF_SHADOWED" | "LEGACY_RESIDUE"; /** Audit severity used for CLI output and check-mode exit behavior. */ -export type SecretsAuditSeverity = "info" | "warn" | "error"; // pragma: allowlist secret +type SecretsAuditSeverity = "info" | "warn" | "error"; // pragma: allowlist secret /** One secret audit finding with file/path context. */ -export type SecretsAuditFinding = { +type SecretsAuditFinding = { code: SecretsAuditCode; severity: SecretsAuditSeverity; file: string; @@ -65,10 +61,10 @@ export type SecretsAuditFinding = { }; /** Overall audit state derived from findings and unresolved refs. */ -export type SecretsAuditStatus = "clean" | "findings" | "unresolved"; // pragma: allowlist secret +type SecretsAuditStatus = "clean" | "findings" | "unresolved"; // pragma: allowlist secret /** Structured report returned by the secrets audit command. */ -export type SecretsAuditReport = { +type SecretsAuditReport = { version: 1; status: SecretsAuditStatus; resolution: { diff --git a/src/secrets/auth-profiles-scan.ts b/src/secrets/auth-profiles-scan.ts index 703c40de338d..b2998ebab6b2 100644 --- a/src/secrets/auth-profiles-scan.ts +++ b/src/secrets/auth-profiles-scan.ts @@ -3,7 +3,7 @@ import { isNonEmptyString, isRecord } from "./shared.js"; import { listAuthProfileSecretTargetEntries } from "./target-registry.js"; /** Auth-profile credential kinds that can carry SecretRef-backed values. */ -export type AuthProfileCredentialType = "api_key" | "token"; +type AuthProfileCredentialType = "api_key" | "token"; type AuthProfileFieldSpec = { valueField: string; @@ -49,7 +49,7 @@ type OauthCredentialVisit = { hasRefresh: boolean; }; -export type AuthProfileCredentialVisit = +type AuthProfileCredentialVisit = | ApiKeyCredentialVisit | TokenCredentialVisit | OauthCredentialVisit; diff --git a/src/secrets/channel-contract-api.ts b/src/secrets/channel-contract-api.ts index 4423ef665ccc..0687f086354d 100644 --- a/src/secrets/channel-contract-api.ts +++ b/src/secrets/channel-contract-api.ts @@ -63,7 +63,7 @@ function loadBundledChannelPublicArtifact( } } -export type BundledChannelSecretContractApi = Pick< +type BundledChannelSecretContractApi = Pick< BundledChannelContractApi, "collectRuntimeConfigAssignments" | "secretTargetRegistryEntries" >; @@ -231,7 +231,7 @@ export function loadChannelSecretContractApiForRecord( return loadExternalChannelSecretContractFromRecord(record); } -export type BundledChannelSecurityContractApi = Pick< +type BundledChannelSecurityContractApi = Pick< BundledChannelContractApi, "unsupportedSecretRefSurfacePatterns" | "collectUnsupportedSecretRefConfigCandidates" >; diff --git a/src/secrets/channel-env-vars.ts b/src/secrets/channel-env-vars.ts index 5a6d95afc081..5249130ef82e 100644 --- a/src/secrets/channel-env-vars.ts +++ b/src/secrets/channel-env-vars.ts @@ -3,7 +3,6 @@ import { uniqueStrings } from "@openclaw/normalization-core/string-normalization import type { OpenClawConfig } from "../config/types.openclaw.js"; import { loadPluginMetadataSnapshot } from "../plugins/plugin-metadata-snapshot.js"; import { appendUniqueEnvVarCandidates } from "../shared/env-var-candidates.js"; -export { isSafeChannelEnvVarTriggerName } from "./channel-env-var-names.js"; type ChannelEnvVarLookupParams = { /** Config snapshot used to discover enabled/installed plugin manifests. */ diff --git a/src/secrets/command-config.test.ts b/src/secrets/command-config.test.ts index fb4820d3d378..8d45aef62a18 100644 --- a/src/secrets/command-config.test.ts +++ b/src/secrets/command-config.test.ts @@ -6,9 +6,9 @@ import { TALK_TEST_PROVIDER_API_KEY_PATH, TALK_TEST_PROVIDER_API_KEY_PATH_SEGMENTS, } from "../test-utils/talk-test-provider.js"; -import { collectCommandSecretAssignmentsFromSnapshot } from "./command-config.js"; +import { analyzeCommandSecretAssignmentsFromSnapshot } from "./command-config.js"; -describe("collectCommandSecretAssignmentsFromSnapshot", () => { +describe("analyzeCommandSecretAssignmentsFromSnapshot", () => { it("returns assignments from the active runtime snapshot for configured refs", () => { const sourceConfig = buildTalkTestProviderConfig({ source: "env", @@ -17,10 +17,9 @@ describe("collectCommandSecretAssignmentsFromSnapshot", () => { }); const resolvedConfig = buildTalkTestProviderConfig("talk-key"); // pragma: allowlist secret - const result = collectCommandSecretAssignmentsFromSnapshot({ + const result = analyzeCommandSecretAssignmentsFromSnapshot({ sourceConfig, resolvedConfig, - commandName: "memory status", targetIds: new Set(["talk.providers.*.apiKey"]), }); @@ -33,7 +32,7 @@ describe("collectCommandSecretAssignmentsFromSnapshot", () => { ]); }); - it("throws when configured refs are unresolved in the snapshot", () => { + it("reports configured refs that are unresolved in the snapshot", () => { const sourceConfig = buildTalkTestProviderConfig({ source: "env", provider: "default", @@ -41,14 +40,18 @@ describe("collectCommandSecretAssignmentsFromSnapshot", () => { }); const resolvedConfig = buildTalkTestProviderConfig(undefined); - expect(() => - collectCommandSecretAssignmentsFromSnapshot({ - sourceConfig, - resolvedConfig, - commandName: "memory search", - targetIds: new Set(["talk.providers.*.apiKey"]), - }), - ).toThrow(new RegExp(`memory search: ${TALK_TEST_PROVIDER_API_KEY_PATH} is unresolved`)); + const result = analyzeCommandSecretAssignmentsFromSnapshot({ + sourceConfig, + resolvedConfig, + targetIds: new Set(["talk.providers.*.apiKey"]), + }); + + expect(result.unresolved).toEqual([ + { + path: TALK_TEST_PROVIDER_API_KEY_PATH, + pathSegments: [...TALK_TEST_PROVIDER_API_KEY_PATH_SEGMENTS], + }, + ]); }); it("skips unresolved refs that are marked inactive by runtime warnings", () => { @@ -75,10 +78,9 @@ describe("collectCommandSecretAssignmentsFromSnapshot", () => { }, } as unknown as OpenClawConfig; - const result = collectCommandSecretAssignmentsFromSnapshot({ + const result = analyzeCommandSecretAssignmentsFromSnapshot({ sourceConfig, resolvedConfig, - commandName: "memory search", targetIds: new Set(["agents.defaults.memorySearch.remote.apiKey"]), inactiveRefPaths: new Set(["agents.defaults.memorySearch.remote.apiKey"]), }); diff --git a/src/secrets/command-config.ts b/src/secrets/command-config.ts index a50bb7b3d2c1..7641984a87ab 100644 --- a/src/secrets/command-config.ts +++ b/src/secrets/command-config.ts @@ -13,12 +13,6 @@ export type CommandSecretAssignment = { value: unknown; }; -/** Resolved command assignments plus non-fatal diagnostics. */ -export type ResolveAssignmentsFromSnapshotResult = { - assignments: CommandSecretAssignment[]; - diagnostics: string[]; -}; - /** Active or inactive command target that could not be materialized. */ export type UnresolvedCommandSecretAssignment = { path: string; @@ -26,7 +20,7 @@ export type UnresolvedCommandSecretAssignment = { }; /** Full command assignment analysis before unresolved active refs are rejected. */ -export type AnalyzeAssignmentsFromSnapshotResult = { +type AnalyzeAssignmentsFromSnapshotResult = { assignments: CommandSecretAssignment[]; diagnostics: string[]; unresolved: UnresolvedCommandSecretAssignment[]; @@ -103,32 +97,3 @@ export function analyzeCommandSecretAssignmentsFromSnapshot(params: { return { assignments, diagnostics, unresolved, inactive }; } - -/** - * Returns resolved command assignments and throws when an active required ref is unresolved. - */ -export function collectCommandSecretAssignmentsFromSnapshot(params: { - sourceConfig: OpenClawConfig; - resolvedConfig: OpenClawConfig; - commandName: string; - targetIds: ReadonlySet; - inactiveRefPaths?: ReadonlySet; - allowedPaths?: ReadonlySet; -}): ResolveAssignmentsFromSnapshotResult { - const analyzed = analyzeCommandSecretAssignmentsFromSnapshot({ - sourceConfig: params.sourceConfig, - resolvedConfig: params.resolvedConfig, - targetIds: params.targetIds, - inactiveRefPaths: params.inactiveRefPaths, - allowedPaths: params.allowedPaths, - }); - if (analyzed.unresolved.length > 0) { - throw new Error( - `${params.commandName}: ${analyzed.unresolved[0]?.path ?? "target"} is unresolved in the active runtime snapshot.`, - ); - } - return { - assignments: analyzed.assignments, - diagnostics: analyzed.diagnostics, - }; -} diff --git a/src/secrets/configure-plan.test.ts b/src/secrets/configure-plan.test.ts index 2d9abbb40c38..5e3c6a21739d 100644 --- a/src/secrets/configure-plan.test.ts +++ b/src/secrets/configure-plan.test.ts @@ -6,7 +6,6 @@ import { TALK_TEST_PROVIDER_ID, } from "../test-utils/talk-test-provider.js"; import { - buildConfigureCandidates, buildConfigureCandidatesForScope, buildSecretsConfigurePlan, collectConfigureProviderChanges, @@ -17,7 +16,7 @@ import { resolveConfigSecretTargetByPath } from "./target-registry.js"; describe("secrets configure plan helpers", () => { beforeAll(() => { resolveConfigSecretTargetByPath(["channels", "telegram", "botToken"]); - buildConfigureCandidates({} as OpenClawConfig); + buildConfigureCandidatesForScope({ config: {} as OpenClawConfig }); }); it("builds configure candidates from supported configure targets", () => { @@ -36,7 +35,7 @@ describe("secrets configure plan helpers", () => { }, } as OpenClawConfig; - const candidates = buildConfigureCandidates(config); + const candidates = buildConfigureCandidatesForScope({ config }); const paths = candidates.map((entry) => entry.path); expect(paths).toContain(TALK_TEST_PROVIDER_API_KEY_PATH); expect(paths).toContain("channels.telegram.botToken"); diff --git a/src/secrets/configure-plan.ts b/src/secrets/configure-plan.ts index e7b2533bfc0a..fbcd0b589582 100644 --- a/src/secrets/configure-plan.ts +++ b/src/secrets/configure-plan.ts @@ -32,12 +32,12 @@ export type ConfigureCandidate = { }; /** Configure candidate after the operator chooses the SecretRef to write. */ -export type ConfigureSelectedTarget = ConfigureCandidate & { +type ConfigureSelectedTarget = ConfigureCandidate & { ref: SecretRef; }; /** Provider config mutations collected while building a secrets configure plan. */ -export type ConfigureProviderChanges = { +type ConfigureProviderChanges = { upserts: Record; deletes: string[]; }; @@ -49,11 +49,6 @@ function getSecretProviders(config: OpenClawConfig): Record; +type GatewayAuthSurfaceStateMap = Record; function formatAuthMode(mode: string | undefined): string { return mode ?? "unset"; diff --git a/src/secrets/runtime-web-tools.shared.ts b/src/secrets/runtime-web-tools.shared.ts index 6ca87c4b1a6c..84f16e3a8e8e 100644 --- a/src/secrets/runtime-web-tools.shared.ts +++ b/src/secrets/runtime-web-tools.shared.ts @@ -36,7 +36,7 @@ export type SecretResolutionResult = { /** * Metadata fields shared by runtime web search and fetch provider selection. */ -export type RuntimeWebProviderMetadataBase = { +type RuntimeWebProviderMetadataBase = { providerConfigured?: string; providerSource: "configured" | "auto-detect" | "none"; selectedProvider?: string; @@ -47,7 +47,7 @@ export type RuntimeWebProviderMetadataBase = { /** * Parameters shared by web search/fetch provider selection after provider surface discovery. */ -export type RuntimeWebProviderSelectionParams< +type RuntimeWebProviderSelectionParams< TProvider extends { id: string; requiresCredential?: boolean; @@ -214,7 +214,7 @@ function setResolvedCredentialPath(params: { /** * Provider set plus effective config state for one runtime web tool surface. */ -export type RuntimeWebProviderSurface = { +type RuntimeWebProviderSurface = { providers: TProvider[]; configuredProvider?: string; enabled: boolean; @@ -224,7 +224,7 @@ export type RuntimeWebProviderSurface = { /** * Parameters for resolving configured/available providers before credential selection. */ -export type ResolveRuntimeWebProviderSurfaceParams< +type ResolveRuntimeWebProviderSurfaceParams< TProvider extends { id: string; requiresCredential?: boolean; diff --git a/src/secrets/runtime-web-tools.ts b/src/secrets/runtime-web-tools.ts index efa7f20a1309..19bf903ad61f 100644 --- a/src/secrets/runtime-web-tools.ts +++ b/src/secrets/runtime-web-tools.ts @@ -32,20 +32,11 @@ import { } from "./runtime-web-tools.shared.js"; import type { RuntimeWebDiagnostic, - RuntimeWebDiagnosticCode, RuntimeWebFetchMetadata, RuntimeWebSearchMetadata, RuntimeWebToolsMetadata, } from "./runtime-web-tools.types.js"; -export type { - RuntimeWebDiagnostic, - RuntimeWebDiagnosticCode, - RuntimeWebFetchMetadata, - RuntimeWebSearchMetadata, - RuntimeWebToolsMetadata, -}; - const loadRuntimeWebToolsFallbackProviders = createLazyRuntimeSurface( () => import("./runtime-web-tools-fallback.runtime.js"), ({ runtimeWebToolsFallbackProviders }) => runtimeWebToolsFallbackProviders, diff --git a/src/secrets/secret-value.ts b/src/secrets/secret-value.ts index 61a413b9e6c6..8b518afff8c4 100644 --- a/src/secrets/secret-value.ts +++ b/src/secrets/secret-value.ts @@ -4,7 +4,7 @@ import { isNonEmptyString, isRecord } from "./shared.js"; /** * Describes the resolved value shape a secret target accepts after provider resolution. */ -export type SecretExpectedResolvedValue = "string" | "string-or-object"; // pragma: allowlist secret +type SecretExpectedResolvedValue = "string" | "string-or-object"; // pragma: allowlist secret /** * Returns whether a resolved provider value satisfies the target's accepted runtime shape. diff --git a/src/secrets/storage-scan.ts b/src/secrets/storage-scan.ts index afabdd83080e..42f8c0560cae 100644 --- a/src/secrets/storage-scan.ts +++ b/src/secrets/storage-scan.ts @@ -84,7 +84,7 @@ export function listAgentModelsJsonPaths( } /** Limits for safe opportunistic JSON reads during local storage scans. */ -export type ReadJsonObjectOptions = { +type ReadJsonObjectOptions = { /** Reject files larger than this byte count before reading content. */ maxBytes?: number; /** Reject directories, symlinks, and other non-regular paths before JSON parsing. */ diff --git a/src/secrets/target-registry-pattern.ts b/src/secrets/target-registry-pattern.ts index 80776c3f1836..b0db7f176c5a 100644 --- a/src/secrets/target-registry-pattern.ts +++ b/src/secrets/target-registry-pattern.ts @@ -4,7 +4,7 @@ import { isRecord, parseDotPath } from "./shared.js"; import type { SecretTargetRegistryEntry } from "./target-registry-types.js"; /** Tokenized segment in a secret target path pattern. */ -export type PathPatternToken = +type PathPatternToken = | { kind: "literal"; value: string } | { kind: "wildcard" } | { kind: "array"; field: string }; @@ -18,7 +18,7 @@ export type CompiledTargetRegistryEntry = SecretTargetRegistryEntry & { }; /** Concrete config value matched by expanding a path pattern. */ -export type ExpandedPathMatch = { +type ExpandedPathMatch = { segments: string[]; captures: string[]; value: unknown; diff --git a/src/secrets/target-registry-query.ts b/src/secrets/target-registry-query.ts index 21bad81a78c6..3bd8ab6605d2 100644 --- a/src/secrets/target-registry-query.ts +++ b/src/secrets/target-registry-query.ts @@ -531,12 +531,4 @@ export function listAuthProfileSecretTargetEntries(): SecretTargetRegistryEntry[ ); } -export type { - AuthProfileType, - DiscoveredConfigSecretTarget, - ResolvedPlanTarget, - SecretTargetConfigFile, - SecretTargetExpected, - SecretTargetRegistryEntry, - SecretTargetShape, -} from "./target-registry-types.js"; +export type { DiscoveredConfigSecretTarget, ResolvedPlanTarget } from "./target-registry-types.js"; diff --git a/src/secrets/unsupported-surface-policy.ts b/src/secrets/unsupported-surface-policy.ts index d7d842c9cc44..a195fd616b96 100644 --- a/src/secrets/unsupported-surface-policy.ts +++ b/src/secrets/unsupported-surface-policy.ts @@ -165,7 +165,7 @@ export function getUnsupportedSecretRefSurfacePatterns(): string[] { /** * Concrete unsupported config value discovered from an openclaw.json-like object. */ -export type UnsupportedSecretRefConfigCandidate = { +type UnsupportedSecretRefConfigCandidate = { path: string; value: unknown; }; diff --git a/src/security/audit-extra.async.ts b/src/security/audit-extra.async.ts index 0363c1987edd..1a5ffa23d269 100644 --- a/src/security/audit-extra.async.ts +++ b/src/security/audit-extra.async.ts @@ -28,7 +28,7 @@ import { listInstalledPluginDirs } from "./installed-plugin-dirs.js"; import { extensionUsesSkippedScannerPath, isPathInside } from "./scan-paths.js"; import type { ExecFn } from "./windows-acl.js"; -export type SecurityAuditFinding = { +type SecurityAuditFinding = { checkId: string; severity: "info" | "warn" | "critical"; title: string; @@ -36,9 +36,6 @@ export type SecurityAuditFinding = { remediation?: string; }; -type CollectPluginsTrustFindingsParams = Parameters< - typeof import("./audit-plugins-trust.js").collectPluginsTrustFindings ->[0]; type SkillScanSummary = Awaited< ReturnType >; @@ -78,17 +75,6 @@ const loadSandboxBrowserSecurityHashEpoch = createLazyRuntimeNamedExport( "SANDBOX_BROWSER_SECURITY_HASH_EPOCH", ); -const loadAuditPluginsTrustModule = createLazyRuntimeModule( - () => import("./audit-plugins-trust.js"), -); - -export async function collectPluginsTrustFindings( - params: CollectPluginsTrustFindingsParams, -): Promise { - const { collectPluginsTrustFindings: collect } = await loadAuditPluginsTrustModule(); - return await collect(params); -} - // -------------------------------------------------------------------------- // Helpers // -------------------------------------------------------------------------- diff --git a/src/security/audit-extra.summary.ts b/src/security/audit-extra.summary.ts index c9927dc0e987..ab99b0bd0922 100644 --- a/src/security/audit-extra.summary.ts +++ b/src/security/audit-extra.summary.ts @@ -18,7 +18,7 @@ import { inferParamBFromIdOrName } from "../shared/model-param-b.js"; import { collectAuditModelRefs } from "./audit-model-refs.js"; /** Lightweight audit finding shape used by summary-only audit helpers. */ -export type SecurityAuditFinding = { +type SecurityAuditFinding = { checkId: string; severity: "info" | "warn" | "critical"; title: string; diff --git a/src/security/audit-extra.sync.ts b/src/security/audit-extra.sync.ts index f29a0abd04c7..4a999577021f 100644 --- a/src/security/audit-extra.sync.ts +++ b/src/security/audit-extra.sync.ts @@ -31,7 +31,7 @@ import { GATEWAY_CONTROL_PLANE_TOOLS } from "./dangerous-tools.js"; * These functions analyze config-based security properties without I/O. */ -export type SecurityAuditFinding = { +type SecurityAuditFinding = { checkId: string; severity: "info" | "warn" | "critical"; title: string; @@ -39,11 +39,11 @@ export type SecurityAuditFinding = { remediation?: string; }; -export type HooksHardeningAuditOptions = { +type HooksHardeningAuditOptions = { gatewayAuthOverride?: Pick; }; -export type GatewayHttpNoAuthAuditOptions = { +type GatewayHttpNoAuthAuditOptions = { gatewayAuthOverride?: Pick; }; diff --git a/src/security/audit-gateway-config.ts b/src/security/audit-gateway-config.ts index ee65e11936e7..877042461c9d 100644 --- a/src/security/audit-gateway-config.ts +++ b/src/security/audit-gateway-config.ts @@ -17,7 +17,7 @@ import { DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./dangerous-tools.js"; type CollectDangerousConfigFlags = (cfg: OpenClawConfig) => string[]; -export type CollectGatewayConfigFindingsOptions = { +type CollectGatewayConfigFindingsOptions = { collectDangerousConfigFlags?: CollectDangerousConfigFlags; gatewayAuthOverride?: Pick; }; diff --git a/src/security/audit-model-refs.ts b/src/security/audit-model-refs.ts index c177ca5a7b7a..4160281ae260 100644 --- a/src/security/audit-model-refs.ts +++ b/src/security/audit-model-refs.ts @@ -15,7 +15,7 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; * Model reference used by security audit findings. * `id` is the normalized provider/model key; `source` is the config path shown in diagnostics. */ -export type AuditModelRef = { id: string; source: string }; +type AuditModelRef = { id: string; source: string }; function resolveAuditModelId( cfg: OpenClawConfig, diff --git a/src/security/audit.ts b/src/security/audit.ts index da1ace2e0a51..cf943a0f14b2 100644 --- a/src/security/audit.ts +++ b/src/security/audit.ts @@ -82,14 +82,9 @@ type AgentSkillMcpBoundaryScope = { execAsk: string; }; -export type { - SecurityAuditFinding, - SecurityAuditReport, - SecurityAuditSeverity, - SecurityAuditSummary, -} from "./audit.types.js"; +export type { SecurityAuditReport } from "./audit.types.js"; -export type SecurityAuditOptions = { +type SecurityAuditOptions = { config: OpenClawConfig; sourceConfig?: OpenClawConfig; env?: NodeJS.ProcessEnv; @@ -125,7 +120,7 @@ export type SecurityAuditOptions = { probeGatewayFn?: ProbeGatewayFn; }; -export type AuditExecutionContext = { +type AuditExecutionContext = { cfg: OpenClawConfig; sourceConfig: OpenClawConfig; env: NodeJS.ProcessEnv; diff --git a/src/security/config-regex.ts b/src/security/config-regex.ts index 3bf18dd39651..dc210646bf62 100644 --- a/src/security/config-regex.ts +++ b/src/security/config-regex.ts @@ -12,7 +12,7 @@ export type ConfigRegexRejectReason = Exclude; * Result for one config regex pattern. * Empty patterns return null from the compiler; invalid or unsafe patterns return a rejected shape. */ -export type CompiledConfigRegex = +type CompiledConfigRegex = | { regex: RegExp; pattern: string; diff --git a/src/security/dangerous-config-flags-core.ts b/src/security/dangerous-config-flags-core.ts index 30a699c9abef..5d4095385369 100644 --- a/src/security/dangerous-config-flags-core.ts +++ b/src/security/dangerous-config-flags-core.ts @@ -31,7 +31,7 @@ type CollectPluginConfigContractMatches = (input: { * Plugin config contract data used to extend core dangerous-flag detection. * Tests and snapshot callers can inject prepared contracts to avoid manifest discovery. */ -export type DangerousConfigFlagContractInputs = { +type DangerousConfigFlagContractInputs = { configContractsById?: ReadonlyMap; collectPluginConfigContractMatches?: CollectPluginConfigContractMatches; }; diff --git a/src/security/exec-filesystem-policy.ts b/src/security/exec-filesystem-policy.ts index 04e763175801..3cb344b749a2 100644 --- a/src/security/exec-filesystem-policy.ts +++ b/src/security/exec-filesystem-policy.ts @@ -9,7 +9,7 @@ const MUTATING_FS_TOOLS = ["write", "edit", "apply_patch"] as const; const RUNTIME_TOOLS = ["exec", "process"] as const; /** Scope where exec-like tools remain available while mutating filesystem tools are disabled. */ -export type ExecFilesystemPolicyDriftHit = { +type ExecFilesystemPolicyDriftHit = { scopeLabel: string; runtimeTools: string[]; disabledFilesystemTools: string[]; diff --git a/src/security/fix.ts b/src/security/fix.ts index f0b71bb90242..db2d551df33c 100644 --- a/src/security/fix.ts +++ b/src/security/fix.ts @@ -12,7 +12,7 @@ import { runExec } from "../process/exec.js"; import { normalizeAgentId } from "../routing/session-key.js"; import { createIcaclsResetCommand, formatIcaclsResetCommand, type ExecFn } from "./windows-acl.js"; -export type SecurityFixChmodAction = { +type SecurityFixChmodAction = { kind: "chmod"; path: string; mode: number; @@ -21,7 +21,7 @@ export type SecurityFixChmodAction = { error?: string; }; -export type SecurityFixIcaclsAction = { +type SecurityFixIcaclsAction = { kind: "icacls"; path: string; command: string; @@ -30,9 +30,9 @@ export type SecurityFixIcaclsAction = { error?: string; }; -export type SecurityFixAction = SecurityFixChmodAction | SecurityFixIcaclsAction; +type SecurityFixAction = SecurityFixChmodAction | SecurityFixIcaclsAction; -export type SecurityFixResult = { +type SecurityFixResult = { ok: boolean; stateDir: string; configPath: string; @@ -42,7 +42,7 @@ export type SecurityFixResult = { errors: string[]; }; -export type SecurityPermissionTarget = { +type SecurityPermissionTarget = { path: string; mode: number; require: "dir" | "file"; diff --git a/src/security/install-policy.ts b/src/security/install-policy.ts index c88c52170dcf..cee2ad98427d 100644 --- a/src/security/install-policy.ts +++ b/src/security/install-policy.ts @@ -41,7 +41,7 @@ const POLICY_INTERPRETER_NAMES = new Set([ ]); const POLICY_SCRIPT_ARG_PATTERN = /\.(?:bash|cjs|cts|js|mjs|mts|pl|ps1|py|rb|sh|ts|zsh)$/i; -export type InstallPolicyTarget = "skill" | "plugin"; +type InstallPolicyTarget = "skill" | "plugin"; export type InstallPolicyRequestKind = | "skill-install" | "plugin-dir" @@ -121,7 +121,7 @@ export type InstallPolicyRequest = { }; }; -export type InstallPolicyResult = +type InstallPolicyResult = | { blocked?: undefined; findings?: InstallPolicyFinding[] } | { blocked: { @@ -141,7 +141,7 @@ type ExecRunResult = { type InstallPolicyExecConfig = NonNullable["exec"]>; -export type InstallPolicyValidationIssue = { +type InstallPolicyValidationIssue = { severity: "error" | "warning"; message: string; }; diff --git a/src/security/windows-acl.test.ts b/src/security/windows-acl.test.ts index 2997fbef2f2e..4be25a4cb135 100644 --- a/src/security/windows-acl.test.ts +++ b/src/security/windows-acl.test.ts @@ -2,12 +2,20 @@ import { expectDefined } from "@openclaw/normalization-core"; import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { + formatWindowsAclSummary, + inspectWindowsAcl, + parseIcaclsOutput, + resolveWindowsUserPrincipal, + summarizeWindowsAcl, + type WindowsAclEntry, + type WindowsAclSummary, +} from "../infra/permissions.js"; import { DEFAULT_WINDOWS_SYSTEM_ROOT, resetWindowsInstallRootsForTests, } from "../infra/windows-install-roots.js"; import { withEnvAsync } from "../test-utils/env.js"; -import type { WindowsAclEntry, WindowsAclSummary } from "./windows-acl.js"; const MOCK_USERNAME = "MockUser"; const mockUserInfo = () => ({ username: MOCK_USERNAME }); @@ -17,22 +25,9 @@ const DEFAULT_WHOAMI = `${DEFAULT_WINDOWS_SYSTEM_ROOT}\\System32\\whoami.exe`; let createIcaclsResetCommand: typeof import("./windows-acl.js").createIcaclsResetCommand; let formatIcaclsResetCommand: typeof import("./windows-acl.js").formatIcaclsResetCommand; -let formatWindowsAclSummary: typeof import("./windows-acl.js").formatWindowsAclSummary; -let inspectWindowsAcl: typeof import("./windows-acl.js").inspectWindowsAcl; -let parseIcaclsOutput: typeof import("./windows-acl.js").parseIcaclsOutput; -let resolveWindowsUserPrincipal: typeof import("./windows-acl.js").resolveWindowsUserPrincipal; -let summarizeWindowsAcl: typeof import("./windows-acl.js").summarizeWindowsAcl; beforeAll(async () => { - ({ - createIcaclsResetCommand, - formatIcaclsResetCommand, - formatWindowsAclSummary, - inspectWindowsAcl, - parseIcaclsOutput, - resolveWindowsUserPrincipal, - summarizeWindowsAcl, - } = await import("./windows-acl.js")); + ({ createIcaclsResetCommand, formatIcaclsResetCommand } = await import("./windows-acl.js")); }); beforeEach(() => { diff --git a/src/security/windows-acl.ts b/src/security/windows-acl.ts index c6f42fda4c6b..2226364d457d 100644 --- a/src/security/windows-acl.ts +++ b/src/security/windows-acl.ts @@ -2,12 +2,5 @@ export { createIcaclsResetCommand, formatIcaclsResetCommand, - formatWindowsAclSummary, - inspectWindowsAcl, - parseIcaclsOutput, - resolveWindowsUserPrincipal, - summarizeWindowsAcl, type ExecFn, - type WindowsAclEntry, - type WindowsAclSummary, } from "../infra/permissions.js"; diff --git a/src/sessions/agent-harness-session-key.ts b/src/sessions/agent-harness-session-key.ts index 316d1fa1c5a2..0d318efafe0d 100644 --- a/src/sessions/agent-harness-session-key.ts +++ b/src/sessions/agent-harness-session-key.ts @@ -2,7 +2,7 @@ import { normalizeOptionalString } from "@openclaw/normalization-core/string-coe import { normalizeOptionalAgentRuntimeId } from "../agents/agent-runtime-id.js"; import { parseAgentSessionKey } from "../routing/session-key.js"; -export const AGENT_HARNESS_SESSION_KEY_PREFIX = "harness:"; +const AGENT_HARNESS_SESSION_KEY_PREFIX = "harness:"; export const AGENT_HARNESS_SESSION_KEY_RESERVED_MESSAGE = "Session key namespace is reserved for agent harness-owned sessions."; export const AGENT_HARNESS_SESSION_ID_LOCKED_MESSAGE = diff --git a/src/sessions/input-provenance.ts b/src/sessions/input-provenance.ts index ca0663aee80f..3544beef535b 100644 --- a/src/sessions/input-provenance.ts +++ b/src/sessions/input-provenance.ts @@ -5,13 +5,9 @@ import { isStringOption } from "../utils/string-readers.js"; // Input provenance marks whether a user-role message actually came from an // external user, another session, or an internal system/tool handoff. -export const INPUT_PROVENANCE_KIND_VALUES = [ - "external_user", - "inter_session", - "internal_system", -] as const; +const INPUT_PROVENANCE_KIND_VALUES = ["external_user", "inter_session", "internal_system"] as const; -export type InputProvenanceKind = (typeof INPUT_PROVENANCE_KIND_VALUES)[number]; +type InputProvenanceKind = (typeof INPUT_PROVENANCE_KIND_VALUES)[number]; export type InputProvenance = { kind: InputProvenanceKind; diff --git a/src/sessions/model-overrides.ts b/src/sessions/model-overrides.ts index 2761415147b8..254cc4997536 100644 --- a/src/sessions/model-overrides.ts +++ b/src/sessions/model-overrides.ts @@ -3,7 +3,7 @@ import { normalizeOptionalString } from "@openclaw/normalization-core/string-coe import type { SessionEntry } from "../config/sessions.js"; /** User or automatic model/provider override selection for a session entry. */ -export type ModelOverrideSelection = { +type ModelOverrideSelection = { provider: string; model: string; isDefault?: boolean; @@ -26,7 +26,7 @@ export function isModelSelectionLocked(entry: SessionEntry | undefined): boolean } /** Enforces the durable model-selection lock before any session model fields change. */ -export function assertModelSelectionUnlocked(entry: SessionEntry): void { +function assertModelSelectionUnlocked(entry: SessionEntry): void { if (isModelSelectionLocked(entry)) { throw new ModelSelectionLockedError(); } diff --git a/src/sessions/session-chat-type-shared.ts b/src/sessions/session-chat-type-shared.ts index b4612b478c5f..6945726e628e 100644 --- a/src/sessions/session-chat-type-shared.ts +++ b/src/sessions/session-chat-type-shared.ts @@ -12,7 +12,7 @@ function isCanonicalPeerKind(value: string | undefined): value is CanonicalPeerK return CANONICAL_PEER_KINDS.has(value ?? ""); } -export type CanonicalSessionPeerShape = { +type CanonicalSessionPeerShape = { channel?: string; chatType: Exclude; }; diff --git a/src/sessions/session-chat-type.ts b/src/sessions/session-chat-type.ts index e4b5d32cf354..d2d3dba0e198 100644 --- a/src/sessions/session-chat-type.ts +++ b/src/sessions/session-chat-type.ts @@ -7,11 +7,6 @@ import { } from "./session-chat-type-shared.js"; import { parseAgentSessionKey } from "./session-key-utils.js"; -export { - deriveSessionChatTypeFromKey, - type SessionKeyChatType, -} from "./session-chat-type-shared.js"; - // Session chat-type derivation first uses generic key parsing, then falls back // to bootstrap channel plugins for legacy platform-specific session keys. type LegacySessionChatTypeDeriver = NonNullable< diff --git a/src/sessions/session-key-utils.ts b/src/sessions/session-key-utils.ts index 866048113ecd..4e1ca52ce857 100644 --- a/src/sessions/session-key-utils.ts +++ b/src/sessions/session-key-utils.ts @@ -15,7 +15,7 @@ export type ParsedThreadSessionSuffix = { threadId: string | undefined; }; -export type ParsedSessionDeliveryRoute = { +type ParsedSessionDeliveryRoute = { accountId?: string; channel: string; peerId: string; @@ -23,7 +23,7 @@ export type ParsedSessionDeliveryRoute = { threadId?: string; }; -export type ParsedCronRunScopeSuffix = { +type ParsedCronRunScopeSuffix = { baseSessionKey: string | undefined; runId: string | undefined; }; diff --git a/src/sessions/session-lifecycle-admission.ts b/src/sessions/session-lifecycle-admission.ts index 84410d317582..011deb5d0468 100644 --- a/src/sessions/session-lifecycle-admission.ts +++ b/src/sessions/session-lifecycle-admission.ts @@ -25,7 +25,7 @@ type SessionLifecycleAdmissionState = { currentAdmissions: AsyncLocalStorage>; }; -export type SessionLifecycleMutationKind = "compaction"; +type SessionLifecycleMutationKind = "compaction"; // Runtime chunks can load separate module instances while still coordinating // the same sessions. One shared state keeps every lock and admission visible. diff --git a/src/sessions/session-state-events.ts b/src/sessions/session-state-events.ts index 483e2312169a..1c8b0b03dbfb 100644 --- a/src/sessions/session-state-events.ts +++ b/src/sessions/session-state-events.ts @@ -26,7 +26,7 @@ import { import type { InputProvenance } from "./input-provenance.js"; export type SessionStateActorType = "human" | "agent" | "system"; -export type SessionStateEventKind = +type SessionStateEventKind = | "human_direct_message" | "run_completed" | "run_failed" @@ -34,7 +34,7 @@ export type SessionStateEventKind = | "goal_changed" | "compacted"; -export type SessionStateEventInput = { +type SessionStateEventInput = { sessionKey: string; sessionId?: string; agentId: string; @@ -48,7 +48,7 @@ export type SessionStateEventInput = { watcherSessionKeys?: readonly string[]; }; -export type SessionStateEventRecord = { +type SessionStateEventRecord = { sequence: number; sessionKey: string; sessionId?: string; diff --git a/src/sessions/transcript-events.test.ts b/src/sessions/transcript-events.test.ts index 7ac28be4dbe9..8b1b92762dbc 100644 --- a/src/sessions/transcript-events.test.ts +++ b/src/sessions/transcript-events.test.ts @@ -1,7 +1,6 @@ // Transcript event tests cover transcript event parsing and compaction. import { afterEach, describe, expect, it, vi } from "vitest"; import { - emitInternalSessionTranscriptUpdate, emitSessionTranscriptUpdate, onInternalSessionTranscriptUpdate, onSessionTranscriptUpdate, @@ -101,7 +100,7 @@ describe("transcript events", () => { const listener = vi.fn(); cleanup.push(onInternalSessionTranscriptUpdate(listener)); - emitInternalSessionTranscriptUpdate({ + emitSessionTranscriptUpdate({ target: { agentId: " main ", sessionId: " sess-1 ", diff --git a/src/sessions/transcript-events.ts b/src/sessions/transcript-events.ts index ed0d9b602763..01f18b11a611 100644 --- a/src/sessions/transcript-events.ts +++ b/src/sessions/transcript-events.ts @@ -4,7 +4,7 @@ import { normalizeOptionalString } from "@openclaw/normalization-core/string-coe import { parseAgentSessionKey } from "../routing/session-key.js"; /** Storage-neutral identity for the session transcript that changed. */ -export type SessionTranscriptUpdateTarget = { +type SessionTranscriptUpdateTarget = { agentId: string; sessionId: string; sessionKey: string; @@ -66,15 +66,6 @@ export function emitSessionTranscriptUpdate(update: InternalSessionTranscriptUpd emitInternalTranscriptUpdate(nextUpdate); } -/** Emits an internal transcript update, including identity-only updates. */ -export function emitInternalSessionTranscriptUpdate(update: InternalSessionTranscriptUpdate): void { - const nextUpdate = normalizeSessionTranscriptUpdate(update, { allowIdentityOnly: true }); - if (!nextUpdate) { - return; - } - emitInternalTranscriptUpdate(nextUpdate); -} - function normalizeSessionTranscriptUpdate( update: InternalSessionTranscriptUpdate, options: { allowIdentityOnly: boolean }, diff --git a/src/sessions/user-turn-transcript-runtime-context.ts b/src/sessions/user-turn-transcript-runtime-context.ts index e2fda63c8458..030d22cedc72 100644 --- a/src/sessions/user-turn-transcript-runtime-context.ts +++ b/src/sessions/user-turn-transcript-runtime-context.ts @@ -12,7 +12,7 @@ const RUNTIME_USER_TURN_TRANSCRIPT_RECORDER = Symbol.for( "openclaw.runtimeUserTurnTranscriptRecorder", ); -export type RuntimeUserTurnTranscriptContext = { +type RuntimeUserTurnTranscriptContext = { message: PersistedUserTurnMessage; recorder: UserTurnTranscriptRecorder; }; diff --git a/src/sessions/user-turn-transcript.ts b/src/sessions/user-turn-transcript.ts index 13c1355c3503..9d153cc677e1 100644 --- a/src/sessions/user-turn-transcript.ts +++ b/src/sessions/user-turn-transcript.ts @@ -23,13 +23,6 @@ export type { UserTurnInput, UserTurnTranscriptRecorder, } from "./user-turn-transcript.types.js"; -export { - attachRuntimeUserTurnTranscriptContext, - attachRuntimeUserTurnTranscriptRecorder, - takeRuntimeUserTurnTranscriptContext, - takeRuntimeUserTurnTranscriptRecorder, - type RuntimeUserTurnTranscriptContext, -} from "./user-turn-transcript-runtime-context.js"; type PersistedUserTurnMediaFields = { MediaPath?: string; diff --git a/src/sessions/user-turn-transcript.types.ts b/src/sessions/user-turn-transcript.types.ts index ee51a360ddd4..3743132c0be1 100644 --- a/src/sessions/user-turn-transcript.types.ts +++ b/src/sessions/user-turn-transcript.types.ts @@ -38,7 +38,7 @@ export type UserTurnBeforeMessageWrite = (params: { sessionKey?: string; }) => AgentMessage | null; -export type UserTurnTranscriptPersistenceTarget = { +type UserTurnTranscriptPersistenceTarget = { sessionId: string; expectedSessionId?: string; sessionKey: string; diff --git a/src/shared/avatar-policy.test.ts b/src/shared/avatar-policy.test.ts index 5edce4708897..e08367db225c 100644 --- a/src/shared/avatar-policy.test.ts +++ b/src/shared/avatar-policy.test.ts @@ -5,11 +5,9 @@ import { hasAvatarUriScheme, isAvatarDataUrl, isAvatarHttpUrl, - isAvatarImageDataUrl, isPathWithinRoot, isSupportedLocalAvatarExtension, isWindowsAbsolutePath, - isWorkspaceRelativeAvatarPath, looksLikeAvatarPath, resolveAvatarMime, } from "./avatar-policy.js"; @@ -17,24 +15,12 @@ import { describe("avatar policy", () => { it("classifies avatar URI and path helpers directly", () => { expect(isAvatarDataUrl("data:text/plain,hello")).toBe(true); - expect(isAvatarImageDataUrl("data:image/png;base64,AAAA")).toBe(true); - expect(isAvatarImageDataUrl("data:text/plain,hello")).toBe(false); expect(isAvatarHttpUrl("https://example.com/avatar.png")).toBe(true); expect(isAvatarHttpUrl("ftp://example.com/avatar.png")).toBe(false); expect(hasAvatarUriScheme("slack://avatar")).toBe(true); expect(isWindowsAbsolutePath("C:\\\\avatars\\\\openclaw.png")).toBe(true); }); - it("accepts workspace-relative avatar paths and rejects URI schemes", () => { - expect(isWorkspaceRelativeAvatarPath("avatars/openclaw.png")).toBe(true); - expect(isWorkspaceRelativeAvatarPath("C:\\\\avatars\\\\openclaw.png")).toBe(true); - expect(isWorkspaceRelativeAvatarPath("https://example.com/avatar.png")).toBe(false); - expect(isWorkspaceRelativeAvatarPath("data:image/png;base64,AAAA")).toBe(false); - expect(isWorkspaceRelativeAvatarPath("~/avatar.png")).toBe(false); - expect(isWorkspaceRelativeAvatarPath("slack://avatar")).toBe(false); - expect(isWorkspaceRelativeAvatarPath("")).toBe(false); - }); - it("checks path containment safely", () => { const root = path.resolve("/tmp/root"); expect(isPathWithinRoot(root, root)).toBe(true); diff --git a/src/shared/avatar-policy.ts b/src/shared/avatar-policy.ts index da4c30111576..3e498feb7ded 100644 --- a/src/shared/avatar-policy.ts +++ b/src/shared/avatar-policy.ts @@ -2,7 +2,7 @@ import path from "node:path"; import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce"; import { isPathInside } from "../infra/path-guards.js"; -export { AVATAR_MAX_BYTES, AVATAR_MAX_DATA_URL_CHARS } from "./avatar-limits.js"; +export { AVATAR_MAX_BYTES } from "./avatar-limits.js"; /** * Shared avatar source policy for config validation, agent identity loading, @@ -29,8 +29,6 @@ const AVATAR_MIME_BY_EXT: Record = { /** Detects data URLs before image-specific avatar validation. */ const AVATAR_DATA_RE = /^data:/i; -/** Detects inline image data URLs accepted by the persisted avatar contract. */ -const AVATAR_IMAGE_DATA_RE = /^data:image\//i; /** Detects remote avatar URLs served over HTTP(S). */ const AVATAR_HTTP_RE = /^https?:\/\//i; /** Detects URI schemes so non-path avatar values can be rejected or routed. */ @@ -51,11 +49,6 @@ export function isAvatarDataUrl(value: string): boolean { return AVATAR_DATA_RE.test(value); } -/** Detects image data URLs without applying a projection-specific size limit. */ -export function isAvatarImageDataUrl(value: string): boolean { - return AVATAR_IMAGE_DATA_RE.test(value); -} - /** Detects remote HTTP(S) avatar URLs. */ export function isAvatarHttpUrl(value: string): boolean { return AVATAR_HTTP_RE.test(value); @@ -71,20 +64,6 @@ export function isWindowsAbsolutePath(value: string): boolean { return WINDOWS_ABS_RE.test(value); } -/** Accepts workspace-relative avatar paths while rejecting home paths and URI values. */ -export function isWorkspaceRelativeAvatarPath(value: string): boolean { - if (!value) { - return false; - } - if (value.startsWith("~")) { - return false; - } - if (hasAvatarUriScheme(value) && !isWindowsAbsolutePath(value)) { - return false; - } - return true; -} - /** Checks that a resolved avatar path remains inside its configured root. */ export function isPathWithinRoot(rootDir: string, targetPath: string): boolean { return isPathInside(rootDir, targetPath); diff --git a/src/shared/custom-command-config.ts b/src/shared/custom-command-config.ts index 8d962f43120c..5853d5e348c1 100644 --- a/src/shared/custom-command-config.ts +++ b/src/shared/custom-command-config.ts @@ -2,20 +2,20 @@ import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce"; /** Raw custom slash-command entry from config. */ -export type CustomCommandInput = { +type CustomCommandInput = { command?: string | null; description?: string | null; }; /** Validation issue for one configured custom command. */ -export type CustomCommandIssue = { +type CustomCommandIssue = { index: number; field: "command" | "description"; message: string; }; /** Command validation policy for one command family. */ -export type CustomCommandConfig = { +type CustomCommandConfig = { label: string; pattern: RegExp; patternDescription: string; diff --git a/src/shared/device-pairing-access.ts b/src/shared/device-pairing-access.ts index f0156ed1e001..701cae1bac0e 100644 --- a/src/shared/device-pairing-access.ts +++ b/src/shared/device-pairing-access.ts @@ -16,7 +16,7 @@ export type PendingDeviceApprovalKind = | "scope-upgrade" | "re-approval"; -export type PendingDeviceApprovalState = { +type PendingDeviceApprovalState = { kind: PendingDeviceApprovalKind; /** Access requested by the pending pairing attempt. */ requested: DevicePairingAccessSummary; diff --git a/src/shared/frontmatter.ts b/src/shared/frontmatter.ts index b5f912caa96d..bdecaa8bdb15 100644 --- a/src/shared/frontmatter.ts +++ b/src/shared/frontmatter.ts @@ -57,7 +57,7 @@ export function resolveOpenClawManifestBlock(params: { } } -export type OpenClawManifestRequires = { +type OpenClawManifestRequires = { /** All binaries that must be available. */ bins: string[]; /** Alternative binaries where any one match is enough. */ @@ -103,7 +103,7 @@ export function resolveOpenClawManifestOs(metadataObj: Record): return normalizeStringList(metadataObj.os); } -export type ParsedOpenClawManifestInstallBase = { +type ParsedOpenClawManifestInstallBase = { /** Original install entry for caller-specific parsing. */ raw: Record; /** Normalized install kind accepted by the caller. */ diff --git a/src/shared/lazy-runtime.ts b/src/shared/lazy-runtime.ts index 1065458bb5f2..29a7c57e147a 100644 --- a/src/shared/lazy-runtime.ts +++ b/src/shared/lazy-runtime.ts @@ -1,7 +1,6 @@ import { createLazyPromiseLoader } from "./lazy-promise.js"; export { createLazyPromise, createLazyPromiseLoader } from "./lazy-promise.js"; -export type { LazyPromiseLoader } from "./lazy-promise.js"; type LazyRuntimeLoader = (() => Promise) & { peek: () => Promise | undefined; diff --git a/src/shared/session-types.ts b/src/shared/session-types.ts index 62362930c8b6..3aa1c4e66511 100644 --- a/src/shared/session-types.ts +++ b/src/shared/session-types.ts @@ -1,5 +1,5 @@ /** Agent identity fields returned by gateway session listing APIs. */ -export type GatewayAgentIdentity = { +type GatewayAgentIdentity = { name?: string; theme?: string; emoji?: string; @@ -8,7 +8,7 @@ export type GatewayAgentIdentity = { }; /** Model summary returned for an agent/session row. */ -export type GatewayAgentModel = { +type GatewayAgentModel = { primary?: string; fallbacks?: string[]; }; diff --git a/src/shared/store-writer-queue.ts b/src/shared/store-writer-queue.ts index 00e29f94c167..76d2352fc765 100644 --- a/src/shared/store-writer-queue.ts +++ b/src/shared/store-writer-queue.ts @@ -2,7 +2,7 @@ import { AsyncLocalStorage } from "node:async_hooks"; import { resolveGlobalSingleton } from "./global-singleton.js"; /** Pending exclusive store write plus the promise hooks for its caller. */ -export type StoreWriterTask = { +type StoreWriterTask = { /** Write operation to run once earlier tasks for the same store path finish. */ fn: () => Promise; /** Resolves the caller's promise with the write result. */ diff --git a/src/skills/lifecycle/install.ts b/src/skills/lifecycle/install.ts index 9f41520d18d3..7320243422d6 100644 --- a/src/skills/lifecycle/install.ts +++ b/src/skills/lifecycle/install.ts @@ -23,14 +23,14 @@ import { installDownloadSpec } from "./install-download.js"; import { formatInstallFailureMessage } from "./install-output.js"; import type { SkillInstallResult, SkillInstallSkipReason } from "./install-types.js"; -export type SkillInstallRequest = { +type SkillInstallRequest = { workspaceDir: string; skillName: string; installId: string; timeoutMs?: number; config?: OpenClawConfig; }; -export type { SkillInstallResult, SkillInstallSkipReason } from "./install-types.js"; +export type { SkillInstallSkipReason } from "./install-types.js"; type SkillsInstallDeps = { hasBinary: (bin: string) => boolean; diff --git a/src/skills/research/signals.test.ts b/src/skills/research/signals.test.ts index a0d452c29fe9..611c018fdc12 100644 --- a/src/skills/research/signals.test.ts +++ b/src/skills/research/signals.test.ts @@ -2,12 +2,24 @@ import { expectDefined } from "@openclaw/normalization-core"; import { describe, expect, it } from "vitest"; -import { extractDurableInstructionProposals } from "./signals.js"; +import { extractDurableInstructions, groupDurableInstructionProposals } from "./signals.js"; function userMessage(content: string): { role: string; content: string } { return { role: "user", content }; } +function extractDurableInstructionProposals(params: { + messages: unknown[]; + existingSkills?: Array<{ name: string; description?: string }>; + maxProposals?: number; +}) { + return groupDurableInstructionProposals({ + instructions: extractDurableInstructions(params.messages), + existingSkills: params.existingSkills, + maxProposals: params.maxProposals, + }); +} + describe("extractDurableInstructionProposals", () => { it.each([ "From now on, when working on GitHub PRs, always check CI before final response.", diff --git a/src/skills/research/signals.ts b/src/skills/research/signals.ts index 8b0cc4f3093a..fb8ff87a3b2a 100644 --- a/src/skills/research/signals.ts +++ b/src/skills/research/signals.ts @@ -62,7 +62,7 @@ const SKILL_MATCH_STOPWORDS = new Set([ "your", ]); -export type WorkspaceSkillSummary = { +type WorkspaceSkillSummary = { name: string; description?: string; }; @@ -277,19 +277,3 @@ export function groupDurableInstructionProposals(params: { } return proposals; } - -/** - * Extracts, routes, and groups durable instructions. Runtime capture uses the two phase helpers - * above so signal-free turns can return before workspace skill discovery. - */ -export function extractDurableInstructionProposals(params: { - messages: unknown[]; - existingSkills?: readonly WorkspaceSkillSummary[]; - maxProposals?: number; -}): DurableInstruction[] { - return groupDurableInstructionProposals({ - instructions: extractDurableInstructions(params.messages), - existingSkills: params.existingSkills, - maxProposals: params.maxProposals, - }); -} diff --git a/src/skills/runtime/refresh.test.ts b/src/skills/runtime/refresh.test.ts index 1368c7c40a8b..323a70ab1bd9 100644 --- a/src/skills/runtime/refresh.test.ts +++ b/src/skills/runtime/refresh.test.ts @@ -3,7 +3,11 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import type { SkillsChangeEvent } from "./refresh.js"; +import { + getSkillsSnapshotVersion, + shouldRefreshSnapshotForVersion, + type SkillsChangeEvent, +} from "./refresh-state.js"; type WatchEvent = "add" | "addDir" | "change" | "unlink" | "unlinkDir" | "raw" | "error"; type WatchCallback = (...args: unknown[]) => void; @@ -862,9 +866,9 @@ describe("ensureSkillsWatcher", () => { config: { skills: { load: { watch: false } } }, }); - const nextVersion = refreshModule.getSkillsSnapshotVersion(workspaceDir); + const nextVersion = getSkillsSnapshotVersion(workspaceDir); expect(nextVersion).toBeGreaterThan(firstVersion); - expect(refreshModule.shouldRefreshSnapshotForVersion(firstVersion, nextVersion)).toBe(true); + expect(shouldRefreshSnapshotForVersion(firstVersion, nextVersion)).toBe(true); vi.setSystemTime(new Date(nextVersion)); const followupVersion = refreshModule.bumpSkillsSnapshotVersion({ workspaceDir, @@ -898,9 +902,9 @@ describe("ensureSkillsWatcher", () => { }); expect(createdWatchers[idleSkillsIndex]?.close).toHaveBeenCalledTimes(1); - const evictedVersion = refreshModule.getSkillsSnapshotVersion(idleWorkspaceDir); + const evictedVersion = getSkillsSnapshotVersion(idleWorkspaceDir); expect(evictedVersion).toBeGreaterThan(firstVersion); - expect(refreshModule.shouldRefreshSnapshotForVersion(firstVersion, evictedVersion)).toBe(true); + expect(shouldRefreshSnapshotForVersion(firstVersion, evictedVersion)).toBe(true); vi.setSystemTime(new Date(evictedVersion)); const followupVersion = refreshModule.bumpSkillsSnapshotVersion({ workspaceDir: idleWorkspaceDir, diff --git a/src/skills/runtime/refresh.ts b/src/skills/runtime/refresh.ts index ec27abc3a2f7..c0dff9411ee9 100644 --- a/src/skills/runtime/refresh.ts +++ b/src/skills/runtime/refresh.ts @@ -18,13 +18,7 @@ import { resetSkillsRefreshStateForTest, setSkillsChangeListenerErrorHandler, } from "./refresh-state.js"; -export { - bumpSkillsSnapshotVersion, - getSkillsSnapshotVersion, - registerSkillsChangeListener, - shouldRefreshSnapshotForVersion, - type SkillsChangeEvent, -} from "./refresh-state.js"; +export { bumpSkillsSnapshotVersion, registerSkillsChangeListener } from "./refresh-state.js"; type SkillsPathWatchState = { watcher: FSWatcher; diff --git a/src/skills/runtime/remote.test.ts b/src/skills/runtime/remote.test.ts index 3dab201c5419..83b9f4b1120b 100644 --- a/src/skills/runtime/remote.test.ts +++ b/src/skills/runtime/remote.test.ts @@ -6,7 +6,8 @@ import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; import type { NodeRegistry } from "../../gateway/node-registry.js"; -import { getSkillsSnapshotVersion, resetSkillsRefreshForTest } from "./refresh.js"; +import { getSkillsSnapshotVersion } from "./refresh-state.js"; +import { resetSkillsRefreshForTest } from "./refresh.js"; import { getRemoteSkillEligibility, recordRemoteNodeBins, diff --git a/src/skills/runtime/session-snapshot.ts b/src/skills/runtime/session-snapshot.ts index 2616cf438cb4..e6550b3a61b1 100644 --- a/src/skills/runtime/session-snapshot.ts +++ b/src/skills/runtime/session-snapshot.ts @@ -15,7 +15,7 @@ const resolvedSkillsCache = new Map(); const RESOLVED_SKILLS_CACHE_MAX = 10; /** Inputs that make a resolved skill snapshot reusable within a process. */ -export type ReusableSkillSnapshotParams = { +type ReusableSkillSnapshotParams = { workspaceDir: string; config: OpenClawConfig; agentId?: string; @@ -27,7 +27,7 @@ export type ReusableSkillSnapshotParams = { hydrateExisting?: boolean; }; -export type ReusableSkillSnapshotResult = { +type ReusableSkillSnapshotResult = { snapshot: SkillSnapshot; shouldRefresh: boolean; snapshotVersion: number; diff --git a/src/skills/types.ts b/src/skills/types.ts index 025e9086f343..497e34222b17 100644 --- a/src/skills/types.ts +++ b/src/skills/types.ts @@ -38,7 +38,7 @@ export type SkillInvocationPolicy = { disableModelInvocation: boolean; }; -export type SkillCommandDispatchSpec = { +type SkillCommandDispatchSpec = { kind: "tool"; /** Name of the tool to invoke (AnyAgentTool.name). */ toolName: string; @@ -85,7 +85,7 @@ export type SkillsInstallPreferences = { export type ParsedSkillFrontmatter = Record; -export type SkillExposure = { +type SkillExposure = { includeInRuntimeRegistry: boolean; includeInAvailableSkillsPrompt: boolean; userInvocable: boolean; diff --git a/src/skills/workshop/curator.ts b/src/skills/workshop/curator.ts index 21ef52aadec4..7ee3ec5cb18f 100644 --- a/src/skills/workshop/curator.ts +++ b/src/skills/workshop/curator.ts @@ -31,7 +31,7 @@ const CURATOR_STATE_ID = 1; const EMPTY_RESULT_JSON = "{}"; let loggedArchivedSkillReadFailure = false; -export type SkillLifecycleState = "active" | "archived" | "stale"; +type SkillLifecycleState = "active" | "archived" | "stale"; type CuratorDatabase = Pick< OpenClawStateDatabase, @@ -47,13 +47,13 @@ type CuratedSkill = { skillName: string; }; -export type SkillOverlapCandidate = { +type SkillOverlapCandidate = { left: string; right: string; score: number; }; -export type SkillCuratorSweepResult = { +type SkillCuratorSweepResult = { examined: number; stale: number; archived: number; diff --git a/src/skills/workshop/service.ts b/src/skills/workshop/service.ts index 26e9b2b80d99..6881b9283346 100644 --- a/src/skills/workshop/service.ts +++ b/src/skills/workshop/service.ts @@ -315,7 +315,7 @@ export async function proposeCreateSkill( } /** Summary of a workspace skill the workshop is allowed to write. */ -export type WritableWorkspaceSkillSummary = { +type WritableWorkspaceSkillSummary = { name: string; description?: string; filePath: string; diff --git a/src/skills/workshop/tool-policy-diagnostic.ts b/src/skills/workshop/tool-policy-diagnostic.ts index 26f2637430f4..886975ac5273 100644 --- a/src/skills/workshop/tool-policy-diagnostic.ts +++ b/src/skills/workshop/tool-policy-diagnostic.ts @@ -16,7 +16,7 @@ import { normalizeAgentId } from "../../routing/session-key.js"; const SKILL_WORKSHOP_TOOL_NAME = "skill_workshop"; -export type SkillWorkshopToolPolicyDiagnostic = { +type SkillWorkshopToolPolicyDiagnostic = { agentId: string; source: string; detail: string; @@ -170,7 +170,7 @@ function describeExclusion(params: { }; } -export type SkillWorkshopToolPolicyAvailability = { +type SkillWorkshopToolPolicyAvailability = { available: boolean; exclusion?: ToolPolicyFilterEvent; }; diff --git a/src/state/openclaw-agent-db.paths.ts b/src/state/openclaw-agent-db.paths.ts index 6dbe79ba39ed..766c30fcfa49 100644 --- a/src/state/openclaw-agent-db.paths.ts +++ b/src/state/openclaw-agent-db.paths.ts @@ -10,7 +10,7 @@ import { resolveOpenClawStateSqliteDir } from "./openclaw-state-db.paths.js"; * own private runtime tables while the shared registry can still discover them. */ /** Inputs for resolving one agent SQLite path or directory. */ -export type OpenClawAgentSqlitePathOptions = { +type OpenClawAgentSqlitePathOptions = { agentId: string; env?: NodeJS.ProcessEnv; path?: string; diff --git a/src/status/codex-synthetic-usage.ts b/src/status/codex-synthetic-usage.ts index 3f505103f20e..9ec245012175 100644 --- a/src/status/codex-synthetic-usage.ts +++ b/src/status/codex-synthetic-usage.ts @@ -7,8 +7,8 @@ import type { UsageSummary, } from "../infra/provider-usage.types.js"; -export const CODEX_SYNTHETIC_USAGE_PROVIDER = "openai"; -export const CODEX_SYNTHETIC_USAGE_HOOK_PROVIDER = "codex"; +const CODEX_SYNTHETIC_USAGE_PROVIDER = "openai"; +const CODEX_SYNTHETIC_USAGE_HOOK_PROVIDER = "codex"; /** Maps a provider auth label onto the usage credential type buckets. */ export function resolveUsageCredentialType( diff --git a/src/status/status-message.ts b/src/status/status-message.ts index 3c6ebb997fb7..cd78edef38ef 100644 --- a/src/status/status-message.ts +++ b/src/status/status-message.ts @@ -86,7 +86,7 @@ type QueueStatus = { showDetails?: boolean; }; -export type StatusArgs = { +type StatusArgs = { config?: OpenClawConfig; agent: AgentConfig; agentId?: string; diff --git a/src/talk/agent-consult-runtime.test.ts b/src/talk/agent-consult-runtime.test.ts index d885b9ba1a12..97dd73850455 100644 --- a/src/talk/agent-consult-runtime.test.ts +++ b/src/talk/agent-consult-runtime.test.ts @@ -10,10 +10,12 @@ import { runExclusiveSessionLifecycleMutation } from "../sessions/session-lifecy import { setRealtimeVoiceAgentConsultDepsForTest, consultRealtimeVoiceAgent, - resolveRealtimeVoiceAgentConsultTools, - resolveRealtimeVoiceAgentConsultToolsAllow, } from "./agent-consult-runtime.js"; import { REALTIME_VOICE_AGENT_CONSULT_TOOL } from "./agent-consult-tool.js"; +import { + resolveRealtimeVoiceAgentConsultTools, + resolveRealtimeVoiceAgentConsultToolsAllow, +} from "./agent-consult-tool.js"; function createAgentRuntime(payloads: unknown[] = [{ text: "Speak this." }]) { const sessionStore: Record< diff --git a/src/talk/agent-consult-runtime.ts b/src/talk/agent-consult-runtime.ts index d1ab31ca20ab..067313ac0638 100644 --- a/src/talk/agent-consult-runtime.ts +++ b/src/talk/agent-consult-runtime.ts @@ -34,12 +34,7 @@ export type RealtimeVoiceAgentConsultResult = { text: string }; /** * Controls whether voice consults run in a fresh session or fork context from the requester. */ -export type RealtimeVoiceAgentConsultContextMode = "isolated" | "fork"; - -export { - resolveRealtimeVoiceAgentConsultTools, - resolveRealtimeVoiceAgentConsultToolsAllow, -} from "./agent-consult-tool.js"; +type RealtimeVoiceAgentConsultContextMode = "isolated" | "fork"; type RealtimeVoiceAgentConsultDeps = { randomUUID: typeof randomUUID; diff --git a/src/talk/agent-run-control.test.ts b/src/talk/agent-run-control.test.ts index 8850b5a9e99a..6d85e2c7cf29 100644 --- a/src/talk/agent-run-control.test.ts +++ b/src/talk/agent-run-control.test.ts @@ -1,12 +1,12 @@ // Agent run control tests cover talk-driven agent pause and resume behavior. import { describe, expect, it, vi } from "vitest"; +import type { RealtimeVoiceAgentRunActivity } from "./agent-run-control-shared.js"; import { classifyRealtimeVoiceAgentControlText, controlRealtimeVoiceAgentRun, parseRealtimeVoiceAgentControlToolArgs, resolveRealtimeVoiceAgentControlIntent, shouldAutoControlRealtimeVoiceAgentText, - type RealtimeVoiceAgentRunActivity, } from "./agent-run-control.js"; import type { TalkEvent } from "./talk-events.js"; diff --git a/src/talk/agent-run-control.ts b/src/talk/agent-run-control.ts index a6ce86efabeb..78fd40e1c2b7 100644 --- a/src/talk/agent-run-control.ts +++ b/src/talk/agent-run-control.ts @@ -37,7 +37,6 @@ export { type RealtimeVoiceAgentControlIntent, type RealtimeVoiceAgentControlProviderResult, type RealtimeVoiceAgentControlResult, - type RealtimeVoiceAgentRunActivity, } from "./agent-run-control-shared.js"; type RealtimeVoiceAgentControlDeps = { diff --git a/src/talk/provider-types.ts b/src/talk/provider-types.ts index ebec88633c15..6ad857bd8712 100644 --- a/src/talk/provider-types.ts +++ b/src/talk/provider-types.ts @@ -136,7 +136,7 @@ export type RealtimeVoiceBrowserAudioContract = { outputSampleRateHz: number; }; -export type RealtimeVoiceBrowserWebRtcSdpSession = { +type RealtimeVoiceBrowserWebRtcSdpSession = { provider: RealtimeVoiceProviderId; transport: "webrtc"; clientSecret: string; @@ -147,7 +147,7 @@ export type RealtimeVoiceBrowserWebRtcSdpSession = { expiresAt?: number; }; -export type RealtimeVoiceBrowserJsonPcmWebSocketSession = { +type RealtimeVoiceBrowserJsonPcmWebSocketSession = { provider: RealtimeVoiceProviderId; transport: "provider-websocket"; protocol: string; @@ -160,7 +160,7 @@ export type RealtimeVoiceBrowserJsonPcmWebSocketSession = { expiresAt?: number; }; -export type RealtimeVoiceBrowserGatewayRelaySession = { +type RealtimeVoiceBrowserGatewayRelaySession = { provider: RealtimeVoiceProviderId; transport: "gateway-relay"; relaySessionId: string; @@ -170,7 +170,7 @@ export type RealtimeVoiceBrowserGatewayRelaySession = { expiresAt?: number; }; -export type RealtimeVoiceBrowserManagedRoomSession = { +type RealtimeVoiceBrowserManagedRoomSession = { provider: RealtimeVoiceProviderId; transport: "managed-room"; roomUrl: string; diff --git a/src/talk/talk-session-controller.ts b/src/talk/talk-session-controller.ts index d935973d50f3..fc977589a082 100644 --- a/src/talk/talk-session-controller.ts +++ b/src/talk/talk-session-controller.ts @@ -250,4 +250,4 @@ export function normalizeTalkTransport(value: string | undefined): string | unde return normalized; } -export type { TalkBrain, TalkEvent, TalkEventContext, TalkEventInput, TalkMode, TalkTransport }; +export type { TalkBrain, TalkEvent, TalkEventInput, TalkMode, TalkTransport }; diff --git a/src/tasks/detached-task-runtime-contract.ts b/src/tasks/detached-task-runtime-contract.ts index 2d325e495d99..045134f09306 100644 --- a/src/tasks/detached-task-runtime-contract.ts +++ b/src/tasks/detached-task-runtime-contract.ts @@ -42,7 +42,7 @@ export type DetachedRunningTaskCreateParams = DetachedTaskCreateParams & { progressSummary?: string | null; }; -export type DetachedTaskStartParams = { +type DetachedTaskStartParams = { runId: string; runtime?: TaskRuntime; sessionKey?: string; @@ -52,7 +52,7 @@ export type DetachedTaskStartParams = { eventSummary?: string | null; }; -export type DetachedTaskProgressParams = { +type DetachedTaskProgressParams = { runId: string; runtime?: TaskRuntime; sessionKey?: string; @@ -61,7 +61,7 @@ export type DetachedTaskProgressParams = { eventSummary?: string | null; }; -export type DetachedTaskCompleteParams = { +type DetachedTaskCompleteParams = { runId: string; runtime?: TaskRuntime; sessionKey?: string; @@ -73,7 +73,7 @@ export type DetachedTaskCompleteParams = { suppressDelivery?: boolean; }; -export type DetachedTaskFailParams = { +type DetachedTaskFailParams = { runId: string; runtime?: TaskRuntime; sessionKey?: string; @@ -105,7 +105,7 @@ export type DetachedTaskTerminalState = Omit< "runId" | "runtime" | "sessionKey" >; -export type DetachedTaskDeliveryStatusParams = { +type DetachedTaskDeliveryStatusParams = { runId: string; runtime?: TaskRuntime; sessionKey?: string; @@ -113,13 +113,13 @@ export type DetachedTaskDeliveryStatusParams = { error?: string; }; -export type DetachedTaskCancelParams = { +type DetachedTaskCancelParams = { cfg: OpenClawConfig; taskId: string; reason?: string; }; -export type DetachedTaskCancelResult = { +type DetachedTaskCancelResult = { found: boolean; cancelled: boolean; reason?: string; diff --git a/src/tasks/detached-task-runtime-state.ts b/src/tasks/detached-task-runtime-state.ts index 2d70ba202970..186a29609291 100644 --- a/src/tasks/detached-task-runtime-state.ts +++ b/src/tasks/detached-task-runtime-state.ts @@ -4,7 +4,7 @@ import type { DetachedTaskLifecycleRuntimeRegistration, } from "./detached-task-runtime-contract.js"; -export type { DetachedTaskLifecycleRuntime, DetachedTaskLifecycleRuntimeRegistration }; +export type { DetachedTaskLifecycleRuntime }; // Process-wide detached task runtime registration, owned by plugin activation. let detachedTaskLifecycleRuntimeRegistration: DetachedTaskLifecycleRuntimeRegistration | undefined; diff --git a/src/tasks/detached-task-runtime.ts b/src/tasks/detached-task-runtime.ts index 0c609d153ba5..979553e1d372 100644 --- a/src/tasks/detached-task-runtime.ts +++ b/src/tasks/detached-task-runtime.ts @@ -58,8 +58,6 @@ function findCoreTaskRun(params: DetachedTaskFindParams): TaskRecord | undefined ); } -export type { DetachedTaskLifecycleRuntime, DetachedTaskLifecycleRuntimeRegistration }; - // Default runtime keeps detached task APIs usable before plugins install custom lifecycle hooks. const DEFAULT_DETACHED_TASK_LIFECYCLE_RUNTIME: DetachedTaskLifecycleRuntime = { createQueuedTaskRun: createQueuedTaskRunFromExecutor, diff --git a/src/tasks/native-subagent-task.ts b/src/tasks/native-subagent-task.ts index 56c11272de7f..1373247ed8ca 100644 --- a/src/tasks/native-subagent-task.ts +++ b/src/tasks/native-subagent-task.ts @@ -2,8 +2,8 @@ // harness and therefore cannot be recovered through an OpenClaw child session. import type { TaskRecord } from "./task-registry.types.js"; -export const COPILOT_NATIVE_SUBAGENT_TASK_KIND = "copilot-native"; -export const COPILOT_NATIVE_SUBAGENT_RUN_ID_PREFIX = "copilot-agent:"; +const COPILOT_NATIVE_SUBAGENT_TASK_KIND = "copilot-native"; +const COPILOT_NATIVE_SUBAGENT_RUN_ID_PREFIX = "copilot-agent:"; const CHILDLESS_NATIVE_SUBAGENT_DEFINITIONS = [ { @@ -16,7 +16,7 @@ const CHILDLESS_NATIVE_SUBAGENT_DEFINITIONS = [ }, ] as const; -export type NativeSubagentTaskDefinition = (typeof CHILDLESS_NATIVE_SUBAGENT_DEFINITIONS)[number]; +type NativeSubagentTaskDefinition = (typeof CHILDLESS_NATIVE_SUBAGENT_DEFINITIONS)[number]; export function resolveChildlessNativeSubagentTaskDefinition( task: TaskRecord, diff --git a/src/tasks/runtime-internal.ts b/src/tasks/runtime-internal.ts index 53f9124fc0bb..09017125ed86 100644 --- a/src/tasks/runtime-internal.ts +++ b/src/tasks/runtime-internal.ts @@ -24,8 +24,6 @@ export { createTaskRecord, deleteTaskRecordById, ensureTaskRegistryReady, - resetTaskRegistryControlRuntimeForTests, - findLatestTaskForFlowId, finalizeTaskRunByRunId, getTaskById, hasActiveTaskForChildSessionKey, @@ -40,13 +38,9 @@ export { markTaskTerminalById, maybeDeliverTaskTerminalUpdate, recordTaskProgressByRunId, - reloadTaskRegistryFromStore, - resetTaskRegistryDeliveryRuntimeForTests, resolveTaskForLookupToken, resetTaskRegistryForTests, isParentFlowLinkError, - setTaskRegistryControlRuntimeForTests, - setTaskRegistryDeliveryRuntimeForTests, setTaskCleanupAfterById, setTaskRunDeliveryStatusByRunId, updateTaskNotifyPolicyById, diff --git a/src/tasks/task-boundaries.test.ts b/src/tasks/task-boundaries.test.ts index 3376cf508ccd..87913b831ebc 100644 --- a/src/tasks/task-boundaries.test.ts +++ b/src/tasks/task-boundaries.test.ts @@ -29,11 +29,13 @@ const TASK_FLOW_REGISTRY_ALLOWED_IMPORTERS = new Set([ "tasks/task-flow-registry.audit.ts", "tasks/task-flow-registry.maintenance.ts", "tasks/task-flow-runtime-internal.ts", + "tasks/task-runtime.test-helpers.ts", ]); const TASK_REGISTRY_ALLOWED_IMPORTERS = new Set([ "tasks/runtime-internal.ts", "tasks/task-owner-access.ts", + "tasks/task-runtime.test-helpers.ts", "tasks/task-status-access.ts", ]); diff --git a/src/tasks/task-flow-registry.store.ts b/src/tasks/task-flow-registry.store.ts index 10235b792ac0..c6ad9ee65789 100644 --- a/src/tasks/task-flow-registry.store.ts +++ b/src/tasks/task-flow-registry.store.ts @@ -9,9 +9,7 @@ import { import type { TaskFlowRegistryStoreSnapshot } from "./task-flow-registry.store.types.js"; import type { TaskFlowRecord } from "./task-flow-registry.types.js"; -export type { TaskFlowRegistryStoreSnapshot } from "./task-flow-registry.store.types.js"; - -export type TaskFlowRegistryStore = { +type TaskFlowRegistryStore = { loadSnapshot: () => TaskFlowRegistryStoreSnapshot; saveSnapshot: (snapshot: TaskFlowRegistryStoreSnapshot) => void; upsertFlow?: (flow: TaskFlowRecord) => void; @@ -35,7 +33,7 @@ export type TaskFlowRegistryObserverEvent = previous: TaskFlowRecord; }; -export type TaskFlowRegistryObservers = { +type TaskFlowRegistryObservers = { // Observers are incremental/best-effort only. Snapshot persistence belongs to TaskFlowRegistryStore. onEvent?: (event: TaskFlowRegistryObserverEvent) => void; }; diff --git a/src/tasks/task-flow-registry.ts b/src/tasks/task-flow-registry.ts index 158b006350f6..dba61bb5f6eb 100644 --- a/src/tasks/task-flow-registry.ts +++ b/src/tasks/task-flow-registry.ts @@ -80,7 +80,7 @@ type FlowRecordCreateFields = { endedAt?: number | null; }; -export type CreateFlowRecordParams = FlowRecordCreateFields & { +type CreateFlowRecordParams = FlowRecordCreateFields & { syncMode?: TaskFlowSyncMode; controllerId?: string | null; revision?: number; @@ -97,7 +97,7 @@ export type TaskFlowUpdateResult = current?: TaskFlowRecord; }; -export type TaskFlowSyncResult = +type TaskFlowSyncResult = | { ok: true; flow: TaskFlowRecord | null; diff --git a/src/tasks/task-flow-runtime-internal.ts b/src/tasks/task-flow-runtime-internal.ts index b8118f80024b..10a920a3a44b 100644 --- a/src/tasks/task-flow-runtime-internal.ts +++ b/src/tasks/task-flow-runtime-internal.ts @@ -14,9 +14,8 @@ export { resetTaskFlowRegistryForTests, resumeFlow, setFlowWaiting, - syncFlowFromTask, syncFlowFromTaskResult, updateFlowRecordByIdExpectedRevision, } from "./task-flow-registry.js"; -export type { TaskFlowSyncResult, TaskFlowUpdateResult } from "./task-flow-registry.js"; +export type { TaskFlowUpdateResult } from "./task-flow-registry.js"; diff --git a/src/tasks/task-registry-control.types.ts b/src/tasks/task-registry-control.types.ts index f8a835f23d4f..11f1520a180e 100644 --- a/src/tasks/task-registry-control.types.ts +++ b/src/tasks/task-registry-control.types.ts @@ -7,13 +7,13 @@ type KillSubagentTargetState = | { state: "terminal"; task: DetachedTaskTerminalState }; /** Admin cancellation hook for ACP sessions owned by task records. */ -export type CancelAcpSessionAdmin = (params: { +type CancelAcpSessionAdmin = (params: { cfg: OpenClawConfig; sessionKey: string; reason: string; }) => Promise; -export type KillSubagentRunAdminResult = +type KillSubagentRunAdminResult = | { found: false; killed: false } | { found: true; @@ -25,7 +25,7 @@ export type KillSubagentRunAdminResult = cascadeLabels?: string[]; }; -export type KillSubagentRunAdmin = (params: { +type KillSubagentRunAdmin = (params: { cfg: OpenClawConfig; sessionKey: string; }) => Promise; diff --git a/src/tasks/task-registry.audit.ts b/src/tasks/task-registry.audit.ts index a59d468bfbad..c14831dd84d5 100644 --- a/src/tasks/task-registry.audit.ts +++ b/src/tasks/task-registry.audit.ts @@ -10,7 +10,7 @@ import { import type { TaskRecord } from "./task-registry.types.js"; import { resolveEffectiveTaskCleanupAfter } from "./task-retention.js"; -export type TaskAuditOptions = { +type TaskAuditOptions = { now?: number; tasks?: TaskRecord[]; staleQueuedMs?: number; @@ -24,7 +24,6 @@ export type RetainedLostTaskAuditSummary = { const DEFAULT_STALE_QUEUED_MS = 10 * 60_000; const DEFAULT_STALE_RUNNING_MS = 30 * 60_000; -export { createEmptyTaskAuditSummary }; export type { TaskAuditCode, TaskAuditFinding, TaskAuditSeverity, TaskAuditSummary }; let taskAuditTaskProvider: () => TaskRecord[] = () => []; diff --git a/src/tasks/task-registry.ts b/src/tasks/task-registry.ts index d39d89c40ff3..ec6a6e1e0706 100644 --- a/src/tasks/task-registry.ts +++ b/src/tasks/task-registry.ts @@ -132,7 +132,7 @@ type TaskDeliveryOwner = { flowId?: string; }; -export type ParentFlowLinkErrorCode = +type ParentFlowLinkErrorCode = | "scope_kind_not_session" | "parent_flow_not_found" | "owner_key_mismatch" diff --git a/src/tasks/task-runtime.test-helpers.ts b/src/tasks/task-runtime.test-helpers.ts new file mode 100644 index 000000000000..456e50d2292c --- /dev/null +++ b/src/tasks/task-runtime.test-helpers.ts @@ -0,0 +1,9 @@ +// Test-only access to task registry reset and runtime-injection hooks. +export { resetTaskFlowRegistryForTests } from "./task-flow-registry.js"; +export { + resetTaskRegistryControlRuntimeForTests, + resetTaskRegistryDeliveryRuntimeForTests, + resetTaskRegistryForTests, + setTaskRegistryControlRuntimeForTests, + setTaskRegistryDeliveryRuntimeForTests, +} from "./task-registry.js"; diff --git a/src/test-utils/channel-plugins.ts b/src/test-utils/channel-plugins.ts index 4164f169166d..ba650e473eab 100644 --- a/src/test-utils/channel-plugins.ts +++ b/src/test-utils/channel-plugins.ts @@ -10,7 +10,7 @@ import { createEmptyPluginRegistry } from "../plugins/registry-empty.js"; import type { PluginRegistry } from "../plugins/registry.js"; /** Registry entry shape used by channel tests without loading real plugins. */ -export type TestChannelRegistration = { +type TestChannelRegistration = { pluginId: string; plugin: unknown; source: string; @@ -84,10 +84,7 @@ export const createOutboundTestPlugin = (params: { ...(params.messaging ? { messaging: params.messaging } : {}), }); -export type BindingResolverTestPlugin = Pick< - ChannelPlugin, - "id" | "meta" | "capabilities" | "config" -> & { +type BindingResolverTestPlugin = Pick & { setup?: Pick, "resolveBindingAccountId">; }; diff --git a/src/test-utils/vitest-spies.ts b/src/test-utils/vitest-spies.ts index 680dc8d80505..4b4fffbc4b38 100644 --- a/src/test-utils/vitest-spies.ts +++ b/src/test-utils/vitest-spies.ts @@ -2,7 +2,7 @@ import { vi } from "vitest"; /** Minimal mock contract for helpers that restore spies after a scoped run. */ -export type RestorableMock = { +type RestorableMock = { mockRestore(): void; }; diff --git a/src/tools/diagnostics.ts b/src/tools/diagnostics.ts index e76456a01995..b828061bb3d3 100644 --- a/src/tools/diagnostics.ts +++ b/src/tools/diagnostics.ts @@ -5,7 +5,7 @@ * distinguish broken tool registration from intentionally hidden tools. */ /** Stable contract error code emitted by the tool planner. */ -export type ToolPlanContractErrorCode = "duplicate-tool-name" | "missing-executor"; +type ToolPlanContractErrorCode = "duplicate-tool-name" | "missing-executor"; /** Error thrown when a visible tool plan cannot be built from descriptors. */ export class ToolPlanContractError extends Error { diff --git a/src/tools/protocol.ts b/src/tools/protocol.ts index 027687425fbd..08ee6ddcf309 100644 --- a/src/tools/protocol.ts +++ b/src/tools/protocol.ts @@ -1,7 +1,7 @@ // Converts planned tool entries into protocol payloads for model runtimes. import type { JsonObject, ToolPlanEntry } from "./types.js"; -export type ToolProtocolDescriptor = { +type ToolProtocolDescriptor = { readonly name: string; readonly description: string; readonly inputSchema: JsonObject; diff --git a/src/trajectory/paths.ts b/src/trajectory/paths.ts index 9ffa9d0fa35c..0780f4de009b 100644 --- a/src/trajectory/paths.ts +++ b/src/trajectory/paths.ts @@ -1,5 +1,5 @@ // Trajectory path helpers resolve storage paths for trajectory artifacts. -import fs from "node:fs"; + import path from "node:path"; import { parseSqliteSessionFileMarker } from "../config/sessions/sqlite-marker.js"; import { resolveHomeRelativePath } from "../infra/home-dir.js"; @@ -11,31 +11,11 @@ export const TRAJECTORY_RUNTIME_CAPTURE_MAX_BYTES = 10 * 1024 * 1024; export const TRAJECTORY_RUNTIME_FILE_MAX_BYTES = 50 * 1024 * 1024; export const TRAJECTORY_RUNTIME_EVENT_MAX_BYTES = 256 * 1024; -type TrajectoryPointerOpenFlagConstants = Pick< - typeof fs.constants, - "O_CREAT" | "O_TRUNC" | "O_WRONLY" -> & - Partial>; - export function safeTrajectorySessionFileName(sessionId: string): string { const safe = sessionId.replaceAll(/[^A-Za-z0-9_-]/g, "_").slice(0, 120); return /[A-Za-z0-9]/u.test(safe) ? safe : "session"; } -// Pointer files are overwritten atomically by callers. O_NOFOLLOW is optional -// because some platforms do not expose it, but use it when Node provides it. -export function resolveTrajectoryPointerOpenFlags( - constants: TrajectoryPointerOpenFlagConstants = fs.constants, -): number { - const noFollow = constants.O_NOFOLLOW; - return ( - constants.O_CREAT | - constants.O_TRUNC | - constants.O_WRONLY | - (typeof noFollow === "number" ? noFollow : 0) - ); -} - function resolveContainedPath(baseDir: string, fileName: string): string { const resolvedBase = path.resolve(baseDir); const resolvedFile = path.resolve(resolvedBase, fileName); diff --git a/src/trajectory/runtime-store.sqlite.test.ts b/src/trajectory/runtime-store.sqlite.test.ts index 0355b467fff0..99b8a9a7bbc1 100644 --- a/src/trajectory/runtime-store.sqlite.test.ts +++ b/src/trajectory/runtime-store.sqlite.test.ts @@ -14,7 +14,6 @@ import { closeOpenClawStateDatabaseForTest } from "../state/openclaw-state-db.js import { appendSqliteTrajectoryRuntimeEvents, loadSqliteTrajectoryRuntimeEvents, - readSqliteTrajectoryRuntimeStatsSync, } from "./runtime-store.sqlite.js"; import type { TrajectoryEvent } from "./types.js"; @@ -85,11 +84,6 @@ describe("SQLite trajectory runtime store", () => { }); expect(events.map((event) => event.type)).toEqual(["event-3", "event-4"]); - expect(readSqliteTrajectoryRuntimeStatsSync({ sessionId: "session-1", storePath })).toEqual({ - eventCount: 2, - maxSeq: 3, - sizeBytes: expect.any(Number), - }); }); it("cascades trajectory rows when the session row is deleted", async () => { diff --git a/src/trajectory/runtime-store.sqlite.ts b/src/trajectory/runtime-store.sqlite.ts index c914d8819306..59f328aac260 100644 --- a/src/trajectory/runtime-store.sqlite.ts +++ b/src/trajectory/runtime-store.sqlite.ts @@ -1,5 +1,5 @@ // SQLite trajectory runtime store owns session-scoped runtime event rows. -import { sql } from "kysely"; + import { resolveSqliteTargetFromSessionStorePath } from "../config/sessions/session-sqlite-target.js"; import { executeSqliteQuerySync, @@ -30,13 +30,7 @@ export type SqliteTrajectoryRuntimeScope = { storePath: string; }; -export type SqliteTrajectoryRuntimeStats = { - eventCount: number; - maxSeq: number; - sizeBytes: number; -}; - -export type SqliteTrajectoryRuntimeEventRow = { +type SqliteTrajectoryRuntimeEventRow = { event: TrajectoryEvent; seq: number; }; @@ -88,7 +82,7 @@ export async function loadSqliteTrajectoryRuntimeEvents( } /** Loads runtime trajectory events synchronously for CLI and export paths. */ -export function loadSqliteTrajectoryRuntimeEventsSync( +function loadSqliteTrajectoryRuntimeEventsSync( scope: Omit, ): TrajectoryEvent[] { return loadSqliteTrajectoryRuntimeEventRowsSync(scope).map((row) => row.event); @@ -122,30 +116,6 @@ export function loadSqliteTrajectoryRuntimeEventRowsSync( })); } -/** Reads trajectory row count, max storage seq, and JSONL-compatible byte size. */ -export function readSqliteTrajectoryRuntimeStatsSync( - scope: Omit, -): SqliteTrajectoryRuntimeStats { - const database = openOpenClawAgentDatabase(toDatabaseOptions(scope)); - const db = getTrajectoryKysely(database.db); - const row = executeSqliteQueryTakeFirstSync( - database.db, - db - .selectFrom("trajectory_runtime_events") - .select((eb) => [ - eb.fn.count("seq").as("event_count"), - eb.fn.max("seq").as("max_seq"), - sqliteTrajectoryJsonlByteSize(), - ]) - .where("session_id", "=", scope.sessionId), - ); - return { - eventCount: row?.event_count ?? 0, - maxSeq: row?.max_seq ?? 0, - sizeBytes: row?.size_bytes ?? 0, - }; -} - function getTrajectoryKysely(database: import("node:sqlite").DatabaseSync) { return getNodeSqliteKysely(database); } @@ -234,11 +204,6 @@ function trajectoryJsonlRowBytes(eventJson: string): number { return Buffer.byteLength(eventJson, "utf8") + 1; } -function sqliteTrajectoryJsonlByteSize() { - return /* kysely-allow-raw: JSONL size includes event bytes plus newline separators. */ sql`COALESCE(SUM(LENGTH(CAST(event_json AS BLOB))), 0) - + CASE WHEN COUNT(*) > 0 THEN COUNT(*) ELSE 0 END`.as("size_bytes"); -} - function readTrajectoryEventTimestamp(event: TrajectoryEvent): number | undefined { const parsed = Date.parse(event.ts); return Number.isFinite(parsed) ? parsed : undefined; diff --git a/src/trajectory/runtime.test.ts b/src/trajectory/runtime.test.ts index f9aa0531c72a..7dcdab5b92b4 100644 --- a/src/trajectory/runtime.test.ts +++ b/src/trajectory/runtime.test.ts @@ -8,7 +8,7 @@ import { replaceSessionEntry } from "../config/sessions/session-accessor.js"; import { formatSqliteSessionFileMarker } from "../config/sessions/sqlite-marker.js"; import { closeOpenClawAgentDatabasesForTest } from "../state/openclaw-agent-db.js"; import { closeOpenClawStateDatabaseForTest } from "../state/openclaw-state-db.js"; -import { TRAJECTORY_RUNTIME_EVENT_MAX_BYTES, resolveTrajectoryPointerOpenFlags } from "./paths.js"; +import { TRAJECTORY_RUNTIME_EVENT_MAX_BYTES } from "./paths.js"; import { loadSqliteTrajectoryRuntimeEvents } from "./runtime-store.sqlite.js"; import { createTrajectoryRuntimeRecorder, toTrajectoryToolDefinitions } from "./runtime.js"; @@ -410,16 +410,6 @@ describe("trajectory runtime", () => { ); }); - it("keeps pointer write flags usable when O_NOFOLLOW is unavailable", () => { - expect( - resolveTrajectoryPointerOpenFlags({ - O_CREAT: 0x01, - O_TRUNC: 0x02, - O_WRONLY: 0x04, - }), - ).toBe(0x07); - }); - it("does not record runtime events when explicitly disabled", () => { const recorder = createTrajectoryRuntimeRecorder({ env: { diff --git a/src/tts/directives.ts b/src/tts/directives.ts index 253a86982ccb..47624be60cb0 100644 --- a/src/tts/directives.ts +++ b/src/tts/directives.ts @@ -24,7 +24,7 @@ type TextRange = { }; /** Streaming cleaner used to strip TTS tags before final text parsing is available. */ -export type TtsDirectiveTextStreamCleaner = { +type TtsDirectiveTextStreamCleaner = { push: (text: string) => string; flush: () => string; hasBufferedDirectiveText: () => boolean; diff --git a/src/tui/commands.ts b/src/tui/commands.ts index 043f388415c8..3be6eb4e06e4 100644 --- a/src/tui/commands.ts +++ b/src/tui/commands.ts @@ -18,12 +18,12 @@ const ELEVATED_LEVELS = ["on", "off", "ask", "full"]; const ACTIVATION_LEVELS = ["mention", "always"]; const USAGE_FOOTER_LEVELS = ["off", "tokens", "full", "reset", "inherit", "clear", "default"]; -export type ParsedCommand = { +type ParsedCommand = { name: string; args: string; }; -export type SlashCommandOptions = { +type SlashCommandOptions = { cfg?: OpenClawConfig; provider?: string; model?: string; diff --git a/src/tui/gateway-chat.ts b/src/tui/gateway-chat.ts index 292895052709..ba04410f8f4d 100644 --- a/src/tui/gateway-chat.ts +++ b/src/tui/gateway-chat.ts @@ -49,20 +49,20 @@ import type { TuiChatSendResult, } from "./tui-backend.js"; -export type GatewayConnectionOptions = { +type GatewayConnectionOptions = { url?: string; token?: string; password?: string; tlsFingerprint?: string; }; -export type GatewayEvent = TuiEvent; +type GatewayEvent = TuiEvent; const STARTUP_CHAT_HISTORY_RETRY_TIMEOUT_MS = 60_000; const STARTUP_CHAT_HISTORY_DEFAULT_RETRY_MS = 500; const STARTUP_CHAT_HISTORY_MAX_RETRY_MS = 5_000; -export type ResolvedGatewayConnection = { +type ResolvedGatewayConnection = { url: string; token?: string; password?: string; @@ -117,9 +117,9 @@ function isLegacyPreserveSideRunsError(err: unknown): boolean { return message.includes("invalid chat.abort params") && message.includes("preservesideruns"); } -export type GatewaySessionList = TuiSessionList; -export type GatewayAgentsList = TuiAgentsList; -export type GatewayModelChoice = TuiModelChoice; +type GatewaySessionList = TuiSessionList; +type GatewayAgentsList = TuiAgentsList; +type GatewayModelChoice = TuiModelChoice; export class GatewayChatClient implements TuiBackend { private client: GatewayClient; diff --git a/src/tui/tui-backend.ts b/src/tui/tui-backend.ts index dae793343f2f..d29d52a72642 100644 --- a/src/tui/tui-backend.ts +++ b/src/tui/tui-backend.ts @@ -31,7 +31,7 @@ export type TuiChatSendResult = { export type TuiApprovalDecision = "allow-once" | "allow-always" | "deny"; -export type TuiTaskSuggestionActionCapabilities = { +type TuiTaskSuggestionActionCapabilities = { canAccept: boolean; canDismiss: boolean; }; @@ -53,7 +53,7 @@ export type TuiPluginApproval = { }; /** Options for forwarding a goal command to a backend session. */ -export type TuiGoalCommandOptions = { +type TuiGoalCommandOptions = { sessionKey: string; agentId?: string; command: string; diff --git a/src/tui/tui-types.ts b/src/tui/tui-types.ts index b14c063555eb..9746f831eac3 100644 --- a/src/tui/tui-types.ts +++ b/src/tui/tui-types.ts @@ -22,7 +22,7 @@ export type TuiOptions = { forceProcessExitOnReturn?: boolean; }; -export type TuiExitReason = "exit" | "return-to-crestodian"; +type TuiExitReason = "exit" | "return-to-crestodian"; export type TuiResult = { exitReason: TuiExitReason; @@ -112,9 +112,9 @@ export type AgentSummary = { name?: string; }; -export type QueuedMessageMode = "steer" | "followUp"; +type QueuedMessageMode = "steer" | "followUp"; -export type QueuedMessage = { +type QueuedMessage = { runId: string; text: string; mode: QueuedMessageMode; diff --git a/src/utils/delivery-context.shared.ts b/src/utils/delivery-context.shared.ts index 7d74faded007..f31ef125fd4d 100644 --- a/src/utils/delivery-context.shared.ts +++ b/src/utils/delivery-context.shared.ts @@ -14,7 +14,7 @@ import { isInternalNonDeliveryChannel, } from "./message-channel-constants.js"; import { isDeliverableMessageChannel, normalizeMessageChannel } from "./message-channel-core.js"; -export type { DeliveryContext, DeliveryContextSessionSource } from "./delivery-context.types.js"; +export type { DeliveryContext } from "./delivery-context.types.js"; /** * Delivery-context normalization and projection helpers. diff --git a/src/utils/message-channel-constants.ts b/src/utils/message-channel-constants.ts index 4c8f98b6f299..49acca3f17d5 100644 --- a/src/utils/message-channel-constants.ts +++ b/src/utils/message-channel-constants.ts @@ -2,7 +2,6 @@ import { isStringOption } from "./string-readers.js"; export const INTERNAL_MESSAGE_CHANNEL = "webchat" as const; -export type InternalMessageChannel = typeof INTERNAL_MESSAGE_CHANNEL; // Internal, non-delivery sources that may surface as a `channel` hint when an // agent run is triggered by something other than a chat message — heartbeat @@ -46,7 +45,7 @@ export const NATIVE_APPROVAL_CHANNELS = [ "telegram", "whatsapp", ] as const; -export type NativeApprovalChannel = (typeof NATIVE_APPROVAL_CHANNELS)[number]; +type NativeApprovalChannel = (typeof NATIVE_APPROVAL_CHANNELS)[number]; export function isNativeApprovalChannel( value: string | null | undefined, diff --git a/src/utils/message-channel.test.ts b/src/utils/message-channel.test.ts index d2ac30b722c5..dc7ac5a8bf7f 100644 --- a/src/utils/message-channel.test.ts +++ b/src/utils/message-channel.test.ts @@ -4,8 +4,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ChannelPlugin } from "../channels/plugins/types.js"; import { setActivePluginRegistry } from "../plugins/runtime.js"; import { createChannelTestPluginBase, createTestRegistry } from "../test-utils/channel-plugins.js"; +import { NATIVE_APPROVAL_CHANNELS } from "./message-channel-constants.js"; import { - NATIVE_APPROVAL_CHANNELS, isEphemeralGatewayClient, isInternalNonDeliveryChannel, isMarkdownCapableMessageChannel, diff --git a/src/utils/message-channel.ts b/src/utils/message-channel.ts index 718fd04aa24c..7422c9ace0c6 100644 --- a/src/utils/message-channel.ts +++ b/src/utils/message-channel.ts @@ -23,10 +23,7 @@ export { export { INTERNAL_MESSAGE_CHANNEL, isInternalNonDeliveryChannel, - NATIVE_APPROVAL_CHANNELS, isNativeApprovalChannel, - type InternalMessageChannel, - type NativeApprovalChannel, } from "./message-channel-constants.js"; import { INTERNAL_MESSAGE_CHANNEL } from "./message-channel-constants.js"; import { normalizeMessageChannel } from "./message-channel-normalize.js"; diff --git a/src/utils/timer-delay.ts b/src/utils/timer-delay.ts index 7b1c67990e8f..261fb3665a98 100644 --- a/src/utils/timer-delay.ts +++ b/src/utils/timer-delay.ts @@ -4,7 +4,6 @@ import { resolveSafeTimeoutDelayMs } from "../../packages/gateway-client/src/tim export { addSafeTimeoutDelayGraceMs, MAX_SAFE_TIMEOUT_DELAY_MS, - resolveFiniteTimeoutDelayMs, resolveSafeTimeoutDelayMs, } from "../../packages/gateway-client/src/timeouts.js"; diff --git a/src/wizard/i18n/index.ts b/src/wizard/i18n/index.ts index 78ea64d53cf6..be2a0e713c56 100644 --- a/src/wizard/i18n/index.ts +++ b/src/wizard/i18n/index.ts @@ -9,7 +9,7 @@ import type { WizardTranslationTree, } from "./types.js"; -export type { WizardI18nParams, WizardLocale, WizardTranslationMap }; +export type { WizardI18nParams }; // Wizard i18n uses dotted keys with English fallback. Locale selection is // intentionally small because setup copy is maintained in-tree. @@ -21,7 +21,7 @@ const LOCALES: Record = { "zh-TW": zh_TW, }; -export const WIZARD_DEFAULT_LOCALE: WizardLocale = "en"; +const WIZARD_DEFAULT_LOCALE: WizardLocale = "en"; export const WIZARD_SUPPORTED_LOCALES: readonly WizardLocale[] = ["en", "zh-CN", "zh-TW"]; function normalizeLocaleToken(raw: string | undefined): string { diff --git a/src/wizard/prompts.ts b/src/wizard/prompts.ts index 39a02e503ab2..868bad79c77e 100644 --- a/src/wizard/prompts.ts +++ b/src/wizard/prompts.ts @@ -49,7 +49,7 @@ export type WizardProgress = { stop: (message?: string) => void; }; -export type WizardDeviceCodeParams = { +type WizardDeviceCodeParams = { title: string; code: string; expiresInMinutes?: number; diff --git a/src/wizard/session.ts b/src/wizard/session.ts index f5aa76b1dcf7..9a3affc9b003 100644 --- a/src/wizard/session.ts +++ b/src/wizard/session.ts @@ -5,7 +5,7 @@ import { WizardCancelledError, type WizardProgress, type WizardPrompter } from " // WizardSession exposes interactive setup as a step/answer protocol for remote // clients while reusing the same WizardPrompter contract as the local CLI. -export type WizardStepOption = { +type WizardStepOption = { value: unknown; label: string; hint?: string; diff --git a/src/wizard/setup.migration-import.ts b/src/wizard/setup.migration-import.ts index 93f701d498fc..ee897c0c12b1 100644 --- a/src/wizard/setup.migration-import.ts +++ b/src/wizard/setup.migration-import.ts @@ -32,14 +32,14 @@ import { WizardCancelledError, type WizardPrompter } from "./prompts.js"; // Onboarding migration import helpers detect existing setups, select a plugin // migration provider, preview a plan, back up state, and apply into fresh setup. -export type SetupMigrationDetection = { +type SetupMigrationDetection = { providerId: string; label: string; source?: string; message?: string; }; -export type SetupMigrationOption = { +type SetupMigrationOption = { providerId: string; label: string; hint?: string; diff --git a/src/wizard/setup.official-plugins.ts b/src/wizard/setup.official-plugins.ts index cdb5e0f593f0..dac124eddfc6 100644 --- a/src/wizard/setup.official-plugins.ts +++ b/src/wizard/setup.official-plugins.ts @@ -17,7 +17,7 @@ const SKIP_VALUE = "__skip__"; // Official plugin onboarding lists generic official plugins not already // configured and installs the selected ones through the trusted install flow. -export type OfficialPluginOnboardingInstallEntry = { +type OfficialPluginOnboardingInstallEntry = { pluginId: string; label: string; description?: string; diff --git a/src/wizard/setup.post-install-migration.ts b/src/wizard/setup.post-install-migration.ts index 47dad1de4b28..9d6389d1562b 100644 --- a/src/wizard/setup.post-install-migration.ts +++ b/src/wizard/setup.post-install-migration.ts @@ -11,7 +11,7 @@ import type { RuntimeEnv } from "../runtime.js"; import { createLazyRuntimeModule } from "../shared/lazy-runtime.js"; import type { WizardPrompter } from "./prompts.js"; -export type PostInstallMigrationOptions = { +type PostInstallMigrationOptions = { config: OpenClawConfig; runtime: RuntimeEnv; // Required only on interactive paths; non-interactive callers can omit it @@ -26,7 +26,7 @@ export type PostInstallMigrationOptions = { nonInteractive?: boolean; }; -export type PostInstallMigrationResult = { +type PostInstallMigrationResult = { config: OpenClawConfig; };