pk-annotator 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Paul B. Kim
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.ko.md ADDED
@@ -0,0 +1,92 @@
1
+ # pk-annotator
2
+
3
+ 실행 중인 앱에서 바꿀 곳을 가리키고 원하는 변경을 적으면, 코딩 에이전트가 그 요청을 근거와 함께 받습니다. 근거에는 소스 파일과 줄 번호, 선택자, 스크린샷, 콘솔, 네트워크, 녹화, 성능 정보가 들어갑니다.
4
+
5
+ [웹사이트](https://pk-annotator.paulbkim.dev/ko/) · [English](README.md) · MIT
6
+
7
+ pk-annotator는 Vite와 React 앱을 위한 개발 전용 오버레이입니다. 개발 빌드를 검토하는 사람은 누구나 요소를 선택하거나, 그리거나, 스크린샷을 찍거나, 녹화한 뒤 요청을 적어 보낼 수 있습니다. 주석은 로컬 파일 저장소에 저장되고, Claude Code, Codex, Pi가 함께 들어 있는 `pka-mcp` 서버로 읽습니다. 에이전트의 답변은 페이지에 표시됩니다. 프로덕션 빌드에는 아무것도 포함되지 않습니다. 오버레이가 닫혀 있는 동안에도 페이지는 크기가 제한된 콘솔, 오류, 네트워크 수집을 유지하고, 이 탭에서 주석을 보낸 뒤에는 그 상태와 답변을 따라갑니다. 오버레이 UI와 성능 관찰자는 사용할 때 불러옵니다.
8
+
9
+ ## 설치
10
+
11
+ Node 24 이상, Vite 8, React 19가 필요합니다.
12
+
13
+ **에이전트에게 맡기기.** 프로젝트 루트에서 Claude Code, Codex, Pi에 다음을 붙여 넣으세요.
14
+
15
+ ```text
16
+ https://pk-annotator.paulbkim.dev/agents.md 를 따라 이 프로젝트에 pk-annotator를 설정해 줘
17
+ ```
18
+
19
+ **설치 스크립트 실행.** 프로젝트 루트에서 실행하면 사용 중인 패키지 매니저로 개발 의존성을 추가하고, `claude`가 설치되어 있으면 Claude Code에 `pka-mcp`를 등록합니다.
20
+
21
+ ```sh
22
+ curl -fsSL https://pk-annotator.paulbkim.dev/install.sh | sh
23
+ ```
24
+
25
+ 그다음 아래처럼 플러그인을 추가하고 오버레이를 마운트하세요. 직접 설치하려면 워크스페이스 루트에서 `pnpm add -D pk-annotator`(또는 npm, Yarn, Bun의 같은 명령)를 실행합니다.
26
+
27
+ ## 설정
28
+
29
+ ```ts
30
+ // vite.config.ts
31
+ import { annotator } from "pk-annotator/vite";
32
+
33
+ export default defineConfig({
34
+ plugins: [...annotator()],
35
+ });
36
+ ```
37
+
38
+ ```tsx
39
+ // 클라이언트 진입점, React 렌더링 전
40
+ let rootOptions = {};
41
+ if (import.meta.env.DEV) {
42
+ try {
43
+ const { mount } = await import("pk-annotator/overlay");
44
+ rootOptions = mount({ hot: import.meta.hot!, theme: "system" }).reactRootOptions;
45
+ } catch (cause) {
46
+ console.error("pk-annotator did not load; the page runs without it", cause);
47
+ }
48
+ }
49
+ createRoot(document.getElementById("root")!, rootOptions).render(<App />);
50
+ // 또는: hydrateRoot(document, <App />, rootOptions);
51
+ ```
52
+
53
+ 개발 서버를 시작하고 런처 버튼이나 Alt+Shift+A로 오버레이를 엽니다. 페이지에 Content-Security-Policy가 있다면 스크린샷을 위해 `img-src data: blob:`을 허용하세요.
54
+
55
+ ## 에이전트 연결
56
+
57
+ 오버레이 메뉴에서 **에이전트에 연결하기**를 고르세요. 이 페이지에 맞는 `pka-mcp` 명령이 담긴 요청이 복사되니, 에이전트 세션에 붙여 넣으면 됩니다. 프로젝트 루트에서 직접 등록하려면 다음을 실행합니다.
58
+
59
+ ```sh
60
+ claude mcp add pka --scope project -- node_modules/.bin/pka-mcp # Claude Code, .mcp.json
61
+ codex mcp add pka -- "$PWD/node_modules/.bin/pka-mcp" --root "$PWD" # Codex, 전역 설정
62
+ ```
63
+
64
+ Codex는 서버를 전역 설정에 저장하므로 이 항목은 한 프로젝트만 가리킵니다. `~/.codex/config.toml`의 `[mcp_servers.pka]`에 `tool_timeout_sec = 1830`도 설정하세요. 기본값 300초에서는 긴 `wait_for_annotation`이 중간에 끊깁니다. Pi는 `.pi/mcp.json`에 `{ "mcpServers": { "pka": { "command": "node_modules/.bin/pka-mcp", "exposure": "direct" } } }`를 추가합니다.
65
+
66
+ 에이전트는 `wait_for_annotation`으로 기다리고, 보낸 주석을 `set_status`로 맡고, `reply`로 답하고, `get_errors`로 페이지 오류를 읽습니다. 연결되어 있는 동안 오버레이는 Claude나 Codex의 모습으로 바뀝니다.
67
+
68
+ ## 사용
69
+
70
+ | 그룹 | 도구 |
71
+ | --------- | ------------------------------------------- |
72
+ | 요소 선택 | 선택(Shift로 여러 개), 영역 선택, 올가미 |
73
+ | 캡처 | 스크린샷과 자르기, 영역 녹화(GIF 또는 WebM) |
74
+ | 그리기 | 자유 그리기, 사각형, 원 |
75
+ | 디버그 | 콘솔, 네트워크, 성능 |
76
+ | 설정 | 기록, English/한국어, 종료 |
77
+
78
+ 요소 선택과 캡처 도구는 요청 편집기를 열고, 그리기를 마치면 스크린샷 주석으로 쌓여 함께 보낼 수 있습니다. 바로 보내거나, 주석을 저장해 두었다가 한 번에 보낼 수 있습니다. 본문의 요소와 캡처 배지는 에이전트에게 `[element n]`, `[attachment n: label]` 참조로 전달됩니다. 연결된 에이전트가 없으면 보내기는 주석을 마크다운으로도 복사합니다.
79
+
80
+ ## CLI
81
+
82
+ ```text
83
+ pka list | get <id> | watch --once | status <id> <state> | reply <id> <text> | errors | prune | lab
84
+ ```
85
+
86
+ 모든 명령은 `--json`과 `--root DIR`를 받습니다. 옵션은 `pka --help`로 확인하세요. `pka lab`은 녹화를 프로덕션 빌드에 다시 재생해 성능 판정을 기록하며 Playwright가 필요합니다.
87
+
88
+ ## 더 보기
89
+
90
+ - [Reference](docs/REFERENCE.md): 플러그인 옵션, 테마, 저장소 위치, 작업 맡기(claim), CLI 상세 (영문)
91
+ - [Design](docs/DESIGN.md): 동작, 리소스 예산, 보안 계약 (영문)
92
+ - [Developing](docs/DEVELOPING.md): pk-annotator 자체 개발 (영문)
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # pk-annotator
2
+
3
+ Point at your running app, say what should change, and your coding agent gets the request with the evidence: source file and line, selector, screenshot, console, network, recording, and performance.
4
+
5
+ [Website](https://pk-annotator.paulbkim.dev) · [한국어](README.ko.md) · MIT
6
+
7
+ pk-annotator is a dev-only overlay for Vite and React apps. Anyone reviewing the dev build can pick elements, draw, screenshot, or record, then write a prompt and press Send. The annotation lands in a local file store that Claude Code, Codex, or Pi read through the bundled `pka-mcp` server, and the agent's replies appear on the page. Nothing ships in a production build. While the overlay is closed, the page keeps bounded console, error, and network capture and, after this tab sends an annotation, follows its status and replies; the overlay UI and performance observers load when you use them.
8
+
9
+ ## Install
10
+
11
+ Requires Node 24+, Vite 8, and React 19.
12
+
13
+ **Ask your agent.** Paste this into Claude Code, Codex, or Pi from the project root:
14
+
15
+ ```text
16
+ Set up pk-annotator in this project by following https://pk-annotator.paulbkim.dev/agents.md
17
+ ```
18
+
19
+ **Or run the installer** from the project root. It adds the dev dependency with your package manager and registers `pka-mcp` with Claude Code when `claude` is installed:
20
+
21
+ ```sh
22
+ curl -fsSL https://pk-annotator.paulbkim.dev/install.sh | sh
23
+ ```
24
+
25
+ Then add the plugin and mount the overlay as below. To install by hand instead, run `pnpm add -D pk-annotator` (or the npm, Yarn, or Bun equivalent) in the workspace root.
26
+
27
+ ## Set up
28
+
29
+ ```ts
30
+ // vite.config.ts
31
+ import { annotator } from "pk-annotator/vite";
32
+
33
+ export default defineConfig({
34
+ plugins: [...annotator()],
35
+ });
36
+ ```
37
+
38
+ ```tsx
39
+ // client entry, before React renders
40
+ let rootOptions = {};
41
+ if (import.meta.env.DEV) {
42
+ try {
43
+ const { mount } = await import("pk-annotator/overlay");
44
+ rootOptions = mount({ hot: import.meta.hot!, theme: "system" }).reactRootOptions;
45
+ } catch (cause) {
46
+ console.error("pk-annotator did not load; the page runs without it", cause);
47
+ }
48
+ }
49
+ createRoot(document.getElementById("root")!, rootOptions).render(<App />);
50
+ // or: hydrateRoot(document, <App />, rootOptions);
51
+ ```
52
+
53
+ Start the dev server and open the overlay with the launcher button or Alt+Shift+A. If the page sets a Content-Security-Policy, allow `img-src data: blob:` for screenshots.
54
+
55
+ ## Connect an agent
56
+
57
+ Choose **Connect agent** in the overlay's menu. It copies a prompt with the exact `pka-mcp` command for this page; paste it into your agent session. To register by hand from the project root:
58
+
59
+ ```sh
60
+ claude mcp add pka --scope project -- node_modules/.bin/pka-mcp # Claude Code, .mcp.json
61
+ codex mcp add pka -- "$PWD/node_modules/.bin/pka-mcp" --root "$PWD" # Codex, global
62
+ ```
63
+
64
+ Codex keeps servers in its global config, so that entry points at one project. Also set `tool_timeout_sec = 1830` under `[mcp_servers.pka]` in `~/.codex/config.toml`, so a long `wait_for_annotation` is not cut off at the 300-second default. For Pi, add `{ "mcpServers": { "pka": { "command": "node_modules/.bin/pka-mcp", "exposure": "direct" } } }` to `.pi/mcp.json`.
65
+
66
+ The agent calls `wait_for_annotation`, claims what you send with `set_status`, answers with `reply`, and reads page errors with `get_errors`. While it is connected, the overlay takes on Claude's or Codex's look.
67
+
68
+ ## Use
69
+
70
+ | Group | Tools |
71
+ | -------- | --------------------------------------------------- |
72
+ | Pick | Select (Shift for several), Box, Lasso |
73
+ | Capture | Screenshot with crop, area recording as GIF or WebM |
74
+ | Annotate | Freehand, Rectangle, Circle |
75
+ | Debug | Console, Network, Performance |
76
+ | Settings | History, English/한국어, Exit |
77
+
78
+ Pick and Capture tools open the prompt editor; a finished drawing becomes a screenshot mark stacked for Send. Send at once, or Save marks and send them together. Element and capture badges in the text become `[element n]` and `[attachment n: label]` references for the agent. Without a connected agent, Send also copies the annotation as Markdown.
79
+
80
+ ## CLI
81
+
82
+ ```text
83
+ pka list | get <id> | watch --once | status <id> <state> | reply <id> <text> | errors | prune | lab
84
+ ```
85
+
86
+ Every command takes `--json` and `--root DIR`; run `pka --help` for options. `pka lab` replays a recording against a production build and writes a performance verdict (needs Playwright).
87
+
88
+ ## More
89
+
90
+ - [Reference](docs/REFERENCE.md): plugin options, theming, store location, claims, and the CLI in detail.
91
+ - [Design](docs/DESIGN.md): the behavior, resource budget, and security contract.
92
+ - [Developing](docs/DEVELOPING.md): working on pk-annotator itself.
@@ -0,0 +1,172 @@
1
+ import { HydrationOptions } from "react-dom/client";
2
+ //#region node_modules/.pnpm/vite@8.3.2_@types+node@24.19.1_jiti@2.7.0_yaml@2.9.1/node_modules/vite/types/hmrPayload.d.ts
3
+ interface UpdatePayload {
4
+ type: 'update';
5
+ updates: Update[];
6
+ }
7
+ interface Update {
8
+ type: 'js-update' | 'css-update';
9
+ /** Module URL of the HMR boundary */
10
+ path: string;
11
+ /** Module URL of the accepted module */
12
+ acceptedPath: string;
13
+ timestamp: number;
14
+ /** @internal */
15
+ explicitImportRequired?: boolean;
16
+ /** @internal */
17
+ isWithinCircularImport?: boolean;
18
+ /** @internal */
19
+ firstInvalidatedBy?: string;
20
+ /** @internal */
21
+ invalidates?: string[];
22
+ }
23
+ interface PrunePayload {
24
+ type: 'prune';
25
+ paths: string[];
26
+ }
27
+ interface FullReloadPayload {
28
+ type: 'full-reload';
29
+ path?: string;
30
+ /** @internal */
31
+ triggeredBy?: string;
32
+ /**
33
+ * When set, only the bundling-fallback page acts on the reload;
34
+ * other pages ignore the message.
35
+ * @internal
36
+ */
37
+ ifFallback?: boolean;
38
+ }
39
+ interface ErrorPayload {
40
+ type: 'error';
41
+ err: {
42
+ [name: string]: any;
43
+ message: string;
44
+ stack: string;
45
+ id?: string;
46
+ frame?: string;
47
+ plugin?: string;
48
+ pluginCode?: string;
49
+ loc?: {
50
+ file?: string;
51
+ line: number;
52
+ column: number;
53
+ };
54
+ };
55
+ }
56
+ //#endregion
57
+ //#region node_modules/.pnpm/vite@8.3.2_@types+node@24.19.1_jiti@2.7.0_yaml@2.9.1/node_modules/vite/types/customEvent.d.ts
58
+ interface CustomEventMap {
59
+ // client events
60
+ 'vite:beforeUpdate': UpdatePayload;
61
+ 'vite:afterUpdate': UpdatePayload;
62
+ 'vite:beforePrune': PrunePayload;
63
+ 'vite:beforeFullReload': FullReloadPayload;
64
+ 'vite:error': ErrorPayload;
65
+ 'vite:invalidate': InvalidatePayload;
66
+ 'vite:ws:connect': WebSocketConnectionPayload;
67
+ 'vite:ws:disconnect': WebSocketConnectionPayload;
68
+ /** @internal */
69
+ 'vite:forward-console': ForwardConsolePayload;
70
+ /** @internal */
71
+ 'vite:client-connected': {
72
+ clientId: string;
73
+ };
74
+ /** @internal */
75
+ 'vite:bundled-dev:reload-needed': {
76
+ reason: string;
77
+ };
78
+ // server events
79
+ 'vite:client:connect': undefined;
80
+ 'vite:client:disconnect': undefined;
81
+ }
82
+ interface WebSocketConnectionPayload {
83
+ /**
84
+ * @experimental
85
+ * We expose this instance experimentally to see potential usage.
86
+ * This might be removed in the future if we didn't find reasonable use cases.
87
+ * If you find this useful, please open an issue with details so we can discuss and make it stable API.
88
+ */
89
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
90
+ webSocket: WebSocket;
91
+ }
92
+ interface InvalidatePayload {
93
+ /** Module URL of the invalidated module */
94
+ path: string;
95
+ message: string | undefined;
96
+ /** Module URL of the first module that invalidated the update */
97
+ firstInvalidatedBy: string;
98
+ }
99
+ type ForwardConsolePayload = {
100
+ type: 'error';
101
+ data: {
102
+ name: string;
103
+ message: string;
104
+ stack?: string;
105
+ };
106
+ } | {
107
+ type: 'unhandled-rejection';
108
+ data: {
109
+ name: string;
110
+ message: string;
111
+ stack?: string;
112
+ };
113
+ } | {
114
+ type: 'log';
115
+ data: {
116
+ level: string;
117
+ message: string;
118
+ };
119
+ };
120
+ /**
121
+ * provides types for payloads of built-in Vite events
122
+ */
123
+ type InferCustomEventPayload<T extends string> = T extends keyof CustomEventMap ? CustomEventMap[T] : any;
124
+ /**
125
+ * provides types for names of built-in Vite events
126
+ */
127
+ type CustomEventName = keyof CustomEventMap | (string & {});
128
+ //#endregion
129
+ //#region node_modules/.pnpm/vite@8.3.2_@types+node@24.19.1_jiti@2.7.0_yaml@2.9.1/node_modules/vite/types/hot.d.ts
130
+ type ModuleNamespace = Record<string, any> & {
131
+ [Symbol.toStringTag]: 'Module';
132
+ };
133
+ interface ViteHotContext {
134
+ readonly data: any;
135
+ accept(): void;
136
+ accept(cb: (mod: ModuleNamespace | undefined) => void): void;
137
+ accept(dep: string, cb: (mod: ModuleNamespace | undefined) => void): void;
138
+ accept(deps: readonly string[], cb: (mods: Array<ModuleNamespace | undefined>) => void): void;
139
+ acceptExports(exportNames: string | readonly string[], cb?: (mod: ModuleNamespace | undefined) => void): void;
140
+ dispose(cb: (data: any) => void): void;
141
+ prune(cb: (data: any) => void): void;
142
+ invalidate(message?: string): void;
143
+ on<T extends CustomEventName>(event: T, cb: (payload: InferCustomEventPayload<T>) => void): void;
144
+ off<T extends CustomEventName>(event: T, cb: (payload: InferCustomEventPayload<T>) => void): void;
145
+ send<T extends CustomEventName>(event: T, data?: InferCustomEventPayload<T>): void;
146
+ }
147
+ //#endregion
148
+ //#region src/overlay/launcher.d.ts
149
+ type Theme = "light" | "dark";
150
+ type ThemeSetting = Theme | "system";
151
+ //#endregion
152
+ //#region src/overlay/index.d.ts
153
+ declare global {
154
+ var __PKA_BODIES__: string[] | undefined;
155
+ }
156
+ export type MountOptions = {
157
+ hot: ViteHotContext;
158
+ theme?: ThemeSetting;
159
+ };
160
+ export type Mounted = {
161
+ reactRootOptions: Pick<HydrationOptions, "onCaughtError" | "onUncaughtError" | "onRecoverableError">;
162
+ /** Switches the launcher and the open UI to a theme; "system" follows prefers-color-scheme. */
163
+ setTheme(theme: ThemeSetting): void;
164
+ unmount(): void;
165
+ };
166
+ /**
167
+ * Starts capture and mounts the launcher in its own shadow root. The UI chunk and its
168
+ * stylesheet load on first open. Under automation (navigator.webdriver) nothing mounts.
169
+ * After Exit, nothing but one keydown listener runs in this tab until Alt+Shift+A.
170
+ */
171
+ export declare function mount(options: MountOptions): Mounted;
172
+ //#endregion
@@ -0,0 +1,176 @@
1
+ import{captureOwnerStack as e}from"react";const t=/((?:[a-z][a-z\d+.-]*:\/\/|\/)[^\s()]*?):(\d+):\d+\)?\s*$/i,n=/^\s*at (?:async )?(.+?) \(/,r=/^([^@\s]*)@/,i=/\/node_modules\/|\/\.vite\/deps\/|\/@vite\/|\/@react-refresh/,a=/\/pka-overlay-[^/]+\.m?js$/,o=c(import.meta.url);function s(e){let i=[];for(let a of e.split(`
2
+ `)){let e=t.exec(a);if(e===null)continue;let o=(n.exec(a)??r.exec(a))?.[1];i.push({fn:o===void 0||o===``?void 0:o,path:c(e[1]??``),line:Number(e[2])})}return i}function c(e){return e.replace(/^[a-z][a-z\d+.-]*:\/\/[^/]*/i,``).replace(/[?#].*$/,``)}function l(e){return e.slice(0,500).replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,`<uuid>`).replace(/\b(?:0x[0-9a-f]+|(?=[0-9a-f]*\d)[0-9a-f]{8,})\b/gi,`<hex>`).replace(/\d+(?:\.\d+)?/g,`<n>`)}function u(e,t,n){let r=s(n).filter(e=>e.path!==``&&!i.test(e.path)),a=r[0];return{fingerprint:p([e,l(t),...r.slice(0,3).map(e=>`${e.path}:${e.fn??e.line}`)].join(`|`)),topFrame:a&&`${a.path}:${a.line}`}}function d(e){let t=!1;for(let n of s(e))if(a.test(n.path))t=!0;else if(n.path!==o&&!i.test(n.path))return!1;return t}function f(e,t){return p(`resource|${e}|${c(t)}`)}function p(e){let t=3735928559,n=1103547991;for(let r=0;r<e.length;r+=1){let i=e.charCodeAt(r);t=Math.imul(t^i,2654435761),n=Math.imul(n^i,1597334677)}return t=Math.imul(t^t>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507)^Math.imul(t^t>>>13,3266489909),(4294967296*(2097151&n)+(t>>>0)).toString(16).padStart(14,`0`)}const m=globalThis.PerformanceObserver,h=/* @__PURE__ */ new Set,g=/* @__PURE__ */ new Set,_=/* @__PURE__ */ new WeakSet,v=/* @__PURE__ */ new WeakMap;let y=!1,b=[];function x(e){return{getEntries:()=>e,getEntriesByType:t=>e.filter(e=>e.entryType===t),getEntriesByName:(t,n)=>e.filter(e=>e.name===t&&(n===void 0||e.entryType===n))}}var S=class extends m{#e;constructor(e){let t=/* @__PURE__ */ new WeakSet;super((n,r)=>{if(!_.has(r)){e(n,r);return}let i=n.getEntries().filter(e=>!t.has(e));for(let e of i)t.add(e);i.length>0&&e(x(i),r)}),this.#e=t,b.length===0&&queueMicrotask(()=>{b=[]}),b.push(this)}observe(e={}){if((e.entryTypes??(e.type===void 0?[]:[e.type])).some(e=>e!==`resource`)&&_.add(this),v.set(this,[...v.get(this)??[],e]),y&&_.has(this)){g.add(this);return}h.add(this),super.observe(e)}takeRecords(){let e=super.takeRecords();if(!_.has(this))return e;let t=e.filter(e=>!this.#e.has(e));for(let e of t)this.#e.add(e);return t}disconnect(){h.delete(this),g.delete(this),super.disconnect()}};function C(){for(let e of b)_.add(e)}function w(){y=!0;for(let e of h)_.has(e)&&(m.prototype.disconnect.call(e),h.delete(e),g.add(e))}function T(){y=!1;for(let e of g){for(let t of v.get(e)??[])m.prototype.observe.call(e,t);h.add(e)}g.clear()}const E=2e3,D=Symbol(`no fit`);function O(e){return structuredClone(e)}function k(e,t=E){return O(e.length<=t?e:`${e.slice(0,t)}…[+${e.length-t} chars]`)}function A(e){let t=L(e,e.length,50,0,{ancestors:[],nodes:0,used:0,reserved:0},`[`,`]`,`args`);if(t===D)throw Error(`The console budget cannot hold an empty argument list`);return t}function j(e){return 8e3-e.used-e.reserved}function M(e,t,n){return t>j(e)?D:(e.used+=t,n)}function N(e,t){let n=e.charCodeAt(t);if(n===34||n===92)return[2,1];if(n<32)return[n===8||n===9||n===10||n===12||n===13?2:6,1];if(n<55296||n>57343)return[1,1];let r=e.charCodeAt(t+1);return n<=56319&&r>=56320&&r<=57343?[2,2]:[6,1]}function P(e,t){let n=j(e),r=Math.min(t.length,E),i=10+String(t.length).length,a=2,o=0,s=-1,c=0;for(;a+i<=n&&(s=o,c=a),!(o>=r||a>n);){let[e,n]=N(t,o);a+=e,o+=n}if(o>=t.length&&a<=n)return e.used+=a,O(t);if(s<0)return D;let l=`…[+${t.length-s} chars]`;return e.used+=c+l.length,O(`${t.slice(0,s)}${l}`)}function F(e){return k(A(e).map(e=>Object.prototype.toString.call(e)===`[object String]`?String(e):JSON.stringify(e)).join(` `))}function ee(e){let t=`${e.name}: ${e.message}`,n=e.stack??``;return k(n===``?t:n.startsWith(t)?n:`${t}\n${n}`)}function I(e,t,n){if(n.nodes>=1e3)return D;if(n.nodes+=1,e===null)return M(n,4,null);let r;try{r=Object.prototype.toString.call(e)}catch(e){return P(n,`[Unserializable: ${String(e)}]`)}switch(r){case`[object Undefined]`:return P(n,`[undefined]`);case`[object String]`:return P(n,String(e));case`[object Number]`:{let t=Number(e);return Number.isFinite(t)?M(n,String(t).length,t):P(n,`[${t}]`)}case`[object Boolean]`:{let t=String(e)===`true`;return M(n,t?4:5,t)}case`[object BigInt]`:return P(n,`${String(e)}n`);case`[object Symbol]`:return P(n,String(e))}return e instanceof Function?P(n,`[Function ${e.name||`(anonymous)`}]`):te(e,t,n)}function te(e,t,n){let r=re(e);if(r!==void 0)return P(n,r);if(n.ancestors.includes(e))return P(n,`[Circular]`);if(t>=3)return P(n,R(e));let{used:i,reserved:a}=n;n.ancestors.push(e);try{if(Array.isArray(e))return L(e,e.length,50,t+1,n,`[`,`]`,`items`);if(e instanceof Map||e instanceof Set){let r=e instanceof Map?`[Map]`:`[Set]`,i=[],a=e.entries();for(let t=a.next();!t.done&&i.length<50;t=a.next())i.push(e instanceof Map?t.value:t.value[0]);let o=L(i,e.size,50,t+1,n,`{"${r}":[`,`]}`,`items`);return o===D?D:{[r]:o}}return ne(e,t,n)}catch(e){return n.used=i,n.reserved=a,P(n,`[Unserializable: ${String(e)}]`)}finally{n.ancestors.pop()}}function L(e,t,n,r,i,a,o,s){if(a.length+o.length+40>j(i))return D;i.used+=a.length,i.reserved+=o.length+40;let c=[],l=Math.min(e.length,n);for(;c.length<l;){let t=c.length===0?0:1;if(t>j(i))break;i.used+=t;let n=I(e[c.length],r,i);if(n===D){i.used-=t;break}c.push(n)}if(i.reserved-=o.length+40,i.used+=o.length,t>c.length){let e=`[+${t-c.length} ${s}]`;i.used+=(c.length===0?0:1)+e.length+2,c.push(e)}return c}function ne(e,t,n){if(42>j(n))return D;let r=Object(e),i=Object.keys(r);n.used+=1,n.reserved+=41;let a={},o=0;for(let e of i){if(o===50)break;let i=n.used,s=o===0?1:2;if(s>j(n))break;n.used+=s,n.reserved+=24;let c=P(n,e);n.reserved-=24;let l=D;if(c!==D){let i=Object.getOwnPropertyDescriptor(r,e);l=i===void 0||!(`value`in i)?P(n,`[Getter]`):I(i.value,t+1,n)}if(c===D||l===D){n.used=i;break}a[c]=l,o+=1}if(n.reserved-=41,n.used+=1,i.length>o){let e=`[+${i.length-o} keys]`;n.used+=(o===0?0:1)+4+e.length+2,a[`…`]=e}return a}function re(e){if(e instanceof Error)return ee(e);if(e instanceof Date)return Number.isNaN(e.getTime())?`[Invalid Date]`:e.toISOString();if(e instanceof RegExp)return String(e);if(globalThis.Node!==void 0&&e instanceof Node)return z(e);if(globalThis.window!==void 0&&e===globalThis.window)return`[Window]`;if(e instanceof Promise)return`[Promise]`;if(e instanceof WeakMap)return`[WeakMap]`;if(e instanceof WeakSet)return`[WeakSet]`;if(e instanceof ArrayBuffer)return`[ArrayBuffer(${e.byteLength})]`;if(ArrayBuffer.isView(e))return`[${e.constructor.name}(${e.byteLength} bytes)]`}function R(e){return Array.isArray(e)?`[Array(${e.length})]`:e instanceof Map?`[Map(${e.size})]`:e instanceof Set?`[Set(${e.size})]`:`[Object]`}function z(e){if(e instanceof Element){let t=e.id===``?``:`#${e.id}`,n=[...e.classList].slice(0,3).map(e=>`.${e}`).join(``);return`[Element ${e.localName}${t}${n}]`}return e instanceof Text?`[Text ${JSON.stringify(k(e.data,40))}]`:`[${e.nodeName}]`}const ie=8388608,ae=2e3,B=1e3,V=/auth|cookie|token|secret|session|api-?key|csrf|xsrf|passw/i,oe=/token|code|state|passw|secret|key|session|auth|credential/i,H=/token|secret|passw(?:or)?d|session|cookie|authorization|api[-_ ]?key|credential/i,U=/^\s*(?:text\/(?!event-stream)|application\/(?:[\w.-]+\+)?json\b)/i,W=/^\s*text\/event-stream/i,G=/^\s*application\/(?!stream\+)(?:[\w.-]+\+)?json\s*(?:;|$)/i;let K;const se=/* @__PURE__ */ new WeakSet;let q=!1;function ce(e){let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function le(e){return e===void 0?{}:new Proxy(e,{get:ue})}function ue(e,t){return e[t]}function de(e,t){if(e===void 0)return{headers:t};if(ce(e))return{...e,headers:t};if(Object.getOwnPropertyDescriptor(e,`headers`)?.configurable!==!1)return new Proxy(e,{get:(e,n)=>n===`headers`?t:ue(e,n)})}function fe(e,t,n){let r=le(n);se.add(r);let i=q;q=!0;try{return e(t,r)}finally{q=i}}function J(e){let t;try{t=new URL(e,location.href)}catch{return`[invalid url]`}if(t.username=``,t.password=``,pe(t.searchParams)&&(t.search=t.searchParams.toString()),t.hash.includes(`=`)){let e=new URLSearchParams(t.hash.slice(1));pe(e)&&(t.hash=e.toString())}return k(t.href,ae)}function pe(e){let t=!1;for(let n of new Set(e.keys()))oe.test(n)&&(e.set(n,`REDACTED`),t=!0);return t}function me(e){let t={},n=0;for(let[r,i]of e)if(!V.test(r)){if(n===50)break;t[r]=i.length>B?`${i.slice(0,B)}…`:i,n+=1}return t}function he(e){if(!/^\s*[[{]/.test(e))return e;let t=!1,n;try{n=JSON.parse(e,(e,n)=>H.test(e)?(t=!0,`[redacted]`):n)}catch{return e}return t?JSON.stringify(n):e}function Y(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e.charCodeAt(n);r<128?t+=1:r<2048?t+=2:r>=55296&&r<=56319?(t+=4,n+=1):t+=3}return t}function ge(){let e=crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(24)),t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`00-${t.slice(0,32)}-${t.slice(32)}-01`}function _e(e){let t=e.get(`content-length`);if(t!==null&&/^\d+$/.test(t.trim()))return Number(t)}function ve(e){if(e==null)return{};if(e instanceof URLSearchParams)return{size:Y(e.toString())};if(e instanceof Blob)return{size:e.size};if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return{size:e.byteLength};if(e instanceof FormData||e instanceof ReadableStream||e instanceof Document)return{};let t=String(e);return{size:Y(t),text:t}}function ye(e){let t=[],n=[],r=new S(e=>a(e.getEntries()));r.observe({type:`resource`});let i=0;function a(e){for(let t of e)!(t instanceof PerformanceResourceTiming)||t.initiatorType!==`fetch`&&t.initiatorType!==`xmlhttprequest`||(n.push({name:J(t.name),timing:t}),n.length>500&&n.shift())}function o(n,r,a,o,s){let c=performance.now(),l=new URL(a,location.href),u=l.origin===location.origin,d={kind:`request`,seq:e.nextSeq(),at:(/* @__PURE__ */ new Date()).toISOString(),performanceMs:c,initiator:n,method:r.toUpperCase(),url:J(l.href),state:`pending`,stream:!1,serverFn:o.has(`x-tsr-serverfn`)||l.pathname.includes(`/_serverFn/`),requestHeaders:{},responseHeaders:{}};s&&u&&!o.has(`traceparent`)&&(d.traceparent=ge(),o.set(`traceparent`,d.traceparent)),d.requestHeaders=me(o);let f={entry:d,start:c,bodyAllowed:u&&e.bodies.some(e=>l.pathname.startsWith(e)),bodyBytes:0,timingUntil:void 0,timed:!1};return t.push(f),t.length>500&&(i-=t.shift()?.bodyBytes??0),e.added(d),e.changed(),f}function s(e,t,n){let{size:r,text:i}=ve(t);r!==void 0&&(e.entry.requestSize=r);let a=n??(i===void 0?``:`text/plain`);e.bodyAllowed&&i!==void 0&&U.test(a)&&c(e,`requestBody`,he(i))}function c(e,n,r){let a=Y(r);if(!(a>65536)){if(!t.includes(e)){e.entry[n]=r;return}for(let n of t){if(i+a<=8388608)break;n!==e&&n.bodyBytes!==0&&(delete n.entry.requestBody,delete n.entry.responseBody,i-=n.bodyBytes,n.bodyBytes=0)}i+a>8388608||(e.entry[n]=r,e.bodyBytes+=a,i+=a)}}function l(e,t,n,r){let{entry:i}=e;i.status=t,i.responseType=r,i.responseHeaders=me(n);let a=n.get(`content-type`);a!==null&&(i.contentType=a);let o=_e(n);o!==void 0&&(i.responseSize=o),a!==null&&W.test(a)&&(i.stream=!0,i.state=`open`,e.timingUntil=1/0)}function u(t,n,r){let i=performance.now();t.entry.state=n,t.entry.durationMs=Math.round(i-t.start),r!==void 0&&(t.entry.error=r),t.timingUntil=i+1e4,e.settled(t.entry),e.changed()}function d(e,t){u(e,t instanceof DOMException&&t.name===`AbortError`?`aborted`:`failed`,String(t))}function f(t,n){if(l(t,n.status,n.headers,n.type),t.entry.stream){e.changed();return}let r=t.entry.contentType??``,i=t.entry.responseSize,a=t.bodyAllowed&&n.body!==null&&U.test(r)&&(i===void 0?G.test(r):i<=65536)?n.clone().body:null;if(a===null){u(t,`done`);return}e.changed(),p(a).then(e=>{e!==void 0&&(i===void 0&&(t.entry.responseSize=e.bytes),c(t,`responseBody`,he(e.text))),u(t,`done`)},e=>d(t,e))}async function p(t){let n=t.getReader(),r=new TextDecoder,i=``,a=0;for(;;){let t=await n.read();if(t.done)return{text:i+r.decode(),bytes:a};if(a+=t.value.byteLength,a>65536){n.cancel().catch(t=>e.fail(`response body cancel`,t));return}i+=r.decode(t.value,{stream:!0})}}let m=globalThis.fetch,h=!1,g=(t,n,r)=>{let i,a=n;try{let e=t instanceof Request,r=new Headers(n?.headers??(e?t.headers:void 0)),c=n?.method??(e?t.method:`GET`),l=de(n,r);i=o(`fetch`,c,e?t.url:String(t),r,l!==void 0),i.entry.traceparent!==void 0&&(a=l),s(i,n?.body,r.get(`content-type`))}catch(i){return e.fail(`fetch capture`,i),fe(r,t,n)}let c;try{c=fe(r,t,a)}catch(e){throw d(i,e),e}return c.then(t=>{try{f(i,t)}catch(t){e.fail(`fetch response capture`,t)}return t},e=>{throw d(i,e),e})},_=function(e,t){let n=q||t!==void 0&&se.has(t)?void 0:K;return n===void 0?m(e,t):n(e,t,m)};K=g,globalThis.fetch=_;let v=XMLHttpRequest.prototype,y=v.open,b=v.send,x=v.setRequestHeader,C=/* @__PURE__ */ new WeakMap,w=/* @__PURE__ */ new WeakMap,T=function(e,t,n,r,i){h||(w.get(this)?.(),C.set(this,{method:e,url:String(t),headers:new Headers})),y.call(this,e,t,n??!0,r??null,i??null)},E=function(t,n){if(x.call(this,t,n),!h)try{C.get(this)?.headers.append(t,n)}catch(t){e.fail(`XMLHttpRequest header capture`,t)}},D=function(t){let n=h?void 0:C.get(this),r;if(n!==void 0)try{r=O(this,n,t)}catch(t){e.fail(`XMLHttpRequest capture`,t)}try{b.call(this,t)}catch(e){throw r?.(e),e}};v.open=T,v.setRequestHeader=E,v.send=D;function O(t,n,r){let i=o(`xhr`,n.method,n.url,n.headers,!0);i.entry.traceparent!==void 0&&x.call(t,`traceparent`,i.entry.traceparent),s(i,r,n.headers.get(`content-type`));let a=new AbortController,c=()=>{t.readyState<XMLHttpRequest.HEADERS_RECEIVED||(t.removeEventListener(`readystatechange`,c),l(i,t.status,xe(t),t.responseType||`text`),e.changed())},u=()=>p(`abort`);function f(){a.abort(),w.get(t)===u&&w.delete(t)}function p(n){f();try{k(t,i,n)}catch(t){e.fail(`XMLHttpRequest response capture`,t)}}let m=e=>p(e.type);w.set(t,u),t.addEventListener(`readystatechange`,c,{signal:a.signal});for(let e of[`load`,`error`,`abort`,`timeout`])t.addEventListener(e,m,{signal:a.signal});return e=>{a.signal.aborted||(f(),d(i,e))}}function k(e,t,n){if(n===`abort`)return u(t,`aborted`);if(n!==`load`)return u(t,`failed`,n);t.entry.status===void 0&&l(t,e.status,xe(e),e.responseType||`text`);let r=t.entry.contentType??``;if(t.bodyAllowed&&U.test(r)&&(t.entry.responseSize??0)<=65536){let n=Se(e);n!==void 0&&n.length<=65536&&(t.entry.responseSize??=Y(n),c(t,`responseBody`,he(n)))}u(t,`done`)}function A(){if(a(r.takeRecords()),!t.some(e=>e.timingUntil!==void 0))return!1;let i=/* @__PURE__ */ new Map;for(let e of t){if(e.timed)continue;let t=i.get(e.entry.url);t===void 0?i.set(e.entry.url,[e]):t.push(e)}let o=!1,s=0;for(;s<n.length;){let e=n[s];if(e===void 0)throw Error(`No resource timing at index ${s}`);let{name:t,timing:r}=e,a=(i.get(t)??[]).filter(e=>!e.timed&&e.start<=r.startTime+1),c;for(let e of a){let t=Math.abs(r.startTime-e.start);(c===void 0||t<Math.abs(r.startTime-c.start))&&(c=e)}if(c!==void 0&&a.some(e=>e!==c&&Math.abs(e.start-c.start)<=1)){n.splice(s,1);continue}if(c?.timingUntil===void 0){s+=1;continue}n.splice(s,1),be(c,r),o=!0}let c=performance.now();for(let e of t)e.timingUntil===void 0||c<=e.timingUntil||(e.timingUntil=void 0,e.timed=!0);return o&&e.changed(),o}return{list:()=>t.map(e=>({...e.entry})),resolveTimings:A,untracked:(e,t)=>fe(m,e,t),restore(){h=!0,r.disconnect(),K===g&&(K=void 0),globalThis.fetch===_&&(globalThis.fetch=m),v.open===T&&(v.open=y),v.send===D&&(v.send=b),v.setRequestHeader===E&&(v.setRequestHeader=x)}}}function be(e,t){let{entry:n}=e;e.timingUntil=void 0,e.timed=!0,t.responseEnd>0&&(n.durationMs=Math.round(t.duration)),t.transferSize>0&&(n.transferSize=t.transferSize),n.responseSize===void 0&&t.decodedBodySize>0&&(n.responseSize=t.decodedBodySize),t.serverTiming.length>0&&(n.serverTiming=t.serverTiming.map(({name:e,duration:t,description:n})=>({name:e,duration:t,description:n}))),n.state===`open`&&(n.state=`done`)}function xe(e){let t=new Headers;for(let n of e.getAllResponseHeaders().split(/\r?\n/)){let e=n.indexOf(`:`);e>0&&t.append(n.slice(0,e).trim(),n.slice(e+1).trim())}return t}function Se(e){if(e.responseType===``||e.responseType===`text`)return e.responseText;if(e.responseType===`json`)return JSON.stringify(e.response)}const Ce=`pk-annotator`,X=16e3,we=[`log`,`info`,`warn`,`error`,`debug`],Te=[`click`,`input`,`change`,`submit`,`keydown`];function Ee(e,t){let n=e.stack??``;return t===void 0?{stack:n}:{stack:n,topFrame:t}}const De={console:[],errors:[],groups:[],requests:[],actions:[]};function Oe(){return{subscribe:()=>()=>{},snapshot:()=>De,clear:()=>{},markSent:()=>{},markResolved:()=>{},huntContext:e=>{throw Error(`No error group ${e}: capture is off under navigator.webdriver`)},applySymbolicated:()=>{},tap:()=>()=>{},fetch:globalThis.fetch.bind(globalThis),reactRootOptions:{},stop:()=>{}}}function ke(e,t){e.push(t),e.length>500&&e.shift()}function Ae(e,t){return e instanceof Error?{type:e.name,message:k(e.message),stack:k(e.stack??``,X)}:{type:t,message:F([e]),stack:``}}function je(e){let t=(e.stack??``).split(`
3
+ `),n=t.findIndex(e=>/:\d+:\d+\)?\s*$/.test(e));return k(t.slice(n+1).join(`
4
+ `),X)}function Me(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=``;for(;n.length<80&&t.nextNode()!==null;)n+=` ${(t.currentNode.nodeValue??``).slice(0,80)}`;let r=n.replace(/\s+/g,` `).trim().slice(0,40);return r===``?void 0:O(r)}function Ne(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement||e instanceof HTMLFormElement||e instanceof HTMLElement&&e.isContentEditable}function Pe(e){let t=e.getAttribute(`aria-labelledby`),n=e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement?e.labels:null,r=(e.getAttribute(`aria-label`)??n?.[0]?.textContent??(t===null?null:document.getElementById(t)?.textContent)??e.getAttribute(`name`)??e.getAttribute(`placeholder`))?.replace(/\s+/g,` `).trim().slice(0,40);return r===void 0||r===``?void 0:O(r)}function Fe(e){let t={tag:e.localName};e.id!==``&&(t.id=e.id);let n=e.getAttribute(`data-testid`);n!==null&&(t.testId=n);let r=e.getAttribute(`data-pka-src`);r!==null&&(t.src=r);let i=e.getAttribute(`role`);i!==null&&(t.role=i);let a=Ne(e)?Pe(e):Me(e);return a!==void 0&&(t[Ne(e)?`label`:`text`]=a),t}function Ie(e,t){return e.tag===t.tag&&e.id===t.id&&e.testId===t.testId&&e.src===t.src&&e.label===t.label}function Le(e){return e instanceof HTMLMediaElement?e.currentSrc||e.src:e instanceof HTMLLinkElement?e.href:e.getAttribute(`src`)??``}function Re(e){if(navigator.webdriver)return Oe();let t=0,n=0,r,i=!1,a=[],o=[],s=[],c=/* @__PURE__ */ new Map,l=/* @__PURE__ */ new WeakSet,p={console:0,network:0,errors:0},m=/* @__PURE__ */ new Set,h=/* @__PURE__ */ new Set,g=!1,_=/* @__PURE__ */ new Set,v,y=-1/0,b=[],x={log:console.log,info:console.info,warn:console.warn,error:console.error,debug:console.debug},S=x.error,C=()=>t+=1,w=()=>(/* @__PURE__ */ new Date()).toISOString();function T(e,t){S.call(console,`pk-annotator: ${e} failed`,t)}function E(e){for(let t of h)try{t(e)}catch(e){T(`recording tap`,e)}}function D(e,t){ke(e,t),E(t)}function O(){n+=1,!(m.size===0||g)&&(g=!0,queueMicrotask(()=>{g=!1;for(let e of m)e()}))}function j(){if(v!==void 0||_.size===0||i)return;let e=Math.max(0,y+1e3-performance.now());v=setTimeout(M,e)}function M(){v=void 0,y=performance.now();let t=[];for(let e of _){if(t.length===50)break;_.delete(e);let n=c.get(e);if(n===void 0)continue;let{stack:r,topFrame:i,...a}=n.group;t.push({...a,...n.raw})}if(t.length>0)try{e.send(`pka:errors`,{groups:t})}catch(e){T(`sending error groups`,e)}j()}function N(e){_.add(e),j()}function P(){let e;for(let t of c.values())(e===void 0||t.group.lastSeq<e.group.lastSeq)&&(e=t);e!==void 0&&c.delete(e.group.fingerprint)}function I(e,t){D(o,e);let n=c.get(e.fingerprint);if(n===void 0){c.size>=200&&P();let n=Ee(e,t),r={fingerprint:e.fingerprint,message:e.message,type:e.type,count:1,firstSeen:e.at,lastSeen:e.at,lastSeq:e.seq,status:`open`,...n};c.set(e.fingerprint,{group:r,raw:n,opened:e,latest:{entry:e,topFrame:t}})}else{let{group:r}=n;r.count+=1,r.lastSeen=e.at,r.lastSeq=e.seq,n.latest={entry:e,topFrame:t},r.status===`cleared`&&e.seq>p.errors&&te(n)}N(e.fingerprint),O()}function te(e){let{group:t}=e,{entry:n,topFrame:r}=e.latest;t.status=`open`,t.message=n.message,e.raw=Ee(n,r),t.stack=e.raw.stack,r===void 0?delete t.topFrame:t.topFrame=r,e.opened=n}function L(e,t,n){if(d(t.stack))return;let{fingerprint:r,topFrame:i}=u(t.type,t.message,t.stack),a={kind:`error`,seq:C(),at:w(),source:e,fingerprint:r,type:t.type,message:t.message,...n};t.stack!==``&&(a.stack=t.stack),I(a,i)}function ne(e,t,n){if(t instanceof Error){if(l.has(t))return;l.add(t)}L(e,Ae(t,n),{})}function re(e,t,n){if(D(a,{kind:`console`,seq:C(),at:w(),level:e,args:A(t)}),O(),n===void 0)return;let r=je(n);if(d(r))return;let i=t.find(e=>e instanceof Error);if(i!==void 0){if(l.has(i))return;l.add(i)}let o=F(t.map(e=>e instanceof Error?e.message:e));L(`console`,{type:i?.name??`ConsoleError`,message:o,stack:i===void 0?r:ee(i)},{})}let R=!1,z={...x};for(let e of we){let t=x[e];z[e]=function(...n){if(t.apply(console,n),!(R||i)){R=!0;try{re(e,n,e===`error`?/* @__PURE__ */ Error():void 0)}catch(e){T(`console capture`,e)}finally{R=!1}}},console[e]=z[e]}b.push(()=>{for(let e of we)console[e]===z[e]&&(console[e]=x[e])});function ie(e){if(e instanceof ErrorEvent){let t=e.error;if(t instanceof Error)return ne(`window`,t,`Error`);let n=e.filename===``?``:` at ${k(e.filename,ae)}:${e.lineno}:${e.colno}`;return L(`window`,{type:`Error`,message:k(e.message),stack:n},{})}let t=e.target;if(!(t instanceof Element)||t.closest(Ce)!==null)return;let n=t.localName,r=J(Le(t));I({kind:`error`,seq:C(),at:w(),source:`resource`,fingerprint:f(n,r),type:`ResourceError`,message:`<${n}> failed to load ${r}`,resource:{tag:n,url:r}},void 0)}function B(e){ne(`rejection`,e.reason,`UnhandledRejection`)}addEventListener(`error`,ie,!0),addEventListener(`unhandledrejection`,B),b.push(()=>{removeEventListener(`error`,ie,!0),removeEventListener(`unhandledrejection`,B)});function V(t,n){return(r,a)=>{let o=i?null:e.captureOwnerStack?.()??null;if(S.call(console,`${n}:`,r,a.componentStack??``),i)return;if(r instanceof Error){if(l.has(r))return;l.add(r)}let s={};a.componentStack!==void 0&&(s.componentStack=k(a.componentStack,X)),o!==null&&(s.ownerStack=k(o,X)),L(t,Ae(r,`Error`),s)}}let oe={onCaughtError:V(`react-caught`,`React caught an error`),onUncaughtError:V(`react-uncaught`,`Uncaught error in React`),onRecoverableError:V(`react-recoverable`,`React recovered from an error`)},H=ye({bodies:e.bodies,nextSeq:C,changed:O,added:E,settled:E,fail:T});b.push(H.restore);function U(e){let t=e.target;if(!(t instanceof Element)||t.closest(Ce)!==null)return;let n;if(e.type===`keydown`){if(!(e instanceof KeyboardEvent)||e.key!==`Enter`&&e.key!==`Escape`)return;n=e.key}let r=e.type===`click`?t.closest(`a,button,input,select,textarea,summary,label,[role],[data-testid]`)??t:t,i=Te.find(t=>t===e.type);if(i===void 0)return;let a=Fe(r),o=e.timeStamp,c=s.at(-1);if(i===`input`&&c?.kind===`action`&&c.type===`input`&&Ie(c.target,a)){let e=c.performanceMs??o;c.durationMs=Math.max(c.durationMs??0,o-e);return}let l={kind:`action`,seq:C(),at:w(),performanceMs:o,type:i,target:a};i===`input`&&(l.durationMs=0),n!==void 0&&(l.key=n),D(s,l),O()}for(let e of Te)document.addEventListener(e,U,{capture:!0,passive:!0});b.push(()=>{for(let e of Te)document.removeEventListener(e,U,!0)});let W;function G(e,t){let n=J(t),r={kind:`navigation`,seq:C(),at:w(),type:e,to:n};W!==void 0&&(r.from=W),W=n,D(s,r),O()}if(G(`load`,location.href),`navigation`in globalThis){let e=e=>{G(e.navigationType,e.destination.url)};navigation.addEventListener(`navigate`,e),b.push(()=>navigation.removeEventListener(`navigate`,e))}else{let{pushState:e,replaceState:t}=history,n=function(...t){e.apply(history,t),i||G(`push`,location.href)},r=function(...e){t.apply(history,e),i||G(`replace`,location.href)};history.pushState=n,history.replaceState=r;let a=()=>G(`traverse`,location.href);addEventListener(`popstate`,a),b.push(()=>{history.pushState===n&&(history.pushState=e),history.replaceState===r&&(history.replaceState=t),removeEventListener(`popstate`,a)})}function K(e,t){e.group.status!==t&&(e.group.status=t,N(e.group.fingerprint))}return{subscribe(e){return m.add(e),()=>m.delete(e)},snapshot(){if(H.resolveTimings(),r?.version===n)return r.value;let e={console:a.filter(e=>e.seq>p.console),errors:o.filter(e=>e.seq>p.errors),groups:[...c.values()].map(e=>({...e.group})),requests:H.list().filter(e=>e.seq>p.network),actions:[...s]};return r={version:n,value:e},e},clear(e){if(p[e]=t,e===`errors`)for(let e of c.values())K(e,`cleared`);O()},markSent(e){for(let t of e){let e=c.get(t);e!==void 0&&e.group.status===`open`&&K(e,`sent`)}O()},markResolved(e,t){for(let n of e){let e=c.get(n);if(e!==void 0&&e.group.status===`sent`){if(Date.parse(e.group.lastSeen)<t){K(e,`cleared`);continue}te(e),N(n)}}O()},huntContext(e,t=2e4){let n=c.get(e);if(n===void 0)throw Error(`No error group ${e}; it was never seen or has been evicted`);H.resolveTimings();let r=n.opened,i=Date.parse(r.at),a=e=>e.seq<=r.seq&&Date.parse(e.at)>=i-t;return{group:{...n.group},error:r,actions:s.filter(a),requests:H.list().filter(a)}},applySymbolicated(e){for(let t of e.groups){let e=c.get(t.fingerprint);e!==void 0&&(e.group.stack=t.stack,t.topFrame!==void 0&&(e.group.topFrame=t.topFrame))}O()},tap(e){return h.add(e),()=>h.delete(e)},fetch:H.untracked,reactRootOptions:oe,stop(){if(!i){i=!0;for(let e of b.splice(0))e();v!==void 0&&clearTimeout(v),v=void 0,_.clear(),m.clear(),h.clear()}}}}let ze=!1;const Be=/* @__PURE__ */ new Set;function Ve(e){if(ze!==e){ze=e;for(let e of Be)e()}}function He(){return ze}function Ue(e){return Be.add(e),()=>{Be.delete(e)}}function We(){return globalThis.__PKA_ACTIVE__}function Ge(e){globalThis.__PKA_ACTIVE__=e}function Ke(){let e=We();if(e?.capture===void 0)throw Error(`pk-annotator: getCapture() called before mount() or after Exit`);return e.capture}function qe(e,t,n,r){let i=e=>{let i=n.safeParse(e);i.success?r(i.data):console.error(`[pk-annotator] dropped an invalid ${t} message`,i.error)};return e.on(t,i),()=>e.off(t,i)}function Je(e,t,n){e.send(t,n)}let Ye=!1;const Z=/* @__PURE__ */ new Set;function Xe(e){if(e!==Ye){Ye=e;for(let e of Z)e(`working`)}}function Ze(){return Ye}function Qe(){for(let e of Z)e(`reacted`)}function $e(e){return Z.add(e),()=>Z.delete(e)}const et=`capture/summary.md`;function tt(){let e=[],t=/* @__PURE__ */ new Set,n=()=>{for(let e of t)e()};return{get:()=>e,subscribe(e){return t.add(e),()=>t.delete(e)},add(t){return e=[...e.filter(e=>e.id!==t.id),t],n(),()=>{e=e.filter(e=>e!==t),n()}},remove(t){e=e.filter(e=>e.id!==t),n()},clear(){e=[],n()}}}const nt=tt(),rt=tt();function it(e){return nt.add(e)}function at(e){return rt.add(e)}let ot=0;const st=/* @__PURE__ */ new Set;function ct(e){if(!Number.isInteger(e)||e<0)throw Error(`setBadge expects a non-negative integer, got ${e}`);ot=e;for(let e of st)e()}function lt(){return ot}function ut(e){return st.add(e),()=>st.delete(e)}let dt=null;const ft=/* @__PURE__ */ new Set,pt={get:()=>dt,set(e){if(e!==dt){dt=e;for(let e of ft)e()}},subscribe(e){return ft.add(e),()=>ft.delete(e)}},mt=`pk-annotator`,ht=`Alt+Shift+A`,gt=`pka:corner`,_t=`pka:sent`,vt=`pka:agent`;function Q(){let e=localStorage.getItem(gt);return e===`top-left`||e===`top-right`||e===`bottom-left`||e===`bottom-right`?e:`bottom-right`}function yt(e,t){return`${t<window.innerHeight/2?`top`:`bottom`}-${e<window.innerWidth/2?`left`:`right`}`}const bt=/* @__PURE__ */ new Map([[`ArrowLeft`,e=>e.startsWith(`top`)?`top-left`:`bottom-left`],[`ArrowRight`,e=>e.startsWith(`top`)?`top-right`:`bottom-right`],[`ArrowUp`,e=>e.endsWith(`left`)?`top-left`:`top-right`],[`ArrowDown`,e=>e.endsWith(`left`)?`bottom-left`:`bottom-right`]]),$=`cubic-bezier(0.22, 1, 0.36, 1)`,xt=`
5
+ :host {
6
+ all: initial !important;
7
+ position: fixed !important;
8
+ inset: 0 auto auto 0 !important;
9
+ z-index: 2147483647 !important;
10
+ --pka-surface: var(--popover, oklch(1 0 0));
11
+ --pka-hub-ink: var(--popover-foreground, oklch(0.145 0 0));
12
+ --pka-hub-accent: var(--pka-pick, oklch(0.6 0.19 255));
13
+ --pka-hub-alert: var(--destructive, oklch(0.577 0.245 27.325));
14
+ --pka-connect: #2563eb;
15
+ --pka-connect-hover: #1d4ed8;
16
+ }
17
+ :host([data-theme="dark"]) {
18
+ /* Lifted, so the hub and its menu stay distinct over a panel of the same surface. */
19
+ --pka-surface: color-mix(in oklch, var(--popover, oklch(0.205 0 0)), var(--popover-foreground, oklch(0.985 0 0)) 5%);
20
+ --pka-hub-ink: var(--popover-foreground, oklch(0.985 0 0));
21
+ --pka-hub-accent: var(--pka-pick, oklch(0.7 0.16 255));
22
+ --pka-hub-alert: var(--destructive, oklch(0.704 0.191 22.216));
23
+ }
24
+ .pka-launcher {
25
+ all: initial;
26
+ position: fixed;
27
+ box-sizing: border-box;
28
+ width: 44px;
29
+ height: 44px;
30
+ border-radius: 9999px;
31
+ display: grid;
32
+ place-items: center;
33
+ cursor: pointer;
34
+ touch-action: none;
35
+ -webkit-tap-highlight-color: transparent;
36
+ color: var(--pka-hub-ink);
37
+ background: var(--pka-surface);
38
+ box-shadow:
39
+ 0 0 0 1px color-mix(in oklch, var(--pka-hub-ink) 12%, transparent),
40
+ 0 1px 2px rgb(0 0 0 / 0.1),
41
+ 0 12px 28px -10px rgb(0 0 0 / 0.4);
42
+ transition:
43
+ transform 180ms ${$},
44
+ box-shadow 180ms ${$},
45
+ background-color 480ms ease,
46
+ color 480ms ease;
47
+ }
48
+ .pka-launcher:hover { transform: scale(1.05); }
49
+ .pka-launcher:active { transform: scale(0.96); }
50
+ .pka-launcher:focus-visible { outline: 2px solid var(--ring, #737373); outline-offset: 3px; }
51
+ .pka-launcher[data-corner$="right"] { right: 20px; }
52
+ .pka-launcher[data-corner$="left"] { left: 20px; }
53
+ .pka-launcher[data-corner^="top"] { top: 20px; }
54
+ .pka-launcher[data-corner^="bottom"] { bottom: 20px; }
55
+ .pka-launcher[data-dragging] {
56
+ right: auto;
57
+ bottom: auto;
58
+ cursor: grabbing;
59
+ transform: scale(1.08);
60
+ transition: none;
61
+ }
62
+ .pka-launcher[data-mode="pick"] {
63
+ box-shadow:
64
+ 0 0 0 1.5px var(--pka-hub-accent),
65
+ 0 1px 2px rgb(0 0 0 / 0.1),
66
+ 0 12px 28px -10px rgb(0 0 0 / 0.4);
67
+ }
68
+ /* Open, the hub is the root of the menu's shape, which draws the edge and shadow. */
69
+ .pka-launcher[aria-expanded="true"] { box-shadow: none; }
70
+ .pka-glyph {
71
+ width: 26px;
72
+ height: 26px;
73
+ overflow: visible;
74
+ fill: currentColor;
75
+ transition: opacity 160ms ${$}, scale 260ms ${$};
76
+ }
77
+ .pka-launcher[data-corner="bottom-left"] .pka-glyph { rotate: 90deg; }
78
+ .pka-launcher[data-corner="top-left"] .pka-glyph { rotate: 180deg; }
79
+ .pka-launcher[data-corner="top-right"] .pka-glyph { rotate: 270deg; }
80
+ .pka-glyph [data-part="orbit"] {
81
+ fill: var(--pka-hub-accent);
82
+ color: var(--pka-hub-accent);
83
+ transform-origin: 16.2px 16.2px;
84
+ transition: transform 360ms ${$}, opacity 200ms ${$};
85
+ }
86
+ .pka-glyph [data-part="core"] {
87
+ transform-origin: 16.2px 16.2px;
88
+ transition: transform 240ms ${$}, fill 180ms;
89
+ }
90
+ .pka-glyph [data-part="close"] {
91
+ fill: none;
92
+ stroke: currentColor;
93
+ stroke-width: 1.75;
94
+ stroke-linecap: round;
95
+ opacity: 0;
96
+ transform-origin: 12px 12px;
97
+ transform: rotate(90deg) scale(0.4);
98
+ transition: transform 300ms ${$}, opacity 160ms ${$};
99
+ }
100
+ .pka-launcher:hover .pka-glyph [data-part="orbit"] { transform: rotate(-16deg); }
101
+ .pka-launcher[aria-expanded="true"] .pka-glyph [data-part="orbit"] {
102
+ transform: rotate(-90deg) scale(0.2);
103
+ opacity: 0;
104
+ }
105
+ .pka-launcher[aria-expanded="true"] .pka-glyph [data-part="core"] { transform: scale(0); }
106
+ .pka-launcher[aria-expanded="true"] .pka-glyph [data-part="close"] { opacity: 1; transform: none; }
107
+ .pka-launcher[data-mode="pick"] .pka-glyph [data-part="core"] { fill: var(--pka-hub-accent); }
108
+ .pka-launcher[data-mode="record"] .pka-glyph [data-part="core"] {
109
+ fill: var(--pka-hub-alert);
110
+ animation: pka-hub-pulse 1.6s ease-in-out infinite;
111
+ }
112
+ @keyframes pka-hub-pulse { 50% { opacity: 0.35; } }
113
+ /* While an agent works on an annotation from this tab, the moons circle the core. */
114
+ .pka-launcher[data-working] .pka-glyph [data-part="orbit"] {
115
+ animation: pka-hub-orbit 2.4s linear infinite;
116
+ }
117
+ @keyframes pka-hub-orbit { to { transform: rotate(-360deg); } }
118
+ /* An agent reply or resolve: the hub swells once and a ring leaves it. */
119
+ .pka-launcher[data-react] { animation: pka-hub-react 560ms cubic-bezier(0.3, 0.7, 0.4, 1); }
120
+ .pka-launcher[data-react]::before {
121
+ content: "";
122
+ position: absolute;
123
+ inset: 0;
124
+ border-radius: inherit;
125
+ pointer-events: none;
126
+ animation: pka-hub-ripple 720ms ${$} forwards;
127
+ }
128
+ @keyframes pka-hub-react { 30% { scale: 1.12; } 62% { scale: 0.97; } }
129
+ @keyframes pka-hub-ripple {
130
+ from { box-shadow: 0 0 0 0 color-mix(in oklch, var(--pka-hub-mark, var(--pka-hub-accent)) 55%, transparent); }
131
+ to { box-shadow: 0 0 0 16px transparent; }
132
+ }
133
+ .pka-count {
134
+ position: absolute;
135
+ inset: 0;
136
+ display: grid;
137
+ place-items: center;
138
+ color: var(--pka-hub-ink);
139
+ font: 600 15px/1 system-ui, sans-serif;
140
+ font-variant-numeric: tabular-nums;
141
+ opacity: 0;
142
+ scale: 0.5;
143
+ pointer-events: none;
144
+ transition: opacity 160ms ${$}, scale 260ms cubic-bezier(0.34, 1.56, 0.64, 1);
145
+ }
146
+ .pka-launcher[data-count]:not([aria-expanded="true"]) .pka-count { opacity: 1; scale: 1; }
147
+ .pka-launcher[data-count]:not([aria-expanded="true"]) .pka-glyph { opacity: 0; scale: 0.5; }
148
+ .pka-badge {
149
+ position: absolute;
150
+ top: -3px;
151
+ right: -3px;
152
+ min-width: 18px;
153
+ height: 18px;
154
+ padding: 0 5px;
155
+ box-sizing: border-box;
156
+ border-radius: 9999px;
157
+ background: var(--pka-hub-alert);
158
+ box-shadow: 0 0 0 2px var(--pka-surface);
159
+ color: #fff;
160
+ font: 600 10px/18px system-ui, sans-serif;
161
+ font-variant-numeric: tabular-nums;
162
+ text-align: center;
163
+ }
164
+ .pka-badge[hidden] { display: none; }
165
+ @media (prefers-reduced-motion: reduce) {
166
+ .pka-launcher, .pka-launcher *, .pka-launcher::before {
167
+ transition: none !important;
168
+ animation: none !important;
169
+ }
170
+ .pka-launcher[data-working] {
171
+ box-shadow:
172
+ 0 0 0 2px var(--pka-hub-mark, var(--pka-hub-accent)),
173
+ 0 12px 28px -10px rgb(0 0 0 / 0.4);
174
+ }
175
+ }
176
+ `;function St(e,t){let n=/* @__PURE__ */ new Set,r=matchMedia(`(prefers-color-scheme: dark)`),i=t,a=()=>i===`system`?r.matches?`dark`:`light`:i,o=a();e.setAttribute(`data-theme`,o);let s=()=>{let t=a();if(t!==o){o=t,e.setAttribute(`data-theme`,t);for(let e of n)e()}};return r.addEventListener(`change`,s),{get:()=>o,subscribe(e){return n.add(e),()=>n.delete(e)},set(e){if(e!==`light`&&e!==`dark`&&e!==`system`)throw Error(`setTheme expects "light", "dark", or "system", got ${String(e)}`);i=e,s()},stop:()=>r.removeEventListener(`change`,s)}}function Ct(e,t,n){if(document.querySelector(`pk-annotator`)!==null)throw Error(`<${mt}> is already mounted; call unmount() before mounting again`);let r=document.createElement(mt),i=r.attachShadow({mode:`open`}),a=new CSSStyleSheet;a.replaceSync(xt),i.adoptedStyleSheets=[a];let o=St(r,t),s=document.createElement(`button`);s.type=`button`,s.className=`pka-launcher`,s.dataset.corner=Q(),s.title=`Annotator (${ht} picks) · drag to move`,s.setAttribute(`aria-haspopup`,`menu`),s.setAttribute(`aria-expanded`,`false`),s.innerHTML=`<svg class="pka-glyph" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><g data-part="orbit"><path d="M16.2 6.7A9.5 9.5 0 0 0 6.7 16.2" fill="none" stroke="currentColor" stroke-width="1.25" opacity="0.3"/><circle cx="16.2" cy="6.7" r="2.1" opacity="0.45"/><circle cx="9.48" cy="9.48" r="2.1" opacity="0.75"/><circle cx="6.7" cy="16.2" r="2.1"/></g><circle data-part="core" cx="16.2" cy="16.2" r="3.25"/><path data-part="close" d="M7.5 7.5l9 9M16.5 7.5l-9 9"/></svg>`;let c=document.createElement(`span`);c.className=`pka-count`,c.setAttribute(`aria-hidden`,`true`);let l=document.createElement(`span`);l.className=`pka-badge`,l.setAttribute(`aria-hidden`,`true`),s.append(c,l),i.append(s),document.documentElement.append(r);let u=0,d=null,f=()=>{let e=lt(),t=[`Annotator`];d!==null&&t.push(`${d} connected`),u>0&&t.push(`${u} unsent ${u===1?`mark`:`marks`}`),e>0&&t.push(`${e} open errors`),s.setAttribute(`aria-label`,t.join(`, `))},p=()=>{let e=lt();l.hidden=e===0,l.textContent=e>99?`99+`:String(e),f()};p();let m=ut(p),h=e=>{if(!Number.isInteger(e)||e<0)throw Error(`setMarkCount expects a non-negative integer, got ${e}`);u=e,e===0?delete s.dataset.count:s.dataset.count=``,e>0&&(c.textContent=e>99?`99+`:String(e)),f()},g=()=>{Ze()?s.dataset.working=``:delete s.dataset.working};g();let _=$e(e=>{if(e===`working`){g();return}delete s.dataset.react,s.offsetWidth,s.dataset.react=``});s.addEventListener(`animationend`,e=>{e.target===s&&e.animationName===`pka-hub-react`&&delete s.dataset.react});let v,y=e=>{v??=import(`./pka-overlay-agent-theme-By8py_yl.mjs`),v.then(({AgentMessage:t,showAgent:n})=>{let a=t.safeParse(e);if(!a.success){console.error(`[pk-annotator] dropped an invalid ${vt} message`,a.error);return}d=n({host:r,shadow:i,hub:s},a.data),f()})};e.on(vt,y),Je(e,`pka:presence`,{});let b,x=()=>b??=import(`./pka-overlay-thread-store-zl2wNG0R.mjs`).then(({connectThread:t})=>t(e),e=>{throw b=void 0,e}),S,C=async t=>{S??=Promise.all([import(`./pka-overlay-app-8vOHqTu0.mjs`).then(e=>e.t),x()]).then(([{open:t},a])=>t({host:r,shadow:i,hot:e,theme:o,hub:s,thread:a,exit:n,setMarkCount:h}),e=>{throw S=void 0,e});try{t(await S)}catch(e){console.error(`[pk-annotator] the overlay UI failed to open`,e)}},w=e=>{let t=s.getBoundingClientRect();if(s.style.left=``,s.style.top=``,delete s.dataset.dragging,localStorage.setItem(gt,e),s.dataset.corner=e,S?.then(t=>t.setCorner(e)),matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let n=s.getBoundingClientRect();s.animate([{translate:`${t.left-n.left}px ${t.top-n.top}px`},{translate:`0 0`}],{duration:260,easing:$})},T,E=!1;s.addEventListener(`pointerdown`,e=>{e.button===0&&(E=!1,T={id:e.pointerId,x:e.clientX,y:e.clientY,dragging:!1},s.setPointerCapture(e.pointerId))}),s.addEventListener(`pointermove`,e=>{if(T?.id===e.pointerId){if(!T.dragging){if(Math.hypot(e.clientX-T.x,e.clientY-T.y)<6)return;T.dragging=!0,s.dataset.dragging=``,S?.then(e=>e.closeMenu())}s.style.left=`${e.clientX-22}px`,s.style.top=`${e.clientY-22}px`}}),s.addEventListener(`pointerup`,e=>{T?.id===e.pointerId&&(E=T.dragging,T=void 0,E&&w(yt(e.clientX,e.clientY)))}),s.addEventListener(`pointercancel`,()=>{T?.dragging&&w(Q()),T=void 0}),s.addEventListener(`click`,e=>{if(E){E=!1;return}C(t=>t.toggleMenu(e.detail===0))}),s.addEventListener(`keydown`,e=>{let t=bt.get(e.key)?.(Q());t!==void 0&&(e.preventDefault(),t!==Q()&&w(t))});let D=e=>{e.code===`KeyA`&&e.altKey&&e.shiftKey&&(e.ctrlKey||e.metaKey||(e.preventDefault(),e.stopPropagation(),C(e=>e.togglePick())))};window.addEventListener(`keydown`,D,{capture:!0});let O=sessionStorage.getItem(_t);return O!==null&&O!==`[]`&&x().catch(e=>{console.error(`[pk-annotator] following this tab's sent annotations failed`,e)}),{setTheme:o.set,unmount(){window.removeEventListener(`keydown`,D,{capture:!0}),e.off(vt,y),m(),_(),o.stop(),pt.set(null),S?.then(e=>e.unmount()),b?.then(e=>e.disconnect()),r.remove()}}}const wt=`pka:errors-ack`,Tt=`pka:agent`,Et=`pka:exited`;function Dt(e){return e.code===`KeyA`&&e.altKey&&e.shiftKey&&!e.ctrlKey&&!e.metaKey}function Ot(t){if(navigator.webdriver)return{reactRootOptions:{},setTheme(){},unmount(){}};let n=We();if(n!==void 0)return n.mounted;let r=t.theme??`system`,i,a=()=>{let n=Re({send:(e,n)=>Je(t.hot,e,n),bodies:globalThis.__PKA_BODIES__??[],captureOwnerStack:e}),a=e=>{import(`./pka-overlay-channel-z4oIRzcB.mjs`).then(e=>e.f).then(({ErrorsAckMessage:t})=>{let r=t.safeParse(e);r.success?n.applySymbolicated(r.data):console.error(`[pk-annotator] dropped an invalid ${wt} message`,r.error)})};t.hot.on(wt,a);let o=e=>{import(`./pka-overlay-channel-z4oIRzcB.mjs`).then(e=>e.f).then(({AgentMessage:t})=>{let n=t.safeParse(e);n.success?Ve(n.data.agent!==null):console.error(`[pk-annotator] dropped an invalid ${Tt} message`,n.error)})};t.hot.on(Tt,o);let s=0,u=n.subscribe(()=>{let e=n.snapshot().groups.filter(e=>e.status===`open`).length;e!==s&&(s=e,ct(e))}),d=Ct(t.hot,r,c);i={capture:n,launcher:d,stop(){u(),t.hot.off(wt,a),t.hot.off(Tt,o),Ve(!1),n.stop(),d.unmount(),ct(0)}},Ge({mounted:l,capture:n})},o=e=>{Dt(e)&&(e.preventDefault(),e.stopPropagation(),window.removeEventListener(`keydown`,o,{capture:!0}),sessionStorage.removeItem(Et),a())},s=()=>{window.addEventListener(`keydown`,o,{capture:!0}),Ge({mounted:l,capture:void 0})};function c(){i?.stop(),i=void 0,sessionStorage.setItem(Et,`1`),s()}let l={reactRootOptions:{onCaughtError(e,t){let n=i?.capture.reactRootOptions.onCaughtError;n===void 0?console.error(`React caught an error:`,e,t.componentStack??``):n(e,t)},onUncaughtError(e,t){let n=i?.capture.reactRootOptions.onUncaughtError;n===void 0?console.error(`Uncaught error in React:`,e,t.componentStack??``):n(e,t)},onRecoverableError(e,t){let n=i?.capture.reactRootOptions.onRecoverableError;n===void 0?console.error(`React recovered from an error:`,e,t.componentStack??``):n(e,t)}},setTheme(e){if(e!==`light`&&e!==`dark`&&e!==`system`)throw Error(`setTheme expects "light", "dark", or "system", got ${String(e)}`);r=e,i?.launcher.setTheme(e)},unmount(){i?.stop(),i=void 0,window.removeEventListener(`keydown`,o,{capture:!0}),Ge(void 0)}};return sessionStorage.getItem(Et)===`1`?s():a(),l}export{C,S,T,Ue as _,et as a,Y as b,rt as c,Qe as d,Xe as f,He as g,Ke as h,Q as i,nt as l,Je as m,Ot as mount,_t as n,at as o,qe as p,ht as r,pt as s,mt as t,it as u,ie as v,w,F as x,J as y};