@spotpatch/runtime 1.12.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/{chunk-BXRMVHNT.js → chunk-ASRUAKA5.js} +1 -1
  2. package/dist/chunk-ASRUAKA5.js.map +1 -0
  3. package/dist/chunk-KIDHJQRG.js +14 -0
  4. package/dist/chunk-KIDHJQRG.js.map +1 -0
  5. package/dist/{chunk-7ES63LA7.js → chunk-P6X75LO5.js} +11 -1
  6. package/dist/chunk-P6X75LO5.js.map +1 -0
  7. package/dist/chunk-P7W3F4UA.js +115 -0
  8. package/dist/chunk-P7W3F4UA.js.map +1 -0
  9. package/dist/contextual-ask-panel.cjs +1637 -0
  10. package/dist/contextual-ask-panel.cjs.map +1 -0
  11. package/dist/contextual-ask-panel.d.cts +163 -0
  12. package/dist/contextual-ask-panel.d.ts +163 -0
  13. package/dist/contextual-ask-panel.js +1593 -0
  14. package/dist/contextual-ask-panel.js.map +1 -0
  15. package/dist/data-flow-panel.cjs +9 -0
  16. package/dist/data-flow-panel.cjs.map +1 -1
  17. package/dist/data-flow-panel.js +1 -1
  18. package/dist/external-handoff-panel.cjs +29 -9
  19. package/dist/external-handoff-panel.cjs.map +1 -1
  20. package/dist/external-handoff-panel.d.cts +3 -3
  21. package/dist/external-handoff-panel.d.ts +3 -3
  22. package/dist/external-handoff-panel.js +22 -11
  23. package/dist/external-handoff-panel.js.map +1 -1
  24. package/dist/index.cjs +1285 -279
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.js +1250 -356
  27. package/dist/index.js.map +1 -1
  28. package/dist/motion-extension-contract-B3m26CML.d.cts +72 -0
  29. package/dist/motion-extension-contract-B3m26CML.d.ts +72 -0
  30. package/dist/motion.cjs +1251 -0
  31. package/dist/motion.cjs.map +1 -0
  32. package/dist/motion.d.cts +11 -0
  33. package/dist/motion.d.ts +11 -0
  34. package/dist/motion.js +1092 -0
  35. package/dist/motion.js.map +1 -0
  36. package/package.json +31 -3
  37. package/dist/chunk-7ES63LA7.js.map +0 -1
  38. package/dist/chunk-BXRMVHNT.js.map +0 -1
@@ -11,4 +11,4 @@ export {
11
11
  registerExternalHandoffExtension,
12
12
  getExternalHandoffExtension
13
13
  };
14
- //# sourceMappingURL=chunk-BXRMVHNT.js.map
14
+ //# sourceMappingURL=chunk-ASRUAKA5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/external-handoff-contract.ts"],"sourcesContent":["import type {\n DispatchSummary,\n ErrorCode,\n ExternalAgentControlStatus,\n ExternalAgentManagedResult,\n ExternalHandoffCapability,\n ExternalHandoffPublishResult,\n ExternalHandoffStatusResult,\n ExternalHandoffFramework,\n SpotAnnotation,\n SpotPatchLocale,\n} from \"@spotpatch/shared/external-handoff-browser\";\n\nexport interface ExternalHandoffPanel {\n readonly cancelManagedButton: HTMLButtonElement;\n readonly connectButton: HTMLButtonElement;\n readonly disconnectButton: HTMLButtonElement;\n readonly refreshButton: HTMLButtonElement;\n readonly root: HTMLElement;\n readonly sendButton: HTMLButtonElement;\n readonly styles: HTMLStyleElement;\n readonly confirmDisclosure: (annotation: SpotAnnotation) => Promise<boolean>;\n readonly dispose: () => void;\n readonly renderCapability: (capability: ExternalHandoffCapability) => void;\n readonly renderControlUnavailable: () => void;\n readonly renderControlStatus: (status: ExternalAgentControlStatus) => void;\n readonly renderError: (code?: ErrorCode, retryable?: boolean) => void;\n readonly renderPublishResult: (result: ExternalHandoffPublishResult) => void;\n readonly renderPublishing: () => void;\n readonly renderManagedResult: (result: ExternalAgentManagedResult) => void;\n readonly renderStatus: (result: ExternalHandoffStatusResult) => void;\n readonly resolveButton: HTMLButtonElement;\n readonly revokeButton: HTMLButtonElement;\n readonly setBusy: (busy: boolean) => void;\n readonly setControlBusy: (busy: boolean) => void;\n readonly setContextReady: (ready: boolean) => void;\n readonly setSelectionVisible: (visible: boolean) => void;\n}\n\nexport interface ExternalHandoffWorkflow {\n readonly cancelPending: () => void;\n readonly dispose: () => void;\n readonly mount: () => void;\n}\n\nexport interface ExternalHandoffExtension {\n readonly createPanel: (\n document: Document,\n framework: ExternalHandoffFramework,\n locale: () => SpotPatchLocale,\n sessionId: string,\n subscribeLocale: (listener: () => void) => () => void,\n onViewChange: () => void,\n onDispatchChange?: (dispatch: DispatchSummary | null) => void,\n onControlChange?: (status: ExternalAgentControlStatus | undefined) => void,\n ) => ExternalHandoffPanel;\n readonly createWorkflow: (\n fetch: typeof globalThis.fetch,\n panel: ExternalHandoffPanel,\n selectedAnnotation: () => SpotAnnotation | undefined,\n sessionToken: string,\n window: Window,\n ) => ExternalHandoffWorkflow;\n}\n\nconst EXTERNAL_HANDOFF_EXTENSION_KEY = Symbol.for(\"spotpatch.external-handoff.v1\");\ntype ExtensionStore = Partial<Record<symbol, ExternalHandoffExtension>>;\n\nexport function registerExternalHandoffExtension(\n extension: ExternalHandoffExtension,\n): void {\n (globalThis as ExtensionStore)[EXTERNAL_HANDOFF_EXTENSION_KEY] = extension;\n}\n\nexport function getExternalHandoffExtension(): ExternalHandoffExtension | undefined {\n return (globalThis as ExtensionStore)[EXTERNAL_HANDOFF_EXTENSION_KEY];\n}\n"],"mappings":";AAiEA,IAAM,iCAAiC,uBAAO,IAAI,+BAA+B;AAG1E,SAAS,iCACd,WACM;AACN,EAAC,WAA8B,8BAA8B,IAAI;AACnE;AAEO,SAAS,8BAAoE;AAClF,SAAQ,WAA8B,8BAA8B;AACtE;","names":[]}
@@ -0,0 +1,14 @@
1
+ // src/ui/contextual-ask-contract.ts
2
+ var CONTEXTUAL_ASK_EXTENSION_KEY = /* @__PURE__ */ Symbol.for("spotpatch.contextual-ask.v1");
3
+ function registerContextualAskExtension(extension) {
4
+ globalThis[CONTEXTUAL_ASK_EXTENSION_KEY] = extension;
5
+ }
6
+ function getContextualAskExtension() {
7
+ return globalThis[CONTEXTUAL_ASK_EXTENSION_KEY];
8
+ }
9
+
10
+ export {
11
+ registerContextualAskExtension,
12
+ getContextualAskExtension
13
+ };
14
+ //# sourceMappingURL=chunk-KIDHJQRG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/contextual-ask-contract.ts"],"sourcesContent":["import type { SpotPatchLocale } from \"@spotpatch/shared\";\nimport type {\n AskAnswerResult,\n AskDraftOrigin,\n AskJobEvent,\n AskJobSnapshot,\n AskSourceReference,\n ContextualAskCapability,\n ErrorCode,\n} from \"@spotpatch/shared/contextual-ask-browser\";\nimport type { SelectionSnapshotTarget } from \"../state/selection-session.js\";\n\nimport type { ContextualAskApi } from \"../api/contextual-ask-api.js\";\nimport type { ClipboardWriter } from \"../controller/runtime-environment.js\";\nimport type { FloatingSurfaceProjection } from \"./motion-extension-contract.js\";\n\nexport interface ContextualAskSelectionPreview {\n readonly contextReady: boolean;\n readonly targetCount: number;\n readonly sourceCount: number;\n}\n\nexport interface ContextualAskSelectionDraft {\n readonly locale: SpotPatchLocale;\n readonly targets: readonly SelectionSnapshotTarget[];\n}\n\nexport interface ContextualAskPanel {\n readonly cancelButton: HTMLButtonElement;\n readonly consentCheckbox: HTMLInputElement;\n readonly convertButton: HTMLButtonElement;\n readonly copyButton: HTMLButtonElement;\n readonly executorSelect: HTMLSelectElement;\n readonly newQuestionButton: HTMLButtonElement;\n readonly questionInput: HTMLTextAreaElement;\n readonly root: HTMLElement;\n readonly styles: HTMLStyleElement;\n readonly submitButton: HTMLButtonElement;\n readonly clear: () => void;\n readonly dispose: () => void;\n readonly focusQuestion: () => void;\n readonly mode: () => \"ask\" | \"change\";\n readonly notify: (\n event: \"copied\" | \"copy-failed\" | \"converted\" | \"source-open-failed\",\n ) => void;\n readonly readConsent: () => boolean;\n readonly readExecutorId: () => string | undefined;\n readonly readQuestion: () => string;\n readonly renderAnswer: (result: AskAnswerResult, stale: boolean) => void;\n readonly renderCapability: (capability?: ContextualAskCapability) => void;\n readonly renderError: (code?: ErrorCode) => void;\n readonly renderEvent: (event: AskJobEvent) => void;\n readonly renderJob: (snapshot: AskJobSnapshot) => void;\n readonly selectedSourceId: (target: EventTarget | null) => string | undefined;\n readonly setBusy: (busy: boolean) => void;\n readonly setConsent: (granted: boolean) => void;\n readonly setMode: (mode: \"ask\" | \"change\") => void;\n readonly setOrigin: (origin?: AskDraftOrigin) => void;\n readonly setSelectionPreview: (preview: ContextualAskSelectionPreview) => void;\n readonly setSelectionVisible: (visible: boolean) => void;\n readonly sourceById: (sourceId: string) => AskSourceReference | undefined;\n readonly answerPlainText: () => string;\n}\n\nexport interface ContextualAskWorkflow {\n readonly beginSelection: () => void;\n readonly cancelPending: () => void;\n readonly dispose: () => void;\n readonly isBusy: () => boolean;\n readonly mount: () => void;\n readonly selectionChanged: () => void;\n}\n\nexport interface ContextualAskExtension {\n readonly createPanel: (\n input: Readonly<{\n document: Document;\n locale: () => SpotPatchLocale;\n subscribeLocale: (listener: () => void) => () => void;\n changeRoot: HTMLElement;\n changeActions: HTMLElement;\n announce: (message: string) => void;\n onModeChange: (mode: \"ask\" | \"change\", title: string, subtitle: string) => void;\n onExecutionChange: (projection?: FloatingSurfaceProjection) => void;\n onViewChange: () => void;\n }>,\n ) => ContextualAskPanel;\n readonly createWorkflow: (\n input: Readonly<{\n api?: ContextualAskApi;\n clipboard?: ClipboardWriter;\n createId: () => string;\n fetch: typeof globalThis.fetch;\n getSelection: () => ContextualAskSelectionDraft | undefined;\n onConvert: (origin: AskDraftOrigin) => void;\n onBusyChange: (busy: boolean) => void;\n onOpenSource: (source: AskSourceReference) => Promise<void>;\n panel: ContextualAskPanel;\n sessionToken: string;\n }>,\n ) => ContextualAskWorkflow;\n}\n\nconst CONTEXTUAL_ASK_EXTENSION_KEY = Symbol.for(\"spotpatch.contextual-ask.v1\");\ntype ExtensionStore = Partial<Record<symbol, ContextualAskExtension>>;\n\nexport function registerContextualAskExtension(\n extension: ContextualAskExtension,\n): void {\n (globalThis as ExtensionStore)[CONTEXTUAL_ASK_EXTENSION_KEY] = extension;\n}\n\nexport function getContextualAskExtension(): ContextualAskExtension | undefined {\n return (globalThis as ExtensionStore)[CONTEXTUAL_ASK_EXTENSION_KEY];\n}\n"],"mappings":";AAuGA,IAAM,+BAA+B,uBAAO,IAAI,6BAA6B;AAGtE,SAAS,+BACd,WACM;AACN,EAAC,WAA8B,4BAA4B,IAAI;AACjE;AAEO,SAAS,4BAAgE;AAC9E,SAAQ,WAA8B,4BAA4B;AACpE;","names":[]}
@@ -4,6 +4,15 @@ var UI_Z_INDEX = Object.freeze({
4
4
  highlight: 2147483646,
5
5
  controls: 2147483647
6
6
  });
7
+ var FLOATING_SURFACE_LAYOUT = Object.freeze({
8
+ compactInset: 8,
9
+ compactViewportWidth: 520,
10
+ desktopInset: 24,
11
+ dragActivationDistance: 6,
12
+ edgeSnapDistance: 20,
13
+ workbenchMaxHeight: 620,
14
+ workbenchMaxWidth: 460
15
+ });
7
16
 
8
17
  // src/ui/dom.ts
9
18
  function createMarkedElement(document, tagName) {
@@ -22,7 +31,8 @@ function createButton(document, label, className = "") {
22
31
  export {
23
32
  UI_MARKER_ATTRIBUTE,
24
33
  UI_Z_INDEX,
34
+ FLOATING_SURFACE_LAYOUT,
25
35
  createMarkedElement,
26
36
  createButton
27
37
  };
28
- //# sourceMappingURL=chunk-7ES63LA7.js.map
38
+ //# sourceMappingURL=chunk-P6X75LO5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/ui-constants.ts","../src/ui/dom.ts"],"sourcesContent":["export const UI_MARKER_ATTRIBUTE = \"data-spotpatch-ui\" as const;\n\nexport const UI_Z_INDEX = Object.freeze({\n highlight: 2_147_483_646,\n controls: 2_147_483_647,\n});\n\nexport const FLOATING_SURFACE_LAYOUT = Object.freeze({\n compactInset: 8,\n compactViewportWidth: 520,\n desktopInset: 24,\n dragActivationDistance: 6,\n edgeSnapDistance: 20,\n workbenchMaxHeight: 620,\n workbenchMaxWidth: 460,\n});\n","import { UI_MARKER_ATTRIBUTE } from \"./ui-constants.js\";\n\nexport function createMarkedElement<K extends keyof HTMLElementTagNameMap>(\n document: Document,\n tagName: K,\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n element.setAttribute(UI_MARKER_ATTRIBUTE, \"\");\n return element;\n}\n\nexport function createButton(\n document: Document,\n label: string,\n className = \"\",\n): HTMLButtonElement {\n const button = createMarkedElement(document, \"button\");\n button.type = \"button\";\n button.className = className;\n button.textContent = label;\n return button;\n}\n"],"mappings":";AAAO,IAAM,sBAAsB;AAE5B,IAAM,aAAa,OAAO,OAAO;AAAA,EACtC,WAAW;AAAA,EACX,UAAU;AACZ,CAAC;AAEM,IAAM,0BAA0B,OAAO,OAAO;AAAA,EACnD,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,mBAAmB;AACrB,CAAC;;;ACbM,SAAS,oBACd,UACA,SAC0B;AAC1B,QAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,UAAQ,aAAa,qBAAqB,EAAE;AAC5C,SAAO;AACT;AAEO,SAAS,aACd,UACA,OACA,YAAY,IACO;AACnB,QAAM,SAAS,oBAAoB,UAAU,QAAQ;AACrD,SAAO,OAAO;AACd,SAAO,YAAY;AACnB,SAAO,cAAc;AACrB,SAAO;AACT;","names":[]}
@@ -0,0 +1,115 @@
1
+ // src/ui/motion-extension-contract.ts
2
+ var MOTION_EXTENSION_KEY = /* @__PURE__ */ Symbol.for("spotpatch.motion.v1");
3
+ function registerFloatingSurfaceMotionExtension(extension) {
4
+ globalThis[MOTION_EXTENSION_KEY] = extension;
5
+ }
6
+ function getFloatingSurfaceMotionExtension() {
7
+ return globalThis[MOTION_EXTENSION_KEY];
8
+ }
9
+
10
+ // src/ui/brand-mark-content.ts
11
+ var BRAND_MARK_CONTENT = `
12
+ <defs>
13
+ <linearGradient id="locator-gradient" x1="76" y1="92" x2="436" y2="374" gradientUnits="userSpaceOnUse">
14
+ <stop offset="0" stop-color="#B61CFF" />
15
+ <stop offset="0.38" stop-color="#6D35FF" />
16
+ <stop offset="0.72" stop-color="#168EFF" />
17
+ <stop offset="1" stop-color="#00D9E9" />
18
+ </linearGradient>
19
+ <linearGradient id="left-code-gradient" x1="165" y1="166" x2="236" y2="258" gradientUnits="userSpaceOnUse">
20
+ <stop stop-color="#A51EFF" />
21
+ <stop offset="1" stop-color="#653BFF" />
22
+ </linearGradient>
23
+ <linearGradient id="right-code-gradient" x1="276" y1="166" x2="347" y2="258" gradientUnits="userSpaceOnUse">
24
+ <stop stop-color="#158DFF" />
25
+ <stop offset="1" stop-color="#00D8E9" />
26
+ </linearGradient>
27
+ <linearGradient id="bolt-gradient" x1="270" y1="111" x2="252" y2="365" gradientUnits="userSpaceOnUse">
28
+ <stop stop-color="#6840FF" />
29
+ <stop offset="0.48" stop-color="#257BFF" />
30
+ <stop offset="1" stop-color="#00CBEF" />
31
+ </linearGradient>
32
+ </defs>
33
+ <path
34
+ fill="url(#locator-gradient)"
35
+ fill-rule="evenodd"
36
+ clip-rule="evenodd"
37
+ 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"
38
+ />
39
+ <rect x="238" y="20" width="36" height="84" rx="4" fill="url(#locator-gradient)" />
40
+ <rect x="62" y="196" width="84" height="36" rx="4" fill="url(#locator-gradient)" />
41
+ <rect x="366" y="196" width="84" height="36" rx="4" fill="url(#locator-gradient)" />
42
+ <path
43
+ d="M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z"
44
+ fill="url(#left-code-gradient)"
45
+ />
46
+ <path
47
+ d="M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z"
48
+ fill="url(#right-code-gradient)"
49
+ />
50
+ <path
51
+ d="M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z"
52
+ fill="url(#bolt-gradient)"
53
+ />
54
+ `;
55
+
56
+ // src/ui/brand-mark.ts
57
+ var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
58
+ function resolveBrandMarkContent(override) {
59
+ if (override !== void 0) {
60
+ return { content: override, viewBox: "0 0 512 512" };
61
+ }
62
+ const injected = typeof __SPOTPATCH_BRAND_MARK_CONTENT__ === "string" ? __SPOTPATCH_BRAND_MARK_CONTENT__ : void 0;
63
+ if (typeof injected === "string") {
64
+ return { content: injected, viewBox: "0 0 512 512" };
65
+ }
66
+ return true ? { content: BRAND_MARK_CONTENT, viewBox: "0 0 512 512" } : { content: FALLBACK_BRAND_MARK_CONTENT, viewBox: "0 0 1 1" };
67
+ }
68
+ function svgElement(document, tagName, attributes) {
69
+ const element = document.createElementNS(SVG_NAMESPACE, tagName);
70
+ for (const [name, value] of Object.entries(attributes)) {
71
+ element.setAttribute(name, value);
72
+ }
73
+ return element;
74
+ }
75
+ function namespaceSvgIds(svg, prefix) {
76
+ const safePrefix = prefix.replace(/[^a-zA-Z0-9_-]/gu, "-");
77
+ const ids = /* @__PURE__ */ new Map();
78
+ for (const element of svg.querySelectorAll("[id]")) {
79
+ const id = element.id;
80
+ const namespacedId = `${safePrefix}-${id}`;
81
+ ids.set(id, namespacedId);
82
+ element.id = namespacedId;
83
+ }
84
+ for (const element of [svg, ...svg.querySelectorAll("*")]) {
85
+ for (const attribute of [...element.attributes]) {
86
+ let value = attribute.value;
87
+ for (const [id, namespacedId] of ids) {
88
+ value = value.replaceAll(`url(#${id})`, `url(#${namespacedId})`);
89
+ if (value === `#${id}`) value = `#${namespacedId}`;
90
+ }
91
+ if (value !== attribute.value) element.setAttribute(attribute.name, value);
92
+ }
93
+ }
94
+ }
95
+ function createBrandMark(document, content, idPrefix) {
96
+ const resolved = resolveBrandMarkContent(content);
97
+ const svg = svgElement(document, "svg", {
98
+ xmlns: SVG_NAMESPACE,
99
+ class: "spotpatch-brand-mark",
100
+ viewBox: resolved.viewBox,
101
+ "aria-hidden": "true",
102
+ focusable: "false"
103
+ });
104
+ svg.innerHTML = resolved.content;
105
+ if (idPrefix !== void 0) namespaceSvgIds(svg, idPrefix);
106
+ return svg;
107
+ }
108
+
109
+ export {
110
+ BRAND_MARK_CONTENT,
111
+ createBrandMark,
112
+ registerFloatingSurfaceMotionExtension,
113
+ getFloatingSurfaceMotionExtension
114
+ };
115
+ //# sourceMappingURL=chunk-P7W3F4UA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/motion-extension-contract.ts","../src/ui/brand-mark-content.ts","../src/ui/brand-mark.ts"],"sourcesContent":["export type FloatingSurfaceScene =\n | \"pill\"\n | \"capturing\"\n | \"planner\"\n | \"agent-charging\"\n | \"handoff\"\n | \"running\"\n | \"success\"\n | \"failed\";\n\nexport type FloatingSurfaceTone =\n \"neutral\" | \"capturing\" | \"ready\" | \"running\" | \"success\" | \"danger\";\n\nexport type ExecutionActivityKind =\n | \"prepare\"\n | \"dispatch\"\n | \"discover\"\n | \"search\"\n | \"read\"\n | \"patch\"\n | \"check\"\n | \"audit\"\n | \"apply\"\n | \"sync\"\n | \"unknown\";\n\nexport interface FloatingSurfaceActivity {\n readonly detail?: string;\n readonly key: string;\n readonly kind: ExecutionActivityKind;\n readonly label: string;\n readonly state: \"active\" | \"success\" | \"failure\" | \"info\";\n}\n\nexport interface FloatingSurfaceProjection {\n readonly action: string;\n readonly activity?: FloatingSurfaceActivity;\n readonly expandedAction?: string;\n readonly expandedHeadline?: string;\n readonly headline: string;\n readonly meta: string;\n readonly recentActivities: readonly FloatingSurfaceActivity[];\n readonly scene: FloatingSurfaceScene;\n readonly startedAt?: string;\n readonly tone: FloatingSurfaceTone;\n}\n\nexport interface ExecutionIslandElements {\n readonly action: HTMLElement;\n readonly actionOutgoing: HTMLElement;\n readonly content: HTMLElement;\n readonly headline: HTMLElement;\n readonly headlineOutgoing: HTMLElement;\n readonly logo: SVGSVGElement;\n readonly mark: HTMLElement;\n readonly meta: HTMLElement;\n readonly metaDot: HTMLElement;\n readonly metaLabel: HTMLElement;\n readonly more: HTMLElement;\n readonly recent: HTMLElement;\n readonly root: HTMLButtonElement;\n readonly sweep: HTMLElement;\n readonly timer: HTMLElement;\n}\n\nexport interface ExecutionIslandView {\n readonly canExpand: () => boolean;\n readonly dispose: () => void;\n readonly isExpanded: () => boolean;\n readonly render: (projection: FloatingSurfaceProjection) => void;\n readonly root: HTMLButtonElement;\n readonly setExpanded: (expanded: boolean) => void;\n}\n\nexport interface MotionExecutionIsland extends ExecutionIslandView {\n readonly elements: ExecutionIslandElements;\n}\n\nexport interface FloatingSurfaceMotionElements {\n readonly execution: ExecutionIslandElements;\n readonly pill: HTMLButtonElement;\n readonly planner: HTMLElement;\n readonly surface: HTMLElement;\n}\n\nexport interface FloatingSurfaceMotionController {\n readonly cancel: () => void;\n readonly dispatch: (source: HTMLElement, target: HTMLElement) => void;\n readonly dispose: () => void;\n readonly render: (\n projection: FloatingSurfaceProjection,\n renderContent: () => void,\n ) => void;\n readonly updateLayout: (updateContent: () => void) => void;\n}\n\nexport interface FloatingSurfaceMotionExtension {\n readonly createExecutionIsland: (document: Document) => MotionExecutionIsland;\n readonly createController: (\n document: Document,\n elements: FloatingSurfaceMotionElements,\n reconcile: () => void,\n ) => FloatingSurfaceMotionController;\n readonly createStyles: (document: Document) => HTMLStyleElement;\n}\n\nconst MOTION_EXTENSION_KEY = Symbol.for(\"spotpatch.motion.v1\");\ntype ExtensionStore = Partial<Record<symbol, FloatingSurfaceMotionExtension>>;\n\nexport function registerFloatingSurfaceMotionExtension(\n extension: FloatingSurfaceMotionExtension,\n): void {\n (globalThis as ExtensionStore)[MOTION_EXTENSION_KEY] = extension;\n}\n\nexport function getFloatingSurfaceMotionExtension():\n FloatingSurfaceMotionExtension | undefined {\n return (globalThis as ExtensionStore)[MOTION_EXTENSION_KEY];\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 { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\ndeclare const __SPOTPATCH_INLINE_BRAND_MARK__: boolean;\ndeclare const __SPOTPATCH_BRAND_MARK_CONTENT__: string | undefined;\n\n/**\n * Deliberately empty fail-closed fallback for an invalid Vite injection.\n *\n * The browser bundle must not carry a second logo implementation: normal\n * Vite development injects BRAND_MARK_CONTENT lexically, while standalone\n * Runtime builds inline the canonical asset at compile time. Keeping this\n * branch empty preserves the bundle budget and prevents stale branding if a\n * host violates either build contract.\n */\nconst FALLBACK_BRAND_MARK_CONTENT = \"\";\n\nfunction resolveBrandMarkContent(override?: string): Readonly<{\n readonly content: string;\n readonly viewBox: string;\n}> {\n if (override !== undefined) {\n return { content: override, viewBox: \"0 0 512 512\" };\n }\n\n const injected =\n typeof __SPOTPATCH_BRAND_MARK_CONTENT__ === \"string\"\n ? __SPOTPATCH_BRAND_MARK_CONTENT__\n : undefined;\n if (typeof injected === \"string\") {\n return { content: injected, viewBox: \"0 0 512 512\" };\n }\n\n return __SPOTPATCH_INLINE_BRAND_MARK__\n ? { content: BRAND_MARK_CONTENT, viewBox: \"0 0 512 512\" }\n : { content: FALLBACK_BRAND_MARK_CONTENT, viewBox: \"0 0 1 1\" };\n}\n\nfunction svgElement<K extends keyof SVGElementTagNameMap>(\n document: Document,\n tagName: K,\n attributes: Readonly<Record<string, string>>,\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(SVG_NAMESPACE, tagName);\n\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value);\n }\n\n return element;\n}\n\nfunction namespaceSvgIds(svg: SVGSVGElement, prefix: string): void {\n const safePrefix = prefix.replace(/[^a-zA-Z0-9_-]/gu, \"-\");\n const ids = new Map<string, string>();\n\n for (const element of svg.querySelectorAll(\"[id]\")) {\n const id = element.id;\n const namespacedId = `${safePrefix}-${id}`;\n ids.set(id, namespacedId);\n element.id = namespacedId;\n }\n\n for (const element of [svg, ...svg.querySelectorAll(\"*\")]) {\n for (const attribute of [...element.attributes]) {\n let value = attribute.value;\n for (const [id, namespacedId] of ids) {\n value = value.replaceAll(`url(#${id})`, `url(#${namespacedId})`);\n if (value === `#${id}`) value = `#${namespacedId}`;\n }\n if (value !== attribute.value) element.setAttribute(attribute.name, value);\n }\n }\n}\n\n/** Vector form of docs/assets/spotpatch-logo-mark.svg; safe to inline in Shadow DOM. */\nexport function createBrandMark(\n document: Document,\n content?: string,\n idPrefix?: string,\n): SVGSVGElement {\n const resolved = resolveBrandMarkContent(content);\n const svg = svgElement(document, \"svg\", {\n xmlns: SVG_NAMESPACE,\n class: \"spotpatch-brand-mark\",\n viewBox: resolved.viewBox,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n });\n svg.innerHTML = resolved.content;\n if (idPrefix !== undefined) namespaceSvgIds(svg, idPrefix);\n return svg;\n}\n"],"mappings":";AA0GA,IAAM,uBAAuB,uBAAO,IAAI,qBAAqB;AAGtD,SAAS,uCACd,WACM;AACN,EAAC,WAA8B,oBAAoB,IAAI;AACzD;AAEO,SAAS,oCAC6B;AAC3C,SAAQ,WAA8B,oBAAoB;AAC5D;;;AChHO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACJlC,IAAM,gBAAgB;AAetB,SAAS,wBAAwB,UAG9B;AACD,MAAI,aAAa,QAAW;AAC1B,WAAO,EAAE,SAAS,UAAU,SAAS,cAAc;AAAA,EACrD;AAEA,QAAM,WACJ,OAAO,qCAAqC,WACxC,mCACA;AACN,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,EAAE,SAAS,UAAU,SAAS,cAAc;AAAA,EACrD;AAEA,SAAO,OACH,EAAE,SAAS,oBAAoB,SAAS,cAAc,IACtD,EAAE,SAAS,6BAA6B,SAAS,UAAU;AACjE;AAEA,SAAS,WACP,UACA,SACA,YACyB;AACzB,QAAM,UAAU,SAAS,gBAAgB,eAAe,OAAO;AAE/D,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,YAAQ,aAAa,MAAM,KAAK;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAoB,QAAsB;AACjE,QAAM,aAAa,OAAO,QAAQ,oBAAoB,GAAG;AACzD,QAAM,MAAM,oBAAI,IAAoB;AAEpC,aAAW,WAAW,IAAI,iBAAiB,MAAM,GAAG;AAClD,UAAM,KAAK,QAAQ;AACnB,UAAM,eAAe,GAAG,UAAU,IAAI,EAAE;AACxC,QAAI,IAAI,IAAI,YAAY;AACxB,YAAQ,KAAK;AAAA,EACf;AAEA,aAAW,WAAW,CAAC,KAAK,GAAG,IAAI,iBAAiB,GAAG,CAAC,GAAG;AACzD,eAAW,aAAa,CAAC,GAAG,QAAQ,UAAU,GAAG;AAC/C,UAAI,QAAQ,UAAU;AACtB,iBAAW,CAAC,IAAI,YAAY,KAAK,KAAK;AACpC,gBAAQ,MAAM,WAAW,QAAQ,EAAE,KAAK,QAAQ,YAAY,GAAG;AAC/D,YAAI,UAAU,IAAI,EAAE,GAAI,SAAQ,IAAI,YAAY;AAAA,MAClD;AACA,UAAI,UAAU,UAAU,MAAO,SAAQ,aAAa,UAAU,MAAM,KAAK;AAAA,IAC3E;AAAA,EACF;AACF;AAGO,SAAS,gBACd,UACA,SACA,UACe;AACf,QAAM,WAAW,wBAAwB,OAAO;AAChD,QAAM,MAAM,WAAW,UAAU,OAAO;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,SAAS;AAAA,IAClB,eAAe;AAAA,IACf,WAAW;AAAA,EACb,CAAC;AACD,MAAI,YAAY,SAAS;AACzB,MAAI,aAAa,OAAW,iBAAgB,KAAK,QAAQ;AACzD,SAAO;AACT;","names":[]}