@jami-studio/pinpoint 0.1.12
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/.agents/skills/pinpoint/SKILL.md +77 -0
- package/README.md +412 -0
- package/dist/agent-context-HBCZ4MBN.js +13 -0
- package/dist/agent-context-HBCZ4MBN.js.map +1 -0
- package/dist/chunk-B7TY4FPP.js +569 -0
- package/dist/chunk-B7TY4FPP.js.map +1 -0
- package/dist/chunk-CGJZ7BOM.js +88 -0
- package/dist/chunk-CGJZ7BOM.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-HAEYE6KB.js +25 -0
- package/dist/chunk-HAEYE6KB.js.map +1 -0
- package/dist/chunk-J5PXKVTM.js +53 -0
- package/dist/chunk-J5PXKVTM.js.map +1 -0
- package/dist/chunk-XBX2J7WU.js +94 -0
- package/dist/chunk-XBX2J7WU.js.map +1 -0
- package/dist/chunk-ZW7IO3EW.js +4927 -0
- package/dist/chunk-ZW7IO3EW.js.map +1 -0
- package/dist/cli.js +71 -0
- package/dist/cli.js.map +1 -0
- package/dist/formatter-CR4COA5Z.js +8 -0
- package/dist/formatter-CR4COA5Z.js.map +1 -0
- package/dist/index-NvFcZ4SO.d.ts +200 -0
- package/dist/index.browser.d.ts +377 -0
- package/dist/index.browser.js +620 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.js +936 -0
- package/dist/index.js.map +1 -0
- package/dist/open-file-WR2JHI4P.js +8 -0
- package/dist/open-file-WR2JHI4P.js.map +1 -0
- package/dist/primitives/index.js +28 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/react.d.ts +23 -0
- package/dist/react.js +20 -0
- package/dist/react.js.map +1 -0
- package/dist/server/index.js +457 -0
- package/dist/server/index.js.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +88 -0
- package/src/scripts/create-pin.ts +43 -0
- package/src/scripts/delete-pin.ts +16 -0
- package/src/scripts/get-pins.ts +36 -0
- package/src/scripts/list-sessions.ts +33 -0
- package/src/scripts/resolve-pin.ts +27 -0
- package/src/scripts/run.ts +8 -0
- package/src/scripts/update-pin.ts +32 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/frameworks/react-adapter.ts","../src/frameworks/vue-adapter.ts","../src/frameworks/generic-adapter.ts","../src/plugins/registry.ts","../src/plugins/agent-native-plugin.ts","../src/freeze/css-freeze.ts","../src/freeze/js-freeze.ts","../src/freeze/media-freeze.ts","../src/freeze/react-freeze.ts","../src/freeze/waapi-freeze.ts","../src/freeze/controller.ts","../src/security/input-sanitization.ts","../src/security/origin-validation.ts","../src/index.browser.ts"],"sourcesContent":["// @agent-native/pinpoint — React adapter using bippy + element-source\r\n// MIT License\r\n\r\nimport type {\r\n FrameworkAdapter,\r\n ComponentInfo,\r\n SourceLocation,\r\n} from \"../types/index.js\";\r\n\r\n// bippy provides React fiber introspection (MIT)\r\n// These are imported dynamically to avoid hard dependency when React isn't present\r\nlet bippy: typeof import(\"bippy\") | null = null;\r\nlet elementSource: typeof import(\"element-source\") | null = null;\r\n\r\nasync function loadBippy() {\r\n if (!bippy) {\r\n try {\r\n bippy = await import(\"bippy\");\r\n } catch {\r\n bippy = null;\r\n }\r\n }\r\n return bippy;\r\n}\r\n\r\nasync function loadElementSource() {\r\n if (!elementSource) {\r\n try {\r\n elementSource = await import(\"element-source\");\r\n } catch {\r\n elementSource = null;\r\n }\r\n }\r\n return elementSource;\r\n}\r\n\r\n/** React internal component names to filter from the component path */\r\nconst FRAMEWORK_INTERNALS = new Set([\r\n \"Fragment\",\r\n \"Suspense\",\r\n \"StrictMode\",\r\n \"Profiler\",\r\n \"Provider\",\r\n \"Consumer\",\r\n \"ForwardRef\",\r\n \"Memo\",\r\n // Next.js internals\r\n \"InnerLayoutRouter\",\r\n \"OuterLayoutRouter\",\r\n \"RenderFromTemplateContext\",\r\n \"ScrollAndFocusHandler\",\r\n \"RedirectBoundary\",\r\n \"NotFoundBoundary\",\r\n \"LoadingBoundary\",\r\n \"ErrorBoundary\",\r\n \"HotReload\",\r\n \"Router\",\r\n \"ServerRoot\",\r\n \"AppRouter\",\r\n \"ServerInsertedHTMLProvider\",\r\n // React Router internals\r\n \"Routes\",\r\n \"RenderedRoute\",\r\n \"Navigate\",\r\n \"Outlet\",\r\n]);\r\n\r\nfunction getRDTHook(): any {\r\n return typeof window !== \"undefined\"\r\n ? (window as any).__REACT_DEVTOOLS_GLOBAL_HOOK__\r\n : null;\r\n}\r\n\r\nexport const reactAdapter: FrameworkAdapter = {\r\n name: \"react\",\r\n\r\n detect(): boolean {\r\n return !!getRDTHook();\r\n },\r\n\r\n getComponentInfo(element: Element): ComponentInfo | null {\r\n const b = bippy;\r\n if (!b) return null;\r\n\r\n try {\r\n const fiber = b.getFiberFromHostInstance(element);\r\n if (!fiber) return null;\r\n\r\n // Build component path by traversing up the fiber tree\r\n const components: string[] = [];\r\n let current: any = fiber;\r\n\r\n while (current) {\r\n const name = b.getDisplayName(current);\r\n if (name && !FRAMEWORK_INTERNALS.has(name)) {\r\n components.unshift(name);\r\n }\r\n current = current.return ?? null;\r\n if (components.length > 20) break;\r\n }\r\n\r\n // Get the immediate component name\r\n let componentFiber: any = fiber;\r\n while (componentFiber && typeof componentFiber.type === \"string\") {\r\n componentFiber = componentFiber.return ?? null;\r\n }\r\n\r\n const displayName = componentFiber\r\n ? b.getDisplayName(componentFiber)\r\n : null;\r\n\r\n const sourceInfo = getSourceFromFiber(componentFiber);\r\n\r\n return {\r\n name: displayName || components[components.length - 1] || \"Unknown\",\r\n displayName: displayName || undefined,\r\n filePath: sourceInfo?.file,\r\n lineNumber: sourceInfo?.line,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n },\r\n\r\n getSourceLocation(element: Element): SourceLocation | null {\r\n const b = bippy;\r\n if (!b) return null;\r\n\r\n try {\r\n const fiber = b.getFiberFromHostInstance(element);\r\n if (!fiber) return null;\r\n\r\n let componentFiber: any = fiber;\r\n while (componentFiber && typeof componentFiber.type === \"string\") {\r\n componentFiber = componentFiber.return ?? null;\r\n }\r\n\r\n return getSourceFromFiber(componentFiber);\r\n } catch {\r\n return null;\r\n }\r\n },\r\n\r\n freeze(): void {\r\n // React update freezing handled by freeze/react-freeze.ts\r\n },\r\n\r\n unfreeze(): void {\r\n // Restore handled by freeze/react-freeze.ts\r\n },\r\n};\r\n\r\nfunction getSourceFromFiber(fiber: any): SourceLocation | null {\r\n if (!fiber) return null;\r\n\r\n // React 18: _debugSource contains file/line info\r\n if (fiber._debugSource) {\r\n return {\r\n file: fiber._debugSource.fileName,\r\n line: fiber._debugSource.lineNumber,\r\n column: fiber._debugSource.columnNumber,\r\n };\r\n }\r\n\r\n // React 19: _debugSource was removed, use element-source library\r\n // element-source returns Promise<ElementSourceInfo[]> — we use it sync from cache if available\r\n // For synchronous adapter API, we only use _debugSource. Async source resolution\r\n // is handled at a higher level when building ElementContext.\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Build a component path string like: <App> <Layout> <Sidebar> <NavLink>\r\n */\r\nexport function buildComponentPath(element: Element): string {\r\n const b = bippy;\r\n if (!b) return \"\";\r\n\r\n try {\r\n const fiber = b.getFiberFromHostInstance(element);\r\n if (!fiber) return \"\";\r\n\r\n const components: string[] = [];\r\n let current: any = fiber;\r\n\r\n while (current) {\r\n const name = b.getDisplayName(current);\r\n if (name && !FRAMEWORK_INTERNALS.has(name)) {\r\n components.unshift(`<${name}>`);\r\n }\r\n current = current.return ?? null;\r\n if (components.length > 10) break;\r\n }\r\n\r\n return components.join(\" \");\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\n// Initialize bippy and element-source lazily\r\nif (typeof window !== \"undefined\") {\r\n const init = () => {\r\n loadBippy();\r\n loadElementSource();\r\n };\r\n if (typeof requestIdleCallback !== \"undefined\") {\r\n requestIdleCallback(init);\r\n } else {\r\n setTimeout(init, 100);\r\n }\r\n}\r\n","// @agent-native/pinpoint — Vue 3 adapter\r\n// MIT License\r\n//\r\n// Detects Vue 3 apps via window.__VUE__ or [data-v-] attributes.\r\n// Walks component tree via __vueParentComponent DOM properties.\r\n\r\nimport type {\r\n FrameworkAdapter,\r\n ComponentInfo,\r\n SourceLocation,\r\n} from \"../types/index.js\";\r\n\r\nexport const vueAdapter: FrameworkAdapter = {\r\n name: \"vue\",\r\n\r\n detect(): boolean {\r\n if (typeof window === \"undefined\") return false;\r\n // Vue 3 devtools hook\r\n if ((window as any).__VUE__) return true;\r\n // Vue 3 scoped style attributes\r\n if (document.querySelector(\"[data-v-]\")) return true;\r\n // Check for Vue 3 app instance\r\n return !!document.querySelector(\"[__vue_app__]\");\r\n },\r\n\r\n getComponentInfo(element: Element): ComponentInfo | null {\r\n const instance = getVueInstance(element);\r\n if (!instance) return null;\r\n\r\n const name = getComponentName(instance);\r\n\r\n return {\r\n name: name || \"Unknown\",\r\n displayName: name || undefined,\r\n filePath: instance.$options?.__file || instance.type?.__file,\r\n lineNumber: undefined, // Vue doesn't expose line numbers like React\r\n };\r\n },\r\n\r\n getSourceLocation(element: Element): SourceLocation | null {\r\n const instance = getVueInstance(element);\r\n if (!instance) return null;\r\n\r\n const file =\r\n instance.$options?.__file ||\r\n instance.type?.__file ||\r\n instance.type?.__name;\r\n\r\n if (!file) return null;\r\n\r\n return { file };\r\n },\r\n};\r\n\r\n/**\r\n * Get the Vue component instance associated with a DOM element.\r\n */\r\nfunction getVueInstance(element: Element): any {\r\n // Vue 3: __vueParentComponent or __vue_app__\r\n const el = element as any;\r\n\r\n if (el.__vueParentComponent) {\r\n return el.__vueParentComponent;\r\n }\r\n\r\n // Walk up to find the nearest Vue component\r\n let current: Element | null = element;\r\n while (current) {\r\n if ((current as any).__vueParentComponent) {\r\n return (current as any).__vueParentComponent;\r\n }\r\n // Vue 2 compatibility\r\n if ((current as any).__vue__) {\r\n return (current as any).__vue__;\r\n }\r\n current = current.parentElement;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Get the display name of a Vue component instance.\r\n */\r\nfunction getComponentName(instance: any): string | null {\r\n if (!instance) return null;\r\n\r\n // Vue 3 Composition API\r\n if (instance.type?.name) return instance.type.name;\r\n if (instance.type?.__name) return instance.type.__name;\r\n\r\n // Vue 3 Options API\r\n if (instance.$options?.name) return instance.$options.name;\r\n\r\n // Infer from __file\r\n const file = instance.type?.__file || instance.$options?.__file;\r\n if (file) {\r\n const match = file.match(/([^/\\\\]+)\\.\\w+$/);\r\n if (match) return match[1];\r\n }\r\n\r\n return null;\r\n}\r\n","// @agent-native/pinpoint — Generic fallback adapter\r\n// MIT License\r\n//\r\n// For non-framework pages. DOM-only info, no component tree, no source files.\r\n\r\nimport type {\r\n FrameworkAdapter,\r\n ComponentInfo,\r\n SourceLocation,\r\n} from \"../types/index.js\";\r\n\r\nexport const genericAdapter: FrameworkAdapter = {\r\n name: \"generic\",\r\n\r\n detect(): boolean {\r\n // Always matches as the last resort\r\n return true;\r\n },\r\n\r\n getComponentInfo(_element: Element): ComponentInfo | null {\r\n // No framework = no component info\r\n return null;\r\n },\r\n\r\n getSourceLocation(_element: Element): SourceLocation | null {\r\n // No framework = no source location\r\n return null;\r\n },\r\n};\r\n","// @agent-native/pinpoint — Plugin registration and hook dispatch\r\n// MIT License\r\n\r\nimport type {\r\n Plugin,\r\n PluginHooks,\r\n PinpointAPI,\r\n PluginHookRegistry,\r\n} from \"../types/index.js\";\r\n\r\nconst plugins: Map<string, Plugin> = new Map();\r\nconst hookHandlers: Map<keyof PluginHooks, Set<Function>> = new Map();\r\n\r\n/**\r\n * Register a plugin.\r\n */\r\nexport function registerPlugin(plugin: Plugin, api?: PinpointAPI): void {\r\n if (plugins.has(plugin.name)) {\r\n unregisterPlugin(plugin.name);\r\n }\r\n\r\n plugins.set(plugin.name, plugin);\r\n\r\n // Register hook handlers\r\n if (plugin.hooks) {\r\n for (const [hookName, handler] of Object.entries(plugin.hooks)) {\r\n if (typeof handler === \"function\") {\r\n const key = hookName as keyof PluginHooks;\r\n if (!hookHandlers.has(key)) {\r\n hookHandlers.set(key, new Set());\r\n }\r\n hookHandlers.get(key)!.add(handler);\r\n }\r\n }\r\n }\r\n\r\n // Call setup if provided\r\n if (plugin.setup && api) {\r\n const registry: PluginHookRegistry = {\r\n register(hookName, handler) {\r\n if (!hookHandlers.has(hookName)) {\r\n hookHandlers.set(hookName, new Set());\r\n }\r\n hookHandlers.get(hookName)!.add(handler);\r\n },\r\n unregister(hookName, handler) {\r\n hookHandlers.get(hookName)?.delete(handler);\r\n },\r\n };\r\n plugin.setup(api, registry);\r\n }\r\n}\r\n\r\n/**\r\n * Unregister a plugin by name.\r\n */\r\nexport function unregisterPlugin(name: string): void {\r\n const plugin = plugins.get(name);\r\n if (!plugin) return;\r\n\r\n // Remove hook handlers\r\n if (plugin.hooks) {\r\n for (const [hookName, handler] of Object.entries(plugin.hooks)) {\r\n if (typeof handler === \"function\") {\r\n hookHandlers.get(hookName as keyof PluginHooks)?.delete(handler);\r\n }\r\n }\r\n }\r\n\r\n plugins.delete(name);\r\n}\r\n\r\n/**\r\n * Get all registered plugin names.\r\n */\r\nexport function getPlugins(): string[] {\r\n return Array.from(plugins.keys());\r\n}\r\n\r\n/**\r\n * Dispatch a hook to all registered handlers.\r\n */\r\nexport function dispatchHook(\r\n name: keyof PluginHooks,\r\n ...args: unknown[]\r\n): void {\r\n const handlers = hookHandlers.get(name);\r\n if (!handlers) return;\r\n\r\n for (const handler of handlers) {\r\n try {\r\n handler(...args);\r\n } catch (err) {\r\n console.warn(`[pinpoint] Plugin hook ${name} error:`, err);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Dispatch a hook that can transform data (pipeline pattern).\r\n * Returns the transformed value, or false to cancel.\r\n */\r\nexport function dispatchTransformHook<T>(\r\n name: keyof PluginHooks,\r\n initial: T,\r\n): T | false {\r\n const handlers = hookHandlers.get(name);\r\n if (!handlers) return initial;\r\n\r\n let current: T | false = initial;\r\n for (const handler of handlers) {\r\n try {\r\n const result = handler(current) as T | false | undefined;\r\n if (result === false) return false;\r\n if (result !== undefined) current = result;\r\n } catch (err) {\r\n console.warn(`[pinpoint] Plugin hook ${name} error:`, err);\r\n }\r\n }\r\n\r\n return current;\r\n}\r\n\r\n/**\r\n * Get context menu actions from all plugins.\r\n */\r\nexport function getPluginActions() {\r\n const actions = [];\r\n for (const plugin of plugins.values()) {\r\n if (plugin.actions) {\r\n actions.push(...plugin.actions);\r\n }\r\n }\r\n return actions;\r\n}\r\n","import type { Plugin } from \"../types/index.js\";\r\n\r\nexport const agentNativePlugin: Plugin = {\r\n name: \"agent-native\",\r\n};\r\n","// @agent-native/pinpoint — CSS animation freezing\r\n// MIT License\r\n\r\nconst FREEZE_STYLE_ID = \"__pinpoint-css-freeze\";\r\n\r\n/**\r\n * Freeze all CSS animations and transitions on the page.\r\n * Returns a cleanup function to restore.\r\n */\r\nexport function freezeCSS(): () => void {\r\n if (document.getElementById(FREEZE_STYLE_ID)) {\r\n return () => {}; // Already frozen\r\n }\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = FREEZE_STYLE_ID;\r\n style.textContent = `*, *::before, *::after {\r\n animation-play-state: paused !important;\r\n transition-property: none !important;\r\n }`;\r\n document.head.appendChild(style);\r\n\r\n return () => {\r\n style.remove();\r\n };\r\n}\r\n","// @agent-native/pinpoint — JS timer monkey-patching (opt-in)\r\n// MIT License\r\n//\r\n// Opt-in: disabled by default, activated via options.freezeJSTimers: true\r\n// Bounded queue (max 1000), staggered replay, Symbol-based exclusion.\r\n\r\nconst PINPOINT_SYMBOL = Symbol.for(\"pinpoint-internal\");\r\nconst MAX_QUEUE = 1000;\r\n\r\ninterface QueuedTimer {\r\n type: \"timeout\" | \"interval\" | \"raf\";\r\n callback: Function;\r\n delay?: number;\r\n args?: any[];\r\n}\r\n\r\nlet frozen = false;\r\nlet queue: QueuedTimer[] = [];\r\nlet originals: {\r\n setTimeout: typeof setTimeout;\r\n setInterval: typeof setInterval;\r\n clearTimeout: typeof clearTimeout;\r\n clearInterval: typeof clearInterval;\r\n requestAnimationFrame: typeof requestAnimationFrame;\r\n} | null = null;\r\n\r\n/**\r\n * Freeze JS timers by monkey-patching setTimeout, setInterval, rAF.\r\n * Queued callbacks are replayed on unfreeze.\r\n *\r\n * **Opt-in only** — call this explicitly when config.freezeJSTimers is true.\r\n */\r\nexport function freezeJSTimers(): () => void {\r\n if (frozen) return () => {};\r\n\r\n frozen = true;\r\n queue = [];\r\n\r\n originals = {\r\n setTimeout: window.setTimeout.bind(window),\r\n setInterval: window.setInterval.bind(window),\r\n clearTimeout: window.clearTimeout.bind(window),\r\n clearInterval: window.clearInterval.bind(window),\r\n requestAnimationFrame: window.requestAnimationFrame.bind(window),\r\n };\r\n\r\n // Patch setTimeout\r\n (window as any).setTimeout = (\r\n callback: Function | string,\r\n delay?: number,\r\n ...args: any[]\r\n ) => {\r\n if (typeof callback !== \"function\") return 0;\r\n // Skip our own callbacks (Symbol-based filter)\r\n if ((callback as any)[PINPOINT_SYMBOL]) {\r\n return originals!.setTimeout(callback, delay, ...args);\r\n }\r\n if (queue.length < MAX_QUEUE) {\r\n queue.push({ type: \"timeout\", callback, delay, args });\r\n }\r\n return 0; // Return fake timer ID\r\n };\r\n\r\n // Patch setInterval\r\n (window as any).setInterval = (\r\n callback: Function | string,\r\n delay?: number,\r\n ...args: any[]\r\n ) => {\r\n if (typeof callback !== \"function\") return 0;\r\n if ((callback as any)[PINPOINT_SYMBOL]) {\r\n return originals!.setInterval(callback, delay, ...args);\r\n }\r\n if (queue.length < MAX_QUEUE) {\r\n queue.push({ type: \"interval\", callback, delay, args });\r\n }\r\n return 0;\r\n };\r\n\r\n // Patch requestAnimationFrame\r\n (window as any).requestAnimationFrame = (callback: FrameRequestCallback) => {\r\n if ((callback as any)[PINPOINT_SYMBOL]) {\r\n return originals!.requestAnimationFrame(callback);\r\n }\r\n if (queue.length < MAX_QUEUE) {\r\n queue.push({ type: \"raf\", callback });\r\n }\r\n return 0;\r\n };\r\n\r\n return () => {\r\n if (!frozen || !originals) return;\r\n frozen = false;\r\n\r\n // Restore originals\r\n window.setTimeout = originals.setTimeout as any;\r\n window.setInterval = originals.setInterval as any;\r\n window.clearTimeout = originals.clearTimeout;\r\n window.clearInterval = originals.clearInterval;\r\n window.requestAnimationFrame = originals.requestAnimationFrame;\r\n\r\n // Staggered replay via requestIdleCallback\r\n const replayBatch = () => {\r\n const batch = queue.splice(0, 50);\r\n for (const item of batch) {\r\n try {\r\n if (item.type === \"raf\") {\r\n originals!.requestAnimationFrame(\r\n item.callback as FrameRequestCallback,\r\n );\r\n } else {\r\n originals!.setTimeout(\r\n item.callback as any,\r\n 0,\r\n ...(item.args || []),\r\n );\r\n }\r\n } catch {\r\n // Callback may no longer be valid\r\n }\r\n }\r\n if (queue.length > 0) {\r\n (window.requestIdleCallback || originals!.setTimeout)(replayBatch);\r\n }\r\n };\r\n\r\n if (queue.length > 0) {\r\n (window.requestIdleCallback || originals.setTimeout)(replayBatch);\r\n }\r\n\r\n originals = null;\r\n };\r\n}\r\n\r\n/**\r\n * Mark a callback as internal to Pinpoint, so it's not frozen.\r\n */\r\nexport function markInternal<T extends Function>(fn: T): T {\r\n (fn as any)[PINPOINT_SYMBOL] = true;\r\n return fn;\r\n}\r\n","// @agent-native/pinpoint — Media element freeze (video, audio, SVG SMIL)\r\n// MIT License\r\n\r\n/**\r\n * Pause all playing media elements on the page.\r\n * Returns a cleanup function to resume.\r\n */\r\nexport function freezeMedia(): () => void {\r\n const mediaElements = document.querySelectorAll(\"video, audio\");\r\n const playing: HTMLMediaElement[] = [];\r\n\r\n mediaElements.forEach((el) => {\r\n const media = el as HTMLMediaElement;\r\n if (!media.paused) {\r\n media.pause();\r\n playing.push(media);\r\n }\r\n });\r\n\r\n // Pause SVG SMIL animations\r\n const svgElements = document.querySelectorAll(\"svg\");\r\n const pausedSVGs: SVGSVGElement[] = [];\r\n svgElements.forEach((svg) => {\r\n if (typeof svg.pauseAnimations === \"function\") {\r\n try {\r\n svg.pauseAnimations();\r\n pausedSVGs.push(svg);\r\n } catch {\r\n // SVG may not support animation\r\n }\r\n }\r\n });\r\n\r\n return () => {\r\n playing.forEach((media) => {\r\n try {\r\n media.play();\r\n } catch {\r\n // Media may have been removed\r\n }\r\n });\r\n\r\n pausedSVGs.forEach((svg) => {\r\n try {\r\n svg.unpauseAnimations();\r\n } catch {\r\n // SVG may have been removed\r\n }\r\n });\r\n };\r\n}\r\n","// @agent-native/pinpoint — React update freezing\r\n// MIT License\r\n//\r\n// Patches React's dispatcher to queue state updates instead of applying them.\r\n// On unfreeze, flush queued updates. This prevents the host app from\r\n// re-rendering while the user is selecting an element.\r\n//\r\n// Based on react-grab pattern (MIT).\r\n\r\ninterface QueuedUpdate {\r\n fiber: any;\r\n queue: any;\r\n update: any;\r\n}\r\n\r\nlet frozen = false;\r\nlet originalDispatcher: any = null;\r\nlet queuedUpdates: QueuedUpdate[] = [];\r\n\r\nfunction getInternals(): any {\r\n const hook = (window as any).__REACT_DEVTOOLS_GLOBAL_HOOK__;\r\n if (!hook) return null;\r\n\r\n // Get the first React renderer\r\n const renderers = hook.renderers;\r\n if (!renderers || renderers.size === 0) return null;\r\n\r\n const renderer = renderers.values().next().value;\r\n return renderer?.currentDispatcherRef || null;\r\n}\r\n\r\n/**\r\n * Freeze React state updates by patching the dispatcher.\r\n * Updates are queued and replayed on unfreeze.\r\n */\r\nexport function freezeReact(): () => void {\r\n if (frozen) return () => {};\r\n\r\n const internals = getInternals();\r\n if (!internals) return () => {};\r\n\r\n frozen = true;\r\n originalDispatcher = internals.current;\r\n queuedUpdates = [];\r\n\r\n // Create a proxy dispatcher that intercepts useState/useReducer\r\n const proxyDispatcher = new Proxy(originalDispatcher, {\r\n get(target, prop) {\r\n if (prop === \"useState\" || prop === \"useReducer\") {\r\n return (...args: any[]) => {\r\n const result = target[prop](...args);\r\n // Wrap the setter to queue updates\r\n if (Array.isArray(result) && typeof result[1] === \"function\") {\r\n const originalSetter = result[1];\r\n result[1] = (action: any) => {\r\n queuedUpdates.push({\r\n fiber: null,\r\n queue: null,\r\n update: { setter: originalSetter, action },\r\n });\r\n };\r\n }\r\n return result;\r\n };\r\n }\r\n return target[prop];\r\n },\r\n });\r\n\r\n internals.current = proxyDispatcher;\r\n\r\n return () => {\r\n if (!frozen) return;\r\n frozen = false;\r\n\r\n // Restore original dispatcher\r\n if (internals && originalDispatcher) {\r\n internals.current = originalDispatcher;\r\n }\r\n\r\n // Flush queued updates\r\n for (const { update } of queuedUpdates) {\r\n try {\r\n update.setter(update.action);\r\n } catch {\r\n // Update may no longer be valid\r\n }\r\n }\r\n\r\n queuedUpdates = [];\r\n originalDispatcher = null;\r\n };\r\n}\r\n\r\nexport function isReactFrozen(): boolean {\r\n return frozen;\r\n}\r\n","// @agent-native/pinpoint — Web Animations API freeze\r\n// MIT License\r\n\r\n/**\r\n * Pause all WAAPI animations on the page.\r\n * Returns a cleanup function to resume.\r\n */\r\nexport function freezeWAAPI(): () => void {\r\n const animations = document.getAnimations();\r\n const playing = animations.filter((a) => a.playState === \"running\");\r\n playing.forEach((a) => a.pause());\r\n\r\n return () => {\r\n playing.forEach((a) => {\r\n try {\r\n a.play();\r\n } catch {\r\n // Animation may have been removed\r\n }\r\n });\r\n };\r\n}\r\n","// @agent-native/pinpoint — Unified freeze controller\r\n// MIT License\r\n//\r\n// Lazy initialization — nothing is patched until first freeze() call.\r\n\r\nimport { freezeCSS } from \"./css-freeze.js\";\r\nimport { freezeJSTimers } from \"./js-freeze.js\";\r\nimport { freezeMedia } from \"./media-freeze.js\";\r\nimport { freezeReact } from \"./react-freeze.js\";\r\nimport { freezeWAAPI } from \"./waapi-freeze.js\";\r\n\r\nlet cleanups: Array<() => void> = [];\r\nlet active = false;\r\n\r\nexport interface FreezeOptions {\r\n /** Freeze JS timers (opt-in, disabled by default) */\r\n jsTimers?: boolean;\r\n}\r\n\r\n/**\r\n * Freeze all animations, transitions, React updates, and media.\r\n * Call unfreeze() to restore.\r\n */\r\nexport function freeze(\r\n _elements?: Element[],\r\n options: FreezeOptions = {},\r\n): void {\r\n if (active) return;\r\n active = true;\r\n\r\n cleanups = [freezeCSS(), freezeWAAPI(), freezeReact(), freezeMedia()];\r\n\r\n if (options.jsTimers) {\r\n cleanups.push(freezeJSTimers());\r\n }\r\n}\r\n\r\n/**\r\n * Unfreeze everything and restore normal behavior.\r\n */\r\nexport function unfreeze(): void {\r\n if (!active) return;\r\n active = false;\r\n\r\n for (const cleanup of cleanups) {\r\n try {\r\n cleanup();\r\n } catch {\r\n // Best-effort cleanup\r\n }\r\n }\r\n cleanups = [];\r\n}\r\n\r\n/**\r\n * Check if freeze is currently active.\r\n */\r\nexport function isFreezeActive(): boolean {\r\n return active;\r\n}\r\n","// @agent-native/pinpoint — Input sanitization for DOM-derived strings\r\n// MIT License\r\n\r\nconst HTML_ENTITIES: Record<string, string> = {\r\n \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': \""\",\r\n \"'\": \"'\",\r\n};\r\n\r\n/**\r\n * Escape HTML entities in a string.\r\n * Use on all DOM-derived strings before rendering or including in output.\r\n */\r\nexport function escapeHtml(str: string): string {\r\n return str.replace(/[&<>\"']/g, (char) => HTML_ENTITIES[char] || char);\r\n}\r\n\r\n/**\r\n * Sanitize a string by removing control characters and limiting length.\r\n */\r\nexport function sanitizeString(str: string, maxLength = 1000): string {\r\n // Remove control characters (except newline, tab)\r\n const cleaned = str.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, \"\");\r\n return cleaned.slice(0, maxLength);\r\n}\r\n\r\n/**\r\n * Sanitize an object's string values recursively.\r\n */\r\nexport function sanitizeObject<T extends Record<string, any>>(\r\n obj: T,\r\n maxStringLength = 1000,\r\n): T {\r\n const result: any = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (typeof value === \"string\") {\r\n result[key] = sanitizeString(value, maxStringLength);\r\n } else if (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n !Array.isArray(value)\r\n ) {\r\n result[key] = sanitizeObject(value, maxStringLength);\r\n } else if (Array.isArray(value)) {\r\n result[key] = value.map((item) =>\r\n typeof item === \"string\"\r\n ? sanitizeString(item, maxStringLength)\r\n : typeof item === \"object\" && item !== null\r\n ? sanitizeObject(item, maxStringLength)\r\n : item,\r\n );\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n return result;\r\n}\r\n","// @agent-native/pinpoint — Origin validation for cross-frame communication\r\n// MIT License\r\n\r\n/**\r\n * Validate that a message origin is allowed.\r\n * Used for postMessage security when communicating with frames.\r\n */\r\nexport function isAllowedOrigin(\r\n origin: string,\r\n allowedOrigins?: string[],\r\n): boolean {\r\n // Always allow same-origin\r\n if (origin === window.location.origin) return true;\r\n\r\n // Always allow localhost variants\r\n if (\r\n origin.startsWith(\"http://localhost\") ||\r\n origin.startsWith(\"http://127.0.0.1\") ||\r\n origin.startsWith(\"https://localhost\")\r\n ) {\r\n return true;\r\n }\r\n\r\n // Check explicit allowlist\r\n if (allowedOrigins && allowedOrigins.length > 0) {\r\n return allowedOrigins.includes(origin);\r\n }\r\n\r\n // Default: deny unknown origins\r\n return false;\r\n}\r\n\r\n/**\r\n * Create a MessageChannel port pair for secure bi-directional communication.\r\n * Avoids broadcasting via postMessage('*').\r\n */\r\nexport function createSecureChannel(): {\r\n port: MessagePort;\r\n remotePort: MessagePort;\r\n} {\r\n const channel = new MessageChannel();\r\n return {\r\n port: channel.port1,\r\n remotePort: channel.port2,\r\n };\r\n}\r\n","// @agent-native/pinpoint — Browser entry point (includes SolidJS UI)\r\n// MIT License\r\n\r\n// Re-export everything from main entry\r\nexport * from \"./index.js\";\r\n\r\n// UI-specific exports\r\nexport { mountPinpoint, unmountPinpoint } from \"./ui/mount.js\";\r\nexport { PinMarkerManager } from \"./ui/components/PinMarker.js\";\r\n\r\n// Auto-register framework adapters\r\nimport { registerAdapter } from \"./frameworks/adapter.js\";\r\nimport { reactAdapter } from \"./frameworks/react-adapter.js\";\r\nimport { vueAdapter } from \"./frameworks/vue-adapter.js\";\r\n\r\nregisterAdapter(reactAdapter);\r\nregisterAdapter(vueAdapter);\r\n"],"mappings":"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","names":["frozen"]}
|