aicodeman 0.9.10 → 0.9.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.
Files changed (59) hide show
  1. package/README.md +7 -7
  2. package/README.zh-CN.md +7 -7
  3. package/dist/prompts/index.d.ts +1 -0
  4. package/dist/prompts/index.d.ts.map +1 -1
  5. package/dist/prompts/index.js +1 -0
  6. package/dist/prompts/index.js.map +1 -1
  7. package/dist/prompts/ralph.d.ts +31 -0
  8. package/dist/prompts/ralph.d.ts.map +1 -0
  9. package/dist/prompts/ralph.js +75 -0
  10. package/dist/prompts/ralph.js.map +1 -0
  11. package/dist/templates/case-template.md +0 -39
  12. package/dist/web/middleware/auth.d.ts.map +1 -1
  13. package/dist/web/middleware/auth.js +6 -1
  14. package/dist/web/middleware/auth.js.map +1 -1
  15. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  16. package/dist/web/public/app.a8663e79.js.gz +0 -0
  17. package/dist/web/public/constants.74211deb.js.gz +0 -0
  18. package/dist/web/public/image-input.0ea86695.js.gz +0 -0
  19. package/dist/web/public/index.html +2 -2
  20. package/dist/web/public/index.html.br +0 -0
  21. package/dist/web/public/index.html.gz +0 -0
  22. package/dist/web/public/input-cjk.b8686b5e.js.gz +0 -0
  23. package/dist/web/public/keyboard-accessory.bc753cc7.js.gz +0 -0
  24. package/dist/web/public/mobile-handlers.d54d97d6.js.gz +0 -0
  25. package/dist/web/public/mobile.959f6fe2.css.gz +0 -0
  26. package/dist/web/public/notification-manager.9c984ac2.js.gz +0 -0
  27. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  28. package/dist/web/public/panels-ui.6bb3169f.js.gz +0 -0
  29. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  30. package/dist/web/public/{ralph-wizard.a6b2d36b.js → ralph-wizard.13a1831e.js} +4 -1
  31. package/dist/web/public/ralph-wizard.13a1831e.js.br +0 -0
  32. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  33. package/dist/web/public/respawn-ui.2d249da9.js.gz +0 -0
  34. package/dist/web/public/session-ui.512816d8.js.gz +0 -0
  35. package/dist/web/public/settings-ui.21b009ca.js.gz +0 -0
  36. package/dist/web/public/styles.f3a0faa3.css.gz +0 -0
  37. package/dist/web/public/subagent-windows.a366a4ad.js.gz +0 -0
  38. package/dist/web/public/sw.js.gz +0 -0
  39. package/dist/web/public/terminal-ui.0e930cb3.js +3 -0
  40. package/dist/web/public/terminal-ui.0e930cb3.js.br +0 -0
  41. package/dist/web/public/terminal-ui.0e930cb3.js.gz +0 -0
  42. package/dist/web/public/upload.html.gz +0 -0
  43. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  44. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  45. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  46. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  47. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  48. package/dist/web/public/vendor/xterm.css.gz +0 -0
  49. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  50. package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
  51. package/dist/web/routes/ralph-routes.d.ts.map +1 -1
  52. package/dist/web/routes/ralph-routes.js +7 -31
  53. package/dist/web/routes/ralph-routes.js.map +1 -1
  54. package/package.json +2 -2
  55. package/dist/web/public/ralph-wizard.a6b2d36b.js.br +0 -0
  56. package/dist/web/public/ralph-wizard.a6b2d36b.js.gz +0 -0
  57. package/dist/web/public/terminal-ui.6ce91b0b.js +0 -3
  58. package/dist/web/public/terminal-ui.6ce91b0b.js.br +0 -0
  59. package/dist/web/public/terminal-ui.6ce91b0b.js.gz +0 -0
package/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
  <img src="docs/images/codeman-title.svg" alt="Codeman" height="60">
3
3
  </p>
4
4
 
5
- <h2 align="center">The missing control plane for AI coding agents</h2>
5
+ <h2 align="center">Mission control for AI coding agents</h2>
6
6
 
7
7
  <p align="center">
8
- <em>Agent Visualization &bull; Zero-Lag Input &bull; Mobile-First UI &bull; Hardened Security</em>
8
+ <em>Claude Code &bull; OpenCode &bull; Codex &mdash; One Dashboard &bull; Any Device</em>
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -34,7 +34,7 @@ curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | b
34
34
 
35
35
  This installs Node.js and tmux if missing, clones Codeman to `~/.codeman/app`, and builds it.
36
36
 
37
- You'll need at least one AI coding CLI installed — [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or [OpenCode](https://opencode.ai) (or both). After install:
37
+ You'll need at least one AI coding CLI installed — [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [OpenCode](https://opencode.ai), or [Codex](https://developers.openai.com/codex/cli) (any combination works). After install:
38
38
 
39
39
  ```bash
40
40
  codeman web
@@ -103,7 +103,7 @@ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.codeman.web.plist
103
103
  wsl bash -c "curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | bash"
104
104
  ```
105
105
 
106
- Codeman requires tmux, so Windows users need [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). If you don't have WSL yet: run `wsl --install` in an admin PowerShell, reboot, open Ubuntu, then install your preferred AI coding CLI inside WSL ([Claude Code](https://docs.anthropic.com/en/docs/claude-code) or [OpenCode](https://opencode.ai)). After installing, `http://localhost:3000` is accessible from your Windows browser.
106
+ Codeman requires tmux, so Windows users need [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). If you don't have WSL yet: run `wsl --install` in an admin PowerShell, reboot, open Ubuntu, then install your preferred AI coding CLI inside WSL ([Claude Code](https://docs.anthropic.com/en/docs/claude-code), [OpenCode](https://opencode.ai), or [Codex](https://developers.openai.com/codex/cli)). After installing, `http://localhost:3000` is accessible from your Windows browser.
107
107
  </details>
108
108
 
109
109
  ---
@@ -293,7 +293,7 @@ PTY Output → 16ms Server Batch → DEC 2026 Wrap → SSE → Client rAF → xt
293
293
  ## More Features
294
294
 
295
295
  - **Self-update** — git-clone installs under systemd/launchd update in place from **App Settings → Updates**: it detects the latest release, auto-stashes a dirty tree, and streams build progress across the service restart (npm installs report as non-updatable)
296
- - **Dual-CLI** — run **Claude Code** or **OpenCode** per session; env-var prefixes auto-gate (`CLAUDE_CODE_*` vs `OPENCODE_*`). See [`docs/opencode-integration.md`](docs/opencode-integration.md)
296
+ - **Multi-CLI** — run **Claude Code**, **OpenCode**, or **Codex** per session; env-var prefixes auto-gate (`CLAUDE_CODE_*` vs `OPENCODE_*` vs `CODEX_*`). See [`docs/opencode-integration.md`](docs/opencode-integration.md)
297
297
  - **Effort & Ultracode** — set a per-session default effort (`low`–`max`) or enable **ultracode** (dynamic multi-agent workflows). Soft defaults only — switchable anytime with `/effort` in-session. Extended-thinking budget is configurable too
298
298
  - **Voice input** — dictate prompts with Deepgram Nova-3 (Web Speech API fallback): toggle recording, auto-silence stop, live level meter (`Ctrl+Shift+V`)
299
299
  - **Image input** — paste or drag-and-drop images straight into a session
@@ -447,7 +447,7 @@ These run for **every** request — before auth, even on the default no-password
447
447
 
448
448
  ### Input, files & headers
449
449
 
450
- - **Schema-validated inputs** — every API body is checked with Zod v4 schemas; a `CLAUDE_CODE_*` / `OPENCODE_*` env-prefix allowlist gates which settings each CLI can receive
450
+ - **Schema-validated inputs** — every API body is checked with Zod v4 schemas; a `CLAUDE_CODE_*` / `OPENCODE_*` / `CODEX_*` env-prefix allowlist gates which settings each CLI can receive
451
451
  - **Path containment** — file routes `realpath` before boundary checks (no TOCTOU); `..`, absolute paths, and symlinks resolving outside the working dir are rejected. Caps: 10 MB text preview / 50 MB raw & download; `/api/download` blocklists sensitive paths (`.env`, `*credentials*`, `~/.ssh/`, `.aws/credentials`). SVG/HTML is served `octet-stream` + `nosniff` + attachment so it downloads rather than executes
452
452
  - **Security headers** — `Content-Security-Policy` (`default-src 'self'`, every exception enumerated), `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, HSTS over HTTPS, and CORS reflected **only** for `localhost` / `127.0.0.1` / `::1`
453
453
 
@@ -579,7 +579,7 @@ flowchart TB
579
579
  end
580
580
 
581
581
  subgraph External["External"]
582
- CLI["AI CLI<br/><small>Claude Code / OpenCode</small>"]
582
+ CLI["AI CLI<br/><small>Claude Code / OpenCode / Codex</small>"]
583
583
  BG["Background Agents<br/><small>(Task tool)</small>"]
584
584
  end
585
585
  end
package/README.zh-CN.md CHANGED
@@ -2,10 +2,10 @@
2
2
  <img src="docs/images/codeman-title.svg" alt="Codeman" height="60">
3
3
  </p>
4
4
 
5
- <h2 align="center">为 AI 编程智能体而生的「控制平面」</h2>
5
+ <h2 align="center">AI 编程智能体的任务控制中心</h2>
6
6
 
7
7
  <p align="center">
8
- <em>智能体可视化 &bull; 零延迟输入 &bull; 自主编排器 &bull; 重生控制器 &bull; 移动优先 UI &bull; 安全加固</em>
8
+ <em>Claude Code &bull; OpenCode &bull; Codex —— 统一仪表盘 &bull; 任意设备</em>
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -36,7 +36,7 @@ curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | b
36
36
 
37
37
  该脚本会在缺失时自动安装 Node.js 和 tmux,把 Codeman 克隆到 `~/.codeman/app` 并完成构建。
38
38
 
39
- 你至少需要安装一个 AI 编程 CLI —— [Claude Code](https://docs.anthropic.com/en/docs/claude-code)[OpenCode](https://opencode.ai)(两个都装也可以)。安装完成后:
39
+ 你至少需要安装一个 AI 编程 CLI —— [Claude Code](https://docs.anthropic.com/en/docs/claude-code)[OpenCode](https://opencode.ai) 或 [Codex](https://developers.openai.com/codex/cli)(任意组合均可)。安装完成后:
40
40
 
41
41
  ```bash
42
42
  codeman web
@@ -105,7 +105,7 @@ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.codeman.web.plist
105
105
  wsl bash -c "curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | bash"
106
106
  ```
107
107
 
108
- Codeman 依赖 tmux,因此 Windows 用户需要 [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)。如果还没装 WSL:在管理员 PowerShell 中运行 `wsl --install`,重启,打开 Ubuntu,然后在 WSL 内安装你偏好的 AI 编程 CLI([Claude Code](https://docs.anthropic.com/en/docs/claude-code)[OpenCode](https://opencode.ai))。安装完成后,即可从 Windows 浏览器访问 `http://localhost:3000`。
108
+ Codeman 依赖 tmux,因此 Windows 用户需要 [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)。如果还没装 WSL:在管理员 PowerShell 中运行 `wsl --install`,重启,打开 Ubuntu,然后在 WSL 内安装你偏好的 AI 编程 CLI([Claude Code](https://docs.anthropic.com/en/docs/claude-code)[OpenCode](https://opencode.ai) 或 [Codex](https://developers.openai.com/codex/cli))。安装完成后,即可从 Windows 浏览器访问 `http://localhost:3000`。
109
109
  </details>
110
110
 
111
111
  ---
@@ -295,7 +295,7 @@ PTY 输出 → 16ms 服务端批处理 → DEC 2026 包裹 → SSE → 客户端
295
295
  ## 更多特性
296
296
 
297
297
  - **自更新** —— systemd/launchd 管理下的 git-clone 安装可在 **App Settings → Updates** 中原地更新:它会检测最新发行版,自动暂存(stash)脏工作树,并在服务重启期间流式展示构建进度(npm 安装会被报告为不可更新)
298
- - **双 CLI** —— 每个会话可选 **Claude Code** 或 **OpenCode**;环境变量前缀自动隔离(`CLAUDE_CODE_*` 与 `OPENCODE_*`)。详见 [`docs/opencode-integration.md`](docs/opencode-integration.md)
298
+ - **多 CLI** —— 每个会话可选 **Claude Code**、**OpenCode** 或 **Codex**;环境变量前缀自动隔离(`CLAUDE_CODE_*`、`OPENCODE_*` 与 `CODEX_*`)。详见 [`docs/opencode-integration.md`](docs/opencode-integration.md)
299
299
  - **Effort 与 Ultracode** —— 设置每会话的默认 effort(`low`–`max`),或启用 **ultracode**(动态多智能体工作流)。这些都只是软默认值 —— 会话中可随时用 `/effort` 切换。扩展思考预算也可配置
300
300
  - **语音输入** —— 用 Deepgram Nova-3 口述提示(带 Web Speech API 回退):切换录音、自动静音停止、实时音量表(`Ctrl+Shift+V`)
301
301
  - **图像输入** —— 直接把图片粘贴或拖放进会话
@@ -449,7 +449,7 @@ Codeman 用 `--dangerously-skip-permissions` 启动会话,因此 Web UI 在设
449
449
 
450
450
  ### 输入、文件与响应头
451
451
 
452
- - **模式校验的输入** —— 每个 API 请求体都用 Zod v4 模式检查;一个 `CLAUDE_CODE_*` / `OPENCODE_*` 环境变量前缀允许列表把控每个 CLI 能接收哪些设置
452
+ - **模式校验的输入** —— 每个 API 请求体都用 Zod v4 模式检查;一个 `CLAUDE_CODE_*` / `OPENCODE_*` / `CODEX_*` 环境变量前缀允许列表把控每个 CLI 能接收哪些设置
453
453
  - **路径限定** —— 文件路由在边界检查前先 `realpath`(无 TOCTOU);`..`、绝对路径、以及解析到工作目录之外的符号链接都会被拒绝。上限:10 MB 文本预览 / 50 MB 原始与下载;`/api/download` 对敏感路径(`.env`、`*credentials*`、`~/.ssh/`、`.aws/credentials`)做黑名单。SVG/HTML 以 `octet-stream` + `nosniff` + attachment 提供,因此会被下载而非执行
454
454
  - **安全响应头** —— `Content-Security-Policy`(`default-src 'self'`,每个例外都逐条列举)、`X-Content-Type-Options: nosniff`、`X-Frame-Options: SAMEORIGIN`、HTTPS 下的 HSTS,以及**仅**对 `localhost` / `127.0.0.1` / `::1` 反射的 CORS
455
455
 
@@ -581,7 +581,7 @@ flowchart TB
581
581
  end
582
582
 
583
583
  subgraph External["外部"]
584
- CLI["AI CLI<br/><small>Claude Code / OpenCode</small>"]
584
+ CLI["AI CLI<br/><small>Claude Code / OpenCode / Codex</small>"]
585
585
  BG["后台智能体<br/><small>(Task 工具)</small>"]
586
586
  end
587
587
  end
@@ -7,4 +7,5 @@
7
7
  export { RESEARCH_AGENT_PROMPT } from './research-agent.js';
8
8
  export { PLANNER_PROMPT } from './planner.js';
9
9
  export { PHASE_EXECUTION_PROMPT, TEAM_LEAD_PROMPT, REPLAN_PROMPT, SINGLE_TASK_PROMPT } from './orchestrator.js';
10
+ export { RALPH_STATUS_CONTRACT, buildRalphLoopPrompt, type RalphLoopPromptOptions } from './ralph.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
@@ -7,4 +7,5 @@
7
7
  export { RESEARCH_AGENT_PROMPT } from './research-agent.js';
8
8
  export { PLANNER_PROMPT } from './planner.js';
9
9
  export { PHASE_EXECUTION_PROMPT, TEAM_LEAD_PROMPT, REPLAN_PROMPT, SINGLE_TASK_PROMPT } from './orchestrator.js';
10
+ export { RALPH_STATUS_CONTRACT, buildRalphLoopPrompt } from './ralph.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAA+B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview Ralph Loop prompt construction
3
+ *
4
+ * Builds the full `@ralph_prompt.md` content written for a new Ralph loop
5
+ * session, including the RALPH_STATUS block contract. The contract travels
6
+ * with the loop prompt (not the generated CLAUDE.md) so every Ralph session
7
+ * emits parseable status blocks regardless of the project's CLAUDE.md.
8
+ *
9
+ * @module prompts/ralph
10
+ */
11
+ /**
12
+ * Structured status-reporting contract appended to every Ralph loop prompt.
13
+ *
14
+ * `RalphStatusParser` (src/ralph-status-parser.ts) parses this block from
15
+ * session output — keep the field names and enum values in sync with its
16
+ * patterns.
17
+ */
18
+ export declare const RALPH_STATUS_CONTRACT = "## Status Reporting\n\nEnd EVERY response with exactly this block \u2014 Codeman parses it to track the loop:\n\n```\n---RALPH_STATUS---\nSTATUS: IN_PROGRESS | COMPLETE | BLOCKED\nTASKS_COMPLETED_THIS_LOOP: <number>\nFILES_MODIFIED: <number>\nTESTS_STATUS: PASSING | FAILING | NOT_RUN\nWORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING\nEXIT_SIGNAL: false | true\nRECOMMENDATION: <one line: what to do next>\n---END_RALPH_STATUS---\n```\n\nRules:\n- `EXIT_SIGNAL: true` only when ALL tasks are verifiably done \u2014 then also output the completion phrase\n- `STATUS: BLOCKED` when you need human input; describe the blocker in RECOMMENDATION\n- Never set `EXIT_SIGNAL: true` while tests are failing\n";
19
+ export interface RalphLoopPromptOptions {
20
+ /** The user's task description (becomes the prompt header) */
21
+ taskDescription: string;
22
+ /** Completion phrase the session must emit inside <promise></promise> */
23
+ completionPhrase: string;
24
+ /** Whether a @fix_plan.md task plan was generated for this loop */
25
+ hasPlan: boolean;
26
+ }
27
+ /**
28
+ * Builds the full Ralph loop prompt written to `@ralph_prompt.md`.
29
+ */
30
+ export declare function buildRalphLoopPrompt({ taskDescription, completionPhrase, hasPlan }: RalphLoopPromptOptions): string;
31
+ //# sourceMappingURL=ralph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph.d.ts","sourceRoot":"","sources":["../../src/prompts/ralph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,ktBAoBjC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,sBAAsB,GAAG,MAAM,CAgCnH"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @fileoverview Ralph Loop prompt construction
3
+ *
4
+ * Builds the full `@ralph_prompt.md` content written for a new Ralph loop
5
+ * session, including the RALPH_STATUS block contract. The contract travels
6
+ * with the loop prompt (not the generated CLAUDE.md) so every Ralph session
7
+ * emits parseable status blocks regardless of the project's CLAUDE.md.
8
+ *
9
+ * @module prompts/ralph
10
+ */
11
+ /**
12
+ * Structured status-reporting contract appended to every Ralph loop prompt.
13
+ *
14
+ * `RalphStatusParser` (src/ralph-status-parser.ts) parses this block from
15
+ * session output — keep the field names and enum values in sync with its
16
+ * patterns.
17
+ */
18
+ export const RALPH_STATUS_CONTRACT = `## Status Reporting
19
+
20
+ End EVERY response with exactly this block — Codeman parses it to track the loop:
21
+
22
+ \`\`\`
23
+ ---RALPH_STATUS---
24
+ STATUS: IN_PROGRESS | COMPLETE | BLOCKED
25
+ TASKS_COMPLETED_THIS_LOOP: <number>
26
+ FILES_MODIFIED: <number>
27
+ TESTS_STATUS: PASSING | FAILING | NOT_RUN
28
+ WORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
29
+ EXIT_SIGNAL: false | true
30
+ RECOMMENDATION: <one line: what to do next>
31
+ ---END_RALPH_STATUS---
32
+ \`\`\`
33
+
34
+ Rules:
35
+ - \`EXIT_SIGNAL: true\` only when ALL tasks are verifiably done — then also output the completion phrase
36
+ - \`STATUS: BLOCKED\` when you need human input; describe the blocker in RECOMMENDATION
37
+ - Never set \`EXIT_SIGNAL: true\` while tests are failing
38
+ `;
39
+ /**
40
+ * Builds the full Ralph loop prompt written to `@ralph_prompt.md`.
41
+ */
42
+ export function buildRalphLoopPrompt({ taskDescription, completionPhrase, hasPlan }) {
43
+ let fullPrompt = taskDescription + '\n\n---\n\n';
44
+ if (hasPlan) {
45
+ fullPrompt += '## Task Plan\n\n';
46
+ fullPrompt += 'A task plan has been written to `@fix_plan.md`. Use this to track progress:\n';
47
+ fullPrompt += '- Reference the plan at the start of each iteration\n';
48
+ fullPrompt += '- Update task checkboxes as you complete items\n';
49
+ fullPrompt += '- Work through items in priority order (P0 > P1 > P2)\n\n';
50
+ }
51
+ fullPrompt += '## Iteration Protocol\n\n';
52
+ fullPrompt += 'This is an autonomous loop. Files from previous iterations persist. On each iteration:\n';
53
+ fullPrompt += '1. Check what work has already been done\n';
54
+ fullPrompt += '2. Make incremental progress toward completion\n';
55
+ fullPrompt += '3. Commit meaningful changes with descriptive messages\n\n';
56
+ fullPrompt += '## Verification\n\n';
57
+ fullPrompt += 'After each significant change:\n';
58
+ fullPrompt += '- Run tests to verify (npm test, pytest, etc.)\n';
59
+ fullPrompt += '- Check for type/lint errors if applicable\n';
60
+ fullPrompt += '- If tests fail, read the error, fix it, and retry\n\n';
61
+ fullPrompt += '## Completion Criteria\n\n';
62
+ fullPrompt += `Output \`<promise>${completionPhrase}</promise>\` when ALL of the following are true:\n`;
63
+ fullPrompt += '- All requirements from the task description are implemented\n';
64
+ fullPrompt += '- All tests pass\n';
65
+ fullPrompt += '- Changes are committed\n\n';
66
+ fullPrompt += '## If Stuck\n\n';
67
+ fullPrompt += 'If you encounter the same error for 3+ iterations:\n';
68
+ fullPrompt += "1. Document what you've tried\n";
69
+ fullPrompt += '2. Identify the specific blocker\n';
70
+ fullPrompt += '3. Try an alternative approach\n';
71
+ fullPrompt += '4. If truly blocked, output `<promise>BLOCKED</promise>` with an explanation\n\n';
72
+ fullPrompt += RALPH_STATUS_CONTRACT;
73
+ return fullPrompt;
74
+ }
75
+ //# sourceMappingURL=ralph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph.js","sourceRoot":"","sources":["../../src/prompts/ralph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;CAoBpC,CAAC;AAWF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAA0B;IACzG,IAAI,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;IACjD,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,IAAI,kBAAkB,CAAC;QACjC,UAAU,IAAI,+EAA+E,CAAC;QAC9F,UAAU,IAAI,uDAAuD,CAAC;QACtE,UAAU,IAAI,kDAAkD,CAAC;QACjE,UAAU,IAAI,2DAA2D,CAAC;IAC5E,CAAC;IACD,UAAU,IAAI,2BAA2B,CAAC;IAC1C,UAAU,IAAI,0FAA0F,CAAC;IACzG,UAAU,IAAI,4CAA4C,CAAC;IAC3D,UAAU,IAAI,kDAAkD,CAAC;IACjE,UAAU,IAAI,4DAA4D,CAAC;IAC3E,UAAU,IAAI,qBAAqB,CAAC;IACpC,UAAU,IAAI,kCAAkC,CAAC;IACjD,UAAU,IAAI,kDAAkD,CAAC;IACjE,UAAU,IAAI,8CAA8C,CAAC;IAC7D,UAAU,IAAI,wDAAwD,CAAC;IACvE,UAAU,IAAI,4BAA4B,CAAC;IAC3C,UAAU,IAAI,qBAAqB,gBAAgB,oDAAoD,CAAC;IACxG,UAAU,IAAI,gEAAgE,CAAC;IAC/E,UAAU,IAAI,oBAAoB,CAAC;IACnC,UAAU,IAAI,6BAA6B,CAAC;IAC5C,UAAU,IAAI,iBAAiB,CAAC;IAChC,UAAU,IAAI,sDAAsD,CAAC;IACrE,UAAU,IAAI,iCAAiC,CAAC;IAChD,UAAU,IAAI,oCAAoC,CAAC;IACnD,UAAU,IAAI,kCAAkC,CAAC;IACjD,UAAU,IAAI,kFAAkF,CAAC;IACjG,UAAU,IAAI,qBAAqB,CAAC;IACpC,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -56,42 +56,3 @@ This session is managed by Codeman and runs inside tmux (`CODEMAN_MUX=1` confirm
56
56
  - NEVER kill your own session: no `tmux kill-session`, `pkill tmux`, or `pkill claude`.
57
57
  - The session persists across disconnects — your work is safe.
58
58
  - Hooks may auto-format or validate after writes; unexpected tool behavior usually means a hook ran. Keep working.
59
-
60
- ## Ralph Loop (Codeman Autonomous Mode)
61
-
62
- Start: `/ralph-loop:ralph-loop` · Cancel: `/ralph-loop:cancel-ralph` · Help: `/ralph-loop:help`
63
-
64
- You are in a Ralph loop when the prompt contains a completion phrase (e.g. `<promise>COMPLETE</promise>`). While looping:
65
-
66
- - Work incrementally: one sub-task at a time — implement, verify, commit, move on.
67
- - Fix failing tests and lint errors before starting the next task.
68
- - Check `git log --oneline -10` / `git diff HEAD~1` before retrying an approach that already failed.
69
- - Keep testing to ~20% of total effort; prioritize implementation. Don't refactor working code or add unrequested
70
- features as busy work.
71
- - If the prompt sets a minimum duration (e.g. "work for 4 hours"), record the start time (`date +%s`) and, when the
72
- primary tasks finish early, keep generating useful related work (edge cases, coverage, docs, cleanup, hardening)
73
- until the minimum time is reached.
74
-
75
- Output the completion phrase ONLY when every requirement is verifiably done: all tests pass, lint is clean, the build
76
- succeeds, and changes are committed. Never output it early — and never withhold it for busy work once everything is
77
- genuinely done.
78
-
79
- ### RALPH_STATUS block (required)
80
-
81
- End EVERY response during a Ralph loop with exactly this block — Codeman parses it to track the loop:
82
-
83
- ```
84
- ---RALPH_STATUS---
85
- STATUS: IN_PROGRESS | COMPLETE | BLOCKED
86
- TASKS_COMPLETED_THIS_LOOP: <number>
87
- FILES_MODIFIED: <number>
88
- TESTS_STATUS: PASSING | FAILING | NOT_RUN
89
- WORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
90
- EXIT_SIGNAL: false | true
91
- RECOMMENDATION: <one line: what to do next>
92
- ---END_RALPH_STATUS---
93
- ```
94
-
95
- - `EXIT_SIGNAL: true` only when ALL tasks are verifiably done — then also output the completion phrase.
96
- - `STATUS: BLOCKED` when you need human input; describe the blocker in RECOMMENDATION.
97
- - Never set `EXIT_SIGNAL: true` while tests are failing.
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAgD,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAS1G,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAElD,8EAA8E;AAC9E,UAAU,SAAS;IACjB,YAAY,EAAE,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACnE,YAAY,EAAE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxD,cAAc,EAAE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC3D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,CAwHtF;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,GAAG,IAAI,CAazF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAgDlF"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAgD,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAS1G,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAElD,8EAA8E;AAC9E,UAAU,SAAS;IACjB,YAAY,EAAE,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACnE,YAAY,EAAE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxD,cAAc,EAAE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC3D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,CAwHtF;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,GAAG,IAAI,CAazF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAqDlF"}
@@ -166,7 +166,12 @@ export function registerSecurityHeaders(app, https) {
166
166
  const gesture = process.env.CODEMAN_GESTURE === '1';
167
167
  const scriptSrc = "script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net" + (gesture ? " 'wasm-unsafe-eval'" : '');
168
168
  const connectSrc = "connect-src 'self' wss://api.deepgram.com";
169
- const workerSrc = gesture ? "; worker-src 'self' blob:" : '';
169
+ // blob: workers are needed unconditionally: terminal-ui's _safeYield tick
170
+ // worker (throttling escape) is created from a Blob URL. Without this, every
171
+ // page load logs a CSP violation and the worker leg of _safeYield is dead.
172
+ // Risk is minimal — only same-origin scripts (already governed by script-src)
173
+ // can construct blob workers.
174
+ const workerSrc = "; worker-src 'self' blob:";
170
175
  const csp = `default-src 'self'; ${scriptSrc}; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; ` +
171
176
  `img-src 'self' data: blob:; ${connectSrc}; font-src 'self' https://cdn.jsdelivr.net; frame-ancestors 'self'${workerSrc}`;
172
177
  app.addHook('onRequest', (req, reply, done) => {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/web/middleware/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/web/middleware/auth.ts"],"names":[],"mappings":"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"}
Binary file
@@ -1886,14 +1886,14 @@
1886
1886
  <script defer src="keyboard-accessory.bc753cc7.js"></script>
1887
1887
  <script defer src="input-cjk.b8686b5e.js"></script>
1888
1888
  <script defer src="app.a8663e79.js"></script>
1889
- <script defer src="terminal-ui.6ce91b0b.js"></script>
1889
+ <script defer src="terminal-ui.0e930cb3.js"></script>
1890
1890
  <script defer src="respawn-ui.2d249da9.js"></script>
1891
1891
  <script defer src="ralph-panel.6de2d0f8.js"></script>
1892
1892
  <script defer src="orchestrator-panel.js"></script>
1893
1893
  <script defer src="settings-ui.21b009ca.js"></script>
1894
1894
  <script defer src="panels-ui.6bb3169f.js"></script>
1895
1895
  <script defer src="session-ui.512816d8.js"></script>
1896
- <script defer src="ralph-wizard.a6b2d36b.js"></script>
1896
+ <script defer src="ralph-wizard.13a1831e.js"></script>
1897
1897
  <script defer src="api-client.c9b1cddc.js"></script>
1898
1898
  <script defer src="subagent-windows.a366a4ad.js"></script>
1899
1899
  <script defer src="image-input.0ea86695.js"></script>
Binary file
Binary file
@@ -378,7 +378,10 @@ Object.assign(CodemanApp.prototype, {
378
378
  prompt += `Output \`<promise>${config.completionPhrase}</promise>\` when done\n\n`;
379
379
 
380
380
  prompt += '## If Stuck\n';
381
- prompt += 'Output `<promise>BLOCKED</promise>` with explanation';
381
+ prompt += 'Output `<promise>BLOCKED</promise>` with explanation\n\n';
382
+
383
+ prompt += '## Status Reporting\n';
384
+ prompt += '• End every response with a `RALPH_STATUS` block (parsed by Codeman)';
382
385
 
383
386
  // Show preview with highlighting (escape first, then apply formatting)
384
387
  const escapedPrompt = escapeHtml(prompt);
Binary file
@@ -0,0 +1,3 @@
1
+ "use strict";(function(e){const s=/^\x1b\[[\?>=]?[\d;]*[cnR]$/,i=/^\x1b\][\d;]*[^\x07\x1b]*(?:\x07|\x1b\\)$/;function n(o){return s.test(o)||i.test(o)}function l(o){return n(o)}e.CodemanTerminalInput={isTerminalQueryResponse:n,shouldSuppressTerminalQueryResponse:l}})(window),Object.assign(CodemanApp.prototype,{initTerminal(){const e=parseInt(localStorage.getItem("codeman-scrollback")),s=Number.isFinite(e)&&e>0?Math.max(e,DEFAULT_SCROLLBACK):DEFAULT_SCROLLBACK;if(this.terminal=new Terminal({theme:{background:"#0d0d0d",foreground:"#e0e0e0",cursor:"#e0e0e0",cursorAccent:"#0d0d0d",selection:"rgba(255, 255, 255, 0.3)",black:"#0d0d0d",red:"#ff6b6b",green:"#51cf66",yellow:"#ffd43b",blue:"#339af0",magenta:"#cc5de8",cyan:"#22b8cf",white:"#e0e0e0",brightBlack:"#495057",brightRed:"#ff8787",brightGreen:"#69db7c",brightYellow:"#ffe066",brightBlue:"#5c7cfa",brightMagenta:"#da77f2",brightCyan:"#66d9e8",brightWhite:"#ffffff"},fontFamily:'"Fira Code", "Cascadia Code", "JetBrains Mono", "SF Mono", Monaco, monospace',fontSize:MobileDetection.getDeviceType()==="mobile"?10:14,lineHeight:1.2,cursorBlink:!1,cursorStyle:"block",scrollback:s,allowTransparency:!0,allowProposedApi:!0}),this.fitAddon=new FitAddon.FitAddon,this.terminal.loadAddon(this.fitAddon),typeof Unicode11Addon<"u")try{const t=new Unicode11Addon.Unicode11Addon;this.terminal.loadAddon(t),this.terminal.unicode.activeVersion="11"}catch{}const i=document.getElementById("terminalContainer");this.terminal.open(i),this.terminal.attachCustomKeyEventHandler(t=>{if(t.isComposing||t.keyCode===229||t.altKey&&t.key>="0"&&t.key<="9")return!1;if((t.ctrlKey||t.metaKey)&&t.key==="v"&&t.type==="keydown")return this.activeSessionId&&this._handleImagePaste&&this._handleImagePaste(),!1;if(t.key==="Enter"&&(t.shiftKey||t.ctrlKey)&&t.type==="keydown"){if(this.activeSessionId)if(this._localEchoEnabled){const d=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),d&&(this._pendingInput+=d,y()),setTimeout(()=>{fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:t.ctrlKey?"C-Enter":"S-Enter"})})},d?80:0)}else fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:t.ctrlKey?"C-Enter":"S-Enter"})});return!1}return!0});{const t=i.querySelector(".xterm-helper-textarea");if(t&&MobileDetection.isTouchDevice()){let d=!1,f=0;t.addEventListener("compositionstart",()=>{d=!0}),t.addEventListener("compositionend",()=>{d=!1}),t.addEventListener("keydown",c=>{!c.isComposing&&c.keyCode!==229&&(f=Date.now())}),t.addEventListener("input",c=>{if(d||c.isComposing||c.inputType!=="insertText"||!c.data||Date.now()-f<50)return;const h=c.data,p=this._localEchoOverlay?.pendingText||"";Promise.resolve().then(()=>{if(this._lastTerminalData?.data===h&&performance.now()-this._lastTerminalData.time<100){t.value="";return}const _=this._localEchoOverlay?.pendingText||"";if(this._localEchoEnabled&&_.length>p.length&&_.endsWith(h)){t.value="";return}const g=t.value;!g||g.trim()===""&&h!==" "||(this.terminal._core.coreService.triggerDataEvent(h,!0),t.value="")})})}}this._webglAddon=null;const n=new URLSearchParams(location.search);if(n.get("webgl")==="force")try{localStorage.removeItem("codeman-webgl-disabled")}catch{}const l=(()=>{try{const t=localStorage.getItem("codeman-webgl-disabled");if(!t)return!1;const{at:d}=JSON.parse(t);return Date.now()-d>WEBGL_FALLBACK.STICKY_EXPIRY_MS?(localStorage.removeItem("codeman-webgl-disabled"),!1):!0}catch{return!1}})(),o=MobileDetection.getDeviceType()!=="desktop"||n.has("nowebgl")||l;if(l&&console.log("[CRASH-DIAG] WebGL sticky-disabled from prior stalls \u2014 DOM renderer in use. Re-enable: ?webgl=force"),!o)if(typeof WebglAddon<"u")this._initWebGL();else{const t=document.createElement("script");t.src="vendor/xterm-addon-webgl.min.js",t.onload=()=>this._initWebGL(),t.onerror=()=>console.warn("[CRASH-DIAG] Failed to load WebGL addon \u2014 using canvas renderer"),document.head.appendChild(t)}this._localEchoOverlay=new LocalEchoOverlay(this.terminal),MobileDetection.isTouchDevice()&&(this.terminal.onCursorMove(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onRender(()=>this._syncMobileHelperTextareaToCursor())),this._cjkInput=null,typeof CjkInput<"u"&&(this._cjkInput=CjkInput.init({send:t=>{this._handleCjkInput(t)}})),MobileDetection.getDeviceType()==="mobile"&&document.body.classList.contains("safari-browser")?requestAnimationFrame(()=>{this.fitAddon.fit(),requestAnimationFrame(()=>this.fitAddon.fit())}):this.fitAddon.fit(),this.registerFilePathLinkProvider(),i.addEventListener("wheel",t=>{t.preventDefault();const d=Math.round(t.deltaY/25)||(t.deltaY>0?1:-1);this.terminal.scrollLines(d)},{passive:!1});{const t=()=>this.terminal._core?._renderService?.dimensions?.css?.cell?.height||13;let d=0,f=0,c=0,h=null,p=!1;const _=b=>{const E=c?(b-c)/16.67:1;if(c=b,!p&&Math.abs(f)>.3){const T=Math.round(f/t());T!==0&&this.terminal.scrollLines(T),f*=.92,h=requestAnimationFrame(_)}else p?h=requestAnimationFrame(_):(h=null,f=0)};let g=0,v=!1;i.addEventListener("touchstart",b=>{b.touches.length===1&&(d=b.touches[0].clientY,f=0,g=0,p=!0,v=!1,c=0,h&&(cancelAnimationFrame(h),h=null))},{passive:!0}),i.addEventListener("touchmove",b=>{if(b.touches.length===1&&p){b.preventDefault(),v=!0;const E=b.touches[0].clientY,T=d-E;g+=T,f=T*1.2,d=E;const x=t(),S=Math.trunc(g/x);S!==0&&(this.terminal.scrollLines(S),g-=S*x)}},{passive:!1}),i.addEventListener("touchend",()=>{if(p=!1,!h&&Math.abs(f)>.3&&(h=requestAnimationFrame(_)),!v&&this.terminal){const b=document.getElementById("cjkInput");b?.classList.contains("cjk-input-visible")?b.focus():(this._syncMobileHelperTextareaToCursor(),this.terminal.focus())}},{passive:!0}),i.addEventListener("touchcancel",()=>{p=!1,f=0,g=0},{passive:!0})}this.showWelcome(),this.initImageInput(),this._chunkedWriteGen=0,this._bufferLoadSeq=0,this._bufferLoadOwner=null,this._resizeTimeout=null,this._lastResizeDims=null;const u=40,a=10,m=()=>{this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._resizeTimeout=null,this.fitAddon&&this.fitAddon.fit(),this.flickerFilterBuffer&&(this.flickerFilterTimeout&&(clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=null),this.flushFlickerBuffer());const t=typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible;if(this.activeSessionId&&!t){const d=this.fitAddon.proposeDimensions(),f=d?Math.max(d.cols,u):u,c=d?Math.max(d.rows,a):a;if(!this._lastResizeDims||f!==this._lastResizeDims.cols||c!==this._lastResizeDims.rows){const h=this.activeSessionId?this.sessions.get(this.activeSessionId):null;h&&h.mode!=="shell"&&this.terminal&&this.isTerminalAtBottom()&&this.terminal.write("\x1B[3J\x1B[H\x1B[2J"),this._lastResizeDims={cols:f,rows:c};const p=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():"desktop";let _=!1;if(this._wsReady&&this._wsSessionId===this.activeSessionId)try{this._ws.send(JSON.stringify({t:"z",c:f,r:c,v:p})),_=!0}catch{}_||fetch(`/api/sessions/${this.activeSessionId}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cols:f,rows:c,viewportType:p})}).catch(()=>{})}}this.updateConnectionLines(),this._localEchoOverlay?.hasPending&&this._localEchoOverlay.rerender()},300)};window.addEventListener("resize",m),this.terminalResizeObserver&&this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=new ResizeObserver(m),this.terminalResizeObserver.observe(i),this._pendingInput="",this._inputFlushTimeout=null,this._lastKeystrokeTime=0;const y=()=>{if(this._inputFlushTimeout=null,this._pendingInput&&this.activeSessionId){const t=this._pendingInput,d=this.activeSessionId;this._pendingInput="",this._sendInputAsync(d,t)}};this.terminal.onData(t=>{if(!(window.cjkActive||document.activeElement?.id==="cjkInput")&&this.activeSessionId){if(window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(t))return;if(this._lastTerminalData={data:t,time:performance.now()},this._localEchoEnabled){if(t==="\x7F"){if(this._localEchoOverlay?.removeChar()==="flushed"){const{count:c,text:h}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(this.activeSessionId)&&(c===0?(this._flushedOffsets.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId)):(this._flushedOffsets.set(this.activeSessionId,c),this._flushedTexts?.set(this.activeSessionId,h))),this._pendingInput+=t,y()}return}if(/^[\r\n]+$/.test(t)){const f=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),f&&(this._pendingInput+=f,y()),setTimeout(()=>{this._pendingInput+="\r",y()},80);return}if(t.length>1&&t.charCodeAt(0)>=32){this._localEchoOverlay?.appendText(t);return}if(t.charCodeAt(0)<32){if(t.length>1&&t.charCodeAt(0)===27){this._pendingInput+=t,y();return}if(this._restoringFlushedState){this._pendingInput+=t,y();return}if(t===" "){const c=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),c&&(this._pendingInput+=c),this._pendingInput+=t,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null);let h="";try{const _=this._localEchoOverlay?.findPrompt?.();if(_){const g=this.terminal.buffer.active,v=g.getLine(g.viewportY+_.row);v&&(h=v.translateToString(!0).slice(_.col+2).trimEnd())}}catch{}this._tabCompletionBaseText=h,y(),this._tabCompletionSessionId=this.activeSessionId,this._tabCompletionRetries=0,this._tabCompletionFallback&&clearTimeout(this._tabCompletionFallback);const p=this;this._tabCompletionFallback=setTimeout(()=>{if(p._tabCompletionFallback=null,!p._tabCompletionSessionId||p._tabCompletionSessionId!==p.activeSessionId)return;const _=p._localEchoOverlay;!_||_.pendingText||p.terminal.write("",()=>{if(!p._tabCompletionSessionId)return;_.resetBufferDetection();const g=_.detectBufferText();g&&g!==p._tabCompletionBaseText&&(p._tabCompletionSessionId=null,p._tabCompletionRetries=0,p._tabCompletionBaseText=null,_.rerender())})},300);return}const f=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),f&&(this._pendingInput+=f),this._pendingInput+=t,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),y();return}if(t.length===1&&t.charCodeAt(0)>=32){this._localEchoOverlay?.addChar(t);return}}if(this._pendingInput+=t,t.charCodeAt(0)<32||t.length>1){this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),y();return}const d=performance.now();d-this._lastKeystrokeTime>50?(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._lastKeystrokeTime=d,y()):(this._lastKeystrokeTime=d,this._inputFlushTimeout||(this._inputFlushTimeout=setTimeout(y,0)))}})},registerFilePathLinkProvider(){const e=this;let s=-1;this.terminal.registerLinkProvider({provideLinks(i,n){i!==s&&(s=i,console.debug("[LinkProvider] Checking line:",i));const o=e.terminal.buffer.active.getLine(i-1);if(!o){n(void 0);return}const r=o.translateToString(!0);if(!r||!r.includes("/")){n(void 0);return}const u=[],a=/https?:\/\/[^\s"'<>|;&)\]\x00-\x1f]+/g,m=(h,p)=>{const _=h.replace(/[.,;:!?)]+$/,""),g=r.indexOf(_,p);g!==-1&&(u.some(v=>v.range.start.x===g+1)||u.push({text:_,range:{start:{x:g+1,y:i},end:{x:g+_.length+1,y:i}},decorations:{pointerCursor:!0,underline:!0},activate(v,b){window.open(b,"_blank","noopener,noreferrer")}}))},y=/\b(tail|cat|head|less|grep|watch|vim|nano)\s+(?:[^\s\/]+\s+){0,4}(\/[^\s"'<>|;&\n\x00-\x1f]+)/g,t=/(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\n\x00-\x1f]*\.(?:log|txt|json|md|yaml|yml|csv|xml|sh|py|ts|js))\b/g,d=/Bash\([^)]*?(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\)\n\x00-\x1f]+)/g,f=(h,p)=>{const _=r.indexOf(h,p);_!==-1&&(u.some(g=>g.range.start.x===_+1)||u.push({text:h,range:{start:{x:_+1,y:i},end:{x:_+h.length+1,y:i}},decorations:{pointerCursor:!0,underline:!0},activate(g,v){e.openLogViewerWindow(v,e.activeSessionId)}}))};let c;for(a.lastIndex=0;(c=a.exec(r))!==null;)m(c[0],c.index);for(y.lastIndex=0;(c=y.exec(r))!==null;)f(c[2],c.index);for(t.lastIndex=0;(c=t.exec(r))!==null;)f(c[1],c.index);for(d.lastIndex=0;(c=d.exec(r))!==null;)f(c[1],c.index);u.length>0&&console.debug("[LinkProvider] Found links:",u.map(h=>h.text)),n(u.length>0?u:void 0)}}),console.log("[LinkProvider] File path link provider registered")},showWelcome(){const e=document.getElementById("welcomeOverlay");e&&(e.classList.add("visible"),this.loadTunnelStatus(),this.loadHistorySessions())},hideWelcome(){const e=document.getElementById("welcomeOverlay");e&&e.classList.remove("visible");const s=document.getElementById("welcomeQr");s&&(clearTimeout(this._welcomeQrShrinkTimer),s.classList.remove("expanded"))},async _fetchHistorySessions(){const i=(await(await fetch("/api/history/sessions")).json()).data?.sessions||[];if(i.length===0)return[];const n=new Map;for(const o of i){const r=o.projectKey||o.workingDir;n.has(r)||n.set(r,[]),n.get(r).push(o)}const l=[];for(const[,o]of n)l.push(...o.slice(0,3));return l.sort((o,r)=>new Date(r.lastModified)-new Date(o.lastModified)),l},_resolveCaseLabel(e,s){if(!e)return"";let i=null;for(const n of s||[])if(!(!n||!n.path)){if(e===n.path)return`#${n.name}`;if(e.startsWith(n.path+"/")){const l=n.path.length;(!i||l>i.len)&&(i={name:n.name,suffix:e.slice(l),len:l})}}return i?`#${i.name}${i.suffix}`:e.split("/").pop()||e},_shortenHomePath(e){return(e||"").replace(/^\/home\/[^/]+\//,"~/").replace(/^\/Users\/[^/]+\//,"~/")},_buildHistoryItem(e,s,i){const n=i?.showViewAll!==!1,l=e.sizeBytes<1024?`${e.sizeBytes}B`:e.sizeBytes<1048576?`${(e.sizeBytes/1024).toFixed(0)}K`:`${(e.sizeBytes/1048576).toFixed(1)}M`,o=new Date(e.lastModified),r=o.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+o.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1}),u=this._shortenHomePath(e.workingDir),a=this._resolveCaseLabel(e.workingDir,s),m=document.createElement("div");m.className="history-item",m.title=e.workingDir;const y=document.createElement("div");y.className="history-item-main",y.addEventListener("click",()=>this.resumeHistorySession(e.sessionId,e.workingDir));const t=document.createElement("div");t.className="history-item-text";const d=document.createElement("span");d.className="history-item-title",d.textContent=e.firstPrompt||u;const f=document.createElement("span");f.className="history-item-subtitle",a.startsWith("#")&&f.classList.add("is-case"),f.textContent=a,t.append(d,f);const c=document.createElement("span");c.className="history-item-meta",c.textContent=r;const h=document.createElement("button");h.className="history-item-expand",h.type="button",h.setAttribute("aria-label","Show details"),h.setAttribute("aria-expanded","false"),h.textContent="\u22EF",y.append(t,c,h);const p=document.createElement("div");p.className="history-item-detail",p.hidden=!0;const _=document.createElement("div");_.className="history-detail-row";const g=document.createElement("span");g.className="history-detail-label",g.textContent="Prompt";const v=document.createElement("span");v.className="history-detail-value history-detail-prompt",v.textContent=e.firstPrompt||"(no prompt captured)",_.append(g,v);const b=document.createElement("div");b.className="history-detail-row";const E=document.createElement("span");E.className="history-detail-label",E.textContent="Path";const T=document.createElement("span");T.className="history-detail-value history-detail-path",T.textContent=u,b.append(E,T);const x=document.createElement("div");if(x.className="history-detail-row history-detail-meta",x.textContent=`${r} \xB7 ${l} \xB7 ${e.sessionId.slice(0,8)}`,p.append(_,b,x),n&&e.projectKey){const S=document.createElement("div");S.className="history-detail-row history-detail-actions";const w=document.createElement("button");w.type="button",w.className="history-view-all-btn",w.textContent="View all in this folder",w.addEventListener("click",I=>{I.stopPropagation(),this.openFolderHistoryModal(e.projectKey,e.workingDir,s)}),S.appendChild(w),p.appendChild(S)}return h.addEventListener("click",S=>{S.stopPropagation();const w=m.classList.toggle("expanded");p.hidden=!w,h.setAttribute("aria-expanded",w?"true":"false")}),m.append(y,p),m},_HISTORY_INITIAL_COUNT:4,async loadHistorySessions(){const e=document.getElementById("historySessions"),s=document.getElementById("historyList");if(!(!e||!s))try{const i=Array.isArray(this.cases)&&this.cases.length>0?Promise.resolve(this.cases):fetch("/api/cases").then(r=>r.ok?r.json():null).then(r=>r?.data||[]).catch(()=>[]),[n,l]=await Promise.all([this._fetchHistorySessions(30),i]);if(n.length===0){e.style.display="none";return}s.replaceChildren();const o=this._HISTORY_INITIAL_COUNT;for(let r=0;r<Math.min(o,n.length);r++)s.appendChild(this._buildHistoryItem(n[r],l));if(n.length>o){const r=document.createElement("button");r.className="history-show-more",r.textContent=`Show ${n.length-o} more`,r.addEventListener("click",()=>{for(let u=o;u<n.length;u++)s.insertBefore(this._buildHistoryItem(n[u],l),r);r.remove()}),s.appendChild(r)}e.style.display=""}catch(i){console.error("[loadHistorySessions]",i),e.style.display="none"}},_FOLDER_HISTORY_PAGE_SIZE:20,openFolderHistoryModal(e,s,i){this._closeFolderHistoryModal();const n=document.createElement("div");n.className="modal active folder-history-modal",n.id="folderHistoryModal";const l=document.createElement("div");l.className="modal-backdrop",l.addEventListener("click",()=>this._closeFolderHistoryModal());const o=document.createElement("div");o.className="modal-content modal-lg";const r=document.createElement("div");r.className="modal-header";const u=document.createElement("h3");u.textContent="Folder History";const a=document.createElement("div");a.className="folder-history-subtitle",a.textContent=this._shortenHomePath(s);const m=document.createElement("button");m.className="modal-close",m.setAttribute("aria-label","Close"),m.innerHTML="&times;",m.addEventListener("click",()=>this._closeFolderHistoryModal()),r.append(u,m);const y=document.createElement("div");y.className="modal-body";const t=document.createElement("div");t.className="folder-history-list",t.setAttribute("data-loading","true"),t.textContent="Loading...",y.append(a,t),o.append(r,y),n.append(l,o),document.body.appendChild(n),this._folderHistoryState={projectKey:e,workingDir:s,cases:i||[],offset:0,total:null,list:t},this._folderHistoryEscHandler=d=>{d.key==="Escape"&&this._closeFolderHistoryModal()},document.addEventListener("keydown",this._folderHistoryEscHandler),this._loadFolderHistoryPage()},async _loadFolderHistoryPage(){const e=this._folderHistoryState;if(!e)return;const{projectKey:s,cases:i,list:n}=e,l=this._FOLDER_HISTORY_PAGE_SIZE,o=e.offset,r=n.querySelector(".folder-history-more");r&&r.remove(),o===0&&(n.replaceChildren(),n.removeAttribute("data-loading"));try{const u=`/api/history/sessions?projectKey=${encodeURIComponent(s)}&offset=${o}&limit=${l}`,m=await(await fetch(u)).json(),y=m.data?.sessions||[];if(e.total=typeof m.data?.total=="number"?m.data.total:y.length+o,o===0&&y.length===0){const t=document.createElement("div");t.className="folder-history-empty",t.textContent="No conversations found in this folder.",n.appendChild(t);return}for(const t of y)n.appendChild(this._buildHistoryItem(t,i,{showViewAll:!1}));if(e.offset=o+y.length,e.offset<e.total){const t=e.total-e.offset,d=document.createElement("button");d.className="history-show-more folder-history-more",d.textContent=`Show ${Math.min(l,t)} more (${t} remaining)`,d.addEventListener("click",()=>this._loadFolderHistoryPage()),n.appendChild(d)}}catch(u){console.error("[loadFolderHistoryPage]",u);const a=document.createElement("div");a.className="folder-history-empty",a.textContent="Failed to load folder history.",n.appendChild(a)}},_closeFolderHistoryModal(){const e=document.getElementById("folderHistoryModal");e&&e.remove(),this._folderHistoryEscHandler&&(document.removeEventListener("keydown",this._folderHistoryEscHandler),this._folderHistoryEscHandler=null),this._folderHistoryState=null},async resumeHistorySession(e,s){document.getElementById("runModeMenu")?.classList.remove("active"),this._closeFolderHistoryModal();try{this.terminal.clear(),this.terminal.writeln(`\x1B[1;32m Resuming conversation ${e.slice(0,8)}...\x1B[0m`);const i=s.split("/").pop()||"session";let n=1;for(const[,f]of this.sessions){const c=f.name&&f.name.match(/^w(\d+)-/);if(c){const h=parseInt(c[1]);h>=n&&(n=h+1)}}const l=`w${n}-${i}`,r=(this.cases||[]).find(f=>f.path===s)?.name||s.split("/").pop()||"",u=this.loadAppSettingsFromStorage(),a=this.buildEnvOverrides(this.getCaseSettings(r),u),m=this.getEffortSetting(u),t=await(await fetch("/api/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({workingDir:s,name:l,resumeSessionId:e,...Object.keys(a).length>0?{envOverrides:a}:{},...m?{effort:m}:{}})})).json();if(!t.success)throw new Error(t.error);const d=t.data.session.id;await fetch(`/api/sessions/${d}/interactive`,{method:"POST"}),this.terminal.writeln(`\x1B[90m Session ${l} ready\x1B[0m`),await this.selectSession(d),this.terminal.focus()}catch(i){this.terminal.writeln(`\x1B[1;31m Error: ${i.message}\x1B[0m`)}},isTerminalAtBottom(){if(!this.terminal)return!0;const e=this.terminal.buffer.active;return e.viewportY>=e.baseY-2},batchTerminalWrite(e){if(this._isLoadingBuffer){this._loadBufferQueue&&this._loadBufferQueue.push(e);return}if(this.writeFrameScheduled||(this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()),(this.activeSessionId?this.sessions.get(this.activeSessionId):null)?.flickerFilterEnabled??!1){if(e.includes("\x1B[2J")||e.includes("\x1B[H\x1B[J")||e.includes("\x1B[H")&&e.includes("\x1B[?25l")){this.flickerFilterActive=!0,this.flickerFilterBuffer+=e,this.flickerFilterTimeout&&clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=setTimeout(()=>{this.flickerFilterTimeout=null,this.flushFlickerBuffer()},SYNC_WAIT_TIMEOUT_MS);return}if(this.flickerFilterActive){this.flickerFilterBuffer+=e;return}}this.pendingWrites.push(e),this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1}))},flushFlickerBuffer(){this.flickerFilterBuffer&&(this.pendingWrites.push(this.flickerFilterBuffer),this.flickerFilterBuffer="",this.flickerFilterActive=!1,this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1})))},_updateLocalEchoState(){const e=this.loadAppSettingsFromStorage(),s=this.activeSessionId?this.sessions.get(this.activeSessionId):null,n=!!((e.localEchoEnabled??MobileDetection.isTouchDevice())&&s);this._localEchoEnabled&&!n&&this._localEchoOverlay?.clear(),this._localEchoEnabled=n,this._localEchoOverlay&&s&&(s.mode==="opencode"?this._localEchoOverlay.setPrompt({type:"custom",offset:3,find:l=>{try{const o=l.buffer.active,r=o.cursorY,u=o.getLine(o.viewportY+r);if(!u)return null;const m=u.translateToString(!0).indexOf("\u2503");return m>=0?{row:r,col:m}:null}catch{return null}}}):s.mode==="shell"?(this._localEchoOverlay.clear(),this._localEchoEnabled=!1):this._localEchoOverlay.setPrompt({type:"custom",offset:0,find:l=>{try{const o=l.buffer.active;for(let r=l.rows-1;r>=0;r--){const u=o.getLine(o.viewportY+r);if(!u)continue;const m=u.translateToString(!0).lastIndexOf("\u276F");if(m>=0)return{row:r,col:m+2}}return{row:Math.max(0,Math.min(l.rows-1,o.cursorY)),col:Math.max(0,Math.min(l.cols-1,o.cursorX))}}catch{return null}}}))},_handleCjkInput(e){if(!this.activeSessionId)return;const s=this.activeSessionId,i=this.sessions.get(s);if(!!!(this._localEchoEnabled&&this._localEchoOverlay&&i?.mode!=="shell")){this._sendInputAsync(s,e);return}if(e==="\x7F"){if(this._localEchoOverlay.removeChar()==="flushed"){const{count:o,text:r}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(s)&&(o===0?(this._flushedOffsets.delete(s),this._flushedTexts?.delete(s)):(this._flushedOffsets.set(s,o),this._flushedTexts?.set(s,r))),this._sendInputAsync(s,e)}return}if(/[\r\n]+$/.test(e)){const l=e.replace(/[\r\n]+$/g,"");l&&this._localEchoOverlay.appendText(l);const o=this._localEchoOverlay.pendingText||"";this._localEchoOverlay.clear(),this._localEchoOverlay.suppressBufferDetection(),this._flushedOffsets?.delete(s),this._flushedTexts?.delete(s),o&&this._sendInputAsync(s,o),setTimeout(()=>this._sendInputAsync(s,"\r"),o?80:0);return}if(e.length>1&&e.charCodeAt(0)===27){this._sendInputAsync(s,e);return}if(e.length===1&&e.charCodeAt(0)<32){const l=this._localEchoOverlay.pendingText||"";this._localEchoOverlay.clear(),this._localEchoOverlay.suppressBufferDetection(),this._flushedOffsets?.delete(s),this._flushedTexts?.delete(s),l&&this._sendInputAsync(s,l),this._sendInputAsync(s,e);return}this._localEchoOverlay.appendText(e)},flushPendingWrites(){if(this.pendingWrites.length===0||!this.terminal)return;const e=performance.now(),s=this.pendingWrites.join("");this.pendingWrites=[];const i=s.length;i>16384&&_crashDiag.log(`FLUSH: ${(i/1024).toFixed(0)}KB`);const n=65536;let l=!1;i<=n?this.terminal.write(s):(this.terminal.write(s.slice(0,n)),this.pendingWrites.push(s.slice(n)),l=!0,this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1})));const o=l?n:i,r=performance.now()-e;if((r>100||l)&&console.warn(`[CRASH-DIAG] flushPendingWrites: ${r.toFixed(0)}ms, ${(o/1024).toFixed(0)}KB written${l?", rest deferred":""} (total ${(i/1024).toFixed(0)}KB)`),this._wasAtBottomBeforeWrite&&this.terminal.scrollToBottom(),this._localEchoOverlay?.hasPending&&this._localEchoOverlay.rerender(),this._tabCompletionSessionId&&this._tabCompletionSessionId===this.activeSessionId&&this._localEchoOverlay&&!this._localEchoOverlay.pendingText){const u=this._localEchoOverlay,a=this;this.terminal.write("",()=>{if(!a._tabCompletionSessionId)return;u.resetBufferDetection();const m=u.detectBufferText();m?m===a._tabCompletionBaseText?(u.undoDetection(),a._tabCompletionRetries=(a._tabCompletionRetries||0)+1,a._tabCompletionRetries>60&&(a._tabCompletionSessionId=null,a._tabCompletionRetries=0)):(a._tabCompletionSessionId=null,a._tabCompletionRetries=0,a._tabCompletionBaseText=null,a._tabCompletionFallback&&(clearTimeout(a._tabCompletionFallback),a._tabCompletionFallback=null),u.rerender()):(a._tabCompletionRetries=(a._tabCompletionRetries||0)+1,a._tabCompletionRetries>60&&(a._tabCompletionSessionId=null,a._tabCompletionRetries=0))})}},_safeYield(e){let s=!1;const i=()=>{s||(s=!0,e())};requestAnimationFrame(i),setTimeout(i,50),this._workerYield(i)},_workerYield(e){try{if(this._yieldWorker===void 0){const s="onmessage=()=>setTimeout(()=>postMessage(0),0);",i=new Blob([s],{type:"application/javascript"}),n=URL.createObjectURL(i);this._yieldWorker=new Worker(n),URL.revokeObjectURL(n),this._yieldQueue=[],this._yieldWorker.onmessage=()=>{const l=this._yieldQueue.shift();l&&l()}}if(!this._yieldWorker)return;this._yieldQueue.push(e),this._yieldWorker.postMessage(0)}catch{this._yieldWorker=null}},scrollToLastNonEmptyLine(){if(!this.terminal?.buffer?.active){this.terminal?.scrollToBottom?.();return}const e=this.terminal.buffer.active,s=e.baseY+e.length;let i=-1;for(let n=s-1;n>=0;n--)if(e.getLine(n)?.translateToString(!0).trim()){i=n;break}if(i>=0&&typeof this.terminal.scrollToLine=="function"){let n=Math.max(0,i-this.terminal.rows+2);const l=Math.max(0,i);for(;n<l&&!e.getLine(n)?.translateToString(!0).trim();)n++;this.terminal.scrollToLine(n)}else this.terminal.scrollToBottom()},chunkedTerminalWrite(e,s=TERMINAL_CHUNK_SIZE,i){const n=++this._chunkedWriteGen,l=this._beginBufferLoad(i);return new Promise(o=>{if(!e||e.length===0){this._finishBufferLoad(l),o();return}const r=e.replace(DEC_SYNC_STRIP_RE,""),u=()=>{this._chunkedWriteGen===n&&this._finishBufferLoad(l),o()};if(r.length<=s){this.terminal.write(r,u);return}let a=0;const m=performance.now();let y=0;const t=()=>{if(this._chunkedWriteGen!==n){o();return}if(a>=r.length){const h=performance.now()-m;console.log(`[CRASH-DIAG] chunkedTerminalWrite complete: ${r.length} bytes in ${y} chunks, ${h.toFixed(0)}ms total`),this._safeYield(u);return}const d=performance.now(),f=r.slice(a,a+s);this.terminal.write(f);const c=performance.now()-d;y++,c>50&&console.warn(`[CRASH-DIAG] chunk #${y} write took ${c.toFixed(0)}ms (${f.length} bytes at offset ${a})`),a+=s,this._safeYield(t)};this._safeYield(t)})},_beginBufferLoad(e){this._bufferLoadSeq===void 0&&(this._bufferLoadSeq=0);const s=e===void 0?`buffer-${++this._bufferLoadSeq}`:e;return this._bufferLoadOwner=s,this._isLoadingBuffer=!0,this._loadBufferQueue=[],s},_finishBufferLoad(e){return e!==void 0&&this._bufferLoadOwner!==e?!1:(this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._bufferLoadOwner=null,!0)},clearTerminal(){this.terminal.clear()},async restoreTerminalSize(){if(!this.activeSessionId){this.showToast("No active session","warning");return}const e=this.getTerminalDimensions();if(!e){this.showToast("Could not determine terminal size","error");return}try{await this.sendResize(this.activeSessionId),this.showToast(`Terminal restored to ${e.cols}x${e.rows}`,"success")}catch(s){console.error("Failed to restore terminal size:",s),this.showToast("Failed to restore terminal size","error")}},sendPendingCtrlL(e){},async copyTerminal(){try{const e=this.terminal.buffer.active;let s="";for(let i=0;i<e.length;i++){const n=e.getLine(i);n&&(s+=n.translateToString(!0)+`
2
+ `)}await navigator.clipboard.writeText(s.replace(/\n+$/,`
3
+ `)),this.showToast("Copied to clipboard","success")}catch{this.showToast("Failed to copy","error")}},_syncMobileHelperTextareaToCursor(){if(!(!MobileDetection.isTouchDevice()||!this.terminal?.element))try{const e=this.terminal.element,s=this.terminal.element.querySelector(".xterm-cursor"),i=this.terminal.element.querySelector(".xterm-screen");if(!(e instanceof HTMLElement)||!(s instanceof HTMLElement)||!(i instanceof HTMLElement))return;const n=s.getBoundingClientRect(),l=i.getBoundingClientRect();if(!n.width&&!n.height)return;const o=Math.max(0,Math.round(n.left-l.left)),r=Math.max(0,Math.round(n.top-l.top));e.style.setProperty("--xterm-helper-left",`${o}px`),e.style.setProperty("--xterm-helper-top",`${r}px`)}catch{}},increaseFontSize(){const e=this.terminal.options.fontSize||14;this.setFontSize(Math.min(e+2,24))},decreaseFontSize(){const e=this.terminal.options.fontSize||14;this.setFontSize(Math.max(e-2,10))},setFontSize(e){this.terminal.options.fontSize=e,document.getElementById("fontSizeDisplay").textContent=e,this.fitAddon.fit(),localStorage.setItem("codeman-font-size",e),this._localEchoOverlay?.refreshFont()},loadFontSize(){const e=localStorage.getItem("codeman-font-size");if(e){const s=parseInt(e,10);s>=10&&s<=24&&(this.terminal.options.fontSize=s,document.getElementById("fontSizeDisplay").textContent=s)}},getTerminalDimensions(){const i=this.fitAddon?.proposeDimensions();return i?{cols:Math.max(i.cols,40),rows:Math.max(i.rows,10)}:null},async sendResize(e,s={}){this.fitAddon&&this.fitAddon.fit();const i=this.getTerminalDimensions();if(!i)return!1;const n=this._lastResizeDims,l=!n||n.cols!==i.cols||n.rows!==i.rows;this._lastResizeDims={cols:i.cols,rows:i.rows};const o=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():window.innerWidth<430?"mobile":window.innerWidth<768?"tablet":"desktop";if(!s.forceHttp&&this._wsReady&&this._wsSessionId===e)try{return this._ws.send(JSON.stringify({t:"z",c:i.cols,r:i.rows,v:o})),l}catch{}return await fetch(`/api/sessions/${e}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...i,viewportType:o})}),l},async sendInput(e){this.activeSessionId&&await fetch(`/api/sessions/${this.activeSessionId}/input`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:e,useMux:!0})})},toggleDirInput(){const e=document.querySelector("#dirDisplay").parentElement,s=document.getElementById("dirInput");s.classList.contains("hidden")&&(s.classList.remove("hidden"),e.style.display="none",s.focus())},hideDirInput(){const e=document.querySelector("#dirDisplay").parentElement,s=document.getElementById("dirInput");setTimeout(()=>{s.classList.add("hidden"),e.style.display="";const i=s.value.trim();document.getElementById("dirDisplay").textContent=i||"No directory"},100)}});
Binary file
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"ralph-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAa1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGpG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CA+eN"}
1
+ {"version":3,"file":"ralph-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAc1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGpG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CAsdN"}
@@ -14,6 +14,7 @@ import { SseEvent } from '../sse-events.js';
14
14
  import { autoConfigureRalph, CASES_DIR, SETTINGS_PATH, findSessionOrFail, parseBody } from '../route-helpers.js';
15
15
  import { writeHooksConfig, stripCaseEnvKeys } from '../../hooks-config.js';
16
16
  import { generateClaudeMd } from '../../templates/claude-md.js';
17
+ import { buildRalphLoopPrompt } from '../../prompts/index.js';
17
18
  import { getLifecycleLog } from '../../session-lifecycle-log.js';
18
19
  import { MAX_CONCURRENT_SESSIONS } from '../../config/map-limits.js';
19
20
  export function registerRalphRoutes(app, ctx) {
@@ -313,37 +314,12 @@ export function registerRalphRoutes(app, ctx) {
313
314
  const fixPlanPath = join(casePath, '@fix_plan.md');
314
315
  writeFileSync(fixPlanPath, planContent, 'utf-8');
315
316
  }
316
- // Build full prompt
317
- const hasPlan = enabledItems.length > 0;
318
- let fullPrompt = taskDescription + '\n\n---\n\n';
319
- if (hasPlan) {
320
- fullPrompt += '## Task Plan\n\n';
321
- fullPrompt += 'A task plan has been written to `@fix_plan.md`. Use this to track progress:\n';
322
- fullPrompt += '- Reference the plan at the start of each iteration\n';
323
- fullPrompt += '- Update task checkboxes as you complete items\n';
324
- fullPrompt += '- Work through items in priority order (P0 > P1 > P2)\n\n';
325
- }
326
- fullPrompt += '## Iteration Protocol\n\n';
327
- fullPrompt += 'This is an autonomous loop. Files from previous iterations persist. On each iteration:\n';
328
- fullPrompt += '1. Check what work has already been done\n';
329
- fullPrompt += '2. Make incremental progress toward completion\n';
330
- fullPrompt += '3. Commit meaningful changes with descriptive messages\n\n';
331
- fullPrompt += '## Verification\n\n';
332
- fullPrompt += 'After each significant change:\n';
333
- fullPrompt += '- Run tests to verify (npm test, pytest, etc.)\n';
334
- fullPrompt += '- Check for type/lint errors if applicable\n';
335
- fullPrompt += '- If tests fail, read the error, fix it, and retry\n\n';
336
- fullPrompt += '## Completion Criteria\n\n';
337
- fullPrompt += `Output \`<promise>${completionPhrase}</promise>\` when ALL of the following are true:\n`;
338
- fullPrompt += '- All requirements from the task description are implemented\n';
339
- fullPrompt += '- All tests pass\n';
340
- fullPrompt += '- Changes are committed\n\n';
341
- fullPrompt += '## If Stuck\n\n';
342
- fullPrompt += 'If you encounter the same error for 3+ iterations:\n';
343
- fullPrompt += "1. Document what you've tried\n";
344
- fullPrompt += '2. Identify the specific blocker\n';
345
- fullPrompt += '3. Try an alternative approach\n';
346
- fullPrompt += '4. If truly blocked, output `<promise>BLOCKED</promise>` with an explanation\n';
317
+ // Build full prompt (includes the RALPH_STATUS contract)
318
+ const fullPrompt = buildRalphLoopPrompt({
319
+ taskDescription,
320
+ completionPhrase,
321
+ hasPlan: enabledItems.length > 0,
322
+ });
347
323
  // Write prompt to file
348
324
  const promptPath = join(casePath, '@ralph_prompt.md');
349
325
  writeFileSync(promptPath, fullPrompt, 'utf-8');
@@ -1 +1 @@
1
- {"version":3,"file":"ralph-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAoB,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,UAAU,mBAAmB,CACjC,GAAoB,EACpB,GAAmE;IAEnE,kEAAkE;IAClE,uCAAuC;IACvC,kEAAkE;IAElE,wCAAwC;IACxC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,SAAS,CACtF,iBAAiB,EACjB,GAAG,CAAC,IAAI,EACR,sBAAsB,CAOvB,CAAC;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,4EAA4E;QAC5E,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,mBAAmB,CACxB,YAAY,CAAC,aAAa,EAC1B,sCAAsC,OAAO,CAAC,IAAI,WAAW,CAC9D,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,iBAAiB,EAAE,CAAC;gBACtB,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC9B,0DAA0D;gBAC1D,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/B,+DAA+D;gBAC/D,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;YAC3C,CAAC;YACD,8BAA8B;YAC9B,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,8BAA8B;QAC9B,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,8DAA8D;YAC9D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QAC/D,CAAC;QAED,mCAAmC;QACnC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YAC7C,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,OAAO,CAAC,cAAc;SAC9B,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,0CAA0C;IAC1C,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtE,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,mDAAmD;IACnD,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,eAAe;gBACrD,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,oBAAoB;gBACzD,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,eAAe;gBACrD,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,WAAW;aAC9C;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,8DAA8D;IAC9D,kEAAkE;IAElE,2CAA2C;IAC3C,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM;aAC7C;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC1E,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEjC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,aAAa;gBACb,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;aAClC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,QAAQ;oBACR,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM;iBAC7C;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gEAAgE;IAChE,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC1E,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEjC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,QAAQ;oBACR,aAAa;oBACb,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;iBAClC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,6CAA6C,CAAC,CAAC;YACpG,CAAC;YACD,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,iDAAiD;IACjD,kEAAkE;IAElE,4DAA4D;IAC5D,qEAAqE;IACrE,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,sBAAsB,EAAE,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,QAAQ;oBACR,aAAa,EAAE,OAAO,CAAC,MAAM;iBAC9B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAwB,EAAE;QACpE,qCAAqC;QACrC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,uBAAuB,EAAE,CAAC;YACjD,OAAO,mBAAmB,CACxB,YAAY,CAAC,YAAY,EACzB,gCAAgC,uBAAuB,YAAY,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,EACJ,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAY,EACZ,MAAM,GACP,GAAG,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE3C,sCAAsC;QACtC,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAC9E,CAAC;QAED,mEAAmE;QACnE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,sBAAsB,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;gBAC9D,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACrD,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,0BAA0B,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,iBAAiB;QACjB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,KAAK,EAAE,aAAa,EAAE,YAAY,IAAI,SAAS;YAC/C,UAAU,EAAE,kBAAkB,CAAC,UAAU;YACzC,YAAY,EAAE,kBAAkB,CAAC,YAAY;YAC7C,YAAY;YACZ,MAAM;SACP,CAAC,CAAC;QAEH,0BAA0B;QAC1B,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC;QAE7E,sDAAsD;QACtD,MAAM,YAAY,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtD,WAAW,GAAG,2BAA2B,CAAC;YAC1C,WAAW,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;YACzE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,IAAI,2BAA2B,CAAC;gBAC3C,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,IAAI,sBAAsB,CAAC;gBACtC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,IAAI,0BAA0B,CAAC;gBAC1C,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,WAAW,IAAI,cAAc,CAAC;gBAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBAClB,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YAED,wCAAwC;YACxC,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACnD,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAED,oBAAoB;QACpB,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,IAAI,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;QACjD,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,IAAI,kBAAkB,CAAC;YACjC,UAAU,IAAI,+EAA+E,CAAC;YAC9F,UAAU,IAAI,uDAAuD,CAAC;YACtE,UAAU,IAAI,kDAAkD,CAAC;YACjE,UAAU,IAAI,2DAA2D,CAAC;QAC5E,CAAC;QACD,UAAU,IAAI,2BAA2B,CAAC;QAC1C,UAAU,IAAI,0FAA0F,CAAC;QACzG,UAAU,IAAI,4CAA4C,CAAC;QAC3D,UAAU,IAAI,kDAAkD,CAAC;QACjE,UAAU,IAAI,4DAA4D,CAAC;QAC3E,UAAU,IAAI,qBAAqB,CAAC;QACpC,UAAU,IAAI,kCAAkC,CAAC;QACjD,UAAU,IAAI,kDAAkD,CAAC;QACjE,UAAU,IAAI,8CAA8C,CAAC;QAC7D,UAAU,IAAI,wDAAwD,CAAC;QACvE,UAAU,IAAI,4BAA4B,CAAC;QAC3C,UAAU,IAAI,qBAAqB,gBAAgB,oDAAoD,CAAC;QACxG,UAAU,IAAI,gEAAgE,CAAC;QAC/E,UAAU,IAAI,oBAAoB,CAAC;QACnC,UAAU,IAAI,6BAA6B,CAAC;QAC5C,UAAU,IAAI,iBAAiB,CAAC;QAChC,UAAU,IAAI,sDAAsD,CAAC;QACrE,UAAU,IAAI,iCAAiC,CAAC;QAChD,UAAU,IAAI,oCAAoC,CAAC;QACnD,UAAU,IAAI,kCAAkC,CAAC;QACjD,UAAU,IAAI,gFAAgF,CAAC;QAE/F,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACtD,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE/C,mBAAmB;QACnB,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACrC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACzC,eAAe,EAAE,CAAC,GAAG,CAAC;YACpB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;QAEhF,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACjC,eAAe,EAAE,CAAC,GAAG,CAAC;gBACpB,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;YACrE,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,8BAA8B;QAC9B,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,iBAAiB,GACrB,2LAA2L,CAAC;YAC9L,MAAM,oBAAoB,GAAG,6HAA6H,gBAAgB,yCAAyC,CAAC;YACpN,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE;gBAChD,YAAY,EAAE,iBAAiB;gBAC/B,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,oBAAoB;aACtC,CAAC,CAAC;YACH,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACnD,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAClD,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1D,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE;gBACrC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC;YACH,IAAI,QAAQ,GAA4B,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,mDAAmD;QACrI,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAE7B,kDAAkD;QAClD,YAAY,CAAC,GAAG,EAAE;YAChB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC3B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;oBAC9C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC7C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACtC,IAAI,CAAC,CAAC;wBAAE,OAAO,CAAC,sBAAsB;oBACtC,6CAA6C;oBAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7D,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,sCAAsC;gBACtC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC9C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,CAAC,CAAC;oBAAE,OAAO;gBACf,IAAI,CAAC;oBACH,MAAM,CAAC,CAAC,WAAW,CAAC,iFAAiF,CAAC,CAAC;gBACzG,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,gDAAgD,SAAS,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC,CAAC;YACF,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"ralph-routes.js","sourceRoot":"","sources":["../../../src/web/routes/ralph-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAoB,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,UAAU,mBAAmB,CACjC,GAAoB,EACpB,GAAmE;IAEnE,kEAAkE;IAClE,uCAAuC;IACvC,kEAAkE;IAElE,wCAAwC;IACxC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,SAAS,CACtF,iBAAiB,EACjB,GAAG,CAAC,IAAI,EACR,sBAAsB,CAOvB,CAAC;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,4EAA4E;QAC5E,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,mBAAmB,CACxB,YAAY,CAAC,aAAa,EAC1B,sCAAsC,OAAO,CAAC,IAAI,WAAW,CAC9D,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,iBAAiB,EAAE,CAAC;gBACtB,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC9B,0DAA0D;gBAC1D,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/B,+DAA+D;gBAC/D,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;YAC3C,CAAC;YACD,8BAA8B;YAC9B,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,8BAA8B;QAC9B,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,8DAA8D;YAC9D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QAC/D,CAAC;QAED,mCAAmC;QACnC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YAC7C,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,OAAO,CAAC,cAAc;SAC9B,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,0CAA0C;IAC1C,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtE,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,mDAAmD;IACnD,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,eAAe;gBACrD,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,oBAAoB;gBACzD,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,eAAe;gBACrD,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,WAAW;aAC9C;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,8DAA8D;IAC9D,kEAAkE;IAElE,2CAA2C;IAC3C,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM;aAC7C;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC1E,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEjC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,aAAa;gBACb,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;aAClC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,QAAQ;oBACR,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM;iBAC7C;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gEAAgE;IAChE,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC1E,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEjC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,QAAQ;oBACR,aAAa;oBACb,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;iBAClC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,6CAA6C,CAAC,CAAC;YACpG,CAAC;YACD,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,iDAAiD;IACjD,kEAAkE;IAElE,4DAA4D;IAC5D,qEAAqE;IACrE,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,sBAAsB,EAAE,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,QAAQ;oBACR,aAAa,EAAE,OAAO,CAAC,MAAM;iBAC9B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAwB,EAAE;QACpE,qCAAqC;QACrC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,uBAAuB,EAAE,CAAC;YACjD,OAAO,mBAAmB,CACxB,YAAY,CAAC,YAAY,EACzB,gCAAgC,uBAAuB,YAAY,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,EACJ,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAY,EACZ,MAAM,GACP,GAAG,SAAS,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE3C,sCAAsC;QACtC,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAC9E,CAAC;QAED,mEAAmE;QACnE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,sBAAsB,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;gBAC9D,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACrD,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,0BAA0B,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,iBAAiB;QACjB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;QACjD,MAAM,kBAAkB,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,KAAK,EAAE,aAAa,EAAE,YAAY,IAAI,SAAS;YAC/C,UAAU,EAAE,kBAAkB,CAAC,UAAU;YACzC,YAAY,EAAE,kBAAkB,CAAC,YAAY;YAC7C,YAAY;YACZ,MAAM;SACP,CAAC,CAAC;QAEH,0BAA0B;QAC1B,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC;QAE7E,sDAAsD;QACtD,MAAM,YAAY,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtD,WAAW,GAAG,2BAA2B,CAAC;YAC1C,WAAW,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;YACzE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,IAAI,2BAA2B,CAAC;gBAC3C,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,IAAI,sBAAsB,CAAC;gBACtC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,IAAI,0BAA0B,CAAC;gBAC1C,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,WAAW,IAAI,cAAc,CAAC;gBAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBAClB,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,WAAW,IAAI,IAAI,CAAC;YACtB,CAAC;YAED,wCAAwC;YACxC,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACnD,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAED,yDAAyD;QACzD,MAAM,UAAU,GAAG,oBAAoB,CAAC;YACtC,eAAe;YACf,gBAAgB;YAChB,OAAO,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC;SACjC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACtD,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE/C,mBAAmB;QACnB,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACrC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACzC,eAAe,EAAE,CAAC,GAAG,CAAC;YACpB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;QAEhF,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACjC,eAAe,EAAE,CAAC,GAAG,CAAC;gBACpB,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;YACrE,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,8BAA8B;QAC9B,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,iBAAiB,GACrB,2LAA2L,CAAC;YAC9L,MAAM,oBAAoB,GAAG,6HAA6H,gBAAgB,yCAAyC,CAAC;YACpN,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE;gBAChD,YAAY,EAAE,iBAAiB;gBAC/B,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,oBAAoB;aACtC,CAAC,CAAC;YACH,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACnD,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAClD,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1D,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE;gBACrC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC;YACH,IAAI,QAAQ,GAA4B,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,mDAAmD;QACrI,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAE7B,kDAAkD;QAClD,YAAY,CAAC,GAAG,EAAE;YAChB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC3B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;oBAC9C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC7C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACtC,IAAI,CAAC,CAAC;wBAAE,OAAO,CAAC,sBAAsB;oBACtC,6CAA6C;oBAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7D,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,sCAAsC;gBACtC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC9C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,CAAC,CAAC;oBAAE,OAAO;gBACf,IAAI,CAAC;oBACH,MAAM,CAAC,CAAC,WAAW,CAAC,iFAAiF,CAAC,CAAC;gBACzG,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,gDAAgD,SAAS,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC,CAAC;YACF,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aicodeman",
3
- "version": "0.9.10",
4
- "description": "The missing control plane for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence",
3
+ "version": "0.9.12",
4
+ "description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -1,3 +0,0 @@
1
- "use strict";(function(e){const s=/^\x1b\[[\?>=]?[\d;]*[cnR]$/,i=/^\x1b\][\d;]*[^\x07\x1b]*(?:\x07|\x1b\\)$/;function n(o){return s.test(o)||i.test(o)}function l(o){return n(o)}e.CodemanTerminalInput={isTerminalQueryResponse:n,shouldSuppressTerminalQueryResponse:l}})(window),Object.assign(CodemanApp.prototype,{initTerminal(){const e=parseInt(localStorage.getItem("codeman-scrollback")),s=Number.isFinite(e)&&e>0?Math.max(e,DEFAULT_SCROLLBACK):DEFAULT_SCROLLBACK;if(this.terminal=new Terminal({theme:{background:"#0d0d0d",foreground:"#e0e0e0",cursor:"#e0e0e0",cursorAccent:"#0d0d0d",selection:"rgba(255, 255, 255, 0.3)",black:"#0d0d0d",red:"#ff6b6b",green:"#51cf66",yellow:"#ffd43b",blue:"#339af0",magenta:"#cc5de8",cyan:"#22b8cf",white:"#e0e0e0",brightBlack:"#495057",brightRed:"#ff8787",brightGreen:"#69db7c",brightYellow:"#ffe066",brightBlue:"#5c7cfa",brightMagenta:"#da77f2",brightCyan:"#66d9e8",brightWhite:"#ffffff"},fontFamily:'"Fira Code", "Cascadia Code", "JetBrains Mono", "SF Mono", Monaco, monospace',fontSize:MobileDetection.getDeviceType()==="mobile"?10:14,lineHeight:1.2,cursorBlink:!1,cursorStyle:"block",scrollback:s,allowTransparency:!0,allowProposedApi:!0}),this.fitAddon=new FitAddon.FitAddon,this.terminal.loadAddon(this.fitAddon),typeof Unicode11Addon<"u")try{const t=new Unicode11Addon.Unicode11Addon;this.terminal.loadAddon(t),this.terminal.unicode.activeVersion="11"}catch{}const i=document.getElementById("terminalContainer");this.terminal.open(i),this.terminal.attachCustomKeyEventHandler(t=>{if(t.isComposing||t.keyCode===229||t.altKey&&t.key>="0"&&t.key<="9")return!1;if((t.ctrlKey||t.metaKey)&&t.key==="v"&&t.type==="keydown")return this.activeSessionId&&this._handleImagePaste&&this._handleImagePaste(),!1;if(t.key==="Enter"&&(t.shiftKey||t.ctrlKey)&&t.type==="keydown"){if(this.activeSessionId)if(this._localEchoEnabled){const d=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),d&&(this._pendingInput+=d,y()),setTimeout(()=>{fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:t.ctrlKey?"C-Enter":"S-Enter"})})},d?80:0)}else fetch(`/api/sessions/${this.activeSessionId}/send-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:t.ctrlKey?"C-Enter":"S-Enter"})});return!1}return!0});{const t=i.querySelector(".xterm-helper-textarea");if(t&&MobileDetection.isTouchDevice()){let d=!1,f=0;t.addEventListener("compositionstart",()=>{d=!0}),t.addEventListener("compositionend",()=>{d=!1}),t.addEventListener("keydown",c=>{!c.isComposing&&c.keyCode!==229&&(f=Date.now())}),t.addEventListener("input",c=>{if(d||c.isComposing||c.inputType!=="insertText"||!c.data||Date.now()-f<50)return;const h=c.data,p=this._localEchoOverlay?.pendingText||"";Promise.resolve().then(()=>{if(this._lastTerminalData?.data===h&&performance.now()-this._lastTerminalData.time<100){t.value="";return}const _=this._localEchoOverlay?.pendingText||"";if(this._localEchoEnabled&&_.length>p.length&&_.endsWith(h)){t.value="";return}const g=t.value;!g||g.trim()===""&&h!==" "||(this.terminal._core.coreService.triggerDataEvent(h,!0),t.value="")})})}}this._webglAddon=null;const n=new URLSearchParams(location.search);if(n.get("webgl")==="force")try{localStorage.removeItem("codeman-webgl-disabled")}catch{}const l=(()=>{try{const t=localStorage.getItem("codeman-webgl-disabled");if(!t)return!1;const{at:d}=JSON.parse(t);return Date.now()-d>WEBGL_FALLBACK.STICKY_EXPIRY_MS?(localStorage.removeItem("codeman-webgl-disabled"),!1):!0}catch{return!1}})(),o=MobileDetection.getDeviceType()!=="desktop"||n.has("nowebgl")||l;if(l&&console.log("[CRASH-DIAG] WebGL sticky-disabled from prior stalls \u2014 DOM renderer in use. Re-enable: ?webgl=force"),!o)if(typeof WebglAddon<"u")this._initWebGL();else{const t=document.createElement("script");t.src="vendor/xterm-addon-webgl.min.js",t.onload=()=>this._initWebGL(),t.onerror=()=>console.warn("[CRASH-DIAG] Failed to load WebGL addon \u2014 using canvas renderer"),document.head.appendChild(t)}this._localEchoOverlay=new LocalEchoOverlay(this.terminal),MobileDetection.isTouchDevice()&&(this.terminal.onCursorMove(()=>this._syncMobileHelperTextareaToCursor()),this.terminal.onRender(()=>this._syncMobileHelperTextareaToCursor())),this._cjkInput=null,typeof CjkInput<"u"&&(this._cjkInput=CjkInput.init({send:t=>{this._handleCjkInput(t)}})),MobileDetection.getDeviceType()==="mobile"&&document.body.classList.contains("safari-browser")?requestAnimationFrame(()=>{this.fitAddon.fit(),requestAnimationFrame(()=>this.fitAddon.fit())}):this.fitAddon.fit(),this.registerFilePathLinkProvider(),i.addEventListener("wheel",t=>{t.preventDefault();const d=Math.round(t.deltaY/25)||(t.deltaY>0?1:-1);this.terminal.scrollLines(d)},{passive:!1});{const t=()=>this.terminal._core?._renderService?.dimensions?.css?.cell?.height||13;let d=0,f=0,c=0,h=null,p=!1;const _=b=>{const E=c?(b-c)/16.67:1;if(c=b,!p&&Math.abs(f)>.3){const T=Math.round(f/t());T!==0&&this.terminal.scrollLines(T),f*=.92,h=requestAnimationFrame(_)}else p?h=requestAnimationFrame(_):(h=null,f=0)};let g=0,v=!1;i.addEventListener("touchstart",b=>{b.touches.length===1&&(d=b.touches[0].clientY,f=0,g=0,p=!0,v=!1,c=0,h&&(cancelAnimationFrame(h),h=null))},{passive:!0}),i.addEventListener("touchmove",b=>{if(b.touches.length===1&&p){b.preventDefault(),v=!0;const E=b.touches[0].clientY,T=d-E;g+=T,f=T*1.2,d=E;const x=t(),S=Math.trunc(g/x);S!==0&&(this.terminal.scrollLines(S),g-=S*x)}},{passive:!1}),i.addEventListener("touchend",()=>{if(p=!1,!h&&Math.abs(f)>.3&&(h=requestAnimationFrame(_)),!v&&this.terminal){const b=document.getElementById("cjkInput");b?.classList.contains("cjk-input-visible")?b.focus():(this._syncMobileHelperTextareaToCursor(),this.terminal.focus())}},{passive:!0}),i.addEventListener("touchcancel",()=>{p=!1,f=0,g=0},{passive:!0})}this.showWelcome(),this.initImageInput(),this._chunkedWriteGen=0,this._bufferLoadSeq=0,this._bufferLoadOwner=null,this._resizeTimeout=null,this._lastResizeDims=null;const u=40,a=10,m=()=>{this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._resizeTimeout=null,this.fitAddon&&this.fitAddon.fit(),this.flickerFilterBuffer&&(this.flickerFilterTimeout&&(clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=null),this.flushFlickerBuffer());const t=typeof KeyboardHandler<"u"&&KeyboardHandler.keyboardVisible;if(this.activeSessionId&&!t){const d=this.fitAddon.proposeDimensions(),f=d?Math.max(d.cols,u):u,c=d?Math.max(d.rows,a):a;if(!this._lastResizeDims||f!==this._lastResizeDims.cols||c!==this._lastResizeDims.rows){const h=this.activeSessionId?this.sessions.get(this.activeSessionId):null;h&&h.mode!=="shell"&&this.terminal&&this.isTerminalAtBottom()&&this.terminal.write("\x1B[3J\x1B[H\x1B[2J"),this._lastResizeDims={cols:f,rows:c};const p=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():"desktop";let _=!1;if(this._wsReady&&this._wsSessionId===this.activeSessionId)try{this._ws.send(JSON.stringify({t:"z",c:f,r:c,v:p})),_=!0}catch{}_||fetch(`/api/sessions/${this.activeSessionId}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cols:f,rows:c,viewportType:p})}).catch(()=>{})}}this.updateConnectionLines(),this._localEchoOverlay?.hasPending&&this._localEchoOverlay.rerender()},300)};window.addEventListener("resize",m),this.terminalResizeObserver&&this.terminalResizeObserver.disconnect(),this.terminalResizeObserver=new ResizeObserver(m),this.terminalResizeObserver.observe(i),this._pendingInput="",this._inputFlushTimeout=null,this._lastKeystrokeTime=0;const y=()=>{if(this._inputFlushTimeout=null,this._pendingInput&&this.activeSessionId){const t=this._pendingInput,d=this.activeSessionId;this._pendingInput="",this._sendInputAsync(d,t)}};this.terminal.onData(t=>{if(!(window.cjkActive||document.activeElement?.id==="cjkInput")&&this.activeSessionId){if(window.CodemanTerminalInput?.shouldSuppressTerminalQueryResponse(t))return;if(this._lastTerminalData={data:t,time:performance.now()},this._localEchoEnabled){if(t==="\x7F"){if(this._localEchoOverlay?.removeChar()==="flushed"){const{count:c,text:h}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(this.activeSessionId)&&(c===0?(this._flushedOffsets.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId)):(this._flushedOffsets.set(this.activeSessionId,c),this._flushedTexts?.set(this.activeSessionId,h))),this._pendingInput+=t,y()}return}if(/^[\r\n]+$/.test(t)){const f=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),f&&(this._pendingInput+=f,y()),setTimeout(()=>{this._pendingInput+="\r",y()},80);return}if(t.length>1&&t.charCodeAt(0)>=32){this._localEchoOverlay?.appendText(t);return}if(t.charCodeAt(0)<32){if(t.length>1&&t.charCodeAt(0)===27){this._pendingInput+=t,y();return}if(this._restoringFlushedState){this._pendingInput+=t,y();return}if(t===" "){const c=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),c&&(this._pendingInput+=c),this._pendingInput+=t,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null);let h="";try{const _=this._localEchoOverlay?.findPrompt?.();if(_){const g=this.terminal.buffer.active,v=g.getLine(g.viewportY+_.row);v&&(h=v.translateToString(!0).slice(_.col+2).trimEnd())}}catch{}this._tabCompletionBaseText=h,y(),this._tabCompletionSessionId=this.activeSessionId,this._tabCompletionRetries=0,this._tabCompletionFallback&&clearTimeout(this._tabCompletionFallback);const p=this;this._tabCompletionFallback=setTimeout(()=>{if(p._tabCompletionFallback=null,!p._tabCompletionSessionId||p._tabCompletionSessionId!==p.activeSessionId)return;const _=p._localEchoOverlay;!_||_.pendingText||p.terminal.write("",()=>{if(!p._tabCompletionSessionId)return;_.resetBufferDetection();const g=_.detectBufferText();g&&g!==p._tabCompletionBaseText&&(p._tabCompletionSessionId=null,p._tabCompletionRetries=0,p._tabCompletionBaseText=null,_.rerender())})},300);return}const f=this._localEchoOverlay?.pendingText||"";this._localEchoOverlay?.clear(),this._localEchoOverlay?.suppressBufferDetection(),this._flushedOffsets?.delete(this.activeSessionId),this._flushedTexts?.delete(this.activeSessionId),f&&(this._pendingInput+=f),this._pendingInput+=t,this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),y();return}if(t.length===1&&t.charCodeAt(0)>=32){this._localEchoOverlay?.addChar(t);return}}if(this._pendingInput+=t,t.charCodeAt(0)<32||t.length>1){this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),y();return}const d=performance.now();d-this._lastKeystrokeTime>50?(this._inputFlushTimeout&&(clearTimeout(this._inputFlushTimeout),this._inputFlushTimeout=null),this._lastKeystrokeTime=d,y()):(this._lastKeystrokeTime=d,this._inputFlushTimeout||(this._inputFlushTimeout=setTimeout(y,0)))}})},registerFilePathLinkProvider(){const e=this;let s=-1;this.terminal.registerLinkProvider({provideLinks(i,n){i!==s&&(s=i,console.debug("[LinkProvider] Checking line:",i));const o=e.terminal.buffer.active.getLine(i-1);if(!o){n(void 0);return}const r=o.translateToString(!0);if(!r||!r.includes("/")){n(void 0);return}const u=[],a=/https?:\/\/[^\s"'<>|;&)\]\x00-\x1f]+/g,m=(h,p)=>{const _=h.replace(/[.,;:!?)]+$/,""),g=r.indexOf(_,p);g!==-1&&(u.some(v=>v.range.start.x===g+1)||u.push({text:_,range:{start:{x:g+1,y:i},end:{x:g+_.length+1,y:i}},decorations:{pointerCursor:!0,underline:!0},activate(v,b){window.open(b,"_blank","noopener,noreferrer")}}))},y=/(tail|cat|head|less|grep|watch|vim|nano)\s+(?:[^\s\/]*\s+)*(\/[^\s"'<>|;&\n\x00-\x1f]+)/g,t=/(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\n\x00-\x1f]*\.(?:log|txt|json|md|yaml|yml|csv|xml|sh|py|ts|js))\b/g,d=/Bash\([^)]*?(\/(?:home|tmp|var|etc|opt)[^\s"'<>|;&\)\n\x00-\x1f]+)/g,f=(h,p)=>{const _=r.indexOf(h,p);_!==-1&&(u.some(g=>g.range.start.x===_+1)||u.push({text:h,range:{start:{x:_+1,y:i},end:{x:_+h.length+1,y:i}},decorations:{pointerCursor:!0,underline:!0},activate(g,v){e.openLogViewerWindow(v,e.activeSessionId)}}))};let c;for(a.lastIndex=0;(c=a.exec(r))!==null;)m(c[0],c.index);for(y.lastIndex=0;(c=y.exec(r))!==null;)f(c[2],c.index);for(t.lastIndex=0;(c=t.exec(r))!==null;)f(c[1],c.index);for(d.lastIndex=0;(c=d.exec(r))!==null;)f(c[1],c.index);u.length>0&&console.debug("[LinkProvider] Found links:",u.map(h=>h.text)),n(u.length>0?u:void 0)}}),console.log("[LinkProvider] File path link provider registered")},showWelcome(){const e=document.getElementById("welcomeOverlay");e&&(e.classList.add("visible"),this.loadTunnelStatus(),this.loadHistorySessions())},hideWelcome(){const e=document.getElementById("welcomeOverlay");e&&e.classList.remove("visible");const s=document.getElementById("welcomeQr");s&&(clearTimeout(this._welcomeQrShrinkTimer),s.classList.remove("expanded"))},async _fetchHistorySessions(){const i=(await(await fetch("/api/history/sessions")).json()).data?.sessions||[];if(i.length===0)return[];const n=new Map;for(const o of i){const r=o.projectKey||o.workingDir;n.has(r)||n.set(r,[]),n.get(r).push(o)}const l=[];for(const[,o]of n)l.push(...o.slice(0,3));return l.sort((o,r)=>new Date(r.lastModified)-new Date(o.lastModified)),l},_resolveCaseLabel(e,s){if(!e)return"";let i=null;for(const n of s||[])if(!(!n||!n.path)){if(e===n.path)return`#${n.name}`;if(e.startsWith(n.path+"/")){const l=n.path.length;(!i||l>i.len)&&(i={name:n.name,suffix:e.slice(l),len:l})}}return i?`#${i.name}${i.suffix}`:e.split("/").pop()||e},_shortenHomePath(e){return(e||"").replace(/^\/home\/[^/]+\//,"~/").replace(/^\/Users\/[^/]+\//,"~/")},_buildHistoryItem(e,s,i){const n=i?.showViewAll!==!1,l=e.sizeBytes<1024?`${e.sizeBytes}B`:e.sizeBytes<1048576?`${(e.sizeBytes/1024).toFixed(0)}K`:`${(e.sizeBytes/1048576).toFixed(1)}M`,o=new Date(e.lastModified),r=o.toLocaleDateString("en",{month:"short",day:"numeric"})+" "+o.toLocaleTimeString("en",{hour:"2-digit",minute:"2-digit",hour12:!1}),u=this._shortenHomePath(e.workingDir),a=this._resolveCaseLabel(e.workingDir,s),m=document.createElement("div");m.className="history-item",m.title=e.workingDir;const y=document.createElement("div");y.className="history-item-main",y.addEventListener("click",()=>this.resumeHistorySession(e.sessionId,e.workingDir));const t=document.createElement("div");t.className="history-item-text";const d=document.createElement("span");d.className="history-item-title",d.textContent=e.firstPrompt||u;const f=document.createElement("span");f.className="history-item-subtitle",a.startsWith("#")&&f.classList.add("is-case"),f.textContent=a,t.append(d,f);const c=document.createElement("span");c.className="history-item-meta",c.textContent=r;const h=document.createElement("button");h.className="history-item-expand",h.type="button",h.setAttribute("aria-label","Show details"),h.setAttribute("aria-expanded","false"),h.textContent="\u22EF",y.append(t,c,h);const p=document.createElement("div");p.className="history-item-detail",p.hidden=!0;const _=document.createElement("div");_.className="history-detail-row";const g=document.createElement("span");g.className="history-detail-label",g.textContent="Prompt";const v=document.createElement("span");v.className="history-detail-value history-detail-prompt",v.textContent=e.firstPrompt||"(no prompt captured)",_.append(g,v);const b=document.createElement("div");b.className="history-detail-row";const E=document.createElement("span");E.className="history-detail-label",E.textContent="Path";const T=document.createElement("span");T.className="history-detail-value history-detail-path",T.textContent=u,b.append(E,T);const x=document.createElement("div");if(x.className="history-detail-row history-detail-meta",x.textContent=`${r} \xB7 ${l} \xB7 ${e.sessionId.slice(0,8)}`,p.append(_,b,x),n&&e.projectKey){const S=document.createElement("div");S.className="history-detail-row history-detail-actions";const w=document.createElement("button");w.type="button",w.className="history-view-all-btn",w.textContent="View all in this folder",w.addEventListener("click",I=>{I.stopPropagation(),this.openFolderHistoryModal(e.projectKey,e.workingDir,s)}),S.appendChild(w),p.appendChild(S)}return h.addEventListener("click",S=>{S.stopPropagation();const w=m.classList.toggle("expanded");p.hidden=!w,h.setAttribute("aria-expanded",w?"true":"false")}),m.append(y,p),m},_HISTORY_INITIAL_COUNT:4,async loadHistorySessions(){const e=document.getElementById("historySessions"),s=document.getElementById("historyList");if(!(!e||!s))try{const i=Array.isArray(this.cases)&&this.cases.length>0?Promise.resolve(this.cases):fetch("/api/cases").then(r=>r.ok?r.json():null).then(r=>r?.data||[]).catch(()=>[]),[n,l]=await Promise.all([this._fetchHistorySessions(30),i]);if(n.length===0){e.style.display="none";return}s.replaceChildren();const o=this._HISTORY_INITIAL_COUNT;for(let r=0;r<Math.min(o,n.length);r++)s.appendChild(this._buildHistoryItem(n[r],l));if(n.length>o){const r=document.createElement("button");r.className="history-show-more",r.textContent=`Show ${n.length-o} more`,r.addEventListener("click",()=>{for(let u=o;u<n.length;u++)s.insertBefore(this._buildHistoryItem(n[u],l),r);r.remove()}),s.appendChild(r)}e.style.display=""}catch(i){console.error("[loadHistorySessions]",i),e.style.display="none"}},_FOLDER_HISTORY_PAGE_SIZE:20,openFolderHistoryModal(e,s,i){this._closeFolderHistoryModal();const n=document.createElement("div");n.className="modal active folder-history-modal",n.id="folderHistoryModal";const l=document.createElement("div");l.className="modal-backdrop",l.addEventListener("click",()=>this._closeFolderHistoryModal());const o=document.createElement("div");o.className="modal-content modal-lg";const r=document.createElement("div");r.className="modal-header";const u=document.createElement("h3");u.textContent="Folder History";const a=document.createElement("div");a.className="folder-history-subtitle",a.textContent=this._shortenHomePath(s);const m=document.createElement("button");m.className="modal-close",m.setAttribute("aria-label","Close"),m.innerHTML="&times;",m.addEventListener("click",()=>this._closeFolderHistoryModal()),r.append(u,m);const y=document.createElement("div");y.className="modal-body";const t=document.createElement("div");t.className="folder-history-list",t.setAttribute("data-loading","true"),t.textContent="Loading...",y.append(a,t),o.append(r,y),n.append(l,o),document.body.appendChild(n),this._folderHistoryState={projectKey:e,workingDir:s,cases:i||[],offset:0,total:null,list:t},this._folderHistoryEscHandler=d=>{d.key==="Escape"&&this._closeFolderHistoryModal()},document.addEventListener("keydown",this._folderHistoryEscHandler),this._loadFolderHistoryPage()},async _loadFolderHistoryPage(){const e=this._folderHistoryState;if(!e)return;const{projectKey:s,cases:i,list:n}=e,l=this._FOLDER_HISTORY_PAGE_SIZE,o=e.offset,r=n.querySelector(".folder-history-more");r&&r.remove(),o===0&&(n.replaceChildren(),n.removeAttribute("data-loading"));try{const u=`/api/history/sessions?projectKey=${encodeURIComponent(s)}&offset=${o}&limit=${l}`,m=await(await fetch(u)).json(),y=m.data?.sessions||[];if(e.total=typeof m.data?.total=="number"?m.data.total:y.length+o,o===0&&y.length===0){const t=document.createElement("div");t.className="folder-history-empty",t.textContent="No conversations found in this folder.",n.appendChild(t);return}for(const t of y)n.appendChild(this._buildHistoryItem(t,i,{showViewAll:!1}));if(e.offset=o+y.length,e.offset<e.total){const t=e.total-e.offset,d=document.createElement("button");d.className="history-show-more folder-history-more",d.textContent=`Show ${Math.min(l,t)} more (${t} remaining)`,d.addEventListener("click",()=>this._loadFolderHistoryPage()),n.appendChild(d)}}catch(u){console.error("[loadFolderHistoryPage]",u);const a=document.createElement("div");a.className="folder-history-empty",a.textContent="Failed to load folder history.",n.appendChild(a)}},_closeFolderHistoryModal(){const e=document.getElementById("folderHistoryModal");e&&e.remove(),this._folderHistoryEscHandler&&(document.removeEventListener("keydown",this._folderHistoryEscHandler),this._folderHistoryEscHandler=null),this._folderHistoryState=null},async resumeHistorySession(e,s){document.getElementById("runModeMenu")?.classList.remove("active"),this._closeFolderHistoryModal();try{this.terminal.clear(),this.terminal.writeln(`\x1B[1;32m Resuming conversation ${e.slice(0,8)}...\x1B[0m`);const i=s.split("/").pop()||"session";let n=1;for(const[,f]of this.sessions){const c=f.name&&f.name.match(/^w(\d+)-/);if(c){const h=parseInt(c[1]);h>=n&&(n=h+1)}}const l=`w${n}-${i}`,r=(this.cases||[]).find(f=>f.path===s)?.name||s.split("/").pop()||"",u=this.loadAppSettingsFromStorage(),a=this.buildEnvOverrides(this.getCaseSettings(r),u),m=this.getEffortSetting(u),t=await(await fetch("/api/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({workingDir:s,name:l,resumeSessionId:e,...Object.keys(a).length>0?{envOverrides:a}:{},...m?{effort:m}:{}})})).json();if(!t.success)throw new Error(t.error);const d=t.data.session.id;await fetch(`/api/sessions/${d}/interactive`,{method:"POST"}),this.terminal.writeln(`\x1B[90m Session ${l} ready\x1B[0m`),await this.selectSession(d),this.terminal.focus()}catch(i){this.terminal.writeln(`\x1B[1;31m Error: ${i.message}\x1B[0m`)}},isTerminalAtBottom(){if(!this.terminal)return!0;const e=this.terminal.buffer.active;return e.viewportY>=e.baseY-2},batchTerminalWrite(e){if(this._isLoadingBuffer){this._loadBufferQueue&&this._loadBufferQueue.push(e);return}if(this.writeFrameScheduled||(this._wasAtBottomBeforeWrite=this.isTerminalAtBottom()),(this.activeSessionId?this.sessions.get(this.activeSessionId):null)?.flickerFilterEnabled??!1){if(e.includes("\x1B[2J")||e.includes("\x1B[H\x1B[J")||e.includes("\x1B[H")&&e.includes("\x1B[?25l")){this.flickerFilterActive=!0,this.flickerFilterBuffer+=e,this.flickerFilterTimeout&&clearTimeout(this.flickerFilterTimeout),this.flickerFilterTimeout=setTimeout(()=>{this.flickerFilterTimeout=null,this.flushFlickerBuffer()},SYNC_WAIT_TIMEOUT_MS);return}if(this.flickerFilterActive){this.flickerFilterBuffer+=e;return}}this.pendingWrites.push(e),this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1}))},flushFlickerBuffer(){this.flickerFilterBuffer&&(this.pendingWrites.push(this.flickerFilterBuffer),this.flickerFilterBuffer="",this.flickerFilterActive=!1,this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1})))},_updateLocalEchoState(){const e=this.loadAppSettingsFromStorage(),s=this.activeSessionId?this.sessions.get(this.activeSessionId):null,n=!!((e.localEchoEnabled??MobileDetection.isTouchDevice())&&s);this._localEchoEnabled&&!n&&this._localEchoOverlay?.clear(),this._localEchoEnabled=n,this._localEchoOverlay&&s&&(s.mode==="opencode"?this._localEchoOverlay.setPrompt({type:"custom",offset:3,find:l=>{try{const o=l.buffer.active,r=o.cursorY,u=o.getLine(o.viewportY+r);if(!u)return null;const m=u.translateToString(!0).indexOf("\u2503");return m>=0?{row:r,col:m}:null}catch{return null}}}):s.mode==="shell"?(this._localEchoOverlay.clear(),this._localEchoEnabled=!1):this._localEchoOverlay.setPrompt({type:"custom",offset:0,find:l=>{try{const o=l.buffer.active;for(let r=l.rows-1;r>=0;r--){const u=o.getLine(o.viewportY+r);if(!u)continue;const m=u.translateToString(!0).lastIndexOf("\u276F");if(m>=0)return{row:r,col:m+2}}return{row:Math.max(0,Math.min(l.rows-1,o.cursorY)),col:Math.max(0,Math.min(l.cols-1,o.cursorX))}}catch{return null}}}))},_handleCjkInput(e){if(!this.activeSessionId)return;const s=this.activeSessionId,i=this.sessions.get(s);if(!!!(this._localEchoEnabled&&this._localEchoOverlay&&i?.mode!=="shell")){this._sendInputAsync(s,e);return}if(e==="\x7F"){if(this._localEchoOverlay.removeChar()==="flushed"){const{count:o,text:r}=this._localEchoOverlay.getFlushed();this._flushedOffsets?.has(s)&&(o===0?(this._flushedOffsets.delete(s),this._flushedTexts?.delete(s)):(this._flushedOffsets.set(s,o),this._flushedTexts?.set(s,r))),this._sendInputAsync(s,e)}return}if(/[\r\n]+$/.test(e)){const l=e.replace(/[\r\n]+$/g,"");l&&this._localEchoOverlay.appendText(l);const o=this._localEchoOverlay.pendingText||"";this._localEchoOverlay.clear(),this._localEchoOverlay.suppressBufferDetection(),this._flushedOffsets?.delete(s),this._flushedTexts?.delete(s),o&&this._sendInputAsync(s,o),setTimeout(()=>this._sendInputAsync(s,"\r"),o?80:0);return}if(e.length>1&&e.charCodeAt(0)===27){this._sendInputAsync(s,e);return}if(e.length===1&&e.charCodeAt(0)<32){const l=this._localEchoOverlay.pendingText||"";this._localEchoOverlay.clear(),this._localEchoOverlay.suppressBufferDetection(),this._flushedOffsets?.delete(s),this._flushedTexts?.delete(s),l&&this._sendInputAsync(s,l),this._sendInputAsync(s,e);return}this._localEchoOverlay.appendText(e)},flushPendingWrites(){if(this.pendingWrites.length===0||!this.terminal)return;const e=performance.now(),s=this.pendingWrites.join("");this.pendingWrites=[];const i=s.length;i>16384&&_crashDiag.log(`FLUSH: ${(i/1024).toFixed(0)}KB`);const n=65536;let l=!1;i<=n?this.terminal.write(s):(this.terminal.write(s.slice(0,n)),this.pendingWrites.push(s.slice(n)),l=!0,this.writeFrameScheduled||(this.writeFrameScheduled=!0,this._safeYield(()=>{this.flushPendingWrites(),this.writeFrameScheduled=!1})));const o=l?n:i,r=performance.now()-e;if((r>100||l)&&console.warn(`[CRASH-DIAG] flushPendingWrites: ${r.toFixed(0)}ms, ${(o/1024).toFixed(0)}KB written${l?", rest deferred":""} (total ${(i/1024).toFixed(0)}KB)`),this._wasAtBottomBeforeWrite&&this.terminal.scrollToBottom(),this._localEchoOverlay?.hasPending&&this._localEchoOverlay.rerender(),this._tabCompletionSessionId&&this._tabCompletionSessionId===this.activeSessionId&&this._localEchoOverlay&&!this._localEchoOverlay.pendingText){const u=this._localEchoOverlay,a=this;this.terminal.write("",()=>{if(!a._tabCompletionSessionId)return;u.resetBufferDetection();const m=u.detectBufferText();m?m===a._tabCompletionBaseText?(u.undoDetection(),a._tabCompletionRetries=(a._tabCompletionRetries||0)+1,a._tabCompletionRetries>60&&(a._tabCompletionSessionId=null,a._tabCompletionRetries=0)):(a._tabCompletionSessionId=null,a._tabCompletionRetries=0,a._tabCompletionBaseText=null,a._tabCompletionFallback&&(clearTimeout(a._tabCompletionFallback),a._tabCompletionFallback=null),u.rerender()):(a._tabCompletionRetries=(a._tabCompletionRetries||0)+1,a._tabCompletionRetries>60&&(a._tabCompletionSessionId=null,a._tabCompletionRetries=0))})}},_safeYield(e){let s=!1;const i=()=>{s||(s=!0,e())};requestAnimationFrame(i),setTimeout(i,50),this._workerYield(i)},_workerYield(e){try{if(this._yieldWorker===void 0){const s="onmessage=()=>setTimeout(()=>postMessage(0),0);",i=new Blob([s],{type:"application/javascript"}),n=URL.createObjectURL(i);this._yieldWorker=new Worker(n),URL.revokeObjectURL(n),this._yieldQueue=[],this._yieldWorker.onmessage=()=>{const l=this._yieldQueue.shift();l&&l()}}if(!this._yieldWorker)return;this._yieldQueue.push(e),this._yieldWorker.postMessage(0)}catch{this._yieldWorker=null}},scrollToLastNonEmptyLine(){if(!this.terminal?.buffer?.active){this.terminal?.scrollToBottom?.();return}const e=this.terminal.buffer.active,s=e.baseY+e.length;let i=-1;for(let n=s-1;n>=0;n--)if(e.getLine(n)?.translateToString(!0).trim()){i=n;break}if(i>=0&&typeof this.terminal.scrollToLine=="function"){let n=Math.max(0,i-this.terminal.rows+2);const l=Math.max(0,i);for(;n<l&&!e.getLine(n)?.translateToString(!0).trim();)n++;this.terminal.scrollToLine(n)}else this.terminal.scrollToBottom()},chunkedTerminalWrite(e,s=TERMINAL_CHUNK_SIZE,i){const n=++this._chunkedWriteGen,l=this._beginBufferLoad(i);return new Promise(o=>{if(!e||e.length===0){this._finishBufferLoad(l),o();return}const r=e.replace(DEC_SYNC_STRIP_RE,""),u=()=>{this._chunkedWriteGen===n&&this._finishBufferLoad(l),o()};if(r.length<=s){this.terminal.write(r,u);return}let a=0;const m=performance.now();let y=0;const t=()=>{if(this._chunkedWriteGen!==n){o();return}if(a>=r.length){const h=performance.now()-m;console.log(`[CRASH-DIAG] chunkedTerminalWrite complete: ${r.length} bytes in ${y} chunks, ${h.toFixed(0)}ms total`),this._safeYield(u);return}const d=performance.now(),f=r.slice(a,a+s);this.terminal.write(f);const c=performance.now()-d;y++,c>50&&console.warn(`[CRASH-DIAG] chunk #${y} write took ${c.toFixed(0)}ms (${f.length} bytes at offset ${a})`),a+=s,this._safeYield(t)};this._safeYield(t)})},_beginBufferLoad(e){this._bufferLoadSeq===void 0&&(this._bufferLoadSeq=0);const s=e===void 0?`buffer-${++this._bufferLoadSeq}`:e;return this._bufferLoadOwner=s,this._isLoadingBuffer=!0,this._loadBufferQueue=[],s},_finishBufferLoad(e){return e!==void 0&&this._bufferLoadOwner!==e?!1:(this._isLoadingBuffer=!1,this._loadBufferQueue=null,this._bufferLoadOwner=null,!0)},clearTerminal(){this.terminal.clear()},async restoreTerminalSize(){if(!this.activeSessionId){this.showToast("No active session","warning");return}const e=this.getTerminalDimensions();if(!e){this.showToast("Could not determine terminal size","error");return}try{await this.sendResize(this.activeSessionId),this.showToast(`Terminal restored to ${e.cols}x${e.rows}`,"success")}catch(s){console.error("Failed to restore terminal size:",s),this.showToast("Failed to restore terminal size","error")}},sendPendingCtrlL(e){},async copyTerminal(){try{const e=this.terminal.buffer.active;let s="";for(let i=0;i<e.length;i++){const n=e.getLine(i);n&&(s+=n.translateToString(!0)+`
2
- `)}await navigator.clipboard.writeText(s.replace(/\n+$/,`
3
- `)),this.showToast("Copied to clipboard","success")}catch{this.showToast("Failed to copy","error")}},_syncMobileHelperTextareaToCursor(){if(!(!MobileDetection.isTouchDevice()||!this.terminal?.element))try{const e=this.terminal.element,s=this.terminal.element.querySelector(".xterm-cursor"),i=this.terminal.element.querySelector(".xterm-screen");if(!(e instanceof HTMLElement)||!(s instanceof HTMLElement)||!(i instanceof HTMLElement))return;const n=s.getBoundingClientRect(),l=i.getBoundingClientRect();if(!n.width&&!n.height)return;const o=Math.max(0,Math.round(n.left-l.left)),r=Math.max(0,Math.round(n.top-l.top));e.style.setProperty("--xterm-helper-left",`${o}px`),e.style.setProperty("--xterm-helper-top",`${r}px`)}catch{}},increaseFontSize(){const e=this.terminal.options.fontSize||14;this.setFontSize(Math.min(e+2,24))},decreaseFontSize(){const e=this.terminal.options.fontSize||14;this.setFontSize(Math.max(e-2,10))},setFontSize(e){this.terminal.options.fontSize=e,document.getElementById("fontSizeDisplay").textContent=e,this.fitAddon.fit(),localStorage.setItem("codeman-font-size",e),this._localEchoOverlay?.refreshFont()},loadFontSize(){const e=localStorage.getItem("codeman-font-size");if(e){const s=parseInt(e,10);s>=10&&s<=24&&(this.terminal.options.fontSize=s,document.getElementById("fontSizeDisplay").textContent=s)}},getTerminalDimensions(){const i=this.fitAddon?.proposeDimensions();return i?{cols:Math.max(i.cols,40),rows:Math.max(i.rows,10)}:null},async sendResize(e,s={}){this.fitAddon&&this.fitAddon.fit();const i=this.getTerminalDimensions();if(!i)return!1;const n=this._lastResizeDims,l=!n||n.cols!==i.cols||n.rows!==i.rows;this._lastResizeDims={cols:i.cols,rows:i.rows};const o=typeof MobileDetection<"u"&&MobileDetection.getDeviceType?MobileDetection.getDeviceType():window.innerWidth<430?"mobile":window.innerWidth<768?"tablet":"desktop";if(!s.forceHttp&&this._wsReady&&this._wsSessionId===e)try{return this._ws.send(JSON.stringify({t:"z",c:i.cols,r:i.rows,v:o})),l}catch{}return await fetch(`/api/sessions/${e}/resize`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...i,viewportType:o})}),l},async sendInput(e){this.activeSessionId&&await fetch(`/api/sessions/${this.activeSessionId}/input`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:e,useMux:!0})})},toggleDirInput(){const e=document.querySelector("#dirDisplay").parentElement,s=document.getElementById("dirInput");s.classList.contains("hidden")&&(s.classList.remove("hidden"),e.style.display="none",s.focus())},hideDirInput(){const e=document.querySelector("#dirDisplay").parentElement,s=document.getElementById("dirInput");setTimeout(()=>{s.classList.add("hidden"),e.style.display="";const i=s.value.trim();document.getElementById("dirDisplay").textContent=i||"No directory"},100)}});