@superblocksteam/vite-plugin-file-sync 2.0.123 → 2.0.124-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/prompts/build-base-system-prompt.d.ts +16 -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 +27 -1
- 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 +3 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-comparator.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-comparator.js +1 -4
- package/dist/ai-service/agent/tools/apis/api-comparator.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-testing-state.js +7 -0
- package/dist/ai-service/agent/tools/apis/api-testing-state.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/write-api.d.ts +2 -2
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +11 -33
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-copy-directory.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-finalize.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-finalize.js +11 -2
- package/dist/ai-service/agent/tools/build-finalize.js.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.d.ts +41 -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 +208 -0
- package/dist/ai-service/agent/tools/build-install-packages.js.map +1 -1
- package/dist/ai-service/agent/tools/build-lookup-npm-package.d.ts +28 -0
- package/dist/ai-service/agent/tools/build-lookup-npm-package.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-lookup-npm-package.js +78 -0
- package/dist/ai-service/agent/tools/build-lookup-npm-package.js.map +1 -0
- package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +4 -4
- package/dist/ai-service/agent/tools/build-navigate-preview.d.ts +16 -0
- package/dist/ai-service/agent/tools/build-navigate-preview.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-navigate-preview.js +68 -0
- package/dist/ai-service/agent/tools/build-navigate-preview.js.map +1 -0
- package/dist/ai-service/agent/tools/build-write-file.d.ts +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database.d.ts +9 -9
- package/dist/ai-service/agent/tools/index.d.ts +2 -0
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +2 -0
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +3 -3
- package/dist/ai-service/agent/tools/report-security-findings.d.ts +11 -5
- package/dist/ai-service/agent/tools/report-security-findings.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/report-security-findings.js +1 -0
- package/dist/ai-service/agent/tools/report-security-findings.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +3 -1
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/git.d.ts +2 -2
- package/dist/ai-service/agent/tools2/tools/grep.d.ts +2 -2
- package/dist/ai-service/agent/tools2/tools/update-test-case-status.d.ts +2 -2
- package/dist/ai-service/app-interface/npm-error-parser.d.ts +161 -0
- package/dist/ai-service/app-interface/npm-error-parser.d.ts.map +1 -0
- package/dist/ai-service/app-interface/npm-error-parser.js +510 -0
- package/dist/ai-service/app-interface/npm-error-parser.js.map +1 -0
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts +286 -0
- package/dist/ai-service/app-interface/npm-package-lookup.d.ts.map +1 -0
- package/dist/ai-service/app-interface/npm-package-lookup.js +793 -0
- package/dist/ai-service/app-interface/npm-package-lookup.js.map +1 -0
- package/dist/ai-service/app-interface/npm-registry.d.ts +735 -47
- package/dist/ai-service/app-interface/npm-registry.d.ts.map +1 -1
- package/dist/ai-service/app-interface/npm-registry.js +1882 -153
- package/dist/ai-service/app-interface/npm-registry.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +118 -1
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +579 -157
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/app-skills/manager.d.ts +1 -1
- package/dist/ai-service/app-skills/manager.d.ts.map +1 -1
- package/dist/ai-service/app-skills/manager.js +39 -7
- package/dist/ai-service/app-skills/manager.js.map +1 -1
- package/dist/ai-service/checklist/api-migration-checklist-gate.d.ts +9 -0
- package/dist/ai-service/checklist/api-migration-checklist-gate.d.ts.map +1 -0
- package/dist/ai-service/checklist/api-migration-checklist-gate.js +30 -0
- package/dist/ai-service/checklist/api-migration-checklist-gate.js.map +1 -0
- package/dist/ai-service/checklist/api-migration-origins.d.ts +4 -0
- package/dist/ai-service/checklist/api-migration-origins.d.ts.map +1 -0
- package/dist/ai-service/checklist/api-migration-origins.js +8 -0
- package/dist/ai-service/checklist/api-migration-origins.js.map +1 -0
- package/dist/ai-service/checklist/persisted-checklist-store.d.ts +2 -3
- package/dist/ai-service/checklist/persisted-checklist-store.d.ts.map +1 -1
- package/dist/ai-service/checklist/persisted-checklist-store.js +6 -7
- package/dist/ai-service/checklist/persisted-checklist-store.js.map +1 -1
- package/dist/ai-service/context-archive-paths.d.ts +4 -0
- package/dist/ai-service/context-archive-paths.d.ts.map +1 -0
- package/dist/ai-service/context-archive-paths.js +28 -0
- package/dist/ai-service/context-archive-paths.js.map +1 -0
- package/dist/ai-service/context-download.d.ts +3 -1
- package/dist/ai-service/context-download.d.ts.map +1 -1
- package/dist/ai-service/context-download.js +48 -9
- package/dist/ai-service/context-download.js.map +1 -1
- package/dist/ai-service/context-upload.d.ts +3 -2
- package/dist/ai-service/context-upload.d.ts.map +1 -1
- package/dist/ai-service/context-upload.js +44 -26
- package/dist/ai-service/context-upload.js.map +1 -1
- package/dist/ai-service/dev-database-client.d.ts +3 -11
- package/dist/ai-service/dev-database-client.d.ts.map +1 -1
- package/dist/ai-service/dev-database-client.js.map +1 -1
- package/dist/ai-service/features.d.ts +4 -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/filter-disabled-tools-for-migration.d.ts.map +1 -1
- package/dist/ai-service/filter-disabled-tools-for-migration.js +4 -0
- package/dist/ai-service/filter-disabled-tools-for-migration.js.map +1 -1
- package/dist/ai-service/index.d.ts +94 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +564 -17
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +38 -3
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +73 -22
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts +3 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.js +11 -11
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts +44 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.js +170 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts +56 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.js +9 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/index.d.ts +5 -0
- package/dist/ai-service/llm/context-v2/compaction/index.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/index.js +3 -0
- package/dist/ai-service/llm/context-v2/compaction/index.js.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts +30 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.js +130 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context-management.d.ts +203 -0
- package/dist/ai-service/llm/context-v2/context-management.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/context-management.js +183 -0
- package/dist/ai-service/llm/context-v2/context-management.js.map +1 -0
- package/dist/ai-service/llm/context-v2/context.d.ts +64 -22
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +233 -157
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts +24 -7
- package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/conversation-context.js +1 -1
- package/dist/ai-service/llm/context-v2/index.d.ts +0 -4
- package/dist/ai-service/llm/context-v2/index.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/index.js +0 -4
- package/dist/ai-service/llm/context-v2/index.js.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts +24 -3
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.js +146 -4
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.d.ts +2 -7
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.js +5 -73
- package/dist/ai-service/llm/context-v2/migrations/v1-to-v2.js.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/event-store.d.ts +57 -0
- package/dist/ai-service/llm/context-v2/storage/event-store.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/event-store.js +10 -0
- package/dist/ai-service/llm/context-v2/storage/event-store.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.d.ts +50 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.js +10 -0
- package/dist/ai-service/llm/context-v2/storage/event-types.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts +87 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js +184 -0
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/migration.d.ts +49 -0
- package/dist/ai-service/llm/context-v2/storage/migration.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/migration.js +126 -0
- package/dist/ai-service/llm/context-v2/storage/migration.js.map +1 -0
- package/dist/ai-service/llm/context-v2/types.d.ts +16 -11
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js +2 -2
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/impl/clark.d.ts +8 -0
- package/dist/ai-service/llm/impl/clark.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/clark.js +8 -0
- package/dist/ai-service/llm/impl/clark.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js +17 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -1
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +1 -3
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.d.ts +23 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/observers/context.js +62 -0
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
- package/dist/ai-service/llm/tool-context-integrity.d.ts +25 -0
- package/dist/ai-service/llm/tool-context-integrity.d.ts.map +1 -0
- package/dist/ai-service/llm/tool-context-integrity.js +141 -0
- package/dist/ai-service/llm/tool-context-integrity.js.map +1 -0
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.d.ts +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.d.ts.map +1 -1
- package/dist/ai-service/skills/system/superblocks-migration/skill.generated.js +6 -1
- package/dist/ai-service/skills/system/superblocks-migration/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 +3 -2
- package/dist/ai-service/skills/system/third-party-migration/skill.generated.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +23 -2
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +37 -2
- 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 +29 -2
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js +9 -0
- package/dist/ai-service/state-machine/handlers/awaiting-user.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 +25 -2
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.d.ts +6 -0
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.d.ts.map +1 -0
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.js +36 -0
- package/dist/ai-service/state-machine/helpers/fetch-with-reconnect-retry.js.map +1 -0
- package/dist/ai-service/state-machine/helpers/stable-peer.d.ts +30 -1
- package/dist/ai-service/state-machine/helpers/stable-peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/stable-peer.js +85 -2
- package/dist/ai-service/state-machine/helpers/stable-peer.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/user-preferences.d.ts +8 -0
- package/dist/ai-service/state-machine/helpers/user-preferences.d.ts.map +1 -0
- package/dist/ai-service/state-machine/helpers/user-preferences.js +11 -0
- package/dist/ai-service/state-machine/helpers/user-preferences.js.map +1 -0
- package/dist/ai-service/template-renderer.d.ts +18 -1
- package/dist/ai-service/template-renderer.d.ts.map +1 -1
- package/dist/ai-service/template-renderer.js +73 -12
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/types.d.ts +157 -0
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js +137 -0
- package/dist/ai-service/types.js.map +1 -1
- package/dist/ai-service/util/llm-config-utils.d.ts +21 -22
- package/dist/ai-service/util/llm-config-utils.d.ts.map +1 -1
- package/dist/ai-service/util/llm-config-utils.js +40 -67
- package/dist/ai-service/util/llm-config-utils.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +5 -0
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-helpers.d.ts +17 -0
- package/dist/file-system-helpers.d.ts.map +1 -1
- package/dist/file-system-helpers.js +22 -0
- package/dist/file-system-helpers.js.map +1 -1
- package/dist/git-service/index.d.ts.map +1 -1
- package/dist/git-service/index.js +15 -1
- package/dist/git-service/index.js.map +1 -1
- package/dist/migration/migration-routes.d.ts.map +1 -1
- package/dist/migration/migration-routes.js +26 -3
- package/dist/migration/migration-routes.js.map +1 -1
- package/dist/migration/translation-prompt.d.ts.map +1 -1
- package/dist/migration/translation-prompt.js +5 -0
- package/dist/migration/translation-prompt.js.map +1 -1
- package/dist/migration-templates/app-fullstack/package.json +2 -2
- package/dist/policy-gate-callback-mapper.d.ts +24 -0
- package/dist/policy-gate-callback-mapper.d.ts.map +1 -0
- package/dist/policy-gate-callback-mapper.js +61 -0
- package/dist/policy-gate-callback-mapper.js.map +1 -0
- package/dist/policy-gate-runner.d.ts +32 -0
- package/dist/policy-gate-runner.d.ts.map +1 -0
- package/dist/policy-gate-runner.js +191 -0
- package/dist/policy-gate-runner.js.map +1 -0
- package/dist/router-parser.d.ts.map +1 -1
- package/dist/router-parser.js +107 -11
- package/dist/router-parser.js.map +1 -1
- package/dist/sync-service/list-dir.d.ts.map +1 -1
- package/dist/sync-service/list-dir.js +13 -3
- package/dist/sync-service/list-dir.js.map +1 -1
- package/package.json +28 -10
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getLogger } from "../../../util/logger.js";
|
|
2
|
+
import { RpcTimeoutError } from "../../util/rpc-timeout.js";
|
|
3
|
+
import { isTransportCloseError } from "./stable-peer.js";
|
|
4
|
+
export async function fetchWithReconnectRetry(peer, fetcher, options) {
|
|
5
|
+
const generation = peer?.connectionGeneration;
|
|
6
|
+
try {
|
|
7
|
+
return await fetcher();
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
const shouldRetry = err instanceof RpcTimeoutError || isTransportCloseError(err);
|
|
11
|
+
if (!shouldRetry || !peer)
|
|
12
|
+
throw err;
|
|
13
|
+
// If a newer generation already arrived while the original request was
|
|
14
|
+
// in-flight, invalidation becomes a no-op and the retry uses that fresh
|
|
15
|
+
// peer immediately instead of closing it.
|
|
16
|
+
const timedOutGeneration = generation ?? peer.connectionGeneration;
|
|
17
|
+
const operationName = err instanceof RpcTimeoutError ? err.operationName : "browser RPC";
|
|
18
|
+
const errorDescription = err instanceof RpcTimeoutError
|
|
19
|
+
? `${err.operationName} timed out after ${err.timeoutMs}ms`
|
|
20
|
+
: "browser RPC dropped by transport close";
|
|
21
|
+
getLogger().warn(`[fetch-with-reconnect-retry] ${errorDescription}; waiting up to ${options.reconnectBudgetMs}ms for peer reconnect before retrying`);
|
|
22
|
+
peer.invalidateConnection(timedOutGeneration);
|
|
23
|
+
const reconnected = await peer.whenConnectedAfter(timedOutGeneration, options.reconnectBudgetMs);
|
|
24
|
+
if (!reconnected) {
|
|
25
|
+
getLogger().warn(`[fetch-with-reconnect-retry] peer did not reconnect within ${options.reconnectBudgetMs}ms; rethrowing original error for ${operationName}`);
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
getLogger().info(`[fetch-with-reconnect-retry] peer reconnected; retrying ${operationName}`);
|
|
29
|
+
// If the original call had been queued while disconnected (rather than
|
|
30
|
+
// failing in-flight), that queued call also flushes on reconnect, so the
|
|
31
|
+
// browser may receive this operation twice. Callers must keep the fetcher
|
|
32
|
+
// idempotent; `fetchIntegrations` upserts, so a duplicate is harmless.
|
|
33
|
+
return await fetcher();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=fetch-with-reconnect-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-with-reconnect-retry.js","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/fetch-with-reconnect-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAOzD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAmC,EACnC,OAAyB,EACzB,OAAuC;IAEvC,MAAM,UAAU,GAAG,IAAI,EAAE,oBAAoB,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,WAAW,GACf,GAAG,YAAY,eAAe,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI;YAAE,MAAM,GAAG,CAAC;QACrC,uEAAuE;QACvE,wEAAwE;QACxE,0CAA0C;QAC1C,MAAM,kBAAkB,GAAG,UAAU,IAAI,IAAI,CAAC,oBAAoB,CAAC;QACnE,MAAM,aAAa,GACjB,GAAG,YAAY,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;QACrE,MAAM,gBAAgB,GACpB,GAAG,YAAY,eAAe;YAC5B,CAAC,CAAC,GAAG,GAAG,CAAC,aAAa,oBAAoB,GAAG,CAAC,SAAS,IAAI;YAC3D,CAAC,CAAC,wCAAwC,CAAC;QAE/C,SAAS,EAAE,CAAC,IAAI,CACd,gCAAgC,gBAAgB,mBAAmB,OAAO,CAAC,iBAAiB,uCAAuC,CACpI,CAAC;QAEF,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC/C,kBAAkB,EAClB,OAAO,CAAC,iBAAiB,CAC1B,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAS,EAAE,CAAC,IAAI,CACd,8DAA8D,OAAO,CAAC,iBAAiB,qCAAqC,aAAa,EAAE,CAC5I,CAAC;YACF,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,SAAS,EAAE,CAAC,IAAI,CACd,2DAA2D,aAAa,EAAE,CAC3E,CAAC;QACF,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,OAAO,MAAM,OAAO,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { EditorClient } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Detects the transport-close rejection shape used by `ISocket` when a
|
|
4
|
+
* pending request is rejected because the WebSocket closed mid-flight. Both
|
|
5
|
+
* the plain-object rejection (`{code: 8}`) and the `SocketErrorException`
|
|
6
|
+
* (`code: 10`) paths surface the same message substring.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isTransportCloseError(err: unknown): boolean;
|
|
2
9
|
export interface StablePeerOptions {
|
|
3
10
|
maxQueueSize?: number;
|
|
4
11
|
}
|
|
@@ -8,6 +15,12 @@ export type StablePeerBinding = {
|
|
|
8
15
|
} | {
|
|
9
16
|
peer: undefined;
|
|
10
17
|
};
|
|
18
|
+
export interface ReconnectablePeer {
|
|
19
|
+
readonly connectionGeneration: number;
|
|
20
|
+
invalidateConnection(generation: number): void;
|
|
21
|
+
whenConnected(timeoutMs: number): Promise<boolean>;
|
|
22
|
+
whenConnectedAfter(generation: number, timeoutMs: number): Promise<boolean>;
|
|
23
|
+
}
|
|
11
24
|
/**
|
|
12
25
|
* Identity-stable wrapper around the editor `EditorClient`.
|
|
13
26
|
*
|
|
@@ -20,20 +33,36 @@ export type StablePeerBinding = {
|
|
|
20
33
|
* Calls made while disconnected are queued and replayed in order when the
|
|
21
34
|
* next peer is bound, up to `maxQueueSize`. The queue lives in process
|
|
22
35
|
* memory; durability across server restarts is a separate concern.
|
|
36
|
+
*
|
|
37
|
+
* In-flight calls that the transport drops are still rejected to the caller;
|
|
38
|
+
* retry decisions live with the operation that owns the timeout/retry budget.
|
|
23
39
|
*/
|
|
24
|
-
export declare class StablePeer implements EditorClient {
|
|
40
|
+
export declare class StablePeer implements EditorClient, ReconnectablePeer {
|
|
25
41
|
private inner;
|
|
26
42
|
private _peerId;
|
|
27
43
|
private queue;
|
|
28
44
|
private readonly maxQueueSize;
|
|
45
|
+
private connectWaiters;
|
|
46
|
+
private _connectionGeneration;
|
|
29
47
|
readonly call: EditorClient["call"];
|
|
30
48
|
constructor(options?: StablePeerOptions);
|
|
31
49
|
get peerId(): string | undefined;
|
|
50
|
+
get connectionGeneration(): number;
|
|
32
51
|
/**
|
|
33
52
|
* Bind or clear the backing peer and its identity token atomically.
|
|
34
53
|
* Binding flushes any queued calls in order to the new peer.
|
|
35
54
|
*/
|
|
36
55
|
setInner(binding: StablePeerBinding): void;
|
|
56
|
+
/**
|
|
57
|
+
* Invalidate only the currently-bound generation. Closing the matching stale
|
|
58
|
+
* transport can reject other in-flight RPCs on that generation; callers opt
|
|
59
|
+
* into this when they own the retry budget for a failed operation.
|
|
60
|
+
*/
|
|
61
|
+
invalidateConnection(generation: number): void;
|
|
62
|
+
whenConnected(timeoutMs: number): Promise<boolean>;
|
|
63
|
+
whenConnectedAfter(generation: number, timeoutMs: number): Promise<boolean>;
|
|
64
|
+
private resolveConnectWaiter;
|
|
65
|
+
private notifyConnectWaiters;
|
|
37
66
|
close(): void;
|
|
38
67
|
/** Not used in practice; throws if exercised so new callers are caught in review. */
|
|
39
68
|
requestWithTracing<_Params, _Result>(): Promise<never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stable-peer.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/stable-peer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"stable-peer.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/stable-peer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAO3D;AASD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E;AAQD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,YAAW,YAAY,EAAE,iBAAiB;IAChE,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,qBAAqB,CAAK;IAElC,SAAgB,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;gBAE/B,OAAO,GAAE,iBAAsB;IAK3C,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAa1C;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ9C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B3E,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,oBAAoB;IAO5B,KAAK,IAAI,IAAI;IAiBb,qFAAqF;IAC/E,kBAAkB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC;IAM5D;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,KAAK;CAoBd"}
|
|
@@ -6,7 +6,7 @@ const DEFAULT_MAX_QUEUE_SIZE = 10_000;
|
|
|
6
6
|
* the plain-object rejection (`{code: 8}`) and the `SocketErrorException`
|
|
7
7
|
* (`code: 10`) paths surface the same message substring.
|
|
8
8
|
*/
|
|
9
|
-
function isTransportCloseError(err) {
|
|
9
|
+
export function isTransportCloseError(err) {
|
|
10
10
|
if (!err || typeof err !== "object" || !("message" in err))
|
|
11
11
|
return false;
|
|
12
12
|
const message = err.message;
|
|
@@ -25,12 +25,17 @@ function isTransportCloseError(err) {
|
|
|
25
25
|
* Calls made while disconnected are queued and replayed in order when the
|
|
26
26
|
* next peer is bound, up to `maxQueueSize`. The queue lives in process
|
|
27
27
|
* memory; durability across server restarts is a separate concern.
|
|
28
|
+
*
|
|
29
|
+
* In-flight calls that the transport drops are still rejected to the caller;
|
|
30
|
+
* retry decisions live with the operation that owns the timeout/retry budget.
|
|
28
31
|
*/
|
|
29
32
|
export class StablePeer {
|
|
30
33
|
inner;
|
|
31
34
|
_peerId;
|
|
32
35
|
queue = [];
|
|
33
36
|
maxQueueSize;
|
|
37
|
+
connectWaiters = new Set();
|
|
38
|
+
_connectionGeneration = 0;
|
|
34
39
|
call;
|
|
35
40
|
constructor(options = {}) {
|
|
36
41
|
this.maxQueueSize = options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;
|
|
@@ -39,6 +44,9 @@ export class StablePeer {
|
|
|
39
44
|
get peerId() {
|
|
40
45
|
return this._peerId;
|
|
41
46
|
}
|
|
47
|
+
get connectionGeneration() {
|
|
48
|
+
return this._connectionGeneration;
|
|
49
|
+
}
|
|
42
50
|
/**
|
|
43
51
|
* Bind or clear the backing peer and its identity token atomically.
|
|
44
52
|
* Binding flushes any queued calls in order to the new peer.
|
|
@@ -47,15 +55,89 @@ export class StablePeer {
|
|
|
47
55
|
if (binding.peer) {
|
|
48
56
|
this.inner = binding.peer;
|
|
49
57
|
this._peerId = binding.peerId;
|
|
58
|
+
this._connectionGeneration += 1;
|
|
50
59
|
this.flush(binding.peer);
|
|
60
|
+
this.notifyConnectWaiters();
|
|
51
61
|
}
|
|
52
62
|
else {
|
|
53
63
|
this.inner = undefined;
|
|
54
64
|
this._peerId = undefined;
|
|
55
65
|
}
|
|
56
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Invalidate only the currently-bound generation. Closing the matching stale
|
|
69
|
+
* transport can reject other in-flight RPCs on that generation; callers opt
|
|
70
|
+
* into this when they own the retry budget for a failed operation.
|
|
71
|
+
*/
|
|
72
|
+
invalidateConnection(generation) {
|
|
73
|
+
if (!this.inner || this._connectionGeneration !== generation)
|
|
74
|
+
return;
|
|
75
|
+
const staleInner = this.inner;
|
|
76
|
+
this.inner = undefined;
|
|
77
|
+
this._peerId = undefined;
|
|
78
|
+
staleInner.close();
|
|
79
|
+
}
|
|
80
|
+
whenConnected(timeoutMs) {
|
|
81
|
+
if (this.inner)
|
|
82
|
+
return Promise.resolve(true);
|
|
83
|
+
return this.whenConnectedAfter(this._connectionGeneration, timeoutMs);
|
|
84
|
+
}
|
|
85
|
+
whenConnectedAfter(generation, timeoutMs) {
|
|
86
|
+
if (this.inner && this._connectionGeneration > generation) {
|
|
87
|
+
return Promise.resolve(true);
|
|
88
|
+
}
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
let settled = false;
|
|
91
|
+
const waiter = {
|
|
92
|
+
afterGeneration: generation,
|
|
93
|
+
resolve: (connected) => {
|
|
94
|
+
if (settled)
|
|
95
|
+
return;
|
|
96
|
+
settled = true;
|
|
97
|
+
clearTimeout(waiter.timer);
|
|
98
|
+
resolve(connected);
|
|
99
|
+
},
|
|
100
|
+
timer: setTimeout(() => {
|
|
101
|
+
if (settled)
|
|
102
|
+
return;
|
|
103
|
+
settled = true;
|
|
104
|
+
this.connectWaiters.delete(waiter);
|
|
105
|
+
resolve(false);
|
|
106
|
+
}, timeoutMs),
|
|
107
|
+
};
|
|
108
|
+
this.connectWaiters.add(waiter);
|
|
109
|
+
this.resolveConnectWaiter(waiter);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
resolveConnectWaiter(waiter) {
|
|
113
|
+
if (this.inner && this._connectionGeneration > waiter.afterGeneration) {
|
|
114
|
+
this.connectWaiters.delete(waiter);
|
|
115
|
+
waiter.resolve(true);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
notifyConnectWaiters() {
|
|
119
|
+
if (this.connectWaiters.size === 0)
|
|
120
|
+
return;
|
|
121
|
+
for (const waiter of Array.from(this.connectWaiters)) {
|
|
122
|
+
this.resolveConnectWaiter(waiter);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
57
125
|
close() {
|
|
58
126
|
this.inner?.close();
|
|
127
|
+
for (const waiter of Array.from(this.connectWaiters)) {
|
|
128
|
+
this.connectWaiters.delete(waiter);
|
|
129
|
+
waiter.resolve(false);
|
|
130
|
+
}
|
|
131
|
+
// Calls enqueued while disconnected are otherwise only settled by `flush`
|
|
132
|
+
// on the next `setInner`; if we close before reconnecting, reject them so
|
|
133
|
+
// awaiting callers fail fast instead of hanging on a promise forever.
|
|
134
|
+
if (this.queue.length === 0)
|
|
135
|
+
return;
|
|
136
|
+
const pending = this.queue;
|
|
137
|
+
this.queue = [];
|
|
138
|
+
for (const item of pending) {
|
|
139
|
+
item.reject(new Error(`peer_closed: ${item.path.join(".")}`));
|
|
140
|
+
}
|
|
59
141
|
}
|
|
60
142
|
/** Not used in practice; throws if exercised so new callers are caught in review. */
|
|
61
143
|
async requestWithTracing() {
|
|
@@ -97,7 +179,8 @@ export class StablePeer {
|
|
|
97
179
|
return this.invokeOnInner(inner, path, args).catch((err) => {
|
|
98
180
|
// Observability: in-flight calls on a live inner can still be rejected
|
|
99
181
|
// if the transport closes between send and ack. StablePeer does not
|
|
100
|
-
// retry these
|
|
182
|
+
// retry these directly; operation-level helpers decide whether a retry
|
|
183
|
+
// is safe for their own idempotency and timeout budgets.
|
|
101
184
|
if (isTransportCloseError(err)) {
|
|
102
185
|
getLogger().warn(`[stable-peer] in-flight call to ${path.join(".")} dropped by transport close (not retried)`);
|
|
103
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stable-peer.js","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/stable-peer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC;;;;;GAKG;AACH,
|
|
1
|
+
{"version":3,"file":"stable-peer.js","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/stable-peer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ClarkUserPreferences } from "@superblocksteam/library-shared/types";
|
|
2
|
+
/**
|
|
3
|
+
* Merge partial {@link ClarkUserPreferences} from a user prompt with
|
|
4
|
+
* product defaults so callers can treat every field as required without
|
|
5
|
+
* scattering `?? defaultX` checks throughout the FSM.
|
|
6
|
+
*/
|
|
7
|
+
export declare const resolveUserPreferences: (prefs: Partial<ClarkUserPreferences> | undefined) => ClarkUserPreferences;
|
|
8
|
+
//# sourceMappingURL=user-preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/user-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uCAAuC,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,OAAO,OAAO,CAAC,oBAAoB,CAAC,GAAG,SAAS,KAC/C,oBAGD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CLARK_USER_PREFERENCES_DEFAULTS, } from "@superblocksteam/library-shared/types";
|
|
2
|
+
/**
|
|
3
|
+
* Merge partial {@link ClarkUserPreferences} from a user prompt with
|
|
4
|
+
* product defaults so callers can treat every field as required without
|
|
5
|
+
* scattering `?? defaultX` checks throughout the FSM.
|
|
6
|
+
*/
|
|
7
|
+
export const resolveUserPreferences = (prefs) => ({
|
|
8
|
+
...CLARK_USER_PREFERENCES_DEFAULTS,
|
|
9
|
+
...(prefs ?? {}),
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=user-preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-preferences.js","sourceRoot":"","sources":["../../../../src/ai-service/state-machine/helpers/user-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAEhC,MAAM,uCAAuC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAgD,EAC1B,EAAE,CAAC,CAAC;IAC1B,GAAG,+BAA+B;IAClC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;CACjB,CAAC,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { templates } from "@superblocksteam/ai-service-templates/templates";
|
|
2
|
+
import { type NpmRegistryClient, type NpmRegistryFetchResult } from "./app-interface/npm-registry.js";
|
|
2
3
|
type TemplateName = keyof typeof templates;
|
|
3
4
|
export declare class TemplateRenderer {
|
|
4
5
|
workDir: string;
|
|
5
6
|
nodeModuleDirs: Record<TemplateName, Promise<string | null>>;
|
|
6
7
|
private readonly detectionCwd;
|
|
7
|
-
|
|
8
|
+
private readonly npmRegistryClient;
|
|
9
|
+
constructor({ prefetchNodeModules, workDirSeed, detectionCwd, npmRegistryClient, }: {
|
|
8
10
|
prefetchNodeModules?: boolean;
|
|
9
11
|
workDirSeed?: string;
|
|
10
12
|
/**
|
|
@@ -16,6 +18,14 @@ export declare class TemplateRenderer {
|
|
|
16
18
|
* lockfile can pick the wrong agent). See PR #19282 (F3).
|
|
17
19
|
*/
|
|
18
20
|
detectionCwd?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Optional npm registry client. The AiService always constructs one in
|
|
23
|
+
* production (SaaS, local dev, ephemeral pods); the LD flag inside the
|
|
24
|
+
* client decides whether to short-circuit before a server call.
|
|
25
|
+
* `undefined` here is the test-only opt-out — the install runs against
|
|
26
|
+
* npm's default resolution.
|
|
27
|
+
*/
|
|
28
|
+
npmRegistryClient?: NpmRegistryClient;
|
|
19
29
|
});
|
|
20
30
|
getInstallationTasks(): Promise<void>;
|
|
21
31
|
renderTemplate(templateName: TemplateName): Promise<string>;
|
|
@@ -23,6 +33,13 @@ export declare class TemplateRenderer {
|
|
|
23
33
|
}
|
|
24
34
|
export declare function installTemplateModules(dir: string, options?: {
|
|
25
35
|
detectionCwd?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Result of the immediately-preceding `maybeWriteNpmrcForDir` for the
|
|
38
|
+
* template dir. Used solely to attach `registry_host` to the
|
|
39
|
+
* `superblocks.npm.install.*` metric emit (APPS-4189 / P6.2). Passed
|
|
40
|
+
* through unchanged — no side-effects on the install itself.
|
|
41
|
+
*/
|
|
42
|
+
registryFetchResult?: NpmRegistryFetchResult;
|
|
26
43
|
}): Promise<string>;
|
|
27
44
|
export {};
|
|
28
45
|
//# sourceMappingURL=template-renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-renderer.d.ts","sourceRoot":"","sources":["../../src/ai-service/template-renderer.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"template-renderer.d.ts","sourceRoot":"","sources":["../../src/ai-service/template-renderer.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,iDAAiD,CAAC;AAK5E,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AAGzC,KAAK,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC;AAa3C,qBAAa,gBAAgB;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;gBAEtD,EACV,mBAA2B,EAC3B,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,EAAE;QACD,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;;;;;;;WAOG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB;;;;;;WAMG;QACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;KACvC;IA8BK,oBAAoB;IAKpB,cAAc,CAAC,YAAY,EAAE,YAAY;IAkC/C,OAAO,CAAC,kBAAkB;CA8D3B;AAwDD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,sBAAsB,CAAC;CAC9C,GACA,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
|
|
@@ -41,11 +41,21 @@ import { resolveCommand } from "package-manager-detector";
|
|
|
41
41
|
import { detect, getUserAgent } from "package-manager-detector/detect";
|
|
42
42
|
import { reifyTemplate, } from "@superblocksteam/ai-service-templates/reify-template";
|
|
43
43
|
import { templates } from "@superblocksteam/ai-service-templates/templates";
|
|
44
|
+
import { recordNpmInstall } from "@superblocksteam/telemetry";
|
|
44
45
|
import { generatePredictableId } from "../ids.js";
|
|
45
46
|
import { getErrorMeta, getLogger } from "../util/logger.js";
|
|
46
47
|
import { maybeWriteNpmrcForDir, PRESERVE_NPMRC_SCOPES, } from "./app-interface/npm-registry.js";
|
|
47
48
|
import llmobs from "./llmobs/index.js";
|
|
48
49
|
const SHARED_DIR = "__shared__";
|
|
50
|
+
const TEMPLATE_INSTALL_FILES = [
|
|
51
|
+
"package.json",
|
|
52
|
+
"pnpm-workspace.yaml",
|
|
53
|
+
"pnpm-lock.yaml",
|
|
54
|
+
"package-lock.json",
|
|
55
|
+
"yarn.lock",
|
|
56
|
+
"bun.lock",
|
|
57
|
+
"bun.lockb",
|
|
58
|
+
];
|
|
49
59
|
let TemplateRenderer = (() => {
|
|
50
60
|
let _instanceExtraInitializers = [];
|
|
51
61
|
let _renderTemplate_decorators;
|
|
@@ -59,13 +69,15 @@ let TemplateRenderer = (() => {
|
|
|
59
69
|
workDir = __runInitializers(this, _instanceExtraInitializers);
|
|
60
70
|
nodeModuleDirs;
|
|
61
71
|
detectionCwd;
|
|
62
|
-
|
|
72
|
+
npmRegistryClient;
|
|
73
|
+
constructor({ prefetchNodeModules = false, workDirSeed, detectionCwd, npmRegistryClient, }) {
|
|
63
74
|
// Use a stable work dir derived from a caller-provided seed (typically app root).
|
|
64
75
|
// This keeps template cache location deterministic for a given app context.
|
|
65
76
|
const stableSeed = workDirSeed ?? process.cwd();
|
|
66
77
|
const stableId = generatePredictableId(stableSeed);
|
|
67
78
|
this.workDir = path.join(os.tmpdir(), `superblocks-ai-service-${stableId}`);
|
|
68
79
|
this.detectionCwd = detectionCwd;
|
|
80
|
+
this.npmRegistryClient = npmRegistryClient;
|
|
69
81
|
this.nodeModuleDirs = {};
|
|
70
82
|
if (prefetchNodeModules) {
|
|
71
83
|
for (const [templateName, template] of Object.entries(templates)) {
|
|
@@ -131,22 +143,21 @@ let TemplateRenderer = (() => {
|
|
|
131
143
|
// same broken `pnpm install --ignore-scripts` against the same dir
|
|
132
144
|
// immediately would just hide the underlying problem (registry down,
|
|
133
145
|
// disk full, pm not on PATH) behind retry noise.
|
|
134
|
-
const packageJson = template["package.json"];
|
|
135
146
|
const dir = path.join(this.workDir, templateName, SHARED_DIR);
|
|
136
147
|
const installDfd = (async () => {
|
|
137
148
|
await fs.mkdir(dir, { recursive: true });
|
|
138
|
-
await
|
|
149
|
+
await writeTemplateInstallFiles(dir, template);
|
|
139
150
|
// Write the configured private-registry .npmrc into the shared template
|
|
140
|
-
// dir before running the install. No-op when
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
});
|
|
151
|
+
// dir before running the install. No-op when the LD flag is off inside
|
|
152
|
+
// the client (which is the default for SaaS / local dev today) or
|
|
153
|
+
// when the org has no registry rows. The template dir has no lockfile
|
|
154
|
+
// yet on first install, so `prepareForPrivateRegistry`'s strip step
|
|
155
|
+
// would also be a no-op — we use the .npmrc-only helper here to make
|
|
156
|
+
// that intent explicit.
|
|
157
|
+
const registryFetchResult = await maybeWriteNpmrcForDir(dir, { preserveScopeLines: PRESERVE_NPMRC_SCOPES }, this.npmRegistryClient);
|
|
148
158
|
return installTemplateModules(dir, {
|
|
149
159
|
detectionCwd: this.detectionCwd,
|
|
160
|
+
registryFetchResult,
|
|
150
161
|
});
|
|
151
162
|
})();
|
|
152
163
|
this.nodeModuleDirs[templateName] = installDfd;
|
|
@@ -155,6 +166,14 @@ let TemplateRenderer = (() => {
|
|
|
155
166
|
};
|
|
156
167
|
})();
|
|
157
168
|
export { TemplateRenderer };
|
|
169
|
+
async function writeTemplateInstallFiles(dir, template) {
|
|
170
|
+
await Promise.all(TEMPLATE_INSTALL_FILES.flatMap((fileName) => {
|
|
171
|
+
const content = template[fileName];
|
|
172
|
+
return content === undefined
|
|
173
|
+
? []
|
|
174
|
+
: [fs.writeFile(path.join(dir, fileName), content, "utf-8")];
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
158
177
|
// Env-var escape hatch for environments where automatic detection picks the
|
|
159
178
|
// wrong agent (e.g. CI matrix shards with stray ancestor lockfiles, or users
|
|
160
179
|
// who explicitly want to force `npm`). Highest precedence — overrides both
|
|
@@ -180,7 +199,43 @@ const PM_OVERRIDE_ENV = "SUPERBLOCKS_TEMPLATE_PM";
|
|
|
180
199
|
// when neither pnpm nor any other surrounding package manager is in
|
|
181
200
|
// sight, in which case there are no `catalog:` / `workspace:` env vars
|
|
182
201
|
// to leak into the spawned npm process either. See PR #19282 (F1).
|
|
202
|
+
/**
|
|
203
|
+
* Pick the registry URL the template install will target from the most
|
|
204
|
+
* recent `maybeWriteNpmrcForDir` result. Mirrors the helper in
|
|
205
|
+
* `app-interface/shell.ts` so the metric stream reports the prefetch
|
|
206
|
+
* registry with the same semantics as the AppShell install paths.
|
|
207
|
+
*/
|
|
208
|
+
function templateRegistryUrlFromFetchResult(result) {
|
|
209
|
+
if (!result)
|
|
210
|
+
return undefined;
|
|
211
|
+
if (!result.config.configured)
|
|
212
|
+
return undefined;
|
|
213
|
+
return result.config.default?.url;
|
|
214
|
+
}
|
|
183
215
|
export async function installTemplateModules(dir, options) {
|
|
216
|
+
const installStart = Date.now();
|
|
217
|
+
let outcome = "success";
|
|
218
|
+
try {
|
|
219
|
+
return await installTemplateModulesImpl(dir, options);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
// Template prefetch never throws `NpmInstallBlocked` — it spawns the
|
|
223
|
+
// package manager directly with a generic exit-code error. Any failure
|
|
224
|
+
// here is therefore `other` on the metric outcome enum; granularity
|
|
225
|
+
// beyond that lives on the existing rejection message.
|
|
226
|
+
outcome = "other";
|
|
227
|
+
throw err;
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
recordNpmInstall({
|
|
231
|
+
runner: "prefetch",
|
|
232
|
+
registryHost: templateRegistryUrlFromFetchResult(options?.registryFetchResult),
|
|
233
|
+
outcome,
|
|
234
|
+
durationMs: Date.now() - installStart,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
async function installTemplateModulesImpl(dir, options) {
|
|
184
239
|
const detectionCwd = options?.detectionCwd ?? process.cwd();
|
|
185
240
|
const override = process.env[PM_OVERRIDE_ENV]?.trim();
|
|
186
241
|
// Cast: the env var is unvalidated user input. resolveCommand() will
|
|
@@ -218,7 +273,13 @@ export async function installTemplateModules(dir, options) {
|
|
|
218
273
|
}
|
|
219
274
|
const { command, args } = installCommand;
|
|
220
275
|
return new Promise((resolve, reject) => {
|
|
221
|
-
|
|
276
|
+
// No `shell: true`: Node 22 deprecated passing an args array together with
|
|
277
|
+
// `shell: true` because the args are concatenated, not escaped. Spawning
|
|
278
|
+
// the package-manager binary directly with an args array sidesteps both
|
|
279
|
+
// the warning and the underlying shell-injection foot-gun. The CLI's
|
|
280
|
+
// other subprocess call sites (e.g. sync.mts `execFileAsync("git", [...])`)
|
|
281
|
+
// follow the same shell-less pattern.
|
|
282
|
+
const child = spawn(command, args, { cwd: dir });
|
|
222
283
|
let stdout = "";
|
|
223
284
|
let stderr = "";
|
|
224
285
|
child.stdout?.on("data", (chunk) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../../src/ai-service/template-renderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAc,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,EACL,aAAa,GAEd,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../../src/ai-service/template-renderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAc,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,EACL,aAAa,GAEd,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iDAAiD,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,qBAAqB,EAGrB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAIvC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,sBAAsB,GAAG;IAC7B,cAAc;IACd,qBAAqB;IACrB,gBAAgB;IAChB,mBAAmB;IACnB,WAAW;IACX,UAAU;IACV,WAAW;CACH,CAAC;IAEE,gBAAgB;;;iBAAhB,gBAAgB;;;0CAiE1B,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;YAC3E,6LAAM,cAAc,6DA+BnB;;;QAhGD,OAAO,GADI,mDAAgB,CACX;QAChB,cAAc,CAA+C;QAC5C,YAAY,CAAqB;QACjC,iBAAiB,CAAgC;QAElE,YAAY,EACV,mBAAmB,GAAG,KAAK,EAC3B,WAAW,EACX,YAAY,EACZ,iBAAiB,GAqBlB;YACC,kFAAkF;YAClF,4EAA4E;YAC5E,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,0BAA0B,QAAQ,EAAE,CAAC,CAAC;YAC5E,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAE3C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YAEzB,IAAI,mBAAmB,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjE,SAAS,EAAE,CAAC,KAAK,CACf,4CAA4C,EAC5C,YAAY,CACb,CAAC;oBACF,uDAAuD;oBACvD,IAAI,CAAC,kBAAkB,CAAC,YAA4B,EAAE,QAAQ,CAAC,CAAC,KAAK,CACnE,CAAC,KAAK,EAAE,EAAE;wBACR,SAAS,EAAE,CAAC,KAAK,CACf,uCAAuC,YAAY,EAAE,EACrD,YAAY,CAAC,KAAK,CAAC,CACpB,CAAC;oBACJ,CAAC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,CAAC,oBAAoB;YACxB,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,CAAC;QAGD,KAAK,CAAC,cAAc,CAAC,YAA0B;YAC7C,IAAI,CAAC,CAAC,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,YAAY,YAAY,YAAY,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;YAEzC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACvD,YAAY,EACZ,QAAQ,CACT,CAAC;YAEF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,IAAI,CAAC,OAAO,EACZ,YAAY,EACZ,OAAO,UAAU,EAAE,EAAE,CACtB,CAAC;YAEF,SAAS,EAAE,CAAC,KAAK,CACf,mCAAmC,YAAY,OAAO,WAAW,EAAE,CACpE,CAAC;YAEF,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;YACpD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,sDAAsD;gBACtD,MAAM,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE;oBACvE,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,6CAA6C;QACrC,kBAAkB,CACxB,YAA0B,EAC1B,QAAiB;YAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,CAAC,cAAc,IAAI,QAAQ,CAAC,EAAE,CAAC;gBAClC,oCAAoC;gBACpC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC;gBAChD,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,yEAAyE;YACzE,2EAA2E;YAC3E,oEAAoE;YACpE,0EAA0E;YAC1E,yEAAyE;YACzE,kEAAkE;YAClE,4CAA4C;YAC5C,EAAE;YACF,yEAAyE;YACzE,sEAAsE;YACtE,yEAAyE;YACzE,uEAAuE;YACvE,wEAAwE;YACxE,8DAA8D;YAC9D,EAAE;YACF,+DAA+D;YAC/D,qEAAqE;YACrE,sEAAsE;YACtE,sEAAsE;YACtE,mEAAmE;YACnE,qEAAqE;YACrE,iDAAiD;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,MAAM,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC/C,wEAAwE;gBACxE,uEAAuE;gBACvE,kEAAkE;gBAClE,sEAAsE;gBACtE,oEAAoE;gBACpE,qEAAqE;gBACrE,wBAAwB;gBACxB,MAAM,mBAAmB,GAAG,MAAM,qBAAqB,CACrD,GAAG,EACH,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,EAC7C,IAAI,CAAC,iBAAiB,CACvB,CAAC;gBACF,OAAO,sBAAsB,CAAC,GAAG,EAAE;oBACjC,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,mBAAmB;iBACpB,CAAC,CAAC;YACL,CAAC,CAAC,EAAE,CAAC;YACL,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;YAC/C,OAAO,UAAU,CAAC;QACpB,CAAC;;;SAjKU,gBAAgB;AAoK7B,KAAK,UAAU,yBAAyB,CACtC,GAAW,EACX,QAAiB;IAEjB,MAAM,OAAO,CAAC,GAAG,CACf,sBAAsB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,OAAO,KAAK,SAAS;YAC1B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,6EAA6E;AAC7E,2EAA2E;AAC3E,uDAAuD;AACvD,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAElD,mEAAmE;AACnE,uCAAuC;AACvC,EAAE;AACF,8CAA8C;AAC9C,2DAA2D;AAC3D,6EAA6E;AAC7E,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAC9E,2EAA2E;AAC3E,4EAA4E;AAC5E,yDAAyD;AACzD,wEAAwE;AACxE,0EAA0E;AAC1E,0EAA0E;AAC1E,yEAAyE;AACzE,4EAA4E;AAC5E,wEAAwE;AACxE;;;;;GAKG;AACH,SAAS,kCAAkC,CACzC,MAA0C;IAE1C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAW,EACX,OASC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,MAAM,0BAA0B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qEAAqE;QACrE,uEAAuE;QACvE,oEAAoE;QACpE,uDAAuD;QACvD,OAAO,GAAG,OAAO,CAAC;QAClB,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,gBAAgB,CAAC;YACf,MAAM,EAAE,UAAU;YAClB,YAAY,EAAE,kCAAkC,CAC9C,OAAO,EAAE,mBAAmB,CAC7B;YACD,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY;SACtC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,GAAW,EACX,OAAmC;IAEnC,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,qEAAqE;IACrE,sEAAsE;IACtE,iDAAiD;IACjD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACrD,MAAM,UAAU,GACd,YAAY,IAAI,OAAO;QACrB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,CACC,MAAM,MAAM,CAAC;YACX,UAAU,EAAE;gBACV,sBAAsB;gBACtB,UAAU;gBACV,kBAAkB;gBAClB,kBAAkB;aACnB;YACD,GAAG,EAAE,YAAY;SAClB,CAAC,CACH,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAU,KAAK,CAAC;IAC9B,MAAM,KAAK,GAAU,YAAY,IAAI,OAAO,IAAI,UAAU,IAAI,QAAQ,CAAC;IACvE,MAAM,MAAM,GAA+C,YAAY;QACrE,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,OAAO;YACP,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,UAAU;gBACV,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,UAAU,CAAC;IACnB,SAAS,EAAE,CAAC,IAAI,CACd,4DAA4D,KAAK,SAAS,MAAM,EAAE;QAChF,CAAC,MAAM,KAAK,UAAU;YACpB,CAAC,CAAC,qBAAqB,eAAe,2CAA2C,YAAY,WAAW,eAAe,eAAe;YACtI,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;IACF,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,0DAA0D,KAAK,GAAG,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;IAEzC,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,qEAAqE;QACrE,4EAA4E;QAC5E,sCAAsC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CACJ,IAAI,KAAK,CACP,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1G,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,CACJ,IAAI,KAAK,CACP;oBACE,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;oBACvD,UAAU,CAAC,CAAC,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;oBACxD,UAAU,CAAC,CAAC,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;iBACzD;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,MAAM,CAAC,CAChB,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|