@a1hvdy/cc-openclaw 0.10.4 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/channels/telegram/card-renderer.d.ts +63 -0
- package/dist/src/channels/telegram/card-renderer.js +149 -0
- package/dist/src/channels/telegram/card-renderer.js.map +1 -0
- package/dist/src/channels/telegram/event-reducer.js +3 -15
- package/dist/src/channels/telegram/event-reducer.js.map +1 -1
- package/dist/src/channels/telegram/format-helpers.d.ts +20 -0
- package/dist/src/channels/telegram/format-helpers.js +34 -0
- package/dist/src/channels/telegram/format-helpers.js.map +1 -0
- package/dist/src/channels/telegram/insight-formatter.d.ts +36 -0
- package/dist/src/channels/telegram/insight-formatter.js +36 -0
- package/dist/src/channels/telegram/insight-formatter.js.map +1 -0
- package/dist/src/channels/telegram/live-card.d.ts +7 -90
- package/dist/src/channels/telegram/live-card.js +25 -286
- package/dist/src/channels/telegram/live-card.js.map +1 -1
- package/dist/src/channels/telegram/logger.d.ts +10 -0
- package/dist/src/channels/telegram/logger.js +13 -0
- package/dist/src/channels/telegram/logger.js.map +1 -0
- package/dist/src/channels/telegram/result-preview.d.ts +12 -0
- package/dist/src/channels/telegram/result-preview.js +48 -0
- package/dist/src/channels/telegram/result-preview.js.map +1 -0
- package/dist/src/channels/telegram/throttle-controller.d.ts +54 -0
- package/dist/src/channels/telegram/throttle-controller.js +132 -0
- package/dist/src/channels/telegram/throttle-controller.js.map +1 -0
- package/dist/src/channels/telegram/tool-tracker.d.ts +1 -2
- package/dist/src/channels/telegram/tool-tracker.js +9 -51
- package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
- package/dist/src/cli/checks/bridge-wiring.d.ts +14 -0
- package/dist/src/cli/checks/bridge-wiring.js +64 -0
- package/dist/src/cli/checks/bridge-wiring.js.map +1 -0
- package/dist/src/cli/checks/config-schema.d.ts +11 -0
- package/dist/src/cli/checks/config-schema.js +51 -0
- package/dist/src/cli/checks/config-schema.js.map +1 -0
- package/dist/src/cli/checks/critical-openclaw-json-keys.d.ts +21 -0
- package/dist/src/cli/checks/critical-openclaw-json-keys.js +106 -0
- package/dist/src/cli/checks/critical-openclaw-json-keys.js.map +1 -0
- package/dist/src/cli/checks/install-path.d.ts +11 -0
- package/dist/src/cli/checks/install-path.js +89 -0
- package/dist/src/cli/checks/install-path.js.map +1 -0
- package/dist/src/cli/checks/patch-scaffold.d.ts +17 -0
- package/dist/src/cli/checks/patch-scaffold.js +56 -0
- package/dist/src/cli/checks/patch-scaffold.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +20 -0
- package/dist/src/cli/doctor.js +93 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/index.d.ts +8 -0
- package/dist/src/cli/index.js +39 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/migrate.d.ts +29 -0
- package/dist/src/cli/migrate.js +75 -0
- package/dist/src/cli/migrate.js.map +1 -0
- package/dist/src/command-router/cc-handler.js +35 -709
- package/dist/src/command-router/cc-handler.js.map +1 -1
- package/dist/src/command-router/launch-policy.d.ts +93 -0
- package/dist/src/command-router/launch-policy.js +323 -0
- package/dist/src/command-router/launch-policy.js.map +1 -0
- package/dist/src/command-router/resume-policy.d.ts +18 -0
- package/dist/src/command-router/resume-policy.js +236 -0
- package/dist/src/command-router/resume-policy.js.map +1 -0
- package/dist/src/command-router/turn-formatter.d.ts +19 -0
- package/dist/src/command-router/turn-formatter.js +144 -0
- package/dist/src/command-router/turn-formatter.js.map +1 -0
- package/dist/src/config/drift-detector.d.ts +28 -0
- package/dist/src/config/drift-detector.js +75 -0
- package/dist/src/config/drift-detector.js.map +1 -0
- package/dist/src/config/loader.d.ts +8 -0
- package/dist/src/config/loader.js +69 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +188 -0
- package/dist/src/config/schema.js +98 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/council/build-agent-prompt.d.ts +11 -0
- package/dist/src/council/build-agent-prompt.js +96 -0
- package/dist/src/council/build-agent-prompt.js.map +1 -0
- package/dist/src/council/cleanup-worktrees.d.ts +10 -0
- package/dist/src/council/cleanup-worktrees.js +22 -0
- package/dist/src/council/cleanup-worktrees.js.map +1 -0
- package/dist/src/council/council.js +15 -186
- package/dist/src/council/council.js.map +1 -1
- package/dist/src/council/system-prompt.d.ts +16 -0
- package/dist/src/council/system-prompt.js +40 -0
- package/dist/src/council/system-prompt.js.map +1 -0
- package/dist/src/council/write-worktree-claude-md.d.ts +10 -0
- package/dist/src/council/write-worktree-claude-md.js +41 -0
- package/dist/src/council/write-worktree-claude-md.js.map +1 -0
- package/dist/src/engines/persistent-custom-session.js +3 -8
- package/dist/src/engines/persistent-custom-session.js.map +1 -1
- package/dist/src/engines/resolve-bin.d.ts +14 -0
- package/dist/src/engines/resolve-bin.js +18 -0
- package/dist/src/engines/resolve-bin.js.map +1 -0
- package/dist/src/lib/config-service.js +8 -0
- package/dist/src/lib/config-service.js.map +1 -1
- package/dist/src/lib/debounce.d.ts +12 -0
- package/dist/src/lib/debounce.js +23 -0
- package/dist/src/lib/debounce.js.map +1 -0
- package/dist/src/lib/domain-error.d.ts +59 -0
- package/dist/src/lib/domain-error.js +79 -0
- package/dist/src/lib/domain-error.js.map +1 -0
- package/dist/src/lib/json-array.d.ts +10 -0
- package/dist/src/lib/json-array.js +23 -0
- package/dist/src/lib/json-array.js.map +1 -0
- package/dist/src/lib/safe-upstream-probes.d.ts +25 -0
- package/dist/src/lib/safe-upstream-probes.js +42 -0
- package/dist/src/lib/safe-upstream-probes.js.map +1 -0
- package/dist/src/lib/spawn-async.d.ts +18 -0
- package/dist/src/lib/spawn-async.js +47 -0
- package/dist/src/lib/spawn-async.js.map +1 -0
- package/dist/src/lib/stale-pid-files.d.ts +17 -0
- package/dist/src/lib/stale-pid-files.js +40 -0
- package/dist/src/lib/stale-pid-files.js.map +1 -0
- package/dist/src/lifecycle/boot.d.ts +59 -0
- package/dist/src/lifecycle/boot.js +132 -0
- package/dist/src/lifecycle/boot.js.map +1 -0
- package/dist/src/lifecycle/patch-manifest.d.ts +82 -0
- package/dist/src/lifecycle/patch-manifest.js +126 -0
- package/dist/src/lifecycle/patch-manifest.js.map +1 -0
- package/dist/src/lifecycle/phase-import-upstream.d.ts +12 -0
- package/dist/src/lifecycle/phase-import-upstream.js +18 -0
- package/dist/src/lifecycle/phase-import-upstream.js.map +1 -0
- package/dist/src/lifecycle/phase-install-patches.d.ts +12 -0
- package/dist/src/lifecycle/phase-install-patches.js +31 -0
- package/dist/src/lifecycle/phase-install-patches.js.map +1 -0
- package/dist/src/lifecycle/phase-schedule-jobs.d.ts +12 -0
- package/dist/src/lifecycle/phase-schedule-jobs.js +15 -0
- package/dist/src/lifecycle/phase-schedule-jobs.js.map +1 -0
- package/dist/src/lifecycle/phase-start-server.d.ts +11 -0
- package/dist/src/lifecycle/phase-start-server.js +11 -0
- package/dist/src/lifecycle/phase-start-server.js.map +1 -0
- package/dist/src/lifecycle/phase-validate-config.d.ts +9 -0
- package/dist/src/lifecycle/phase-validate-config.js +25 -0
- package/dist/src/lifecycle/phase-validate-config.js.map +1 -0
- package/dist/src/lifecycle/phase-validate-upstream.d.ts +11 -0
- package/dist/src/lifecycle/phase-validate-upstream.js +16 -0
- package/dist/src/lifecycle/phase-validate-upstream.js.map +1 -0
- package/dist/src/lifecycle/phase-wire-handlers.d.ts +12 -0
- package/dist/src/lifecycle/phase-wire-handlers.js +16 -0
- package/dist/src/lifecycle/phase-wire-handlers.js.map +1 -0
- package/dist/src/observability/event-bus.d.ts +65 -0
- package/dist/src/observability/event-bus.js +52 -0
- package/dist/src/observability/event-bus.js.map +1 -0
- package/dist/src/observability/get-event-bus.d.ts +25 -0
- package/dist/src/observability/get-event-bus.js +34 -0
- package/dist/src/observability/get-event-bus.js.map +1 -0
- package/dist/src/observability/observability-service.d.ts +19 -0
- package/dist/src/observability/observability-service.js +24 -0
- package/dist/src/observability/observability-service.js.map +1 -0
- package/dist/src/observability/subscribers/metrics.d.ts +11 -0
- package/dist/src/observability/subscribers/metrics.js +21 -0
- package/dist/src/observability/subscribers/metrics.js.map +1 -0
- package/dist/src/observability/subscribers/session-capture.d.ts +15 -0
- package/dist/src/observability/subscribers/session-capture.js +25 -0
- package/dist/src/observability/subscribers/session-capture.js.map +1 -0
- package/dist/src/openai-compat/bridges/allowlist.d.ts +19 -0
- package/dist/src/openai-compat/bridges/allowlist.js +28 -0
- package/dist/src/openai-compat/bridges/allowlist.js.map +1 -0
- package/dist/src/openai-compat/bridges/factory.d.ts +30 -0
- package/dist/src/openai-compat/bridges/factory.js +84 -0
- package/dist/src/openai-compat/bridges/factory.js.map +1 -0
- package/dist/src/openai-compat/bridges/media-bridge.d.ts +34 -0
- package/dist/src/openai-compat/bridges/media-bridge.js +20 -0
- package/dist/src/openai-compat/bridges/media-bridge.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-api-shim.d.ts +54 -0
- package/dist/src/openai-compat/bridges/openclaw-api-shim.js +45 -0
- package/dist/src/openai-compat/bridges/openclaw-api-shim.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.d.ts +61 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js +171 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.d.ts +26 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js +38 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js.map +1 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.d.ts +19 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.js +59 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.js.map +1 -0
- package/dist/src/openai-compat/openai-chunk-types.d.ts +35 -0
- package/dist/src/openai-compat/openai-chunk-types.js +9 -0
- package/dist/src/openai-compat/openai-chunk-types.js.map +1 -0
- package/dist/src/openai-compat/openai-compat.d.ts +2 -90
- package/dist/src/openai-compat/openai-compat.js +68 -68
- package/dist/src/openai-compat/openai-compat.js.map +1 -1
- package/dist/src/openai-compat/openai-types.d.ts +71 -0
- package/dist/src/openai-compat/openai-types.js +11 -0
- package/dist/src/openai-compat/openai-types.js.map +1 -0
- package/dist/src/openai-compat/parse-route-body.d.ts +24 -0
- package/dist/src/openai-compat/parse-route-body.js +45 -0
- package/dist/src/openai-compat/parse-route-body.js.map +1 -0
- package/dist/src/openai-compat/tts-rule.d.ts +20 -0
- package/dist/src/openai-compat/tts-rule.js +58 -0
- package/dist/src/openai-compat/tts-rule.js.map +1 -0
- package/dist/src/openai-compat/voice-recovery.js +0 -1
- package/dist/src/openai-compat/voice-recovery.js.map +1 -1
- package/dist/src/patches/cache-parity-registry.d.ts +20 -0
- package/dist/src/patches/cache-parity-registry.js +64 -0
- package/dist/src/patches/cache-parity-registry.js.map +1 -0
- package/dist/src/patches/claude-md-injection.d.ts +10 -0
- package/dist/src/patches/claude-md-injection.js +46 -0
- package/dist/src/patches/claude-md-injection.js.map +1 -0
- package/dist/src/patches/cwd-redirect.d.ts +10 -0
- package/dist/src/patches/cwd-redirect.js +51 -0
- package/dist/src/patches/cwd-redirect.js.map +1 -0
- package/dist/src/patches/embedded-server-route.d.ts +23 -0
- package/dist/src/patches/embedded-server-route.js +64 -0
- package/dist/src/patches/embedded-server-route.js.map +1 -0
- package/dist/src/patches/pricing-overrides.d.ts +10 -0
- package/dist/src/patches/pricing-overrides.js +55 -0
- package/dist/src/patches/pricing-overrides.js.map +1 -0
- package/dist/src/patches/resume-registry-restore.d.ts +11 -0
- package/dist/src/patches/resume-registry-restore.js +48 -0
- package/dist/src/patches/resume-registry-restore.js.map +1 -0
- package/dist/src/patches/session-pid-tracking.d.ts +10 -0
- package/dist/src/patches/session-pid-tracking.js +45 -0
- package/dist/src/patches/session-pid-tracking.js.map +1 -0
- package/dist/src/patches/sysprompt-strip.d.ts +46 -0
- package/dist/src/patches/sysprompt-strip.js +78 -0
- package/dist/src/patches/sysprompt-strip.js.map +1 -0
- package/dist/src/patches/sysprompt-strip.spec.d.ts +33 -0
- package/dist/src/patches/sysprompt-strip.spec.js +53 -0
- package/dist/src/patches/sysprompt-strip.spec.js.map +1 -0
- package/dist/src/patches/tools-restoration.d.ts +12 -0
- package/dist/src/patches/tools-restoration.js +43 -0
- package/dist/src/patches/tools-restoration.js.map +1 -0
- package/dist/src/persistence/migration-v0.d.ts +24 -0
- package/dist/src/persistence/migration-v0.js +142 -0
- package/dist/src/persistence/migration-v0.js.map +1 -0
- package/dist/src/persistence/session-registry.d.ts +57 -0
- package/dist/src/persistence/session-registry.js +58 -0
- package/dist/src/persistence/session-registry.js.map +1 -0
- package/dist/src/persistence/snapshot.d.ts +18 -0
- package/dist/src/persistence/snapshot.js +32 -0
- package/dist/src/persistence/snapshot.js.map +1 -0
- package/dist/src/persistence/wal.d.ts +17 -0
- package/dist/src/persistence/wal.js +32 -0
- package/dist/src/persistence/wal.js.map +1 -0
- package/dist/src/session/persisted-sessions.d.ts +26 -0
- package/dist/src/session/persisted-sessions.js +70 -0
- package/dist/src/session/persisted-sessions.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +2 -11
- package/dist/src/session/session-manager.js +22 -66
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session-bootstrap/boot-self-heal.d.ts +32 -0
- package/dist/src/session-bootstrap/boot-self-heal.js +54 -0
- package/dist/src/session-bootstrap/boot-self-heal.js.map +1 -0
- package/dist/src/session-bootstrap/cwd-patch.js +11 -87
- package/dist/src/session-bootstrap/cwd-patch.js.map +1 -1
- package/dist/src/session-bootstrap/resume-registry.d.ts +29 -0
- package/dist/src/session-bootstrap/resume-registry.js +58 -0
- package/dist/src/session-bootstrap/resume-registry.js.map +1 -0
- package/dist/src/session-bootstrap/session-hygiene.d.ts +23 -0
- package/dist/src/session-bootstrap/session-hygiene.js +41 -0
- package/dist/src/session-bootstrap/session-hygiene.js.map +1 -0
- package/dist/src/types/runtime-config.d.ts +11 -0
- package/dist/src/types/runtime-config.js +9 -0
- package/dist/src/types/runtime-config.js.map +1 -1
- package/dist/src/types/tool-bridge.d.ts +2 -1
- package/dist/src/types/tool-bridge.js +1 -0
- package/dist/src/types/tool-bridge.js.map +1 -1
- package/package.json +1 -1
- package/dist/scripts/bench/ab-harness.d.ts +0 -58
- package/dist/scripts/bench/ab-harness.d.ts.map +0 -1
- package/dist/scripts/bench/ab-harness.js +0 -78
- package/dist/scripts/bench/ab-harness.js.map +0 -1
- package/dist/src/channels/adapter.d.ts.map +0 -1
- package/dist/src/channels/telegram/completion-summary.d.ts.map +0 -1
- package/dist/src/channels/telegram/error-renderer.d.ts.map +0 -1
- package/dist/src/channels/telegram/event-reducer.d.ts.map +0 -1
- package/dist/src/channels/telegram/index.d.ts.map +0 -1
- package/dist/src/channels/telegram/injector.d.ts.map +0 -1
- package/dist/src/channels/telegram/live-card.d.ts.map +0 -1
- package/dist/src/channels/telegram/state-machine.d.ts.map +0 -1
- package/dist/src/channels/telegram/tool-tracker.d.ts.map +0 -1
- package/dist/src/command-router/cc-handler.d.ts.map +0 -1
- package/dist/src/command-router/index.d.ts.map +0 -1
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/council/consensus.d.ts.map +0 -1
- package/dist/src/council/council.d.ts.map +0 -1
- package/dist/src/council/index.d.ts.map +0 -1
- package/dist/src/engines/base-oneshot-session.d.ts.map +0 -1
- package/dist/src/engines/index.d.ts.map +0 -1
- package/dist/src/engines/persistent-codex-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-cursor-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-custom-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-gemini-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-session.d.ts.map +0 -1
- package/dist/src/health/handler.d.ts.map +0 -1
- package/dist/src/health/index.d.ts.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/lib/auto-recovery.d.ts.map +0 -1
- package/dist/src/lib/cache-parity.d.ts.map +0 -1
- package/dist/src/lib/circuit-breaker.d.ts.map +0 -1
- package/dist/src/lib/config.d.ts.map +0 -1
- package/dist/src/lib/drift-detector.d.ts.map +0 -1
- package/dist/src/lib/error-formatter.d.ts.map +0 -1
- package/dist/src/lib/heartbeat-workaround.d.ts.map +0 -1
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/register-guard.d.ts.map +0 -1
- package/dist/src/lib/route-flag.d.ts +0 -49
- package/dist/src/lib/route-flag.d.ts.map +0 -1
- package/dist/src/lib/route-flag.js +0 -52
- package/dist/src/lib/route-flag.js.map +0 -1
- package/dist/src/lib/sysprompt-strip.d.ts.map +0 -1
- package/dist/src/lib/telemetry.d.ts.map +0 -1
- package/dist/src/lib/test-mode.d.ts.map +0 -1
- package/dist/src/lib/vendor-paths.d.ts.map +0 -1
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/mcp/bridge.d.ts.map +0 -1
- package/dist/src/mcp/index.d.ts.map +0 -1
- package/dist/src/models.d.ts.map +0 -1
- package/dist/src/openai-compat/cli-stream-parser.d.ts.map +0 -1
- package/dist/src/openai-compat/index.d.ts.map +0 -1
- package/dist/src/openai-compat/openai-compat.d.ts.map +0 -1
- package/dist/src/openai-compat/skill-resolver.d.ts.map +0 -1
- package/dist/src/openai-compat/sse-translator.d.ts.map +0 -1
- package/dist/src/proxy/anthropic-adapter.d.ts.map +0 -1
- package/dist/src/proxy/handler.d.ts.map +0 -1
- package/dist/src/proxy/index.d.ts.map +0 -1
- package/dist/src/proxy/schema-cleaner.d.ts.map +0 -1
- package/dist/src/proxy/thought-cache.d.ts.map +0 -1
- package/dist/src/session/embedded-server.d.ts.map +0 -1
- package/dist/src/session/inbox-manager.d.ts.map +0 -1
- package/dist/src/session/index.d.ts.map +0 -1
- package/dist/src/session/session-manager.d.ts.map +0 -1
- package/dist/src/session-bootstrap/cwd-patch.d.ts.map +0 -1
- package/dist/src/session-bootstrap/index.d.ts.map +0 -1
- package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +0 -1
- package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/validation.d.ts.map +0 -1
- package/dist/tests/_helpers/subprocess-mock.d.ts +0 -35
- package/dist/tests/_helpers/subprocess-mock.d.ts.map +0 -1
- package/dist/tests/_helpers/subprocess-mock.js +0 -136
- package/dist/tests/_helpers/subprocess-mock.js.map +0 -1
- package/dist/tests/auto-recovery.test.d.ts +0 -2
- package/dist/tests/auto-recovery.test.d.ts.map +0 -1
- package/dist/tests/auto-recovery.test.js +0 -185
- package/dist/tests/auto-recovery.test.js.map +0 -1
- package/dist/tests/bench-harness.test.d.ts +0 -2
- package/dist/tests/bench-harness.test.d.ts.map +0 -1
- package/dist/tests/bench-harness.test.js +0 -21
- package/dist/tests/bench-harness.test.js.map +0 -1
- package/dist/tests/cache-parity.test.d.ts +0 -2
- package/dist/tests/cache-parity.test.d.ts.map +0 -1
- package/dist/tests/cache-parity.test.js +0 -401
- package/dist/tests/cache-parity.test.js.map +0 -1
- package/dist/tests/command-router.test.d.ts +0 -2
- package/dist/tests/command-router.test.d.ts.map +0 -1
- package/dist/tests/command-router.test.js +0 -60
- package/dist/tests/command-router.test.js.map +0 -1
- package/dist/tests/council.test.d.ts +0 -2
- package/dist/tests/council.test.d.ts.map +0 -1
- package/dist/tests/council.test.js +0 -20
- package/dist/tests/council.test.js.map +0 -1
- package/dist/tests/drift-detector.test.d.ts +0 -2
- package/dist/tests/drift-detector.test.d.ts.map +0 -1
- package/dist/tests/drift-detector.test.js +0 -268
- package/dist/tests/drift-detector.test.js.map +0 -1
- package/dist/tests/eager-bootstrap-gating.test.d.ts +0 -9
- package/dist/tests/eager-bootstrap-gating.test.d.ts.map +0 -1
- package/dist/tests/eager-bootstrap-gating.test.js +0 -97
- package/dist/tests/eager-bootstrap-gating.test.js.map +0 -1
- package/dist/tests/engines.test.d.ts +0 -2
- package/dist/tests/engines.test.d.ts.map +0 -1
- package/dist/tests/engines.test.js +0 -8
- package/dist/tests/engines.test.js.map +0 -1
- package/dist/tests/error-formatter.test.d.ts +0 -2
- package/dist/tests/error-formatter.test.d.ts.map +0 -1
- package/dist/tests/error-formatter.test.js +0 -220
- package/dist/tests/error-formatter.test.js.map +0 -1
- package/dist/tests/health.test.d.ts +0 -2
- package/dist/tests/health.test.d.ts.map +0 -1
- package/dist/tests/health.test.js +0 -110
- package/dist/tests/health.test.js.map +0 -1
- package/dist/tests/heartbeat-workaround.test.d.ts +0 -2
- package/dist/tests/heartbeat-workaround.test.d.ts.map +0 -1
- package/dist/tests/heartbeat-workaround.test.js +0 -90
- package/dist/tests/heartbeat-workaround.test.js.map +0 -1
- package/dist/tests/index.test.d.ts +0 -2
- package/dist/tests/index.test.d.ts.map +0 -1
- package/dist/tests/index.test.js +0 -7
- package/dist/tests/index.test.js.map +0 -1
- package/dist/tests/lib-sysprompt-strip.test.d.ts +0 -2
- package/dist/tests/lib-sysprompt-strip.test.d.ts.map +0 -1
- package/dist/tests/lib-sysprompt-strip.test.js +0 -145
- package/dist/tests/lib-sysprompt-strip.test.js.map +0 -1
- package/dist/tests/listener-activation.test.d.ts +0 -2
- package/dist/tests/listener-activation.test.d.ts.map +0 -1
- package/dist/tests/listener-activation.test.js +0 -87
- package/dist/tests/listener-activation.test.js.map +0 -1
- package/dist/tests/mcp-bridge.test.d.ts +0 -2
- package/dist/tests/mcp-bridge.test.d.ts.map +0 -1
- package/dist/tests/mcp-bridge.test.js +0 -137
- package/dist/tests/mcp-bridge.test.js.map +0 -1
- package/dist/tests/openai-compat.test.d.ts +0 -2
- package/dist/tests/openai-compat.test.d.ts.map +0 -1
- package/dist/tests/openai-compat.test.js +0 -8
- package/dist/tests/openai-compat.test.js.map +0 -1
- package/dist/tests/proxy-heartbeat-integration.test.d.ts +0 -15
- package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +0 -1
- package/dist/tests/proxy-heartbeat-integration.test.js +0 -122
- package/dist/tests/proxy-heartbeat-integration.test.js.map +0 -1
- package/dist/tests/proxy.test.d.ts +0 -2
- package/dist/tests/proxy.test.d.ts.map +0 -1
- package/dist/tests/proxy.test.js +0 -8
- package/dist/tests/proxy.test.js.map +0 -1
- package/dist/tests/register-guard-stacking.test.d.ts +0 -2
- package/dist/tests/register-guard-stacking.test.d.ts.map +0 -1
- package/dist/tests/register-guard-stacking.test.js +0 -61
- package/dist/tests/register-guard-stacking.test.js.map +0 -1
- package/dist/tests/register-guard.test.d.ts +0 -2
- package/dist/tests/register-guard.test.d.ts.map +0 -1
- package/dist/tests/register-guard.test.js +0 -129
- package/dist/tests/register-guard.test.js.map +0 -1
- package/dist/tests/route-flag-rollback.test.d.ts +0 -2
- package/dist/tests/route-flag-rollback.test.d.ts.map +0 -1
- package/dist/tests/route-flag-rollback.test.js +0 -70
- package/dist/tests/route-flag-rollback.test.js.map +0 -1
- package/dist/tests/route-flag.test.d.ts +0 -2
- package/dist/tests/route-flag.test.d.ts.map +0 -1
- package/dist/tests/route-flag.test.js +0 -101
- package/dist/tests/route-flag.test.js.map +0 -1
- package/dist/tests/session-bootstrap.test.d.ts +0 -2
- package/dist/tests/session-bootstrap.test.d.ts.map +0 -1
- package/dist/tests/session-bootstrap.test.js +0 -183
- package/dist/tests/session-bootstrap.test.js.map +0 -1
- package/dist/tests/session.test.d.ts +0 -2
- package/dist/tests/session.test.d.ts.map +0 -1
- package/dist/tests/session.test.js +0 -17
- package/dist/tests/session.test.js.map +0 -1
- package/dist/tests/state-machine.test.d.ts +0 -2
- package/dist/tests/state-machine.test.d.ts.map +0 -1
- package/dist/tests/state-machine.test.js +0 -133
- package/dist/tests/state-machine.test.js.map +0 -1
- package/dist/tests/streaming/cli-stream-parser.test.d.ts +0 -2
- package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +0 -1
- package/dist/tests/streaming/cli-stream-parser.test.js +0 -233
- package/dist/tests/streaming/cli-stream-parser.test.js.map +0 -1
- package/dist/tests/streaming/feature-flag.test.d.ts +0 -14
- package/dist/tests/streaming/feature-flag.test.d.ts.map +0 -1
- package/dist/tests/streaming/feature-flag.test.js +0 -163
- package/dist/tests/streaming/feature-flag.test.js.map +0 -1
- package/dist/tests/streaming/no-tools-prompt.test.d.ts +0 -17
- package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +0 -1
- package/dist/tests/streaming/no-tools-prompt.test.js +0 -229
- package/dist/tests/streaming/no-tools-prompt.test.js.map +0 -1
- package/dist/tests/streaming/skill-plus-tools.test.d.ts +0 -14
- package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +0 -1
- package/dist/tests/streaming/skill-plus-tools.test.js +0 -234
- package/dist/tests/streaming/skill-plus-tools.test.js.map +0 -1
- package/dist/tests/streaming/sse-translator.test.d.ts +0 -2
- package/dist/tests/streaming/sse-translator.test.d.ts.map +0 -1
- package/dist/tests/streaming/sse-translator.test.js +0 -227
- package/dist/tests/streaming/sse-translator.test.js.map +0 -1
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +0 -11
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +0 -1
- package/dist/tests/streaming/tool-result-roundtrip.test.js +0 -215
- package/dist/tests/streaming/tool-result-roundtrip.test.js.map +0 -1
- package/dist/tests/streaming/tool-use-translation.test.d.ts +0 -10
- package/dist/tests/streaming/tool-use-translation.test.d.ts.map +0 -1
- package/dist/tests/streaming/tool-use-translation.test.js +0 -251
- package/dist/tests/streaming/tool-use-translation.test.js.map +0 -1
- package/dist/tests/telegram-bridge.test.d.ts +0 -2
- package/dist/tests/telegram-bridge.test.d.ts.map +0 -1
- package/dist/tests/telegram-bridge.test.js +0 -17
- package/dist/tests/telegram-bridge.test.js.map +0 -1
- package/dist/tests/telegram-injector.test.d.ts +0 -2
- package/dist/tests/telegram-injector.test.d.ts.map +0 -1
- package/dist/tests/telegram-injector.test.js +0 -74
- package/dist/tests/telegram-injector.test.js.map +0 -1
- package/dist/tests/telemetry.test.d.ts +0 -2
- package/dist/tests/telemetry.test.d.ts.map +0 -1
- package/dist/tests/telemetry.test.js +0 -405
- package/dist/tests/telemetry.test.js.map +0 -1
- package/dist/tests/test-mode.test.d.ts +0 -2
- package/dist/tests/test-mode.test.d.ts.map +0 -1
- package/dist/tests/test-mode.test.js +0 -39
- package/dist/tests/test-mode.test.js.map +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatchSpec: tools-restoration — Phase E#3 scaffold.
|
|
3
|
+
*
|
|
4
|
+
* Target: removal of the legacy `body.tools=''` defensive block. Phase 2
|
|
5
|
+
* R5 — historically the proxy stripped tools; v0.5.x added Native streaming;
|
|
6
|
+
* Phase E#3 finalizes by ensuring no leftover `tools=''` write-paths exist.
|
|
7
|
+
* Drift-detection only today.
|
|
8
|
+
*/
|
|
9
|
+
import type { PatchSpec } from '../lifecycle/patch-manifest.js';
|
|
10
|
+
type ToolsRestorationTarget = Record<string, unknown>;
|
|
11
|
+
export declare const toolsRestorationSpec: PatchSpec<ToolsRestorationTarget>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatchSpec: tools-restoration — Phase E#3 scaffold.
|
|
3
|
+
*
|
|
4
|
+
* Target: removal of the legacy `body.tools=''` defensive block. Phase 2
|
|
5
|
+
* R5 — historically the proxy stripped tools; v0.5.x added Native streaming;
|
|
6
|
+
* Phase E#3 finalizes by ensuring no leftover `tools=''` write-paths exist.
|
|
7
|
+
* Drift-detection only today.
|
|
8
|
+
*/
|
|
9
|
+
export const toolsRestorationSpec = {
|
|
10
|
+
id: 'tools-restoration',
|
|
11
|
+
targetModule: 'openclaw',
|
|
12
|
+
targetSymbol: 'EmbeddedServer.route — tools=[] forwarding',
|
|
13
|
+
async resolve() {
|
|
14
|
+
const upstream = (await import('openclaw'));
|
|
15
|
+
if (typeof upstream !== 'object' || upstream === null) {
|
|
16
|
+
throw new Error('openclaw import did not return an object');
|
|
17
|
+
}
|
|
18
|
+
return upstream;
|
|
19
|
+
},
|
|
20
|
+
expectedShape(target) {
|
|
21
|
+
// Tools-forwarding integrity probe — verify the server-startup +
|
|
22
|
+
// CLI entry surface, since tools routing flows through runLegacyCliEntry.
|
|
23
|
+
if (typeof target !== 'object' || target === null)
|
|
24
|
+
return false;
|
|
25
|
+
return (typeof target.runLegacyCliEntry === 'function' &&
|
|
26
|
+
typeof target.loadConfig === 'function');
|
|
27
|
+
},
|
|
28
|
+
async expectedBehavior(_target) {
|
|
29
|
+
// Phase E#3 finding 4 workaround (2026-05-13): tools-forwarding depends
|
|
30
|
+
// on the active openclaw.json. Verify it's reachable via raw JSON.parse
|
|
31
|
+
// rather than going through loadConfig (which schema-rejects
|
|
32
|
+
// cc-openclaw-specific keys).
|
|
33
|
+
const { probeOpenclawJsonReachable } = await import('../lib/safe-upstream-probes.js');
|
|
34
|
+
return probeOpenclawJsonReachable();
|
|
35
|
+
},
|
|
36
|
+
install(_target) {
|
|
37
|
+
// Phase E#3 — ensure tools forwarding is preserved (no `tools=''` overwrite).
|
|
38
|
+
},
|
|
39
|
+
uninstall(_target) {
|
|
40
|
+
// Phase E#3 — restore original tools forwarding behavior.
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=tools-restoration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-restoration.js","sourceRoot":"","sources":["../../../src/patches/tools-restoration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,CAAC,MAAM,oBAAoB,GAAsC;IACrE,EAAE,EAAE,mBAAmB;IACvB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,4CAA4C;IAE1D,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAY,CAAC;QACvD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,QAAkC,CAAC;IAC5C,CAAC;IAED,aAAa,CAAC,MAA8B;QAC1C,iEAAiE;QACjE,0EAA0E;QAC1E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,CACL,OAAO,MAAM,CAAC,iBAAiB,KAAK,UAAU;YAC9C,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,CACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAA+B;QACpD,wEAAwE;QACxE,wEAAwE;QACxE,6DAA6D;QAC7D,8BAA8B;QAC9B,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACtF,OAAO,0BAA0B,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,OAA+B;QACrC,8EAA8E;IAChF,CAAC;IAED,SAAS,CAAC,OAA+B;QACvC,0DAA0D;IAC5D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MigrationV0 — reads the legacy 4-file persistence format READ-ONLY into
|
|
3
|
+
* SessionRegistry on first boot (Q5 resolution: auto-migrate read-only;
|
|
4
|
+
* explicit `cc-openclaw migrate --commit` required for deletion).
|
|
5
|
+
*
|
|
6
|
+
* Legacy files (NEVER deleted by this module):
|
|
7
|
+
* ~/.openclaw/claude-sessions.json
|
|
8
|
+
* ~/.openclaw/savvy-resume-registry.json
|
|
9
|
+
* ~/.openclaw/session-pids.json
|
|
10
|
+
* ~/.openclaw/openclaw-cache-parity-registry.json
|
|
11
|
+
*
|
|
12
|
+
* Shapes are parsed permissively (unknown → narrowed via type guards).
|
|
13
|
+
* Missing or malformed files are silently skipped — migration is best-effort.
|
|
14
|
+
*/
|
|
15
|
+
import { type SessionState } from './session-registry.js';
|
|
16
|
+
export declare class MigrationV0 {
|
|
17
|
+
/**
|
|
18
|
+
* Read all legacy files and return SessionState[] for loading into
|
|
19
|
+
* SessionRegistry. NEVER modifies or deletes the source files.
|
|
20
|
+
*/
|
|
21
|
+
readLegacy(): Promise<SessionState[]>;
|
|
22
|
+
private readPidMap;
|
|
23
|
+
private readCacheParityMap;
|
|
24
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MigrationV0 — reads the legacy 4-file persistence format READ-ONLY into
|
|
3
|
+
* SessionRegistry on first boot (Q5 resolution: auto-migrate read-only;
|
|
4
|
+
* explicit `cc-openclaw migrate --commit` required for deletion).
|
|
5
|
+
*
|
|
6
|
+
* Legacy files (NEVER deleted by this module):
|
|
7
|
+
* ~/.openclaw/claude-sessions.json
|
|
8
|
+
* ~/.openclaw/savvy-resume-registry.json
|
|
9
|
+
* ~/.openclaw/session-pids.json
|
|
10
|
+
* ~/.openclaw/openclaw-cache-parity-registry.json
|
|
11
|
+
*
|
|
12
|
+
* Shapes are parsed permissively (unknown → narrowed via type guards).
|
|
13
|
+
* Missing or malformed files are silently skipped — migration is best-effort.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readFileSync } from 'fs';
|
|
16
|
+
import { homedir } from 'os';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
import { asSessionName } from './session-registry.js';
|
|
19
|
+
const HOME = homedir();
|
|
20
|
+
const OPENCLAW_ROOT = join(HOME, '.openclaw');
|
|
21
|
+
const LEGACY_PATHS = {
|
|
22
|
+
claudeSessions: join(OPENCLAW_ROOT, 'claude-sessions.json'),
|
|
23
|
+
savvyResume: join(OPENCLAW_ROOT, 'savvy-resume-registry.json'),
|
|
24
|
+
sessionPids: join(OPENCLAW_ROOT, 'session-pids.json'),
|
|
25
|
+
cacheParity: join(OPENCLAW_ROOT, 'openclaw-cache-parity-registry.json'),
|
|
26
|
+
};
|
|
27
|
+
// ── Internal type guards ──────────────────────────────────────────────────────
|
|
28
|
+
function isRecord(v) {
|
|
29
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
30
|
+
}
|
|
31
|
+
function safeReadJson(path) {
|
|
32
|
+
if (!existsSync(path))
|
|
33
|
+
return null;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ── MigrationV0 ───────────────────────────────────────────────────────────────
|
|
42
|
+
export class MigrationV0 {
|
|
43
|
+
/**
|
|
44
|
+
* Read all legacy files and return SessionState[] for loading into
|
|
45
|
+
* SessionRegistry. NEVER modifies or deletes the source files.
|
|
46
|
+
*/
|
|
47
|
+
async readLegacy() {
|
|
48
|
+
const results = [];
|
|
49
|
+
const pidMap = this.readPidMap();
|
|
50
|
+
const cacheMap = this.readCacheParityMap();
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
const addEntry = (keyOrName, val, defaults = { skipPersistence: 'never' }) => {
|
|
53
|
+
let name;
|
|
54
|
+
try {
|
|
55
|
+
name = asSessionName(keyOrName);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (seen.has(name))
|
|
61
|
+
return;
|
|
62
|
+
seen.add(name);
|
|
63
|
+
const cwd = isRecord(val) && typeof val['cwd'] === 'string' ? val['cwd'] : process.cwd();
|
|
64
|
+
const skipRaw = isRecord(val) ? val['skipPersistence'] : undefined;
|
|
65
|
+
const skipPersistence = skipRaw === 'session-only' || skipRaw === 'never-persist'
|
|
66
|
+
? skipRaw
|
|
67
|
+
: defaults.skipPersistence;
|
|
68
|
+
results.push({
|
|
69
|
+
name,
|
|
70
|
+
pid: pidMap.get(name),
|
|
71
|
+
cwd,
|
|
72
|
+
cacheRegistryEntry: cacheMap.get(name),
|
|
73
|
+
skipPersistence,
|
|
74
|
+
updatedAt: new Date().toISOString(),
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
// claude-sessions.json — production shape is an ARRAY of {name, cwd, ...}.
|
|
78
|
+
// Older builds may have written a record keyed by session name; handle both.
|
|
79
|
+
const sessions = safeReadJson(LEGACY_PATHS.claudeSessions);
|
|
80
|
+
if (Array.isArray(sessions)) {
|
|
81
|
+
for (const item of sessions) {
|
|
82
|
+
if (isRecord(item) && typeof item['name'] === 'string') {
|
|
83
|
+
addEntry(item['name'], item);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (isRecord(sessions)) {
|
|
88
|
+
for (const [key, val] of Object.entries(sessions))
|
|
89
|
+
addEntry(key, val);
|
|
90
|
+
}
|
|
91
|
+
// savvy-resume-registry.json — same dual-shape handling; supplies any
|
|
92
|
+
// sessions missing from claude-sessions.json.
|
|
93
|
+
const savvy = safeReadJson(LEGACY_PATHS.savvyResume);
|
|
94
|
+
if (Array.isArray(savvy)) {
|
|
95
|
+
for (const item of savvy) {
|
|
96
|
+
if (isRecord(item) && typeof item['name'] === 'string') {
|
|
97
|
+
addEntry(item['name'], item);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (isRecord(savvy)) {
|
|
102
|
+
for (const [key, val] of Object.entries(savvy))
|
|
103
|
+
addEntry(key, val);
|
|
104
|
+
}
|
|
105
|
+
return results;
|
|
106
|
+
}
|
|
107
|
+
readPidMap() {
|
|
108
|
+
const map = new Map();
|
|
109
|
+
const raw = safeReadJson(LEGACY_PATHS.sessionPids);
|
|
110
|
+
if (!isRecord(raw))
|
|
111
|
+
return map;
|
|
112
|
+
for (const [key, val] of Object.entries(raw)) {
|
|
113
|
+
try {
|
|
114
|
+
const name = asSessionName(key);
|
|
115
|
+
if (typeof val === 'number')
|
|
116
|
+
map.set(name, val);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// skip
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return map;
|
|
123
|
+
}
|
|
124
|
+
readCacheParityMap() {
|
|
125
|
+
const map = new Map();
|
|
126
|
+
const raw = safeReadJson(LEGACY_PATHS.cacheParity);
|
|
127
|
+
if (!isRecord(raw))
|
|
128
|
+
return map;
|
|
129
|
+
for (const [key, val] of Object.entries(raw)) {
|
|
130
|
+
try {
|
|
131
|
+
const name = asSessionName(key);
|
|
132
|
+
if (typeof val === 'string')
|
|
133
|
+
map.set(name, val);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// skip
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return map;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=migration-v0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-v0.js","sourceRoot":"","sources":["../../../src/persistence/migration-v0.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionRegistry — typed, branded session state store.
|
|
3
|
+
*
|
|
4
|
+
* Closes the v0.6.0 namespace-bug class structurally:
|
|
5
|
+
* - Branded SessionName ensures "openai-" prefix at the type level.
|
|
6
|
+
* - asSessionName() throws DomainError.SessionPrefixMissing at runtime if
|
|
7
|
+
* the prefix is missing — converting a class of silent bugs to compile errors
|
|
8
|
+
* (branded type) + loud runtime errors (guard).
|
|
9
|
+
*
|
|
10
|
+
* skipPersistence is a typed enum, not a boolean cast (was AS4).
|
|
11
|
+
*
|
|
12
|
+
* WAL append and snapshot bodies are stubs; Phase E wires WalWriter/SnapshotWriter.
|
|
13
|
+
*/
|
|
14
|
+
export type SessionName = string & {
|
|
15
|
+
readonly __brand: 'SessionName';
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Runtime guard that enforces the "openai-" prefix.
|
|
19
|
+
* Returns a branded SessionName on success.
|
|
20
|
+
* Throws SessionPrefixMissing on failure.
|
|
21
|
+
*/
|
|
22
|
+
export declare function asSessionName(s: string): SessionName;
|
|
23
|
+
/**
|
|
24
|
+
* skipPersistence enum mirrors the boolean-cast in legacy session-manager.ts
|
|
25
|
+
* but is explicitly typed (AS4 fix).
|
|
26
|
+
*
|
|
27
|
+
* - "never" → always persist (default)
|
|
28
|
+
* - "session-only" → persist during session, delete on completion
|
|
29
|
+
* - "never-persist" → never write to disk (e.g. ephemeral test sessions)
|
|
30
|
+
*/
|
|
31
|
+
export type SkipPersistence = 'never' | 'session-only' | 'never-persist';
|
|
32
|
+
export interface SessionState {
|
|
33
|
+
name: SessionName;
|
|
34
|
+
pid?: number;
|
|
35
|
+
cwd: string;
|
|
36
|
+
/** Entry in the cache-parity registry (Track B). */
|
|
37
|
+
cacheRegistryEntry?: string;
|
|
38
|
+
skipPersistence: SkipPersistence;
|
|
39
|
+
/** ISO timestamp of last state transition. */
|
|
40
|
+
updatedAt: string;
|
|
41
|
+
}
|
|
42
|
+
export declare class SessionRegistry {
|
|
43
|
+
private readonly map;
|
|
44
|
+
/**
|
|
45
|
+
* Upsert a session state. Triggers a WAL append (stub in Phase D).
|
|
46
|
+
*/
|
|
47
|
+
set(state: SessionState): void;
|
|
48
|
+
get(name: SessionName): SessionState | undefined;
|
|
49
|
+
delete(name: SessionName): void;
|
|
50
|
+
/**
|
|
51
|
+
* Write current Map state to snapshot file (stub in Phase D).
|
|
52
|
+
* Phase E: delegates to SnapshotWriter.
|
|
53
|
+
*/
|
|
54
|
+
snapshot(): Promise<void>;
|
|
55
|
+
get size(): number;
|
|
56
|
+
values(): IterableIterator<SessionState>;
|
|
57
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionRegistry — typed, branded session state store.
|
|
3
|
+
*
|
|
4
|
+
* Closes the v0.6.0 namespace-bug class structurally:
|
|
5
|
+
* - Branded SessionName ensures "openai-" prefix at the type level.
|
|
6
|
+
* - asSessionName() throws DomainError.SessionPrefixMissing at runtime if
|
|
7
|
+
* the prefix is missing — converting a class of silent bugs to compile errors
|
|
8
|
+
* (branded type) + loud runtime errors (guard).
|
|
9
|
+
*
|
|
10
|
+
* skipPersistence is a typed enum, not a boolean cast (was AS4).
|
|
11
|
+
*
|
|
12
|
+
* WAL append and snapshot bodies are stubs; Phase E wires WalWriter/SnapshotWriter.
|
|
13
|
+
*/
|
|
14
|
+
import { SessionPrefixMissing } from '../lib/domain-error.js';
|
|
15
|
+
/**
|
|
16
|
+
* Runtime guard that enforces the "openai-" prefix.
|
|
17
|
+
* Returns a branded SessionName on success.
|
|
18
|
+
* Throws SessionPrefixMissing on failure.
|
|
19
|
+
*/
|
|
20
|
+
export function asSessionName(s) {
|
|
21
|
+
if (!s.startsWith('openai-')) {
|
|
22
|
+
throw new SessionPrefixMissing(s);
|
|
23
|
+
}
|
|
24
|
+
return s;
|
|
25
|
+
}
|
|
26
|
+
// ── SessionRegistry class ─────────────────────────────────────────────────────
|
|
27
|
+
export class SessionRegistry {
|
|
28
|
+
map = new Map();
|
|
29
|
+
/**
|
|
30
|
+
* Upsert a session state. Triggers a WAL append (stub in Phase D).
|
|
31
|
+
*/
|
|
32
|
+
set(state) {
|
|
33
|
+
const entry = { ...state, updatedAt: new Date().toISOString() };
|
|
34
|
+
this.map.set(state.name, entry);
|
|
35
|
+
// Phase E: this.wal.append(entry);
|
|
36
|
+
}
|
|
37
|
+
get(name) {
|
|
38
|
+
return this.map.get(name);
|
|
39
|
+
}
|
|
40
|
+
delete(name) {
|
|
41
|
+
this.map.delete(name);
|
|
42
|
+
// Phase E: this.wal.append({ name, deleted: true, updatedAt: ... });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Write current Map state to snapshot file (stub in Phase D).
|
|
46
|
+
* Phase E: delegates to SnapshotWriter.
|
|
47
|
+
*/
|
|
48
|
+
async snapshot() {
|
|
49
|
+
// Phase E: await this.snapshotWriter.write([...this.map.values()]);
|
|
50
|
+
}
|
|
51
|
+
get size() {
|
|
52
|
+
return this.map.size;
|
|
53
|
+
}
|
|
54
|
+
values() {
|
|
55
|
+
return this.map.values();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../../src/persistence/session-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAgB,CAAC;AAC1B,CAAC;AAyBD,iFAAiF;AAEjF,MAAM,OAAO,eAAe;IACT,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE5D;;OAEG;IACH,GAAG,CAAC,KAAmB;QACrB,MAAM,KAAK,GAAiB,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9E,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,mCAAmC;IACrC,CAAC;IAED,GAAG,CAAC,IAAiB;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,IAAiB;QACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,qEAAqE;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,oEAAoE;IACtE,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SnapshotWriter — periodic full-state snapshot of the SessionRegistry.
|
|
3
|
+
*
|
|
4
|
+
* Snapshot file: ~/.openclaw/workspace/memory/cc-openclaw-session-snapshot.json
|
|
5
|
+
* Written every N minutes from phase 7 (schedule-jobs).
|
|
6
|
+
* Phase E wires SessionRegistry.snapshot() → SnapshotWriter.write().
|
|
7
|
+
* Stub body in Phase D.
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionState } from './session-registry.js';
|
|
10
|
+
export declare class SnapshotWriter {
|
|
11
|
+
private readonly path;
|
|
12
|
+
constructor(path?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Write the full session state array as a JSON file.
|
|
15
|
+
* Phase E: write to a temp file then rename for atomicity.
|
|
16
|
+
*/
|
|
17
|
+
write(states: SessionState[]): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SnapshotWriter — periodic full-state snapshot of the SessionRegistry.
|
|
3
|
+
*
|
|
4
|
+
* Snapshot file: ~/.openclaw/workspace/memory/cc-openclaw-session-snapshot.json
|
|
5
|
+
* Written every N minutes from phase 7 (schedule-jobs).
|
|
6
|
+
* Phase E wires SessionRegistry.snapshot() → SnapshotWriter.write().
|
|
7
|
+
* Stub body in Phase D.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync, writeFileSync } from 'fs';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { join, dirname } from 'path';
|
|
12
|
+
const SNAPSHOT_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-session-snapshot.json');
|
|
13
|
+
export class SnapshotWriter {
|
|
14
|
+
path;
|
|
15
|
+
constructor(path = SNAPSHOT_PATH) {
|
|
16
|
+
this.path = path;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Write the full session state array as a JSON file.
|
|
20
|
+
* Phase E: write to a temp file then rename for atomicity.
|
|
21
|
+
*/
|
|
22
|
+
async write(states) {
|
|
23
|
+
try {
|
|
24
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
25
|
+
writeFileSync(this.path, JSON.stringify(states, null, 2), 'utf8');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Non-fatal stub; Phase E promotes to logged error.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/persistence/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,MAAM,aAAa,GAAG,IAAI,CACxB,OAAO,EAAE,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EACR,mCAAmC,CACpC,CAAC;AAEF,MAAM,OAAO,cAAc;IACR,IAAI,CAAS;IAE9B,YAAY,OAAe,aAAa;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,MAAsB;QAChC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WalWriter — append-only JSONL writer for the session registry WAL.
|
|
3
|
+
*
|
|
4
|
+
* WAL file location: ~/.openclaw/workspace/memory/cc-openclaw-session-wal.jsonl
|
|
5
|
+
* Phase E wires this into SessionRegistry.set() / delete().
|
|
6
|
+
* Stub body in Phase D — compiles and exports the class with the correct interface.
|
|
7
|
+
*/
|
|
8
|
+
export declare class WalWriter {
|
|
9
|
+
private readonly path;
|
|
10
|
+
constructor(path?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Append a JSON-serializable record as a single JSONL line.
|
|
13
|
+
* Creates parent directories if absent. Non-atomic in Phase D stub;
|
|
14
|
+
* Phase E adds write-then-rename for crash safety.
|
|
15
|
+
*/
|
|
16
|
+
append(record: Record<string, unknown>): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WalWriter — append-only JSONL writer for the session registry WAL.
|
|
3
|
+
*
|
|
4
|
+
* WAL file location: ~/.openclaw/workspace/memory/cc-openclaw-session-wal.jsonl
|
|
5
|
+
* Phase E wires this into SessionRegistry.set() / delete().
|
|
6
|
+
* Stub body in Phase D — compiles and exports the class with the correct interface.
|
|
7
|
+
*/
|
|
8
|
+
import { mkdirSync, appendFileSync } from 'fs';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
import { join, dirname } from 'path';
|
|
11
|
+
const WAL_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-session-wal.jsonl');
|
|
12
|
+
export class WalWriter {
|
|
13
|
+
path;
|
|
14
|
+
constructor(path = WAL_PATH) {
|
|
15
|
+
this.path = path;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Append a JSON-serializable record as a single JSONL line.
|
|
19
|
+
* Creates parent directories if absent. Non-atomic in Phase D stub;
|
|
20
|
+
* Phase E adds write-then-rename for crash safety.
|
|
21
|
+
*/
|
|
22
|
+
append(record) {
|
|
23
|
+
try {
|
|
24
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
25
|
+
appendFileSync(this.path, JSON.stringify(record) + '\n', 'utf8');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Non-fatal in Phase D; Phase E promotes to logged error.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=wal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wal.js","sourceRoot":"","sources":["../../../src/persistence/wal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,QAAQ,GAAG,IAAI,CACnB,OAAO,EAAE,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EACR,+BAA+B,CAChC,CAAC;AAEF,MAAM,OAAO,SAAS;IACH,IAAI,CAAS;IAE9B,YAAY,OAAe,QAAQ;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAA+B;QACpC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted sessions disk I/O — load + atomic-write + async-write of the
|
|
3
|
+
* `claude-sessions.json` registry.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `session-manager.ts` 2026-05-13 to reduce that file's LOC.
|
|
6
|
+
* The 3 functions form a coherent persistence layer; moving them together
|
|
7
|
+
* is bounded and behavior-preserving (existing `tests/session.test.ts`
|
|
8
|
+
* + `tests/cache-parity.test.ts` exercise the round-trip).
|
|
9
|
+
*/
|
|
10
|
+
import type { EngineType } from '../types.js';
|
|
11
|
+
import { type Logger } from '../logger.js';
|
|
12
|
+
export declare const PERSIST_DIR: string;
|
|
13
|
+
export declare const PERSIST_FILE: string;
|
|
14
|
+
export interface PersistedSession {
|
|
15
|
+
name: string;
|
|
16
|
+
claudeSessionId: string;
|
|
17
|
+
cwd: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
engine?: EngineType;
|
|
20
|
+
originalCreated: string;
|
|
21
|
+
lastResumed: string;
|
|
22
|
+
lastActivity: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function loadPersistedSessions(): Map<string, PersistedSession>;
|
|
25
|
+
export declare function savePersistedSessions(sessions: Map<string, PersistedSession>, logger?: Logger): void;
|
|
26
|
+
export declare function savePersistedSessionsAsync(sessions: Map<string, PersistedSession>, logger?: Logger): void;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted sessions disk I/O — load + atomic-write + async-write of the
|
|
3
|
+
* `claude-sessions.json` registry.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `session-manager.ts` 2026-05-13 to reduce that file's LOC.
|
|
6
|
+
* The 3 functions form a coherent persistence layer; moving them together
|
|
7
|
+
* is bounded and behavior-preserving (existing `tests/session.test.ts`
|
|
8
|
+
* + `tests/cache-parity.test.ts` exercise the round-trip).
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { createConsoleLogger } from '../logger.js';
|
|
14
|
+
import { PERSIST_DISK_TTL_MS } from '../constants.js';
|
|
15
|
+
export const PERSIST_DIR = path.join(os.homedir(), '.openclaw');
|
|
16
|
+
export const PERSIST_FILE = path.join(PERSIST_DIR, 'claude-sessions.json');
|
|
17
|
+
export function loadPersistedSessions() {
|
|
18
|
+
try {
|
|
19
|
+
if (!fs.existsSync(PERSIST_FILE))
|
|
20
|
+
return new Map();
|
|
21
|
+
const raw = fs.readFileSync(PERSIST_FILE, 'utf8');
|
|
22
|
+
const arr = JSON.parse(raw);
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
// Filter out entries older than disk TTL
|
|
25
|
+
const valid = arr.filter((s) => now - s.lastActivity < PERSIST_DISK_TTL_MS);
|
|
26
|
+
return new Map(valid.map((s) => [s.name, s]));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return new Map();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Atomic write: write to .tmp then rename to avoid corrupt reads on crash
|
|
33
|
+
export function savePersistedSessions(sessions, logger) {
|
|
34
|
+
try {
|
|
35
|
+
fs.mkdirSync(PERSIST_DIR, { recursive: true });
|
|
36
|
+
const arr = Array.from(sessions.values());
|
|
37
|
+
const tmp = PERSIST_FILE + '.tmp';
|
|
38
|
+
fs.writeFileSync(tmp, JSON.stringify(arr, null, 2));
|
|
39
|
+
fs.renameSync(tmp, PERSIST_FILE);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
(logger || createConsoleLogger('SessionManager')).warn('Failed to persist sessions:', err.message);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Async version for hot-path (sendMessage, TTL cleanup)
|
|
46
|
+
export function savePersistedSessionsAsync(sessions, logger) {
|
|
47
|
+
const log = logger || createConsoleLogger('SessionManager');
|
|
48
|
+
const arr = Array.from(sessions.values());
|
|
49
|
+
const tmp = PERSIST_FILE + '.tmp';
|
|
50
|
+
fs.mkdir(PERSIST_DIR, { recursive: true }, (mkdirErr) => {
|
|
51
|
+
if (mkdirErr) {
|
|
52
|
+
log.error('Failed to create persist dir:', mkdirErr.message);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
fs.writeFile(tmp, JSON.stringify(arr, null, 2), (writeErr) => {
|
|
56
|
+
if (writeErr) {
|
|
57
|
+
log.error('Failed to write session file:', writeErr.message);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
fs.rename(tmp, PERSIST_FILE, (renameErr) => {
|
|
61
|
+
if (renameErr) {
|
|
62
|
+
log.error('Failed to rename session file:', renameErr.message);
|
|
63
|
+
// Clean up orphan tmp file
|
|
64
|
+
fs.unlink(tmp, () => { });
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=persisted-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persisted-sessions.js","sourceRoot":"","sources":["../../../src/session/persisted-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,18 +4,9 @@
|
|
|
4
4
|
* Replaces the Express server layer. Pure class with no HTTP dependency.
|
|
5
5
|
* Can be used by Plugin tools, CLI, or any other consumer.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
name: string;
|
|
9
|
-
claudeSessionId: string;
|
|
10
|
-
cwd: string;
|
|
11
|
-
model?: string;
|
|
12
|
-
engine?: EngineType;
|
|
13
|
-
originalCreated: string;
|
|
14
|
-
lastResumed: string;
|
|
15
|
-
lastActivity: number;
|
|
16
|
-
}
|
|
7
|
+
import { type PersistedSession } from './persisted-sessions.js';
|
|
17
8
|
import { type Logger } from '../logger.js';
|
|
18
|
-
import { type SessionConfig, type SessionInfo, type SendResult, type PluginConfig, type EffortLevel, type
|
|
9
|
+
import { type SessionConfig, type SessionInfo, type SendResult, type PluginConfig, type EffortLevel, type AgentInfo, type SkillInfo, type RuleInfo, type StreamEvent, type ISession, type CouncilConfig, type CouncilSession, type CouncilReviewResult, type CouncilAcceptResult, type CouncilRejectResult, type InboxMessage, type UltraplanResult, type UltrareviewResult } from '../types.js';
|
|
19
10
|
interface SendOptions {
|
|
20
11
|
effort?: EffortLevel;
|
|
21
12
|
plan?: boolean;
|