@superblocksteam/vite-plugin-file-sync 2.0.83 → 2.0.84-next.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/ai-service/agent/middleware.d.ts +36 -0
- package/dist/ai-service/agent/middleware.d.ts.map +1 -1
- package/dist/ai-service/agent/middleware.js +65 -1
- package/dist/ai-service/agent/middleware.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts +1 -1
- 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 +101 -57
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +1 -1
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -1
- 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 +23 -7
- 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 +36 -19
- 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 +1 -1
- package/dist/ai-service/agent/tools/apis/sample-json.js +1 -1
- package/dist/ai-service/agent/tools/apis/sample-json.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +11 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +95 -54
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +6 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +26 -12
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-debug.js +30 -10
- package/dist/ai-service/agent/tools/build-debug.js.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-delete-file.js +6 -2
- package/dist/ai-service/agent/tools/build-delete-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-edit-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-edit-file.js +20 -5
- package/dist/ai-service/agent/tools/build-edit-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-finalize.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-finalize.js +30 -4
- package/dist/ai-service/agent/tools/build-finalize.js.map +1 -1
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.js +14 -4
- package/dist/ai-service/agent/tools/build-multi-edit-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-read-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-read-file.js +23 -11
- package/dist/ai-service/agent/tools/build-read-file.js.map +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js.map +1 -1
- package/dist/ai-service/agent/tools/get-logs.d.ts +72 -0
- package/dist/ai-service/agent/tools/get-logs.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/get-logs.js +343 -0
- package/dist/ai-service/agent/tools/get-logs.js.map +1 -0
- package/dist/ai-service/agent/tools/index.d.ts +1 -1
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +1 -1
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/errors.d.ts +9 -0
- package/dist/ai-service/agent/tools/integrations/errors.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/integrations/errors.js +35 -0
- package/dist/ai-service/agent/tools/integrations/errors.js.map +1 -0
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +20 -5
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/internal.js +12 -3
- package/dist/ai-service/agent/tools/integrations/internal.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +19 -28
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +37 -15
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/bash.d.ts +1 -1
- package/dist/ai-service/agent/tools2/tools/edit.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/edit.js +9 -4
- package/dist/ai-service/agent/tools2/tools/edit.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.js +73 -7
- package/dist/ai-service/agent/tools2/tools/grep.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/read.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/read.js +9 -4
- package/dist/ai-service/agent/tools2/tools/read.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +40 -8
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +41 -3
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts +0 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js +60 -54
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +6 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +44 -0
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/facts/helpers.d.ts +9 -0
- package/dist/ai-service/facts/helpers.d.ts.map +1 -0
- package/dist/ai-service/facts/helpers.js +72 -0
- package/dist/ai-service/facts/helpers.js.map +1 -0
- package/dist/ai-service/facts/index.d.ts +4 -0
- package/dist/ai-service/facts/index.d.ts.map +1 -0
- package/dist/ai-service/facts/index.js +3 -0
- package/dist/ai-service/facts/index.js.map +1 -0
- package/dist/ai-service/facts/knowledge-manager.d.ts +50 -0
- package/dist/ai-service/facts/knowledge-manager.d.ts.map +1 -0
- package/dist/ai-service/facts/knowledge-manager.js +195 -0
- package/dist/ai-service/facts/knowledge-manager.js.map +1 -0
- 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 +34 -2
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +112 -18
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.d.ts.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.js +4 -2
- package/dist/ai-service/integrations/metadata-storage/local.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +6 -3
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +96 -6
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/judge/judge-executor.js +1 -1
- package/dist/ai-service/judge/judge-executor.js.map +1 -1
- package/dist/ai-service/judge/tools/playwright-action.d.ts +1 -1
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +26 -13
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts +2 -0
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.js +6 -0
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context.d.ts +19 -0
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +64 -1
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts +11 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.js +5 -0
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js +42 -6
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -1
- package/dist/ai-service/llm/context-v2/types.d.ts +4 -0
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/error.js +1 -1
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js +5 -5
- package/dist/ai-service/llm/stream/config.d.ts +1 -1
- package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/config.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.d.ts +20 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js +115 -18
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/retry-notification.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/retry-notification.js +2 -1
- package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.js +4 -4
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
- package/dist/ai-service/llmobs/otel-exporter.d.ts +111 -14
- package/dist/ai-service/llmobs/otel-exporter.d.ts.map +1 -1
- package/dist/ai-service/llmobs/otel-exporter.js +441 -66
- package/dist/ai-service/llmobs/otel-exporter.js.map +1 -1
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +40 -4
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -1
- package/dist/ai-service/mcp/playwright-server.js +11 -2
- package/dist/ai-service/mcp/playwright-server.js.map +1 -1
- package/dist/ai-service/recording/index.d.ts +25 -0
- package/dist/ai-service/recording/index.d.ts.map +1 -0
- package/dist/ai-service/recording/index.js +27 -0
- package/dist/ai-service/recording/index.js.map +1 -0
- package/dist/ai-service/recording/recorders/llm-recorder.d.ts +35 -0
- package/dist/ai-service/recording/recorders/llm-recorder.d.ts.map +1 -0
- package/dist/ai-service/recording/recorders/llm-recorder.js +221 -0
- package/dist/ai-service/recording/recorders/llm-recorder.js.map +1 -0
- package/dist/ai-service/recording/recorders/socket-recorder.d.ts +38 -0
- package/dist/ai-service/recording/recorders/socket-recorder.d.ts.map +1 -0
- package/dist/ai-service/recording/recorders/socket-recorder.js +44 -0
- package/dist/ai-service/recording/recorders/socket-recorder.js.map +1 -0
- package/dist/ai-service/recording/recorders/tool-recorder.d.ts +25 -0
- package/dist/ai-service/recording/recorders/tool-recorder.d.ts.map +1 -0
- package/dist/ai-service/recording/recorders/tool-recorder.js +58 -0
- package/dist/ai-service/recording/recorders/tool-recorder.js.map +1 -0
- package/dist/ai-service/recording/recording-manager.d.ts +104 -0
- package/dist/ai-service/recording/recording-manager.d.ts.map +1 -0
- package/dist/ai-service/recording/recording-manager.js +308 -0
- package/dist/ai-service/recording/recording-manager.js.map +1 -0
- package/dist/ai-service/recording/storage/session-recording-storage.d.ts +143 -0
- package/dist/ai-service/recording/storage/session-recording-storage.d.ts.map +1 -0
- package/dist/ai-service/recording/storage/session-recording-storage.js +374 -0
- package/dist/ai-service/recording/storage/session-recording-storage.js.map +1 -0
- package/dist/ai-service/recording/types.d.ts +148 -0
- package/dist/ai-service/recording/types.d.ts.map +1 -0
- package/dist/ai-service/recording/types.js +8 -0
- package/dist/ai-service/recording/types.js.map +1 -0
- package/dist/ai-service/security/safety-classifier.d.ts.map +1 -1
- package/dist/ai-service/security/safety-classifier.js +9 -3
- package/dist/ai-service/security/safety-classifier.js.map +1 -1
- package/dist/ai-service/skills/index.d.ts +23 -11
- package/dist/ai-service/skills/index.d.ts.map +1 -1
- package/dist/ai-service/skills/index.js +86 -21
- package/dist/ai-service/skills/index.js.map +1 -1
- package/dist/ai-service/skills/system/_registry.generated.d.ts +6 -0
- package/dist/ai-service/skills/system/_registry.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/_registry.generated.js +24 -0
- package/dist/ai-service/skills/system/_registry.generated.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.js +56 -0
- package/dist/ai-service/skills/system/superblocks-api/references/code-blocks.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.js +143 -11
- package/dist/ai-service/skills/system/superblocks-api/references/sql-databases.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.js +130 -3
- package/dist/ai-service/skills/system/superblocks-api/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.d.ts +2 -0
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.js +155 -0
- package/dist/ai-service/skills/system/superblocks-frontend/references/embedding.generated.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +97 -17
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/types.d.ts +24 -0
- package/dist/ai-service/skills/types.d.ts.map +1 -1
- package/dist/ai-service/skills/types.js +45 -0
- package/dist/ai-service/skills/types.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +33 -2
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +6 -1
- 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 +24 -21
- package/dist/ai-service/state-machine/handlers/agent-planning.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 +120 -5
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +23 -0
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +52 -22
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/ids.d.ts +1 -0
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +3 -0
- package/dist/ids.js.map +1 -1
- package/dist/refactor/entities.d.ts.map +1 -1
- package/dist/refactor/entities.js +0 -1
- package/dist/refactor/entities.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +26 -4
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/index.d.ts +4 -0
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +6 -0
- package/dist/sync-service/index.js.map +1 -1
- package/dist/util/log-sanitizer.d.ts +42 -0
- package/dist/util/log-sanitizer.d.ts.map +1 -0
- package/dist/util/log-sanitizer.js +177 -0
- package/dist/util/log-sanitizer.js.map +1 -0
- package/dist/util/logger.d.ts +4 -0
- package/dist/util/logger.d.ts.map +1 -1
- package/dist/util/logger.js +77 -19
- package/dist/util/logger.js.map +1 -1
- package/package.json +17 -14
- package/dist/ai-service/agent/tools/get-console-logs.d.ts +0 -29
- package/dist/ai-service/agent/tools/get-console-logs.d.ts.map +0 -1
- package/dist/ai-service/agent/tools/get-console-logs.js +0 -171
- package/dist/ai-service/agent/tools/get-console-logs.js.map +0 -1
- package/dist/ai-service/test-utils/anthropic-service-mock.d.ts +0 -2
- package/dist/ai-service/test-utils/anthropic-service-mock.d.ts.map +0 -1
- package/dist/ai-service/test-utils/anthropic-service-mock.js +0 -91
- package/dist/ai-service/test-utils/anthropic-service-mock.js.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.d.ts +0 -3
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.d.ts.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.js +0 -886
- package/dist/ai-service/test-utils/app-generation-mocks/orders-app.js.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.d.ts +0 -3
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.d.ts.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.js +0 -70
- package/dist/ai-service/test-utils/app-generation-mocks/reprompt.js.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.d.ts +0 -3
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.d.ts.map +0 -1
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.js +0 -109
- package/dist/ai-service/test-utils/app-generation-mocks/smoketest.js.map +0 -1
- package/dist/ai-service/test-utils/mock-utils.d.ts +0 -12
- package/dist/ai-service/test-utils/mock-utils.d.ts.map +0 -1
- package/dist/ai-service/test-utils/mock-utils.js +0 -70
- package/dist/ai-service/test-utils/mock-utils.js.map +0 -1
- package/dist/ai-service/util/safe-stringify.d.ts +0 -2
- package/dist/ai-service/util/safe-stringify.d.ts.map +0 -1
- package/dist/ai-service/util/safe-stringify.js +0 -75
- package/dist/ai-service/util/safe-stringify.js.map +0 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool call recorder middleware.
|
|
3
|
+
*
|
|
4
|
+
* Creates a middleware that records tool executions passing through
|
|
5
|
+
* the tool registry. Follows the existing ToolMiddleware pattern.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Creates a tool recording middleware.
|
|
9
|
+
*
|
|
10
|
+
* This middleware wraps tool execution to record inputs, outputs,
|
|
11
|
+
* errors, and timing information.
|
|
12
|
+
*
|
|
13
|
+
* @param recorder - The RecordingManager instance
|
|
14
|
+
* @returns A ToolMiddleware that records tool executions
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const recordingMiddleware = createToolRecordingMiddleware(recorder);
|
|
19
|
+
* registry.addMiddleware(recordingMiddleware);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function createToolRecordingMiddleware(recorder) {
|
|
23
|
+
return (tool) => {
|
|
24
|
+
return {
|
|
25
|
+
...tool,
|
|
26
|
+
execute: async (input, options) => {
|
|
27
|
+
// If recording is not enabled, just execute normally
|
|
28
|
+
if (!recorder.isEnabled()) {
|
|
29
|
+
return tool.execute(input, options);
|
|
30
|
+
}
|
|
31
|
+
const startTime = Date.now();
|
|
32
|
+
try {
|
|
33
|
+
const output = await tool.execute(input, options);
|
|
34
|
+
recorder.recordTool({
|
|
35
|
+
toolName: tool.name,
|
|
36
|
+
toolCallId: options?.toolCallId ?? "",
|
|
37
|
+
input,
|
|
38
|
+
output,
|
|
39
|
+
durationMs: Date.now() - startTime,
|
|
40
|
+
});
|
|
41
|
+
return output;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
recorder.recordTool({
|
|
45
|
+
toolName: tool.name,
|
|
46
|
+
toolCallId: options?.toolCallId ?? "",
|
|
47
|
+
input,
|
|
48
|
+
output: null,
|
|
49
|
+
error: error instanceof Error ? error.message : String(error),
|
|
50
|
+
durationMs: Date.now() - startTime,
|
|
51
|
+
});
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=tool-recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-recorder.js","sourceRoot":"","sources":["../../../../src/ai-service/recording/recorders/tool-recorder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAA0B;IAE1B,OAAO,CAAC,IAAU,EAAQ,EAAE;QAC1B,OAAO;YACL,GAAG,IAAI;YACP,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,OAAwB,EAAE,EAAE;gBAC1D,qDAAqD;gBACrD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;oBAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACtC,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAElD,QAAQ,CAAC,UAAU,CAAC;wBAClB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,EAAE;wBACrC,KAAK;wBACL,MAAM;wBACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;qBACnC,CAAC,CAAC;oBAEH,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,UAAU,CAAC;wBAClB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,EAAE;wBACrC,KAAK;wBACL,MAAM,EAAE,IAAI;wBACZ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC7D,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;qBACnC,CAAC,CAAC;oBAEH,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecordingManager - Central manager for recording AI interactions.
|
|
3
|
+
*
|
|
4
|
+
* This class coordinates the recording of socket messages, tool calls,
|
|
5
|
+
* and LLM interactions. It manages recording sessions and provides
|
|
6
|
+
* a unified interface for all recording operations.
|
|
7
|
+
*/
|
|
8
|
+
import type { RecordingSession, SocketRecording, ToolRecording, LLMRecording, MetaRecording } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Configuration options for RecordingManager.
|
|
11
|
+
*/
|
|
12
|
+
export interface RecordingManagerConfig {
|
|
13
|
+
/** Directory for file-based storage (required) */
|
|
14
|
+
recordingsDir: string;
|
|
15
|
+
/** App root directory path (required for snapshot creation) */
|
|
16
|
+
appRootDirPath: string;
|
|
17
|
+
/** Max session log file size in bytes before rotating (default: 512000 = 500KB) */
|
|
18
|
+
maxSessionSizeBytes?: number;
|
|
19
|
+
/** Max number of sessions to keep (default: 3) */
|
|
20
|
+
maxSessions?: number;
|
|
21
|
+
/** Max file size for snapshot inclusion in bytes (default: 1048576 = 1MB) */
|
|
22
|
+
maxSnapshotFileSizeBytes?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class RecordingManager {
|
|
25
|
+
private readonly config;
|
|
26
|
+
private storage;
|
|
27
|
+
private enabled;
|
|
28
|
+
private currentSessionId;
|
|
29
|
+
private readonly maxSessionSizeBytes;
|
|
30
|
+
private readonly maxSessions;
|
|
31
|
+
private readonly maxSnapshotFileSizeBytes;
|
|
32
|
+
/** Throttled rotation check - runs at most every 5 seconds */
|
|
33
|
+
private checkAndRotateIfNeeded;
|
|
34
|
+
constructor(config: RecordingManagerConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Enable recording and start a new session.
|
|
37
|
+
*
|
|
38
|
+
* @param initialCommitId - Optional commit ID to set as starting/current commit
|
|
39
|
+
* @returns The session ID for the new session
|
|
40
|
+
*/
|
|
41
|
+
start(initialCommitId?: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Start a new recording session (internal).
|
|
44
|
+
* Does not enable recording - use start() to enable and start.
|
|
45
|
+
*
|
|
46
|
+
* @param initialCommitId - Optional commit ID to set as starting/current commit
|
|
47
|
+
* @returns The session ID for the new session
|
|
48
|
+
*/
|
|
49
|
+
private startSession;
|
|
50
|
+
/**
|
|
51
|
+
* Create a snapshot of the app directory for a session.
|
|
52
|
+
* Fire-and-forget, does not block recording.
|
|
53
|
+
* Records a meta entry with snapshot info (including any skipped files).
|
|
54
|
+
*/
|
|
55
|
+
private createSessionSnapshot;
|
|
56
|
+
/**
|
|
57
|
+
* Set the current commit ID for the active session.
|
|
58
|
+
* Called when commits occur during the session.
|
|
59
|
+
*/
|
|
60
|
+
setCurrentCommitId(commitId: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Check if recording is currently enabled.
|
|
63
|
+
*/
|
|
64
|
+
isEnabled(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Perform the actual rotation check.
|
|
67
|
+
* Called by the throttled checkAndRotateIfNeeded.
|
|
68
|
+
*/
|
|
69
|
+
private doRotationCheck;
|
|
70
|
+
/**
|
|
71
|
+
* Get the current session ID.
|
|
72
|
+
*/
|
|
73
|
+
getCurrentSessionId(): string | null;
|
|
74
|
+
/**
|
|
75
|
+
* List all recorded sessions from the persistent index.
|
|
76
|
+
*
|
|
77
|
+
* @returns Promise resolving to array of sessions (oldest first)
|
|
78
|
+
*/
|
|
79
|
+
listSessions(): Promise<RecordingSession[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Record a socket message.
|
|
82
|
+
*
|
|
83
|
+
* By default, only records method name and peerId.
|
|
84
|
+
* For specific methods (like aiGenerate), also records cleaned request data.
|
|
85
|
+
*/
|
|
86
|
+
recordSocket(data: SocketRecording): void;
|
|
87
|
+
/**
|
|
88
|
+
* Record a tool call.
|
|
89
|
+
*/
|
|
90
|
+
recordTool(data: ToolRecording): void;
|
|
91
|
+
/**
|
|
92
|
+
* Record an LLM call.
|
|
93
|
+
*/
|
|
94
|
+
recordLLM(data: LLMRecording): void;
|
|
95
|
+
/**
|
|
96
|
+
* Record a meta entry (session metadata like snapshot info).
|
|
97
|
+
*/
|
|
98
|
+
recordMeta(data: MetaRecording): void;
|
|
99
|
+
/**
|
|
100
|
+
* Clear all recordings, optionally for a specific session.
|
|
101
|
+
*/
|
|
102
|
+
clear(sessionId?: string): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=recording-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-manager.d.ts","sourceRoot":"","sources":["../../../src/ai-service/recording/recording-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAEV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AA6BD,qBAAa,gBAAgB;IAaf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZnC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAElD,8DAA8D;IAC9D,OAAO,CAAC,sBAAsB,CAEC;gBAEF,MAAM,EAAE,sBAAsB;IAW3D;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM;IAKvC;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IA2BpB;;;;OAIG;YACW,qBAAqB;IAyBnC;;;OAGG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczD;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;OAGG;YACW,eAAe;IAkB7B;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIjD;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAkEzC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAcrC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAwCnC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAarC;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecordingManager - Central manager for recording AI interactions.
|
|
3
|
+
*
|
|
4
|
+
* This class coordinates the recording of socket messages, tool calls,
|
|
5
|
+
* and LLM interactions. It manages recording sessions and provides
|
|
6
|
+
* a unified interface for all recording operations.
|
|
7
|
+
*/
|
|
8
|
+
import { pick, throttle } from "lodash-es";
|
|
9
|
+
import { getErrorMeta, getLogger } from "../../util/logger.js";
|
|
10
|
+
import { SessionRecordingStorage } from "./storage/session-recording-storage.js";
|
|
11
|
+
/**
|
|
12
|
+
* Central manager for recording AI interactions.
|
|
13
|
+
*
|
|
14
|
+
* Provides session-based recording with support for socket messages,
|
|
15
|
+
* tool executions, and LLM calls. Entries are written to JSONL files
|
|
16
|
+
* in {recordingsDir}/{sessionId}/recording.jsonl.
|
|
17
|
+
*
|
|
18
|
+
* Sessions are tracked in a persistent index at {recordingsDir}/sessions.json.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const recorder = new RecordingManager({
|
|
23
|
+
* recordingsDir: '/path/to/.superblocks/recordings',
|
|
24
|
+
* appRootDirPath: '/path/to/app',
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Start recording with optional initial commit ID
|
|
28
|
+
* recorder.start(initialCommitId);
|
|
29
|
+
* recorder.recordSocket({ method: 'aiGenerate', request: {...}, peerId: '123' });
|
|
30
|
+
*
|
|
31
|
+
* // Update commit ID when new commits occur
|
|
32
|
+
* recorder.setCurrentCommitId(newCommitId);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
/** Throttle interval for rotation checks (ms) */
|
|
36
|
+
const ROTATION_CHECK_INTERVAL_MS = 5000;
|
|
37
|
+
export class RecordingManager {
|
|
38
|
+
config;
|
|
39
|
+
storage;
|
|
40
|
+
enabled = false;
|
|
41
|
+
currentSessionId = null;
|
|
42
|
+
maxSessionSizeBytes;
|
|
43
|
+
maxSessions;
|
|
44
|
+
maxSnapshotFileSizeBytes;
|
|
45
|
+
/** Throttled rotation check - runs at most every 5 seconds */
|
|
46
|
+
checkAndRotateIfNeeded = throttle(() => {
|
|
47
|
+
void this.doRotationCheck();
|
|
48
|
+
}, ROTATION_CHECK_INTERVAL_MS);
|
|
49
|
+
constructor(config) {
|
|
50
|
+
this.config = config;
|
|
51
|
+
this.storage = new SessionRecordingStorage(config.recordingsDir);
|
|
52
|
+
this.maxSessionSizeBytes = config.maxSessionSizeBytes ?? 512000; // 500KB
|
|
53
|
+
this.maxSessions = config.maxSessions ?? 3;
|
|
54
|
+
this.maxSnapshotFileSizeBytes = config.maxSnapshotFileSizeBytes ?? 1048576; // 1MB
|
|
55
|
+
getLogger().info(`[recording] Using file storage at: ${config.recordingsDir}`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Enable recording and start a new session.
|
|
59
|
+
*
|
|
60
|
+
* @param initialCommitId - Optional commit ID to set as starting/current commit
|
|
61
|
+
* @returns The session ID for the new session
|
|
62
|
+
*/
|
|
63
|
+
start(initialCommitId) {
|
|
64
|
+
this.enabled = true;
|
|
65
|
+
return this.startSession(initialCommitId);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Start a new recording session (internal).
|
|
69
|
+
* Does not enable recording - use start() to enable and start.
|
|
70
|
+
*
|
|
71
|
+
* @param initialCommitId - Optional commit ID to set as starting/current commit
|
|
72
|
+
* @returns The session ID for the new session
|
|
73
|
+
*/
|
|
74
|
+
startSession(initialCommitId) {
|
|
75
|
+
this.currentSessionId = crypto.randomUUID();
|
|
76
|
+
const session = {
|
|
77
|
+
id: this.currentSessionId,
|
|
78
|
+
startedAt: Date.now(),
|
|
79
|
+
startingCommitId: initialCommitId,
|
|
80
|
+
currentCommitId: initialCommitId,
|
|
81
|
+
};
|
|
82
|
+
// Add to storage (single source of truth)
|
|
83
|
+
void this.storage.addSession(session);
|
|
84
|
+
// Cleanup old sessions if over limit
|
|
85
|
+
void this.storage.deleteOldestSessions(this.maxSessions);
|
|
86
|
+
getLogger().info(`[recording] Started recording session: ${this.currentSessionId}`, { initialCommitId });
|
|
87
|
+
// Create snapshot async (fire-and-forget, non-blocking)
|
|
88
|
+
void this.createSessionSnapshot(this.currentSessionId);
|
|
89
|
+
return this.currentSessionId;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a snapshot of the app directory for a session.
|
|
93
|
+
* Fire-and-forget, does not block recording.
|
|
94
|
+
* Records a meta entry with snapshot info (including any skipped files).
|
|
95
|
+
*/
|
|
96
|
+
async createSessionSnapshot(sessionId) {
|
|
97
|
+
try {
|
|
98
|
+
const result = await this.storage.createSnapshot(sessionId, this.config.appRootDirPath, this.maxSnapshotFileSizeBytes);
|
|
99
|
+
getLogger().info(`[recording] Created snapshot for session: ${sessionId}`);
|
|
100
|
+
// Record meta entry with snapshot info
|
|
101
|
+
this.recordMeta({
|
|
102
|
+
skippedFiles: result.skippedFiles.length > 0 ? result.skippedFiles : undefined,
|
|
103
|
+
message: "Session snapshot created",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
getLogger().warn(`[recording] Failed to create snapshot for session`, getErrorMeta(error));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Set the current commit ID for the active session.
|
|
112
|
+
* Called when commits occur during the session.
|
|
113
|
+
*/
|
|
114
|
+
async setCurrentCommitId(commitId) {
|
|
115
|
+
if (!this.currentSessionId)
|
|
116
|
+
return;
|
|
117
|
+
const session = await this.storage.getSession(this.currentSessionId);
|
|
118
|
+
if (session) {
|
|
119
|
+
session.currentCommitId = commitId;
|
|
120
|
+
await this.storage.updateSession(session);
|
|
121
|
+
getLogger().info(`[recording] Updated currentCommitId`, {
|
|
122
|
+
sessionId: this.currentSessionId,
|
|
123
|
+
commitId,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if recording is currently enabled.
|
|
129
|
+
*/
|
|
130
|
+
isEnabled() {
|
|
131
|
+
return this.enabled && this.currentSessionId !== null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Perform the actual rotation check.
|
|
135
|
+
* Called by the throttled checkAndRotateIfNeeded.
|
|
136
|
+
*/
|
|
137
|
+
async doRotationCheck() {
|
|
138
|
+
if (!this.currentSessionId)
|
|
139
|
+
return;
|
|
140
|
+
const size = await this.storage.getSessionFileSize(this.currentSessionId);
|
|
141
|
+
if (size >= this.maxSessionSizeBytes) {
|
|
142
|
+
getLogger().info(`[recording] Session file size ${size} exceeds limit ${this.maxSessionSizeBytes}, rotating`);
|
|
143
|
+
// Get current commit ID to pass to new session
|
|
144
|
+
const session = await this.storage.getSession(this.currentSessionId);
|
|
145
|
+
const currentCommitId = session?.currentCommitId;
|
|
146
|
+
// Start new session (this also handles cleanup)
|
|
147
|
+
this.startSession(currentCommitId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the current session ID.
|
|
152
|
+
*/
|
|
153
|
+
getCurrentSessionId() {
|
|
154
|
+
return this.currentSessionId;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* List all recorded sessions from the persistent index.
|
|
158
|
+
*
|
|
159
|
+
* @returns Promise resolving to array of sessions (oldest first)
|
|
160
|
+
*/
|
|
161
|
+
async listSessions() {
|
|
162
|
+
return this.storage.listSessions();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Record a socket message.
|
|
166
|
+
*
|
|
167
|
+
* By default, only records method name and peerId.
|
|
168
|
+
* For specific methods (like aiGenerate), also records cleaned request data.
|
|
169
|
+
*/
|
|
170
|
+
recordSocket(data) {
|
|
171
|
+
if (!this.isEnabled())
|
|
172
|
+
return;
|
|
173
|
+
// Skip noisy methods entirely
|
|
174
|
+
if (data.method === "editor.ping")
|
|
175
|
+
return;
|
|
176
|
+
let cleanedData;
|
|
177
|
+
try {
|
|
178
|
+
// Method-specific data cleaning
|
|
179
|
+
switch (data.method) {
|
|
180
|
+
case "aiGenerate":
|
|
181
|
+
// Record cleaned request data for aiGenerate
|
|
182
|
+
cleanedData = {
|
|
183
|
+
method: data.method,
|
|
184
|
+
peerId: data.peerId,
|
|
185
|
+
request: pick(data.request, [
|
|
186
|
+
"prompt",
|
|
187
|
+
"promptContext",
|
|
188
|
+
"planContext",
|
|
189
|
+
"mockGeneration",
|
|
190
|
+
"llmConfig",
|
|
191
|
+
"mode",
|
|
192
|
+
"responseMetadata",
|
|
193
|
+
]),
|
|
194
|
+
};
|
|
195
|
+
break;
|
|
196
|
+
// Record full request for mutation methods (useful for replay/debugging)
|
|
197
|
+
case "aiRestoreToCommit":
|
|
198
|
+
case "apiUpdate":
|
|
199
|
+
case "apiDelete":
|
|
200
|
+
case "renameApi":
|
|
201
|
+
case "renameElement":
|
|
202
|
+
cleanedData = {
|
|
203
|
+
method: data.method,
|
|
204
|
+
peerId: data.peerId,
|
|
205
|
+
request: data.request,
|
|
206
|
+
};
|
|
207
|
+
break;
|
|
208
|
+
default:
|
|
209
|
+
// For all other methods, record just method name and peerId
|
|
210
|
+
cleanedData = {
|
|
211
|
+
method: data.method,
|
|
212
|
+
peerId: data.peerId,
|
|
213
|
+
request: `[Truncated]`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
cleanedData = {
|
|
219
|
+
message: "Error cleaning this record",
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const entry = {
|
|
223
|
+
id: crypto.randomUUID(),
|
|
224
|
+
timestamp: Date.now(),
|
|
225
|
+
type: "socket",
|
|
226
|
+
data: cleanedData,
|
|
227
|
+
};
|
|
228
|
+
this.storage.add(this.currentSessionId, entry);
|
|
229
|
+
this.checkAndRotateIfNeeded();
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Record a tool call.
|
|
233
|
+
*/
|
|
234
|
+
recordTool(data) {
|
|
235
|
+
if (!this.isEnabled())
|
|
236
|
+
return;
|
|
237
|
+
const entry = {
|
|
238
|
+
id: crypto.randomUUID(),
|
|
239
|
+
timestamp: Date.now(),
|
|
240
|
+
type: "tool",
|
|
241
|
+
data,
|
|
242
|
+
};
|
|
243
|
+
this.storage.add(this.currentSessionId, entry);
|
|
244
|
+
this.checkAndRotateIfNeeded();
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Record an LLM call.
|
|
248
|
+
*/
|
|
249
|
+
recordLLM(data) {
|
|
250
|
+
if (!this.isEnabled())
|
|
251
|
+
return;
|
|
252
|
+
let cleanedData = {};
|
|
253
|
+
try {
|
|
254
|
+
cleanedData = {
|
|
255
|
+
request: {
|
|
256
|
+
model: data.request.model,
|
|
257
|
+
messages: data.request.messages.map((message, idx) => {
|
|
258
|
+
if (idx < data.request.messages.length - 1) {
|
|
259
|
+
return `[Truncated]`;
|
|
260
|
+
}
|
|
261
|
+
return message;
|
|
262
|
+
}),
|
|
263
|
+
tools: data.request.tools?.map((tool) => {
|
|
264
|
+
return typeof tool === "object" && tool != null && "name" in tool
|
|
265
|
+
? `[Truncated] ${tool.name}`
|
|
266
|
+
: "[Truncated] Tool";
|
|
267
|
+
}),
|
|
268
|
+
system: `[Truncated]`,
|
|
269
|
+
},
|
|
270
|
+
response: data.response,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
cleanedData = {
|
|
275
|
+
message: "Error cleaning this record",
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const entry = {
|
|
279
|
+
id: crypto.randomUUID(),
|
|
280
|
+
timestamp: Date.now(),
|
|
281
|
+
type: "llm",
|
|
282
|
+
data: cleanedData,
|
|
283
|
+
};
|
|
284
|
+
this.storage.add(this.currentSessionId, entry);
|
|
285
|
+
this.checkAndRotateIfNeeded();
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Record a meta entry (session metadata like snapshot info).
|
|
289
|
+
*/
|
|
290
|
+
recordMeta(data) {
|
|
291
|
+
if (!this.isEnabled())
|
|
292
|
+
return;
|
|
293
|
+
const entry = {
|
|
294
|
+
id: crypto.randomUUID(),
|
|
295
|
+
timestamp: Date.now(),
|
|
296
|
+
type: "meta",
|
|
297
|
+
data,
|
|
298
|
+
};
|
|
299
|
+
this.storage.add(this.currentSessionId, entry);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Clear all recordings, optionally for a specific session.
|
|
303
|
+
*/
|
|
304
|
+
async clear(sessionId) {
|
|
305
|
+
await this.storage.clear(sessionId);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=recording-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-manager.js","sourceRoot":"","sources":["../../../src/ai-service/recording/recording-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based storage implementation for recording entries and session index.
|
|
3
|
+
*
|
|
4
|
+
* Stores recording entries in JSONL files organized by session:
|
|
5
|
+
* {recordingsDir}/{sessionId}/recording.jsonl
|
|
6
|
+
*
|
|
7
|
+
* Maintains a session index at:
|
|
8
|
+
* {recordingsDir}/sessions.json
|
|
9
|
+
*
|
|
10
|
+
* Uses buffered writes for performance - entries are added to a buffer
|
|
11
|
+
* and flushed to disk asynchronously.
|
|
12
|
+
*/
|
|
13
|
+
import type { RecordingEntry, RecordingSession } from "../types.js";
|
|
14
|
+
/** Result from creating a snapshot */
|
|
15
|
+
export interface SnapshotResult {
|
|
16
|
+
/** Files skipped from snapshot due to size limit */
|
|
17
|
+
skippedFiles: Array<{
|
|
18
|
+
path: string;
|
|
19
|
+
size: number;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* File-based storage for recording entries and session index.
|
|
24
|
+
*
|
|
25
|
+
* Entries are stored in JSONL format (one JSON object per line) in
|
|
26
|
+
* session-specific directories. The session index is stored as a
|
|
27
|
+
* JSON array that gets overwritten on each update.
|
|
28
|
+
*
|
|
29
|
+
* Session index saves are debounced to avoid excessive disk writes
|
|
30
|
+
* when multiple updates occur in rapid succession.
|
|
31
|
+
*/
|
|
32
|
+
export declare class SessionRecordingStorage {
|
|
33
|
+
private readonly recordingsDir;
|
|
34
|
+
private buffer;
|
|
35
|
+
private flushPromise;
|
|
36
|
+
private currentSessionId;
|
|
37
|
+
private storageInitialized;
|
|
38
|
+
private sessions;
|
|
39
|
+
private sessionsLoaded;
|
|
40
|
+
private loadSessionIndexPromise;
|
|
41
|
+
private sessionIndexSaveTimeout;
|
|
42
|
+
private sessionIndexDirty;
|
|
43
|
+
constructor(recordingsDir: string);
|
|
44
|
+
/**
|
|
45
|
+
* Get the path to a session's directory.
|
|
46
|
+
*/
|
|
47
|
+
private getSessionDir;
|
|
48
|
+
/**
|
|
49
|
+
* Get the path to a session's recording file.
|
|
50
|
+
*/
|
|
51
|
+
private getSessionFilePath;
|
|
52
|
+
/**
|
|
53
|
+
* Get the path to the sessions index file.
|
|
54
|
+
*/
|
|
55
|
+
private getSessionsIndexPath;
|
|
56
|
+
/**
|
|
57
|
+
* Ensures the storage directory exists for the current session.
|
|
58
|
+
* Creates directory if needed.
|
|
59
|
+
*/
|
|
60
|
+
private ensureStorageExists;
|
|
61
|
+
/**
|
|
62
|
+
* Ensures the recordings directory exists.
|
|
63
|
+
*/
|
|
64
|
+
private ensureRecordingsDirExists;
|
|
65
|
+
/**
|
|
66
|
+
* Load the session index from disk.
|
|
67
|
+
* Uses a promise to prevent concurrent loads from racing.
|
|
68
|
+
*/
|
|
69
|
+
private loadSessionIndex;
|
|
70
|
+
/**
|
|
71
|
+
* Actually load the session index from disk.
|
|
72
|
+
*/
|
|
73
|
+
private doLoadSessionIndex;
|
|
74
|
+
/**
|
|
75
|
+
* Save the session index to disk immediately.
|
|
76
|
+
* Clears any pending debounced save.
|
|
77
|
+
*/
|
|
78
|
+
private saveSessionIndexNow;
|
|
79
|
+
/**
|
|
80
|
+
* Schedule a debounced save of the session index.
|
|
81
|
+
* Multiple calls within the debounce window will only trigger one save.
|
|
82
|
+
*/
|
|
83
|
+
private scheduleSaveSessionIndex;
|
|
84
|
+
/**
|
|
85
|
+
* Add a new session to the index.
|
|
86
|
+
* Saves immediately since new sessions should be persisted right away.
|
|
87
|
+
*/
|
|
88
|
+
addSession(session: RecordingSession): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Update an existing session in the index.
|
|
91
|
+
* Uses debounced save to batch rapid updates.
|
|
92
|
+
*/
|
|
93
|
+
updateSession(session: RecordingSession): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Get a session by ID.
|
|
96
|
+
* Returns undefined if not found.
|
|
97
|
+
*/
|
|
98
|
+
getSession(sessionId: string): Promise<RecordingSession | undefined>;
|
|
99
|
+
/**
|
|
100
|
+
* List all sessions from the index.
|
|
101
|
+
* Returns sessions in chronological order (oldest first).
|
|
102
|
+
*/
|
|
103
|
+
listSessions(): Promise<RecordingSession[]>;
|
|
104
|
+
/**
|
|
105
|
+
* Get the size of a session's recording file in bytes.
|
|
106
|
+
* Returns 0 if the file doesn't exist yet.
|
|
107
|
+
*/
|
|
108
|
+
getSessionFileSize(sessionId: string): Promise<number>;
|
|
109
|
+
/**
|
|
110
|
+
* Delete oldest sessions to keep only the specified number.
|
|
111
|
+
* Sessions are stored oldest-first, so we delete from the beginning.
|
|
112
|
+
*/
|
|
113
|
+
deleteOldestSessions(keepCount: number): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Add a recording entry for the given session.
|
|
116
|
+
* Appends to buffer and schedules async flush.
|
|
117
|
+
*/
|
|
118
|
+
add(sessionId: string, entry: RecordingEntry): void;
|
|
119
|
+
/**
|
|
120
|
+
* Schedule a flush of the buffer to disk.
|
|
121
|
+
* Uses a simple debounce - if a flush is already pending, don't schedule another.
|
|
122
|
+
*/
|
|
123
|
+
private scheduleFlush;
|
|
124
|
+
/**
|
|
125
|
+
* Flush all buffered entries to disk.
|
|
126
|
+
*/
|
|
127
|
+
private flush;
|
|
128
|
+
/**
|
|
129
|
+
* Create a tar.gz snapshot of the app directory for a session.
|
|
130
|
+
* This captures the state of the codebase when the session started.
|
|
131
|
+
*
|
|
132
|
+
* @param sessionId - The session ID to create the snapshot for
|
|
133
|
+
* @param appRootDirPath - The root directory of the application
|
|
134
|
+
* @param maxFileSizeBytes - Max file size to include (default 1MB)
|
|
135
|
+
* @returns Information about skipped files
|
|
136
|
+
*/
|
|
137
|
+
createSnapshot(sessionId: string, appRootDirPath: string, maxFileSizeBytes?: number): Promise<SnapshotResult>;
|
|
138
|
+
/**
|
|
139
|
+
* Clear all entries for a specific session or all sessions.
|
|
140
|
+
*/
|
|
141
|
+
clear(sessionId?: string): Promise<void>;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=session-recording-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-recording-storage.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/recording/storage/session-recording-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6DpE,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED;;;;;;;;;GASG;AACH,qBAAa,uBAAuB;IAWtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAV1C,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,uBAAuB,CAA8B;IAC7D,OAAO,CAAC,uBAAuB,CAA8C;IAC7E,OAAO,CAAC,iBAAiB,CAAkB;gBAEd,aAAa,EAAE,MAAM;IAElD;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;YACW,mBAAmB;IAYjC;;OAEG;YACW,yBAAyB;IAIvC;;;OAGG;YACW,gBAAgB;IAgB9B;;OAEG;YACW,kBAAkB;IAchC;;;OAGG;YACW,mBAAmB;IAqBjC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAehC;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7D;;;OAGG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAK1E;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKjD;;;OAGG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU5D;;;OAGG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5D;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAKnD;;;OAGG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;YACW,KAAK;IAsBnB;;;;;;;;OAQG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,gBAAgB,GAAE,MAA6C,GAC9D,OAAO,CAAC,cAAc,CAAC;IAoC1B;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkC/C"}
|