@spotpatch/vite 1.15.1 → 1.15.4
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/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime-contextual-ask-panel.js +21 -19
- package/dist/runtime-external-handoff-panel.js +25 -7
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -51,7 +51,7 @@ var import_dev_server = require("@spotpatch/dev-server");
|
|
|
51
51
|
// package.json
|
|
52
52
|
var package_default = {
|
|
53
53
|
name: "@spotpatch/vite",
|
|
54
|
-
version: "1.15.
|
|
54
|
+
version: "1.15.4",
|
|
55
55
|
description: "Vite development plugin for SpotPatch.",
|
|
56
56
|
license: "MIT",
|
|
57
57
|
repository: {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/runtime/runtime-injection-plugin.ts","../package.json","../../runtime/src/ui/brand-mark-content.ts","../src/server/server-plugin.ts","../src/transform/transform-plugin.ts","../src/transform/transform-filter.ts","../src/options.ts"],"sourcesContent":["export { spotPatch } from \"./plugin.js\";\nexport {\n DEFAULT_OPTIONS,\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchDataFlowOptions,\n type SpotPatchOptions,\n type ViteSpotPatchOptions,\n} from \"./options.js\";\nexport {\n DEFAULT_AGENT_LIMITS,\n type AgentApplyMode,\n type AgentCheckDefinition,\n type AgentLimits,\n type AiExecutionOptions,\n type AiModelProfile,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type OpenAICompatibleProviderOptions,\n type SpotPatchEditorPreference,\n} from \"@spotpatch/shared\";\n","import path from \"node:path\";\n\nimport {\n createSession,\n createSourceRegistry,\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveOptions,\n resolveProjectOptions,\n} from \"@spotpatch/dev-server\";\nimport { loadEnv, type ConfigEnv, type Plugin, type UserConfig } from \"vite\";\n\nimport type { ViteSpotPatchOptions } from \"./options.js\";\nimport type { SpotPatchPluginContext } from \"./plugin-context.js\";\nimport { createRuntimeInjectionPlugin } from \"./runtime/runtime-injection-plugin.js\";\nimport { createServerPlugin } from \"./server/server-plugin.js\";\nimport { createTransformPlugin } from \"./transform/transform-plugin.js\";\n\nexport function spotPatch(userOptions: ViteSpotPatchOptions = {}): Plugin[] {\n let options = resolveOptions(userOptions);\n let credentialEnvironment: Readonly<Record<string, string | undefined>> =\n Object.freeze({});\n\n if (!options.enabled) {\n return [];\n }\n\n const registry = createSourceRegistry();\n const session = createSession();\n const context = Object.freeze({\n getCredentialEnvironment: () => credentialEnvironment,\n getOptions: () => options,\n } satisfies SpotPatchPluginContext);\n const configure = async (\n config: UserConfig,\n environment: ConfigEnv,\n ): Promise<void> => {\n const root = path.resolve(process.cwd(), config.root ?? \".\");\n const loadedEnvironment =\n config.envDir === false\n ? process.env\n : loadEnv(environment.mode, path.resolve(root, config.envDir ?? \".\"), \"\");\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(loadedEnvironment).ai\n : false;\n\n options = await resolveProjectOptions({\n appRoot: root,\n environmentAi,\n options: userOptions,\n });\n\n credentialEnvironment = resolveCredentialEnvironment(options, loadedEnvironment);\n };\n\n return [\n createTransformPlugin({ configure, context, registry }),\n createRuntimeInjectionPlugin({ context, session }),\n createServerPlugin({ context, registry, session }),\n ];\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n type ResolvedSpotPatchOptions,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport packageMetadata from \"../../package.json\" with { type: \"json\" };\nimport { version as VITE_VERSION, type Plugin, type ViteDevServer } from \"vite\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nexport const SPOTPATCH_CLIENT_MODULE_ID = \"virtual:spotpatch/client\";\nexport const RESOLVED_SPOTPATCH_CLIENT_MODULE_ID = `\\0${SPOTPATCH_CLIENT_MODULE_ID}`;\nexport const SPOTPATCH_REACT_ADAPTER_MODULE_ID = \"virtual:spotpatch/react-adapter\";\nexport const RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID = `\\0${SPOTPATCH_REACT_ADAPTER_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_MODULE_ID = \"virtual:spotpatch/data-flow-runtime\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = \"virtual:spotpatch/data-flow-panel\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID =\n \"virtual:spotpatch/external-handoff-panel\";\nexport const RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID = `\\0${SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID =\n \"virtual:spotpatch/contextual-ask-panel\";\nexport const RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID = `\\0${SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_MOTION_MODULE_ID = \"virtual:spotpatch/motion\";\nexport const RESOLVED_SPOTPATCH_MOTION_MODULE_ID = `\\0${SPOTPATCH_MOTION_MODULE_ID}`;\n\nconst RUNTIME_BUNDLE_NAMES = [\n \"client\",\n \"contextualAskPanel\",\n \"dataFlowPanel\",\n \"dataFlowPrelude\",\n \"externalHandoffPanel\",\n \"motion\",\n \"reactAdapter\",\n] as const;\n\ntype RuntimeBundleName = (typeof RUNTIME_BUNDLE_NAMES)[number];\n\ninterface RuntimeBundleDefinition {\n readonly enabled: (options: ResolvedSpotPatchOptions) => boolean;\n readonly fileName: string;\n readonly importer?: string;\n readonly publicId: string;\n readonly resolvedId: string;\n}\n\ninterface RuntimeBundleState {\n cached?: string;\n readonly injected?: string;\n path?: string;\n}\n\nconst RUNTIME_BUNDLE_DEFINITIONS: Readonly<\n Record<RuntimeBundleName, RuntimeBundleDefinition>\n> = Object.freeze({\n client: {\n enabled: () => true,\n fileName: \"runtime-client.js\",\n publicId: SPOTPATCH_CLIENT_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n },\n contextualAskPanel: {\n enabled: (options) => options.contextualAsk.enabled,\n fileName: \"runtime-contextual-ask-panel.js\",\n publicId: SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n },\n dataFlowPanel: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-panel.js\",\n publicId: SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n },\n dataFlowPrelude: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-prelude.js\",\n publicId: SPOTPATCH_DATA_FLOW_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID,\n },\n externalHandoffPanel: {\n enabled: (options) => options.externalAgent.enabled,\n fileName: \"runtime-external-handoff-panel.js\",\n publicId: SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n },\n motion: {\n enabled: () => true,\n fileName: \"runtime-motion.js\",\n publicId: SPOTPATCH_MOTION_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_MOTION_MODULE_ID,\n },\n reactAdapter: {\n enabled: () => true,\n fileName: \"runtime-react-adapter.js\",\n importer: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n publicId: \"@spotpatch/react-adapter\",\n resolvedId: RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID,\n },\n});\n\ninterface RuntimeInjectionPluginInput {\n readonly bundlePaths?: Partial<Readonly<Record<RuntimeBundleName, string>>>;\n readonly clientBundle?: string;\n readonly contextualAskPanelBundle?: string;\n readonly context: SpotPatchPluginContext;\n readonly dataFlowPreludeBundle?: string;\n readonly dataFlowPanelBundle?: string;\n readonly externalHandoffPanelBundle?: string;\n readonly motionBundle?: string;\n readonly reactAdapterBundle?: string;\n readonly session: SpotPatchSession;\n}\n\nfunction createBundleState(injected: string | undefined): RuntimeBundleState {\n return injected === undefined ? {} : { injected };\n}\n\nfunction createDataFlowPreludeModule(\n input: RuntimeInjectionPluginInput,\n bundle: string,\n): string {\n return [\n `const __SPOTPATCH_DATA_FLOW_CONFIG__ = ${JSON.stringify(input.context.getOptions().dataFlow)};`,\n bundle,\n ].join(\"\\n\");\n}\n\nfunction resolveRuntimeBundlePath(root: string, fileName: string): string {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const packageEntry = resolveFromProject.resolve(\"@spotpatch/vite\");\n return path.join(path.dirname(packageEntry), fileName);\n}\n\nfunction readConsumerViteVersion(root: string): string {\n try {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const manifestPath = resolveFromProject.resolve(\"vite/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest === \"object\" &&\n manifest !== null &&\n \"version\" in manifest &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Vite itself remains the safe fallback if package metadata is not exported.\n }\n\n return VITE_VERSION;\n}\n\nfunction createClientModule(\n input: RuntimeInjectionPluginInput,\n clientBundle: string,\n viteVersion: string,\n): string {\n const options = input.context.getOptions();\n const runtimeConfig = {\n ai: createRuntimeAiConfig(options.ai),\n budget: options.budget,\n contextualAsk: Object.freeze({ enabled: options.contextualAsk.enabled }),\n dataFlow: createRuntimeDataFlowConfig(options.dataFlow),\n debug: options.debug,\n editor: options.editor,\n externalAgent: options.externalAgent,\n framework: \"vite\" as const,\n frameworkVersion: viteVersion,\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n sessionId: input.session.id,\n sessionToken: input.session.token,\n shortcut: options.shortcut,\n spotPatchVersion: packageMetadata.version,\n };\n\n return [\n `import ${JSON.stringify(SPOTPATCH_MOTION_MODULE_ID)};`,\n ...(options.contextualAsk.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID)};`]\n : []),\n ...(options.dataFlow.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID)};`]\n : []),\n ...(options.externalAgent.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID)};`]\n : []),\n `const __SPOTPATCH_BRAND_MARK_CONTENT__ = ${JSON.stringify(BRAND_MARK_CONTENT)};`,\n `const __SPOTPATCH_RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};`,\n clientBundle,\n ].join(\"\\n\");\n}\n\nexport function createRuntimeInjectionPlugin(\n input: RuntimeInjectionPluginInput,\n): Plugin {\n let root = process.cwd();\n let viteVersion = VITE_VERSION;\n let disposeWatcher: (() => void) | undefined;\n const bundleStates: Record<RuntimeBundleName, RuntimeBundleState> = {\n client: createBundleState(input.clientBundle),\n contextualAskPanel: createBundleState(input.contextualAskPanelBundle),\n dataFlowPanel: createBundleState(input.dataFlowPanelBundle),\n dataFlowPrelude: createBundleState(input.dataFlowPreludeBundle),\n externalHandoffPanel: createBundleState(input.externalHandoffPanelBundle),\n motion: createBundleState(input.motionBundle),\n reactAdapter: createBundleState(input.reactAdapterBundle),\n };\n\n function getBundlePath(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n state.path ??= path.resolve(\n input.bundlePaths?.[name] ??\n resolveRuntimeBundlePath(root, RUNTIME_BUNDLE_DEFINITIONS[name].fileName),\n );\n return state.path;\n }\n\n function loadBundle(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n if (state.injected !== undefined) return state.injected;\n state.cached ??= readFileSync(getBundlePath(name), \"utf8\");\n return state.cached;\n }\n\n function stopWatching(): void {\n disposeWatcher?.();\n }\n\n function watchRuntimeBundles(server: ViteDevServer): void {\n stopWatching();\n const options = input.context.getOptions();\n const bundleNameByPath = new Map<string, RuntimeBundleName>();\n\n for (const name of RUNTIME_BUNDLE_NAMES) {\n if (\n RUNTIME_BUNDLE_DEFINITIONS[name].enabled(options) &&\n bundleStates[name].injected === undefined\n ) {\n bundleNameByPath.set(getBundlePath(name), name);\n }\n }\n\n const bundlePaths = [...bundleNameByPath.keys()];\n if (bundlePaths.length === 0) return;\n\n let reloadHandle: NodeJS.Immediate | undefined;\n const scheduleReload = (): void => {\n reloadHandle ??= setImmediate(() => {\n reloadHandle = undefined;\n server.ws.send({ type: \"full-reload\", path: \"*\" });\n });\n };\n\n const handleChange = (changedPath: string): void => {\n const name = bundleNameByPath.get(path.resolve(changedPath));\n if (name === undefined) return;\n\n delete bundleStates[name].cached;\n const module = server.moduleGraph.getModuleById(\n RUNTIME_BUNDLE_DEFINITIONS[name].resolvedId,\n );\n if (module !== undefined) {\n server.moduleGraph.invalidateModule(module);\n }\n scheduleReload();\n };\n const dispose = (): void => {\n if (reloadHandle !== undefined) {\n clearImmediate(reloadHandle);\n reloadHandle = undefined;\n }\n server.watcher.off(\"change\", handleChange);\n server.httpServer?.off(\"close\", dispose);\n if (disposeWatcher === dispose) disposeWatcher = undefined;\n };\n\n server.watcher.add(bundlePaths);\n server.watcher.on(\"change\", handleChange);\n server.httpServer?.once(\"close\", dispose);\n disposeWatcher = dispose;\n }\n\n return {\n name: \"spotpatch:runtime-injection\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(config) {\n root = path.resolve(config.root);\n viteVersion = readConsumerViteVersion(root);\n },\n\n configureServer(server) {\n watchRuntimeBundles(server);\n },\n\n resolveId(id, importer) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (\n id === definition.publicId &&\n (definition.importer === undefined || importer === definition.importer)\n ) {\n return definition.resolvedId;\n }\n }\n return null;\n },\n\n load(id) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (id !== definition.resolvedId) continue;\n if (!definition.enabled(input.context.getOptions())) return null;\n\n const bundle = loadBundle(name);\n if (name === \"client\") {\n return createClientModule(input, bundle, viteVersion);\n }\n if (name === \"dataFlowPrelude\") {\n return createDataFlowPreludeModule(input, bundle);\n }\n return bundle;\n }\n return null;\n },\n\n transformIndexHtml() {\n const client = {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_CLIENT_MODULE_ID}`,\n },\n injectTo: \"head\" as const,\n };\n if (!input.context.getOptions().dataFlow.enabled) {\n return [client];\n }\n\n return [\n {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_DATA_FLOW_MODULE_ID}`,\n },\n injectTo: \"head-prepend\" as const,\n },\n client,\n ];\n },\n\n closeBundle() {\n stopWatching();\n },\n };\n}\n","{\n \"name\": \"@spotpatch/vite\",\n \"version\": \"1.15.1\",\n \"description\": \"Vite development plugin for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/vite\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"vite\",\n \"react\",\n \"developer-tools\",\n \"ai-agent\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-vite\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"scripts\": {\n \"build\": \"pnpm clean && tsup --config tsup.config.ts\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"dev\": \"tsup --config tsup.config.ts --watch src --watch tsup.config.ts --watch ../runtime/dist/index.js --watch ../react-adapter/dist/index.js --watch ../shared/dist/index.js\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\"\n },\n \"dependencies\": {\n \"@spotpatch/bridge\": \"workspace:^\",\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/react-adapter\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import path from \"node:path\";\nimport {\n createDevelopmentSession,\n type DevelopmentSession,\n type SourceRegistry,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport {\n createManagedCodexAskExecutor,\n createExternalAgentSupervisor,\n} from \"@spotpatch/bridge\";\nimport type { Plugin } from \"vite\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\n\ninterface ServerPluginInput {\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n readonly session: SpotPatchSession;\n}\n\nexport function createServerPlugin(input: ServerPluginInput): Plugin {\n let services: DevelopmentSession | undefined;\n return {\n name: \"spotpatch:server\",\n apply: \"serve\",\n enforce: \"pre\",\n async configureServer(server) {\n const root = path.resolve(server.config.root);\n const options = input.context.getOptions();\n const active = await createDevelopmentSession({\n root,\n options,\n registry: input.registry,\n session: input.session,\n framework: \"vite\",\n environment: input.context.getCredentialEnvironment(),\n logger: server.config.logger,\n createManagedAskExecutor: () =>\n createManagedCodexAskExecutor({ projectRoot: root }),\n createExternalAgentControl: (validation) =>\n createExternalAgentSupervisor({\n bridgeAdapter: \"vite\",\n ...validation,\n root,\n sessionId: input.session.id,\n projectLabel: path.basename(root),\n }),\n });\n services = active;\n server.middlewares.use(active.middleware);\n server.httpServer?.once(\"close\", () => {\n void active.close().catch(() => {\n server.config.logger.warn(\"[spotpatch:vite] Service cleanup failed.\");\n });\n });\n server.config.logger.info(\n `[spotpatch:vite] Ready. Toggle picker with ${options.shortcut}.`,\n );\n },\n async closeBundle() {\n await services?.close();\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { ConfigEnv, Plugin, ResolvedConfig, UserConfig } from \"vite\";\nimport { injectSourceMarkers } from \"@spotpatch/compiler\";\nimport type { SourceRegistry } from \"@spotpatch/dev-server\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { SPOTPATCH_DATA_FLOW_MODULE_ID } from \"../runtime/runtime-injection-plugin.js\";\nimport { createTransformFilter, stripViteQuery } from \"./transform-filter.js\";\n\ninterface TransformPluginInput {\n readonly configure?: (\n config: UserConfig,\n environment: ConfigEnv,\n ) => void | Promise<void>;\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n}\n\ninterface ViteTransformOutput {\n readonly code: string;\n readonly map: string;\n}\n\nfunction createCacheKey(id: string, code: string): string {\n const hash = createHash(\"sha256\").update(code).digest(\"base64url\");\n return `${id}\\0${hash}`;\n}\n\nfunction getDisplayPath(root: string, id: string): string {\n const relative = path.relative(root, stripViteQuery(id));\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function createTransformPlugin(input: TransformPluginInput): Plugin {\n let root = process.cwd();\n let filter = createTransformFilter(root, input.context.getOptions());\n let logger: ResolvedConfig[\"logger\"] | undefined;\n const warnedFiles = new Set<string>();\n const warnedDataFlowDiagnostics = new Set<string>();\n const cache = new Map<string, ViteTransformOutput | null>();\n\n return {\n name: \"spotpatch:transform\",\n apply: \"serve\",\n enforce: \"pre\",\n\n async config(config, environment) {\n await input.configure?.(config, environment);\n },\n\n configResolved(config) {\n root = path.resolve(config.root);\n filter = createTransformFilter(root, input.context.getOptions());\n logger = config.logger;\n },\n\n transform(code, id) {\n if (!filter.shouldTransform(id, code)) {\n return null;\n }\n\n const cleanId = path.resolve(stripViteQuery(id));\n const cacheKey = createCacheKey(cleanId, code);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey) ?? null;\n }\n\n const startedAt = performance.now();\n const options = input.context.getOptions();\n\n try {\n const result = injectSourceMarkers({\n code,\n absolutePath: cleanId,\n root,\n fileId: input.registry.register(cleanId),\n ...(options.dataFlow.enabled\n ? { dataFlow: { helperModule: SPOTPATCH_DATA_FLOW_MODULE_ID } }\n : {}),\n onWarning(warning) {\n logger?.warn(\n `[spotpatch:transform] Existing source marker at ${getDisplayPath(root, id)}:${String(warning.line)}:${String(warning.column)}; preserving application value.`,\n );\n },\n });\n\n if (result?.dataFlow !== undefined) {\n input.registry.registerDataFlowComponents(\n cleanId,\n result.dataFlow.sourceVersion,\n result.dataFlow.anchors.flatMap((anchor) =>\n anchor.kind === \"component\"\n ? [\n {\n componentSourceId: anchor.id,\n line: anchor.line,\n column: anchor.column,\n },\n ]\n : [],\n ),\n );\n for (const diagnostic of result.dataFlow.diagnostics) {\n const warningKey = `${cleanId}:${diagnostic.code}:${String(diagnostic.line)}:${String(diagnostic.column)}`;\n if (warnedDataFlowDiagnostics.has(warningKey)) continue;\n warnedDataFlowDiagnostics.add(warningKey);\n logger?.warn(\n `[spotpatch:data-flow] ${diagnostic.code} at ${getDisplayPath(root, id)}:${String(diagnostic.line)}:${String(diagnostic.column)}; keeping this adapter evidence partial.`,\n );\n }\n }\n\n const output =\n result === undefined\n ? null\n : Object.freeze({\n code: result.code,\n map: result.map.toString(),\n });\n cache.set(cacheKey, output);\n\n if (options.debug) {\n const elapsed = performance.now() - startedAt;\n logger?.info(\n `[spotpatch:transform] ${getDisplayPath(root, id)} ${elapsed.toFixed(2)}ms`,\n );\n }\n\n return output;\n } catch (error: unknown) {\n if (!warnedFiles.has(cleanId)) {\n warnedFiles.add(cleanId);\n const detail =\n options.debug && error instanceof Error ? `: ${error.message}` : \"\";\n logger?.warn(\n `[spotpatch:transform] Failed to transform ${getDisplayPath(root, id)}; using original module${detail}`,\n );\n }\n\n return null;\n }\n },\n };\n}\n","import path from \"node:path\";\n\nimport { createDataFlowSourceFilter, createSourceFilter } from \"@spotpatch/compiler\";\nimport type { ResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\n\nexport function stripViteQuery(id: string): string {\n const queryIndex = id.indexOf(\"?\");\n return queryIndex === -1 ? id : id.slice(0, queryIndex);\n}\n\nexport { isInsideRoot } from \"@spotpatch/compiler\";\n\nexport interface TransformFilter {\n shouldTransform(id: string, code: string): boolean;\n}\n\nexport function createTransformFilter(\n root: string,\n options: ResolvedSpotPatchOptions,\n): TransformFilter {\n const sourceFilter = createSourceFilter(root, options);\n const dataFlowFilter = createDataFlowSourceFilter(root, {\n include: options.include,\n exclude: options.exclude,\n });\n\n return Object.freeze({\n shouldTransform(id: string, code: string): boolean {\n if (\n id.startsWith(\"\\0\") ||\n id.includes(\"virtual:spotpatch\") ||\n id.includes(\"/packages/vite/\") ||\n id.includes(\"\\\\packages\\\\vite\\\\\")\n ) {\n return false;\n }\n\n const cleanId = stripViteQuery(id);\n const absolutePath = path.resolve(cleanId);\n return (\n sourceFilter.shouldTransform(absolutePath, code) ||\n (options.dataFlow.enabled && dataFlowFilter.shouldTransform(absolutePath, code))\n );\n },\n });\n}\n","export {\n createRuntimeAiConfig,\n DEFAULT_EXCLUDE,\n DEFAULT_OPTIONS,\n resolveOptions,\n} from \"@spotpatch/dev-server\";\nexport type {\n FilterEntry,\n ResolvedSpotPatchOptions,\n SimpleAiOptions,\n SpotPatchAiOptions,\n SpotPatchDataFlowOptions,\n SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nexport type ViteSpotPatchOptions = SharedSpotPatchOptions;\nimport type { SpotPatchOptions as SharedSpotPatchOptions } from \"@spotpatch/dev-server\";\n"],"mappings":"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","names":["import_node_path","import_dev_server","import_vite","path","VITE_VERSION","module","import_node_path","import_dev_server","path","import_node_path","import_compiler","import_node_path","import_compiler","path","path","path","import_dev_server"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/runtime/runtime-injection-plugin.ts","../package.json","../../runtime/src/ui/brand-mark-content.ts","../src/server/server-plugin.ts","../src/transform/transform-plugin.ts","../src/transform/transform-filter.ts","../src/options.ts"],"sourcesContent":["export { spotPatch } from \"./plugin.js\";\nexport {\n DEFAULT_OPTIONS,\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchDataFlowOptions,\n type SpotPatchOptions,\n type ViteSpotPatchOptions,\n} from \"./options.js\";\nexport {\n DEFAULT_AGENT_LIMITS,\n type AgentApplyMode,\n type AgentCheckDefinition,\n type AgentLimits,\n type AiExecutionOptions,\n type AiModelProfile,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type OpenAICompatibleProviderOptions,\n type SpotPatchEditorPreference,\n} from \"@spotpatch/shared\";\n","import path from \"node:path\";\n\nimport {\n createSession,\n createSourceRegistry,\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveOptions,\n resolveProjectOptions,\n} from \"@spotpatch/dev-server\";\nimport { loadEnv, type ConfigEnv, type Plugin, type UserConfig } from \"vite\";\n\nimport type { ViteSpotPatchOptions } from \"./options.js\";\nimport type { SpotPatchPluginContext } from \"./plugin-context.js\";\nimport { createRuntimeInjectionPlugin } from \"./runtime/runtime-injection-plugin.js\";\nimport { createServerPlugin } from \"./server/server-plugin.js\";\nimport { createTransformPlugin } from \"./transform/transform-plugin.js\";\n\nexport function spotPatch(userOptions: ViteSpotPatchOptions = {}): Plugin[] {\n let options = resolveOptions(userOptions);\n let credentialEnvironment: Readonly<Record<string, string | undefined>> =\n Object.freeze({});\n\n if (!options.enabled) {\n return [];\n }\n\n const registry = createSourceRegistry();\n const session = createSession();\n const context = Object.freeze({\n getCredentialEnvironment: () => credentialEnvironment,\n getOptions: () => options,\n } satisfies SpotPatchPluginContext);\n const configure = async (\n config: UserConfig,\n environment: ConfigEnv,\n ): Promise<void> => {\n const root = path.resolve(process.cwd(), config.root ?? \".\");\n const loadedEnvironment =\n config.envDir === false\n ? process.env\n : loadEnv(environment.mode, path.resolve(root, config.envDir ?? \".\"), \"\");\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(loadedEnvironment).ai\n : false;\n\n options = await resolveProjectOptions({\n appRoot: root,\n environmentAi,\n options: userOptions,\n });\n\n credentialEnvironment = resolveCredentialEnvironment(options, loadedEnvironment);\n };\n\n return [\n createTransformPlugin({ configure, context, registry }),\n createRuntimeInjectionPlugin({ context, session }),\n createServerPlugin({ context, registry, session }),\n ];\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n type ResolvedSpotPatchOptions,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport packageMetadata from \"../../package.json\" with { type: \"json\" };\nimport { version as VITE_VERSION, type Plugin, type ViteDevServer } from \"vite\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nexport const SPOTPATCH_CLIENT_MODULE_ID = \"virtual:spotpatch/client\";\nexport const RESOLVED_SPOTPATCH_CLIENT_MODULE_ID = `\\0${SPOTPATCH_CLIENT_MODULE_ID}`;\nexport const SPOTPATCH_REACT_ADAPTER_MODULE_ID = \"virtual:spotpatch/react-adapter\";\nexport const RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID = `\\0${SPOTPATCH_REACT_ADAPTER_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_MODULE_ID = \"virtual:spotpatch/data-flow-runtime\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = \"virtual:spotpatch/data-flow-panel\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID =\n \"virtual:spotpatch/external-handoff-panel\";\nexport const RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID = `\\0${SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID =\n \"virtual:spotpatch/contextual-ask-panel\";\nexport const RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID = `\\0${SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_MOTION_MODULE_ID = \"virtual:spotpatch/motion\";\nexport const RESOLVED_SPOTPATCH_MOTION_MODULE_ID = `\\0${SPOTPATCH_MOTION_MODULE_ID}`;\n\nconst RUNTIME_BUNDLE_NAMES = [\n \"client\",\n \"contextualAskPanel\",\n \"dataFlowPanel\",\n \"dataFlowPrelude\",\n \"externalHandoffPanel\",\n \"motion\",\n \"reactAdapter\",\n] as const;\n\ntype RuntimeBundleName = (typeof RUNTIME_BUNDLE_NAMES)[number];\n\ninterface RuntimeBundleDefinition {\n readonly enabled: (options: ResolvedSpotPatchOptions) => boolean;\n readonly fileName: string;\n readonly importer?: string;\n readonly publicId: string;\n readonly resolvedId: string;\n}\n\ninterface RuntimeBundleState {\n cached?: string;\n readonly injected?: string;\n path?: string;\n}\n\nconst RUNTIME_BUNDLE_DEFINITIONS: Readonly<\n Record<RuntimeBundleName, RuntimeBundleDefinition>\n> = Object.freeze({\n client: {\n enabled: () => true,\n fileName: \"runtime-client.js\",\n publicId: SPOTPATCH_CLIENT_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n },\n contextualAskPanel: {\n enabled: (options) => options.contextualAsk.enabled,\n fileName: \"runtime-contextual-ask-panel.js\",\n publicId: SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n },\n dataFlowPanel: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-panel.js\",\n publicId: SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n },\n dataFlowPrelude: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-prelude.js\",\n publicId: SPOTPATCH_DATA_FLOW_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID,\n },\n externalHandoffPanel: {\n enabled: (options) => options.externalAgent.enabled,\n fileName: \"runtime-external-handoff-panel.js\",\n publicId: SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n },\n motion: {\n enabled: () => true,\n fileName: \"runtime-motion.js\",\n publicId: SPOTPATCH_MOTION_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_MOTION_MODULE_ID,\n },\n reactAdapter: {\n enabled: () => true,\n fileName: \"runtime-react-adapter.js\",\n importer: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n publicId: \"@spotpatch/react-adapter\",\n resolvedId: RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID,\n },\n});\n\ninterface RuntimeInjectionPluginInput {\n readonly bundlePaths?: Partial<Readonly<Record<RuntimeBundleName, string>>>;\n readonly clientBundle?: string;\n readonly contextualAskPanelBundle?: string;\n readonly context: SpotPatchPluginContext;\n readonly dataFlowPreludeBundle?: string;\n readonly dataFlowPanelBundle?: string;\n readonly externalHandoffPanelBundle?: string;\n readonly motionBundle?: string;\n readonly reactAdapterBundle?: string;\n readonly session: SpotPatchSession;\n}\n\nfunction createBundleState(injected: string | undefined): RuntimeBundleState {\n return injected === undefined ? {} : { injected };\n}\n\nfunction createDataFlowPreludeModule(\n input: RuntimeInjectionPluginInput,\n bundle: string,\n): string {\n return [\n `const __SPOTPATCH_DATA_FLOW_CONFIG__ = ${JSON.stringify(input.context.getOptions().dataFlow)};`,\n bundle,\n ].join(\"\\n\");\n}\n\nfunction resolveRuntimeBundlePath(root: string, fileName: string): string {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const packageEntry = resolveFromProject.resolve(\"@spotpatch/vite\");\n return path.join(path.dirname(packageEntry), fileName);\n}\n\nfunction readConsumerViteVersion(root: string): string {\n try {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const manifestPath = resolveFromProject.resolve(\"vite/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest === \"object\" &&\n manifest !== null &&\n \"version\" in manifest &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Vite itself remains the safe fallback if package metadata is not exported.\n }\n\n return VITE_VERSION;\n}\n\nfunction createClientModule(\n input: RuntimeInjectionPluginInput,\n clientBundle: string,\n viteVersion: string,\n): string {\n const options = input.context.getOptions();\n const runtimeConfig = {\n ai: createRuntimeAiConfig(options.ai),\n budget: options.budget,\n contextualAsk: Object.freeze({ enabled: options.contextualAsk.enabled }),\n dataFlow: createRuntimeDataFlowConfig(options.dataFlow),\n debug: options.debug,\n editor: options.editor,\n externalAgent: options.externalAgent,\n framework: \"vite\" as const,\n frameworkVersion: viteVersion,\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n sessionId: input.session.id,\n sessionToken: input.session.token,\n shortcut: options.shortcut,\n spotPatchVersion: packageMetadata.version,\n };\n\n return [\n `import ${JSON.stringify(SPOTPATCH_MOTION_MODULE_ID)};`,\n ...(options.contextualAsk.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID)};`]\n : []),\n ...(options.dataFlow.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID)};`]\n : []),\n ...(options.externalAgent.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID)};`]\n : []),\n `const __SPOTPATCH_BRAND_MARK_CONTENT__ = ${JSON.stringify(BRAND_MARK_CONTENT)};`,\n `const __SPOTPATCH_RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};`,\n clientBundle,\n ].join(\"\\n\");\n}\n\nexport function createRuntimeInjectionPlugin(\n input: RuntimeInjectionPluginInput,\n): Plugin {\n let root = process.cwd();\n let viteVersion = VITE_VERSION;\n let disposeWatcher: (() => void) | undefined;\n const bundleStates: Record<RuntimeBundleName, RuntimeBundleState> = {\n client: createBundleState(input.clientBundle),\n contextualAskPanel: createBundleState(input.contextualAskPanelBundle),\n dataFlowPanel: createBundleState(input.dataFlowPanelBundle),\n dataFlowPrelude: createBundleState(input.dataFlowPreludeBundle),\n externalHandoffPanel: createBundleState(input.externalHandoffPanelBundle),\n motion: createBundleState(input.motionBundle),\n reactAdapter: createBundleState(input.reactAdapterBundle),\n };\n\n function getBundlePath(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n state.path ??= path.resolve(\n input.bundlePaths?.[name] ??\n resolveRuntimeBundlePath(root, RUNTIME_BUNDLE_DEFINITIONS[name].fileName),\n );\n return state.path;\n }\n\n function loadBundle(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n if (state.injected !== undefined) return state.injected;\n state.cached ??= readFileSync(getBundlePath(name), \"utf8\");\n return state.cached;\n }\n\n function stopWatching(): void {\n disposeWatcher?.();\n }\n\n function watchRuntimeBundles(server: ViteDevServer): void {\n stopWatching();\n const options = input.context.getOptions();\n const bundleNameByPath = new Map<string, RuntimeBundleName>();\n\n for (const name of RUNTIME_BUNDLE_NAMES) {\n if (\n RUNTIME_BUNDLE_DEFINITIONS[name].enabled(options) &&\n bundleStates[name].injected === undefined\n ) {\n bundleNameByPath.set(getBundlePath(name), name);\n }\n }\n\n const bundlePaths = [...bundleNameByPath.keys()];\n if (bundlePaths.length === 0) return;\n\n let reloadHandle: NodeJS.Immediate | undefined;\n const scheduleReload = (): void => {\n reloadHandle ??= setImmediate(() => {\n reloadHandle = undefined;\n server.ws.send({ type: \"full-reload\", path: \"*\" });\n });\n };\n\n const handleChange = (changedPath: string): void => {\n const name = bundleNameByPath.get(path.resolve(changedPath));\n if (name === undefined) return;\n\n delete bundleStates[name].cached;\n const module = server.moduleGraph.getModuleById(\n RUNTIME_BUNDLE_DEFINITIONS[name].resolvedId,\n );\n if (module !== undefined) {\n server.moduleGraph.invalidateModule(module);\n }\n scheduleReload();\n };\n const dispose = (): void => {\n if (reloadHandle !== undefined) {\n clearImmediate(reloadHandle);\n reloadHandle = undefined;\n }\n server.watcher.off(\"change\", handleChange);\n server.httpServer?.off(\"close\", dispose);\n if (disposeWatcher === dispose) disposeWatcher = undefined;\n };\n\n server.watcher.add(bundlePaths);\n server.watcher.on(\"change\", handleChange);\n server.httpServer?.once(\"close\", dispose);\n disposeWatcher = dispose;\n }\n\n return {\n name: \"spotpatch:runtime-injection\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(config) {\n root = path.resolve(config.root);\n viteVersion = readConsumerViteVersion(root);\n },\n\n configureServer(server) {\n watchRuntimeBundles(server);\n },\n\n resolveId(id, importer) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (\n id === definition.publicId &&\n (definition.importer === undefined || importer === definition.importer)\n ) {\n return definition.resolvedId;\n }\n }\n return null;\n },\n\n load(id) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (id !== definition.resolvedId) continue;\n if (!definition.enabled(input.context.getOptions())) return null;\n\n const bundle = loadBundle(name);\n if (name === \"client\") {\n return createClientModule(input, bundle, viteVersion);\n }\n if (name === \"dataFlowPrelude\") {\n return createDataFlowPreludeModule(input, bundle);\n }\n return bundle;\n }\n return null;\n },\n\n transformIndexHtml() {\n const client = {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_CLIENT_MODULE_ID}`,\n },\n injectTo: \"head\" as const,\n };\n if (!input.context.getOptions().dataFlow.enabled) {\n return [client];\n }\n\n return [\n {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_DATA_FLOW_MODULE_ID}`,\n },\n injectTo: \"head-prepend\" as const,\n },\n client,\n ];\n },\n\n closeBundle() {\n stopWatching();\n },\n };\n}\n","{\n \"name\": \"@spotpatch/vite\",\n \"version\": \"1.15.4\",\n \"description\": \"Vite development plugin for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/vite\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"vite\",\n \"react\",\n \"developer-tools\",\n \"ai-agent\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-vite\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"scripts\": {\n \"build\": \"pnpm clean && tsup --config tsup.config.ts\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"dev\": \"tsup --config tsup.config.ts --watch src --watch tsup.config.ts --watch ../runtime/dist/index.js --watch ../react-adapter/dist/index.js --watch ../shared/dist/index.js\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\"\n },\n \"dependencies\": {\n \"@spotpatch/bridge\": \"workspace:^\",\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/react-adapter\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import path from \"node:path\";\nimport {\n createDevelopmentSession,\n type DevelopmentSession,\n type SourceRegistry,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport {\n createManagedCodexAskExecutor,\n createExternalAgentSupervisor,\n} from \"@spotpatch/bridge\";\nimport type { Plugin } from \"vite\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\n\ninterface ServerPluginInput {\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n readonly session: SpotPatchSession;\n}\n\nexport function createServerPlugin(input: ServerPluginInput): Plugin {\n let services: DevelopmentSession | undefined;\n return {\n name: \"spotpatch:server\",\n apply: \"serve\",\n enforce: \"pre\",\n async configureServer(server) {\n const root = path.resolve(server.config.root);\n const options = input.context.getOptions();\n const active = await createDevelopmentSession({\n root,\n options,\n registry: input.registry,\n session: input.session,\n framework: \"vite\",\n environment: input.context.getCredentialEnvironment(),\n logger: server.config.logger,\n createManagedAskExecutor: () =>\n createManagedCodexAskExecutor({ projectRoot: root }),\n createExternalAgentControl: (validation) =>\n createExternalAgentSupervisor({\n bridgeAdapter: \"vite\",\n ...validation,\n root,\n sessionId: input.session.id,\n projectLabel: path.basename(root),\n }),\n });\n services = active;\n server.middlewares.use(active.middleware);\n server.httpServer?.once(\"close\", () => {\n void active.close().catch(() => {\n server.config.logger.warn(\"[spotpatch:vite] Service cleanup failed.\");\n });\n });\n server.config.logger.info(\n `[spotpatch:vite] Ready. Toggle picker with ${options.shortcut}.`,\n );\n },\n async closeBundle() {\n await services?.close();\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { ConfigEnv, Plugin, ResolvedConfig, UserConfig } from \"vite\";\nimport { injectSourceMarkers } from \"@spotpatch/compiler\";\nimport type { SourceRegistry } from \"@spotpatch/dev-server\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { SPOTPATCH_DATA_FLOW_MODULE_ID } from \"../runtime/runtime-injection-plugin.js\";\nimport { createTransformFilter, stripViteQuery } from \"./transform-filter.js\";\n\ninterface TransformPluginInput {\n readonly configure?: (\n config: UserConfig,\n environment: ConfigEnv,\n ) => void | Promise<void>;\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n}\n\ninterface ViteTransformOutput {\n readonly code: string;\n readonly map: string;\n}\n\nfunction createCacheKey(id: string, code: string): string {\n const hash = createHash(\"sha256\").update(code).digest(\"base64url\");\n return `${id}\\0${hash}`;\n}\n\nfunction getDisplayPath(root: string, id: string): string {\n const relative = path.relative(root, stripViteQuery(id));\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function createTransformPlugin(input: TransformPluginInput): Plugin {\n let root = process.cwd();\n let filter = createTransformFilter(root, input.context.getOptions());\n let logger: ResolvedConfig[\"logger\"] | undefined;\n const warnedFiles = new Set<string>();\n const warnedDataFlowDiagnostics = new Set<string>();\n const cache = new Map<string, ViteTransformOutput | null>();\n\n return {\n name: \"spotpatch:transform\",\n apply: \"serve\",\n enforce: \"pre\",\n\n async config(config, environment) {\n await input.configure?.(config, environment);\n },\n\n configResolved(config) {\n root = path.resolve(config.root);\n filter = createTransformFilter(root, input.context.getOptions());\n logger = config.logger;\n },\n\n transform(code, id) {\n if (!filter.shouldTransform(id, code)) {\n return null;\n }\n\n const cleanId = path.resolve(stripViteQuery(id));\n const cacheKey = createCacheKey(cleanId, code);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey) ?? null;\n }\n\n const startedAt = performance.now();\n const options = input.context.getOptions();\n\n try {\n const result = injectSourceMarkers({\n code,\n absolutePath: cleanId,\n root,\n fileId: input.registry.register(cleanId),\n ...(options.dataFlow.enabled\n ? { dataFlow: { helperModule: SPOTPATCH_DATA_FLOW_MODULE_ID } }\n : {}),\n onWarning(warning) {\n logger?.warn(\n `[spotpatch:transform] Existing source marker at ${getDisplayPath(root, id)}:${String(warning.line)}:${String(warning.column)}; preserving application value.`,\n );\n },\n });\n\n if (result?.dataFlow !== undefined) {\n input.registry.registerDataFlowComponents(\n cleanId,\n result.dataFlow.sourceVersion,\n result.dataFlow.anchors.flatMap((anchor) =>\n anchor.kind === \"component\"\n ? [\n {\n componentSourceId: anchor.id,\n line: anchor.line,\n column: anchor.column,\n },\n ]\n : [],\n ),\n );\n for (const diagnostic of result.dataFlow.diagnostics) {\n const warningKey = `${cleanId}:${diagnostic.code}:${String(diagnostic.line)}:${String(diagnostic.column)}`;\n if (warnedDataFlowDiagnostics.has(warningKey)) continue;\n warnedDataFlowDiagnostics.add(warningKey);\n logger?.warn(\n `[spotpatch:data-flow] ${diagnostic.code} at ${getDisplayPath(root, id)}:${String(diagnostic.line)}:${String(diagnostic.column)}; keeping this adapter evidence partial.`,\n );\n }\n }\n\n const output =\n result === undefined\n ? null\n : Object.freeze({\n code: result.code,\n map: result.map.toString(),\n });\n cache.set(cacheKey, output);\n\n if (options.debug) {\n const elapsed = performance.now() - startedAt;\n logger?.info(\n `[spotpatch:transform] ${getDisplayPath(root, id)} ${elapsed.toFixed(2)}ms`,\n );\n }\n\n return output;\n } catch (error: unknown) {\n if (!warnedFiles.has(cleanId)) {\n warnedFiles.add(cleanId);\n const detail =\n options.debug && error instanceof Error ? `: ${error.message}` : \"\";\n logger?.warn(\n `[spotpatch:transform] Failed to transform ${getDisplayPath(root, id)}; using original module${detail}`,\n );\n }\n\n return null;\n }\n },\n };\n}\n","import path from \"node:path\";\n\nimport { createDataFlowSourceFilter, createSourceFilter } from \"@spotpatch/compiler\";\nimport type { ResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\n\nexport function stripViteQuery(id: string): string {\n const queryIndex = id.indexOf(\"?\");\n return queryIndex === -1 ? id : id.slice(0, queryIndex);\n}\n\nexport { isInsideRoot } from \"@spotpatch/compiler\";\n\nexport interface TransformFilter {\n shouldTransform(id: string, code: string): boolean;\n}\n\nexport function createTransformFilter(\n root: string,\n options: ResolvedSpotPatchOptions,\n): TransformFilter {\n const sourceFilter = createSourceFilter(root, options);\n const dataFlowFilter = createDataFlowSourceFilter(root, {\n include: options.include,\n exclude: options.exclude,\n });\n\n return Object.freeze({\n shouldTransform(id: string, code: string): boolean {\n if (\n id.startsWith(\"\\0\") ||\n id.includes(\"virtual:spotpatch\") ||\n id.includes(\"/packages/vite/\") ||\n id.includes(\"\\\\packages\\\\vite\\\\\")\n ) {\n return false;\n }\n\n const cleanId = stripViteQuery(id);\n const absolutePath = path.resolve(cleanId);\n return (\n sourceFilter.shouldTransform(absolutePath, code) ||\n (options.dataFlow.enabled && dataFlowFilter.shouldTransform(absolutePath, code))\n );\n },\n });\n}\n","export {\n createRuntimeAiConfig,\n DEFAULT_EXCLUDE,\n DEFAULT_OPTIONS,\n resolveOptions,\n} from \"@spotpatch/dev-server\";\nexport type {\n FilterEntry,\n ResolvedSpotPatchOptions,\n SimpleAiOptions,\n SpotPatchAiOptions,\n SpotPatchDataFlowOptions,\n SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nexport type ViteSpotPatchOptions = SharedSpotPatchOptions;\nimport type { SpotPatchOptions as SharedSpotPatchOptions } from \"@spotpatch/dev-server\";\n"],"mappings":"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","names":["import_node_path","import_dev_server","import_vite","path","VITE_VERSION","module","import_node_path","import_dev_server","path","import_node_path","import_compiler","import_node_path","import_compiler","path","path","path","import_dev_server"]}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/runtime/runtime-injection-plugin.ts","../package.json","../../runtime/src/ui/brand-mark-content.ts","../src/server/server-plugin.ts","../src/transform/transform-plugin.ts","../src/transform/transform-filter.ts","../src/options.ts","../src/index.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport {\n createSession,\n createSourceRegistry,\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveOptions,\n resolveProjectOptions,\n} from \"@spotpatch/dev-server\";\nimport { loadEnv, type ConfigEnv, type Plugin, type UserConfig } from \"vite\";\n\nimport type { ViteSpotPatchOptions } from \"./options.js\";\nimport type { SpotPatchPluginContext } from \"./plugin-context.js\";\nimport { createRuntimeInjectionPlugin } from \"./runtime/runtime-injection-plugin.js\";\nimport { createServerPlugin } from \"./server/server-plugin.js\";\nimport { createTransformPlugin } from \"./transform/transform-plugin.js\";\n\nexport function spotPatch(userOptions: ViteSpotPatchOptions = {}): Plugin[] {\n let options = resolveOptions(userOptions);\n let credentialEnvironment: Readonly<Record<string, string | undefined>> =\n Object.freeze({});\n\n if (!options.enabled) {\n return [];\n }\n\n const registry = createSourceRegistry();\n const session = createSession();\n const context = Object.freeze({\n getCredentialEnvironment: () => credentialEnvironment,\n getOptions: () => options,\n } satisfies SpotPatchPluginContext);\n const configure = async (\n config: UserConfig,\n environment: ConfigEnv,\n ): Promise<void> => {\n const root = path.resolve(process.cwd(), config.root ?? \".\");\n const loadedEnvironment =\n config.envDir === false\n ? process.env\n : loadEnv(environment.mode, path.resolve(root, config.envDir ?? \".\"), \"\");\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(loadedEnvironment).ai\n : false;\n\n options = await resolveProjectOptions({\n appRoot: root,\n environmentAi,\n options: userOptions,\n });\n\n credentialEnvironment = resolveCredentialEnvironment(options, loadedEnvironment);\n };\n\n return [\n createTransformPlugin({ configure, context, registry }),\n createRuntimeInjectionPlugin({ context, session }),\n createServerPlugin({ context, registry, session }),\n ];\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n type ResolvedSpotPatchOptions,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport packageMetadata from \"../../package.json\" with { type: \"json\" };\nimport { version as VITE_VERSION, type Plugin, type ViteDevServer } from \"vite\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nexport const SPOTPATCH_CLIENT_MODULE_ID = \"virtual:spotpatch/client\";\nexport const RESOLVED_SPOTPATCH_CLIENT_MODULE_ID = `\\0${SPOTPATCH_CLIENT_MODULE_ID}`;\nexport const SPOTPATCH_REACT_ADAPTER_MODULE_ID = \"virtual:spotpatch/react-adapter\";\nexport const RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID = `\\0${SPOTPATCH_REACT_ADAPTER_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_MODULE_ID = \"virtual:spotpatch/data-flow-runtime\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = \"virtual:spotpatch/data-flow-panel\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID =\n \"virtual:spotpatch/external-handoff-panel\";\nexport const RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID = `\\0${SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID =\n \"virtual:spotpatch/contextual-ask-panel\";\nexport const RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID = `\\0${SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_MOTION_MODULE_ID = \"virtual:spotpatch/motion\";\nexport const RESOLVED_SPOTPATCH_MOTION_MODULE_ID = `\\0${SPOTPATCH_MOTION_MODULE_ID}`;\n\nconst RUNTIME_BUNDLE_NAMES = [\n \"client\",\n \"contextualAskPanel\",\n \"dataFlowPanel\",\n \"dataFlowPrelude\",\n \"externalHandoffPanel\",\n \"motion\",\n \"reactAdapter\",\n] as const;\n\ntype RuntimeBundleName = (typeof RUNTIME_BUNDLE_NAMES)[number];\n\ninterface RuntimeBundleDefinition {\n readonly enabled: (options: ResolvedSpotPatchOptions) => boolean;\n readonly fileName: string;\n readonly importer?: string;\n readonly publicId: string;\n readonly resolvedId: string;\n}\n\ninterface RuntimeBundleState {\n cached?: string;\n readonly injected?: string;\n path?: string;\n}\n\nconst RUNTIME_BUNDLE_DEFINITIONS: Readonly<\n Record<RuntimeBundleName, RuntimeBundleDefinition>\n> = Object.freeze({\n client: {\n enabled: () => true,\n fileName: \"runtime-client.js\",\n publicId: SPOTPATCH_CLIENT_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n },\n contextualAskPanel: {\n enabled: (options) => options.contextualAsk.enabled,\n fileName: \"runtime-contextual-ask-panel.js\",\n publicId: SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n },\n dataFlowPanel: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-panel.js\",\n publicId: SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n },\n dataFlowPrelude: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-prelude.js\",\n publicId: SPOTPATCH_DATA_FLOW_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID,\n },\n externalHandoffPanel: {\n enabled: (options) => options.externalAgent.enabled,\n fileName: \"runtime-external-handoff-panel.js\",\n publicId: SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n },\n motion: {\n enabled: () => true,\n fileName: \"runtime-motion.js\",\n publicId: SPOTPATCH_MOTION_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_MOTION_MODULE_ID,\n },\n reactAdapter: {\n enabled: () => true,\n fileName: \"runtime-react-adapter.js\",\n importer: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n publicId: \"@spotpatch/react-adapter\",\n resolvedId: RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID,\n },\n});\n\ninterface RuntimeInjectionPluginInput {\n readonly bundlePaths?: Partial<Readonly<Record<RuntimeBundleName, string>>>;\n readonly clientBundle?: string;\n readonly contextualAskPanelBundle?: string;\n readonly context: SpotPatchPluginContext;\n readonly dataFlowPreludeBundle?: string;\n readonly dataFlowPanelBundle?: string;\n readonly externalHandoffPanelBundle?: string;\n readonly motionBundle?: string;\n readonly reactAdapterBundle?: string;\n readonly session: SpotPatchSession;\n}\n\nfunction createBundleState(injected: string | undefined): RuntimeBundleState {\n return injected === undefined ? {} : { injected };\n}\n\nfunction createDataFlowPreludeModule(\n input: RuntimeInjectionPluginInput,\n bundle: string,\n): string {\n return [\n `const __SPOTPATCH_DATA_FLOW_CONFIG__ = ${JSON.stringify(input.context.getOptions().dataFlow)};`,\n bundle,\n ].join(\"\\n\");\n}\n\nfunction resolveRuntimeBundlePath(root: string, fileName: string): string {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const packageEntry = resolveFromProject.resolve(\"@spotpatch/vite\");\n return path.join(path.dirname(packageEntry), fileName);\n}\n\nfunction readConsumerViteVersion(root: string): string {\n try {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const manifestPath = resolveFromProject.resolve(\"vite/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest === \"object\" &&\n manifest !== null &&\n \"version\" in manifest &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Vite itself remains the safe fallback if package metadata is not exported.\n }\n\n return VITE_VERSION;\n}\n\nfunction createClientModule(\n input: RuntimeInjectionPluginInput,\n clientBundle: string,\n viteVersion: string,\n): string {\n const options = input.context.getOptions();\n const runtimeConfig = {\n ai: createRuntimeAiConfig(options.ai),\n budget: options.budget,\n contextualAsk: Object.freeze({ enabled: options.contextualAsk.enabled }),\n dataFlow: createRuntimeDataFlowConfig(options.dataFlow),\n debug: options.debug,\n editor: options.editor,\n externalAgent: options.externalAgent,\n framework: \"vite\" as const,\n frameworkVersion: viteVersion,\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n sessionId: input.session.id,\n sessionToken: input.session.token,\n shortcut: options.shortcut,\n spotPatchVersion: packageMetadata.version,\n };\n\n return [\n `import ${JSON.stringify(SPOTPATCH_MOTION_MODULE_ID)};`,\n ...(options.contextualAsk.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID)};`]\n : []),\n ...(options.dataFlow.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID)};`]\n : []),\n ...(options.externalAgent.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID)};`]\n : []),\n `const __SPOTPATCH_BRAND_MARK_CONTENT__ = ${JSON.stringify(BRAND_MARK_CONTENT)};`,\n `const __SPOTPATCH_RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};`,\n clientBundle,\n ].join(\"\\n\");\n}\n\nexport function createRuntimeInjectionPlugin(\n input: RuntimeInjectionPluginInput,\n): Plugin {\n let root = process.cwd();\n let viteVersion = VITE_VERSION;\n let disposeWatcher: (() => void) | undefined;\n const bundleStates: Record<RuntimeBundleName, RuntimeBundleState> = {\n client: createBundleState(input.clientBundle),\n contextualAskPanel: createBundleState(input.contextualAskPanelBundle),\n dataFlowPanel: createBundleState(input.dataFlowPanelBundle),\n dataFlowPrelude: createBundleState(input.dataFlowPreludeBundle),\n externalHandoffPanel: createBundleState(input.externalHandoffPanelBundle),\n motion: createBundleState(input.motionBundle),\n reactAdapter: createBundleState(input.reactAdapterBundle),\n };\n\n function getBundlePath(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n state.path ??= path.resolve(\n input.bundlePaths?.[name] ??\n resolveRuntimeBundlePath(root, RUNTIME_BUNDLE_DEFINITIONS[name].fileName),\n );\n return state.path;\n }\n\n function loadBundle(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n if (state.injected !== undefined) return state.injected;\n state.cached ??= readFileSync(getBundlePath(name), \"utf8\");\n return state.cached;\n }\n\n function stopWatching(): void {\n disposeWatcher?.();\n }\n\n function watchRuntimeBundles(server: ViteDevServer): void {\n stopWatching();\n const options = input.context.getOptions();\n const bundleNameByPath = new Map<string, RuntimeBundleName>();\n\n for (const name of RUNTIME_BUNDLE_NAMES) {\n if (\n RUNTIME_BUNDLE_DEFINITIONS[name].enabled(options) &&\n bundleStates[name].injected === undefined\n ) {\n bundleNameByPath.set(getBundlePath(name), name);\n }\n }\n\n const bundlePaths = [...bundleNameByPath.keys()];\n if (bundlePaths.length === 0) return;\n\n let reloadHandle: NodeJS.Immediate | undefined;\n const scheduleReload = (): void => {\n reloadHandle ??= setImmediate(() => {\n reloadHandle = undefined;\n server.ws.send({ type: \"full-reload\", path: \"*\" });\n });\n };\n\n const handleChange = (changedPath: string): void => {\n const name = bundleNameByPath.get(path.resolve(changedPath));\n if (name === undefined) return;\n\n delete bundleStates[name].cached;\n const module = server.moduleGraph.getModuleById(\n RUNTIME_BUNDLE_DEFINITIONS[name].resolvedId,\n );\n if (module !== undefined) {\n server.moduleGraph.invalidateModule(module);\n }\n scheduleReload();\n };\n const dispose = (): void => {\n if (reloadHandle !== undefined) {\n clearImmediate(reloadHandle);\n reloadHandle = undefined;\n }\n server.watcher.off(\"change\", handleChange);\n server.httpServer?.off(\"close\", dispose);\n if (disposeWatcher === dispose) disposeWatcher = undefined;\n };\n\n server.watcher.add(bundlePaths);\n server.watcher.on(\"change\", handleChange);\n server.httpServer?.once(\"close\", dispose);\n disposeWatcher = dispose;\n }\n\n return {\n name: \"spotpatch:runtime-injection\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(config) {\n root = path.resolve(config.root);\n viteVersion = readConsumerViteVersion(root);\n },\n\n configureServer(server) {\n watchRuntimeBundles(server);\n },\n\n resolveId(id, importer) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (\n id === definition.publicId &&\n (definition.importer === undefined || importer === definition.importer)\n ) {\n return definition.resolvedId;\n }\n }\n return null;\n },\n\n load(id) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (id !== definition.resolvedId) continue;\n if (!definition.enabled(input.context.getOptions())) return null;\n\n const bundle = loadBundle(name);\n if (name === \"client\") {\n return createClientModule(input, bundle, viteVersion);\n }\n if (name === \"dataFlowPrelude\") {\n return createDataFlowPreludeModule(input, bundle);\n }\n return bundle;\n }\n return null;\n },\n\n transformIndexHtml() {\n const client = {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_CLIENT_MODULE_ID}`,\n },\n injectTo: \"head\" as const,\n };\n if (!input.context.getOptions().dataFlow.enabled) {\n return [client];\n }\n\n return [\n {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_DATA_FLOW_MODULE_ID}`,\n },\n injectTo: \"head-prepend\" as const,\n },\n client,\n ];\n },\n\n closeBundle() {\n stopWatching();\n },\n };\n}\n","{\n \"name\": \"@spotpatch/vite\",\n \"version\": \"1.15.1\",\n \"description\": \"Vite development plugin for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/vite\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"vite\",\n \"react\",\n \"developer-tools\",\n \"ai-agent\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-vite\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"scripts\": {\n \"build\": \"pnpm clean && tsup --config tsup.config.ts\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"dev\": \"tsup --config tsup.config.ts --watch src --watch tsup.config.ts --watch ../runtime/dist/index.js --watch ../react-adapter/dist/index.js --watch ../shared/dist/index.js\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\"\n },\n \"dependencies\": {\n \"@spotpatch/bridge\": \"workspace:^\",\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/react-adapter\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import path from \"node:path\";\nimport {\n createDevelopmentSession,\n type DevelopmentSession,\n type SourceRegistry,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport {\n createManagedCodexAskExecutor,\n createExternalAgentSupervisor,\n} from \"@spotpatch/bridge\";\nimport type { Plugin } from \"vite\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\n\ninterface ServerPluginInput {\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n readonly session: SpotPatchSession;\n}\n\nexport function createServerPlugin(input: ServerPluginInput): Plugin {\n let services: DevelopmentSession | undefined;\n return {\n name: \"spotpatch:server\",\n apply: \"serve\",\n enforce: \"pre\",\n async configureServer(server) {\n const root = path.resolve(server.config.root);\n const options = input.context.getOptions();\n const active = await createDevelopmentSession({\n root,\n options,\n registry: input.registry,\n session: input.session,\n framework: \"vite\",\n environment: input.context.getCredentialEnvironment(),\n logger: server.config.logger,\n createManagedAskExecutor: () =>\n createManagedCodexAskExecutor({ projectRoot: root }),\n createExternalAgentControl: (validation) =>\n createExternalAgentSupervisor({\n bridgeAdapter: \"vite\",\n ...validation,\n root,\n sessionId: input.session.id,\n projectLabel: path.basename(root),\n }),\n });\n services = active;\n server.middlewares.use(active.middleware);\n server.httpServer?.once(\"close\", () => {\n void active.close().catch(() => {\n server.config.logger.warn(\"[spotpatch:vite] Service cleanup failed.\");\n });\n });\n server.config.logger.info(\n `[spotpatch:vite] Ready. Toggle picker with ${options.shortcut}.`,\n );\n },\n async closeBundle() {\n await services?.close();\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { ConfigEnv, Plugin, ResolvedConfig, UserConfig } from \"vite\";\nimport { injectSourceMarkers } from \"@spotpatch/compiler\";\nimport type { SourceRegistry } from \"@spotpatch/dev-server\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { SPOTPATCH_DATA_FLOW_MODULE_ID } from \"../runtime/runtime-injection-plugin.js\";\nimport { createTransformFilter, stripViteQuery } from \"./transform-filter.js\";\n\ninterface TransformPluginInput {\n readonly configure?: (\n config: UserConfig,\n environment: ConfigEnv,\n ) => void | Promise<void>;\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n}\n\ninterface ViteTransformOutput {\n readonly code: string;\n readonly map: string;\n}\n\nfunction createCacheKey(id: string, code: string): string {\n const hash = createHash(\"sha256\").update(code).digest(\"base64url\");\n return `${id}\\0${hash}`;\n}\n\nfunction getDisplayPath(root: string, id: string): string {\n const relative = path.relative(root, stripViteQuery(id));\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function createTransformPlugin(input: TransformPluginInput): Plugin {\n let root = process.cwd();\n let filter = createTransformFilter(root, input.context.getOptions());\n let logger: ResolvedConfig[\"logger\"] | undefined;\n const warnedFiles = new Set<string>();\n const warnedDataFlowDiagnostics = new Set<string>();\n const cache = new Map<string, ViteTransformOutput | null>();\n\n return {\n name: \"spotpatch:transform\",\n apply: \"serve\",\n enforce: \"pre\",\n\n async config(config, environment) {\n await input.configure?.(config, environment);\n },\n\n configResolved(config) {\n root = path.resolve(config.root);\n filter = createTransformFilter(root, input.context.getOptions());\n logger = config.logger;\n },\n\n transform(code, id) {\n if (!filter.shouldTransform(id, code)) {\n return null;\n }\n\n const cleanId = path.resolve(stripViteQuery(id));\n const cacheKey = createCacheKey(cleanId, code);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey) ?? null;\n }\n\n const startedAt = performance.now();\n const options = input.context.getOptions();\n\n try {\n const result = injectSourceMarkers({\n code,\n absolutePath: cleanId,\n root,\n fileId: input.registry.register(cleanId),\n ...(options.dataFlow.enabled\n ? { dataFlow: { helperModule: SPOTPATCH_DATA_FLOW_MODULE_ID } }\n : {}),\n onWarning(warning) {\n logger?.warn(\n `[spotpatch:transform] Existing source marker at ${getDisplayPath(root, id)}:${String(warning.line)}:${String(warning.column)}; preserving application value.`,\n );\n },\n });\n\n if (result?.dataFlow !== undefined) {\n input.registry.registerDataFlowComponents(\n cleanId,\n result.dataFlow.sourceVersion,\n result.dataFlow.anchors.flatMap((anchor) =>\n anchor.kind === \"component\"\n ? [\n {\n componentSourceId: anchor.id,\n line: anchor.line,\n column: anchor.column,\n },\n ]\n : [],\n ),\n );\n for (const diagnostic of result.dataFlow.diagnostics) {\n const warningKey = `${cleanId}:${diagnostic.code}:${String(diagnostic.line)}:${String(diagnostic.column)}`;\n if (warnedDataFlowDiagnostics.has(warningKey)) continue;\n warnedDataFlowDiagnostics.add(warningKey);\n logger?.warn(\n `[spotpatch:data-flow] ${diagnostic.code} at ${getDisplayPath(root, id)}:${String(diagnostic.line)}:${String(diagnostic.column)}; keeping this adapter evidence partial.`,\n );\n }\n }\n\n const output =\n result === undefined\n ? null\n : Object.freeze({\n code: result.code,\n map: result.map.toString(),\n });\n cache.set(cacheKey, output);\n\n if (options.debug) {\n const elapsed = performance.now() - startedAt;\n logger?.info(\n `[spotpatch:transform] ${getDisplayPath(root, id)} ${elapsed.toFixed(2)}ms`,\n );\n }\n\n return output;\n } catch (error: unknown) {\n if (!warnedFiles.has(cleanId)) {\n warnedFiles.add(cleanId);\n const detail =\n options.debug && error instanceof Error ? `: ${error.message}` : \"\";\n logger?.warn(\n `[spotpatch:transform] Failed to transform ${getDisplayPath(root, id)}; using original module${detail}`,\n );\n }\n\n return null;\n }\n },\n };\n}\n","import path from \"node:path\";\n\nimport { createDataFlowSourceFilter, createSourceFilter } from \"@spotpatch/compiler\";\nimport type { ResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\n\nexport function stripViteQuery(id: string): string {\n const queryIndex = id.indexOf(\"?\");\n return queryIndex === -1 ? id : id.slice(0, queryIndex);\n}\n\nexport { isInsideRoot } from \"@spotpatch/compiler\";\n\nexport interface TransformFilter {\n shouldTransform(id: string, code: string): boolean;\n}\n\nexport function createTransformFilter(\n root: string,\n options: ResolvedSpotPatchOptions,\n): TransformFilter {\n const sourceFilter = createSourceFilter(root, options);\n const dataFlowFilter = createDataFlowSourceFilter(root, {\n include: options.include,\n exclude: options.exclude,\n });\n\n return Object.freeze({\n shouldTransform(id: string, code: string): boolean {\n if (\n id.startsWith(\"\\0\") ||\n id.includes(\"virtual:spotpatch\") ||\n id.includes(\"/packages/vite/\") ||\n id.includes(\"\\\\packages\\\\vite\\\\\")\n ) {\n return false;\n }\n\n const cleanId = stripViteQuery(id);\n const absolutePath = path.resolve(cleanId);\n return (\n sourceFilter.shouldTransform(absolutePath, code) ||\n (options.dataFlow.enabled && dataFlowFilter.shouldTransform(absolutePath, code))\n );\n },\n });\n}\n","export {\n createRuntimeAiConfig,\n DEFAULT_EXCLUDE,\n DEFAULT_OPTIONS,\n resolveOptions,\n} from \"@spotpatch/dev-server\";\nexport type {\n FilterEntry,\n ResolvedSpotPatchOptions,\n SimpleAiOptions,\n SpotPatchAiOptions,\n SpotPatchDataFlowOptions,\n SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nexport type ViteSpotPatchOptions = SharedSpotPatchOptions;\nimport type { SpotPatchOptions as SharedSpotPatchOptions } from \"@spotpatch/dev-server\";\n","export { spotPatch } from \"./plugin.js\";\nexport {\n DEFAULT_OPTIONS,\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchDataFlowOptions,\n type SpotPatchOptions,\n type ViteSpotPatchOptions,\n} from \"./options.js\";\nexport {\n DEFAULT_AGENT_LIMITS,\n type AgentApplyMode,\n type AgentCheckDefinition,\n type AgentLimits,\n type AiExecutionOptions,\n type AiModelProfile,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type OpenAICompatibleProviderOptions,\n type SpotPatchEditorPreference,\n} from \"@spotpatch/shared\";\n"],"mappings":"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","names":["path","path","path","path","path","path","createRuntimeAiConfig","resolveOptions"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/runtime/runtime-injection-plugin.ts","../package.json","../../runtime/src/ui/brand-mark-content.ts","../src/server/server-plugin.ts","../src/transform/transform-plugin.ts","../src/transform/transform-filter.ts","../src/options.ts","../src/index.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport {\n createSession,\n createSourceRegistry,\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveOptions,\n resolveProjectOptions,\n} from \"@spotpatch/dev-server\";\nimport { loadEnv, type ConfigEnv, type Plugin, type UserConfig } from \"vite\";\n\nimport type { ViteSpotPatchOptions } from \"./options.js\";\nimport type { SpotPatchPluginContext } from \"./plugin-context.js\";\nimport { createRuntimeInjectionPlugin } from \"./runtime/runtime-injection-plugin.js\";\nimport { createServerPlugin } from \"./server/server-plugin.js\";\nimport { createTransformPlugin } from \"./transform/transform-plugin.js\";\n\nexport function spotPatch(userOptions: ViteSpotPatchOptions = {}): Plugin[] {\n let options = resolveOptions(userOptions);\n let credentialEnvironment: Readonly<Record<string, string | undefined>> =\n Object.freeze({});\n\n if (!options.enabled) {\n return [];\n }\n\n const registry = createSourceRegistry();\n const session = createSession();\n const context = Object.freeze({\n getCredentialEnvironment: () => credentialEnvironment,\n getOptions: () => options,\n } satisfies SpotPatchPluginContext);\n const configure = async (\n config: UserConfig,\n environment: ConfigEnv,\n ): Promise<void> => {\n const root = path.resolve(process.cwd(), config.root ?? \".\");\n const loadedEnvironment =\n config.envDir === false\n ? process.env\n : loadEnv(environment.mode, path.resolve(root, config.envDir ?? \".\"), \"\");\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(loadedEnvironment).ai\n : false;\n\n options = await resolveProjectOptions({\n appRoot: root,\n environmentAi,\n options: userOptions,\n });\n\n credentialEnvironment = resolveCredentialEnvironment(options, loadedEnvironment);\n };\n\n return [\n createTransformPlugin({ configure, context, registry }),\n createRuntimeInjectionPlugin({ context, session }),\n createServerPlugin({ context, registry, session }),\n ];\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport {\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n type ResolvedSpotPatchOptions,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport packageMetadata from \"../../package.json\" with { type: \"json\" };\nimport { version as VITE_VERSION, type Plugin, type ViteDevServer } from \"vite\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nexport const SPOTPATCH_CLIENT_MODULE_ID = \"virtual:spotpatch/client\";\nexport const RESOLVED_SPOTPATCH_CLIENT_MODULE_ID = `\\0${SPOTPATCH_CLIENT_MODULE_ID}`;\nexport const SPOTPATCH_REACT_ADAPTER_MODULE_ID = \"virtual:spotpatch/react-adapter\";\nexport const RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID = `\\0${SPOTPATCH_REACT_ADAPTER_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_MODULE_ID = \"virtual:spotpatch/data-flow-runtime\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_MODULE_ID}`;\nexport const SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = \"virtual:spotpatch/data-flow-panel\";\nexport const RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID = `\\0${SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID =\n \"virtual:spotpatch/external-handoff-panel\";\nexport const RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID = `\\0${SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID =\n \"virtual:spotpatch/contextual-ask-panel\";\nexport const RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID = `\\0${SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID}`;\nexport const SPOTPATCH_MOTION_MODULE_ID = \"virtual:spotpatch/motion\";\nexport const RESOLVED_SPOTPATCH_MOTION_MODULE_ID = `\\0${SPOTPATCH_MOTION_MODULE_ID}`;\n\nconst RUNTIME_BUNDLE_NAMES = [\n \"client\",\n \"contextualAskPanel\",\n \"dataFlowPanel\",\n \"dataFlowPrelude\",\n \"externalHandoffPanel\",\n \"motion\",\n \"reactAdapter\",\n] as const;\n\ntype RuntimeBundleName = (typeof RUNTIME_BUNDLE_NAMES)[number];\n\ninterface RuntimeBundleDefinition {\n readonly enabled: (options: ResolvedSpotPatchOptions) => boolean;\n readonly fileName: string;\n readonly importer?: string;\n readonly publicId: string;\n readonly resolvedId: string;\n}\n\ninterface RuntimeBundleState {\n cached?: string;\n readonly injected?: string;\n path?: string;\n}\n\nconst RUNTIME_BUNDLE_DEFINITIONS: Readonly<\n Record<RuntimeBundleName, RuntimeBundleDefinition>\n> = Object.freeze({\n client: {\n enabled: () => true,\n fileName: \"runtime-client.js\",\n publicId: SPOTPATCH_CLIENT_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n },\n contextualAskPanel: {\n enabled: (options) => options.contextualAsk.enabled,\n fileName: \"runtime-contextual-ask-panel.js\",\n publicId: SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID,\n },\n dataFlowPanel: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-panel.js\",\n publicId: SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID,\n },\n dataFlowPrelude: {\n enabled: (options) => options.dataFlow.enabled,\n fileName: \"runtime-data-flow-prelude.js\",\n publicId: SPOTPATCH_DATA_FLOW_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_DATA_FLOW_MODULE_ID,\n },\n externalHandoffPanel: {\n enabled: (options) => options.externalAgent.enabled,\n fileName: \"runtime-external-handoff-panel.js\",\n publicId: SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID,\n },\n motion: {\n enabled: () => true,\n fileName: \"runtime-motion.js\",\n publicId: SPOTPATCH_MOTION_MODULE_ID,\n resolvedId: RESOLVED_SPOTPATCH_MOTION_MODULE_ID,\n },\n reactAdapter: {\n enabled: () => true,\n fileName: \"runtime-react-adapter.js\",\n importer: RESOLVED_SPOTPATCH_CLIENT_MODULE_ID,\n publicId: \"@spotpatch/react-adapter\",\n resolvedId: RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID,\n },\n});\n\ninterface RuntimeInjectionPluginInput {\n readonly bundlePaths?: Partial<Readonly<Record<RuntimeBundleName, string>>>;\n readonly clientBundle?: string;\n readonly contextualAskPanelBundle?: string;\n readonly context: SpotPatchPluginContext;\n readonly dataFlowPreludeBundle?: string;\n readonly dataFlowPanelBundle?: string;\n readonly externalHandoffPanelBundle?: string;\n readonly motionBundle?: string;\n readonly reactAdapterBundle?: string;\n readonly session: SpotPatchSession;\n}\n\nfunction createBundleState(injected: string | undefined): RuntimeBundleState {\n return injected === undefined ? {} : { injected };\n}\n\nfunction createDataFlowPreludeModule(\n input: RuntimeInjectionPluginInput,\n bundle: string,\n): string {\n return [\n `const __SPOTPATCH_DATA_FLOW_CONFIG__ = ${JSON.stringify(input.context.getOptions().dataFlow)};`,\n bundle,\n ].join(\"\\n\");\n}\n\nfunction resolveRuntimeBundlePath(root: string, fileName: string): string {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const packageEntry = resolveFromProject.resolve(\"@spotpatch/vite\");\n return path.join(path.dirname(packageEntry), fileName);\n}\n\nfunction readConsumerViteVersion(root: string): string {\n try {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const manifestPath = resolveFromProject.resolve(\"vite/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest === \"object\" &&\n manifest !== null &&\n \"version\" in manifest &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Vite itself remains the safe fallback if package metadata is not exported.\n }\n\n return VITE_VERSION;\n}\n\nfunction createClientModule(\n input: RuntimeInjectionPluginInput,\n clientBundle: string,\n viteVersion: string,\n): string {\n const options = input.context.getOptions();\n const runtimeConfig = {\n ai: createRuntimeAiConfig(options.ai),\n budget: options.budget,\n contextualAsk: Object.freeze({ enabled: options.contextualAsk.enabled }),\n dataFlow: createRuntimeDataFlowConfig(options.dataFlow),\n debug: options.debug,\n editor: options.editor,\n externalAgent: options.externalAgent,\n framework: \"vite\" as const,\n frameworkVersion: viteVersion,\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n sessionId: input.session.id,\n sessionToken: input.session.token,\n shortcut: options.shortcut,\n spotPatchVersion: packageMetadata.version,\n };\n\n return [\n `import ${JSON.stringify(SPOTPATCH_MOTION_MODULE_ID)};`,\n ...(options.contextualAsk.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_CONTEXTUAL_ASK_PANEL_MODULE_ID)};`]\n : []),\n ...(options.dataFlow.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_DATA_FLOW_PANEL_MODULE_ID)};`]\n : []),\n ...(options.externalAgent.enabled\n ? [`import ${JSON.stringify(SPOTPATCH_EXTERNAL_HANDOFF_PANEL_MODULE_ID)};`]\n : []),\n `const __SPOTPATCH_BRAND_MARK_CONTENT__ = ${JSON.stringify(BRAND_MARK_CONTENT)};`,\n `const __SPOTPATCH_RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};`,\n clientBundle,\n ].join(\"\\n\");\n}\n\nexport function createRuntimeInjectionPlugin(\n input: RuntimeInjectionPluginInput,\n): Plugin {\n let root = process.cwd();\n let viteVersion = VITE_VERSION;\n let disposeWatcher: (() => void) | undefined;\n const bundleStates: Record<RuntimeBundleName, RuntimeBundleState> = {\n client: createBundleState(input.clientBundle),\n contextualAskPanel: createBundleState(input.contextualAskPanelBundle),\n dataFlowPanel: createBundleState(input.dataFlowPanelBundle),\n dataFlowPrelude: createBundleState(input.dataFlowPreludeBundle),\n externalHandoffPanel: createBundleState(input.externalHandoffPanelBundle),\n motion: createBundleState(input.motionBundle),\n reactAdapter: createBundleState(input.reactAdapterBundle),\n };\n\n function getBundlePath(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n state.path ??= path.resolve(\n input.bundlePaths?.[name] ??\n resolveRuntimeBundlePath(root, RUNTIME_BUNDLE_DEFINITIONS[name].fileName),\n );\n return state.path;\n }\n\n function loadBundle(name: RuntimeBundleName): string {\n const state = bundleStates[name];\n if (state.injected !== undefined) return state.injected;\n state.cached ??= readFileSync(getBundlePath(name), \"utf8\");\n return state.cached;\n }\n\n function stopWatching(): void {\n disposeWatcher?.();\n }\n\n function watchRuntimeBundles(server: ViteDevServer): void {\n stopWatching();\n const options = input.context.getOptions();\n const bundleNameByPath = new Map<string, RuntimeBundleName>();\n\n for (const name of RUNTIME_BUNDLE_NAMES) {\n if (\n RUNTIME_BUNDLE_DEFINITIONS[name].enabled(options) &&\n bundleStates[name].injected === undefined\n ) {\n bundleNameByPath.set(getBundlePath(name), name);\n }\n }\n\n const bundlePaths = [...bundleNameByPath.keys()];\n if (bundlePaths.length === 0) return;\n\n let reloadHandle: NodeJS.Immediate | undefined;\n const scheduleReload = (): void => {\n reloadHandle ??= setImmediate(() => {\n reloadHandle = undefined;\n server.ws.send({ type: \"full-reload\", path: \"*\" });\n });\n };\n\n const handleChange = (changedPath: string): void => {\n const name = bundleNameByPath.get(path.resolve(changedPath));\n if (name === undefined) return;\n\n delete bundleStates[name].cached;\n const module = server.moduleGraph.getModuleById(\n RUNTIME_BUNDLE_DEFINITIONS[name].resolvedId,\n );\n if (module !== undefined) {\n server.moduleGraph.invalidateModule(module);\n }\n scheduleReload();\n };\n const dispose = (): void => {\n if (reloadHandle !== undefined) {\n clearImmediate(reloadHandle);\n reloadHandle = undefined;\n }\n server.watcher.off(\"change\", handleChange);\n server.httpServer?.off(\"close\", dispose);\n if (disposeWatcher === dispose) disposeWatcher = undefined;\n };\n\n server.watcher.add(bundlePaths);\n server.watcher.on(\"change\", handleChange);\n server.httpServer?.once(\"close\", dispose);\n disposeWatcher = dispose;\n }\n\n return {\n name: \"spotpatch:runtime-injection\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(config) {\n root = path.resolve(config.root);\n viteVersion = readConsumerViteVersion(root);\n },\n\n configureServer(server) {\n watchRuntimeBundles(server);\n },\n\n resolveId(id, importer) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (\n id === definition.publicId &&\n (definition.importer === undefined || importer === definition.importer)\n ) {\n return definition.resolvedId;\n }\n }\n return null;\n },\n\n load(id) {\n for (const name of RUNTIME_BUNDLE_NAMES) {\n const definition = RUNTIME_BUNDLE_DEFINITIONS[name];\n if (id !== definition.resolvedId) continue;\n if (!definition.enabled(input.context.getOptions())) return null;\n\n const bundle = loadBundle(name);\n if (name === \"client\") {\n return createClientModule(input, bundle, viteVersion);\n }\n if (name === \"dataFlowPrelude\") {\n return createDataFlowPreludeModule(input, bundle);\n }\n return bundle;\n }\n return null;\n },\n\n transformIndexHtml() {\n const client = {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_CLIENT_MODULE_ID}`,\n },\n injectTo: \"head\" as const,\n };\n if (!input.context.getOptions().dataFlow.enabled) {\n return [client];\n }\n\n return [\n {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_DATA_FLOW_MODULE_ID}`,\n },\n injectTo: \"head-prepend\" as const,\n },\n client,\n ];\n },\n\n closeBundle() {\n stopWatching();\n },\n };\n}\n","{\n \"name\": \"@spotpatch/vite\",\n \"version\": \"1.15.4\",\n \"description\": \"Vite development plugin for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/vite\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"vite\",\n \"react\",\n \"developer-tools\",\n \"ai-agent\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-vite\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"scripts\": {\n \"build\": \"pnpm clean && tsup --config tsup.config.ts\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"dev\": \"tsup --config tsup.config.ts --watch src --watch tsup.config.ts --watch ../runtime/dist/index.js --watch ../react-adapter/dist/index.js --watch ../shared/dist/index.js\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\"\n },\n \"dependencies\": {\n \"@spotpatch/bridge\": \"workspace:^\",\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/react-adapter\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import path from \"node:path\";\nimport {\n createDevelopmentSession,\n type DevelopmentSession,\n type SourceRegistry,\n type SpotPatchSession,\n} from \"@spotpatch/dev-server\";\nimport {\n createManagedCodexAskExecutor,\n createExternalAgentSupervisor,\n} from \"@spotpatch/bridge\";\nimport type { Plugin } from \"vite\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\n\ninterface ServerPluginInput {\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n readonly session: SpotPatchSession;\n}\n\nexport function createServerPlugin(input: ServerPluginInput): Plugin {\n let services: DevelopmentSession | undefined;\n return {\n name: \"spotpatch:server\",\n apply: \"serve\",\n enforce: \"pre\",\n async configureServer(server) {\n const root = path.resolve(server.config.root);\n const options = input.context.getOptions();\n const active = await createDevelopmentSession({\n root,\n options,\n registry: input.registry,\n session: input.session,\n framework: \"vite\",\n environment: input.context.getCredentialEnvironment(),\n logger: server.config.logger,\n createManagedAskExecutor: () =>\n createManagedCodexAskExecutor({ projectRoot: root }),\n createExternalAgentControl: (validation) =>\n createExternalAgentSupervisor({\n bridgeAdapter: \"vite\",\n ...validation,\n root,\n sessionId: input.session.id,\n projectLabel: path.basename(root),\n }),\n });\n services = active;\n server.middlewares.use(active.middleware);\n server.httpServer?.once(\"close\", () => {\n void active.close().catch(() => {\n server.config.logger.warn(\"[spotpatch:vite] Service cleanup failed.\");\n });\n });\n server.config.logger.info(\n `[spotpatch:vite] Ready. Toggle picker with ${options.shortcut}.`,\n );\n },\n async closeBundle() {\n await services?.close();\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { ConfigEnv, Plugin, ResolvedConfig, UserConfig } from \"vite\";\nimport { injectSourceMarkers } from \"@spotpatch/compiler\";\nimport type { SourceRegistry } from \"@spotpatch/dev-server\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport { SPOTPATCH_DATA_FLOW_MODULE_ID } from \"../runtime/runtime-injection-plugin.js\";\nimport { createTransformFilter, stripViteQuery } from \"./transform-filter.js\";\n\ninterface TransformPluginInput {\n readonly configure?: (\n config: UserConfig,\n environment: ConfigEnv,\n ) => void | Promise<void>;\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n}\n\ninterface ViteTransformOutput {\n readonly code: string;\n readonly map: string;\n}\n\nfunction createCacheKey(id: string, code: string): string {\n const hash = createHash(\"sha256\").update(code).digest(\"base64url\");\n return `${id}\\0${hash}`;\n}\n\nfunction getDisplayPath(root: string, id: string): string {\n const relative = path.relative(root, stripViteQuery(id));\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function createTransformPlugin(input: TransformPluginInput): Plugin {\n let root = process.cwd();\n let filter = createTransformFilter(root, input.context.getOptions());\n let logger: ResolvedConfig[\"logger\"] | undefined;\n const warnedFiles = new Set<string>();\n const warnedDataFlowDiagnostics = new Set<string>();\n const cache = new Map<string, ViteTransformOutput | null>();\n\n return {\n name: \"spotpatch:transform\",\n apply: \"serve\",\n enforce: \"pre\",\n\n async config(config, environment) {\n await input.configure?.(config, environment);\n },\n\n configResolved(config) {\n root = path.resolve(config.root);\n filter = createTransformFilter(root, input.context.getOptions());\n logger = config.logger;\n },\n\n transform(code, id) {\n if (!filter.shouldTransform(id, code)) {\n return null;\n }\n\n const cleanId = path.resolve(stripViteQuery(id));\n const cacheKey = createCacheKey(cleanId, code);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey) ?? null;\n }\n\n const startedAt = performance.now();\n const options = input.context.getOptions();\n\n try {\n const result = injectSourceMarkers({\n code,\n absolutePath: cleanId,\n root,\n fileId: input.registry.register(cleanId),\n ...(options.dataFlow.enabled\n ? { dataFlow: { helperModule: SPOTPATCH_DATA_FLOW_MODULE_ID } }\n : {}),\n onWarning(warning) {\n logger?.warn(\n `[spotpatch:transform] Existing source marker at ${getDisplayPath(root, id)}:${String(warning.line)}:${String(warning.column)}; preserving application value.`,\n );\n },\n });\n\n if (result?.dataFlow !== undefined) {\n input.registry.registerDataFlowComponents(\n cleanId,\n result.dataFlow.sourceVersion,\n result.dataFlow.anchors.flatMap((anchor) =>\n anchor.kind === \"component\"\n ? [\n {\n componentSourceId: anchor.id,\n line: anchor.line,\n column: anchor.column,\n },\n ]\n : [],\n ),\n );\n for (const diagnostic of result.dataFlow.diagnostics) {\n const warningKey = `${cleanId}:${diagnostic.code}:${String(diagnostic.line)}:${String(diagnostic.column)}`;\n if (warnedDataFlowDiagnostics.has(warningKey)) continue;\n warnedDataFlowDiagnostics.add(warningKey);\n logger?.warn(\n `[spotpatch:data-flow] ${diagnostic.code} at ${getDisplayPath(root, id)}:${String(diagnostic.line)}:${String(diagnostic.column)}; keeping this adapter evidence partial.`,\n );\n }\n }\n\n const output =\n result === undefined\n ? null\n : Object.freeze({\n code: result.code,\n map: result.map.toString(),\n });\n cache.set(cacheKey, output);\n\n if (options.debug) {\n const elapsed = performance.now() - startedAt;\n logger?.info(\n `[spotpatch:transform] ${getDisplayPath(root, id)} ${elapsed.toFixed(2)}ms`,\n );\n }\n\n return output;\n } catch (error: unknown) {\n if (!warnedFiles.has(cleanId)) {\n warnedFiles.add(cleanId);\n const detail =\n options.debug && error instanceof Error ? `: ${error.message}` : \"\";\n logger?.warn(\n `[spotpatch:transform] Failed to transform ${getDisplayPath(root, id)}; using original module${detail}`,\n );\n }\n\n return null;\n }\n },\n };\n}\n","import path from \"node:path\";\n\nimport { createDataFlowSourceFilter, createSourceFilter } from \"@spotpatch/compiler\";\nimport type { ResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\n\nexport function stripViteQuery(id: string): string {\n const queryIndex = id.indexOf(\"?\");\n return queryIndex === -1 ? id : id.slice(0, queryIndex);\n}\n\nexport { isInsideRoot } from \"@spotpatch/compiler\";\n\nexport interface TransformFilter {\n shouldTransform(id: string, code: string): boolean;\n}\n\nexport function createTransformFilter(\n root: string,\n options: ResolvedSpotPatchOptions,\n): TransformFilter {\n const sourceFilter = createSourceFilter(root, options);\n const dataFlowFilter = createDataFlowSourceFilter(root, {\n include: options.include,\n exclude: options.exclude,\n });\n\n return Object.freeze({\n shouldTransform(id: string, code: string): boolean {\n if (\n id.startsWith(\"\\0\") ||\n id.includes(\"virtual:spotpatch\") ||\n id.includes(\"/packages/vite/\") ||\n id.includes(\"\\\\packages\\\\vite\\\\\")\n ) {\n return false;\n }\n\n const cleanId = stripViteQuery(id);\n const absolutePath = path.resolve(cleanId);\n return (\n sourceFilter.shouldTransform(absolutePath, code) ||\n (options.dataFlow.enabled && dataFlowFilter.shouldTransform(absolutePath, code))\n );\n },\n });\n}\n","export {\n createRuntimeAiConfig,\n DEFAULT_EXCLUDE,\n DEFAULT_OPTIONS,\n resolveOptions,\n} from \"@spotpatch/dev-server\";\nexport type {\n FilterEntry,\n ResolvedSpotPatchOptions,\n SimpleAiOptions,\n SpotPatchAiOptions,\n SpotPatchDataFlowOptions,\n SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nexport type ViteSpotPatchOptions = SharedSpotPatchOptions;\nimport type { SpotPatchOptions as SharedSpotPatchOptions } from \"@spotpatch/dev-server\";\n","export { spotPatch } from \"./plugin.js\";\nexport {\n DEFAULT_OPTIONS,\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchDataFlowOptions,\n type SpotPatchOptions,\n type ViteSpotPatchOptions,\n} from \"./options.js\";\nexport {\n DEFAULT_AGENT_LIMITS,\n type AgentApplyMode,\n type AgentCheckDefinition,\n type AgentLimits,\n type AiExecutionOptions,\n type AiModelProfile,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type OpenAICompatibleProviderOptions,\n type SpotPatchEditorPreference,\n} from \"@spotpatch/shared\";\n"],"mappings":"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","names":["path","path","path","path","path","path","createRuntimeAiConfig","resolveOptions"]}
|
|
@@ -1,5 +1,21 @@
|
|
|
1
|
-
var ye=Object.freeze({maximumTargets:20,maximumQuestionCharacters:4e3,maximumAnswerCharacters:4e4,maximumAnswerBlocks:40,maximumSources:64,maximumReadFiles:32,maximumReadBytesPerFile:65536,maximumReadBytesTotal:524288,maximumToolCalls:48,maximumModelTurns:12,jobTimeoutMs:3e5,resultTtlMs:9e5,maximumActiveJobsPerSession:1,maximumRetainedResultsPerSession:1,maximumRetainedEvents:256,maximumEventSubscribers:4,eventHeartbeatMs:15e3,maximumRequestBodyBytes:262144,maximumSearchQueryCharacters:256,maximumSearchResults:64,maximumSearchPreviewCharacters:500,capabilityTimeoutMs:3e4,maximumIdCharacters:128,maximumProfileIdCharacters:64,maximumLabelCharacters:256,maximumRelativePathCharacters:1024,maximumLanguageCharacters:64,maximumPhaseMessageCharacters:1024,maximumExecutors:32,maximumModels:800,contentHashHexCharacters:64}),ke=Object.freeze(["configured-key","managed-codex"]),Ke=Object.freeze(["ready","degraded","unavailable"]),Ee=Object.freeze(["queued","authorizing","running","cancelling","answered","cancelled","failed"]),Me=Object.freeze(["insufficient-evidence","partial-context","source-truncated","source-stale"]),wt=Object.freeze(["insufficient-evidence","partial-context"]),Ue=Object.freeze(["started","succeeded","failed"]),Be=Object.freeze(["one","few","many"]),je=Object.freeze(["exact","probable","approximate"]);var _="/__spotpatch/v1",Ce="X-SpotPatch-Token",fe=Object.freeze({bootstrap:`${_}/bootstrap`,sourceContext:`${_}/source-context`,openEditor:`${_}/open-editor`,dataFlowComponentReport:`${_}/data-flow/component-report`,dataFlowPageReport:`${_}/data-flow/page-report`,agentCapability:`${_}/agent/capability`,agentWorkspaceHealth:`${_}/agent/workspace-health`,agentJobs:`${_}/agent/jobs`,askCapability:`${_}/ask/capability`,askJobs:`${_}/ask/jobs`,externalHandoffCapability:`${_}/external-handoff/capability`,externalHandoffPublish:`${_}/external-handoff/publish`,externalHandoffStatus:`${_}/external-handoff/status`,externalHandoffResolveDelivery:`${_}/external-handoff/resolve-delivery`,externalAgentControlStatus:`${_}/external-agent/control/status`,externalAgentControlConnect:`${_}/external-agent/control/connect`,externalAgentControlDisconnect:`${_}/external-agent/control/disconnect`,externalAgentControlCancel:`${_}/external-agent/control/cancel`,externalAgentEvents:`${_}/external-agent/events`,externalAgentResult:`${_}/external-agent/result`});function ge(e,t,n={}){let s=`${fe.askJobs}/${encodeURIComponent(e)}/${t}`;if(t!=="events"&&n.afterSequence!==void 0)throw new RangeError("afterSequence is only valid for the events endpoint.");if(n.afterSequence===void 0)return s;if(!Number.isSafeInteger(n.afterSequence)||n.afterSequence<0)throw new RangeError("afterSequence must be a non-negative safe integer.");return`${s}?afterSequence=${String(n.afterSequence)}`}var Tt={ASK_DISABLED:"ASK_DISABLED",ASK_SELECTION_REQUIRED:"ASK_SELECTION_REQUIRED",ASK_SELECTION_STALE:"ASK_SELECTION_STALE",ASK_QUESTION_INVALID:"ASK_QUESTION_INVALID",ASK_EXECUTOR_UNAVAILABLE:"ASK_EXECUTOR_UNAVAILABLE",ASK_TIMEOUT:"ASK_TIMEOUT",ASK_CONSENT_REQUIRED:"ASK_CONSENT_REQUIRED",ASK_BUSY:"ASK_BUSY",ASK_IDEMPOTENCY_CONFLICT:"ASK_IDEMPOTENCY_CONFLICT",ASK_SOURCE_SCOPE_DENIED:"ASK_SOURCE_SCOPE_DENIED",ASK_LIMIT_EXCEEDED:"ASK_LIMIT_EXCEEDED",ASK_ANSWER_INVALID:"ASK_ANSWER_INVALID",ASK_WRITE_ATTEMPTED:"ASK_WRITE_ATTEMPTED",ASK_CANCELLED:"ASK_CANCELLED",ASK_RESULT_EXPIRED:"ASK_RESULT_EXPIRED",ASK_PROTOCOL_INCOMPATIBLE:"ASK_PROTOCOL_INCOMPATIBLE"},_t=Object.freeze({INVALID_REQUEST:"INVALID_REQUEST",INVALID_TOKEN:"INVALID_TOKEN",ORIGIN_NOT_ALLOWED:"ORIGIN_NOT_ALLOWED",...Tt,INTERNAL_ERROR:"INTERNAL_ERROR"}),It=Object.values(_t);function Se(e){return typeof e=="string"&&It.includes(e)}function D(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function T(e,t,n=[]){let s=Object.keys(e),g=new Set([...t,...n]);return t.every(r=>r in e)&&s.every(r=>g.has(r))}function H(e,t){return typeof e=="string"&&t.includes(e)}function L(e){return typeof e=="string"&&e.trim().length>0}function J(e){return typeof e=="string"&&e.length>0&&e.length<=128&&/^[A-Za-z0-9_-]+$/u.test(e)}function ae(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}function Je(e){return Number.isSafeInteger(e)&&Number(e)>0}function qe(e){return Se(e)&&e.startsWith("ASK_")}function we(e){return Array.isArray(e)&&e.every(t=>J(t))}function Te(e){return new Set(e).size===e.length}function vt(e){return!D(e)||!T(e,["executorId","kind","label","requestedModelLabel","effectiveModelLabel","state","providerDataConsentRequired","readOnlyProven"],["errorCode","models"])||!J(e.executorId)||!H(e.kind,ke)||!L(e.label)||!L(e.requestedModelLabel)||!L(e.effectiveModelLabel)||e.models!==void 0&&(!Array.isArray(e.models)||e.models.length===0||e.models.length>ye.maximumModels||!e.models.every(t=>L(t)&&t.length<=ye.maximumLabelCharacters)||!Te(e.models))||!H(e.state,Ke)||typeof e.providerDataConsentRequired!="boolean"||typeof e.readOnlyProven!="boolean"||e.errorCode!==void 0&&!qe(e.errorCode)?!1:e.state==="ready"?e.readOnlyProven&&e.errorCode===void 0:e.errorCode!==void 0}function st(e){if(!D(e)||!T(e,["schemaVersion","enabled","executors","safety","checkedAt"])||e.schemaVersion!==1||typeof e.enabled!="boolean"||!Array.isArray(e.executors)||!e.executors.every(vt)||!D(e.safety)||!T(e.safety,["selectionRequired","singleTurn","writesAllowed","historyStored"])||e.safety.selectionRequired!==!0||e.safety.singleTurn!==!0||e.safety.writesAllowed!==!1||e.safety.historyStored!==!1||!ae(e.checkedAt))return!1;let t=e.executors.map(n=>n.executorId);return(e.enabled||e.executors.length===0)&&Te(t)}function at(e){return D(e)&&T(e,["executorId","kind","label","modelLabel"])&&J(e.executorId)&&H(e.kind,ke)&&L(e.label)&&L(e.modelLabel)}function he(e){if(!D(e)||!T(e,["schemaVersion","jobId","selectionId","status","executor","createdAt","updatedAt","canCancel"],["phaseMessage","errorCode"])||e.schemaVersion!==1||!J(e.jobId)||!J(e.selectionId)||!H(e.status,Ee)||!at(e.executor)||!ae(e.createdAt)||!ae(e.updatedAt)||Date.parse(e.updatedAt)<Date.parse(e.createdAt)||typeof e.canCancel!="boolean"||e.phaseMessage!==void 0&&!L(e.phaseMessage)||e.errorCode!==void 0&&!qe(e.errorCode))return!1;let t=["queued","authorizing","running"].includes(e.status);return e.canCancel!==t?!1:e.status==="cancelled"?e.errorCode==="ASK_CANCELLED":e.status==="failed"?e.errorCode!==void 0&&e.errorCode!=="ASK_CANCELLED":e.errorCode===void 0}function nt(e){return!(!D(e)||!T(e,["sourceId","label","relativePath","fileId","startLine","endLine","confidence","targetIds","contentHash"],["sourceVersion"])||!J(e.sourceId)||!L(e.label)||!L(e.relativePath)||e.relativePath.startsWith("/")||e.relativePath.includes("\\")||e.relativePath.split("/").some(t=>t===""||t==="."||t==="..")||!J(e.fileId)||!Je(e.startLine)||!Je(e.endLine)||e.endLine<e.startLine||!H(e.confidence,je)||!we(e.targetIds)||e.targetIds.length===0||!Te(e.targetIds)||e.sourceVersion!==void 0&&!L(e.sourceVersion)||typeof e.contentHash!="string"||!/^[a-f0-9]{64}$/u.test(e.contentHash))}function ot(e){return D(e)&&T(e,["code"])&&H(e.code,Me)}function rt(e){return!D(e)||typeof e.kind!="string"?!1:e.kind==="paragraph"?T(e,["kind","text","sourceIds"])&&L(e.text)&&we(e.sourceIds):e.kind==="code"?T(e,["kind","code","sourceIds"],["language"])&&typeof e.code=="string"&&e.code.length>0&&we(e.sourceIds)&&(e.language===void 0||L(e.language)):e.kind!=="list"||!T(e,["kind","items"])?!1:Array.isArray(e.items)&&e.items.length>0&&e.items.every(t=>D(t)&&T(t,["text","sourceIds"])&&L(t.text)&&we(t.sourceIds))}function Rt(e){if(!D(e)||!T(e,["schemaVersion","jobId","selectionId","contextHash","executor","blocks","sources","warnings","createdAt","expiresAt"])||e.schemaVersion!==1||!J(e.jobId)||!J(e.selectionId)||typeof e.contextHash!="string"||!/^[a-f0-9]{64}$/u.test(e.contextHash)||!at(e.executor)||!Array.isArray(e.blocks)||e.blocks.length===0||!e.blocks.every(rt)||!Array.isArray(e.sources)||!e.sources.every(nt)||!Array.isArray(e.warnings)||!e.warnings.every(ot)||!ae(e.createdAt)||!ae(e.expiresAt)||Date.parse(e.expiresAt)<=Date.parse(e.createdAt))return!1;let t=e.sources.filter(nt),n=e.blocks.filter(rt),s=e.warnings.filter(ot),g=t.map(d=>d.sourceId);if(!Te(g))return!1;let r=new Set(g),a=n.flatMap(d=>d.kind==="list"?d.items.flatMap(k=>k.sourceIds):d.sourceIds);return a.every(d=>r.has(d))&&g.every(d=>a.includes(d))&&(a.length>0||s.some(d=>d.code==="insufficient-evidence"))}function it(e){return!D(e)||!T(e,["snapshot"],["result"])||!he(e.snapshot)||e.result!==void 0&&!Rt(e.result)?!1:e.snapshot.status==="answered"===(e.result!==void 0)&&(e.result===void 0||e.result.jobId===e.snapshot.jobId&&e.result.selectionId===e.snapshot.selectionId&&e.result.executor.executorId===e.snapshot.executor.executorId)}function ct(e){return!D(e)||!T(e,["schemaVersion","sequence","jobId","status","timestamp","type"],["snapshot","message","activity","state","errorCode"])||e.schemaVersion!==1||!Je(e.sequence)||!J(e.jobId)||!H(e.status,Ee)||!ae(e.timestamp)?!1:e.type==="snapshot"?T(e,["schemaVersion","sequence","jobId","status","timestamp","type","snapshot"])&&he(e.snapshot)&&e.snapshot.jobId===e.jobId&&e.snapshot.status===e.status:e.type==="phase"?T(e,["schemaVersion","sequence","jobId","status","timestamp","type","message"])&&L(e.message)&&!["answered","cancelled","failed"].includes(e.status):e.type==="answer-ready"?T(e,["schemaVersion","sequence","jobId","status","timestamp","type"])&&e.status==="answered":e.type==="error"?T(e,["schemaVersion","sequence","jobId","status","timestamp","type","errorCode"])&&qe(e.errorCode)&&(e.status==="cancelled"&&e.errorCode==="ASK_CANCELLED"||e.status==="failed"&&e.errorCode!=="ASK_CANCELLED"):e.type!=="read-activity"||!T(e,["schemaVersion","sequence","jobId","status","timestamp","type","activity","state"])||e.status!=="running"||!D(e.activity)||!H(e.state,Ue)?!1:e.activity.kind==="source"?T(e.activity,["kind","sourceId","relativePath"])&&J(e.activity.sourceId)&&L(e.activity.relativePath):e.activity.kind==="file-count"&&T(e.activity,["kind","bucket"])&&H(e.activity.bucket,Be)}var Lt=2e6,dt=1e5,Ot=4e6,S=class extends Error{constructor(n){super("SpotPatch Contextual Ask request failed.");this.code=n;this.name="ContextualAskApiError"}code};function $e(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function pt(e){if(!(!$e(e)&&!Array.isArray(e)||Object.isFrozen(e))){for(let t of Object.values(e))pt(t);Object.freeze(e)}}function be(e){return pt(e),e}function ut(e){try{return JSON.parse(e)}catch{throw new S}}async function Nt(e,t){let n=Number(e.headers.get("content-length"));if(Number.isFinite(n)&&n>t)throw await e.body?.cancel(),new S;if(e.body===null)throw new S;let s=e.body.getReader(),g=new TextDecoder("utf-8",{fatal:!0}),r=0,a="";try{for(;;){let d=await s.read();if(d.done)return a+g.decode();if(r+=d.value.byteLength,r>t)throw await s.cancel(),new S;a+=g.decode(d.value,{stream:!0})}}catch(d){throw d instanceof S||d instanceof DOMException&&d.name==="AbortError"?d:new S}finally{s.releaseLock()}}async function lt(e){let t=ut(await Nt(e,Lt));if(!$e(t))throw new S;if(!e.ok){let n=t.ok===!1&&$e(t.error)&&Se(t.error.code)?t.error.code:void 0;throw new S(n)}if(t.ok!==!0||!("data"in t))throw new S;return t.data}function _e(e){return e instanceof S?e.code:void 0}function ft(e){let t=new Set;function n(){for(let r of t)r.abort();t.clear()}async function s(r,a,d){let k=new AbortController;t.add(k);try{let v=await e.fetch(r,{method:a,headers:{...d===void 0?{}:{"Content-Type":"application/json"},[Ce]:e.sessionToken},...d===void 0?{}:{body:JSON.stringify(d)},signal:k.signal});return await lt(v)}finally{t.delete(k)}}async function g(r,a,d){let k=new AbortController;t.add(k);try{let v=await e.fetch(ge(r,"events",{afterSequence:a}),{method:"GET",headers:{[Ce]:e.sessionToken},signal:k.signal});if(!v.ok){await lt(v);return}if(v.body===null)throw new S;let E=v.body.getReader(),b=new TextDecoder("utf-8",{fatal:!0}),P="",O=0,l=a,m=u=>{if(u.trim().length===0)return;if(new TextEncoder().encode(u).byteLength>dt)throw new S;let A=ut(u);if(!ct(A)||A.jobId!==r||A.sequence<=l)throw new S;l=A.sequence,d(be(A))};try{for(;;){let u=await E.read();if(u.done){m(P+b.decode());return}if(O+=u.value.byteLength,O>Ot)throw await E.cancel(),new S;P+=b.decode(u.value,{stream:!0});let A=P.split(`
|
|
2
|
-
`);if(P=A.pop()??"",new TextEncoder().encode(P).byteLength>dt)throw await E.cancel(),new S;for(let N of A)m(N)}}catch(u){throw u instanceof S||u instanceof DOMException&&u.name==="AbortError"?u:new S}finally{E.releaseLock()}}finally{t.delete(k)}}return Object.freeze({async capability(){let r=await s(fe.askCapability,"GET");if(!st(r))throw new S;return be(r)},async cancelJob(r){let a=await s(ge(r,"cancel"),"POST",{});if(!he(a)||a.jobId!==r)throw new S;return be(a)},cancelPending:n,async createJob(r){let a=await s(fe.askJobs,"POST",r);if(!he(a)||a.selectionId!==r.envelope.selection.selectionId||a.executor.executorId!==r.executorId)throw new S;return be(a)},dispose:n,events:g,async result(r){let a=await s(ge(r,"result"),"GET");if(!it(a)||a.snapshot.jobId!==r)throw new S;return be(a)}})}function Ve(e){return e instanceof DOMException&&e.name==="AbortError"}function gt(e){let t=!1,n=0,s=!1,g,r,a="",d=!1,k=!1,v=new Map,E=e.api??ft({fetch:e.fetch,sessionToken:e.sessionToken});function b(i){return t&&n===i}function P(i){let x=e.getSelection();if(i.length===0||i.length>4e3||x===void 0)return;let w=new Date().toISOString();return{schemaVersion:1,taskId:e.createId(),selection:{schemaVersion:1,selectionId:e.createId(),locale:x.locale,targets:x.targets.map(y=>({targetId:y.id,page:y.page,source:y.source,react:{...y.react,componentStack:[...y.react.componentStack]},element:y.element,styles:{...y.styles,classNames:[...y.styles.classNames],matchedRules:y.styles.matchedRules.map(F=>({...F})),computed:{...y.styles.computed},warnings:[...y.styles.warnings]},...y.code===void 0?{}:{code:y.code},warnings:[]})),createdAt:w},task:{kind:"ask",question:i},createdAt:w}}async function O(){if(d)return;let i=n;e.panel.renderCapability(void 0);try{let x=await E.capability();if(!b(i))return;d=!0,e.panel.renderCapability(x);let w=e.panel.readExecutorId();e.panel.setConsent(w!==void 0&&v.get(w)===!0)}catch(x){if(!b(i)||Ve(x))return;e.panel.renderError(_e(x))}}function l(i,x){b(x)&&(e.panel.renderEvent(i),i.type==="snapshot"&&(g=i.snapshot))}async function m(){if(s)return;let i=e.panel.readQuestion(),x=e.panel.readExecutorId(),w=P(i);if(i.length===0||x===void 0||!e.panel.readConsent()||w===void 0)return;let y=++n,F=e.panel.readModel();a=i,s=!0,e.onBusyChange(!0),r=void 0,g=void 0,e.panel.setBusy(!0);try{let B=await E.createJob({schemaVersion:1,requestId:e.createId(),envelope:w,executorId:x,...F===void 0?{}:{model:F},providerDataConsent:!0});if(!b(y)||(g=B,e.panel.renderJob(B),await E.events(B.jobId,0,de=>{l(de,y)}),!b(y)))return;let $=await E.result(B.jobId);if(!b(y))return;if(g=$.snapshot,s=!1,e.onBusyChange(!1),$.result===void 0){e.panel.renderJob($.snapshot),$.snapshot.status==="failed"&&e.panel.renderError($.snapshot.errorCode);return}r=$.result,e.panel.renderAnswer($.result,!1)}catch(B){if(!b(y)||Ve(B))return;s=!1,e.onBusyChange(!1),e.panel.renderError(_e(B))}finally{b(y)&&(s=!1,e.panel.setBusy(!1))}}async function u(){if(!s||g?.canCancel!==!0)return;let i=n;try{let x=await E.cancelJob(g.jobId);if(!b(i))return;g=x,s=!1,e.onBusyChange(!1),e.panel.renderJob(x),e.panel.setBusy(!1)}catch(x){if(!b(i)||Ve(x))return;s=!1,e.onBusyChange(!1),e.panel.renderError(_e(x))}}function A(){n+=1;let i=g;s=!1,e.onBusyChange(!1),g=void 0,E.cancelPending(),i?.canCancel===!0&&E.cancelJob(i.jobId).catch(()=>{}),e.panel.setBusy(!1)}function N(){s&&A(),n+=1,g=void 0,r=void 0,a="",e.panel.clear(),e.panel.focusQuestion()}function q(){let i=e.panel.answerPlainText();i.length===0||e.clipboard===void 0||e.clipboard.writeText(i).then(()=>{e.panel.notify("copied")}).catch(()=>{e.panel.notify("copy-failed")})}function te(){if(r===void 0||s)return;let i=e.panel.answerPlainText().trim().slice(0,4e3);if(i.length===0)return;let x=Object.freeze({kind:"contextual-ask",askJobId:r.jobId,question:a,answerDigest:i,sourceIds:r.sources.map(w=>w.sourceId)});e.onConvert(x),e.panel.setOrigin(x),e.panel.setMode("change"),e.panel.notify("converted")}function ne(i){let x=e.panel.selectedSourceId(i.target);if(x===void 0)return;let w=e.panel.sourceById(x);w!==void 0&&e.onOpenSource(w).catch(()=>{e.panel.notify("source-open-failed")})}function ie(i){i.target!==e.panel.questionInput||i.key!=="Enter"||k||i.isComposing||!i.metaKey&&!i.ctrlKey||(i.preventDefault(),m())}function I(){let i=e.panel.readExecutorId();e.panel.setConsent(i!==void 0&&v.get(i)===!0)}function W(){k=!0}function oe(){k=!1}function re(){let i=e.panel.readExecutorId();i!==void 0&&v.set(i,e.panel.readConsent())}function U(){m()}function R(){u()}function se(){t||(t=!0,e.panel.submitButton.addEventListener("click",U),e.panel.cancelButton.addEventListener("click",R),e.panel.newQuestionButton.addEventListener("click",N),e.panel.copyButton.addEventListener("click",q),e.panel.convertButton.addEventListener("click",te),e.panel.executorSelect.addEventListener("change",I),e.panel.consentCheckbox.addEventListener("change",re),e.panel.questionInput.addEventListener("keydown",ie),e.panel.questionInput.addEventListener("compositionstart",W),e.panel.questionInput.addEventListener("compositionend",oe),e.panel.root.addEventListener("click",ne),O())}function ce(){t&&(A(),t=!1,e.panel.submitButton.removeEventListener("click",U),e.panel.cancelButton.removeEventListener("click",R),e.panel.newQuestionButton.removeEventListener("click",N),e.panel.copyButton.removeEventListener("click",q),e.panel.convertButton.removeEventListener("click",te),e.panel.executorSelect.removeEventListener("change",I),e.panel.consentCheckbox.removeEventListener("change",re),e.panel.questionInput.removeEventListener("keydown",ie),e.panel.questionInput.removeEventListener("compositionstart",W),e.panel.questionInput.removeEventListener("compositionend",oe),e.panel.root.removeEventListener("click",ne),E.dispose())}return Object.freeze({beginSelection(){n+=1,s=!1,e.onBusyChange(!1),g=void 0,r=void 0,a="",e.panel.clear(),O()},cancelPending:A,dispose:ce,isBusy:()=>s,mount:se,selectionChanged(){r!==void 0&&e.panel.renderAnswer(r,!0)}})}var Pt=Symbol.for("spotpatch.contextual-ask.v1");function ht(e){globalThis[Pt]=e}var bt="data-spotpatch-ui",Yt=Object.freeze({highlight:2147483646,controls:2147483647}),Zt=Object.freeze({compactInset:8,compactViewportWidth:520,desktopInset:24,dragActivationDistance:6,edgeSnapDistance:20,workbenchMaxHeight:620,workbenchMaxWidth:460});function c(e,t){let n=e.createElement(t);return n.setAttribute(bt,""),n}function K(e,t,n=""){let s=c(e,"button");return s.type="button",s.className=n,s.textContent=t,s}function We(e,t){let n=c(e,"div");n.className="spotpatch-ask-executor-picker";let s=K(e,"","spotpatch-ask-executor");s.id=`spotpatch-ask-picker-${Math.random().toString(36).slice(2)}`,s.setAttribute("role","combobox"),s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-expanded","false");let g=c(e,"span");s.append(g);let r=c(e,"div");r.id=`${s.id}-menu`,r.className="spotpatch-ask-executor-menu",r.setAttribute("role","listbox"),r.hidden=!0,s.setAttribute("aria-controls",r.id);let a=c(e,"select");a.className="spotpatch-ask-executor-native",a.tabIndex=-1,a.setAttribute("aria-hidden","true"),n.append(s,r,a);function d(l=!1){r.hidden||(r.hidden=!0,s.setAttribute("aria-expanded","false"),s.removeAttribute("aria-activedescendant"),l&&s.focus({preventScroll:!0}),t())}function k(l){let m=[...r.children],u=m[l];if(u===void 0)return;for(let q of m)q.dataset.active=String(q===u);s.setAttribute("aria-activedescendant",u.id);let A=u.getBoundingClientRect(),N=r.getBoundingClientRect();A.top<N.top?r.scrollTop-=N.top-A.top:A.bottom>N.bottom&&(r.scrollTop+=A.bottom-N.bottom)}function v(){s.disabled||!r.hidden||(r.hidden=!1,s.setAttribute("aria-expanded","true"),k(Math.max(0,a.selectedIndex)),t())}function E(){g.textContent=a.selectedOptions[0]?.textContent??"",s.title=g.textContent,s.dataset.empty=String(a.value.length===0);for(let l of[...r.children])l.setAttribute("aria-selected",String(l.dataset.value===a.value))}function b(l){s.disabled||(a.value=l,E(),d(!0),a.dispatchEvent(new Event("change",{bubbles:!0})))}function P(){d(),r.replaceChildren();for(let[l,m]of[...a.options].entries()){let u=c(e,"div");u.id=`${r.id}-${String(l)}`,u.className="spotpatch-ask-executor-option",u.setAttribute("role","option"),u.dataset.value=m.value,u.textContent=m.textContent,u.title=m.textContent,u.addEventListener("pointerdown",A=>{A.preventDefault()}),u.addEventListener("click",()=>{b(m.value)}),r.append(u)}E()}s.addEventListener("click",()=>{r.hidden?v():d()}),s.addEventListener("keydown",l=>{if(l.key==="Escape"&&!r.hidden){l.preventDefault(),l.stopPropagation(),d();return}if(l.key==="Tab"){d();return}if(["Enter"," "].includes(l.key)&&!r.hidden){l.preventDefault();let A=[...r.children].find(N=>N.id===s.getAttribute("aria-activedescendant"));A?.dataset.value!==void 0&&b(A.dataset.value);return}if(!["ArrowDown","ArrowUp","Home","End"].includes(l.key))return;if(l.preventDefault(),r.hidden){v();return}let m=[...r.children],u=m.findIndex(A=>A.id===s.getAttribute("aria-activedescendant"));k(l.key==="Home"?0:l.key==="End"?m.length-1:(u+(l.key==="ArrowDown"?1:-1)+m.length)%m.length)}),n.addEventListener("focusout",l=>{(!(l.relatedTarget instanceof Node)||!n.contains(l.relatedTarget))&&d()});let O=l=>{l.composedPath().includes(n)||d()};return e.addEventListener("pointerdown",O),a.addEventListener("change",E),{root:n,trigger:s,select:a,rebuild:P,close:d,setDisabled(l){a.disabled=l,s.disabled=l||a.options.length<2,s.dataset.expandable=String(!s.disabled),s.disabled&&d()},dispose(){e.removeEventListener("pointerdown",O)}}}var Dt=Object.freeze({mode:Object.freeze({ask:"Ask",change:"Change",label:"Task mode"}),title:"Ask about this selection",subtitle:"One question, one sourced answer. SpotPatch will not write code.",questionLabel:"Question",questionPlaceholder:"What does this component do?",suggestionsLabel:"Suggested questions",suggestions:Object.freeze(["What does this component do?","Where does its data come from?","Why is it implemented this way?"]),executorLabel:"Read-only executor",modelLabel:"Model",loadingExecutors:"Checking available executors…",noExecutor:"No verified read-only executor is available.",unavailable:"unavailable",consent:"Allow the selected source snapshot to be sent to this provider for this answer.",dataSummary:(e,t)=>`${String(e)} selected element${e===1?"":"s"} · ${String(t)} source-backed`,safety:"Single turn · read-only · no history",submit:"Ask",cancel:"Cancel",newQuestion:"Start over",copy:"Copy answer",convert:"Turn into change request",answerTitle:"Answer",sourcesTitle:"Sources",stale:"The selection changed after this answer. Ask again before relying on it.",convertedTitle:"From contextual answer",convertedBody:"The answer and source references remain local and have not started a change.",status:Object.freeze({queued:"Queued",authorizing:"Verifying read-only access",running:"Analyzing selected source",cancelling:"Cancelling",answered:"Answer ready",cancelled:"Cancelled",failed:"Could not answer"}),sourceLabel:(e,t,n)=>`${e}:${String(t)}${n===t?"":`–${String(n)}`}`,readSource:e=>`Reading ${e}`,readFiles:e=>`Reading ${e} files`,copied:"Answer copied.",copyFailed:"The answer could not be copied.",sourceOpenFailed:"The source could not be opened.",converted:"Switched to Change with the answer attached as local context.",error:e=>e===void 0?"SpotPatch could not complete this question.":{INVALID_TOKEN:"The local SpotPatch session expired. Refresh the page.",ORIGIN_NOT_ALLOWED:"The local request failed its same-origin security check. Refresh or restart the dev server.",ASK_DISABLED:"Contextual Ask is disabled.",ASK_SELECTION_REQUIRED:"Select at least one element first.",ASK_SELECTION_STALE:"The selected source changed. Refresh the selection and ask again.",ASK_QUESTION_INVALID:"Enter one valid question.",ASK_EXECUTOR_UNAVAILABLE:"The selected read-only executor is unavailable.",ASK_TIMEOUT:"The read-only executor took too long to answer. Try the question again.",ASK_CONSENT_REQUIRED:"Confirm provider data access for this answer.",ASK_BUSY:"Another workspace task is active. Try again when it finishes.",ASK_CANCELLED:"The question was cancelled.",ASK_RESULT_EXPIRED:"This answer has expired. Ask again.",ASK_WRITE_ATTEMPTED:"The executor attempted a write and was stopped.",ASK_ANSWER_INVALID:"The executor returned an invalid sourced answer.",ASK_PROTOCOL_INCOMPATIBLE:"The executor protocol is incompatible.",ASK_LIMIT_EXCEEDED:"The selected context is too large.",ASK_SOURCE_SCOPE_DENIED:"A requested source was outside the granted snapshot."}[e]??"SpotPatch could not complete this question.",warning:e=>e==="insufficient-evidence"?"The selected source did not contain enough evidence for a complete answer.":"Some source references were omitted because they could not be verified."}),Kt=Object.freeze({mode:Object.freeze({ask:"问答",change:"修改",label:"任务模式"}),title:"询问所选元素",subtitle:"一次提问,一次带源码引用的回答;SpotPatch 不会写入代码。",questionLabel:"问题",questionPlaceholder:"这个组件是做什么的?",suggestionsLabel:"推荐问题",suggestions:Object.freeze(["这个组件是做什么的?","它的数据从哪里来?","为什么要这样实现?"]),executorLabel:"只读执行器",modelLabel:"模型",loadingExecutors:"正在检查可用执行器…",noExecutor:"目前没有通过只读验证的执行器。",unavailable:"不可用",consent:"允许本次回答将所选源码快照发送给该提供商。",dataSummary:(e,t)=>`${String(e)} 个已选元素 · ${String(t)} 个具备源码上下文`,safety:"单轮 · 只读 · 不保存历史",submit:"提问",cancel:"取消",newQuestion:"重新开始",copy:"复制回答",convert:"转成修改请求",answerTitle:"回答",sourcesTitle:"源码引用",stale:"回答后选择已发生变化。请重新提问后再采信此回答。",convertedTitle:"来自上下文问答",convertedBody:"回答与源码引用仅作为本地上下文保留,尚未发起任何修改。",status:Object.freeze({queued:"已排队",authorizing:"正在验证只读权限",running:"正在分析所选源码",cancelling:"正在取消",answered:"回答已就绪",cancelled:"已取消",failed:"无法回答"}),sourceLabel:(e,t,n)=>`${e}:${String(t)}${n===t?"":`–${String(n)}`}`,readSource:e=>`正在读取 ${e}`,readFiles:e=>`正在读取 ${e} 个文件`,copied:"回答已复制。",copyFailed:"无法复制回答。",sourceOpenFailed:"无法打开源码。",converted:"已切换到修改模式,并把回答作为本地上下文附带。",error:e=>e===void 0?"SpotPatch 未能完成本次提问。":{INVALID_TOKEN:"本地 SpotPatch 会话已失效,请刷新页面。",ORIGIN_NOT_ALLOWED:"本地请求未通过同源安全校验,请刷新页面或重启开发服务。",ASK_DISABLED:"上下文问答未启用。",ASK_SELECTION_REQUIRED:"请先选择至少一个元素。",ASK_SELECTION_STALE:"所选源码已经变化,请刷新选择后重新提问。",ASK_QUESTION_INVALID:"请输入一个有效的问题。",ASK_EXECUTOR_UNAVAILABLE:"所选只读执行器当前不可用。",ASK_TIMEOUT:"只读执行器未能在限定时间内返回回答,请重新提问。",ASK_CONSENT_REQUIRED:"请确认本次回答的提供商数据访问。",ASK_BUSY:"工作区正在执行其他任务,请稍后重试。",ASK_CANCELLED:"本次提问已取消。",ASK_RESULT_EXPIRED:"回答已过期,请重新提问。",ASK_WRITE_ATTEMPTED:"执行器尝试写入,已被阻止。",ASK_ANSWER_INVALID:"执行器返回的带引用回答无效。",ASK_PROTOCOL_INCOMPATIBLE:"执行器协议不兼容。",ASK_LIMIT_EXCEEDED:"所选上下文过大。",ASK_SOURCE_SCOPE_DENIED:"请求的源码超出了授权快照范围。"}[e]??"SpotPatch 未能完成本次提问。",warning:e=>e==="insufficient-evidence"?"所选源码不足以支持完整回答。":"部分源码引用因无法验证而被省略。"});function ze(e){return e==="zh-CN"?Kt:Dt}function Mt(e){let t=e.createElement("style");return t.textContent=`
|
|
1
|
+
var ye=Object.freeze({maximumTargets:20,maximumQuestionCharacters:4e3,maximumAnswerCharacters:4e4,maximumAnswerBlocks:40,maximumSources:64,maximumReadFiles:32,maximumReadBytesPerFile:65536,maximumReadBytesTotal:524288,maximumToolCalls:48,maximumModelTurns:12,jobTimeoutMs:3e5,resultTtlMs:9e5,maximumActiveJobsPerSession:1,maximumRetainedResultsPerSession:1,maximumRetainedEvents:256,maximumEventSubscribers:4,eventHeartbeatMs:15e3,maximumRequestBodyBytes:262144,maximumSearchQueryCharacters:256,maximumSearchResults:64,maximumSearchPreviewCharacters:500,capabilityTimeoutMs:3e4,maximumIdCharacters:128,maximumProfileIdCharacters:64,maximumLabelCharacters:256,maximumRelativePathCharacters:1024,maximumLanguageCharacters:64,maximumPhaseMessageCharacters:1024,maximumExecutors:32,maximumModels:800,contentHashHexCharacters:64}),Ee=Object.freeze(["configured-key","managed-codex"]),Ke=Object.freeze(["ready","degraded","unavailable"]),ke=Object.freeze(["queued","authorizing","running","cancelling","answered","cancelled","failed"]),Me=Object.freeze(["insufficient-evidence","partial-context","source-truncated","source-stale"]),Tt=Object.freeze(["insufficient-evidence","partial-context"]),Ue=Object.freeze(["started","succeeded","failed"]),Be=Object.freeze(["one","few","many"]),je=Object.freeze(["exact","probable","approximate"]);var I="/__spotpatch/v1",Ce="X-SpotPatch-Token",fe=Object.freeze({bootstrap:`${I}/bootstrap`,sourceContext:`${I}/source-context`,openEditor:`${I}/open-editor`,dataFlowComponentReport:`${I}/data-flow/component-report`,dataFlowPageReport:`${I}/data-flow/page-report`,agentCapability:`${I}/agent/capability`,agentWorkspaceHealth:`${I}/agent/workspace-health`,agentJobs:`${I}/agent/jobs`,askCapability:`${I}/ask/capability`,askJobs:`${I}/ask/jobs`,externalHandoffCapability:`${I}/external-handoff/capability`,externalHandoffPublish:`${I}/external-handoff/publish`,externalHandoffStatus:`${I}/external-handoff/status`,externalHandoffResolveDelivery:`${I}/external-handoff/resolve-delivery`,externalAgentControlStatus:`${I}/external-agent/control/status`,externalAgentControlConnect:`${I}/external-agent/control/connect`,externalAgentControlDisconnect:`${I}/external-agent/control/disconnect`,externalAgentControlCancel:`${I}/external-agent/control/cancel`,externalAgentEvents:`${I}/external-agent/events`,externalAgentResult:`${I}/external-agent/result`});function ge(e,t,n={}){let s=`${fe.askJobs}/${encodeURIComponent(e)}/${t}`;if(t!=="events"&&n.afterSequence!==void 0)throw new RangeError("afterSequence is only valid for the events endpoint.");if(n.afterSequence===void 0)return s;if(!Number.isSafeInteger(n.afterSequence)||n.afterSequence<0)throw new RangeError("afterSequence must be a non-negative safe integer.");return`${s}?afterSequence=${String(n.afterSequence)}`}var _t={ASK_DISABLED:"ASK_DISABLED",ASK_SELECTION_REQUIRED:"ASK_SELECTION_REQUIRED",ASK_SELECTION_STALE:"ASK_SELECTION_STALE",ASK_QUESTION_INVALID:"ASK_QUESTION_INVALID",ASK_EXECUTOR_UNAVAILABLE:"ASK_EXECUTOR_UNAVAILABLE",ASK_TIMEOUT:"ASK_TIMEOUT",ASK_CONSENT_REQUIRED:"ASK_CONSENT_REQUIRED",ASK_BUSY:"ASK_BUSY",ASK_IDEMPOTENCY_CONFLICT:"ASK_IDEMPOTENCY_CONFLICT",ASK_SOURCE_SCOPE_DENIED:"ASK_SOURCE_SCOPE_DENIED",ASK_LIMIT_EXCEEDED:"ASK_LIMIT_EXCEEDED",ASK_ANSWER_INVALID:"ASK_ANSWER_INVALID",ASK_WRITE_ATTEMPTED:"ASK_WRITE_ATTEMPTED",ASK_CANCELLED:"ASK_CANCELLED",ASK_RESULT_EXPIRED:"ASK_RESULT_EXPIRED",ASK_PROTOCOL_INCOMPATIBLE:"ASK_PROTOCOL_INCOMPATIBLE"},It=Object.freeze({INVALID_REQUEST:"INVALID_REQUEST",INVALID_TOKEN:"INVALID_TOKEN",ORIGIN_NOT_ALLOWED:"ORIGIN_NOT_ALLOWED",..._t,INTERNAL_ERROR:"INTERNAL_ERROR"}),vt=Object.values(It);function Se(e){return typeof e=="string"&&vt.includes(e)}function D(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function _(e,t,n=[]){let s=Object.keys(e),f=new Set([...t,...n]);return t.every(r=>r in e)&&s.every(r=>f.has(r))}function H(e,t){return typeof e=="string"&&t.includes(e)}function O(e){return typeof e=="string"&&e.trim().length>0}function q(e){return typeof e=="string"&&e.length>0&&e.length<=128&&/^[A-Za-z0-9_-]+$/u.test(e)}function ae(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}function Je(e){return Number.isSafeInteger(e)&&Number(e)>0}function qe(e){return Se(e)&&e.startsWith("ASK_")}function we(e){return Array.isArray(e)&&e.every(t=>q(t))}function Te(e){return new Set(e).size===e.length}function Rt(e){return!D(e)||!_(e,["executorId","kind","label","requestedModelLabel","effectiveModelLabel","state","providerDataConsentRequired","readOnlyProven"],["errorCode","models"])||!q(e.executorId)||!H(e.kind,Ee)||!O(e.label)||!O(e.requestedModelLabel)||!O(e.effectiveModelLabel)||e.models!==void 0&&(!Array.isArray(e.models)||e.models.length===0||e.models.length>ye.maximumModels||!e.models.every(t=>O(t)&&t.length<=ye.maximumLabelCharacters)||!Te(e.models))||!H(e.state,Ke)||typeof e.providerDataConsentRequired!="boolean"||typeof e.readOnlyProven!="boolean"||e.errorCode!==void 0&&!qe(e.errorCode)?!1:e.state==="ready"?e.readOnlyProven&&e.errorCode===void 0:e.errorCode!==void 0}function st(e){if(!D(e)||!_(e,["schemaVersion","enabled","executors","safety","checkedAt"])||e.schemaVersion!==1||typeof e.enabled!="boolean"||!Array.isArray(e.executors)||!e.executors.every(Rt)||!D(e.safety)||!_(e.safety,["selectionRequired","singleTurn","writesAllowed","historyStored"])||e.safety.selectionRequired!==!0||e.safety.singleTurn!==!0||e.safety.writesAllowed!==!1||e.safety.historyStored!==!1||!ae(e.checkedAt))return!1;let t=e.executors.map(n=>n.executorId);return(e.enabled||e.executors.length===0)&&Te(t)}function at(e){return D(e)&&_(e,["executorId","kind","label","modelLabel"])&&q(e.executorId)&&H(e.kind,Ee)&&O(e.label)&&O(e.modelLabel)}function he(e){if(!D(e)||!_(e,["schemaVersion","jobId","selectionId","status","executor","createdAt","updatedAt","canCancel"],["phaseMessage","errorCode"])||e.schemaVersion!==1||!q(e.jobId)||!q(e.selectionId)||!H(e.status,ke)||!at(e.executor)||!ae(e.createdAt)||!ae(e.updatedAt)||Date.parse(e.updatedAt)<Date.parse(e.createdAt)||typeof e.canCancel!="boolean"||e.phaseMessage!==void 0&&!O(e.phaseMessage)||e.errorCode!==void 0&&!qe(e.errorCode))return!1;let t=["queued","authorizing","running"].includes(e.status);return e.canCancel!==t?!1:e.status==="cancelled"?e.errorCode==="ASK_CANCELLED":e.status==="failed"?e.errorCode!==void 0&&e.errorCode!=="ASK_CANCELLED":e.errorCode===void 0}function nt(e){return!(!D(e)||!_(e,["sourceId","label","relativePath","fileId","startLine","endLine","confidence","targetIds","contentHash"],["sourceVersion"])||!q(e.sourceId)||!O(e.label)||!O(e.relativePath)||e.relativePath.startsWith("/")||e.relativePath.includes("\\")||e.relativePath.split("/").some(t=>t===""||t==="."||t==="..")||!q(e.fileId)||!Je(e.startLine)||!Je(e.endLine)||e.endLine<e.startLine||!H(e.confidence,je)||!we(e.targetIds)||e.targetIds.length===0||!Te(e.targetIds)||e.sourceVersion!==void 0&&!O(e.sourceVersion)||typeof e.contentHash!="string"||!/^[a-f0-9]{64}$/u.test(e.contentHash))}function ot(e){return D(e)&&_(e,["code"])&&H(e.code,Me)}function rt(e){return!D(e)||typeof e.kind!="string"?!1:e.kind==="paragraph"?_(e,["kind","text","sourceIds"])&&O(e.text)&&we(e.sourceIds):e.kind==="code"?_(e,["kind","code","sourceIds"],["language"])&&typeof e.code=="string"&&e.code.length>0&&we(e.sourceIds)&&(e.language===void 0||O(e.language)):e.kind!=="list"||!_(e,["kind","items"])?!1:Array.isArray(e.items)&&e.items.length>0&&e.items.every(t=>D(t)&&_(t,["text","sourceIds"])&&O(t.text)&&we(t.sourceIds))}function Lt(e){if(!D(e)||!_(e,["schemaVersion","jobId","selectionId","contextHash","executor","blocks","sources","warnings","createdAt","expiresAt"])||e.schemaVersion!==1||!q(e.jobId)||!q(e.selectionId)||typeof e.contextHash!="string"||!/^[a-f0-9]{64}$/u.test(e.contextHash)||!at(e.executor)||!Array.isArray(e.blocks)||e.blocks.length===0||!e.blocks.every(rt)||!Array.isArray(e.sources)||!e.sources.every(nt)||!Array.isArray(e.warnings)||!e.warnings.every(ot)||!ae(e.createdAt)||!ae(e.expiresAt)||Date.parse(e.expiresAt)<=Date.parse(e.createdAt))return!1;let t=e.sources.filter(nt),n=e.blocks.filter(rt),s=e.warnings.filter(ot),f=t.map(d=>d.sourceId);if(!Te(f))return!1;let r=new Set(f),a=n.flatMap(d=>d.kind==="list"?d.items.flatMap(m=>m.sourceIds):d.sourceIds);return a.every(d=>r.has(d))&&f.every(d=>a.includes(d))&&(a.length>0||s.some(d=>d.code==="insufficient-evidence"))}function it(e){return!D(e)||!_(e,["snapshot"],["result"])||!he(e.snapshot)||e.result!==void 0&&!Lt(e.result)?!1:e.snapshot.status==="answered"===(e.result!==void 0)&&(e.result===void 0||e.result.jobId===e.snapshot.jobId&&e.result.selectionId===e.snapshot.selectionId&&e.result.executor.executorId===e.snapshot.executor.executorId)}function ct(e){return!D(e)||!_(e,["schemaVersion","sequence","jobId","status","timestamp","type"],["snapshot","message","activity","state","errorCode"])||e.schemaVersion!==1||!Je(e.sequence)||!q(e.jobId)||!H(e.status,ke)||!ae(e.timestamp)?!1:e.type==="snapshot"?_(e,["schemaVersion","sequence","jobId","status","timestamp","type","snapshot"])&&he(e.snapshot)&&e.snapshot.jobId===e.jobId&&e.snapshot.status===e.status:e.type==="phase"?_(e,["schemaVersion","sequence","jobId","status","timestamp","type","message"])&&O(e.message)&&!["answered","cancelled","failed"].includes(e.status):e.type==="answer-ready"?_(e,["schemaVersion","sequence","jobId","status","timestamp","type"])&&e.status==="answered":e.type==="error"?_(e,["schemaVersion","sequence","jobId","status","timestamp","type","errorCode"])&&qe(e.errorCode)&&(e.status==="cancelled"&&e.errorCode==="ASK_CANCELLED"||e.status==="failed"&&e.errorCode!=="ASK_CANCELLED"):e.type!=="read-activity"||!_(e,["schemaVersion","sequence","jobId","status","timestamp","type","activity","state"])||e.status!=="running"||!D(e.activity)||!H(e.state,Ue)?!1:e.activity.kind==="source"?_(e.activity,["kind","sourceId","relativePath"])&&q(e.activity.sourceId)&&O(e.activity.relativePath):e.activity.kind==="file-count"&&_(e.activity,["kind","bucket"])&&H(e.activity.bucket,Be)}var Ot=2e6,dt=1e5,Nt=4e6,S=class extends Error{constructor(n){super("SpotPatch Contextual Ask request failed.");this.code=n;this.name="ContextualAskApiError"}code};function $e(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function pt(e){if(!(!$e(e)&&!Array.isArray(e)||Object.isFrozen(e))){for(let t of Object.values(e))pt(t);Object.freeze(e)}}function be(e){return pt(e),e}function ut(e){try{return JSON.parse(e)}catch{throw new S}}async function Pt(e,t){let n=Number(e.headers.get("content-length"));if(Number.isFinite(n)&&n>t)throw await e.body?.cancel(),new S;if(e.body===null)throw new S;let s=e.body.getReader(),f=new TextDecoder("utf-8",{fatal:!0}),r=0,a="";try{for(;;){let d=await s.read();if(d.done)return a+f.decode();if(r+=d.value.byteLength,r>t)throw await s.cancel(),new S;a+=f.decode(d.value,{stream:!0})}}catch(d){throw d instanceof S||d instanceof DOMException&&d.name==="AbortError"?d:new S}finally{s.releaseLock()}}async function lt(e){let t=ut(await Pt(e,Ot));if(!$e(t))throw new S;if(!e.ok){let n=t.ok===!1&&$e(t.error)&&Se(t.error.code)?t.error.code:void 0;throw new S(n)}if(t.ok!==!0||!("data"in t))throw new S;return t.data}function _e(e){return e instanceof S?e.code:void 0}function ft(e){let t=new Set;function n(){for(let r of t)r.abort();t.clear()}async function s(r,a,d){let m=new AbortController;t.add(m);try{let R=await e.fetch(r,{method:a,headers:{...d===void 0?{}:{"Content-Type":"application/json"},[Ce]:e.sessionToken},...d===void 0?{}:{body:JSON.stringify(d)},signal:m.signal});return await lt(R)}finally{t.delete(m)}}async function f(r,a,d){let m=new AbortController;t.add(m);try{let R=await e.fetch(ge(r,"events",{afterSequence:a}),{method:"GET",headers:{[Ce]:e.sessionToken},signal:m.signal});if(!R.ok){await lt(R);return}if(R.body===null)throw new S;let k=R.body.getReader(),x=new TextDecoder("utf-8",{fatal:!0}),P="",N=0,l=a,T=h=>{if(h.trim().length===0)return;if(new TextEncoder().encode(h).byteLength>dt)throw new S;let b=ut(h);if(!ct(b)||b.jobId!==r||b.sequence<=l)throw new S;l=b.sequence,d(be(b))};try{for(;;){let h=await k.read();if(h.done){T(P+x.decode());return}if(N+=h.value.byteLength,N>Nt)throw await k.cancel(),new S;P+=x.decode(h.value,{stream:!0});let b=P.split(`
|
|
2
|
+
`);if(P=b.pop()??"",new TextEncoder().encode(P).byteLength>dt)throw await k.cancel(),new S;for(let y of b)T(y)}}catch(h){throw h instanceof S||h instanceof DOMException&&h.name==="AbortError"?h:new S}finally{k.releaseLock()}}finally{t.delete(m)}}return Object.freeze({async capability(){let r=await s(fe.askCapability,"GET");if(!st(r))throw new S;return be(r)},async cancelJob(r){let a=await s(ge(r,"cancel"),"POST",{});if(!he(a)||a.jobId!==r)throw new S;return be(a)},cancelPending:n,async createJob(r){let a=await s(fe.askJobs,"POST",r);if(!he(a)||a.selectionId!==r.envelope.selection.selectionId||a.executor.executorId!==r.executorId)throw new S;return be(a)},dispose:n,events:f,async result(r){let a=await s(ge(r,"result"),"GET");if(!it(a)||a.snapshot.jobId!==r)throw new S;return be(a)}})}function We(e){return e instanceof DOMException&&e.name==="AbortError"}function gt(e){let t=!1,n=0,s=!1,f,r,a="",d=!1,m=!1,R=new Map,k=e.api??ft({fetch:e.fetch,sessionToken:e.sessionToken});function x(i){return t&&n===i}function P(i){let A=e.getSelection();if(i.length===0||i.length>4e3||A===void 0)return;let w=new Date().toISOString();return{schemaVersion:1,taskId:e.createId(),selection:{schemaVersion:1,selectionId:e.createId(),locale:A.locale,targets:A.targets.map(E=>({targetId:E.id,page:E.page,source:E.source,react:{...E.react,componentStack:[...E.react.componentStack]},element:E.element,styles:{...E.styles,classNames:[...E.styles.classNames],matchedRules:E.styles.matchedRules.map(F=>({...F})),computed:{...E.styles.computed},warnings:[...E.styles.warnings]},...E.code===void 0?{}:{code:E.code},warnings:[]})),createdAt:w},task:{kind:"ask",question:i},createdAt:w}}async function N(){if(d)return;let i=n;e.panel.renderCapability(void 0);try{let A=await k.capability();if(!x(i))return;d=!0,e.panel.renderCapability(A);let w=e.panel.readExecutorId();e.panel.setConsent(w!==void 0&&R.get(w)===!0)}catch(A){if(!x(i)||We(A))return;e.panel.renderError(_e(A))}}function l(i,A){x(A)&&(e.panel.renderEvent(i),i.type==="snapshot"&&(f=i.snapshot))}async function T(){if(s)return;let i=e.panel.readQuestion(),A=e.panel.readExecutorId(),w=P(i);if(i.length===0||A===void 0||!e.panel.readConsent()||w===void 0)return;let E=++n,F=e.panel.readModel();a=i,s=!0,e.onBusyChange(!0),r=void 0,f=void 0,e.panel.setBusy(!0);try{let j=await k.createJob({schemaVersion:1,requestId:e.createId(),envelope:w,executorId:A,...F===void 0?{}:{model:F},providerDataConsent:!0});if(!x(E)||(f=j,e.panel.renderJob(j),await k.events(j.jobId,0,de=>{l(de,E)}),!x(E)))return;let $=await k.result(j.jobId);if(!x(E))return;if(f=$.snapshot,s=!1,e.onBusyChange(!1),$.result===void 0){e.panel.renderJob($.snapshot),$.snapshot.status==="failed"&&e.panel.renderError($.snapshot.errorCode);return}r=$.result,e.panel.renderAnswer($.result,!1)}catch(j){if(!x(E)||We(j))return;s=!1,e.onBusyChange(!1),e.panel.renderError(_e(j))}finally{x(E)&&(s=!1,e.panel.setBusy(!1))}}async function h(){if(!s||f?.canCancel!==!0)return;let i=n;try{let A=await k.cancelJob(f.jobId);if(!x(i))return;f=A,s=!1,e.onBusyChange(!1),e.panel.renderJob(A),e.panel.setBusy(!1)}catch(A){if(!x(i)||We(A))return;s=!1,e.onBusyChange(!1),e.panel.renderError(_e(A))}}function b(){n+=1;let i=f;s=!1,e.onBusyChange(!1),f=void 0,k.cancelPending(),i?.canCancel===!0&&k.cancelJob(i.jobId).catch(()=>{}),e.panel.setBusy(!1)}function y(){s&&b(),n+=1,f=void 0,r=void 0,a="",e.panel.clear(),e.panel.focusQuestion()}function M(){let i=e.panel.answerPlainText();i.length===0||e.clipboard===void 0||e.clipboard.writeText(i).then(()=>{e.panel.notify("copied")}).catch(()=>{e.panel.notify("copy-failed")})}function te(){if(r===void 0||s)return;let i=e.panel.answerPlainText().trim().slice(0,4e3);if(i.length===0)return;let A=Object.freeze({kind:"contextual-ask",askJobId:r.jobId,question:a,answerDigest:i,sourceIds:r.sources.map(w=>w.sourceId)});e.onConvert(A),e.panel.setOrigin(A),e.panel.setMode("change"),e.panel.notify("converted")}function ne(i){let A=e.panel.selectedSourceId(i.target);if(A===void 0)return;let w=e.panel.sourceById(A);w!==void 0&&e.onOpenSource(w).catch(()=>{e.panel.notify("source-open-failed")})}function ie(i){i.target!==e.panel.questionInput||i.key!=="Enter"||m||i.isComposing||!i.metaKey&&!i.ctrlKey||(i.preventDefault(),T())}function v(){let i=e.panel.readExecutorId();e.panel.setConsent(i!==void 0&&R.get(i)===!0)}function V(){m=!0}function oe(){m=!1}function re(){let i=e.panel.readExecutorId();i!==void 0&&R.set(i,e.panel.readConsent())}function B(){T()}function L(){h()}function se(){t||(t=!0,e.panel.submitButton.addEventListener("click",B),e.panel.cancelButton.addEventListener("click",L),e.panel.newQuestionButton.addEventListener("click",y),e.panel.copyButton.addEventListener("click",M),e.panel.convertButton.addEventListener("click",te),e.panel.executorSelect.addEventListener("change",v),e.panel.consentCheckbox.addEventListener("change",re),e.panel.questionInput.addEventListener("keydown",ie),e.panel.questionInput.addEventListener("compositionstart",V),e.panel.questionInput.addEventListener("compositionend",oe),e.panel.root.addEventListener("click",ne),N())}function ce(){t&&(b(),t=!1,e.panel.submitButton.removeEventListener("click",B),e.panel.cancelButton.removeEventListener("click",L),e.panel.newQuestionButton.removeEventListener("click",y),e.panel.copyButton.removeEventListener("click",M),e.panel.convertButton.removeEventListener("click",te),e.panel.executorSelect.removeEventListener("change",v),e.panel.consentCheckbox.removeEventListener("change",re),e.panel.questionInput.removeEventListener("keydown",ie),e.panel.questionInput.removeEventListener("compositionstart",V),e.panel.questionInput.removeEventListener("compositionend",oe),e.panel.root.removeEventListener("click",ne),k.dispose())}return Object.freeze({beginSelection(){n+=1,s=!1,e.onBusyChange(!1),f=void 0,r=void 0,a="",e.panel.clear(),N()},cancelPending:b,dispose:ce,isBusy:()=>s,mount:se,selectionChanged(){r!==void 0&&e.panel.renderAnswer(r,!0)}})}var Dt=Symbol.for("spotpatch.contextual-ask.v1");function ht(e){globalThis[Dt]=e}var bt="data-spotpatch-ui",Zt=Object.freeze({highlight:2147483646,controls:2147483647}),en=Object.freeze({compactInset:8,compactViewportWidth:520,desktopInset:24,dragActivationDistance:6,edgeSnapDistance:20,workbenchMaxHeight:620,workbenchMaxWidth:460});function c(e,t){let n=e.createElement(t);return n.setAttribute(bt,""),n}function K(e,t,n=""){let s=c(e,"button");return s.type="button",s.className=n,s.textContent=t,s}var xt=`
|
|
3
|
+
.spotpatch-select-picker { position: relative; display: grid; gap: 5px; min-width: 0; }
|
|
4
|
+
.spotpatch-select-trigger { box-sizing: border-box; display: flex; width: 100%; min-height: 38px; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 0 11px; overflow: hidden; color: var(--spotpatch-text); background: var(--spotpatch-bg-input); cursor: pointer; font: inherit; outline: none; text-align: left; }
|
|
5
|
+
.spotpatch-select-trigger > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
6
|
+
.spotpatch-select-trigger[data-expandable="true"]::after { width: 7px; height: 7px; flex: 0 0 auto; border-right: 1.5px solid #8f96a3; border-bottom: 1.5px solid #8f96a3; content: ""; transform: translateY(-2px) rotate(45deg); }
|
|
7
|
+
.spotpatch-select-trigger[aria-expanded="true"]::after { transform: translateY(2px) rotate(225deg); }
|
|
8
|
+
.spotpatch-select-trigger:focus-visible { border-color: rgb(139 123 255 / 68%); box-shadow: 0 0 0 3px rgb(139 123 255 / 12%); }
|
|
9
|
+
.spotpatch-select-trigger:disabled { color: var(--spotpatch-text); background: rgb(255 255 255 / 3%); cursor: default; opacity: 1; }
|
|
10
|
+
.spotpatch-select-trigger[data-empty="true"]:disabled { color: var(--spotpatch-text-muted); }
|
|
11
|
+
.spotpatch-select-menu { position: relative; z-index: 1; display: grid; gap: 3px; max-height: 224px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 4px; background: var(--spotpatch-bg-input); box-shadow: 0 10px 28px rgb(0 0 0 / 28%); scrollbar-width: thin; }
|
|
12
|
+
.spotpatch-select-menu[hidden] { display: none; }
|
|
13
|
+
.spotpatch-select-option { box-sizing: border-box; min-height: 34px; border: 0; border-radius: 6px; padding: 7px 9px; overflow-wrap: anywhere; color: var(--spotpatch-text-secondary); background: transparent; cursor: pointer; font: inherit; text-align: left; }
|
|
14
|
+
.spotpatch-select-option[data-active="true"], .spotpatch-select-option:hover { color: #fff; background: rgb(139 123 255 / 13%); outline: none; }
|
|
15
|
+
.spotpatch-select-option[aria-selected="true"] { color: #f4f1ff; background: rgb(139 123 255 / 20%); }
|
|
16
|
+
.spotpatch-select-native { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; border: 0; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
|
|
17
|
+
`;function Ve(e,t){let n=c(e,"div");n.className="spotpatch-select-picker";let s=K(e,"","spotpatch-select-trigger");s.id=`spotpatch-select-picker-${Math.random().toString(36).slice(2)}`,s.setAttribute("role","combobox"),s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-expanded","false");let f=c(e,"span");s.append(f);let r=c(e,"div");r.id=`${s.id}-menu`,r.className="spotpatch-select-menu",r.setAttribute("role","listbox"),r.hidden=!0,s.setAttribute("aria-controls",r.id);let a=c(e,"select");a.className="spotpatch-select-native",a.tabIndex=-1,a.setAttribute("aria-hidden","true"),n.append(s,r,a);function d(l=!1){r.hidden||(r.hidden=!0,s.setAttribute("aria-expanded","false"),s.removeAttribute("aria-activedescendant"),l&&s.focus({preventScroll:!0}),t())}function m(l){let T=[...r.children],h=T[l];if(h===void 0)return;for(let M of T)M.dataset.active=String(M===h);s.setAttribute("aria-activedescendant",h.id);let b=h.getBoundingClientRect(),y=r.getBoundingClientRect();b.top<y.top?r.scrollTop-=y.top-b.top:b.bottom>y.bottom&&(r.scrollTop+=b.bottom-y.bottom)}function R(){s.disabled||!r.hidden||(r.hidden=!1,s.setAttribute("aria-expanded","true"),m(Math.max(0,a.selectedIndex)),t())}function k(){f.textContent=a.selectedOptions[0]?.textContent??"",s.title=f.textContent,s.dataset.empty=String(a.value.length===0);for(let l of[...r.children])l.setAttribute("aria-selected",String(l.dataset.value===a.value))}function x(l){s.disabled||(a.value=l,k(),d(!0),a.dispatchEvent(new Event("change",{bubbles:!0})))}function P(){let l=!r.hidden,T=[...a.options];r.replaceChildren();for(let[h,b]of T.entries()){let y=c(e,"div");y.id=`${r.id}-${String(h)}`,y.className="spotpatch-select-option",y.setAttribute("role","option"),y.dataset.value=b.value,y.textContent=b.textContent,y.title=b.textContent,y.addEventListener("pointerdown",M=>{M.preventDefault()}),y.addEventListener("click",()=>{x(b.value)}),r.append(y)}k(),l&&(m(Math.max(0,a.selectedIndex)),t())}s.addEventListener("click",()=>{r.hidden?R():d()}),s.addEventListener("keydown",l=>{if(l.key==="Escape"&&!r.hidden){l.preventDefault(),l.stopPropagation(),d();return}if(l.key==="Tab"){d();return}if(["Enter"," "].includes(l.key)&&!r.hidden){l.preventDefault();let b=[...r.children].find(y=>y.id===s.getAttribute("aria-activedescendant"));b?.dataset.value!==void 0&&x(b.dataset.value);return}if(!["ArrowDown","ArrowUp","Home","End"].includes(l.key))return;if(l.preventDefault(),r.hidden){R();return}let T=[...r.children],h=T.findIndex(b=>b.id===s.getAttribute("aria-activedescendant"));m(l.key==="Home"?0:l.key==="End"?T.length-1:(h+(l.key==="ArrowDown"?1:-1)+T.length)%T.length)}),n.addEventListener("focusout",l=>{(!(l.relatedTarget instanceof Node)||!n.contains(l.relatedTarget))&&d()});let N=l=>{l.composedPath().includes(n)||d()};return e.addEventListener("pointerdown",N),a.addEventListener("change",k),{root:n,trigger:s,select:a,rebuild:P,close:d,setDisabled(l){a.disabled=l,s.disabled=l||a.options.length<2,s.dataset.expandable=String(!s.disabled),s.disabled&&d()},dispose(){e.removeEventListener("pointerdown",N)}}}var Kt=Object.freeze({mode:Object.freeze({ask:"Ask",change:"Change",label:"Task mode"}),title:"Ask about this selection",subtitle:"One question, one sourced answer. SpotPatch will not write code.",questionLabel:"Question",questionPlaceholder:"What does this component do?",suggestionsLabel:"Suggested questions",suggestions:Object.freeze(["What does this component do?","Where does its data come from?","Why is it implemented this way?"]),executorLabel:"Read-only executor",modelLabel:"Model",loadingExecutors:"Checking available executors…",noExecutor:"No verified read-only executor is available.",unavailable:"unavailable",consent:"Allow the selected source snapshot to be sent to this provider for this answer.",dataSummary:(e,t)=>`${String(e)} selected element${e===1?"":"s"} · ${String(t)} source-backed`,safety:"Single turn · read-only · no history",submit:"Ask",cancel:"Cancel",newQuestion:"Start over",copy:"Copy answer",convert:"Turn into change request",answerTitle:"Answer",sourcesTitle:"Sources",stale:"The selection changed after this answer. Ask again before relying on it.",convertedTitle:"From contextual answer",convertedBody:"The answer and source references remain local and have not started a change.",status:Object.freeze({queued:"Queued",authorizing:"Verifying read-only access",running:"Analyzing selected source",cancelling:"Cancelling",answered:"Answer ready",cancelled:"Cancelled",failed:"Could not answer"}),sourceLabel:(e,t,n)=>`${e}:${String(t)}${n===t?"":`–${String(n)}`}`,readSource:e=>`Reading ${e}`,readFiles:e=>`Reading ${e} files`,copied:"Answer copied.",copyFailed:"The answer could not be copied.",sourceOpenFailed:"The source could not be opened.",converted:"Switched to Change with the answer attached as local context.",error:e=>e===void 0?"SpotPatch could not complete this question.":{INVALID_TOKEN:"The local SpotPatch session expired. Refresh the page.",ORIGIN_NOT_ALLOWED:"The local request failed its same-origin security check. Refresh or restart the dev server.",ASK_DISABLED:"Contextual Ask is disabled.",ASK_SELECTION_REQUIRED:"Select at least one element first.",ASK_SELECTION_STALE:"The selected source changed. Refresh the selection and ask again.",ASK_QUESTION_INVALID:"Enter one valid question.",ASK_EXECUTOR_UNAVAILABLE:"The selected read-only executor is unavailable.",ASK_TIMEOUT:"The read-only executor took too long to answer. Try the question again.",ASK_CONSENT_REQUIRED:"Confirm provider data access for this answer.",ASK_BUSY:"Another workspace task is active. Try again when it finishes.",ASK_CANCELLED:"The question was cancelled.",ASK_RESULT_EXPIRED:"This answer has expired. Ask again.",ASK_WRITE_ATTEMPTED:"The executor attempted a write and was stopped.",ASK_ANSWER_INVALID:"The executor returned an invalid sourced answer.",ASK_PROTOCOL_INCOMPATIBLE:"The executor protocol is incompatible.",ASK_LIMIT_EXCEEDED:"The selected context is too large.",ASK_SOURCE_SCOPE_DENIED:"A requested source was outside the granted snapshot."}[e]??"SpotPatch could not complete this question.",warning:e=>e==="insufficient-evidence"?"The selected source did not contain enough evidence for a complete answer.":"Some source references were omitted because they could not be verified."}),Mt=Object.freeze({mode:Object.freeze({ask:"问答",change:"修改",label:"任务模式"}),title:"询问所选元素",subtitle:"一次提问,一次带源码引用的回答;SpotPatch 不会写入代码。",questionLabel:"问题",questionPlaceholder:"这个组件是做什么的?",suggestionsLabel:"推荐问题",suggestions:Object.freeze(["这个组件是做什么的?","它的数据从哪里来?","为什么要这样实现?"]),executorLabel:"只读执行器",modelLabel:"模型",loadingExecutors:"正在检查可用执行器…",noExecutor:"目前没有通过只读验证的执行器。",unavailable:"不可用",consent:"允许本次回答将所选源码快照发送给该提供商。",dataSummary:(e,t)=>`${String(e)} 个已选元素 · ${String(t)} 个具备源码上下文`,safety:"单轮 · 只读 · 不保存历史",submit:"提问",cancel:"取消",newQuestion:"重新开始",copy:"复制回答",convert:"转成修改请求",answerTitle:"回答",sourcesTitle:"源码引用",stale:"回答后选择已发生变化。请重新提问后再采信此回答。",convertedTitle:"来自上下文问答",convertedBody:"回答与源码引用仅作为本地上下文保留,尚未发起任何修改。",status:Object.freeze({queued:"已排队",authorizing:"正在验证只读权限",running:"正在分析所选源码",cancelling:"正在取消",answered:"回答已就绪",cancelled:"已取消",failed:"无法回答"}),sourceLabel:(e,t,n)=>`${e}:${String(t)}${n===t?"":`–${String(n)}`}`,readSource:e=>`正在读取 ${e}`,readFiles:e=>`正在读取 ${e} 个文件`,copied:"回答已复制。",copyFailed:"无法复制回答。",sourceOpenFailed:"无法打开源码。",converted:"已切换到修改模式,并把回答作为本地上下文附带。",error:e=>e===void 0?"SpotPatch 未能完成本次提问。":{INVALID_TOKEN:"本地 SpotPatch 会话已失效,请刷新页面。",ORIGIN_NOT_ALLOWED:"本地请求未通过同源安全校验,请刷新页面或重启开发服务。",ASK_DISABLED:"上下文问答未启用。",ASK_SELECTION_REQUIRED:"请先选择至少一个元素。",ASK_SELECTION_STALE:"所选源码已经变化,请刷新选择后重新提问。",ASK_QUESTION_INVALID:"请输入一个有效的问题。",ASK_EXECUTOR_UNAVAILABLE:"所选只读执行器当前不可用。",ASK_TIMEOUT:"只读执行器未能在限定时间内返回回答,请重新提问。",ASK_CONSENT_REQUIRED:"请确认本次回答的提供商数据访问。",ASK_BUSY:"工作区正在执行其他任务,请稍后重试。",ASK_CANCELLED:"本次提问已取消。",ASK_RESULT_EXPIRED:"回答已过期,请重新提问。",ASK_WRITE_ATTEMPTED:"执行器尝试写入,已被阻止。",ASK_ANSWER_INVALID:"执行器返回的带引用回答无效。",ASK_PROTOCOL_INCOMPATIBLE:"执行器协议不兼容。",ASK_LIMIT_EXCEEDED:"所选上下文过大。",ASK_SOURCE_SCOPE_DENIED:"请求的源码超出了授权快照范围。"}[e]??"SpotPatch 未能完成本次提问。",warning:e=>e==="insufficient-evidence"?"所选源码不足以支持完整回答。":"部分源码引用因无法验证而被省略。"});function ze(e){return e==="zh-CN"?Mt:Kt}function Ut(e){let t=e.createElement("style");return t.textContent=`
|
|
18
|
+
${xt}
|
|
3
19
|
.spotpatch-ask-mode { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; margin-bottom: 14px; padding: 4px; border: 1px solid var(--spotpatch-border-subtle); border-radius: 10px; background: #0a0a0e; }
|
|
4
20
|
.spotpatch-ask-mode button { min-height: 34px; border: 0; border-radius: 7px; color: var(--spotpatch-text-secondary); background: transparent; cursor: pointer; font-size: 12px; font-weight: 700; }
|
|
5
21
|
.spotpatch-ask-mode button[aria-selected="true"] { color: #f7f7ff; background: linear-gradient(135deg, rgb(139 123 255 / 25%), rgb(82 168 255 / 14%)); box-shadow: inset 0 0 0 1px rgb(139 123 255 / 24%); }
|
|
@@ -12,20 +28,6 @@ var ye=Object.freeze({maximumTargets:20,maximumQuestionCharacters:4e3,maximumAns
|
|
|
12
28
|
.spotpatch-ask-suggestions { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
13
29
|
.spotpatch-ask-suggestions button { border: 1px solid var(--spotpatch-border-subtle); border-radius: 999px; padding: 5px 9px; color: var(--spotpatch-text-secondary); background: rgb(255 255 255 / 2%); cursor: pointer; font-size: 10.5px; }
|
|
14
30
|
.spotpatch-ask-suggestions button:hover { border-color: rgb(139 123 255 / 42%); color: #fff; }
|
|
15
|
-
.spotpatch-ask-executor-picker { display: grid; gap: 5px; min-width: 0; }
|
|
16
|
-
.spotpatch-ask-executor { box-sizing: border-box; display: flex; width: 100%; min-height: 38px; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 0 11px; overflow: hidden; color: var(--spotpatch-text); background: var(--spotpatch-bg-input); cursor: pointer; font: inherit; outline: none; text-align: left; }
|
|
17
|
-
.spotpatch-ask-executor > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
18
|
-
.spotpatch-ask-executor[data-expandable="true"]::after { width: 7px; height: 7px; flex: 0 0 auto; border-right: 1.5px solid #8f96a3; border-bottom: 1.5px solid #8f96a3; content: ""; transform: translateY(-2px) rotate(45deg); }
|
|
19
|
-
.spotpatch-ask-executor[aria-expanded="true"]::after { transform: translateY(2px) rotate(225deg); }
|
|
20
|
-
.spotpatch-ask-executor:focus-visible { border-color: rgb(139 123 255 / 68%); box-shadow: 0 0 0 3px rgb(139 123 255 / 12%); }
|
|
21
|
-
.spotpatch-ask-executor:disabled { color: var(--spotpatch-text); background: rgb(255 255 255 / 3%); cursor: default; opacity: 1; }
|
|
22
|
-
.spotpatch-ask-executor[data-empty="true"]:disabled { color: var(--spotpatch-text-muted); }
|
|
23
|
-
.spotpatch-ask-executor-menu { display: grid; gap: 3px; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 4px; background: var(--spotpatch-bg-input); max-height: 224px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; box-shadow: 0 10px 28px rgb(0 0 0 / 28%); }
|
|
24
|
-
.spotpatch-ask-executor-menu[hidden] { display: none; }
|
|
25
|
-
.spotpatch-ask-executor-option { box-sizing: border-box; min-height: 34px; border: 0; border-radius: 6px; padding: 7px 9px; color: var(--spotpatch-text-secondary); background: transparent; cursor: pointer; font: inherit; text-align: left; overflow-wrap: anywhere; }
|
|
26
|
-
.spotpatch-ask-executor-option[data-active="true"], .spotpatch-ask-executor-option:hover { color: #fff; background: rgb(139 123 255 / 13%); outline: none; }
|
|
27
|
-
.spotpatch-ask-executor-option[aria-selected="true"] { color: #f4f1ff; background: rgb(139 123 255 / 20%); }
|
|
28
|
-
.spotpatch-ask-executor-native { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; border: 0; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
|
|
29
31
|
.spotpatch-ask-executor-status { margin: 0; border-left: 2px solid var(--spotpatch-warning); padding-left: 8px; color: #d8b66c; font-size: 10.5px; line-height: 1.45; }
|
|
30
32
|
.spotpatch-ask-safety { display: grid; gap: 8px; border: 1px solid rgb(82 168 255 / 16%); border-radius: 10px; padding: 10px 11px; background: rgb(82 168 255 / 4%); }
|
|
31
33
|
.spotpatch-ask-data { display: flex; justify-content: space-between; gap: 10px; color: #aab3c2; font-size: 10.5px; }
|
|
@@ -54,10 +56,10 @@ var ye=Object.freeze({maximumTargets:20,maximumQuestionCharacters:4e3,maximumAns
|
|
|
54
56
|
.spotpatch-ask-origin strong { display: block; margin-bottom: 2px; color: #d9d4ff; font-size: 11px; }
|
|
55
57
|
@media (max-width: 420px) { .spotpatch-ask-data { display: grid; } .spotpatch-ask-actions, .spotpatch-ask-answer-actions { justify-content: stretch; } .spotpatch-ask-actions button, .spotpatch-ask-answer-actions button { flex: 1 1 auto; } }
|
|
56
58
|
@media (prefers-reduced-motion: reduce) { .spotpatch-ask-panel *, .spotpatch-ask-mode * { scroll-behavior: auto !important; transition: none !important; } }
|
|
57
|
-
`,t}function He(e,t,n,s,
|
|
59
|
+
`,t}function He(e,t,n,s,f){if(n.length===0)return;let r=c(e,"div");r.className="spotpatch-ask-citations";for(let a of n){let d=s.get(a);if(d===void 0)continue;let m=K(e,f.sourceLabel(d.relativePath,d.startLine,d.endLine),"spotpatch-ask-source");m.dataset.askSourceId=d.sourceId,m.title=d.label,r.append(m)}t.append(r)}function At(e){let{document:t}=e,n=ze(e.locale()),s="change",f,r,a,d,m="",R="",k=Object.freeze({contextReady:!1,targetCount:0,sourceCount:0}),x=!1,P=c(t,"section"),N=c(t,"div");N.className="spotpatch-ask-mode",N.setAttribute("role","tablist");let l=K(t,""),T=K(t,"");l.setAttribute("role","tab"),T.setAttribute("role","tab"),N.append(l,T);let h=c(t,"aside");h.className="spotpatch-ask-origin",h.hidden=!0;let b=c(t,"strong"),y=c(t,"span");h.append(b,y);let M=c(t,"div");M.className="spotpatch-ask-panel";let te=c(t,"div");te.className="spotpatch-ask-field";let ne=c(t,"label"),ie=`spotpatch-ask-question-${Math.random().toString(36).slice(2)}`;ne.htmlFor=ie;let v=c(t,"textarea");v.id=ie,v.className="spotpatch-ask-question",v.maxLength=4e3;let V=c(t,"div");V.className="spotpatch-ask-suggestions",V.setAttribute("aria-label",""),te.append(ne,v,V);let oe=c(t,"div");oe.className="spotpatch-ask-field";let re=c(t,"label"),B=Ve(t,e.onViewChange),L=B.select;re.htmlFor=B.trigger.id;let se=c(t,"div");se.className="spotpatch-ask-field";let ce=c(t,"label"),i=Ve(t,e.onViewChange);ce.htmlFor=i.trigger.id,se.append(ce,i.root);let A,w=c(t,"p");w.className="spotpatch-ask-executor-status",w.setAttribute("role","status"),w.hidden=!0,oe.append(re,B.root,w);let E=c(t,"div");E.className="spotpatch-ask-safety";let F=c(t,"div");F.className="spotpatch-ask-data";let j=c(t,"span"),$=c(t,"strong");F.append(j,$);let de=c(t,"label");de.className="spotpatch-ask-consent";let X=c(t,"input");X.type="checkbox";let Fe=c(t,"span");de.append(X,Fe),E.append(F,de);let J=c(t,"div");J.className="spotpatch-ask-status",J.setAttribute("role","status"),J.setAttribute("aria-live","polite"),J.hidden=!0;let Ie=c(t,"strong"),Y=c(t,"div");Y.className="spotpatch-ask-activity",J.append(Ie,Y);let z=c(t,"div");z.className="spotpatch-ask-error",z.setAttribute("role","alert"),z.hidden=!0;let ve=c(t,"div");ve.className="spotpatch-ask-actions";let xe=K(t,""),le=K(t,""),pe=K(t,"","spotpatch-primary");le.hidden=!0,ve.append(xe,le,pe);let Z=c(t,"article");Z.className="spotpatch-ask-answer",Z.hidden=!0;let ee=c(t,"div");ee.className="spotpatch-ask-stale",ee.hidden=!0;let Xe=c(t,"h3"),Re=c(t,"div"),Q=c(t,"div");Q.className="spotpatch-ask-blocks";let Ae=c(t,"section");Ae.className="spotpatch-ask-sources";let Qe=c(t,"h4"),me=c(t,"div");me.className="spotpatch-ask-source-list",Ae.append(Qe,me);let Le=c(t,"div");Le.className="spotpatch-ask-answer-actions";let Oe=K(t,""),Ne=K(t,"","spotpatch-primary");Le.append(Oe,Ne),Z.append(ee,Xe,Re,Q,Ae,Le),M.append(te,oe,se,E,J,z,ve,Z),P.append(N,h,M);function Pe(){let o=f?.executors.find(C=>C.executorId===L.value);return o?.state==="ready"&&o.readOnlyProven}function yt(){return f?.executors.some(o=>o.state==="ready"&&o.readOnlyProven)===!0}function Ge(){let o=f?.executors.find(g=>g.executorId===L.value),C=A===o?.executorId?i.select.value:void 0;A=o?.executorId;let u=o?.models;se.hidden=u===void 0,i.select.replaceChildren();for(let g of u??[]){let p=t.createElement("option");p.value=g,p.textContent=g,i.select.append(p)}i.select.value=u?.find(g=>g===C)??u?.find(g=>g===o?.requestedModelLabel)??u?.[0]??"",i.rebuild()}function U(){pe.disabled=x||v.value.trim().length===0||!Pe()||!X.checked||k.targetCount===0,k.contextReady||(pe.disabled=!0),v.disabled=x;let o=x||f===void 0||!yt();B.setDisabled(o),i.setDisabled(x||!Pe()),X.disabled=x||!Pe(),xe.hidden=x||r===void 0,le.hidden=!x}function ue(){let o=s==="ask";l.setAttribute("aria-selected",String(o)),T.setAttribute("aria-selected",String(!o)),M.hidden=!o,e.changeRoot.hidden=o,e.changeActions.hidden=o,h.hidden=o||h.dataset.active!=="true",(d!==s||m!==n.title||R!==n.subtitle)&&(d=s,m=n.title,R=n.subtitle,e.onModeChange(s,n.title,n.subtitle)),e.onViewChange()}function Et(){V.replaceChildren();for(let o of n.suggestions){let C=K(t,o);C.type="button",C.addEventListener("click",()=>{v.value=o,U(),v.focus()}),V.append(C)}}function Ye(){n=ze(e.locale()),N.setAttribute("aria-label",n.mode.label),l.textContent=n.mode.ask,T.textContent=n.mode.change,ne.textContent=n.questionLabel,v.placeholder=n.questionPlaceholder,V.setAttribute("aria-label",n.suggestionsLabel),re.textContent=n.executorLabel,ce.textContent=n.modelLabel,B.root.querySelector("[role=listbox]")?.setAttribute("aria-label",n.executorLabel),i.root.querySelector("[role=listbox]")?.setAttribute("aria-label",n.modelLabel),Fe.textContent=n.consent,$.textContent=n.safety,pe.textContent=n.submit,le.textContent=n.cancel,xe.textContent=n.newQuestion,Oe.textContent=n.copy,Ne.textContent=n.convert,Xe.textContent=n.answerTitle,Qe.textContent=n.sourcesTitle,ee.textContent=n.stale,b.textContent=n.convertedTitle,y.textContent=n.convertedBody,j.textContent=n.dataSummary(k.targetCount,k.sourceCount),Et(),Ze(f),r!==void 0&&tt(r,!ee.hidden)}function Ze(o){f=o;let C=L.value;if(L.replaceChildren(),B.close(),w.hidden=!0,w.textContent="",o===void 0){let u=t.createElement("option");u.textContent=n.loadingExecutors,u.value="",L.append(u)}else if(!o.enabled||o.executors.length===0){let u=t.createElement("option");u.textContent=n.noExecutor,u.value="",L.append(u)}else{let u=o.executors.filter(p=>p.state==="ready"&&p.readOnlyProven),g=o.executors.filter(p=>p.state!=="ready"||!p.readOnlyProven);for(let p of u){let W=t.createElement("option");W.value=p.executorId,W.textContent=p.models===void 0?`${p.label} · ${p.effectiveModelLabel}`:p.label,L.append(W)}if(u.length===0){let p=t.createElement("option");p.textContent=n.noExecutor,p.value="",L.append(p)}L.value=u.some(p=>p.executorId===C)?C:u[0]?.executorId??"",g.length>0&&(w.textContent=g.map(p=>`${p.label}: ${n.error(p.errorCode)}`).join(" "),w.hidden=!1)}B.rebuild(),Ge(),U()}function et(o){a=o,J.hidden=!1,z.hidden=!0,Ie.textContent=n.status[o.status],["answered","cancelled","failed"].includes(o.status)?(x=!1,e.onExecutionChange()):e.onExecutionChange({scene:"running",tone:"running",headline:n.status[o.status],expandedHeadline:n.status[o.status],action:n.safety,expandedAction:n.safety,meta:`${o.executor.label} · ${o.executor.modelLabel}`,recentActivities:Object.freeze([]),startedAt:o.createdAt}),U()}function kt(o){if(o.type==="snapshot"){et(o.snapshot);return}if(o.type==="phase"&&(Ie.textContent=n.status[o.status]),o.type==="read-activity"&&o.state==="started"){let C=c(t,"span");for(C.textContent=o.activity.kind==="source"?n.readSource(o.activity.relativePath):n.readFiles(o.activity.bucket),Y.append(C);Y.childElementCount>5;)Y.firstElementChild?.remove();if(a!==void 0){let u=C.textContent;e.onExecutionChange({scene:"running",tone:"running",headline:n.status.running,expandedHeadline:n.status.running,action:u,expandedAction:u,meta:`${a.executor.label} · ${a.executor.modelLabel}`,activity:{key:`ask:${String(o.sequence)}`,kind:"read",label:u,state:"active"},recentActivities:Object.freeze([]),startedAt:a.createdAt})}}}function tt(o,C){r=o,a=void 0,e.onExecutionChange();let u=new Map(o.sources.map(g=>[g.sourceId,g]));Q.replaceChildren(),Re.replaceChildren(),me.replaceChildren(),ee.hidden=!C;for(let g of o.warnings){let p=c(t,"div");p.className="spotpatch-ask-warning",p.textContent=n.warning(g.code),Re.append(p)}for(let g of o.blocks)if(g.kind==="paragraph"){let p=c(t,"p");p.textContent=g.text,Q.append(p),He(t,Q,g.sourceIds,u,n)}else if(g.kind==="code"){let p=c(t,"pre"),W=c(t,"code");g.language!==void 0&&(W.dataset.language=g.language),W.textContent=g.code,p.append(W),Q.append(p),He(t,Q,g.sourceIds,u,n)}else{let p=c(t,"ul");for(let W of g.items){let De=c(t,"li");De.textContent=W.text,He(t,De,W.sourceIds,u,n),p.append(De)}Q.append(p)}for(let g of o.sources){let p=K(t,n.sourceLabel(g.relativePath,g.startLine,g.endLine),"spotpatch-ask-source");p.dataset.askSourceId=g.sourceId,p.title=g.label,me.append(p)}Ae.hidden=o.sources.length===0,Z.hidden=!1,J.hidden=!0,x=!1,U(),e.onViewChange()}function Ct(){if(r===void 0)return"";let o=r.blocks.flatMap(u=>u.kind==="paragraph"?[u.text]:u.kind==="code"?[u.code]:u.items.map(g=>`- ${g.text}`)).join(`
|
|
58
60
|
|
|
59
|
-
`),C=r.sources.map(
|
|
61
|
+
`),C=r.sources.map(u=>n.sourceLabel(u.relativePath,u.startLine,u.endLine)).join(`
|
|
60
62
|
`);return C.length===0?o:`${o}
|
|
61
63
|
|
|
62
64
|
${n.sourcesTitle}
|
|
63
|
-
${C}`}function
|
|
65
|
+
${C}`}function St(){r=void 0,a=void 0,e.onExecutionChange(),v.value="",Z.hidden=!0,J.hidden=!0,z.hidden=!0,Y.replaceChildren(),ee.hidden=!0,x=!1,U(),e.onViewChange()}l.addEventListener("click",()=>{s="ask",ue(),v.focus({preventScroll:!0})}),T.addEventListener("click",()=>{s="change",ue()}),v.addEventListener("input",U),L.addEventListener("change",()=>{Ge(),U(),e.onViewChange()}),X.addEventListener("change",U);let wt=e.subscribeLocale(Ye);return Ye(),ue(),Object.freeze({root:P,styles:Ut(t),questionInput:v,executorSelect:L,consentCheckbox:X,submitButton:pe,cancelButton:le,newQuestionButton:xe,copyButton:Oe,convertButton:Ne,clear:St,dispose:()=>{wt(),B.dispose(),i.dispose()},focusQuestion:()=>{v.focus({preventScroll:!0})},mode:()=>s,notify(o){let C=o==="copied"?n.copied:o==="copy-failed"?n.copyFailed:o==="converted"?n.converted:n.sourceOpenFailed;e.announce(C)},readConsent:()=>X.checked,readExecutorId:()=>L.value||void 0,readModel:()=>i.select.value||void 0,readQuestion:()=>v.value.trim(),renderAnswer:tt,renderCapability:Ze,renderError(o){a=void 0,e.onExecutionChange(),z.textContent=n.error(o),z.hidden=!1,J.hidden=!0,x=!1,U(),e.onViewChange()},renderEvent:kt,renderJob:et,selectedSourceId(o){return o instanceof Element?o.closest("[data-ask-source-id]")?.dataset.askSourceId:void 0},setBusy(o){x=o,o&&(J.hidden=!1,z.hidden=!0,Z.hidden=!0,Y.replaceChildren()),U()},setConsent(o){X.checked=o,U()},setMode(o){s=o,ue()},setOrigin(o){h.dataset.active=String(o!==void 0),h.hidden=s==="ask"||o===void 0,e.onViewChange()},setSelectionPreview(o){k=o,j.textContent=n.dataSummary(o.targetCount,o.sourceCount),U()},setSelectionVisible(o){P.hidden=!o,o&&ue()},sourceById:o=>r?.sources.find(C=>C.sourceId===o),answerPlainText:Ct})}var Bt=Object.freeze({createPanel:At,createWorkflow:gt});function mt(){ht(Bt)}mt();
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
var m="/__spotpatch/v1",se="X-SpotPatch-Token",w=Object.freeze({bootstrap:`${m}/bootstrap`,sourceContext:`${m}/source-context`,openEditor:`${m}/open-editor`,dataFlowComponentReport:`${m}/data-flow/component-report`,dataFlowPageReport:`${m}/data-flow/page-report`,agentCapability:`${m}/agent/capability`,agentWorkspaceHealth:`${m}/agent/workspace-health`,agentJobs:`${m}/agent/jobs`,askCapability:`${m}/ask/capability`,askJobs:`${m}/ask/jobs`,externalHandoffCapability:`${m}/external-handoff/capability`,externalHandoffPublish:`${m}/external-handoff/publish`,externalHandoffStatus:`${m}/external-handoff/status`,externalHandoffResolveDelivery:`${m}/external-handoff/resolve-delivery`,externalAgentControlStatus:`${m}/external-agent/control/status`,externalAgentControlConnect:`${m}/external-agent/control/connect`,externalAgentControlDisconnect:`${m}/external-agent/control/disconnect`,externalAgentControlCancel:`${m}/external-agent/control/cancel`,externalAgentEvents:`${m}/external-agent/events`,externalAgentResult:`${m}/external-agent/result`});var Ie=Object.freeze({INVALID_REQUEST:"INVALID_REQUEST",INVALID_TOKEN:"INVALID_TOKEN",ORIGIN_NOT_ALLOWED:"ORIGIN_NOT_ALLOWED",EXTERNAL_HANDOFF_DISABLED:"EXTERNAL_HANDOFF_DISABLED",EXTERNAL_HANDOFF_UNAVAILABLE:"EXTERNAL_HANDOFF_UNAVAILABLE",HANDOFF_VALIDATION_FAILED:"HANDOFF_VALIDATION_FAILED",HANDOFF_SOURCE_STALE:"HANDOFF_SOURCE_STALE",HANDOFF_NOT_FOUND:"HANDOFF_NOT_FOUND",HANDOFF_EXPIRED:"HANDOFF_EXPIRED",HANDOFF_CURSOR_INVALID:"HANDOFF_CURSOR_INVALID",HANDOFF_RESPONSE_TOO_LARGE:"HANDOFF_RESPONSE_TOO_LARGE",EXTERNAL_AGENT_BUSY:"EXTERNAL_AGENT_BUSY",ACTIVE_DISPATCH_INVALID:"ACTIVE_DISPATCH_INVALID",SESSION_CLOSED:"SESSION_CLOSED",INTERNAL_ERROR:"INTERNAL_ERROR"}),Pt=Object.values(Ie);function Je(e){return typeof e=="string"&&Pt.includes(e)}var me=Object.freeze({maximumConnectorReceipts:64,maximumWaiters:8,activeStatusPollMs:1e3}),D=Object.freeze({maximumModels:128,maximumModelCharacters:128,maximumEventSubscribers:4,eventHeartbeatMs:15e3,eventReconnectMinimumMs:500,eventReconnectMaximumMs:1e4,maximumChangedFiles:20,maximumChecks:64,maximumEventLineBytes:64*1024,maximumResultDiffBytes:512e3}),Qe="managed-apply-v1",Ze=Object.freeze(["inbox","managed"]),et=Object.freeze(["disconnected","diagnosing","awaiting-consent","connecting","ready","busy","degraded","error","disconnecting"]),tt=Object.freeze(["authenticated","auth-not-required","signed-out","unknown"]),nt=Object.freeze(["missing","valid","invalid"]),ot=Object.freeze(["queued","dispatching","accepted","unknown"]),rt=Object.freeze(["not-observable","started","terminal-succeeded","terminal-failed","interrupted","unknown"]),at=Object.freeze(["preparing","running","auditing","validating","applying","completed","review-required","failed","cancelled","cleanup-warning"]),ke=Object.freeze(["passed","failed","not-configured","unavailable"]),it=Object.freeze(["passed","failed","unavailable"]),st=Object.freeze(["AGENT_BINARY_NOT_FOUND","AGENT_BINARY_UNTRUSTED","AGENT_VERSION_UNSUPPORTED","APP_SERVER_HANDSHAKE_FAILED","AGENT_AUTH_REQUIRED","AGENT_MODEL_UNAVAILABLE","AGENT_PROTOCOL_INCOMPATIBLE","CODEX_CONFIG_ISOLATION_UNSUPPORTED","MANAGED_GRANT_INVALID","MANAGED_PLATFORM_UNSUPPORTED","MANAGED_GIT_REQUIRED","MANAGED_SNAPSHOT_FAILED","MANAGED_SCOPE_VIOLATION","MANAGED_CHANGE_LIMIT_EXCEEDED","MANAGED_VALIDATION_FAILED","MANAGED_WORKSPACE_CONFLICT","MANAGED_APPLY_FAILED","MANAGED_CLEANUP_INCOMPLETE"]),dt=Object.freeze(["integration","binary","handshake","auth","model","protocol","snapshot","audit","validation","apply","cleanup"]),lt=Object.freeze(["retry","user-action","reconfigure","none"]),ct=Object.freeze(["install-agent","use-supported-version","sign-in","choose-available-model","use-inbox","confirm-managed-access","review-candidate-diff","review-workspace-conflict","retry","inspect-cleanup-warning"]);function h(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function T(e,t){let a=Object.keys(e).sort(),s=[...t].sort();return a.length===s.length&&a.every((f,r)=>f===s[r])}function P(e){if(typeof e!="string")return!1;let t=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?Z$/u.exec(e);if(t===null)return!1;let a=Date.parse(e);if(!Number.isFinite(a))return!1;let s=new Date(a);return s.getUTCFullYear()===Number(t[1])&&s.getUTCMonth()+1===Number(t[2])&&s.getUTCDate()===Number(t[3])&&s.getUTCHours()===Number(t[4])&&s.getUTCMinutes()===Number(t[5])&&s.getUTCSeconds()===Number(t[6])}async function Re(e,t){let a=Number(e.headers.get("content-length"));if(Number.isFinite(a)&&a>t)throw await e.body?.cancel(),new TypeError("SpotPatch API response exceeds its safety limit.");if(e.body===null)throw new TypeError("SpotPatch API response body is unavailable.");let s=e.body.getReader(),f=[],r=0;try{for(;;){let d=await s.read();if(d.done)break;if(r+=d.value.byteLength,r>t)throw await s.cancel(),new TypeError("SpotPatch API response exceeds its safety limit.");f.push(d.value)}}finally{s.releaseLock()}let p=new Uint8Array(r),A=0;for(let d of f)p.set(d,A),A+=d.byteLength;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(p))}function Ce(e){if(!h(e)||!T(e,["data","ok"])||e.ok!==!0)throw new TypeError("SpotPatch API success envelope is invalid.");return e.data}var pt=64*1024;function O(e,t){return typeof t=="string"&&e.includes(t)}function J(e,t=0){return Number.isSafeInteger(e)&&e>=t}function Oe(e,t,a){return T(e,[...t,...a.filter(s=>e[s]!==void 0)])}function Mt(e){return typeof e!="string"||e.length===0||e.length>4096||e.startsWith("/")||e.includes("\\")?!1:e.split("/").every(t=>t.length>0&&t!=="."&&t!=="..")}function ut(e){if(!Array.isArray(e)||e.length>D.maximumChangedFiles)throw new TypeError("Invalid managed file summaries.");return e.map(t=>{if(!h(t)||!T(t,["additions","deletions","path"])||!Mt(t.path)||!J(t.additions)||!J(t.deletions))throw new TypeError("Invalid managed file summary.");return Object.freeze({path:t.path,additions:t.additions,deletions:t.deletions})})}function Et(e){if(!Array.isArray(e)||e.length>D.maximumChecks)throw new TypeError("Invalid managed check summaries.");return e.map(t=>{if(!h(t)||!Oe(t,["durationMs","id","outcome"],["exitCode"])||typeof t.id!="string"||!/^[A-Za-z0-9._-]{1,128}$/u.test(t.id)||!O(it,t.outcome)||!J(t.durationMs)||t.exitCode!==void 0&&!Number.isSafeInteger(t.exitCode))throw new TypeError("Invalid managed check summary.");return Object.freeze({id:t.id,outcome:t.outcome,durationMs:t.durationMs,...t.exitCode===void 0?{}:{exitCode:t.exitCode}})})}function ft(e){let t=["preparing","agent","auditing","validating","applying","total"];if(!h(e)||!Oe(e,[],t))throw new TypeError("Invalid managed timings.");for(let a of t)if(e[a]!==void 0&&!J(e[a]))throw new TypeError("Invalid managed timing.");return Object.freeze(Object.fromEntries(t.flatMap(a=>e[a]===void 0?[]:[[a,e[a]]])))}function Ht(e){if(!h(e)||!Oe(e,["checks","deliveryStatus","executionStatus","files","managedPhase","revision","timings"],["resultExpiresAt","validationOutcome"])||!J(e.revision,1)||!O(ot,e.deliveryStatus)||!O(rt,e.executionStatus)||!O(at,e.managedPhase)||e.validationOutcome!==void 0&&!O(ke,e.validationOutcome)||e.resultExpiresAt!==void 0&&!P(e.resultExpiresAt))throw new TypeError("Invalid managed task status.");return Object.freeze({revision:e.revision,deliveryStatus:e.deliveryStatus,executionStatus:e.executionStatus,managedPhase:e.managedPhase,...e.validationOutcome===void 0?{}:{validationOutcome:e.validationOutcome},files:ut(e.files),checks:Et(e.checks),timings:ft(e.timings),...e.resultExpiresAt===void 0?{}:{resultExpiresAt:e.resultExpiresAt}})}function Pe(e){return typeof e=="string"&&e.length>0&&e.length<=D.maximumModelCharacters&&e.trim()===e}function Te(e){if(!h(e)||!Oe(e,["adapter","authReadiness","connectionState","grantState","mode","schemaVersion","sequence","updatedAt"],["effectiveModel","error","requestedModel","task","models"])||e.schemaVersion!==1||!J(e.sequence)||!O(Ze,e.mode)||!O(et,e.connectionState)||!O(tt,e.authReadiness)||!O(nt,e.grantState)||!P(e.updatedAt)||e.requestedModel!==void 0&&!Pe(e.requestedModel)||e.effectiveModel!==void 0&&!Pe(e.effectiveModel)||e.models!==void 0&&(!Array.isArray(e.models)||e.models.length===0||e.models.length>D.maximumModels||!e.models.every(Pe)||new Set(e.models).size!==e.models.length)||!h(e.adapter)||!T(e.adapter,["availability","kind","maturity"])||e.adapter.kind!=="codex"||e.adapter.maturity!=="experimental"||e.adapter.availability!=="available"&&e.adapter.availability!=="unavailable")throw new TypeError("Invalid external Agent control status.");let t;if(e.error!==void 0){if(!h(e.error)||!T(e.error,["action","code","recoverability","stage"])||!O(st,e.error.code)||!O(dt,e.error.stage)||!O(lt,e.error.recoverability)||!O(ct,e.error.action))throw new TypeError("Invalid external Agent error.");t=Object.freeze({code:e.error.code,stage:e.error.stage,recoverability:e.error.recoverability,action:e.error.action})}return Object.freeze({schemaVersion:1,sequence:e.sequence,mode:e.mode,adapter:Object.freeze({kind:"codex",maturity:"experimental",availability:e.adapter.availability}),connectionState:e.connectionState,authReadiness:e.authReadiness,grantState:e.grantState,...e.models===void 0?{}:{models:Object.freeze([...e.models])},...e.requestedModel===void 0?{}:{requestedModel:e.requestedModel},...e.effectiveModel===void 0?{}:{effectiveModel:e.effectiveModel},...e.task===void 0?{}:{task:Ht(e.task)},...t===void 0?{}:{error:t},updatedAt:e.updatedAt})}function Gt(e){if(!h(e)||!T(e,["checks","diff","expiresAt","files","revision","timings","validationOutcome"])||!J(e.revision,1)||typeof e.diff!="string"||e.diff.length>D.maximumResultDiffBytes||!P(e.expiresAt)||!O(ke,e.validationOutcome))throw new TypeError("Invalid managed Agent result.");return Object.freeze({revision:e.revision,diff:e.diff,files:ut(e.files),checks:Et(e.checks),timings:ft(e.timings),validationOutcome:e.validationOutcome,expiresAt:e.expiresAt})}function Ft(e){if(!h(e)||typeof e.type!="string")throw new TypeError("Invalid external Agent event.");if(e.type==="status"&&T(e,["data","type"]))return Object.freeze({type:"status",data:Te(e.data)});if(e.type==="heartbeat"&&T(e,["emittedAt","sequence","type"])&&J(e.sequence)&&P(e.emittedAt))return Object.freeze({type:"heartbeat",sequence:e.sequence,emittedAt:e.emittedAt});throw new TypeError("Invalid external Agent event.")}function At(e,t){let a=async(s,f,r=pt)=>{let p=await e(s,{method:"POST",headers:{"Content-Type":"application/json",[se]:t},body:JSON.stringify(f)}),A=await Re(p,r);if(!p.ok)throw new TypeError("External Agent control request failed.");return Ce(A)};return Object.freeze({async status(){return Te(await a(w.externalAgentControlStatus,{}))},async connect(s){return Te(await a(w.externalAgentControlConnect,s))},async disconnect(s){return Te(await a(w.externalAgentControlDisconnect,s))},async cancel(s){return Te(await a(w.externalAgentControlCancel,s))},async result(s){return Gt(await a(w.externalAgentResult,{revision:s},D.maximumResultDiffBytes+pt))},async events(s,f,r){let p=await e(w.externalAgentEvents,{method:"POST",headers:{"Content-Type":"application/json",[se]:t},body:JSON.stringify(s===void 0?{}:{afterSequence:s}),signal:f});if(!p.ok||p.body===null)throw await p.body?.cancel(),new TypeError("External Agent event stream is unavailable.");let A=p.body.getReader(),d=new Uint8Array(0);try{for(;;){let n=await A.read();if(n.done)break;let I=new Uint8Array(d.byteLength+n.value.byteLength);for(I.set(d),I.set(n.value,d.byteLength),d=I;;){let _=d.indexOf(10);if(_===-1)break;if(_===0||_>D.maximumEventLineBytes)throw new TypeError("External Agent event line is invalid.");let L=d.slice(0,_);d=d.slice(_+1);let b=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(L));r(Ft(b))}if(d.byteLength>D.maximumEventLineBytes)throw new TypeError("External Agent event line exceeds its limit.")}if(d.byteLength!==0)throw new TypeError("External Agent event stream ended mid-record.")}finally{A.releaseLock()}}})}var Ut=64*1024,xt=/^[A-Za-z0-9_-]{22,128}$/u,y=class extends Error{constructor(a){super("SpotPatch external handoff API request failed.");this.code=a;this.name="ExternalHandoffApiError"}code};function Me(e){if(e===null)return null;if(!h(e)||!T(e,["canDispatch","connectedAt","kind","state","updatedAt"])||e.kind!=="claude-channel"&&e.kind!=="codex-app-server"||e.state!=="ready"&&e.state!=="busy"&&e.state!=="blocked"||typeof e.canDispatch!="boolean"||e.canDispatch!==(e.state==="ready")||!P(e.connectedAt)||!P(e.updatedAt))throw new y;return Object.freeze({kind:e.kind,state:e.state,canDispatch:e.canDispatch,connectedAt:e.connectedAt,updatedAt:e.updatedAt})}function He(e){if(e===null)return null;if(!h(e))throw new y;if(!T(e,["adapterKind","phase","revision","updatedAt"])||e.adapterKind!=="claude-channel"&&e.adapterKind!=="codex-app-server"||!Number.isSafeInteger(e.revision)||e.revision<=0||e.phase!=="queued"&&e.phase!=="dispatching"&&e.phase!=="dispatched"&&e.phase!=="working"&&e.phase!=="completed"&&e.phase!=="failed"&&e.phase!=="delivery-unknown"||!P(e.updatedAt))throw new y;return Object.freeze({adapterKind:e.adapterKind,revision:e.revision,phase:e.phase,updatedAt:e.updatedAt})}function Bt(e){if(!h(e)||!T(e,["activeAdapter","activeWaitCount","brokerProtocolVersion","brokerReady","dispatch","enabled","snapshotSchemaVersion"])||e.enabled!==!0||typeof e.brokerReady!="boolean"||!Number.isSafeInteger(e.activeWaitCount)||e.activeWaitCount<0||e.activeWaitCount>me.maximumWaiters||e.snapshotSchemaVersion!==1||e.brokerProtocolVersion!==2)throw new y;return Object.freeze({enabled:!0,brokerReady:e.brokerReady,activeWaitCount:e.activeWaitCount,activeAdapter:Me(e.activeAdapter),dispatch:He(e.dispatch),snapshotSchemaVersion:1,brokerProtocolVersion:2})}function $t(e){if(!h(e)||!T(e,["delivery","handoff","replayed"])||typeof e.replayed!="boolean"||!h(e.delivery))throw new y;let t=Tt(e.handoff);if(e.delivery.mode==="inbox"){if(!T(e.delivery,["mode"]))throw new y;return Object.freeze({handoff:t,delivery:Object.freeze({mode:"inbox"}),replayed:e.replayed})}if(e.delivery.mode!=="active"||!T(e.delivery,["adapter","dispatch","mode"]))throw new y;let a=Me(e.delivery.adapter),s=He(e.delivery.dispatch);if(a===null||s?.revision!==t.revision)throw new y;return Object.freeze({handoff:t,delivery:Object.freeze({mode:"active",adapter:a,dispatch:s}),replayed:e.replayed})}function mt(e){if(!h(e)||!T(e,["activeAdapter","dispatch","handoff"]))throw new y;let t=Tt(e.handoff),a=He(e.dispatch);if(a!==null&&a.revision!==t.revision)throw new y;return Object.freeze({handoff:t,activeAdapter:Me(e.activeAdapter),dispatch:a})}function Tt(e){if(!h(e))throw new y;let t=["cursor","expiresAt","framework","page","pickupCount","publishedAt","revision","sessionId","state","targetCount",...e.pickedUpAt===void 0?[]:["pickedUpAt"]];if(!T(e,t)||typeof e.sessionId!="string"||!xt.test(e.sessionId)||e.framework!=="vite"&&e.framework!=="next"||!Number.isSafeInteger(e.revision)||e.revision<=0||typeof e.cursor!="string"||!xt.test(e.cursor)||!Number.isSafeInteger(e.targetCount)||e.targetCount<=0||!h(e.page)||!T(e.page,["origin","pathname"])||typeof e.page.origin!="string"||typeof e.page.pathname!="string"||!P(e.publishedAt)||!P(e.expiresAt)||e.state!=="available"&&e.state!=="expired"&&e.state!=="superseded"||!Number.isSafeInteger(e.pickupCount)||e.pickupCount<0||e.pickupCount>me.maximumConnectorReceipts||e.pickedUpAt!==void 0&&!P(e.pickedUpAt))throw new y;return Object.freeze({sessionId:e.sessionId,framework:e.framework,revision:e.revision,cursor:e.cursor,targetCount:e.targetCount,page:Object.freeze({origin:e.page.origin,pathname:e.page.pathname}),publishedAt:e.publishedAt,expiresAt:e.expiresAt,state:e.state,pickupCount:e.pickupCount,...e.pickedUpAt===void 0?{}:{pickedUpAt:e.pickedUpAt}})}function Xt(e){return h(e)&&e.ok===!1&&h(e.error)&&Je(e.error.code)?e.error.code:void 0}function Vt(e){return{...e,targets:e.targets.map(t=>({instruction:t.instruction,...t.page===void 0?{}:{page:t.page},source:t.source,react:t.react,element:t.element,styles:t.styles,warnings:t.warnings}))}}function _e(e){let t=new Uint8Array(24);return e.crypto.getRandomValues(t),Array.from(t,a=>a.toString(16).padStart(2,"0")).join("")}function jt(e){return e!==null&&e.phase!=="completed"&&e.phase!=="failed"&&e.phase!=="delivery-unknown"}function qt(e){let t=new Set,a=async(s,f)=>{let r=new AbortController;t.add(r);try{let p=await e.fetch(s,{method:"POST",headers:{"Content-Type":"application/json",[se]:e.sessionToken},body:JSON.stringify(f),signal:r.signal}),A;try{A=await Re(p,Ut)}catch{throw new y}if(!p.ok)throw new y(Xt(A));try{return Ce(A)}catch{throw new y}}finally{t.delete(r)}};return Object.freeze({cancel(){for(let s of t)s.abort();t.clear()},async capability(){return Bt(await a(w.externalHandoffCapability,{}))},async publish(s,f){return $t(await a(w.externalHandoffPublish,{annotation:Vt(f),requestId:s}))},async status(s){return mt(await a(w.externalHandoffStatus,s===void 0?{}:{cursor:s}))},async resolveDelivery(s){return mt(await a(w.externalHandoffResolveDelivery,{confirmation:"workspace-reviewed",cursor:s}))}})}function _t(e,t,a,s,f){let r={fetch:e,panel:t,selectedAnnotation:a,sessionToken:s,window:f},p=qt(r),A=At(e,s),d=new Set,n={disposed:!1,mounted:!1,operation:0,userActionPending:!1},I,_,L,b=D.eventReconnectMinimumMs,k,F=!1,de,Q,S,E,Z=()=>n.disposed,M=()=>{for(let i of d)r.window.clearTimeout(i);d.clear()},te=()=>{k!==void 0&&(r.window.clearTimeout(k),k=void 0)},le=async i=>{if(!(n.disposed||de===i||Q===i)){Q=i;try{let l=await A.result(i);if(Z()||_?.task?.revision!==i)return;de=i,r.panel.renderManagedResult(l)}catch{}finally{Q===i&&(Q=void 0)}}},H=i=>{if(_!==void 0&&i.sequence<_.sequence)return;_=i,b=D.eventReconnectMinimumMs,r.panel.renderControlStatus(i);let l=i.task?.resultExpiresAt===void 0?void 0:i.task.revision;l!==void 0&&le(l)},ne=i=>{if(i.type==="status"){H(i.data);return}let l=_?.task?.resultExpiresAt===void 0?void 0:_.task.revision;l!==void 0&&le(l)},ce=()=>{if(n.disposed||!n.mounted||L!==void 0)return;te();let i=new AbortController;L=i,A.events(_?.sequence,i.signal,ne).catch(l=>{n.disposed||l instanceof DOMException&&l.name==="AbortError"||_===void 0&&r.panel.renderControlUnavailable()}).finally(()=>{if(L===i&&(L=void 0),n.disposed||!n.mounted)return;let l=b;b=Math.min(l*2,D.eventReconnectMaximumMs),k=r.window.setTimeout(()=>{k=void 0,ce()},l)})},q=async()=>{H(await A.status())},pe=async()=>{try{await q()}catch{n.disposed||r.panel.renderControlUnavailable()}finally{n.disposed||ce()}},x=async i=>{if(!(n.disposed||F)){F=!0,r.panel.setControlBusy(!0);try{H(await i())}catch{try{await q()}catch{Z()||r.panel.renderControlUnavailable()}}finally{F=!1,Z()||r.panel.setControlBusy(!1)}}},oe=()=>{let i=r.panel.readModel();x(()=>A.connect({requestId:_e(r.window),adapterKind:"codex",profile:Qe,...i===void 0?{}:{model:i}}))},ue=()=>{x(()=>A.disconnect({requestId:_e(r.window),adapterKind:"codex",revokeGrant:!1}))},Ee=()=>{x(()=>A.disconnect({requestId:_e(r.window),adapterKind:"codex",revokeGrant:!0}))},fe=()=>{let i=_?.task?.revision;i!==void 0&&x(()=>A.cancel({requestId:_e(r.window),revision:i}))},z=i=>i instanceof y?i.code:void 0,Se=()=>{S!==void 0?r.panel.renderStatus(S):I!==void 0&&r.panel.renderCapability(I)},re=async i=>{try{let l=await p.capability();if(n.disposed||i!==n.operation)return;if(I=l,r.panel.renderCapability(l),l.dispatch!==null){let u=await p.status();if(i!==n.operation)return;S=u,r.panel.renderStatus(u)}}catch(l){if(n.disposed||i!==n.operation||l instanceof DOMException&&l.name==="AbortError")return;r.panel.renderError(z(l))}},N=async i=>{if(S===void 0){await re(i);return}try{let l=await p.status(S.handoff.cursor);if(n.disposed||i!==n.operation)return;S=l,r.panel.renderStatus(l)}catch(l){if(n.disposed||i!==n.operation||l instanceof DOMException&&l.name==="AbortError")return;r.panel.renderError(z(l))}},Ae=(i,l)=>{let u=n.operation,C=r.window.setTimeout(()=>{d.delete(C),N(u).then(()=>{l&&!n.disposed&&u===n.operation&&!n.userActionPending&&S!==void 0&&jt(S.dispatch)&&Ae(me.activeStatusPollMs,l)})},i);d.add(C)},G=async()=>{if(n.userActionPending)return;n.userActionPending=!0;let i=E;if(i===void 0){let u=r.selectedAnnotation();if(u===void 0){n.userActionPending=!1,r.panel.renderError(Ie.HANDOFF_VALIDATION_FAILED);return}let C=n.operation;if(r.panel.setBusy(!0),!await r.panel.confirmDisclosure(u)||C!==n.operation){n.userActionPending=!1,r.panel.setBusy(!1);return}i=Object.freeze({annotation:u,requestId:_e(r.window)})}E=i,n.operation+=1;let l=n.operation;M(),p.cancel(),r.panel.renderPublishing();try{let u=await p.publish(i.requestId,i.annotation);if(l!==n.operation)return;E=void 0,S=Object.freeze({handoff:u.handoff,activeAdapter:u.delivery.mode==="active"?u.delivery.adapter:null,dispatch:u.delivery.mode==="active"?u.delivery.dispatch:null}),r.panel.renderPublishResult(u),Ae(u.delivery.mode==="active"?me.activeStatusPollMs:500,u.delivery.mode==="active")}catch(u){if(l!==n.operation||u instanceof DOMException&&u.name==="AbortError")return;let C=z(u),X=C===void 0;X||(E=void 0),r.panel.renderError(C,X)}finally{l===n.operation&&(n.userActionPending=!1,r.panel.setBusy(!1))}},ge=async()=>{if(n.userActionPending)return;n.userActionPending=!0,n.operation+=1;let i=n.operation;M(),p.cancel(),r.panel.setBusy(!0);try{await N(i)}finally{!n.disposed&&i===n.operation&&(n.userActionPending=!1,r.panel.setBusy(!1))}},K=async()=>{if(n.userActionPending||S===void 0||S.dispatch?.phase!=="delivery-unknown")return;n.userActionPending=!0,n.operation+=1;let i=n.operation;M(),p.cancel(),r.panel.setBusy(!0);try{let l=await p.resolveDelivery(S.handoff.cursor);if(n.disposed||i!==n.operation)return;S=l,r.panel.renderStatus(l)}catch(l){if(n.disposed||i!==n.operation||l instanceof DOMException&&l.name==="AbortError")return;r.panel.renderError(z(l))}finally{!n.disposed&&i===n.operation&&(n.userActionPending=!1,r.panel.setBusy(!1))}},W=()=>{G()},Y=()=>{ge()},B=()=>{K()};return Object.freeze({mount(){n.mounted||n.disposed||(n.mounted=!0,r.panel.sendButton.addEventListener("click",W),r.panel.refreshButton.addEventListener("click",Y),r.panel.resolveButton.addEventListener("click",B),r.panel.connectButton.addEventListener("click",oe),r.panel.disconnectButton.addEventListener("click",ue),r.panel.revokeButton.addEventListener("click",Ee),r.panel.cancelManagedButton.addEventListener("click",fe),re(n.operation),pe())},cancelPending:()=>{n.operation+=1,n.userActionPending=!1,E=void 0,M(),p.cancel(),Se(),I===void 0&&n.mounted&&!n.disposed&&re(n.operation)},dispose(){n.disposed||(n.disposed=!0,n.operation+=1,n.userActionPending=!1,E=void 0,M(),te(),L?.abort("workflow-disposed"),L=void 0,p.cancel(),r.panel.sendButton.removeEventListener("click",W),r.panel.refreshButton.removeEventListener("click",Y),r.panel.resolveButton.removeEventListener("click",B),r.panel.connectButton.removeEventListener("click",oe),r.panel.disconnectButton.removeEventListener("click",ue),r.panel.revokeButton.removeEventListener("click",Ee),r.panel.cancelManagedButton.removeEventListener("click",fe))}})}var St="data-spotpatch-ui",dn=Object.freeze({highlight:2147483646,controls:2147483647}),ln=Object.freeze({compactInset:8,compactViewportWidth:520,desktopInset:24,dragActivationDistance:6,edgeSnapDistance:20,workbenchMaxHeight:620,workbenchMaxWidth:460});function c(e,t){let a=e.createElement(t);return a.setAttribute(St,""),a}function U(e,t,a=""){let s=c(e,"button");return s.type="button",s.className=a,s.textContent=t,s}var yt=Object.freeze({"en-US":Object.freeze({title:"External Agent connection",agentLabel:"Agent",modelLabel:"Managed Codex model",modelLoading:"Connect to load available models",modelHint:"Applies only to this managed connection, not API Key settings. Apply changes before publishing; switching reconnects Codex.",applyModel:"Apply model",codexManaged:"Codex · managed (experimental)",connectManaged:"Connect Codex",disconnectManaged:"Disconnect",revokeManaged:"Revoke grant",cancelManaged:"Cancel managed task",resultTitle:"Managed result",controlConnection:(e,t)=>`Connection: ${e} · Mode: ${t}`,controlAuth:(e,t)=>`Auth: ${e} · Grant: ${t}`,controlConsentRequired:e=>`Initialize project access once: run \`${e}\` from this project, then connect again. No dev-terminal confirmation is required. The grant allows isolated snapshot writes and validated application; revoke it here at any time.`,controlModel:e=>`Model: ${e}`,controlRevision:e=>`Revision ${String(e.revision)}: ${e.deliveryStatus} / ${e.executionStatus} / ${e.managedPhase}`,controlValidation:e=>`Validation: ${e}`,controlFailure:(e,t)=>`Error: ${e} · Next: ${t}`,controlUnavailable:"Page connection management is unavailable; external handoffs still fall back honestly to the Agent inbox.",controlErrorText:Object.freeze({AGENT_BINARY_NOT_FOUND:"Codex is not installed or is not on PATH.",AGENT_BINARY_UNTRUSTED:"The resolved Codex executable is not trusted.",AGENT_VERSION_UNSUPPORTED:"The installed Codex version is below SpotPatch's compatibility baseline.",APP_SERVER_HANDSHAKE_FAILED:"Codex App Server did not complete startup.",AGENT_AUTH_REQUIRED:"Codex requires an authenticated account.",AGENT_MODEL_UNAVAILABLE:"The configured Codex model is unavailable.",AGENT_PROTOCOL_INCOMPATIBLE:"The generated Codex App Server schema is incompatible with SpotPatch's required protocol subset.",CODEX_CONFIG_ISOLATION_UNSUPPORTED:"This Codex version cannot prove managed configuration isolation.",MANAGED_GRANT_INVALID:"The saved project grant failed validation.",MANAGED_PLATFORM_UNSUPPORTED:"Managed execution is not proven safe on this platform.",MANAGED_GIT_REQUIRED:"Managed execution requires a Git repository.",MANAGED_SNAPSHOT_FAILED:"The independent workspace snapshot could not be created.",MANAGED_SCOPE_VIOLATION:"The candidate change exceeded its authorized paths.",MANAGED_CHANGE_LIMIT_EXCEEDED:"The candidate change exceeded safety limits.",MANAGED_VALIDATION_FAILED:"The candidate change did not pass audit or validation.",MANAGED_WORKSPACE_CONFLICT:"An authorized source file changed during execution.",MANAGED_APPLY_FAILED:"The audited change could not be applied safely.",MANAGED_CLEANUP_INCOMPLETE:"Managed thread or workspace cleanup is incomplete."}),controlActionText:Object.freeze({"install-agent":"Install Codex and retry.","use-supported-version":"Use a schema-compatible Codex version.","sign-in":"Sign in with Codex, then retry.","choose-available-model":"Choose an available model and reconnect Codex.","use-inbox":"Continue with the Agent inbox fallback.","confirm-managed-access":"Revoke the invalid grant and confirm access again.","review-candidate-diff":"Review the candidate diff and validation output.","review-workspace-conflict":"Review the workspace changes before retrying.",retry:"Retry the managed connection.","inspect-cleanup-warning":"Inspect cleanup status before reconnecting."}),resultHeader:(e,t)=>`Revision ${String(e)} · Validation ${t}`,resultDisposition:e=>e==="passed"?"Applied to the project after validation passed.":`Candidate only; it was not applied because validation is ${e}.`,resultTiming:(e,t)=>`Timing ${e}: ${String(t)} ms`,description:"Send through a ready active adapter, or publish to the project Agent inbox when no active adapter is connected.",ready:"Local Broker ready. No Agent connection is assumed until a connector reads or waits.",readyWaiting:e=>`${String(e)} active connector wait request(s); publishing can wake them immediately.`,activeReady:e=>`${e} is connected and idle. The next send will dispatch immediately.`,publishing:"Authorizing current source and publishing the handoff…",published:(e,t)=>`Revision ${String(e)} is available until ${t}. It has not been claimed as edited.`,queued:(e,t)=>`Revision ${String(t)} is reserved for ${e}.`,dispatching:(e,t)=>`Dispatching revision ${String(t)} to ${e}…`,dispatched:(e,t)=>e==="Claude Code"?`Revision ${String(t)} was written to the Claude Channel transport; there is no model ACK yet.`:`Codex App Server accepted revision ${String(t)}; waiting for the matching turn to start.`,working:(e,t)=>`${e} is working on revision ${String(t)}.`,completed:(e,t)=>`${e} ended revision ${String(t)} normally. Review the diff and checks; this does not prove the requested change is correct.`,failed:(e,t)=>`${e} reported revision ${String(t)} as failed. The connector is idle again.`,unknown:(e,t)=>`Delivery of revision ${String(t)} to ${e} is uncertain. The managed writer stopped; review the workspace before allowing another task.`,unknownResolved:(e,t)=>`Revision ${String(t)} for ${e} remains delivery-unknown, but the workspace review was confirmed. A new connector or inbox task may now be used.`,pickedUp:(e,t,a)=>`Revision ${String(e)} was picked up by ${String(t)} connector instance(s)${a===void 0?".":`; last pickup ${a}.`} This does not prove a code change.`,expired:e=>`Revision ${String(e)} expired. Review the current selection and publish again.`,superseded:e=>`Revision ${String(e)} was superseded by a newer handoff.`,send:"Send to Agent",inboxSend:"Publish to Agent inbox",retry:"Retry same send",refresh:"Refresh pickup status",resolveUnknown:"Workspace reviewed — allow a new task",settingsTitle:"Project connection setup",settingsHelp:"Codex managed mode is owned by the current development server. The browser never receives vendor credentials or arbitrary command access. Generic and attached adapters remain honest Inbox fallbacks.",disclosureTitle:"Confirm external Agent handoff",disclosureIntro:(e,t)=>`Publish ${String(e)} selected target(s) referencing ${String(t)} relative file(s).`,disclosureData:"The handoff includes your instructions, component/page context, sanitized DOM/CSS, and bounded source read again by the local Node service.",disclosureInbox:"Any SpotPatch connector configured for this project may read it during the 15-minute lifetime.",disclosureProvider:"The Agent host may send the content to its cloud provider under that product's data policy.",disclosureNoGuarantee:"External edits do not receive SpotPatch's built-in worktree, Apply, or Revert guarantees.",disclosureManagedGuarantee:"Managed Codex edits run in an independent temporary snapshot. SpotPatch audits the diff and only applies it when every trusted required check passes.",cancel:"Cancel",confirm:"Confirm and send",error:e=>e==="EXTERNAL_AGENT_BUSY"?"The active Agent is still busy or blocked by an uncertain delivery.":e==="ACTIVE_DISPATCH_INVALID"?"The active delivery state changed. Refresh before continuing.":e==="HANDOFF_SOURCE_STALE"?"The selected source changed. Select the current component again.":e==="HANDOFF_RESPONSE_TOO_LARGE"?"The handoff is too large. Reduce the selected context.":e==="EXTERNAL_HANDOFF_DISABLED"?"External Agent handoff is disabled in trusted project configuration.":e==="EXTERNAL_HANDOFF_UNAVAILABLE"||e==="SESSION_CLOSED"?"The local external Agent Broker is unavailable. Restart the development server.":"The external Agent handoff request failed without publishing a partial revision."}),"zh-CN":Object.freeze({title:"外部 Agent 连接",agentLabel:"Agent",modelLabel:"受管 Codex 模型",modelLoading:"连接后加载可用模型",modelHint:"仅作用于此受管连接,不修改 API Key 配置。更换后请先应用模型,再发布任务;应用时会重新连接 Codex。",applyModel:"应用模型",codexManaged:"Codex · 受管模式(实验性)",connectManaged:"连接 Codex",disconnectManaged:"断开连接",revokeManaged:"撤销授权",cancelManaged:"取消受管任务",resultTitle:"受管执行结果",controlConnection:(e,t)=>`连接:${e} · 模式:${t}`,controlAuth:(e,t)=>`认证:${e} · 授权:${t}`,controlConsentRequired:e=>`请在当前项目执行一次初始化:\`${e}\`,然后重新连接,无需在开发终端输入 yes。授权允许隔离快照修改及校验后的应用,可随时在此撤销。`,controlModel:e=>`模型:${e}`,controlRevision:e=>`revision ${String(e.revision)}:${e.deliveryStatus} / ${e.executionStatus} / ${e.managedPhase}`,controlValidation:e=>`验证:${e}`,controlFailure:(e,t)=>`错误:${e} · 下一步:${t}`,controlUnavailable:"页面连接管理不可用;外部交接仍会按真实能力降级为 Agent 收件箱。",controlErrorText:Object.freeze({AGENT_BINARY_NOT_FOUND:"未安装 Codex,或 Codex 不在 PATH 中。",AGENT_BINARY_UNTRUSTED:"解析到的 Codex 可执行文件不可信。",AGENT_VERSION_UNSUPPORTED:"已安装的 Codex 版本低于 SpotPatch 兼容基线。",APP_SERVER_HANDSHAKE_FAILED:"Codex App Server 未完成启动握手。",AGENT_AUTH_REQUIRED:"Codex 需要已登录的账户。",AGENT_MODEL_UNAVAILABLE:"Codex 配置的模型当前不可用。",AGENT_PROTOCOL_INCOMPATIBLE:"Codex 生成的 App Server Schema 不满足 SpotPatch 所需协议子集。",CODEX_CONFIG_ISOLATION_UNSUPPORTED:"当前 Codex 版本无法证明受管配置隔离。",MANAGED_GRANT_INVALID:"保存的项目授权未通过校验。",MANAGED_PLATFORM_UNSUPPORTED:"当前平台尚未证明可安全运行受管执行。",MANAGED_GIT_REQUIRED:"受管执行要求项目位于 Git 仓库中。",MANAGED_SNAPSHOT_FAILED:"无法创建独立工作区快照。",MANAGED_SCOPE_VIOLATION:"候选修改超出授权路径。",MANAGED_CHANGE_LIMIT_EXCEEDED:"候选修改超过安全上限。",MANAGED_VALIDATION_FAILED:"候选修改未通过审计或验证。",MANAGED_WORKSPACE_CONFLICT:"执行期间授权源码发生了变化。",MANAGED_APPLY_FAILED:"已审计修改无法安全写入。",MANAGED_CLEANUP_INCOMPLETE:"受管 thread 或工作区清理不完整。"}),controlActionText:Object.freeze({"install-agent":"安装 Codex 后重试。","use-supported-version":"改用 Schema 兼容的 Codex 版本。","sign-in":"登录 Codex 后重试。","choose-available-model":"选择可用模型后重新连接 Codex。","use-inbox":"继续使用 Agent 收件箱降级路径。","confirm-managed-access":"撤销无效授权并重新确认。","review-candidate-diff":"检查候选 diff 和验证输出。","review-workspace-conflict":"检查工作区变化后再重试。",retry:"重试受管连接。","inspect-cleanup-warning":"确认清理状态后再连接。"}),resultHeader:(e,t)=>`revision ${String(e)} · 验证 ${t}`,resultDisposition:e=>e==="passed"?"验证通过,修改已写入项目。":`这只是候选 diff;验证状态为 ${e},因此没有写入项目。`,resultTiming:(e,t)=>`耗时 ${e}: ${String(t)} ms`,description:"有主动适配器就立即派发;未连接主动适配器时,诚实降级为项目 Agent 收件箱。",ready:"本地 Broker 已就绪。只有连接器读取或等待后,才能证明发生过连接。",readyWaiting:e=>`当前有 ${String(e)} 个连接器等待请求,发布后可立即唤醒。`,activeReady:e=>`${e} 已连接并处于空闲状态,下次发送会立即派发。`,publishing:"正在重新授权当前源码并发布交接……",published:(e,t)=>`交接 revision ${String(e)} 可读取至 ${t};这不表示代码已被修改。`,queued:(e,t)=>`交接 revision ${String(t)} 已为 ${e} 预留。`,dispatching:(e,t)=>`正在把 revision ${String(t)} 派发给 ${e}……`,dispatched:(e,t)=>e==="Claude Code"?`revision ${String(t)} 已写入 Claude Channel transport;当前没有模型 ACK。`:`Codex App Server 已接受 revision ${String(t)},正在等待匹配 turn 启动。`,working:(e,t)=>`${e} 正在处理 revision ${String(t)}。`,completed:(e,t)=>`${e} 已正常结束 revision ${String(t)}。请核对 diff 和检查结果;这不证明修改要求已经正确完成。`,failed:(e,t)=>`${e} 已将 revision ${String(t)} 报告为失败,连接器已恢复空闲。`,unknown:(e,t)=>`revision ${String(t)} 向 ${e} 的投递结果不确定。受管 writer 已停止,请先核对工作区再允许新任务。`,unknownResolved:(e,t)=>`${e} 的 revision ${String(t)} 仍记为投递未知,但工作区核对已经确认;现在可以重新连接或发布新的收件箱任务。`,pickedUp:(e,t,a)=>`交接 revision ${String(e)} 已被 ${String(t)} 个连接器实例取走${a===void 0?"。":`,最近取件于 ${a}。`}这不能证明代码已经修改。`,expired:e=>`交接 revision ${String(e)} 已过期,请核对当前选择后重新发布。`,superseded:e=>`交接 revision ${String(e)} 已被更新版本取代。`,send:"发送给 Agent",inboxSend:"发布到 Agent 收件箱",retry:"重试同一次发送",refresh:"刷新取件状态",resolveUnknown:"已核对工作区,允许新任务",settingsTitle:"项目连接设置",settingsHelp:"Codex 受管模式由当前开发服务托管,浏览器不会获得厂商凭证或任意命令权限;通用与 attached adapter 仍按真实能力降级为收件箱。",disclosureTitle:"确认发布到外部 Agent",disclosureIntro:(e,t)=>`将发布 ${String(e)} 个目标,涉及 ${String(t)} 个项目相对文件。`,disclosureData:"交接包含修改说明、组件与页面上下文、已清洗的 DOM/CSS,以及本地 Node 服务重新读取的有界源码。",disclosureInbox:"15 分钟有效期内,本项目中任何已配置的 SpotPatch Connector 都可能读取。",disclosureProvider:"Agent 宿主可能依据其产品数据策略,将内容发送给云端模型服务。",disclosureNoGuarantee:"外部修改不具备 SpotPatch 内建 Agent 的 worktree、Apply 或 Revert 保证。",disclosureManagedGuarantee:"受管 Codex 只写独立临时快照。SpotPatch 会审计 diff,且仅在所有可信 required checks 通过后才写入业务仓库。",cancel:"取消",confirm:"确认并发送",error:e=>e==="EXTERNAL_AGENT_BUSY"?"主动 Agent 仍在工作,或存在尚未核对的投递未知状态。":e==="ACTIVE_DISPATCH_INVALID"?"主动投递状态已经变化,请刷新后再继续。":e==="HANDOFF_SOURCE_STALE"?"选中源码已经变化,请重新选择当前组件。":e==="HANDOFF_RESPONSE_TOO_LARGE"?"交接内容超过上限,请减少所选上下文。":e==="EXTERNAL_HANDOFF_DISABLED"?"可信项目配置没有启用外部 Agent 交接。":e==="EXTERNAL_HANDOFF_UNAVAILABLE"||e==="SESSION_CLOSED"?"本地外部 Agent Broker 不可用,请重启开发服务。":"外部 Agent 交接请求失败,未发布任何部分 revision。"})});function zt(e){let t=e.createElement("style");return t.textContent=`
|
|
1
|
+
var _="/__spotpatch/v1",ce="X-SpotPatch-Token",P=Object.freeze({bootstrap:`${_}/bootstrap`,sourceContext:`${_}/source-context`,openEditor:`${_}/open-editor`,dataFlowComponentReport:`${_}/data-flow/component-report`,dataFlowPageReport:`${_}/data-flow/page-report`,agentCapability:`${_}/agent/capability`,agentWorkspaceHealth:`${_}/agent/workspace-health`,agentJobs:`${_}/agent/jobs`,askCapability:`${_}/ask/capability`,askJobs:`${_}/ask/jobs`,externalHandoffCapability:`${_}/external-handoff/capability`,externalHandoffPublish:`${_}/external-handoff/publish`,externalHandoffStatus:`${_}/external-handoff/status`,externalHandoffResolveDelivery:`${_}/external-handoff/resolve-delivery`,externalAgentControlStatus:`${_}/external-agent/control/status`,externalAgentControlConnect:`${_}/external-agent/control/connect`,externalAgentControlDisconnect:`${_}/external-agent/control/disconnect`,externalAgentControlCancel:`${_}/external-agent/control/cancel`,externalAgentEvents:`${_}/external-agent/events`,externalAgentResult:`${_}/external-agent/result`});var Pe=Object.freeze({INVALID_REQUEST:"INVALID_REQUEST",INVALID_TOKEN:"INVALID_TOKEN",ORIGIN_NOT_ALLOWED:"ORIGIN_NOT_ALLOWED",EXTERNAL_HANDOFF_DISABLED:"EXTERNAL_HANDOFF_DISABLED",EXTERNAL_HANDOFF_UNAVAILABLE:"EXTERNAL_HANDOFF_UNAVAILABLE",HANDOFF_VALIDATION_FAILED:"HANDOFF_VALIDATION_FAILED",HANDOFF_SOURCE_STALE:"HANDOFF_SOURCE_STALE",HANDOFF_NOT_FOUND:"HANDOFF_NOT_FOUND",HANDOFF_EXPIRED:"HANDOFF_EXPIRED",HANDOFF_CURSOR_INVALID:"HANDOFF_CURSOR_INVALID",HANDOFF_RESPONSE_TOO_LARGE:"HANDOFF_RESPONSE_TOO_LARGE",EXTERNAL_AGENT_BUSY:"EXTERNAL_AGENT_BUSY",ACTIVE_DISPATCH_INVALID:"ACTIVE_DISPATCH_INVALID",SESSION_CLOSED:"SESSION_CLOSED",INTERNAL_ERROR:"INTERNAL_ERROR"}),Ut=Object.values(Pe);function Qe(e){return typeof e=="string"&&Ut.includes(e)}var Te=Object.freeze({maximumConnectorReceipts:64,maximumWaiters:8,activeStatusPollMs:1e3}),M=Object.freeze({maximumModels:128,maximumModelCharacters:128,maximumEventSubscribers:4,eventHeartbeatMs:15e3,eventReconnectMinimumMs:500,eventReconnectMaximumMs:1e4,maximumChangedFiles:20,maximumChecks:64,maximumEventLineBytes:64*1024,maximumResultDiffBytes:512e3}),Ze="managed-apply-v1",et=Object.freeze(["inbox","managed"]),tt=Object.freeze(["disconnected","diagnosing","awaiting-consent","connecting","ready","busy","degraded","error","disconnecting"]),nt=Object.freeze(["authenticated","auth-not-required","signed-out","unknown"]),ot=Object.freeze(["missing","valid","invalid"]),rt=Object.freeze(["queued","dispatching","accepted","unknown"]),at=Object.freeze(["not-observable","started","terminal-succeeded","terminal-failed","interrupted","unknown"]),it=Object.freeze(["preparing","running","auditing","validating","applying","completed","review-required","failed","cancelled","cleanup-warning"]),Me=Object.freeze(["passed","failed","not-configured","unavailable"]),st=Object.freeze(["passed","failed","unavailable"]),dt=Object.freeze(["AGENT_BINARY_NOT_FOUND","AGENT_BINARY_UNTRUSTED","AGENT_VERSION_UNSUPPORTED","APP_SERVER_HANDSHAKE_FAILED","AGENT_AUTH_REQUIRED","AGENT_MODEL_UNAVAILABLE","AGENT_PROTOCOL_INCOMPATIBLE","CODEX_CONFIG_ISOLATION_UNSUPPORTED","MANAGED_GRANT_INVALID","MANAGED_PLATFORM_UNSUPPORTED","MANAGED_GIT_REQUIRED","MANAGED_SNAPSHOT_FAILED","MANAGED_SCOPE_VIOLATION","MANAGED_CHANGE_LIMIT_EXCEEDED","MANAGED_VALIDATION_FAILED","MANAGED_WORKSPACE_CONFLICT","MANAGED_APPLY_FAILED","MANAGED_CLEANUP_INCOMPLETE"]),lt=Object.freeze(["integration","binary","handshake","auth","model","protocol","snapshot","audit","validation","apply","cleanup"]),ct=Object.freeze(["retry","user-action","reconfigure","none"]),pt=Object.freeze(["install-agent","use-supported-version","sign-in","choose-available-model","use-inbox","confirm-managed-access","review-candidate-diff","review-workspace-conflict","retry","inspect-cleanup-warning"]);function m(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function N(e,t){let i=Object.keys(e).sort(),a=[...t].sort();return i.length===a.length&&i.every((g,o)=>g===a[o])}function H(e){if(typeof e!="string")return!1;let t=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?Z$/u.exec(e);if(t===null)return!1;let i=Date.parse(e);if(!Number.isFinite(i))return!1;let a=new Date(i);return a.getUTCFullYear()===Number(t[1])&&a.getUTCMonth()+1===Number(t[2])&&a.getUTCDate()===Number(t[3])&&a.getUTCHours()===Number(t[4])&&a.getUTCMinutes()===Number(t[5])&&a.getUTCSeconds()===Number(t[6])}async function Oe(e,t){let i=Number(e.headers.get("content-length"));if(Number.isFinite(i)&&i>t)throw await e.body?.cancel(),new TypeError("SpotPatch API response exceeds its safety limit.");if(e.body===null)throw new TypeError("SpotPatch API response body is unavailable.");let a=e.body.getReader(),g=[],o=0;try{for(;;){let d=await a.read();if(d.done)break;if(o+=d.value.byteLength,o>t)throw await a.cancel(),new TypeError("SpotPatch API response exceeds its safety limit.");g.push(d.value)}}finally{a.releaseLock()}let c=new Uint8Array(o),E=0;for(let d of g)c.set(d,E),E+=d.byteLength;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(c))}function ve(e){if(!m(e)||!N(e,["data","ok"])||e.ok!==!0)throw new TypeError("SpotPatch API success envelope is invalid.");return e.data}var ut=64*1024;function D(e,t){return typeof t=="string"&&e.includes(t)}function Y(e,t=0){return Number.isSafeInteger(e)&&e>=t}function Le(e,t,i){return N(e,[...t,...i.filter(a=>e[a]!==void 0)])}function Bt(e){return typeof e!="string"||e.length===0||e.length>4096||e.startsWith("/")||e.includes("\\")?!1:e.split("/").every(t=>t.length>0&&t!=="."&&t!=="..")}function ft(e){if(!Array.isArray(e)||e.length>M.maximumChangedFiles)throw new TypeError("Invalid managed file summaries.");return e.map(t=>{if(!m(t)||!N(t,["additions","deletions","path"])||!Bt(t.path)||!Y(t.additions)||!Y(t.deletions))throw new TypeError("Invalid managed file summary.");return Object.freeze({path:t.path,additions:t.additions,deletions:t.deletions})})}function Et(e){if(!Array.isArray(e)||e.length>M.maximumChecks)throw new TypeError("Invalid managed check summaries.");return e.map(t=>{if(!m(t)||!Le(t,["durationMs","id","outcome"],["exitCode"])||typeof t.id!="string"||!/^[A-Za-z0-9._-]{1,128}$/u.test(t.id)||!D(st,t.outcome)||!Y(t.durationMs)||t.exitCode!==void 0&&!Number.isSafeInteger(t.exitCode))throw new TypeError("Invalid managed check summary.");return Object.freeze({id:t.id,outcome:t.outcome,durationMs:t.durationMs,...t.exitCode===void 0?{}:{exitCode:t.exitCode}})})}function At(e){let t=["preparing","agent","auditing","validating","applying","total"];if(!m(e)||!Le(e,[],t))throw new TypeError("Invalid managed timings.");for(let i of t)if(e[i]!==void 0&&!Y(e[i]))throw new TypeError("Invalid managed timing.");return Object.freeze(Object.fromEntries(t.flatMap(i=>e[i]===void 0?[]:[[i,e[i]]])))}function $t(e){if(!m(e)||!Le(e,["checks","deliveryStatus","executionStatus","files","managedPhase","revision","timings"],["resultExpiresAt","validationOutcome"])||!Y(e.revision,1)||!D(rt,e.deliveryStatus)||!D(at,e.executionStatus)||!D(it,e.managedPhase)||e.validationOutcome!==void 0&&!D(Me,e.validationOutcome)||e.resultExpiresAt!==void 0&&!H(e.resultExpiresAt))throw new TypeError("Invalid managed task status.");return Object.freeze({revision:e.revision,deliveryStatus:e.deliveryStatus,executionStatus:e.executionStatus,managedPhase:e.managedPhase,...e.validationOutcome===void 0?{}:{validationOutcome:e.validationOutcome},files:ft(e.files),checks:Et(e.checks),timings:At(e.timings),...e.resultExpiresAt===void 0?{}:{resultExpiresAt:e.resultExpiresAt}})}function He(e){return typeof e=="string"&&e.length>0&&e.length<=M.maximumModelCharacters&&e.trim()===e}function ye(e){if(!m(e)||!Le(e,["adapter","authReadiness","connectionState","grantState","mode","schemaVersion","sequence","updatedAt"],["effectiveModel","error","requestedModel","task","models"])||e.schemaVersion!==1||!Y(e.sequence)||!D(et,e.mode)||!D(tt,e.connectionState)||!D(nt,e.authReadiness)||!D(ot,e.grantState)||!H(e.updatedAt)||e.requestedModel!==void 0&&!He(e.requestedModel)||e.effectiveModel!==void 0&&!He(e.effectiveModel)||e.models!==void 0&&(!Array.isArray(e.models)||e.models.length===0||e.models.length>M.maximumModels||!e.models.every(He)||new Set(e.models).size!==e.models.length)||!m(e.adapter)||!N(e.adapter,["availability","kind","maturity"])||e.adapter.kind!=="codex"||e.adapter.maturity!=="experimental"||e.adapter.availability!=="available"&&e.adapter.availability!=="unavailable")throw new TypeError("Invalid external Agent control status.");let t;if(e.error!==void 0){if(!m(e.error)||!N(e.error,["action","code","recoverability","stage"])||!D(dt,e.error.code)||!D(lt,e.error.stage)||!D(ct,e.error.recoverability)||!D(pt,e.error.action))throw new TypeError("Invalid external Agent error.");t=Object.freeze({code:e.error.code,stage:e.error.stage,recoverability:e.error.recoverability,action:e.error.action})}return Object.freeze({schemaVersion:1,sequence:e.sequence,mode:e.mode,adapter:Object.freeze({kind:"codex",maturity:"experimental",availability:e.adapter.availability}),connectionState:e.connectionState,authReadiness:e.authReadiness,grantState:e.grantState,...e.models===void 0?{}:{models:Object.freeze([...e.models])},...e.requestedModel===void 0?{}:{requestedModel:e.requestedModel},...e.effectiveModel===void 0?{}:{effectiveModel:e.effectiveModel},...e.task===void 0?{}:{task:$t(e.task)},...t===void 0?{}:{error:t},updatedAt:e.updatedAt})}function Xt(e){if(!m(e)||!N(e,["checks","diff","expiresAt","files","revision","timings","validationOutcome"])||!Y(e.revision,1)||typeof e.diff!="string"||e.diff.length>M.maximumResultDiffBytes||!H(e.expiresAt)||!D(Me,e.validationOutcome))throw new TypeError("Invalid managed Agent result.");return Object.freeze({revision:e.revision,diff:e.diff,files:ft(e.files),checks:Et(e.checks),timings:At(e.timings),validationOutcome:e.validationOutcome,expiresAt:e.expiresAt})}function Vt(e){if(!m(e)||typeof e.type!="string")throw new TypeError("Invalid external Agent event.");if(e.type==="status"&&N(e,["data","type"]))return Object.freeze({type:"status",data:ye(e.data)});if(e.type==="heartbeat"&&N(e,["emittedAt","sequence","type"])&&Y(e.sequence)&&H(e.emittedAt))return Object.freeze({type:"heartbeat",sequence:e.sequence,emittedAt:e.emittedAt});throw new TypeError("Invalid external Agent event.")}function gt(e,t){let i=async(a,g,o=ut)=>{let c=await e(a,{method:"POST",headers:{"Content-Type":"application/json",[ce]:t},body:JSON.stringify(g)}),E=await Oe(c,o);if(!c.ok)throw new TypeError("External Agent control request failed.");return ve(E)};return Object.freeze({async status(){return ye(await i(P.externalAgentControlStatus,{}))},async connect(a){return ye(await i(P.externalAgentControlConnect,a))},async disconnect(a){return ye(await i(P.externalAgentControlDisconnect,a))},async cancel(a){return ye(await i(P.externalAgentControlCancel,a))},async result(a){return Xt(await i(P.externalAgentResult,{revision:a},M.maximumResultDiffBytes+ut))},async events(a,g,o){let c=await e(P.externalAgentEvents,{method:"POST",headers:{"Content-Type":"application/json",[ce]:t},body:JSON.stringify(a===void 0?{}:{afterSequence:a}),signal:g});if(!c.ok||c.body===null)throw await c.body?.cancel(),new TypeError("External Agent event stream is unavailable.");let E=c.body.getReader(),d=new Uint8Array(0);try{for(;;){let n=await E.read();if(n.done)break;let O=new Uint8Array(d.byteLength+n.value.byteLength);for(O.set(d),O.set(n.value,d.byteLength),d=O;;){let b=d.indexOf(10);if(b===-1)break;if(b===0||b>M.maximumEventLineBytes)throw new TypeError("External Agent event line is invalid.");let v=d.slice(0,b);d=d.slice(b+1);let R=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(v));o(Vt(R))}if(d.byteLength>M.maximumEventLineBytes)throw new TypeError("External Agent event line exceeds its limit.")}if(d.byteLength!==0)throw new TypeError("External Agent event stream ended mid-record.")}finally{E.releaseLock()}}})}var jt=64*1024,mt=/^[A-Za-z0-9_-]{22,128}$/u,C=class extends Error{constructor(i){super("SpotPatch external handoff API request failed.");this.code=i;this.name="ExternalHandoffApiError"}code};function Ge(e){if(e===null)return null;if(!m(e)||!N(e,["canDispatch","connectedAt","kind","state","updatedAt"])||e.kind!=="claude-channel"&&e.kind!=="codex-app-server"||e.state!=="ready"&&e.state!=="busy"&&e.state!=="blocked"||typeof e.canDispatch!="boolean"||e.canDispatch!==(e.state==="ready")||!H(e.connectedAt)||!H(e.updatedAt))throw new C;return Object.freeze({kind:e.kind,state:e.state,canDispatch:e.canDispatch,connectedAt:e.connectedAt,updatedAt:e.updatedAt})}function Fe(e){if(e===null)return null;if(!m(e))throw new C;if(!N(e,["adapterKind","phase","revision","updatedAt"])||e.adapterKind!=="claude-channel"&&e.adapterKind!=="codex-app-server"||!Number.isSafeInteger(e.revision)||e.revision<=0||e.phase!=="queued"&&e.phase!=="dispatching"&&e.phase!=="dispatched"&&e.phase!=="working"&&e.phase!=="completed"&&e.phase!=="failed"&&e.phase!=="delivery-unknown"||!H(e.updatedAt))throw new C;return Object.freeze({adapterKind:e.adapterKind,revision:e.revision,phase:e.phase,updatedAt:e.updatedAt})}function qt(e){if(!m(e)||!N(e,["activeAdapter","activeWaitCount","brokerProtocolVersion","brokerReady","dispatch","enabled","snapshotSchemaVersion"])||e.enabled!==!0||typeof e.brokerReady!="boolean"||!Number.isSafeInteger(e.activeWaitCount)||e.activeWaitCount<0||e.activeWaitCount>Te.maximumWaiters||e.snapshotSchemaVersion!==1||e.brokerProtocolVersion!==2)throw new C;return Object.freeze({enabled:!0,brokerReady:e.brokerReady,activeWaitCount:e.activeWaitCount,activeAdapter:Ge(e.activeAdapter),dispatch:Fe(e.dispatch),snapshotSchemaVersion:1,brokerProtocolVersion:2})}function zt(e){if(!m(e)||!N(e,["delivery","handoff","replayed"])||typeof e.replayed!="boolean"||!m(e.delivery))throw new C;let t=Tt(e.handoff);if(e.delivery.mode==="inbox"){if(!N(e.delivery,["mode"]))throw new C;return Object.freeze({handoff:t,delivery:Object.freeze({mode:"inbox"}),replayed:e.replayed})}if(e.delivery.mode!=="active"||!N(e.delivery,["adapter","dispatch","mode"]))throw new C;let i=Ge(e.delivery.adapter),a=Fe(e.delivery.dispatch);if(i===null||a?.revision!==t.revision)throw new C;return Object.freeze({handoff:t,delivery:Object.freeze({mode:"active",adapter:i,dispatch:a}),replayed:e.replayed})}function bt(e){if(!m(e)||!N(e,["activeAdapter","dispatch","handoff"]))throw new C;let t=Tt(e.handoff),i=Fe(e.dispatch);if(i!==null&&i.revision!==t.revision)throw new C;return Object.freeze({handoff:t,activeAdapter:Ge(e.activeAdapter),dispatch:i})}function Tt(e){if(!m(e))throw new C;let t=["cursor","expiresAt","framework","page","pickupCount","publishedAt","revision","sessionId","state","targetCount",...e.pickedUpAt===void 0?[]:["pickedUpAt"]];if(!N(e,t)||typeof e.sessionId!="string"||!mt.test(e.sessionId)||e.framework!=="vite"&&e.framework!=="next"||!Number.isSafeInteger(e.revision)||e.revision<=0||typeof e.cursor!="string"||!mt.test(e.cursor)||!Number.isSafeInteger(e.targetCount)||e.targetCount<=0||!m(e.page)||!N(e.page,["origin","pathname"])||typeof e.page.origin!="string"||typeof e.page.pathname!="string"||!H(e.publishedAt)||!H(e.expiresAt)||e.state!=="available"&&e.state!=="expired"&&e.state!=="superseded"||!Number.isSafeInteger(e.pickupCount)||e.pickupCount<0||e.pickupCount>Te.maximumConnectorReceipts||e.pickedUpAt!==void 0&&!H(e.pickedUpAt))throw new C;return Object.freeze({sessionId:e.sessionId,framework:e.framework,revision:e.revision,cursor:e.cursor,targetCount:e.targetCount,page:Object.freeze({origin:e.page.origin,pathname:e.page.pathname}),publishedAt:e.publishedAt,expiresAt:e.expiresAt,state:e.state,pickupCount:e.pickupCount,...e.pickedUpAt===void 0?{}:{pickedUpAt:e.pickedUpAt}})}function Kt(e){return m(e)&&e.ok===!1&&m(e.error)&&Qe(e.error.code)?e.error.code:void 0}function Wt(e){return{...e,targets:e.targets.map(t=>({instruction:t.instruction,...t.page===void 0?{}:{page:t.page},source:t.source,react:t.react,element:t.element,styles:t.styles,warnings:t.warnings}))}}function Se(e){let t=new Uint8Array(24);return e.crypto.getRandomValues(t),Array.from(t,i=>i.toString(16).padStart(2,"0")).join("")}function Yt(e){return e!==null&&e.phase!=="completed"&&e.phase!=="failed"&&e.phase!=="delivery-unknown"}function Jt(e){let t=new Set,i=async(a,g)=>{let o=new AbortController;t.add(o);try{let c=await e.fetch(a,{method:"POST",headers:{"Content-Type":"application/json",[ce]:e.sessionToken},body:JSON.stringify(g),signal:o.signal}),E;try{E=await Oe(c,jt)}catch{throw new C}if(!c.ok)throw new C(Kt(E));try{return ve(E)}catch{throw new C}}finally{t.delete(o)}};return Object.freeze({cancel(){for(let a of t)a.abort();t.clear()},async capability(){return qt(await i(P.externalHandoffCapability,{}))},async publish(a,g){return zt(await i(P.externalHandoffPublish,{annotation:Wt(g),requestId:a}))},async status(a){return bt(await i(P.externalHandoffStatus,a===void 0?{}:{cursor:a}))},async resolveDelivery(a){return bt(await i(P.externalHandoffResolveDelivery,{confirmation:"workspace-reviewed",cursor:a}))}})}function yt(e,t,i,a,g){let o={fetch:e,panel:t,selectedAnnotation:i,sessionToken:a,window:g},c=Jt(o),E=gt(e,a),d=new Set,n={disposed:!1,mounted:!1,operation:0,userActionPending:!1},O,b,v,R=M.eventReconnectMinimumMs,p,y=!1,w,x,f,A,J=()=>n.disposed,F=()=>{for(let s of d)o.window.clearTimeout(s);d.clear()},ee=()=>{p!==void 0&&(o.window.clearTimeout(p),p=void 0)},pe=async s=>{if(!(n.disposed||w===s||x===s)){x=s;try{let l=await E.result(s);if(J()||b?.task?.revision!==s)return;w=s,o.panel.renderManagedResult(l)}catch{}finally{x===s&&(x=void 0)}}},U=s=>{if(b!==void 0&&s.sequence<b.sequence)return;b=s,R=M.eventReconnectMinimumMs,o.panel.renderControlStatus(s);let l=s.task?.resultExpiresAt===void 0?void 0:s.task.revision;l!==void 0&&pe(l)},te=s=>{if(s.type==="status"){U(s.data);return}let l=b?.task?.resultExpiresAt===void 0?void 0:b.task.revision;l!==void 0&&pe(l)},ue=()=>{if(n.disposed||!n.mounted||v!==void 0)return;ee();let s=new AbortController;v=s,E.events(b?.sequence,s.signal,te).catch(l=>{n.disposed||l instanceof DOMException&&l.name==="AbortError"||b===void 0&&o.panel.renderControlUnavailable()}).finally(()=>{if(v===s&&(v=void 0),n.disposed||!n.mounted)return;let l=R;R=Math.min(l*2,M.eventReconnectMaximumMs),p=o.window.setTimeout(()=>{p=void 0,ue()},l)})},z=async()=>{U(await E.status())},fe=async()=>{try{await z()}catch{n.disposed||o.panel.renderControlUnavailable()}finally{n.disposed||ue()}},S=async s=>{if(!(n.disposed||y)){y=!0,o.panel.setControlBusy(!0);try{U(await s())}catch{try{await z()}catch{J()||o.panel.renderControlUnavailable()}}finally{y=!1,J()||o.panel.setControlBusy(!1)}}},ne=()=>{let s=o.panel.readModel();S(()=>E.connect({requestId:Se(o.window),adapterKind:"codex",profile:Ze,...s===void 0?{}:{model:s}}))},oe=()=>{S(()=>E.disconnect({requestId:Se(o.window),adapterKind:"codex",revokeGrant:!1}))},Ee=()=>{S(()=>E.disconnect({requestId:Se(o.window),adapterKind:"codex",revokeGrant:!0}))},Ae=()=>{let s=b?.task?.revision;s!==void 0&&S(()=>E.cancel({requestId:Se(o.window),revision:s}))},K=s=>s instanceof C?s.code:void 0,ge=()=>{f!==void 0?o.panel.renderStatus(f):O!==void 0&&o.panel.renderCapability(O)},Q=async s=>{try{let l=await c.capability();if(n.disposed||s!==n.operation)return;if(O=l,o.panel.renderCapability(l),l.dispatch!==null){let h=await c.status();if(s!==n.operation)return;f=h,o.panel.renderStatus(h)}}catch(l){if(n.disposed||s!==n.operation||l instanceof DOMException&&l.name==="AbortError")return;o.panel.renderError(K(l))}},he=async s=>{if(f===void 0){await Q(s);return}try{let l=await c.status(f.handoff.cursor);if(n.disposed||s!==n.operation)return;f=l,o.panel.renderStatus(l)}catch(l){if(n.disposed||s!==n.operation||l instanceof DOMException&&l.name==="AbortError")return;o.panel.renderError(K(l))}},X=(s,l)=>{let h=n.operation,$=o.window.setTimeout(()=>{d.delete($),he(h).then(()=>{l&&!n.disposed&&h===n.operation&&!n.userActionPending&&f!==void 0&&Yt(f.dispatch)&&X(Te.activeStatusPollMs,l)})},s);d.add($)},I=async()=>{if(n.userActionPending)return;n.userActionPending=!0;let s=A;if(s===void 0){let h=o.selectedAnnotation();if(h===void 0){n.userActionPending=!1,o.panel.renderError(Pe.HANDOFF_VALIDATION_FAILED);return}let $=n.operation;if(o.panel.setBusy(!0),!await o.panel.confirmDisclosure(h)||$!==n.operation){n.userActionPending=!1,o.panel.setBusy(!1);return}s=Object.freeze({annotation:h,requestId:Se(o.window)})}A=s,n.operation+=1;let l=n.operation;F(),c.cancel(),o.panel.renderPublishing();try{let h=await c.publish(s.requestId,s.annotation);if(l!==n.operation)return;A=void 0,f=Object.freeze({handoff:h.handoff,activeAdapter:h.delivery.mode==="active"?h.delivery.adapter:null,dispatch:h.delivery.mode==="active"?h.delivery.dispatch:null}),o.panel.renderPublishResult(h),X(h.delivery.mode==="active"?Te.activeStatusPollMs:500,h.delivery.mode==="active")}catch(h){if(l!==n.operation||h instanceof DOMException&&h.name==="AbortError")return;let $=K(h),ie=$===void 0;ie||(A=void 0),o.panel.renderError($,ie)}finally{l===n.operation&&(n.userActionPending=!1,o.panel.setBusy(!1))}},_e=async()=>{if(n.userActionPending)return;n.userActionPending=!0,n.operation+=1;let s=n.operation;F(),c.cancel(),o.panel.setBusy(!0);try{await he(s)}finally{!n.disposed&&s===n.operation&&(n.userActionPending=!1,o.panel.setBusy(!1))}},B=async()=>{if(n.userActionPending||f===void 0||f.dispatch?.phase!=="delivery-unknown")return;n.userActionPending=!0,n.operation+=1;let s=n.operation;F(),c.cancel(),o.panel.setBusy(!0);try{let l=await c.resolveDelivery(f.handoff.cursor);if(n.disposed||s!==n.operation)return;f=l,o.panel.renderStatus(l)}catch(l){if(n.disposed||s!==n.operation||l instanceof DOMException&&l.name==="AbortError")return;o.panel.renderError(K(l))}finally{!n.disposed&&s===n.operation&&(n.userActionPending=!1,o.panel.setBusy(!1))}},re=()=>{I()},V=()=>{_e()},W=()=>{B()};return Object.freeze({mount(){n.mounted||n.disposed||(n.mounted=!0,o.panel.sendButton.addEventListener("click",re),o.panel.refreshButton.addEventListener("click",V),o.panel.resolveButton.addEventListener("click",W),o.panel.connectButton.addEventListener("click",ne),o.panel.disconnectButton.addEventListener("click",oe),o.panel.revokeButton.addEventListener("click",Ee),o.panel.cancelManagedButton.addEventListener("click",Ae),Q(n.operation),fe())},cancelPending:()=>{n.operation+=1,n.userActionPending=!1,A=void 0,F(),c.cancel(),ge(),O===void 0&&n.mounted&&!n.disposed&&Q(n.operation)},dispose(){n.disposed||(n.disposed=!0,n.operation+=1,n.userActionPending=!1,A=void 0,F(),ee(),v?.abort("workflow-disposed"),v=void 0,c.cancel(),o.panel.sendButton.removeEventListener("click",re),o.panel.refreshButton.removeEventListener("click",V),o.panel.resolveButton.removeEventListener("click",W),o.panel.connectButton.removeEventListener("click",ne),o.panel.disconnectButton.removeEventListener("click",oe),o.panel.revokeButton.removeEventListener("click",Ee),o.panel.cancelManagedButton.removeEventListener("click",Ae))}})}var St="data-spotpatch-ui",fn=Object.freeze({highlight:2147483646,controls:2147483647}),En=Object.freeze({compactInset:8,compactViewportWidth:520,desktopInset:24,dragActivationDistance:6,edgeSnapDistance:20,workbenchMaxHeight:620,workbenchMaxWidth:460});function u(e,t){let i=e.createElement(t);return i.setAttribute(St,""),i}function G(e,t,i=""){let a=u(e,"button");return a.type="button",a.className=i,a.textContent=t,a}var _t=`
|
|
2
|
+
.spotpatch-select-picker { position: relative; display: grid; gap: 5px; min-width: 0; }
|
|
3
|
+
.spotpatch-select-trigger { box-sizing: border-box; display: flex; width: 100%; min-height: 38px; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 0 11px; overflow: hidden; color: var(--spotpatch-text); background: var(--spotpatch-bg-input); cursor: pointer; font: inherit; outline: none; text-align: left; }
|
|
4
|
+
.spotpatch-select-trigger > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
5
|
+
.spotpatch-select-trigger[data-expandable="true"]::after { width: 7px; height: 7px; flex: 0 0 auto; border-right: 1.5px solid #8f96a3; border-bottom: 1.5px solid #8f96a3; content: ""; transform: translateY(-2px) rotate(45deg); }
|
|
6
|
+
.spotpatch-select-trigger[aria-expanded="true"]::after { transform: translateY(2px) rotate(225deg); }
|
|
7
|
+
.spotpatch-select-trigger:focus-visible { border-color: rgb(139 123 255 / 68%); box-shadow: 0 0 0 3px rgb(139 123 255 / 12%); }
|
|
8
|
+
.spotpatch-select-trigger:disabled { color: var(--spotpatch-text); background: rgb(255 255 255 / 3%); cursor: default; opacity: 1; }
|
|
9
|
+
.spotpatch-select-trigger[data-empty="true"]:disabled { color: var(--spotpatch-text-muted); }
|
|
10
|
+
.spotpatch-select-menu { position: relative; z-index: 1; display: grid; gap: 3px; max-height: 224px; overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 4px; background: var(--spotpatch-bg-input); box-shadow: 0 10px 28px rgb(0 0 0 / 28%); scrollbar-width: thin; }
|
|
11
|
+
.spotpatch-select-menu[hidden] { display: none; }
|
|
12
|
+
.spotpatch-select-option { box-sizing: border-box; min-height: 34px; border: 0; border-radius: 6px; padding: 7px 9px; overflow-wrap: anywhere; color: var(--spotpatch-text-secondary); background: transparent; cursor: pointer; font: inherit; text-align: left; }
|
|
13
|
+
.spotpatch-select-option[data-active="true"], .spotpatch-select-option:hover { color: #fff; background: rgb(139 123 255 / 13%); outline: none; }
|
|
14
|
+
.spotpatch-select-option[aria-selected="true"] { color: #f4f1ff; background: rgb(139 123 255 / 20%); }
|
|
15
|
+
.spotpatch-select-native { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; border: 0; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
|
|
16
|
+
`;function Nt(e,t){let i=u(e,"div");i.className="spotpatch-select-picker";let a=G(e,"","spotpatch-select-trigger");a.id=`spotpatch-select-picker-${Math.random().toString(36).slice(2)}`,a.setAttribute("role","combobox"),a.setAttribute("aria-haspopup","listbox"),a.setAttribute("aria-expanded","false");let g=u(e,"span");a.append(g);let o=u(e,"div");o.id=`${a.id}-menu`,o.className="spotpatch-select-menu",o.setAttribute("role","listbox"),o.hidden=!0,a.setAttribute("aria-controls",o.id);let c=u(e,"select");c.className="spotpatch-select-native",c.tabIndex=-1,c.setAttribute("aria-hidden","true"),i.append(a,o,c);function E(p=!1){o.hidden||(o.hidden=!0,a.setAttribute("aria-expanded","false"),a.removeAttribute("aria-activedescendant"),p&&a.focus({preventScroll:!0}),t())}function d(p){let y=[...o.children],w=y[p];if(w===void 0)return;for(let A of y)A.dataset.active=String(A===w);a.setAttribute("aria-activedescendant",w.id);let x=w.getBoundingClientRect(),f=o.getBoundingClientRect();x.top<f.top?o.scrollTop-=f.top-x.top:x.bottom>f.bottom&&(o.scrollTop+=x.bottom-f.bottom)}function n(){a.disabled||!o.hidden||(o.hidden=!1,a.setAttribute("aria-expanded","true"),d(Math.max(0,c.selectedIndex)),t())}function O(){g.textContent=c.selectedOptions[0]?.textContent??"",a.title=g.textContent,a.dataset.empty=String(c.value.length===0);for(let p of[...o.children])p.setAttribute("aria-selected",String(p.dataset.value===c.value))}function b(p){a.disabled||(c.value=p,O(),E(!0),c.dispatchEvent(new Event("change",{bubbles:!0})))}function v(){let p=!o.hidden,y=[...c.options];o.replaceChildren();for(let[w,x]of y.entries()){let f=u(e,"div");f.id=`${o.id}-${String(w)}`,f.className="spotpatch-select-option",f.setAttribute("role","option"),f.dataset.value=x.value,f.textContent=x.textContent,f.title=x.textContent,f.addEventListener("pointerdown",A=>{A.preventDefault()}),f.addEventListener("click",()=>{b(x.value)}),o.append(f)}O(),p&&(d(Math.max(0,c.selectedIndex)),t())}a.addEventListener("click",()=>{o.hidden?n():E()}),a.addEventListener("keydown",p=>{if(p.key==="Escape"&&!o.hidden){p.preventDefault(),p.stopPropagation(),E();return}if(p.key==="Tab"){E();return}if(["Enter"," "].includes(p.key)&&!o.hidden){p.preventDefault();let x=[...o.children].find(f=>f.id===a.getAttribute("aria-activedescendant"));x?.dataset.value!==void 0&&b(x.dataset.value);return}if(!["ArrowDown","ArrowUp","Home","End"].includes(p.key))return;if(p.preventDefault(),o.hidden){n();return}let y=[...o.children],w=y.findIndex(x=>x.id===a.getAttribute("aria-activedescendant"));d(p.key==="Home"?0:p.key==="End"?y.length-1:(w+(p.key==="ArrowDown"?1:-1)+y.length)%y.length)}),i.addEventListener("focusout",p=>{(!(p.relatedTarget instanceof Node)||!i.contains(p.relatedTarget))&&E()});let R=p=>{p.composedPath().includes(i)||E()};return e.addEventListener("pointerdown",R),c.addEventListener("change",O),{root:i,trigger:a,select:c,rebuild:v,close:E,setDisabled(p){c.disabled=p,a.disabled=p||c.options.length<2,a.dataset.expandable=String(!a.disabled),a.disabled&&E()},dispose(){e.removeEventListener("pointerdown",R)}}}var Rt=Object.freeze({"en-US":Object.freeze({title:"External Agent connection",agentLabel:"Agent",modelLabel:"Managed Codex model",modelLoading:"Connect to load available models",modelHint:"Applies only to this managed connection, not API Key settings. Apply changes before publishing; switching reconnects Codex.",applyModel:"Apply model",codexManaged:"Codex · managed (experimental)",connectManaged:"Connect Codex",disconnectManaged:"Disconnect",revokeManaged:"Revoke grant",cancelManaged:"Cancel managed task",resultTitle:"Managed result",controlConnection:(e,t)=>`Connection: ${e} · Mode: ${t}`,controlAuth:(e,t)=>`Auth: ${e} · Grant: ${t}`,controlConsentRequired:e=>`Initialize project access once: run \`${e}\` from this project, then connect again. No dev-terminal confirmation is required. The grant allows isolated snapshot writes and validated application; revoke it here at any time.`,controlModel:e=>`Model: ${e}`,controlRevision:e=>`Revision ${String(e.revision)}: ${e.deliveryStatus} / ${e.executionStatus} / ${e.managedPhase}`,controlValidation:e=>`Validation: ${e}`,controlFailure:(e,t)=>`Error: ${e} · Next: ${t}`,controlUnavailable:"Page connection management is unavailable; external handoffs still fall back honestly to the Agent inbox.",controlErrorText:Object.freeze({AGENT_BINARY_NOT_FOUND:"Codex is not installed or is not on PATH.",AGENT_BINARY_UNTRUSTED:"The resolved Codex executable is not trusted.",AGENT_VERSION_UNSUPPORTED:"The installed Codex version is below SpotPatch's compatibility baseline.",APP_SERVER_HANDSHAKE_FAILED:"Codex App Server did not complete startup.",AGENT_AUTH_REQUIRED:"Codex requires an authenticated account.",AGENT_MODEL_UNAVAILABLE:"The configured Codex model is unavailable.",AGENT_PROTOCOL_INCOMPATIBLE:"The generated Codex App Server schema is incompatible with SpotPatch's required protocol subset.",CODEX_CONFIG_ISOLATION_UNSUPPORTED:"This Codex version cannot prove managed configuration isolation.",MANAGED_GRANT_INVALID:"The saved project grant failed validation.",MANAGED_PLATFORM_UNSUPPORTED:"Managed execution is not proven safe on this platform.",MANAGED_GIT_REQUIRED:"Managed execution requires a Git repository.",MANAGED_SNAPSHOT_FAILED:"The independent workspace snapshot could not be created.",MANAGED_SCOPE_VIOLATION:"The candidate change exceeded its authorized paths.",MANAGED_CHANGE_LIMIT_EXCEEDED:"The candidate change exceeded safety limits.",MANAGED_VALIDATION_FAILED:"The candidate change did not pass audit or validation.",MANAGED_WORKSPACE_CONFLICT:"An authorized source file changed during execution.",MANAGED_APPLY_FAILED:"The audited change could not be applied safely.",MANAGED_CLEANUP_INCOMPLETE:"Managed thread or workspace cleanup is incomplete."}),controlActionText:Object.freeze({"install-agent":"Install Codex and retry.","use-supported-version":"Use a schema-compatible Codex version.","sign-in":"Sign in with Codex, then retry.","choose-available-model":"Choose an available model and reconnect Codex.","use-inbox":"Continue with the Agent inbox fallback.","confirm-managed-access":"Revoke the invalid grant and confirm access again.","review-candidate-diff":"Review the candidate diff and validation output.","review-workspace-conflict":"Review the workspace changes before retrying.",retry:"Retry the managed connection.","inspect-cleanup-warning":"Inspect cleanup status before reconnecting."}),resultHeader:(e,t)=>`Revision ${String(e)} · Validation ${t}`,resultDisposition:e=>e==="passed"?"Applied to the project after validation passed.":`Candidate only; it was not applied because validation is ${e}.`,resultTiming:(e,t)=>`Timing ${e}: ${String(t)} ms`,description:"Send through a ready active adapter, or publish to the project Agent inbox when no active adapter is connected.",ready:"Local Broker ready. No Agent connection is assumed until a connector reads or waits.",readyWaiting:e=>`${String(e)} active connector wait request(s); publishing can wake them immediately.`,activeReady:e=>`${e} is connected and idle. The next send will dispatch immediately.`,publishing:"Authorizing current source and publishing the handoff…",published:(e,t)=>`Revision ${String(e)} is available until ${t}. It has not been claimed as edited.`,queued:(e,t)=>`Revision ${String(t)} is reserved for ${e}.`,dispatching:(e,t)=>`Dispatching revision ${String(t)} to ${e}…`,dispatched:(e,t)=>e==="Claude Code"?`Revision ${String(t)} was written to the Claude Channel transport; there is no model ACK yet.`:`Codex App Server accepted revision ${String(t)}; waiting for the matching turn to start.`,working:(e,t)=>`${e} is working on revision ${String(t)}.`,completed:(e,t)=>`${e} ended revision ${String(t)} normally. Review the diff and checks; this does not prove the requested change is correct.`,failed:(e,t)=>`${e} reported revision ${String(t)} as failed. The connector is idle again.`,unknown:(e,t)=>`Delivery of revision ${String(t)} to ${e} is uncertain. The managed writer stopped; review the workspace before allowing another task.`,unknownResolved:(e,t)=>`Revision ${String(t)} for ${e} remains delivery-unknown, but the workspace review was confirmed. A new connector or inbox task may now be used.`,pickedUp:(e,t,i)=>`Revision ${String(e)} was picked up by ${String(t)} connector instance(s)${i===void 0?".":`; last pickup ${i}.`} This does not prove a code change.`,expired:e=>`Revision ${String(e)} expired. Review the current selection and publish again.`,superseded:e=>`Revision ${String(e)} was superseded by a newer handoff.`,send:"Send to Agent",inboxSend:"Publish to Agent inbox",retry:"Retry same send",refresh:"Refresh pickup status",resolveUnknown:"Workspace reviewed — allow a new task",settingsTitle:"Project connection setup",settingsHelp:"Codex managed mode is owned by the current development server. The browser never receives vendor credentials or arbitrary command access. Generic and attached adapters remain honest Inbox fallbacks.",disclosureTitle:"Confirm external Agent handoff",disclosureIntro:(e,t)=>`Publish ${String(e)} selected target(s) referencing ${String(t)} relative file(s).`,disclosureData:"The handoff includes your instructions, component/page context, sanitized DOM/CSS, and bounded source read again by the local Node service.",disclosureInbox:"Any SpotPatch connector configured for this project may read it during the 15-minute lifetime.",disclosureProvider:"The Agent host may send the content to its cloud provider under that product's data policy.",disclosureNoGuarantee:"External edits do not receive SpotPatch's built-in worktree, Apply, or Revert guarantees.",disclosureManagedGuarantee:"Managed Codex edits run in an independent temporary snapshot. SpotPatch audits the diff and only applies it when every trusted required check passes.",cancel:"Cancel",confirm:"Confirm and send",error:e=>e==="EXTERNAL_AGENT_BUSY"?"The active Agent is still busy or blocked by an uncertain delivery.":e==="ACTIVE_DISPATCH_INVALID"?"The active delivery state changed. Refresh before continuing.":e==="HANDOFF_SOURCE_STALE"?"The selected source changed. Select the current component again.":e==="HANDOFF_RESPONSE_TOO_LARGE"?"The handoff is too large. Reduce the selected context.":e==="EXTERNAL_HANDOFF_DISABLED"?"External Agent handoff is disabled in trusted project configuration.":e==="EXTERNAL_HANDOFF_UNAVAILABLE"||e==="SESSION_CLOSED"?"The local external Agent Broker is unavailable. Restart the development server.":"The external Agent handoff request failed without publishing a partial revision."}),"zh-CN":Object.freeze({title:"外部 Agent 连接",agentLabel:"Agent",modelLabel:"受管 Codex 模型",modelLoading:"连接后加载可用模型",modelHint:"仅作用于此受管连接,不修改 API Key 配置。更换后请先应用模型,再发布任务;应用时会重新连接 Codex。",applyModel:"应用模型",codexManaged:"Codex · 受管模式(实验性)",connectManaged:"连接 Codex",disconnectManaged:"断开连接",revokeManaged:"撤销授权",cancelManaged:"取消受管任务",resultTitle:"受管执行结果",controlConnection:(e,t)=>`连接:${e} · 模式:${t}`,controlAuth:(e,t)=>`认证:${e} · 授权:${t}`,controlConsentRequired:e=>`请在当前项目执行一次初始化:\`${e}\`,然后重新连接,无需在开发终端输入 yes。授权允许隔离快照修改及校验后的应用,可随时在此撤销。`,controlModel:e=>`模型:${e}`,controlRevision:e=>`revision ${String(e.revision)}:${e.deliveryStatus} / ${e.executionStatus} / ${e.managedPhase}`,controlValidation:e=>`验证:${e}`,controlFailure:(e,t)=>`错误:${e} · 下一步:${t}`,controlUnavailable:"页面连接管理不可用;外部交接仍会按真实能力降级为 Agent 收件箱。",controlErrorText:Object.freeze({AGENT_BINARY_NOT_FOUND:"未安装 Codex,或 Codex 不在 PATH 中。",AGENT_BINARY_UNTRUSTED:"解析到的 Codex 可执行文件不可信。",AGENT_VERSION_UNSUPPORTED:"已安装的 Codex 版本低于 SpotPatch 兼容基线。",APP_SERVER_HANDSHAKE_FAILED:"Codex App Server 未完成启动握手。",AGENT_AUTH_REQUIRED:"Codex 需要已登录的账户。",AGENT_MODEL_UNAVAILABLE:"Codex 配置的模型当前不可用。",AGENT_PROTOCOL_INCOMPATIBLE:"Codex 生成的 App Server Schema 不满足 SpotPatch 所需协议子集。",CODEX_CONFIG_ISOLATION_UNSUPPORTED:"当前 Codex 版本无法证明受管配置隔离。",MANAGED_GRANT_INVALID:"保存的项目授权未通过校验。",MANAGED_PLATFORM_UNSUPPORTED:"当前平台尚未证明可安全运行受管执行。",MANAGED_GIT_REQUIRED:"受管执行要求项目位于 Git 仓库中。",MANAGED_SNAPSHOT_FAILED:"无法创建独立工作区快照。",MANAGED_SCOPE_VIOLATION:"候选修改超出授权路径。",MANAGED_CHANGE_LIMIT_EXCEEDED:"候选修改超过安全上限。",MANAGED_VALIDATION_FAILED:"候选修改未通过审计或验证。",MANAGED_WORKSPACE_CONFLICT:"执行期间授权源码发生了变化。",MANAGED_APPLY_FAILED:"已审计修改无法安全写入。",MANAGED_CLEANUP_INCOMPLETE:"受管 thread 或工作区清理不完整。"}),controlActionText:Object.freeze({"install-agent":"安装 Codex 后重试。","use-supported-version":"改用 Schema 兼容的 Codex 版本。","sign-in":"登录 Codex 后重试。","choose-available-model":"选择可用模型后重新连接 Codex。","use-inbox":"继续使用 Agent 收件箱降级路径。","confirm-managed-access":"撤销无效授权并重新确认。","review-candidate-diff":"检查候选 diff 和验证输出。","review-workspace-conflict":"检查工作区变化后再重试。",retry:"重试受管连接。","inspect-cleanup-warning":"确认清理状态后再连接。"}),resultHeader:(e,t)=>`revision ${String(e)} · 验证 ${t}`,resultDisposition:e=>e==="passed"?"验证通过,修改已写入项目。":`这只是候选 diff;验证状态为 ${e},因此没有写入项目。`,resultTiming:(e,t)=>`耗时 ${e}: ${String(t)} ms`,description:"有主动适配器就立即派发;未连接主动适配器时,诚实降级为项目 Agent 收件箱。",ready:"本地 Broker 已就绪。只有连接器读取或等待后,才能证明发生过连接。",readyWaiting:e=>`当前有 ${String(e)} 个连接器等待请求,发布后可立即唤醒。`,activeReady:e=>`${e} 已连接并处于空闲状态,下次发送会立即派发。`,publishing:"正在重新授权当前源码并发布交接……",published:(e,t)=>`交接 revision ${String(e)} 可读取至 ${t};这不表示代码已被修改。`,queued:(e,t)=>`交接 revision ${String(t)} 已为 ${e} 预留。`,dispatching:(e,t)=>`正在把 revision ${String(t)} 派发给 ${e}……`,dispatched:(e,t)=>e==="Claude Code"?`revision ${String(t)} 已写入 Claude Channel transport;当前没有模型 ACK。`:`Codex App Server 已接受 revision ${String(t)},正在等待匹配 turn 启动。`,working:(e,t)=>`${e} 正在处理 revision ${String(t)}。`,completed:(e,t)=>`${e} 已正常结束 revision ${String(t)}。请核对 diff 和检查结果;这不证明修改要求已经正确完成。`,failed:(e,t)=>`${e} 已将 revision ${String(t)} 报告为失败,连接器已恢复空闲。`,unknown:(e,t)=>`revision ${String(t)} 向 ${e} 的投递结果不确定。受管 writer 已停止,请先核对工作区再允许新任务。`,unknownResolved:(e,t)=>`${e} 的 revision ${String(t)} 仍记为投递未知,但工作区核对已经确认;现在可以重新连接或发布新的收件箱任务。`,pickedUp:(e,t,i)=>`交接 revision ${String(e)} 已被 ${String(t)} 个连接器实例取走${i===void 0?"。":`,最近取件于 ${i}。`}这不能证明代码已经修改。`,expired:e=>`交接 revision ${String(e)} 已过期,请核对当前选择后重新发布。`,superseded:e=>`交接 revision ${String(e)} 已被更新版本取代。`,send:"发送给 Agent",inboxSend:"发布到 Agent 收件箱",retry:"重试同一次发送",refresh:"刷新取件状态",resolveUnknown:"已核对工作区,允许新任务",settingsTitle:"项目连接设置",settingsHelp:"Codex 受管模式由当前开发服务托管,浏览器不会获得厂商凭证或任意命令权限;通用与 attached adapter 仍按真实能力降级为收件箱。",disclosureTitle:"确认发布到外部 Agent",disclosureIntro:(e,t)=>`将发布 ${String(e)} 个目标,涉及 ${String(t)} 个项目相对文件。`,disclosureData:"交接包含修改说明、组件与页面上下文、已清洗的 DOM/CSS,以及本地 Node 服务重新读取的有界源码。",disclosureInbox:"15 分钟有效期内,本项目中任何已配置的 SpotPatch Connector 都可能读取。",disclosureProvider:"Agent 宿主可能依据其产品数据策略,将内容发送给云端模型服务。",disclosureNoGuarantee:"外部修改不具备 SpotPatch 内建 Agent 的 worktree、Apply 或 Revert 保证。",disclosureManagedGuarantee:"受管 Codex 只写独立临时快照。SpotPatch 会审计 diff,且仅在所有可信 required checks 通过后才写入业务仓库。",cancel:"取消",confirm:"确认并发送",error:e=>e==="EXTERNAL_AGENT_BUSY"?"主动 Agent 仍在工作,或存在尚未核对的投递未知状态。":e==="ACTIVE_DISPATCH_INVALID"?"主动投递状态已经变化,请刷新后再继续。":e==="HANDOFF_SOURCE_STALE"?"选中源码已经变化,请重新选择当前组件。":e==="HANDOFF_RESPONSE_TOO_LARGE"?"交接内容超过上限,请减少所选上下文。":e==="EXTERNAL_HANDOFF_DISABLED"?"可信项目配置没有启用外部 Agent 交接。":e==="EXTERNAL_HANDOFF_UNAVAILABLE"||e==="SESSION_CLOSED"?"本地外部 Agent Broker 不可用,请重启开发服务。":"外部 Agent 交接请求失败,未发布任何部分 revision。"})});function Qt(e){let t=e.createElement("style");return t.textContent=`
|
|
17
|
+
${_t}
|
|
2
18
|
.spotpatch-external-handoff { margin-top: 12px; padding: 12px; border: 1px solid var(--spotpatch-border); border-radius: var(--spotpatch-radius-card); background: rgb(82 168 255 / 5%); }
|
|
3
19
|
.spotpatch-external-handoff[hidden] { display: none; }
|
|
4
20
|
.spotpatch-external-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
|
@@ -8,8 +24,10 @@ var m="/__spotpatch/v1",se="X-SpotPatch-Token",w=Object.freeze({bootstrap:`${m}/
|
|
|
8
24
|
.spotpatch-external-status[data-state="error"] { border-color: var(--spotpatch-danger); color: #fecdd3; }
|
|
9
25
|
.spotpatch-external-status[data-state="picked-up"] { border-color: var(--spotpatch-success); color: #a7f3d0; }
|
|
10
26
|
.spotpatch-external-control { margin-top: 9px; padding: 9px; border: 1px solid var(--spotpatch-border); border-radius: 8px; background: rgb(3 7 18 / 28%); }
|
|
11
|
-
.spotpatch-external-control
|
|
12
|
-
.spotpatch-external-control
|
|
27
|
+
.spotpatch-external-control-field { display: grid; gap: 5px; min-width: 0; }
|
|
28
|
+
.spotpatch-external-control-field + .spotpatch-external-control-field { margin-top: 9px; }
|
|
29
|
+
.spotpatch-external-control-field > label { color: var(--spotpatch-text-secondary); font-size: 10px; }
|
|
30
|
+
.spotpatch-external-agent-value { box-sizing: border-box; display: flex; width: 100%; min-height: 38px; align-items: center; border: 1px solid var(--spotpatch-border); border-radius: 9px; padding: 0 11px; overflow: hidden; color: var(--spotpatch-text); background: rgb(255 255 255 / 3%); font: inherit; text-overflow: ellipsis; white-space: nowrap; }
|
|
13
31
|
.spotpatch-external-control-status { margin: 7px 0 0; color: #cbd5e1; font-size: 10.5px; line-height: 1.5; white-space: pre-wrap; }
|
|
14
32
|
.spotpatch-external-control-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
|
|
15
33
|
.spotpatch-external-control-actions button { padding: 5px 8px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: var(--spotpatch-bg-active); color: var(--spotpatch-text); font: inherit; font-size: 10px; cursor: pointer; }
|
|
@@ -32,7 +50,7 @@ var m="/__spotpatch/v1",se="X-SpotPatch-Token",w=Object.freeze({bootstrap:`${m}/
|
|
|
32
50
|
.spotpatch-external-disclosure-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 15px; }
|
|
33
51
|
.spotpatch-external-disclosure-actions button { padding: 7px 10px; border: 1px solid var(--spotpatch-border); border-radius: 7px; background: var(--spotpatch-bg-active); color: var(--spotpatch-text); font: inherit; cursor: pointer; }
|
|
34
52
|
.spotpatch-external-disclosure-actions .spotpatch-primary { border-color: transparent; background: var(--spotpatch-accent); color: var(--spotpatch-text-on-accent); }
|
|
35
|
-
`,t}function
|
|
36
|
-
`)}function
|
|
37
|
-
`)}function
|
|
38
|
-
`),
|
|
53
|
+
`,t}function Ct(e,t){let i=new Date(e);return Number.isNaN(i.valueOf())?e:new Intl.DateTimeFormat(t,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(i)}function Ue(e){return e==="claude-channel"?"Claude Code":"Codex"}function Ot(e,t){let i=Ue(t.adapterKind);return t.phase==="queued"?e.queued(i,t.revision):t.phase==="dispatching"?e.dispatching(i,t.revision):t.phase==="dispatched"?e.dispatched(i,t.revision):t.phase==="working"?e.working(i,t.revision):t.phase==="completed"?e.completed(i,t.revision):t.phase==="failed"?e.failed(i,t.revision):e.unknown(i,t.revision)}function Zt(e){return Object.freeze([...new Set(e.targets.flatMap(t=>{let i=t.code?.relativePath??t.source.relativePath;return i===void 0?[]:[i]}))])}function vt(e,t,i){let a=e.effectiveModel??e.requestedModel,g=e.task;return[t.controlConnection(e.connectionState,e.mode),t.controlAuth(e.authReadiness,e.grantState),...e.connectionState==="awaiting-consent"&&e.grantState==="missing"?[t.controlConsentRequired(`pnpm exec spotpatch-${i} bridge init`)]:[],...a===void 0?[]:[t.controlModel(a)],...g===void 0?[]:[t.controlRevision(g),...g.validationOutcome===void 0?[]:[t.controlValidation(g.validationOutcome)]],...e.error===void 0?[]:[t.controlFailure(t.controlErrorText[e.error.code],t.controlActionText[e.error.action])]].join(`
|
|
54
|
+
`)}function Lt(e,t){let i=e.files.map(o=>`${o.path} +${String(o.additions)} -${String(o.deletions)}`),a=e.checks.map(o=>`${o.id}: ${o.outcome} (${String(o.durationMs)} ms${o.exitCode===void 0?"":`, exit ${String(o.exitCode)}`})`),g=Object.entries(e.timings).flatMap(([o,c])=>c===void 0?[]:[t.resultTiming(o,c)]);return[t.resultHeader(e.revision,e.validationOutcome),t.resultDisposition(e.validationOutcome),...i,...a,...g].join(`
|
|
55
|
+
`)}function wt(e,t,i,a,g,o,c,E){let d={document:e,framework:t,locale:i,...c===void 0?{}:{onDispatchChange:c},...E===void 0?{}:{onControlChange:E},onViewChange:o,sessionId:a,subscribeLocale:g},n=Rt[d.locale()],O=null,b=!1,v=!1,R=!1,p=!1,y=!1,w=!1,x=!1,f=!1,A,J,F,ee,pe=`spotpatch:external-handoff-consent:${d.sessionId}`,U=u(e,"section");U.className="spotpatch-external-handoff",U.hidden=!0;let te=u(e,"div");te.className="spotpatch-external-heading",te.setAttribute("data-spotpatch-agent-identity","");let ue=u(e,"strong"),z=G(e,"","spotpatch-external-refresh");te.append(ue,z);let fe=u(e,"p");fe.className="spotpatch-external-description";let S=u(e,"p");S.className="spotpatch-external-status",S.setAttribute("role","status"),S.setAttribute("aria-live","polite");let ne=u(e,"div");ne.className="spotpatch-external-control";let oe=u(e,"div");oe.className="spotpatch-external-control-field";let Ee=u(e,"label"),Ae=u(e,"span"),K=u(e,"div");K.className="spotpatch-external-agent-value",Ee.append(Ae),oe.append(Ee,K);let ge=u(e,"div");ge.className="spotpatch-external-control-field";let Q=u(e,"label"),he=u(e,"span"),X=Nt(e,d.onViewChange),I=X.select;Q.htmlFor=X.trigger.id;let _e=u(e,"p");Q.append(he),ge.append(Q,X.root);let B=u(e,"p");B.className="spotpatch-external-control-status",B.setAttribute("role","status");let re=u(e,"div");re.className="spotpatch-external-control-actions";let V=G(e,""),W=G(e,""),ae=G(e,""),s=G(e,"");re.append(V,W,ae,s);let l=u(e,"details");l.className="spotpatch-external-result",l.hidden=!0;let h=u(e,"summary"),$=u(e,"p"),ie=u(e,"pre");l.append(h,$,ie),ne.append(oe,ge,_e,B,re,l);let se=G(e,"","spotpatch-external-resolve");se.hidden=!0;let xe=u(e,"details");xe.className="spotpatch-external-settings";let Be=u(e,"summary"),$e=u(e,"p");xe.append(Be,$e),U.append(te,fe,ne,S,se,xe);let de=G(e,"","spotpatch-primary");de.hidden=!0;let j=u(e,"div");j.className="spotpatch-external-disclosure",j.hidden=!0;let Z=u(e,"section");Z.className="spotpatch-external-disclosure-card",Z.tabIndex=-1,Z.setAttribute("role","alertdialog"),Z.setAttribute("aria-modal","true");let Xe=u(e,"h3"),Ve=u(e,"p"),we=u(e,"p");we.className="spotpatch-external-files";let je=u(e,"p"),qe=u(e,"p"),ze=u(e,"p"),me=u(e,"p"),De=u(e,"div");De.className="spotpatch-external-disclosure-actions";let Ne=G(e,""),Re=G(e,"","spotpatch-primary");De.append(Ne,Re),Z.append(Xe,Ve,we,je,qe,ze,me,De),j.append(Z),U.append(j);let kt=()=>{try{return e.defaultView?.sessionStorage.getItem(pe)==="confirmed"}catch{return!1}},Pt=()=>{try{e.defaultView?.sessionStorage.setItem(pe,"confirmed")}catch{}},Ie=()=>A?.mode==="managed"&&I.value!==""&&I.value!==A.requestedModel,Mt=()=>O?.canDispatch===!0&&Ie(),Ht=()=>x||A?.connectionState==="diagnosing"||A?.connectionState==="connecting"||A?.connectionState==="disconnecting",k=()=>{de.textContent=p?n.retry:O?.canDispatch===!0?n.send:n.inboxSend,de.disabled=!f||!b||!w||R||Mt()||!p&&v,de.setAttribute("aria-busy",String(R)),z.disabled=!f||R,se.hidden=!y,se.disabled=!f||R||!y},le=()=>{if(V.textContent=Ie()?n.applyModel:n.connectManaged,A===void 0){X.setDisabled(!0),V.disabled=!0,W.disabled=!0,ae.disabled=!0,s.hidden=!0;return}let r=A.connectionState,T=Ht();X.setDisabled(x||r==="busy"||!A.models?.length),V.disabled=T||r==="ready"&&!Ie()||r==="busy",W.disabled=T||r==="disconnected",ae.disabled=T||A.grantState!=="valid";let L=A.task?.managedPhase;s.hidden=L===void 0||L==="completed"||L==="review-required"||L==="failed"||L==="cancelled"||L==="cleanup-warning",s.disabled=T},be=r=>{if(F===void 0)return;let T=F;F=void 0,j.hidden=!0,r&&Pt(),ee?.focus({preventScroll:!0}),ee=void 0,T(r),d.onViewChange()},Ke=r=>{if(r.key==="Escape"){r.preventDefault(),be(!1);return}if(r.key!=="Tab")return;let T=Ne,L=Re,q=j.getRootNode(),Ce="activeElement"in q?q.activeElement:e.activeElement;r.shiftKey&&Ce===T?(r.preventDefault(),L.focus()):!r.shiftKey&&Ce===L&&(r.preventDefault(),T.focus())},We=()=>{n=Rt[d.locale()],ue.textContent=n.title,fe.textContent=n.description,z.textContent=n.refresh,z.title=n.refresh,Be.textContent=n.settingsTitle,$e.textContent=n.settingsHelp,Xe.textContent=n.disclosureTitle,je.textContent=n.disclosureData,qe.textContent=n.disclosureInbox,ze.textContent=n.disclosureProvider,me.textContent=n.disclosureNoGuarantee,Ae.textContent=n.agentLabel,he.textContent=n.modelLabel,_e.textContent=n.modelHint,I.options.length===1&&I.options[0]?.value===""&&(I.options[0].textContent=n.modelLoading),K.textContent=n.codexManaged,V.textContent=n.connectManaged,W.textContent=n.disconnectManaged,ae.textContent=n.revokeManaged,s.textContent=n.cancelManaged,h.textContent=n.resultTitle,A!==void 0&&(B.textContent=vt(A,n,t),me.textContent=A.mode==="managed"?n.disclosureManagedGuarantee:n.disclosureNoGuarantee),J!==void 0&&($.textContent=Lt(J,n)),Ne.textContent=n.cancel,Re.textContent=n.confirm,se.textContent=n.resolveUnknown,k(),le()};Ne.addEventListener("click",()=>{be(!1)}),Re.addEventListener("click",()=>{be(!0)}),j.addEventListener("keydown",Ke),xe.addEventListener("toggle",d.onViewChange),l.addEventListener("toggle",d.onViewChange);let Ye=()=>{le(),k()};I.addEventListener("change",Ye);let ke=()=>{let r=I.value,T=A?.models??[];I.replaceChildren(...(T.length?T:[""]).map(L=>{let q=u(e,"option");return q.value=L,q.textContent=L||n.modelLoading,q})),I.value=T.includes(r)?r:A?.requestedModel??T[0]??"",X.rebuild()};ke();let Gt=d.subscribeLocale(We);We(),S.textContent=n.ready,B.textContent=d.locale()==="zh-CN"?"正在读取本地连接状态……":"Reading local connection status…",k(),le();let Ft=r=>r.state==="expired"?n.expired(r.revision):r.state==="superseded"?n.superseded(r.revision):r.pickupCount>0?n.pickedUp(r.revision,r.pickupCount,r.pickedUpAt===void 0?void 0:Ct(r.pickedUpAt,d.locale())):n.published(r.revision,Ct(r.expiresAt,d.locale())),Je=r=>{R=!1,p=!1,O=r.activeAdapter,y=r.dispatch?.phase==="delivery-unknown"&&r.activeAdapter?.state==="blocked",v=y||r.activeAdapter!==null&&!r.activeAdapter.canDispatch,r.dispatch!==null?(S.dataset.state=r.dispatch.phase,S.textContent=r.dispatch.phase==="delivery-unknown"&&!y?n.unknownResolved(Ue(r.dispatch.adapterKind),r.dispatch.revision):Ot(n,r.dispatch)):(S.dataset.state=r.handoff.state==="available"&&r.handoff.pickupCount>0?"picked-up":r.handoff.state,S.textContent=Ft(r.handoff)),k(),d.onDispatchChange?.(r.dispatch),d.onViewChange()};return Object.freeze({root:U,styles:Qt(e),sendButton:de,refreshButton:z,resolveButton:se,cancelManagedButton:s,connectButton:V,readModel:()=>I.value||void 0,disconnectButton:W,revokeButton:ae,confirmDisclosure(r){if(kt())return Promise.resolve(!0);if(F!==void 0)return Promise.resolve(!1);let T=Zt(r);Ve.textContent=n.disclosureIntro(r.targets.length,T.length),we.textContent=T.length===0?"—":T.join(`
|
|
56
|
+
`),j.hidden=!1;let L=U.getRootNode(),q="activeElement"in L?L.activeElement:e.activeElement;return ee=q instanceof HTMLElement?q:void 0,d.onViewChange(),Z.focus({preventScroll:!0}),new Promise(Ce=>{F=Ce})},renderCapability(r){b=r.brokerReady,R=!1,p=!1,O=r.activeAdapter,y=!1,v=r.activeAdapter!==null&&!r.activeAdapter.canDispatch,S.dataset.state=r.brokerReady?"ready":"error",S.textContent=r.brokerReady?r.activeAdapter?.canDispatch===!0?n.activeReady(Ue(r.activeAdapter.kind)):r.dispatch!==null&&r.activeAdapter!==null?Ot(n,r.dispatch):r.activeWaitCount>0?n.readyWaiting(r.activeWaitCount):n.ready:n.error("EXTERNAL_HANDOFF_UNAVAILABLE"),k(),d.onDispatchChange?.(r.dispatch),d.onViewChange()},renderPublishing(){R=!0,p=!1,S.dataset.state="publishing",S.textContent=n.publishing,k(),d.onViewChange()},renderPublishResult(r){Je(Object.freeze({handoff:r.handoff,activeAdapter:r.delivery.mode==="active"?r.delivery.adapter:null,dispatch:r.delivery.mode==="active"?r.delivery.dispatch:null}))},renderStatus(r){Je(r)},renderControlStatus(r){A=r,ke(),B.textContent=vt(r,n,t),B.dataset.state=r.connectionState,me.textContent=r.mode==="managed"?n.disclosureManagedGuarantee:n.disclosureNoGuarantee,le(),k(),d.onControlChange?.(r),d.onViewChange()},renderControlUnavailable(){A=void 0,ke(),B.dataset.state="unavailable",B.textContent=n.controlUnavailable,me.textContent=n.disclosureNoGuarantee,le(),d.onControlChange?.(void 0),k(),d.onViewChange()},renderManagedResult(r){J=r,l.hidden=!1,l.open=!0,$.textContent=Lt(r,n),ie.textContent=r.diff,d.onViewChange()},renderError(r,T=!1){R=!1,p=T,r==="EXTERNAL_AGENT_BUSY"&&(v=!0),S.dataset.state="error",S.textContent=T?`${n.error(r)} ${n.retry}.`:n.error(r),k(),d.onDispatchChange?.(null),d.onViewChange()},setBusy(r){R=r,k()},setControlBusy(r){x=r,le(),k()},setContextReady(r){w=r,k()},setSelectionVisible(r){f=r,U.hidden=!r,de.hidden=!r,r||be(!1),k()},dispose(){be(!1),j.removeEventListener("keydown",Ke),xe.removeEventListener("toggle",d.onViewChange),l.removeEventListener("toggle",d.onViewChange),I.removeEventListener("change",Ye),X.dispose(),Gt()}})}var en=Symbol.for("spotpatch.external-handoff.v1");function Dt(e){globalThis[en]=e}function It(){Dt(Object.freeze({createPanel:wt,createWorkflow:yt}))}It();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spotpatch/vite",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.4",
|
|
4
4
|
"description": "Vite development plugin for SpotPatch.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -48,12 +48,12 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"magic-string": "1.1.0",
|
|
50
50
|
"oxc-parser": "0.143.0",
|
|
51
|
-
"@spotpatch/bridge": "^0.4.
|
|
51
|
+
"@spotpatch/bridge": "^0.4.4",
|
|
52
52
|
"@spotpatch/compiler": "^0.4.2",
|
|
53
|
-
"@spotpatch/dev-server": "^0.10.
|
|
53
|
+
"@spotpatch/dev-server": "^0.10.1",
|
|
54
54
|
"@spotpatch/react-adapter": "^1.2.0",
|
|
55
|
-
"@spotpatch/runtime": "^1.15.
|
|
56
|
-
"@spotpatch/shared": "^1.14.
|
|
55
|
+
"@spotpatch/runtime": "^1.15.3",
|
|
56
|
+
"@spotpatch/shared": "^1.14.3"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
|