@superblocksteam/vite-plugin-file-sync 2.0.77 → 2.0.78-next.1
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/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +26 -0
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +13 -0
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js +102 -7
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts +17 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +20 -12
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api.js +9 -1
- package/dist/ai-service/agent/tools/apis/build-api.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts +46 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.js +326 -58
- package/dist/ai-service/agent/tools/apis/get-api-docs.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/integration-types.d.ts +20 -1
- package/dist/ai-service/agent/tools/apis/integration-types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/integration-types.js +1033 -288
- package/dist/ai-service/agent/tools/apis/integration-types.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +1 -1
- package/dist/ai-service/agent/tools/apis/write-api.d.ts +2 -2
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-read-file.d.ts +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +1 -1
- package/dist/ai-service/agent/tools/integrations/metadata.js +1 -1
- package/dist/ai-service/agent/tools/integrations/metadata.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +18 -10
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.js +11 -7
- package/dist/ai-service/agent/tools2/tools/ask-multi-choice.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +27 -5
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata-ripgrep.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata-ripgrep.js +78 -7
- package/dist/ai-service/agent/tools2/tools/grep-metadata-ripgrep.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.d.ts +6 -2
- package/dist/ai-service/agent/tools2/tools/grep-metadata.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.js +26 -0
- package/dist/ai-service/agent/tools2/tools/grep-metadata.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/index.d.ts +2 -0
- package/dist/ai-service/agent/tools2/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/index.js +2 -0
- package/dist/ai-service/agent/tools2/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/list-attachments.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/list-attachments.js +2 -3
- package/dist/ai-service/agent/tools2/tools/list-attachments.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/start-test-run.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/start-test-run.js +51 -6
- package/dist/ai-service/agent/tools2/tools/start-test-run.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/web-fetch.d.ts +28 -0
- package/dist/ai-service/agent/tools2/tools/web-fetch.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/web-fetch.js +274 -0
- package/dist/ai-service/agent/tools2/tools/web-fetch.js.map +1 -0
- package/dist/ai-service/agent/tools2/tools/web-search.d.ts +25 -0
- package/dist/ai-service/agent/tools2/tools/web-search.d.ts.map +1 -0
- package/dist/ai-service/agent/tools2/tools/web-search.js +210 -0
- package/dist/ai-service/agent/tools2/tools/web-search.js.map +1 -0
- package/dist/ai-service/attachments/store.d.ts +4 -4
- package/dist/ai-service/attachments/store.d.ts.map +1 -1
- package/dist/ai-service/attachments/store.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +19 -4
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +32 -6
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/clark-provider/clark-language-model.d.ts.map +1 -1
- package/dist/ai-service/clark-provider/clark-language-model.js +11 -2
- package/dist/ai-service/clark-provider/clark-language-model.js.map +1 -1
- package/dist/ai-service/const.d.ts +3 -2
- package/dist/ai-service/const.d.ts.map +1 -1
- package/dist/ai-service/const.js +3 -2
- package/dist/ai-service/const.js.map +1 -1
- package/dist/ai-service/context-download.d.ts +4 -1
- package/dist/ai-service/context-download.d.ts.map +1 -1
- package/dist/ai-service/context-download.js +36 -7
- package/dist/ai-service/context-download.js.map +1 -1
- package/dist/ai-service/features.d.ts +8 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +8 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +1 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +101 -18
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +14 -2
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +19 -2
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/judge/judge-eval-service-runner.d.ts.map +1 -1
- package/dist/ai-service/judge/judge-eval-service-runner.js +7 -0
- package/dist/ai-service/judge/judge-eval-service-runner.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +29 -11
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +95 -78
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context/context.d.ts +2 -1
- package/dist/ai-service/llm/context/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context.js.map +1 -1
- package/dist/ai-service/llm/context/conversation-context.d.ts +89 -0
- package/dist/ai-service/llm/context/conversation-context.d.ts.map +1 -0
- package/dist/ai-service/llm/context/conversation-context.js +13 -0
- package/dist/ai-service/llm/context/conversation-context.js.map +1 -0
- package/dist/ai-service/llm/context/index.d.ts +1 -0
- package/dist/ai-service/llm/context/index.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/get-loaded-context.d.ts +12 -0
- package/dist/ai-service/llm/context/utils/get-loaded-context.d.ts.map +1 -0
- package/dist/ai-service/llm/context/utils/get-loaded-context.js +7 -0
- package/dist/ai-service/llm/context/utils/get-loaded-context.js.map +1 -0
- package/dist/ai-service/llm/context/utils/index.d.ts +1 -5
- package/dist/ai-service/llm/context/utils/index.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/index.js +1 -5
- package/dist/ai-service/llm/context/utils/index.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts +26 -0
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/adapter.js +88 -0
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -0
- package/dist/ai-service/llm/context-v2/caching.d.ts +39 -0
- package/dist/ai-service/llm/context-v2/caching.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/caching.js +48 -0
- package/dist/ai-service/llm/context-v2/caching.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compactor.d.ts +16 -0
- package/dist/ai-service/llm/context-v2/compactor.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compactor.js +164 -0
- package/dist/ai-service/llm/context-v2/compactor.js.map +1 -0
- package/dist/ai-service/llm/context-v2/config.d.ts +6 -0
- package/dist/ai-service/llm/context-v2/config.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/config.js +8 -0
- package/dist/ai-service/llm/context-v2/config.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context.d.ts +61 -0
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/context.js +238 -0
- package/dist/ai-service/llm/context-v2/context.js.map +1 -0
- package/dist/ai-service/llm/context-v2/index.d.ts +16 -0
- package/dist/ai-service/llm/context-v2/index.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/index.js +16 -0
- package/dist/ai-service/llm/context-v2/index.js.map +1 -0
- package/dist/ai-service/llm/context-v2/manager.d.ts +57 -0
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/manager.js +129 -0
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/index.d.ts +8 -0
- package/dist/ai-service/llm/context-v2/migrations/index.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/index.js +8 -0
- package/dist/ai-service/llm/context-v2/migrations/index.js.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/registry.d.ts +19 -0
- package/dist/ai-service/llm/context-v2/migrations/registry.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/registry.js +32 -0
- package/dist/ai-service/llm/context-v2/migrations/registry.js.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/runner.d.ts +3 -0
- package/dist/ai-service/llm/context-v2/migrations/runner.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/runner.js +61 -0
- package/dist/ai-service/llm/context-v2/migrations/runner.js.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/types.d.ts +22 -0
- package/dist/ai-service/llm/context-v2/migrations/types.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/types.js +33 -0
- package/dist/ai-service/llm/context-v2/migrations/types.js.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.d.ts +29 -0
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.js +143 -0
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.js.map +1 -0
- package/dist/ai-service/llm/context-v2/operation-queue.d.ts +9 -0
- package/dist/ai-service/llm/context-v2/operation-queue.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/operation-queue.js +13 -0
- package/dist/ai-service/llm/context-v2/operation-queue.js.map +1 -0
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts +16 -0
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js +135 -0
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -0
- package/dist/ai-service/llm/context-v2/phase2-session-summarizer.d.ts +20 -0
- package/dist/ai-service/llm/context-v2/phase2-session-summarizer.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/phase2-session-summarizer.js +213 -0
- package/dist/ai-service/llm/context-v2/phase2-session-summarizer.js.map +1 -0
- package/dist/ai-service/llm/context-v2/prompts/compaction.d.ts +11 -0
- package/dist/ai-service/llm/context-v2/prompts/compaction.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/prompts/compaction.js +57 -0
- package/dist/ai-service/llm/context-v2/prompts/compaction.js.map +1 -0
- package/dist/ai-service/llm/context-v2/session-capture.d.ts +18 -0
- package/dist/ai-service/llm/context-v2/session-capture.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/session-capture.js +64 -0
- package/dist/ai-service/llm/context-v2/session-capture.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/index.d.ts +14 -0
- package/dist/ai-service/llm/context-v2/storage/index.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/index.js +2 -0
- package/dist/ai-service/llm/context-v2/storage/index.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/local.d.ts +25 -0
- package/dist/ai-service/llm/context-v2/storage/local.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/local.js +71 -0
- package/dist/ai-service/llm/context-v2/storage/local.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/types.d.ts +12 -0
- package/dist/ai-service/llm/context-v2/storage/types.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/types.js +2 -0
- package/dist/ai-service/llm/context-v2/storage/types.js.map +1 -0
- package/dist/ai-service/llm/context-v2/token-tracker.d.ts +4 -0
- package/dist/ai-service/llm/context-v2/token-tracker.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/token-tracker.js +13 -0
- package/dist/ai-service/llm/context-v2/token-tracker.js.map +1 -0
- package/dist/ai-service/llm/context-v2/truncation-fallback.d.ts +10 -0
- package/dist/ai-service/llm/context-v2/truncation-fallback.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/truncation-fallback.js +120 -0
- package/dist/ai-service/llm/context-v2/truncation-fallback.js.map +1 -0
- package/dist/ai-service/llm/context-v2/turns.d.ts +23 -0
- package/dist/ai-service/llm/context-v2/turns.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/turns.js +61 -0
- package/dist/ai-service/llm/context-v2/turns.js.map +1 -0
- package/dist/ai-service/llm/context-v2/types.d.ts +100 -0
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/types.js +262 -0
- package/dist/ai-service/llm/context-v2/types.js.map +1 -0
- package/dist/ai-service/llm/error.d.ts +4 -0
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +26 -0
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/impl/clark.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/clark.js +3 -2
- package/dist/ai-service/llm/impl/clark.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js +3 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -1
- package/dist/ai-service/llm/provider.d.ts +2 -2
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +2 -2
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llm/stream/event-bus.d.ts +1 -1
- package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.d.ts +2 -9
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.js +4 -4
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js +2 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.js +22 -13
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
- package/dist/ai-service/llm/stream/session.d.ts +3 -0
- package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/session.js +2 -0
- package/dist/ai-service/llm/stream/session.js.map +1 -1
- package/dist/ai-service/llm/utils.d.ts +2 -2
- package/dist/ai-service/llm/utils.d.ts.map +1 -1
- package/dist/ai-service/llm/utils.js +27 -10
- package/dist/ai-service/llm/utils.js.map +1 -1
- package/dist/ai-service/llm/workflow-metrics.d.ts +14 -0
- package/dist/ai-service/llm/workflow-metrics.d.ts.map +1 -0
- package/dist/ai-service/llm/workflow-metrics.js +19 -0
- package/dist/ai-service/llm/workflow-metrics.js.map +1 -0
- package/dist/ai-service/security/safety-classifier.d.ts +2 -0
- package/dist/ai-service/security/safety-classifier.d.ts.map +1 -1
- package/dist/ai-service/security/safety-classifier.js +9 -6
- package/dist/ai-service/security/safety-classifier.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +15 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +3 -4
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +32 -18
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js +34 -0
- package/dist/ai-service/state-machine/handlers/awaiting-user.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.js +6 -1
- package/dist/ai-service/state-machine/handlers/idle.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +84 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +6 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts +7 -0
- package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.js +24 -8
- package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
- package/dist/ai-service/transform/api-builder/shared.d.ts +5 -0
- package/dist/ai-service/transform/api-builder/shared.d.ts.map +1 -1
- package/dist/ai-service/transform/api-builder/shared.js +13 -1
- package/dist/ai-service/transform/api-builder/shared.js.map +1 -1
- package/dist/ai-service/transform/api-builder/to-sdk-transformer.d.ts +11 -0
- package/dist/ai-service/transform/api-builder/to-sdk-transformer.d.ts.map +1 -1
- package/dist/ai-service/transform/api-builder/to-sdk-transformer.js +11 -4
- package/dist/ai-service/transform/api-builder/to-sdk-transformer.js.map +1 -1
- package/dist/ai-service/transform/api-builder/to-yaml-transformer.d.ts +4 -0
- package/dist/ai-service/transform/api-builder/to-yaml-transformer.d.ts.map +1 -1
- package/dist/ai-service/transform/api-builder/to-yaml-transformer.js +7 -0
- package/dist/ai-service/transform/api-builder/to-yaml-transformer.js.map +1 -1
- package/dist/binding-extraction/extract-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/extract-identifiers.js +39 -3
- package/dist/binding-extraction/extract-identifiers.js.map +1 -1
- package/dist/clark-log-forwarder.d.ts.map +1 -1
- package/dist/clark-log-forwarder.js +1 -0
- package/dist/clark-log-forwarder.js.map +1 -1
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +4 -1
- package/dist/resolver.js.map +1 -1
- package/dist/router-parser.d.ts.map +1 -1
- package/dist/router-parser.js +34 -9
- package/dist/router-parser.js.map +1 -1
- package/package.json +23 -18
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { streamText } from "ai";
|
|
2
|
+
import { getPrefixedLogger } from "../../../util/logger.js";
|
|
3
|
+
import { LLMObsTracer } from "../../llmobs/tracer.js";
|
|
4
|
+
import { isTokenLimitError } from "../error.js";
|
|
5
|
+
import { COMPACTION_PROMPT, formatCompactionRequest, formatSummaryMessage, } from "./prompts/compaction.js";
|
|
6
|
+
import { createTruncationFallback } from "./truncation-fallback.js";
|
|
7
|
+
import { toStoredMessage } from "./types.js";
|
|
8
|
+
function getModelId(model) {
|
|
9
|
+
if (typeof model === "string")
|
|
10
|
+
return model;
|
|
11
|
+
return model.modelId ?? "unknown";
|
|
12
|
+
}
|
|
13
|
+
function getProviderId(model) {
|
|
14
|
+
if (typeof model === "string")
|
|
15
|
+
return "string-model";
|
|
16
|
+
return model.provider ?? "unknown";
|
|
17
|
+
}
|
|
18
|
+
const logger = getPrefixedLogger("[phase2-session-summarizer]");
|
|
19
|
+
/**
|
|
20
|
+
* Strips image content from messages to reduce token usage during summarization.
|
|
21
|
+
* Replaces inline images with a placeholder to preserve context about their presence.
|
|
22
|
+
*/
|
|
23
|
+
function stripImagesFromMessages(messages) {
|
|
24
|
+
return messages.map((msg) => {
|
|
25
|
+
if (!Array.isArray(msg.content)) {
|
|
26
|
+
return msg;
|
|
27
|
+
}
|
|
28
|
+
const strippedContent = msg.content.map((part) => {
|
|
29
|
+
// user images
|
|
30
|
+
if (typeof part === "object" &&
|
|
31
|
+
part !== null &&
|
|
32
|
+
"type" in part &&
|
|
33
|
+
part.type === "image") {
|
|
34
|
+
return { type: "text", text: "[image]" };
|
|
35
|
+
}
|
|
36
|
+
// tool results images
|
|
37
|
+
if (part.type === "tool-result" &&
|
|
38
|
+
part.output?.type === "content" &&
|
|
39
|
+
part.output.value?.some((value) => value.type === "media" && value.data?.startsWith("data:image/"))) {
|
|
40
|
+
return { type: "text", text: "[image]" };
|
|
41
|
+
}
|
|
42
|
+
return part;
|
|
43
|
+
});
|
|
44
|
+
return { ...msg, content: strippedContent };
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Summarizes a session, automatically handling oversized inputs by recursively
|
|
49
|
+
* splitting messages in half until they fit within the model's context window.
|
|
50
|
+
*/
|
|
51
|
+
export async function summarizeSession(options) {
|
|
52
|
+
const { messages, model, targetTokens, abortSignal, tracer = LLMObsTracer.instance, } = options;
|
|
53
|
+
return tracer.trace({ name: "session.summarize", kind: "task" }, async (summarizeSpan) => {
|
|
54
|
+
async function callLLM(msgs) {
|
|
55
|
+
return tracer.trace({ name: "session.summarize.llm", kind: "task" }, async (llmSpan) => {
|
|
56
|
+
// Strip images and internal metadata before serializing
|
|
57
|
+
const strippedMessages = stripImagesFromMessages(msgs);
|
|
58
|
+
const cleanMessages = strippedMessages.map(({ _superblocks, ...msg }) => msg);
|
|
59
|
+
// Serialize messages as JSON to avoid provider-specific format issues
|
|
60
|
+
// (e.g., reasoning blocks, signatures) that cause errors on Bedrock/Vertex
|
|
61
|
+
const messagesJson = JSON.stringify(cleanMessages, null, 2);
|
|
62
|
+
const userMessage = formatCompactionRequest(messagesJson);
|
|
63
|
+
// Capture API errors via onError callback.
|
|
64
|
+
// The Vercel AI SDK silently swallows errors like "prompt is too long" -
|
|
65
|
+
// the stream just ends without throwing. Using onError is the only way
|
|
66
|
+
// to capture the real error for proper handling (e.g., token limit detection).
|
|
67
|
+
let capturedError = null;
|
|
68
|
+
const inputMetadata = {
|
|
69
|
+
messageCount: msgs.length,
|
|
70
|
+
promptLength: userMessage.length,
|
|
71
|
+
};
|
|
72
|
+
const streamResult = streamText({
|
|
73
|
+
model,
|
|
74
|
+
system: COMPACTION_PROMPT,
|
|
75
|
+
messages: [{ role: "user", content: userMessage }],
|
|
76
|
+
maxOutputTokens: 8192,
|
|
77
|
+
abortSignal,
|
|
78
|
+
onError: (event) => {
|
|
79
|
+
capturedError = event.error;
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
let summary = "";
|
|
83
|
+
for await (const part of streamResult.textStream) {
|
|
84
|
+
summary += part;
|
|
85
|
+
}
|
|
86
|
+
if (capturedError) {
|
|
87
|
+
tracer.annotate(llmSpan, {
|
|
88
|
+
metadata: {
|
|
89
|
+
input: inputMetadata,
|
|
90
|
+
},
|
|
91
|
+
error: capturedError,
|
|
92
|
+
});
|
|
93
|
+
throw capturedError;
|
|
94
|
+
}
|
|
95
|
+
const [usage, finishReason, warnings, response] = await Promise.all([
|
|
96
|
+
streamResult.usage,
|
|
97
|
+
streamResult.finishReason,
|
|
98
|
+
streamResult.warnings,
|
|
99
|
+
streamResult.response,
|
|
100
|
+
]);
|
|
101
|
+
if (!summary) {
|
|
102
|
+
const debugInfo = {
|
|
103
|
+
model: {
|
|
104
|
+
id: getModelId(model),
|
|
105
|
+
provider: getProviderId(model),
|
|
106
|
+
},
|
|
107
|
+
messageCount: msgs.length,
|
|
108
|
+
finishReason,
|
|
109
|
+
usage: {
|
|
110
|
+
inputTokens: usage?.inputTokens,
|
|
111
|
+
outputTokens: usage?.outputTokens,
|
|
112
|
+
cachedInputTokens: usage?.cachedInputTokens,
|
|
113
|
+
},
|
|
114
|
+
warnings,
|
|
115
|
+
response: {
|
|
116
|
+
id: response?.id,
|
|
117
|
+
modelId: response?.modelId,
|
|
118
|
+
timestamp: response?.timestamp,
|
|
119
|
+
headers: response?.headers,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
logger.warn("Summarization produced empty summary - debug info:", debugInfo);
|
|
123
|
+
throw new Error(`Summarization produced empty summary. finishReason=${finishReason}, ` +
|
|
124
|
+
`model=${getModelId(model)}, inputTokens=${usage?.inputTokens}, ` +
|
|
125
|
+
`outputTokens=${usage?.outputTokens}`);
|
|
126
|
+
}
|
|
127
|
+
tracer.annotate(llmSpan, {
|
|
128
|
+
metadata: {
|
|
129
|
+
input: inputMetadata,
|
|
130
|
+
result: {
|
|
131
|
+
summaryLength: summary.length,
|
|
132
|
+
inputTokens: usage?.inputTokens,
|
|
133
|
+
outputTokens: usage?.outputTokens,
|
|
134
|
+
finishReason,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
const summaryWithPreamble = formatSummaryMessage(summary);
|
|
139
|
+
const summaryMessage = toStoredMessage({ role: "user", content: summaryWithPreamble }, { isSummary: true, tokenCount: usage?.outputTokens });
|
|
140
|
+
return {
|
|
141
|
+
summary,
|
|
142
|
+
messages: [summaryMessage],
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async function summarizeWithSplitting(msgs) {
|
|
147
|
+
// Guard against infinite recursion - need at least 2 messages to split
|
|
148
|
+
if (msgs.length < 2) {
|
|
149
|
+
return callLLM(msgs);
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const result = await callLLM(msgs);
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (!isTokenLimitError(error)) {
|
|
157
|
+
logger.error(`LLM summarization failed. Falling back to truncation. Error: ${JSON.stringify(error)}`, error);
|
|
158
|
+
return createTruncationFallback(messages, tracer);
|
|
159
|
+
}
|
|
160
|
+
// Token limit exceeded - split messages in half and summarize recursively
|
|
161
|
+
const midpoint = Math.floor(msgs.length / 2);
|
|
162
|
+
const firstHalf = msgs.slice(0, midpoint);
|
|
163
|
+
const secondHalf = msgs.slice(midpoint);
|
|
164
|
+
logger.warn(`Token limit exceeded with ${msgs.length} messages. ` +
|
|
165
|
+
`Splitting: first half (${firstHalf.length}), second half (${secondHalf.length})`);
|
|
166
|
+
// Each recursive split gets its own session.summarize span
|
|
167
|
+
const firstResult = await tracer.trace({ name: "session.summarize.split", kind: "task" }, async (splitSpan) => {
|
|
168
|
+
tracer.annotate(splitSpan, {
|
|
169
|
+
metadata: {
|
|
170
|
+
input: {
|
|
171
|
+
messageCount: firstHalf.length,
|
|
172
|
+
splitHalf: "first",
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
return summarizeWithSplitting(firstHalf);
|
|
177
|
+
});
|
|
178
|
+
return tracer.trace({ name: "session.summarize.split", kind: "task" }, async (splitSpan) => {
|
|
179
|
+
tracer.annotate(splitSpan, {
|
|
180
|
+
metadata: {
|
|
181
|
+
input: {
|
|
182
|
+
messageCount: firstResult.messages.length + secondHalf.length,
|
|
183
|
+
splitHalf: "combined",
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
return summarizeWithSplitting([
|
|
188
|
+
...firstResult.messages,
|
|
189
|
+
...secondHalf,
|
|
190
|
+
]);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const result = await summarizeWithSplitting(messages);
|
|
195
|
+
tracer.annotate(summarizeSpan, {
|
|
196
|
+
metadata: {
|
|
197
|
+
input: {
|
|
198
|
+
messageCount: messages.length,
|
|
199
|
+
},
|
|
200
|
+
config: {
|
|
201
|
+
targetTokens,
|
|
202
|
+
},
|
|
203
|
+
result: {
|
|
204
|
+
messageCount: result.messages.length,
|
|
205
|
+
summary: result.summary,
|
|
206
|
+
summaryLength: result.summary.length,
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
return result;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=phase2-session-summarizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase2-session-summarizer.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/context-v2/phase2-session-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAkB,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAiB7C,SAAS,UAAU,CAAC,KAAoB;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC;IACrD,OAAO,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC;AACrC,CAAC;AAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,6BAA6B,CAAC,CAAC;AAEhE;;;GAGG;AACH,SAAS,uBAAuB,CAAC,QAAyB;IACxD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,cAAc;YACd,IACE,OAAO,IAAI,KAAK,QAAQ;gBACxB,IAAI,KAAK,IAAI;gBACb,MAAM,IAAI,IAAI;gBACd,IAAI,CAAC,IAAI,KAAK,OAAO,EACrB,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACpD,CAAC;YAED,sBAAsB;YACtB,IACE,IAAI,CAAC,IAAI,KAAK,aAAa;gBAC3B,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS;gBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CACrB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,CAClE,EACD,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACpD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAmB,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyB;IAEzB,MAAM,EACJ,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,WAAW,EACX,MAAM,GAAG,YAAY,CAAC,QAAQ,GAC/B,GAAG,OAAO,CAAC;IAEZ,OAAO,MAAM,CAAC,KAAK,CACjB,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,EAC3C,KAAK,EAAE,aAAa,EAAE,EAAE;QACtB,KAAK,UAAU,OAAO,CAAC,IAAqB;YAC1C,OAAO,MAAM,CAAC,KAAK,CACjB,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE,EAC/C,KAAK,EAAE,OAAO,EAAE,EAAE;gBAChB,wDAAwD;gBACxD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CACxC,CAAC,EAAE,YAAY,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAClC,CAAC;gBACF,sEAAsE;gBACtE,2EAA2E;gBAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5D,MAAM,WAAW,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;gBAE1D,2CAA2C;gBAC3C,yEAAyE;gBACzE,uEAAuE;gBACvE,+EAA+E;gBAC/E,IAAI,aAAa,GAA2B,IAAI,CAAC;gBAEjD,MAAM,aAAa,GAAG;oBACpB,YAAY,EAAE,IAAI,CAAC,MAAM;oBACzB,YAAY,EAAE,WAAW,CAAC,MAAM;iBACjC,CAAC;gBAEF,MAAM,YAAY,GAAG,UAAU,CAAC;oBAC9B,KAAK;oBACL,MAAM,EAAE,iBAAiB;oBACzB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;oBAClD,eAAe,EAAE,IAAI;oBACrB,WAAW;oBACX,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;wBACjB,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC;oBAC9B,CAAC;iBACF,CAAC,CAAC;gBAEH,IAAI,OAAO,GAAG,EAAE,CAAC;gBACjB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;oBACjD,OAAO,IAAI,IAAI,CAAC;gBAClB,CAAC;gBAED,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;wBACvB,QAAQ,EAAE;4BACR,KAAK,EAAE,aAAa;yBACrB;wBACD,KAAK,EAAE,aAAa;qBACrB,CAAC,CAAC;oBACH,MAAM,aAAa,CAAC;gBACtB,CAAC;gBAED,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CACjE;oBACE,YAAY,CAAC,KAAK;oBAClB,YAAY,CAAC,YAAY;oBACzB,YAAY,CAAC,QAAQ;oBACrB,YAAY,CAAC,QAAQ;iBACtB,CACF,CAAC;gBAEF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,SAAS,GAAG;wBAChB,KAAK,EAAE;4BACL,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC;4BACrB,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC;yBAC/B;wBACD,YAAY,EAAE,IAAI,CAAC,MAAM;wBACzB,YAAY;wBACZ,KAAK,EAAE;4BACL,WAAW,EAAE,KAAK,EAAE,WAAW;4BAC/B,YAAY,EAAE,KAAK,EAAE,YAAY;4BACjC,iBAAiB,EAAE,KAAK,EAAE,iBAAiB;yBAC5C;wBACD,QAAQ;wBACR,QAAQ,EAAE;4BACR,EAAE,EAAE,QAAQ,EAAE,EAAE;4BAChB,OAAO,EAAE,QAAQ,EAAE,OAAO;4BAC1B,SAAS,EAAE,QAAQ,EAAE,SAAS;4BAC9B,OAAO,EAAE,QAAQ,EAAE,OAAO;yBAC3B;qBACF,CAAC;oBACF,MAAM,CAAC,IAAI,CACT,oDAAoD,EACpD,SAAS,CACV,CAAC;oBACF,MAAM,IAAI,KAAK,CACb,sDAAsD,YAAY,IAAI;wBACpE,SAAS,UAAU,CAAC,KAAK,CAAC,iBAAiB,KAAK,EAAE,WAAW,IAAI;wBACjE,gBAAgB,KAAK,EAAE,YAAY,EAAE,CACxC,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;oBACvB,QAAQ,EAAE;wBACR,KAAK,EAAE,aAAa;wBACpB,MAAM,EAAE;4BACN,aAAa,EAAE,OAAO,CAAC,MAAM;4BAC7B,WAAW,EAAE,KAAK,EAAE,WAAW;4BAC/B,YAAY,EAAE,KAAK,EAAE,YAAY;4BACjC,YAAY;yBACb;qBACF;iBACF,CAAC,CAAC;gBAEH,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAE1D,MAAM,cAAc,GAAG,eAAe,CACpC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAC9C,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CACrD,CAAC;gBAEF,OAAO;oBACL,OAAO;oBACP,QAAQ,EAAE,CAAC,cAAc,CAAC;iBAC3B,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,KAAK,UAAU,sBAAsB,CACnC,IAAqB;YAErB,uEAAuE;YACvE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,KAAK,CACV,gEAAgE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EACvF,KAAkB,CACnB,CAAC;oBACF,OAAO,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACpD,CAAC;gBAED,0EAA0E;gBAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAExC,MAAM,CAAC,IAAI,CACT,6BAA6B,IAAI,CAAC,MAAM,aAAa;oBACnD,0BAA0B,SAAS,CAAC,MAAM,mBAAmB,UAAU,CAAC,MAAM,GAAG,CACpF,CAAC;gBAEF,2DAA2D;gBAC3D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CACpC,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,EAAE,EACjD,KAAK,EAAE,SAAS,EAAE,EAAE;oBAClB,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;wBACzB,QAAQ,EAAE;4BACR,KAAK,EAAE;gCACL,YAAY,EAAE,SAAS,CAAC,MAAM;gCAC9B,SAAS,EAAE,OAAO;6BACnB;yBACF;qBACF,CAAC,CAAC;oBACH,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC,CACF,CAAC;gBAEF,OAAO,MAAM,CAAC,KAAK,CACjB,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,EAAE,EACjD,KAAK,EAAE,SAAS,EAAE,EAAE;oBAClB,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;wBACzB,QAAQ,EAAE;4BACR,KAAK,EAAE;gCACL,YAAY,EACV,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;gCACjD,SAAS,EAAE,UAAU;6BACtB;yBACF;qBACF,CAAC,CAAC;oBACH,OAAO,sBAAsB,CAAC;wBAC5B,GAAG,WAAW,CAAC,QAAQ;wBACvB,GAAG,UAAU;qBACd,CAAC,CAAC;gBACL,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE;YAC7B,QAAQ,EAAE;gBACR,KAAK,EAAE;oBACL,YAAY,EAAE,QAAQ,CAAC,MAAM;iBAC9B;gBACD,MAAM,EAAE;oBACN,YAAY;iBACb;gBACD,MAAM,EAAE;oBACN,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;oBACpC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;iBACrC;aACF;SACF,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const COMPACTION_PROMPT = "You will be given a conversation history to summarize. Write a continuation summary that will allow you (or another instance of yourself) to resume work efficiently in a future context window where the conversation history will be replaced with this summary. Your summary should be structured, concise, and actionable. Include:\n\n1. Task Overview\n The user's core request and success criteria\n Any clarifications or constraints they specified\n\n2. Current State\n What has been completed so far\n Files created, modified, or analyzed (with paths if relevant)\n Key outputs or artifacts produced\n\n3. Important Discoveries\n Technical constraints or requirements uncovered\n Decisions made and their rationale\n Errors encountered and how they were resolved\n What approaches were tried that didn't work (and why)\n\n4. Next Steps\n Specific actions needed to complete the task\n Any blockers or open questions to resolve\n Priority order if multiple steps remain\n\n5. Context to Preserve\n User preferences or style requirements\n Domain-specific details that aren't obvious\n Any promises made to the user\n\nBe concise but complete\u2014err on the side of including information that would prevent duplicate work or repeated mistakes. Write in a way that enables immediate resumption of the task.\n\nOutput ONLY the summary content. No preamble, no wrapping tags.";
|
|
2
|
+
/**
|
|
3
|
+
* Formats the conversation history into a user message for compaction.
|
|
4
|
+
*/
|
|
5
|
+
export declare function formatCompactionRequest(messagesJson: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Wraps the generated summary with continuation context to help the model
|
|
8
|
+
* understand it's resuming a previous session.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatSummaryMessage(summary: string): string;
|
|
11
|
+
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/prompts/compaction.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,63CA6BkC,CAAC;AAEjE;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY5D"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Based on https://platform.claude.com/docs/en/build-with-claude/context-editing#client-side-compaction-sdk
|
|
2
|
+
export const COMPACTION_PROMPT = `You will be given a conversation history to summarize. Write a continuation summary that will allow you (or another instance of yourself) to resume work efficiently in a future context window where the conversation history will be replaced with this summary. Your summary should be structured, concise, and actionable. Include:
|
|
3
|
+
|
|
4
|
+
1. Task Overview
|
|
5
|
+
The user's core request and success criteria
|
|
6
|
+
Any clarifications or constraints they specified
|
|
7
|
+
|
|
8
|
+
2. Current State
|
|
9
|
+
What has been completed so far
|
|
10
|
+
Files created, modified, or analyzed (with paths if relevant)
|
|
11
|
+
Key outputs or artifacts produced
|
|
12
|
+
|
|
13
|
+
3. Important Discoveries
|
|
14
|
+
Technical constraints or requirements uncovered
|
|
15
|
+
Decisions made and their rationale
|
|
16
|
+
Errors encountered and how they were resolved
|
|
17
|
+
What approaches were tried that didn't work (and why)
|
|
18
|
+
|
|
19
|
+
4. Next Steps
|
|
20
|
+
Specific actions needed to complete the task
|
|
21
|
+
Any blockers or open questions to resolve
|
|
22
|
+
Priority order if multiple steps remain
|
|
23
|
+
|
|
24
|
+
5. Context to Preserve
|
|
25
|
+
User preferences or style requirements
|
|
26
|
+
Domain-specific details that aren't obvious
|
|
27
|
+
Any promises made to the user
|
|
28
|
+
|
|
29
|
+
Be concise but complete—err on the side of including information that would prevent duplicate work or repeated mistakes. Write in a way that enables immediate resumption of the task.
|
|
30
|
+
|
|
31
|
+
Output ONLY the summary content. No preamble, no wrapping tags.`;
|
|
32
|
+
/**
|
|
33
|
+
* Formats the conversation history into a user message for compaction.
|
|
34
|
+
*/
|
|
35
|
+
export function formatCompactionRequest(messagesJson) {
|
|
36
|
+
return `\`\`\`json
|
|
37
|
+
${messagesJson}
|
|
38
|
+
\`\`\``;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Wraps the generated summary with continuation context to help the model
|
|
42
|
+
* understand it's resuming a previous session.
|
|
43
|
+
*/
|
|
44
|
+
export function formatSummaryMessage(summary) {
|
|
45
|
+
return `[Session Continuation]
|
|
46
|
+
|
|
47
|
+
You are resuming a previous session. The following is a summary of what has been accomplished so far:
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
${summary}
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
Continue from where you left off. If there are next steps outlined above, proceed with them.`;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/prompts/compaction.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEA6B+B,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IAC1D,OAAO;EACP,YAAY;OACP,CAAC;AACR,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO;;;;;;EAMP,OAAO;;;;6FAIoF,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StoredMessage } from "./types.js";
|
|
2
|
+
import type { LanguageModelUsage } from "ai";
|
|
3
|
+
export interface CapturedSession {
|
|
4
|
+
messages: StoredMessage[];
|
|
5
|
+
usage: LanguageModelUsage;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Capture full session data for debugging compaction failures.
|
|
9
|
+
* Sessions are saved to {rootDir}/.superblocks/captured-sessions/
|
|
10
|
+
*
|
|
11
|
+
* @param data - The session data to capture
|
|
12
|
+
* @param rootDir - The app root directory
|
|
13
|
+
*/
|
|
14
|
+
export declare function captureSession(data: {
|
|
15
|
+
messages: StoredMessage[];
|
|
16
|
+
usage: LanguageModelUsage;
|
|
17
|
+
}, rootDir: string): string | null;
|
|
18
|
+
//# sourceMappingURL=session-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-capture.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/context-v2/session-capture.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAW7C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAwBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE;IACJ,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,kBAAkB,CAAC;CAC3B,EACD,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAyBf"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session capture utility for debugging compaction failures.
|
|
3
|
+
*
|
|
4
|
+
* Sessions are saved to the app's .superblocks/captured-sessions folder.
|
|
5
|
+
* Captured sessions can be replayed in integration tests to verify
|
|
6
|
+
* summarization quality using LLM-as-judge.
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { getPrefixedLogger } from "../../../util/logger.js";
|
|
11
|
+
const logger = getPrefixedLogger("[session-capture]");
|
|
12
|
+
/** Set to true to capture sessions for debugging compaction failures */
|
|
13
|
+
const CAPTURE_ENABLED = false;
|
|
14
|
+
function isTestEnvironment() {
|
|
15
|
+
return process.env.VITEST === "true" || process.env.NODE_ENV === "test";
|
|
16
|
+
}
|
|
17
|
+
function isEnabled() {
|
|
18
|
+
if (isTestEnvironment()) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return CAPTURE_ENABLED;
|
|
22
|
+
}
|
|
23
|
+
function getCaptureDir(rootDir) {
|
|
24
|
+
return join(rootDir, ".superblocks", "captured-sessions");
|
|
25
|
+
}
|
|
26
|
+
function ensureDir(captureDir) {
|
|
27
|
+
if (!existsSync(captureDir)) {
|
|
28
|
+
mkdirSync(captureDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function generateFilename() {
|
|
32
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
33
|
+
return `session-${timestamp}.json`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Capture full session data for debugging compaction failures.
|
|
37
|
+
* Sessions are saved to {rootDir}/.superblocks/captured-sessions/
|
|
38
|
+
*
|
|
39
|
+
* @param data - The session data to capture
|
|
40
|
+
* @param rootDir - The app root directory
|
|
41
|
+
*/
|
|
42
|
+
export function captureSession(data, rootDir) {
|
|
43
|
+
if (!isEnabled()) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const captureDir = getCaptureDir(rootDir);
|
|
48
|
+
ensureDir(captureDir);
|
|
49
|
+
const session = {
|
|
50
|
+
messages: data.messages,
|
|
51
|
+
usage: data.usage,
|
|
52
|
+
};
|
|
53
|
+
const filename = generateFilename();
|
|
54
|
+
const filepath = join(captureDir, filename);
|
|
55
|
+
writeFileSync(filepath, JSON.stringify(session, null, 2));
|
|
56
|
+
logger.info(`Captured session to ${filepath}`);
|
|
57
|
+
return filepath;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
logger.error(`Failed to capture session: ${err}`);
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=session-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-capture.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/context-v2/session-capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAI5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AAEtD,wEAAwE;AACxE,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,SAAS,iBAAiB;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;AAC1E,CAAC;AAOD,SAAS,SAAS;IAChB,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB;IACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,WAAW,SAAS,OAAO,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,IAGC,EACD,OAAe;IAEf,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,SAAS,CAAC,UAAU,CAAC,CAAC;QAEtB,MAAM,OAAO,GAAoB;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;QAEF,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE5C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QAE/C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ContextRecordV2 } from "../types.js";
|
|
2
|
+
import type { ContextId } from "./types.js";
|
|
3
|
+
export interface ContextStorageV2 {
|
|
4
|
+
saveContext(id: ContextId, context: ContextRecordV2): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Load a context record from storage.
|
|
7
|
+
* Returns unknown because the stored format may be any version.
|
|
8
|
+
* The migration system handles version detection and migration.
|
|
9
|
+
*/
|
|
10
|
+
loadContext(id: ContextId): Promise<unknown | null>;
|
|
11
|
+
deleteContext(id: ContextId): Promise<void>;
|
|
12
|
+
deleteAllContexts(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpD,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ContextRecordV2 } from "../types.js";
|
|
2
|
+
import type { ContextStorageV2 } from "./index.js";
|
|
3
|
+
import type { ContextId } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Local filesystem storage backend for context records.
|
|
6
|
+
*
|
|
7
|
+
* Contexts are stored as JSON files in the following structure:
|
|
8
|
+
* {rootDir}/.superblocks/context/{userId}/{contextName}.json
|
|
9
|
+
*
|
|
10
|
+
* This uses the same path structure as V1 for upload/download compatibility.
|
|
11
|
+
* The migration system handles version detection and migration when loading.
|
|
12
|
+
*/
|
|
13
|
+
export declare class LocalContextStorageV2 implements ContextStorageV2 {
|
|
14
|
+
readonly rootDir: string;
|
|
15
|
+
private readonly SUPERBLOCKS_SYSTEM_DIR;
|
|
16
|
+
constructor(rootDir: string);
|
|
17
|
+
loadContext(id: ContextId): Promise<unknown | null>;
|
|
18
|
+
saveContext(id: ContextId, record: ContextRecordV2): Promise<void>;
|
|
19
|
+
deleteContext(id: ContextId): Promise<void>;
|
|
20
|
+
deleteAllContexts(): Promise<void>;
|
|
21
|
+
private getContextDir;
|
|
22
|
+
private ensureBaseDirExists;
|
|
23
|
+
private getFilePath;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/local.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAEhD,QAAQ,CAAC,OAAO,EAAE,MAAM;IADpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkB;gBACpC,OAAO,EAAE,MAAM;IAE9B,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcnD,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYxC,OAAO,CAAC,aAAa;YAIP,mBAAmB;IAIjC,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, unlink, rm } from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Local filesystem storage backend for context records.
|
|
5
|
+
*
|
|
6
|
+
* Contexts are stored as JSON files in the following structure:
|
|
7
|
+
* {rootDir}/.superblocks/context/{userId}/{contextName}.json
|
|
8
|
+
*
|
|
9
|
+
* This uses the same path structure as V1 for upload/download compatibility.
|
|
10
|
+
* The migration system handles version detection and migration when loading.
|
|
11
|
+
*/
|
|
12
|
+
export class LocalContextStorageV2 {
|
|
13
|
+
rootDir;
|
|
14
|
+
SUPERBLOCKS_SYSTEM_DIR = ".superblocks";
|
|
15
|
+
constructor(rootDir) {
|
|
16
|
+
this.rootDir = rootDir;
|
|
17
|
+
}
|
|
18
|
+
async loadContext(id) {
|
|
19
|
+
const filePath = this.getFilePath(id);
|
|
20
|
+
try {
|
|
21
|
+
const content = await readFile(filePath, "utf-8");
|
|
22
|
+
// Return raw parsed JSON - migration system will handle version detection
|
|
23
|
+
return JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
if (err.code === "ENOENT") {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async saveContext(id, record) {
|
|
33
|
+
const filePath = this.getFilePath(id);
|
|
34
|
+
await this.ensureBaseDirExists(filePath);
|
|
35
|
+
await writeFile(filePath, JSON.stringify(record, null, 2));
|
|
36
|
+
}
|
|
37
|
+
async deleteContext(id) {
|
|
38
|
+
const filePath = this.getFilePath(id);
|
|
39
|
+
try {
|
|
40
|
+
await unlink(filePath);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err.code === "ENOENT") {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async deleteAllContexts() {
|
|
50
|
+
const contextDir = this.getContextDir();
|
|
51
|
+
try {
|
|
52
|
+
await rm(contextDir, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err.code === "ENOENT") {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
getContextDir() {
|
|
62
|
+
return path.join(this.rootDir, this.SUPERBLOCKS_SYSTEM_DIR, "context");
|
|
63
|
+
}
|
|
64
|
+
async ensureBaseDirExists(filePath) {
|
|
65
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
getFilePath(id) {
|
|
68
|
+
return path.join(this.rootDir, this.SUPERBLOCKS_SYSTEM_DIR, "context", id.userId, `${id.name}.json`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAKlC;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAqB;IAEX;IADJ,sBAAsB,GAAG,cAAc,CAAC;IACzD,YAAqB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAExC,KAAK,CAAC,WAAW,CAAC,EAAa;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,0EAA0E;YAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QACxC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAa,EAAE,MAAuB;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAa;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QAChD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,WAAW,CAAC,EAAa;QAC/B,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,sBAAsB,EAC3B,SAAS,EACT,EAAE,CAAC,MAAM,EACT,GAAG,EAAE,CAAC,IAAI,OAAO,CAClB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Globally unique identifier for a conversation context.
|
|
3
|
+
*/
|
|
4
|
+
export type ContextId = {
|
|
5
|
+
/** Application identifier */
|
|
6
|
+
appId: string;
|
|
7
|
+
/** User identifier */
|
|
8
|
+
userId: string;
|
|
9
|
+
/** Context name */
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { LanguageModelUsage } from "ai";
|
|
2
|
+
export declare function isOverflow(usage: LanguageModelUsage, contextLimit: number, outputReserve: number): boolean;
|
|
3
|
+
export declare function getTotalTokens(usage: LanguageModelUsage): number;
|
|
4
|
+
//# sourceMappingURL=token-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/context-v2/token-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAE7C,wBAAgB,UAAU,CACxB,KAAK,EAAE,kBAAkB,EACzB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAOT;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAMhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function isOverflow(usage, contextLimit, outputReserve) {
|
|
2
|
+
const total = (usage.inputTokens ?? 0) +
|
|
3
|
+
(usage.outputTokens ?? 0) +
|
|
4
|
+
(usage.cachedInputTokens ?? 0);
|
|
5
|
+
const available = contextLimit - outputReserve;
|
|
6
|
+
return total > available;
|
|
7
|
+
}
|
|
8
|
+
export function getTotalTokens(usage) {
|
|
9
|
+
return ((usage.inputTokens ?? 0) +
|
|
10
|
+
(usage.outputTokens ?? 0) +
|
|
11
|
+
(usage.cachedInputTokens ?? 0));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=token-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/context-v2/token-tracker.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CACxB,KAAyB,EACzB,YAAoB,EACpB,aAAqB;IAErB,MAAM,KAAK,GACT,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;QACxB,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QACzB,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;IAC/C,OAAO,KAAK,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,OAAO,CACL,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;QACxB,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QACzB,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LLMObsTracer } from "../../llmobs/tracer.js";
|
|
2
|
+
import type { SummarizeResult } from "./phase2-session-summarizer.js";
|
|
3
|
+
import type { StoredMessage } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a truncation-based fallback when LLM summarization fails.
|
|
6
|
+
* Generates a timeline summary of the conversation without returning
|
|
7
|
+
* the actual messages, which can cause provider errors.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createTruncationFallback(messages: StoredMessage[], tracer?: LLMObsTracer): SummarizeResult;
|
|
10
|
+
//# sourceMappingURL=truncation-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncation-fallback.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/context-v2/truncation-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyFhD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,GAAE,YAAoC,GAC3C,eAAe,CA0DjB"}
|