@superblocksteam/vite-plugin-file-sync 2.0.162-next.2 → 2.0.163-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.map +1 -1
- package/dist/ai-service/agent/middleware.js +18 -7
- package/dist/ai-service/agent/middleware.js.map +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 +43 -29
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js +25 -0
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
- package/dist/ai-service/agent/subagents/coding/run-coding-subagent.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/coding/run-coding-subagent.js +15 -0
- package/dist/ai-service/agent/subagents/coding/run-coding-subagent.js.map +1 -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 +4 -2
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.d.ts +18 -0
- package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.js +61 -0
- package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.js.map +1 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.js +21 -8
- package/dist/ai-service/agent/tools/build-install-packages.js.map +1 -1
- package/dist/ai-service/agent/tools/build-read-file.d.ts +87 -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 +453 -82
- package/dist/ai-service/agent/tools/build-read-file.js.map +1 -1
- package/dist/ai-service/agent/tools/build-write-file.d.ts +1 -0
- package/dist/ai-service/agent/tools/build-write-file.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-write-file.js +18 -2
- package/dist/ai-service/agent/tools/build-write-file.js.map +1 -1
- package/dist/ai-service/agent/tools/debug-cache.d.ts +11 -0
- package/dist/ai-service/agent/tools/debug-cache.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js +62 -14
- package/dist/ai-service/agent/tools/debug-cache.js.map +1 -1
- package/dist/ai-service/agent/tools/index.d.ts +2 -1
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +2 -1
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/metadata.d.ts +1 -0
- package/dist/ai-service/agent/tools/integrations/metadata.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/metadata.js +7 -2
- package/dist/ai-service/agent/tools/integrations/metadata.js.map +1 -1
- package/dist/ai-service/agent/tools/read-file-metrics.d.ts +30 -0
- package/dist/ai-service/agent/tools/read-file-metrics.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/read-file-metrics.js +158 -0
- package/dist/ai-service/agent/tools/read-file-metrics.js.map +1 -0
- package/dist/ai-service/agent/tools/subagent-isolation.d.ts +27 -0
- package/dist/ai-service/agent/tools/subagent-isolation.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/subagent-isolation.js +57 -0
- package/dist/ai-service/agent/tools/subagent-isolation.js.map +1 -0
- package/dist/ai-service/agent/tools.d.ts +4 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +51 -5
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/download-attachments.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/download-attachments.js +1 -0
- package/dist/ai-service/agent/tools2/tools/download-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 +14 -0
- package/dist/ai-service/agent/tools2/tools/start-test-run.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +2 -2
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/draft-manager.d.ts +2 -1
- package/dist/ai-service/app-interface/filesystem/draft-manager.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/draft-manager.js +3 -0
- package/dist/ai-service/app-interface/filesystem/draft-manager.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts +2 -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 +13 -11
- package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js.map +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.d.ts.map +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.js +1 -1
- package/dist/ai-service/app-interface/filesystem/virtual-file-system.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +18 -9
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +92 -112
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/app-interface/typecheck-output-parser.d.ts +9 -0
- package/dist/ai-service/app-interface/typecheck-output-parser.d.ts.map +1 -0
- package/dist/ai-service/app-interface/typecheck-output-parser.js +21 -0
- package/dist/ai-service/app-interface/typecheck-output-parser.js.map +1 -0
- package/dist/ai-service/app-interface/vulnerability-gate.d.ts +5 -0
- package/dist/ai-service/app-interface/vulnerability-gate.d.ts.map +1 -1
- package/dist/ai-service/app-interface/vulnerability-gate.js +9 -2
- package/dist/ai-service/app-interface/vulnerability-gate.js.map +1 -1
- package/dist/ai-service/app-layout.d.ts +13 -0
- package/dist/ai-service/app-layout.d.ts.map +1 -0
- package/dist/ai-service/app-layout.js +25 -0
- package/dist/ai-service/app-layout.js.map +1 -0
- package/dist/ai-service/app-skills/manager.d.ts +2 -0
- package/dist/ai-service/app-skills/manager.d.ts.map +1 -1
- package/dist/ai-service/app-skills/manager.js +13 -6
- package/dist/ai-service/app-skills/manager.js.map +1 -1
- package/dist/ai-service/attachment-label-metrics.d.ts +5 -0
- package/dist/ai-service/attachment-label-metrics.d.ts.map +1 -0
- package/dist/ai-service/attachment-label-metrics.js +26 -0
- package/dist/ai-service/attachment-label-metrics.js.map +1 -0
- package/dist/ai-service/attachment-upload.d.ts.map +1 -1
- package/dist/ai-service/attachment-upload.js +6 -1
- package/dist/ai-service/attachment-upload.js.map +1 -1
- package/dist/ai-service/attachments/validate-prompt-attachments.d.ts +7 -0
- package/dist/ai-service/attachments/validate-prompt-attachments.d.ts.map +1 -0
- package/dist/ai-service/attachments/validate-prompt-attachments.js +96 -0
- package/dist/ai-service/attachments/validate-prompt-attachments.js.map +1 -0
- package/dist/ai-service/chat/chat-push-metrics.d.ts +17 -0
- package/dist/ai-service/chat/chat-push-metrics.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-push-metrics.js +45 -0
- package/dist/ai-service/chat/chat-push-metrics.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +51 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +181 -4
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/features.d.ts +32 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +32 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/helper-system-ai-attributes.d.ts +1 -1
- package/dist/ai-service/helper-system-ai-attributes.d.ts.map +1 -1
- package/dist/ai-service/helper-system-ai-attributes.js.map +1 -1
- package/dist/ai-service/index.d.ts +19 -4
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +176 -23
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +9 -0
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +13 -43
- 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/compaction/server-side.d.ts +8 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/server-side.js +8 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context-component-partition.d.ts +24 -0
- package/dist/ai-service/llm/context-v2/context-component-partition.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/context-component-partition.js +222 -0
- package/dist/ai-service/llm/context-v2/context-component-partition.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context-metrics.d.ts +9 -0
- package/dist/ai-service/llm/context-v2/context-metrics.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context-metrics.js +40 -2
- package/dist/ai-service/llm/context-v2/context-metrics.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context.d.ts +116 -4
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +276 -64
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts +18 -0
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/file-read-ledger.d.ts +218 -0
- package/dist/ai-service/llm/context-v2/file-read-ledger.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/file-read-ledger.js +275 -0
- package/dist/ai-service/llm/context-v2/file-read-ledger.js.map +1 -0
- 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 +5 -2
- package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -1
- package/dist/ai-service/llm/context-v2/token-tracker.d.ts +2 -0
- package/dist/ai-service/llm/context-v2/token-tracker.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/token-tracker.js +4 -0
- package/dist/ai-service/llm/context-v2/token-tracker.js.map +1 -1
- package/dist/ai-service/llm/context-v2/tool-schema-tokens.d.ts +22 -0
- package/dist/ai-service/llm/context-v2/tool-schema-tokens.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/tool-schema-tokens.js +36 -0
- package/dist/ai-service/llm/context-v2/tool-schema-tokens.js.map +1 -0
- package/dist/ai-service/llm/context-v2/types.d.ts +8 -0
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js +48 -0
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +2 -0
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +1 -0
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/retry-exhaustion-reason.d.ts +2 -0
- package/dist/ai-service/llm/retry-exhaustion-reason.d.ts.map +1 -0
- package/dist/ai-service/llm/retry-exhaustion-reason.js +2 -0
- package/dist/ai-service/llm/retry-exhaustion-reason.js.map +1 -0
- package/dist/ai-service/llm/stream/errors.d.ts +6 -7
- package/dist/ai-service/llm/stream/errors.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/errors.js +7 -1
- package/dist/ai-service/llm/stream/errors.js.map +1 -1
- package/dist/ai-service/llm/stream/event-bus.d.ts +9 -1
- package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/event-bus.js.map +1 -1
- package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.js +13 -0
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts +14 -1
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/llmobs.js +91 -7
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.d.ts +3 -1
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/logging.js +73 -52
- 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 +16 -9
- package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.d.ts +5 -1
- package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/orchestrator.js +103 -12
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.d.ts +3 -1
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/retry-engine.js +9 -0
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
- package/dist/ai-service/llm/stream/session.d.ts +8 -1
- package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/session.js +19 -0
- package/dist/ai-service/llm/stream/session.js.map +1 -1
- package/dist/ai-service/llm/stream/types.d.ts +13 -0
- package/dist/ai-service/llm/stream/types.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/wait-state-tracker.d.ts +5 -14
- package/dist/ai-service/llm/stream/wait-state-tracker.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/wait-state-tracker.js +25 -0
- package/dist/ai-service/llm/stream/wait-state-tracker.js.map +1 -1
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +8 -8
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -1
- package/dist/ai-service/policy-gate-remediation-usage.d.ts +2 -0
- package/dist/ai-service/policy-gate-remediation-usage.d.ts.map +1 -0
- package/dist/ai-service/policy-gate-remediation-usage.js +56 -0
- package/dist/ai-service/policy-gate-remediation-usage.js.map +1 -0
- package/dist/ai-service/prompts/summarize-destructive-migration.d.ts +12 -0
- package/dist/ai-service/prompts/summarize-destructive-migration.d.ts.map +1 -0
- package/dist/ai-service/prompts/summarize-destructive-migration.js +37 -0
- package/dist/ai-service/prompts/summarize-destructive-migration.js.map +1 -0
- package/dist/ai-service/recording/storage/session-recording-storage.js +2 -2
- package/dist/ai-service/recording/storage/session-recording-storage.js.map +1 -1
- package/dist/ai-service/security/secret-scanner-service.d.ts.map +1 -1
- package/dist/ai-service/security/secret-scanner-service.js +88 -23
- package/dist/ai-service/security/secret-scanner-service.js.map +1 -1
- package/dist/ai-service/skills/index.d.ts +0 -7
- package/dist/ai-service/skills/index.d.ts.map +1 -1
- package/dist/ai-service/skills/index.js +0 -9
- package/dist/ai-service/skills/index.js.map +1 -1
- package/dist/ai-service/skills/system/_registry.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/_registry.generated.js +4 -0
- package/dist/ai-service/skills/system/_registry.generated.js.map +1 -1
- package/dist/ai-service/skills/system/resolve.d.ts +2 -0
- package/dist/ai-service/skills/system/resolve.d.ts.map +1 -0
- package/dist/ai-service/skills/system/resolve.js +32 -0
- package/dist/ai-service/skills/system/resolve.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.d.ts +2 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.js +9 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.d.ts +2 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.d.ts.map +1 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.js +11 -0
- package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.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 +16 -24
- package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.js +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +11 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +7 -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 +21 -0
- 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 +32 -9
- 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 +21 -2
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/stable-peer.d.ts +11 -2
- package/dist/ai-service/state-machine/helpers/stable-peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/stable-peer.js +105 -18
- package/dist/ai-service/state-machine/helpers/stable-peer.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts +3 -1
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +52 -13
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/tasks/peer-push.d.ts +3 -0
- package/dist/ai-service/tasks/peer-push.d.ts.map +1 -1
- package/dist/ai-service/tasks/peer-push.js +33 -0
- package/dist/ai-service/tasks/peer-push.js.map +1 -1
- package/dist/ai-service/util/call-peer.d.ts +2 -0
- package/dist/ai-service/util/call-peer.d.ts.map +1 -1
- package/dist/ai-service/util/call-peer.js +17 -4
- package/dist/ai-service/util/call-peer.js.map +1 -1
- package/dist/ai-service/util/line-ranges.d.ts +21 -0
- package/dist/ai-service/util/line-ranges.d.ts.map +1 -0
- package/dist/ai-service/util/line-ranges.js +36 -0
- package/dist/ai-service/util/line-ranges.js.map +1 -0
- package/dist/ai-service/util/peer-liveness.d.ts +1 -0
- package/dist/ai-service/util/peer-liveness.d.ts.map +1 -1
- package/dist/ai-service/util/peer-liveness.js +2 -0
- package/dist/ai-service/util/peer-liveness.js.map +1 -1
- package/dist/dev-server-ws-smoke-client.d.ts.map +1 -1
- package/dist/dev-server-ws-smoke-client.js +7 -0
- package/dist/dev-server-ws-smoke-client.js.map +1 -1
- package/dist/draft-interface.d.ts +8 -0
- package/dist/draft-interface.d.ts.map +1 -1
- package/dist/early-error-relay.d.ts +2 -0
- package/dist/early-error-relay.d.ts.map +1 -1
- package/dist/early-error-relay.js +7 -3
- package/dist/early-error-relay.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +43 -15
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-helpers.d.ts +2 -2
- package/dist/file-system-helpers.d.ts.map +1 -1
- package/dist/file-system-helpers.js +3 -3
- package/dist/file-system-helpers.js.map +1 -1
- package/dist/git-service/errors.d.ts +9 -0
- package/dist/git-service/errors.d.ts.map +1 -1
- package/dist/git-service/errors.js +15 -0
- package/dist/git-service/errors.js.map +1 -1
- package/dist/git-service/index.d.ts +2 -2
- package/dist/git-service/index.d.ts.map +1 -1
- package/dist/git-service/index.js +2 -2
- package/dist/git-service/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lock-service/activity-tracker.d.ts +5 -0
- package/dist/lock-service/activity-tracker.d.ts.map +1 -1
- package/dist/lock-service/activity-tracker.js +10 -0
- package/dist/lock-service/activity-tracker.js.map +1 -1
- package/dist/lock-service/index.d.ts +69 -4
- package/dist/lock-service/index.d.ts.map +1 -1
- package/dist/lock-service/index.js +139 -29
- package/dist/lock-service/index.js.map +1 -1
- package/dist/migration-templates/app-fullstack/client/components/ui/accordion.tsx +9 -65
- package/dist/migration-templates/app-fullstack/client/components/ui/area-chart.tsx +36 -156
- package/dist/migration-templates/app-fullstack/client/components/ui/aspect-ratio.tsx +1 -5
- package/dist/migration-templates/app-fullstack/client/components/ui/avatar.tsx +4 -18
- package/dist/migration-templates/app-fullstack/client/components/ui/badge.tsx +6 -29
- package/dist/migration-templates/app-fullstack/client/components/ui/bar-chart.tsx +41 -167
- package/dist/migration-templates/app-fullstack/client/components/ui/breadcrumb.tsx +1 -4
- package/dist/migration-templates/app-fullstack/client/components/ui/button.tsx +5 -64
- package/dist/migration-templates/app-fullstack/client/components/ui/calendar.tsx +6 -42
- package/dist/migration-templates/app-fullstack/client/components/ui/card.tsx +1 -4
- package/dist/migration-templates/app-fullstack/client/components/ui/checkbox.tsx +4 -29
- package/dist/migration-templates/app-fullstack/client/components/ui/date-range-picker.tsx +13 -154
- package/dist/migration-templates/app-fullstack/client/components/ui/dialog.tsx +7 -34
- package/dist/migration-templates/app-fullstack/client/components/ui/file-dropzone.tsx +12 -95
- package/dist/migration-templates/app-fullstack/client/components/ui/file-input.tsx +12 -73
- package/dist/migration-templates/app-fullstack/client/components/ui/hover-card.tsx +10 -66
- package/dist/migration-templates/app-fullstack/client/components/ui/icon.tsx +3 -16
- package/dist/migration-templates/app-fullstack/client/components/ui/image.tsx +4 -16
- package/dist/migration-templates/app-fullstack/client/components/ui/input.tsx +18 -159
- package/dist/migration-templates/app-fullstack/client/components/ui/label.tsx +1 -4
- package/dist/migration-templates/app-fullstack/client/components/ui/line-chart.tsx +32 -148
- package/dist/migration-templates/app-fullstack/client/components/ui/link.tsx +4 -24
- package/dist/migration-templates/app-fullstack/client/components/ui/navigation-menu.tsx +3 -24
- package/dist/migration-templates/app-fullstack/client/components/ui/pagination.tsx +4 -24
- package/dist/migration-templates/app-fullstack/client/components/ui/pie-chart.tsx +28 -142
- package/dist/migration-templates/app-fullstack/client/components/ui/popover.tsx +9 -61
- package/dist/migration-templates/app-fullstack/client/components/ui/progress.tsx +2 -11
- package/dist/migration-templates/app-fullstack/client/components/ui/radar-chart.tsx +37 -171
- package/dist/migration-templates/app-fullstack/client/components/ui/radial-chart.tsx +50 -202
- package/dist/migration-templates/app-fullstack/client/components/ui/select.tsx +5 -35
- package/dist/migration-templates/app-fullstack/client/components/ui/separator.tsx +1 -8
- package/dist/migration-templates/app-fullstack/client/components/ui/sheet.tsx +7 -40
- package/dist/migration-templates/app-fullstack/client/components/ui/sidebar.tsx +3 -35
- package/dist/migration-templates/app-fullstack/client/components/ui/slider.tsx +11 -95
- package/dist/migration-templates/app-fullstack/client/components/ui/switch.tsx +5 -32
- package/dist/migration-templates/app-fullstack/client/components/ui/textarea.tsx +13 -90
- package/dist/migration-templates/app-fullstack/client/components/ui/toggle-group.tsx +11 -75
- package/dist/migration-templates/app-fullstack/client/components/ui/toggle.tsx +8 -70
- package/dist/migration-templates/app-fullstack/client/components/ui/tooltip.tsx +9 -62
- package/dist/parsing/imports.d.ts +22 -0
- package/dist/parsing/imports.d.ts.map +1 -1
- package/dist/parsing/imports.js +71 -0
- package/dist/parsing/imports.js.map +1 -1
- package/dist/reconnect-guard-plugin.d.ts +53 -0
- package/dist/reconnect-guard-plugin.d.ts.map +1 -0
- package/dist/reconnect-guard-plugin.js +203 -0
- package/dist/reconnect-guard-plugin.js.map +1 -0
- package/dist/resolver.d.ts +2 -1
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +4 -6
- package/dist/resolver.js.map +1 -1
- package/dist/router-parser-metrics.d.ts +2 -1
- package/dist/router-parser-metrics.d.ts.map +1 -1
- package/dist/router-parser-metrics.js.map +1 -1
- package/dist/router-parser.d.ts +10 -1
- package/dist/router-parser.d.ts.map +1 -1
- package/dist/router-parser.js +306 -69
- package/dist/router-parser.js.map +1 -1
- package/dist/scan-scope-merge-metrics.d.ts +2 -0
- package/dist/scan-scope-merge-metrics.d.ts.map +1 -0
- package/dist/scan-scope-merge-metrics.js +18 -0
- package/dist/scan-scope-merge-metrics.js.map +1 -0
- package/dist/scan-scope-merge.d.ts +2 -2
- package/dist/scan-scope-merge.d.ts.map +1 -1
- package/dist/scan-scope-merge.js +64 -14
- package/dist/scan-scope-merge.js.map +1 -1
- package/dist/server-rpc/index.d.ts.map +1 -1
- package/dist/server-rpc/index.js +12 -2
- package/dist/server-rpc/index.js.map +1 -1
- package/dist/socket-manager.d.ts +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +276 -15
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/download.js +2 -2
- package/dist/sync-service/download.js.map +1 -1
- package/dist/sync-service/index.d.ts +95 -22
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +402 -56
- package/dist/sync-service/index.js.map +1 -1
- package/dist/sync-service/page-reference-guard.d.ts +17 -0
- package/dist/sync-service/page-reference-guard.d.ts.map +1 -0
- package/dist/sync-service/page-reference-guard.js +170 -0
- package/dist/sync-service/page-reference-guard.js.map +1 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +16 -2
- package/dist/util.js.map +1 -1
- package/package.json +15 -14
package/dist/socket-manager.js
CHANGED
|
@@ -13,13 +13,14 @@ import { clearGitAuthFailed, isGitAuthFailed, markGitAuthFailed, } from "./git-a
|
|
|
13
13
|
import { GIT_LOG_FORMAT, parseGitLog } from "./git-log.js";
|
|
14
14
|
import { GIT_OPERATION_BUSY_MESSAGE, } from "./git-operation-lock.js";
|
|
15
15
|
import { assertIncomingLiveLayout } from "./git-service/app-layout-guard.js";
|
|
16
|
-
import { GitConflictError } from "./git-service/index.js";
|
|
16
|
+
import { GitConflictError, isMissingGitRevisionError, } from "./git-service/index.js";
|
|
17
17
|
import { doesRemoteLiveBranchExist, ensureLiveBranchCheckedOut, pushLiveBranchWithAutoRecreate, rollbackLastCommit, } from "./git-service/live-branch.js";
|
|
18
18
|
import { ensureProviderWorkflowFiles } from "./git-service/provider-workflow-files.js";
|
|
19
19
|
import { getSyncCountsAgainstDefaultBranch } from "./git-service/status-sync.js";
|
|
20
20
|
import { getErrorMeta, getLogger } from "./util/logger.js";
|
|
21
21
|
import { OperationQueue } from "./util/operation-queue.js";
|
|
22
22
|
const SB_WORKTREE_SNAPSHOTS_DIR = join(tmpdir(), "sb-worktree-snapshots");
|
|
23
|
+
const EDITOR_RECONNECT_AUTH_TIMEOUT_MS = 30_000;
|
|
23
24
|
/**
|
|
24
25
|
* Pulls the JWT-derived `userId` out of an `Authorization: Bearer <jwt>`
|
|
25
26
|
* header value. Returns `undefined` for missing / malformed headers or
|
|
@@ -299,6 +300,66 @@ class SocketManager extends TracedEventEmitter {
|
|
|
299
300
|
return true;
|
|
300
301
|
});
|
|
301
302
|
};
|
|
303
|
+
// Clark is bound to one editor connection at a time, and which one owns
|
|
304
|
+
// the pod has to be decided per physical connection rather than per peer
|
|
305
|
+
// id: the browser reuses its peer id across retry reconnects, so an id
|
|
306
|
+
// match does not mean the request came from the connection that is still
|
|
307
|
+
// open. Sockets are keyed by object identity and ordered by the sequence
|
|
308
|
+
// they connected in, so a request that was already waiting in a
|
|
309
|
+
// superseded connection's authorization middleware cannot take the pod
|
|
310
|
+
// back from the connection that replaced it. Only a connection that has
|
|
311
|
+
// proved its authorization is a candidate, which is why binding happens
|
|
312
|
+
// here and not on `connect:editor`.
|
|
313
|
+
let activeEditorSocket;
|
|
314
|
+
// A failed replacement may have changed AiService's transport. Keep the
|
|
315
|
+
// owner's ordering, but repair its transport before any further RPC or close.
|
|
316
|
+
let editorBindingNeedsRepair = false;
|
|
317
|
+
// Set while the bound editor's socket has closed and a reconnect for the
|
|
318
|
+
// same peer is open but has not proved its authorization yet. The pod
|
|
319
|
+
// keeps that peer's conversation until the reconnect binds or gives up.
|
|
320
|
+
let detachedEditorPeerId;
|
|
321
|
+
let detachedEditorTimer;
|
|
322
|
+
let nextEditorConnectionSequence = 0;
|
|
323
|
+
const authenticatedEditorSockets = new Map();
|
|
324
|
+
const repairEditorBinding = () => {
|
|
325
|
+
if (!editorBindingNeedsRepair)
|
|
326
|
+
return;
|
|
327
|
+
const owner = activeEditorSocket &&
|
|
328
|
+
authenticatedEditorSockets.get(activeEditorSocket);
|
|
329
|
+
if (activeEditorSocket && owner) {
|
|
330
|
+
aiService?.handleUserConnected(activeEditorSocket, owner.peerId, owner.liveness);
|
|
331
|
+
}
|
|
332
|
+
else if (detachedEditorPeerId) {
|
|
333
|
+
aiService?.detachPeerTransport(detachedEditorPeerId);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
aiService?.resetEditorConnection();
|
|
337
|
+
}
|
|
338
|
+
editorBindingNeedsRepair = false;
|
|
339
|
+
};
|
|
340
|
+
const resetFailedEditorTransition = () => {
|
|
341
|
+
activeEditorSocket = undefined;
|
|
342
|
+
detachedEditorPeerId = undefined;
|
|
343
|
+
clearTimeout(detachedEditorTimer);
|
|
344
|
+
editorBindingNeedsRepair = true;
|
|
345
|
+
try {
|
|
346
|
+
repairEditorBinding();
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
// Keep the repair flag: subsequent RPCs cannot bind until teardown
|
|
350
|
+
// succeeds. Resetting bookkeeping alone would orphan the conversation.
|
|
351
|
+
getLogger().error("[socket-manager] Failed to clear editor binding after lifecycle failure", getErrorMeta(error));
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
const newestAuthenticatedEditor = () => {
|
|
355
|
+
let newest;
|
|
356
|
+
for (const [peer, connection] of authenticatedEditorSockets) {
|
|
357
|
+
if (!newest || connection.sequence > newest.sequence) {
|
|
358
|
+
newest = { peer, ...connection };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return newest;
|
|
362
|
+
};
|
|
302
363
|
const releaseHeadlessLock = (peerId, turnId) => headlessLockHandbackQueue.enqueue(() => releaseHeadlessLockNow(peerId, turnId));
|
|
303
364
|
// Provide sync context (branchName, lastCommitId) to the AI service
|
|
304
365
|
// for remote context restore fallback from Bucketeer on fresh pods.
|
|
@@ -464,6 +525,7 @@ class SocketManager extends TracedEventEmitter {
|
|
|
464
525
|
};
|
|
465
526
|
server.on("upgrade", handleUpgrade);
|
|
466
527
|
this._disposer = () => {
|
|
528
|
+
clearTimeout(detachedEditorTimer);
|
|
467
529
|
server.removeListener("upgrade", handleUpgrade);
|
|
468
530
|
wss.close();
|
|
469
531
|
};
|
|
@@ -487,6 +549,9 @@ class SocketManager extends TracedEventEmitter {
|
|
|
487
549
|
getLogger().warn(`[socket-manager] post-auth git activation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
488
550
|
});
|
|
489
551
|
};
|
|
552
|
+
const editorConnectionSequence = isEditor
|
|
553
|
+
? ++nextEditorConnectionSequence
|
|
554
|
+
: 0;
|
|
490
555
|
const authMiddleware = async (params, ctx, _peer, next) => {
|
|
491
556
|
const result = await checkAuthorization(ctx.peerAuthorization);
|
|
492
557
|
if (!result.success) {
|
|
@@ -535,13 +600,66 @@ class SocketManager extends TracedEventEmitter {
|
|
|
535
600
|
// user B reconnecting to an AiService running user A's task
|
|
536
601
|
// would receive A's `taskId` and could then cancel it via
|
|
537
602
|
// the UI path. See peer-push.ts:resyncActiveTaskStatusesToPeer.
|
|
538
|
-
|
|
603
|
+
// The authorization check above is asynchronous, so this connection
|
|
604
|
+
// can have closed while it was running, and its close handler has
|
|
605
|
+
// already run by then. Registering it here would leave a closed
|
|
606
|
+
// socket owning the pod, with the live connection's primes ignored
|
|
607
|
+
// as superseded.
|
|
608
|
+
const isOpenEditor = isEditor && this.editorSockets.has(socket);
|
|
609
|
+
if (isEditor && !isOpenEditor) {
|
|
610
|
+
getLogger().info(`[socket-manager] Ignored an authorization proved by a closed editor connection ${peerId}`, { "editor.connection.sequence": editorConnectionSequence });
|
|
611
|
+
}
|
|
612
|
+
if (aiService && isOpenEditor) {
|
|
613
|
+
const callerUserId = extractCallerUserId(ctx.peerAuthorization);
|
|
539
614
|
try {
|
|
540
|
-
|
|
541
|
-
|
|
615
|
+
repairEditorBinding();
|
|
616
|
+
authenticatedEditorSockets.set(socket, {
|
|
617
|
+
liveness: connectionLiveness,
|
|
618
|
+
peerId,
|
|
619
|
+
sequence: editorConnectionSequence,
|
|
620
|
+
});
|
|
621
|
+
const activeConnection = activeEditorSocket
|
|
622
|
+
? authenticatedEditorSockets.get(activeEditorSocket)
|
|
623
|
+
: undefined;
|
|
624
|
+
// While the pod waits for a peer's reconnect, nobody else's
|
|
625
|
+
// authorization takes it: the pod is unbound but not unowned,
|
|
626
|
+
// and a collaborator's next RPC would otherwise walk off with
|
|
627
|
+
// the conversation before that reconnect has had its chance.
|
|
628
|
+
const waitingForAnotherPeer = detachedEditorPeerId !== undefined &&
|
|
629
|
+
detachedEditorPeerId !== peerId;
|
|
630
|
+
if (!waitingForAnotherPeer &&
|
|
631
|
+
(!activeConnection ||
|
|
632
|
+
editorConnectionSequence > activeConnection.sequence)) {
|
|
633
|
+
aiService.handleUserConnected(socket, peerId, connectionLiveness);
|
|
634
|
+
activeEditorSocket = socket;
|
|
635
|
+
editorBindingNeedsRepair = false;
|
|
636
|
+
detachedEditorPeerId = undefined;
|
|
637
|
+
clearTimeout(detachedEditorTimer);
|
|
638
|
+
getLogger().debug("[socket-manager] Bound editor connection", {
|
|
639
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
640
|
+
"peer.id": peerId,
|
|
641
|
+
});
|
|
642
|
+
}
|
|
542
643
|
}
|
|
543
644
|
catch (err) {
|
|
544
|
-
|
|
645
|
+
if (activeEditorSocket !== socket) {
|
|
646
|
+
authenticatedEditorSockets.delete(socket);
|
|
647
|
+
}
|
|
648
|
+
editorBindingNeedsRepair = true;
|
|
649
|
+
getLogger().error(`[socket-manager] Authenticated editor binding failed peer.id=${peerId} editor.connection.sequence=${editorConnectionSequence}`, getErrorMeta(err));
|
|
650
|
+
throw err;
|
|
651
|
+
}
|
|
652
|
+
if (activeEditorSocket === socket) {
|
|
653
|
+
try {
|
|
654
|
+
aiService.notifyAuthenticatedRpc(peerId, callerUserId);
|
|
655
|
+
}
|
|
656
|
+
catch (error) {
|
|
657
|
+
getLogger().warn("[socket-manager] Authenticated editor resync failed", {
|
|
658
|
+
...getErrorMeta(error),
|
|
659
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
660
|
+
"peer.id": peerId,
|
|
661
|
+
});
|
|
662
|
+
}
|
|
545
663
|
}
|
|
546
664
|
}
|
|
547
665
|
// Everything a gateway peer is trusted with hangs off this proof.
|
|
@@ -580,7 +698,6 @@ class SocketManager extends TracedEventEmitter {
|
|
|
580
698
|
// Renames
|
|
581
699
|
renameElement: [fileSyncManager.handleRenameElement],
|
|
582
700
|
renameApi: [fileSyncManager.handleRenameApi],
|
|
583
|
-
// Update APIs
|
|
584
701
|
apiUpdate: [fileSyncManager.handleUpdateApi],
|
|
585
702
|
apiDelete: [fileSyncManager.handleDeleteApi],
|
|
586
703
|
// Ensure files are synced
|
|
@@ -846,6 +963,11 @@ class SocketManager extends TracedEventEmitter {
|
|
|
846
963
|
await aiService?.handleAiSummarizeApiUsage(request);
|
|
847
964
|
},
|
|
848
965
|
],
|
|
966
|
+
aiSummarizeDestructiveMigration: [
|
|
967
|
+
async (request) => {
|
|
968
|
+
await aiService?.handleAiSummarizeDestructiveMigration(request);
|
|
969
|
+
},
|
|
970
|
+
],
|
|
849
971
|
aiSummarizeError: [
|
|
850
972
|
async (request) => {
|
|
851
973
|
await aiService?.handleAiSummarizeError(request);
|
|
@@ -936,6 +1058,15 @@ class SocketManager extends TracedEventEmitter {
|
|
|
936
1058
|
],
|
|
937
1059
|
aiRestoreToCommit: [
|
|
938
1060
|
async (request, _context) => {
|
|
1061
|
+
if (!isEditor) {
|
|
1062
|
+
throw new Error("This RPC requires an editor connection");
|
|
1063
|
+
}
|
|
1064
|
+
if (!activeEditorSocket) {
|
|
1065
|
+
throw new Error("The editor connection is still reconnecting");
|
|
1066
|
+
}
|
|
1067
|
+
if (activeEditorSocket !== socket) {
|
|
1068
|
+
throw new Error("Only the active editor connection can restore a commit");
|
|
1069
|
+
}
|
|
939
1070
|
// Update clark.context.jwt from socket if missing (for restore operations)
|
|
940
1071
|
if (aiService && _context.peerAuthorization) {
|
|
941
1072
|
const jwt = _context.peerAuthorization.replace("Bearer ", "");
|
|
@@ -1003,6 +1134,27 @@ class SocketManager extends TracedEventEmitter {
|
|
|
1003
1134
|
if (!aiService) {
|
|
1004
1135
|
throw new Error("Cannot prime the Clark inference JWT: the AI service is not running");
|
|
1005
1136
|
}
|
|
1137
|
+
if (!isEditor) {
|
|
1138
|
+
throw new Error("This RPC requires an editor connection");
|
|
1139
|
+
}
|
|
1140
|
+
if (!activeEditorSocket) {
|
|
1141
|
+
throw new Error("The editor connection is still reconnecting");
|
|
1142
|
+
}
|
|
1143
|
+
// A prime can still be waiting in a closed socket's
|
|
1144
|
+
// authorization middleware when a newer connection has
|
|
1145
|
+
// already taken over the pod, and closing a socket does
|
|
1146
|
+
// not retract a request it already sent. Reported as
|
|
1147
|
+
// taken: the pod holds the newer connection's token, so
|
|
1148
|
+
// the browser has no failure to retry.
|
|
1149
|
+
if (activeEditorSocket !== socket) {
|
|
1150
|
+
getLogger().info(`[socket-manager] Ignored a Clark inference JWT prime from superseded editor connection ${peerId}`, {
|
|
1151
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
1152
|
+
"editor.active_connection.sequence": activeEditorSocket
|
|
1153
|
+
? authenticatedEditorSockets.get(activeEditorSocket)?.sequence
|
|
1154
|
+
: undefined,
|
|
1155
|
+
});
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1006
1158
|
if (!aiService.updateClarkJwt(request.jwt)) {
|
|
1007
1159
|
throw new Error("The dev server rejected the Clark inference JWT");
|
|
1008
1160
|
}
|
|
@@ -1449,16 +1601,36 @@ class SocketManager extends TracedEventEmitter {
|
|
|
1449
1601
|
remote: "origin",
|
|
1450
1602
|
...getErrorMeta(fetchErr),
|
|
1451
1603
|
});
|
|
1604
|
+
if (isMissingGitRevisionError(fetchErr)) {
|
|
1605
|
+
return [];
|
|
1606
|
+
}
|
|
1452
1607
|
}
|
|
1453
1608
|
}
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1609
|
+
try {
|
|
1610
|
+
const raw = await readyGitService.raw([
|
|
1611
|
+
"log",
|
|
1612
|
+
logRef,
|
|
1613
|
+
`--format=${GIT_LOG_FORMAT}`,
|
|
1614
|
+
`-n`,
|
|
1615
|
+
String(limit),
|
|
1616
|
+
]);
|
|
1617
|
+
return parseGitLog(raw);
|
|
1618
|
+
}
|
|
1619
|
+
catch (logErr) {
|
|
1620
|
+
if (isMissingGitRevisionError(logErr)) {
|
|
1621
|
+
getLogger().warn("[git] gitBranchLog skipped missing ref", {
|
|
1622
|
+
gitCategory: "branch",
|
|
1623
|
+
gitOperation: "branch-log",
|
|
1624
|
+
gitOutcome: "fallback",
|
|
1625
|
+
gitErrorKind: "missing_revision",
|
|
1626
|
+
branch,
|
|
1627
|
+
logRef,
|
|
1628
|
+
...getErrorMeta(logErr),
|
|
1629
|
+
});
|
|
1630
|
+
return [];
|
|
1631
|
+
}
|
|
1632
|
+
throw logErr;
|
|
1633
|
+
}
|
|
1462
1634
|
},
|
|
1463
1635
|
],
|
|
1464
1636
|
gitPrepareMainCommit: [
|
|
@@ -1618,7 +1790,10 @@ class SocketManager extends TracedEventEmitter {
|
|
|
1618
1790
|
// new arrival and activates git again.
|
|
1619
1791
|
this.gitActivatedPeerIds.delete(peerId);
|
|
1620
1792
|
}
|
|
1621
|
-
getLogger().info(`Socket from ${kind} closed code: ${code} reason: ${reason}
|
|
1793
|
+
getLogger().info(`Socket from ${kind} closed code: ${code} reason: ${reason}`, {
|
|
1794
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
1795
|
+
"peer.id": peerId,
|
|
1796
|
+
});
|
|
1622
1797
|
if (kind === "gateway") {
|
|
1623
1798
|
this.gatewaySockets.delete(socket);
|
|
1624
1799
|
lockService?.markGatewayDetached(peerId);
|
|
@@ -1631,7 +1806,93 @@ class SocketManager extends TracedEventEmitter {
|
|
|
1631
1806
|
}
|
|
1632
1807
|
else if (isEditor) {
|
|
1633
1808
|
this.editorSockets.delete(socket);
|
|
1809
|
+
const wasActiveEditor = activeEditorSocket === socket;
|
|
1810
|
+
// Keep the closing owner's binding available for repair below.
|
|
1811
|
+
// Otherwise a partial replacement makes its disconnect look stale.
|
|
1812
|
+
if (!wasActiveEditor)
|
|
1813
|
+
authenticatedEditorSockets.delete(socket);
|
|
1634
1814
|
const hasOtherEditorSocket = Array.from(peerSockets ?? []).some((peerSocket) => this.editorSockets.has(peerSocket));
|
|
1815
|
+
// The user really left. Tear the conversation down and hand the
|
|
1816
|
+
// pod to the newest other editor that proved its authorization.
|
|
1817
|
+
const releaseEditorBinding = (liveness) => {
|
|
1818
|
+
clearTimeout(detachedEditorTimer);
|
|
1819
|
+
detachedEditorPeerId = undefined;
|
|
1820
|
+
const replacement = newestAuthenticatedEditor();
|
|
1821
|
+
activeEditorSocket = undefined;
|
|
1822
|
+
try {
|
|
1823
|
+
aiService?.handleUserDisconnected(peerId, replacement, liveness);
|
|
1824
|
+
activeEditorSocket = replacement?.peer;
|
|
1825
|
+
getLogger().debug("[socket-manager] Released editor connection", {
|
|
1826
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
1827
|
+
"editor.active_connection.sequence": replacement?.sequence,
|
|
1828
|
+
"peer.id": peerId,
|
|
1829
|
+
});
|
|
1830
|
+
// Task pushes wait for the survivor's next authenticated RPC.
|
|
1831
|
+
}
|
|
1832
|
+
catch (error) {
|
|
1833
|
+
resetFailedEditorTransition();
|
|
1834
|
+
getLogger().error(`[socket-manager] Failed to release editor binding peer.id=${peerId} editor.connection.sequence=${editorConnectionSequence}`, getErrorMeta(error));
|
|
1835
|
+
}
|
|
1836
|
+
};
|
|
1837
|
+
try {
|
|
1838
|
+
if (wasActiveEditor) {
|
|
1839
|
+
repairEditorBinding();
|
|
1840
|
+
authenticatedEditorSockets.delete(socket);
|
|
1841
|
+
const replacement = newestAuthenticatedEditor();
|
|
1842
|
+
if (replacement?.peerId === peerId) {
|
|
1843
|
+
aiService?.handleUserConnected(replacement.peer, peerId, replacement.liveness);
|
|
1844
|
+
activeEditorSocket = replacement.peer;
|
|
1845
|
+
getLogger().debug("[socket-manager] Rebound surviving editor connection", {
|
|
1846
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
1847
|
+
"editor.active_connection.sequence": replacement.sequence,
|
|
1848
|
+
"peer.id": peerId,
|
|
1849
|
+
});
|
|
1850
|
+
}
|
|
1851
|
+
else if (hasOtherEditorSocket ||
|
|
1852
|
+
connectionLiveness?.reconnectRequested) {
|
|
1853
|
+
// Wait for a pending same-peer authorization or a locally
|
|
1854
|
+
// requested reconnect that has not opened yet. Neither is a
|
|
1855
|
+
// binding candidate, but clearing context here would destroy
|
|
1856
|
+
// the conversation it is about to resume. Drop only the
|
|
1857
|
+
// transport and reserve ownership until bind or timeout.
|
|
1858
|
+
// A bare network drop without either signal deliberately
|
|
1859
|
+
// retains the ordinary last-socket teardown policy.
|
|
1860
|
+
activeEditorSocket = undefined;
|
|
1861
|
+
detachedEditorPeerId = peerId;
|
|
1862
|
+
aiService?.detachPeerTransport(peerId);
|
|
1863
|
+
getLogger().debug("[socket-manager] Waiting for editor reconnect authorization", {
|
|
1864
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
1865
|
+
"peer.id": peerId,
|
|
1866
|
+
});
|
|
1867
|
+
clearTimeout(detachedEditorTimer);
|
|
1868
|
+
detachedEditorTimer = setTimeout(() => {
|
|
1869
|
+
getLogger().warn("[socket-manager] Editor reconnect authorization timed out", {
|
|
1870
|
+
"editor.connection.sequence": editorConnectionSequence,
|
|
1871
|
+
"peer.id": peerId,
|
|
1872
|
+
});
|
|
1873
|
+
releaseEditorBinding(undefined);
|
|
1874
|
+
}, EDITOR_RECONNECT_AUTH_TIMEOUT_MS);
|
|
1875
|
+
detachedEditorTimer.unref();
|
|
1876
|
+
}
|
|
1877
|
+
else {
|
|
1878
|
+
releaseEditorBinding(connectionLiveness);
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
else if (detachedEditorPeerId === peerId &&
|
|
1882
|
+
!hasOtherEditorSocket) {
|
|
1883
|
+
// The reconnect the pod was waiting for gave up before it proved
|
|
1884
|
+
// its authorization. This socket was never bound, so there is no
|
|
1885
|
+
// connection generation for the AI service to check the teardown
|
|
1886
|
+
// against.
|
|
1887
|
+
detachedEditorPeerId = undefined;
|
|
1888
|
+
releaseEditorBinding(undefined);
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
catch (error) {
|
|
1892
|
+
authenticatedEditorSockets.delete(socket);
|
|
1893
|
+
resetFailedEditorTransition();
|
|
1894
|
+
getLogger().error(`[socket-manager] Editor disconnect transition failed peer.id=${peerId} editor.connection.sequence=${editorConnectionSequence}`, getErrorMeta(error));
|
|
1895
|
+
}
|
|
1635
1896
|
if (!hasOtherEditorSocket) {
|
|
1636
1897
|
// Keyed by peer, so whichever of the peer's sockets is last out
|
|
1637
1898
|
// takes the presence down — including one that never authenticated
|