cli-jaw 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  *Claude, Codex, Gemini... 이제 번갈아 쓰지 마세요.*
8
8
 
9
- [![Tests](https://img.shields.io/badge/tests-445%20pass-brightgreen)](#-테스트)
9
+ [![Tests](https://img.shields.io/badge/tests-608%20pass-brightgreen)](#-테스트)
10
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue)](https://typescriptlang.org)
11
11
  [![Node](https://img.shields.io/badge/node-%3E%3D22-blue)](https://nodejs.org)
12
12
  [![License](https://img.shields.io/badge/license-ISC-yellow)](LICENSE)
@@ -96,6 +96,8 @@ jaw serve
96
96
 
97
97
  **끝.** **http://localhost:3457** 열고 바로 채팅하세요. 🦈
98
98
 
99
+ > 🕐 **24시간 돌아가게 만들고 싶으세요?** `jaw service install` — systemd, launchd, Docker 자동 감지.
100
+
99
101
  > **Node.js ≥ 22** ([다운로드](https://nodejs.org)) + 아래에서 **AI CLI 최소 1개** 인증 필요.
100
102
 
101
103
  ---
@@ -152,7 +154,7 @@ CLI-JAW는 내 컴퓨터에 상주하며 이미 익숙한 인터페이스인 **
152
154
  > 💬 *"이 모듈 리팩토링하고 테스트도 짜줘"* → 서브에이전트가 알아서, 커피 한 잔 하고 오면 돼요
153
155
  > 💬 *"저 PDF 다운받아서 핵심만 노션에 정리해"* → 브라우저 + 노션 스킬 조합으로 뚝딱
154
156
 
155
- 단일 모델만을 사용하는 기존 비서들과 달리, CLI-JAW는 5개의 AI 엔진(Claude, Codex, Gemini, OpenCode, Copilot)을 공식 CLI를 통해 오케스트레이션하여 모든 제공업체의 장점을 통합된 경험으로 제공합니다. 하나의 엔진 사용량이 초과되면 자동으로 다음 엔진으로 전환됩니다. 107개의 내장 스킬이 브라우저 자동화부터 문서 생성까지 모든 것을 처리합니다.
157
+ 단일 모델만을 사용하는 기존 비서들과 달리, CLI-JAW는 5개의 AI 엔진(Claude, Codex, Gemini, OpenCode, Copilot)을 공식 CLI를 통해 오케스트레이션하여 모든 제공업체의 장점을 통합된 경험으로 제공합니다. 하나의 엔진 사용량이 초과되면 자동으로 다음 엔진으로 전환됩니다. 108개의 내장 스킬이 브라우저 자동화부터 문서 생성까지 모든 것을 처리합니다.
156
158
 
157
159
  | | 왜 CLI-JAW인가요? |
158
160
  | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
@@ -160,7 +162,7 @@ CLI-JAW는 내 컴퓨터에 상주하며 이미 익숙한 인터페이스인 **
160
162
  | 🤖 **검증된 에이전트 도구** | 실전에서 검증된 5개의 코딩 에이전트(Claude, Codex, Gemini, OpenCode, Copilot)를 한 곳에서 사용하세요. |
161
163
  | ⚡ **멀티 에이전트 자동 전환(Fallback)** | 엔진 하나가 멈춰도 걱정 없습니다. 다음 엔진이 즉시 이어받아 중단 없는 작업이 가능합니다. |
162
164
  | 🎭 **오케스트레이션 기반 성능 극대화** | 복잡한 작업은 전문화된 서브 에이전트에게 분산시켜 처리량을 극대화합니다. |
163
- | 📦 **107개의 내장 스킬** | 브라우저 자동화, 문서 생성, 텔레그램 연동, 영구 메모리 등 설치 즉시 사용 가능한 기능들을 제공합니다. |
165
+ | 📦 **108개의 내장 스킬** | 브라우저 자동화, 문서 생성, 텔레그램 연동, 영구 메모리 등 설치 즉시 사용 가능한 기능들을 제공합니다. |
164
166
  | 🖥️ **크로스 플랫폼** | macOS, Linux, Windows — ENOENT-safe CLI 스폰, 자동 감지, `.cmd` shim 지원, 네이티브 설치 전부 크로스플랫폼 동작. |
165
167
 
166
168
  ![CLI-JAW 터미널](docs/screenshots/terminal-cli.png)
@@ -187,7 +189,7 @@ graph LR
187
189
  - 🤖 **5개의 AI 엔진, 1명의 비서** — Claude · Codex · Gemini · OpenCode · Copilot. `/cli` 명령어로 전환하세요.
188
190
  - ⚡ **자동 전환(Fallback)** — 엔진 하나가 다운되면 다음 엔진이 매끄럽게 이어받습니다.
189
191
  - 🎭 **멀티 에이전트 오케스트레이션** — 복잡한 작업은 전문화된 서브 에이전트들에게 자동으로 분산됩니다.
190
- - 📦 **107개의 스킬** — 브라우저 제어, 파일 편집, 이미지 생성, 웹 검색 외 [다양한 기능](#-스킬-시스템).
192
+ - 📦 **108개의 스킬** — 브라우저 제어, 파일 편집, 이미지 생성, 웹 검색 외 [다양한 기능](#-스킬-시스템).
191
193
  - 🧠 **영구 메모리** — 세션을 넘나들며 과거의 대화와 사용자 선호도를 기억합니다.
192
194
  - 📱 **텔레그램 봇** — 휴대폰으로 비서와 채팅하고, 음성/사진/파일을 전송하세요.
193
195
  - 🌐 **브라우저 자동화** — 비서가 알아서 웹을 탐색하고, 클릭하고, 타이핑하고, 스크린샷을 찍을 수 있습니다.
@@ -201,7 +203,7 @@ graph LR
201
203
 
202
204
  ```bash
203
205
  jaw chat # 터미널 TUI (브라우저 필요 없음)
204
- jaw launchd # 부팅 시 자동 실행 (macOS)
206
+ jaw service install # 부팅 시 자동 실행 (systemd/launchd/docker 자동 감지)
205
207
  ```
206
208
 
207
209
  > ⚠️ **설치 시 참고:** `npm install -g cli-jaw`는 postinstall 스크립트를 실행하여 스킬 디렉토리, 커스텀 인스트럭션, MCP 설정을 구성합니다. 기존 설정은 덮어쓰지 않고 병합됩니다.
@@ -210,7 +212,7 @@ jaw launchd # 부팅 시 자동 실행 (macOS)
210
212
 
211
213
  ## 📦 스킬 시스템
212
214
 
213
- **107개 스킬** 내장 — 브라우저, GitHub, 노션, 텔레그램, 메모리, PDF, 이미지 생성 등 [다양하게](#).
215
+ **108개 스킬** 내장 — 브라우저, GitHub, 노션, 텔레그램, 메모리, PDF, 이미지 생성 등 [다양하게](#).
214
216
 
215
217
  <details>
216
218
  <summary>전체 스킬 목록 보기</summary>
@@ -345,9 +347,10 @@ graph LR
345
347
 
346
348
  ```bash
347
349
  jaw serve # 서버 시작
348
- jaw launchd # 부팅 시 자동 실행 (macOS)
349
- jaw launchd status # 데몬 상태 확인
350
- jaw launchd unset # 자동 실행 해제
350
+ jaw service install # 부팅 시 자동 실행 (systemd/launchd/docker 자동 감지)
351
+ jaw service status # 데몬 상태 확인
352
+ jaw service unset # 자동 실행 해제
353
+ jaw service logs # 서비스 로그 보기
351
354
  jaw chat # 터미널 TUI
352
355
  jaw doctor # 진단 (12개 체크)
353
356
  jaw skill install <name> # 스킬 설치
@@ -374,8 +377,8 @@ jaw clone ~/my-project
374
377
  jaw --home ~/my-project serve --port 3458
375
378
 
376
379
  # 또는 둘 다 부팅 시 자동 실행
377
- jaw launchd # 기본 → 포트 3457
378
- jaw --home ~/my-project launchd --port 3458 # 프로젝트 → 포트 3458
380
+ jaw service install # 기본 → 포트 3457
381
+ jaw --home ~/my-project service install --port 3458 # 프로젝트 → 포트 3458
379
382
  ```
380
383
 
381
384
  각 인스턴스는 완전히 독립적입니다 — 작업 디렉토리, 메모리, MCP 설정이 모두 다릅니다. 업무/개인 컨텍스트 분리나 프로젝트별 AI 설정에 안성맞춤이에요.
@@ -386,7 +389,7 @@ jaw --home ~/my-project launchd --port 3458 # 프로젝트 → 포트 3458
386
389
  | `--home=<경로>` | 동일 (`=` 구문) |
387
390
  | `CLI_JAW_HOME=<경로>` | 환경변수로 지정 |
388
391
  | `jaw clone <대상>` | 현재 인스턴스를 새 디렉토리로 복제 |
389
- | `--port <포트>` | `serve` / `launchd`용 커스텀 포트 |
392
+ | `--port <포트>` | `serve` / `service`용 커스텀 포트 |
390
393
 
391
394
  ---
392
395
 
@@ -467,7 +470,7 @@ src/
467
470
  ## 🧪 테스트
468
471
 
469
472
  <details>
470
- <summary>445 pass · 1 skipped · 외부 의존성 0</summary>
473
+ <summary>608 pass · 1 skipped · 외부 의존성 0</summary>
471
474
 
472
475
  ```bash
473
476
  npm test
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  *One assistant. Five brains. Always on.*
8
8
 
9
- [![Tests](https://img.shields.io/badge/tests-575%20pass-brightgreen)](#-tests)
9
+ [![Tests](https://img.shields.io/badge/tests-608%20pass-brightgreen)](#-tests)
10
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue)](https://typescriptlang.org)
11
11
  [![Node](https://img.shields.io/badge/node-%3E%3D22-blue)](https://nodejs.org)
12
12
  [![License](https://img.shields.io/badge/license-ISC-yellow)](LICENSE)
@@ -96,6 +96,8 @@ jaw serve
96
96
 
97
97
  **That's it.** Open **http://localhost:3457** and start chatting. 🦈
98
98
 
99
+ > 🕐 **Want it running 24/7?** `jaw service install` — auto-detects systemd, launchd, or Docker.
100
+
99
101
  > Requires **Node.js ≥ 22** ([download](https://nodejs.org)) and **at least 1 AI CLI** authenticated below.
100
102
 
101
103
  ---
@@ -187,7 +189,7 @@ graph LR
187
189
  - 🤖 **5 AI engines, 1 assistant** — Claude · Codex · Gemini · OpenCode · Copilot. Switch with `/cli`.
188
190
  - ⚡ **Auto fallback** — If one engine is down, the next picks up seamlessly.
189
191
  - 🎭 **Multi-agent orchestration** — Complex tasks get split across specialized sub-agents automatically.
190
- - 📦 **107 skills** — Browser control, file editing, image generation, web search, and [much more](#-skill-system).
192
+ - 📦 **108 skills** — Browser control, file editing, image generation, web search, and [much more](#-skill-system).
191
193
  - 🧠 **Persistent memory** — Your assistant remembers past conversations and preferences across sessions.
192
194
  - 📱 **Telegram bot** — Chat with your assistant from your phone, send voice/photos/files.
193
195
  - 🌐 **Browser automation** — Your assistant can navigate the web, click, type, and screenshot.
@@ -199,7 +201,7 @@ graph LR
199
201
 
200
202
  ## 📦 Skill System
201
203
 
202
- **107 skills** out of the box — browser, github, notion, telegram, memory, pdf, image generation, and [much more](#).
204
+ **108 skills** out of the box — browser, github, notion, telegram, memory, pdf, image generation, and [much more](#).
203
205
 
204
206
  <details>
205
207
  <summary>View all skills</summary>
@@ -336,6 +338,10 @@ No more editing 5 different config files. Install once → all AI engines get it
336
338
 
337
339
  ```bash
338
340
  jaw serve # Start server
341
+ jaw service install # Auto-start on boot (systemd/launchd/docker auto-detected)
342
+ jaw service status # Check daemon status
343
+ jaw service unset # Remove auto-start
344
+ jaw service logs # View service logs
339
345
  jaw chat # Terminal TUI
340
346
  jaw doctor # Diagnostics (12 checks)
341
347
  jaw skill install <name> # Install a skill
@@ -345,14 +351,6 @@ jaw browser start # Launch Chrome (CDP)
345
351
  jaw browser vision-click "Login" # AI-powered click
346
352
  jaw clone ~/my-project # Clone instance for a separate project
347
353
  jaw --home ~/my-project serve --port 3458 # Run a second instance
348
- jaw service # Auto-start (auto-detects: launchd/systemd/docker)
349
- jaw service --port 3458 # Auto-start with custom port
350
- jaw service status # Check daemon status
351
- jaw service unset # Remove auto-start
352
- jaw service logs # View service logs
353
- jaw launchd # Auto-start on boot (macOS only)
354
- jaw launchd status # Check macOS daemon status
355
- jaw launchd unset # Remove macOS auto-start
356
354
  jaw reset # Full reset
357
355
  ```
358
356
 
@@ -500,7 +498,7 @@ src/
500
498
  ## 🧪 Tests
501
499
 
502
500
  <details>
503
- <summary>575 pass · 1 skipped · zero external dependencies</summary>
501
+ <summary>608 pass · 1 skipped · zero external dependencies</summary>
504
502
 
505
503
  ```bash
506
504
  npm test
@@ -512,6 +510,8 @@ All tests run via `tsx --test` (native Node.js test runner + TypeScript).
512
510
 
513
511
  ---
514
512
 
513
+
514
+
515
515
  ## 📖 Documentation
516
516
 
517
517
  | Document | What's inside |
package/README.zh-CN.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  *Claude、Codex、Gemini... 从此告别来回切换。*
8
8
 
9
- [![Tests](https://img.shields.io/badge/tests-445%20pass-brightgreen)](#-测试)
9
+ [![Tests](https://img.shields.io/badge/tests-608%20pass-brightgreen)](#-测试)
10
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue)](https://typescriptlang.org)
11
11
  [![Node](https://img.shields.io/badge/node-%3E%3D22-blue)](https://nodejs.org)
12
12
  [![License](https://img.shields.io/badge/license-ISC-yellow)](LICENSE)
@@ -96,6 +96,8 @@ jaw serve
96
96
 
97
97
  **搞定。** 打开 **http://localhost:3457** 直接开聊。🦈
98
98
 
99
+ > 🕐 **想让它 24 小时运行?** `jaw service install` — 自动检测 systemd、launchd 或 Docker。
100
+
99
101
  > 需要 **Node.js ≥ 22**([下载](https://nodejs.org))+ 下方**至少 1 个 AI CLI** 完成认证。
100
102
 
101
103
  ---
@@ -152,7 +154,7 @@ CLI-JAW 是驻留在您本地机器上的**专属 AI 助手**,并在您熟悉
152
154
  > 💬 *"重构这个模块,顺便写好测试"* → 子 Agent 搞定,你喝杯咖啡回来就行
153
155
  > 💬 *"把那个 PDF 下载下来,关键信息放到 Notion 里"* → 浏览器 + Notion 技能组合,搞定
154
156
 
155
- 与单一模型的助手不同,CLI-JAW 通过官方 CLI 命令行工具对 **5 大 AI 引擎**(Claude、Codex、Gemini、OpenCode、Copilot)进行编排 — 为您提供各大供应商最优势的能力及统一的体验。当一个引擎处于繁忙状态时,它会自动无缝切换至下一个。107 个内置技能可处理从浏览器自动化到文档生成的所有事务。
157
+ 与单一模型的助手不同,CLI-JAW 通过官方 CLI 命令行工具对 **5 大 AI 引擎**(Claude、Codex、Gemini、OpenCode、Copilot)进行编排 — 为您提供各大供应商最优势的能力及统一的体验。当一个引擎处于繁忙状态时,它会自动无缝切换至下一个。108 个内置技能可处理从浏览器自动化到文档生成的所有事务。
156
158
 
157
159
  | | 为什么选择 CLI-JAW? |
158
160
  | ------------------------------- | ------------------------------------------------------------------------------------- |
@@ -160,7 +162,7 @@ CLI-JAW 是驻留在您本地机器上的**专属 AI 助手**,并在您熟悉
160
162
  | 🤖 **经过验证的智能体工具** | 5 大实战级编码智能体(Claude、Codex、Gemini、OpenCode、Copilot)集于一身。 |
161
163
  | ⚡ **多模型自动回退 (Fallback)** | 单一引擎发生故障?下一个立即接管。确保零停机。 |
162
164
  | 🎭 **基于编排的性能优化** | 复杂的任务会被拆分给专业的子智能体,以实现效率最大化。 |
163
- | 📦 **107 个内置技能** | 浏览器自动化、文档生成、Telegram 通知、持久化记忆 — 开箱即用。 |
165
+ | 📦 **108 个内置技能** | 浏览器自动化、文档生成、Telegram 通知、持久化记忆 — 开箱即用。 |
164
166
  | 🖥️ **跨平台支持** | macOS、Linux、Windows — ENOENT-safe CLI 启动、自动检测、`.cmd` 支持,跨平台原生运行。 |
165
167
 
166
168
  ![CLI-JAW 终端](docs/screenshots/terminal-cli.png)
@@ -187,7 +189,7 @@ graph LR
187
189
  - 🤖 **5 大 AI 引擎,1 个专属助手** — Claude · Codex · Gemini · OpenCode · Copilot。使用 `/cli` 命令一键切换。
188
190
  - ⚡ **自动回退 (Fallback)** — 即使一个引擎出现故障,下一个也会无缝接管。
189
191
  - 🎭 **多智能体编排** — 复杂任务会自动拆分给专业的子智能体并行处理。
190
- - 📦 **107 个技能** — 浏览器控制、文件编辑、图片生成、网页搜索以及[更多功能](#-技能系统)。
192
+ - 📦 **108 个技能** — 浏览器控制、文件编辑、图片生成、网页搜索以及[更多功能](#-技能系统)。
191
193
  - 🧠 **持久化记忆** — 跨越不同会话,记住您过往的对话和偏好设定。
192
194
  - 📱 **Telegram 机器人** — 通过手机即可与您的助手聊天、发送语音/图片/文件。
193
195
  - 🌐 **浏览器自动化** — 您的助手能够自动导航网页、点击、打字并进行截图。
@@ -201,7 +203,7 @@ graph LR
201
203
 
202
204
  ```bash
203
205
  jaw chat # 终端 TUI(无需浏览器)
204
- jaw launchd # 开机自动启动 (macOS)
206
+ jaw service install # 开机自动启动 (systemd/launchd/docker 自动检测)
205
207
  ```
206
208
 
207
209
  > ⚠️ **安装须知:** `npm install -g cli-jaw` 运行 postinstall 脚本,设置技能目录、自定义指令和 MCP 配置。现有配置不会被覆盖,而是合并处理。
@@ -210,7 +212,7 @@ jaw launchd # 开机自动启动 (macOS)
210
212
 
211
213
  ## 📦 技能系统
212
214
 
213
- **107 个技能**开箱即用 — 浏览器、GitHub、Notion、Telegram、记忆、PDF、图片生成等[应有尽有](#)。
215
+ **108 个技能**开箱即用 — 浏览器、GitHub、Notion、Telegram、记忆、PDF、图片生成等[应有尽有](#)。
214
216
 
215
217
  <details>
216
218
  <summary>查看全部技能</summary>
@@ -345,9 +347,10 @@ graph LR
345
347
 
346
348
  ```bash
347
349
  jaw serve # 启动服务器
348
- jaw launchd # 开机自动启动 (macOS)
349
- jaw launchd status # 查看守护进程状态
350
- jaw launchd unset # 取消自动启动
350
+ jaw service install # 开机自动启动 (systemd/launchd/docker 自动检测)
351
+ jaw service status # 查看守护进程状态
352
+ jaw service unset # 取消自动启动
353
+ jaw service logs # 查看服务日志
351
354
  jaw chat # 终端 TUI
352
355
  jaw doctor # 诊断(12 项检查)
353
356
  jaw skill install <name> # 安装技能
@@ -374,8 +377,8 @@ jaw clone ~/my-project
374
377
  jaw --home ~/my-project serve --port 3458
375
378
 
376
379
  # 或者两个都设置开机自启
377
- jaw launchd # 默认 → 端口 3457
378
- jaw --home ~/my-project launchd --port 3458 # 项目 → 端口 3458
380
+ jaw service install # 默认 → 端口 3457
381
+ jaw --home ~/my-project service install --port 3458 # 项目 → 端口 3458
379
382
  ```
380
383
 
381
384
  每个实例完全独立 — 工作目录、记忆、MCP 配置各不相同。非常适合工作/个人环境分离或按项目配置 AI。
@@ -386,7 +389,7 @@ jaw --home ~/my-project launchd --port 3458 # 项目 → 端口 3458
386
389
  | `--home=<路径>` | 同上(`=` 语法) |
387
390
  | `CLI_JAW_HOME=<路径>` | 通过环境变量指定 |
388
391
  | `jaw clone <目标>` | 将当前实例克隆到新目录 |
389
- | `--port <端口>` | `serve` / `launchd` 自定义端口 |
392
+ | `--port <端口>` | `serve` / `service` 自定义端口 |
390
393
 
391
394
  ---
392
395
 
@@ -467,7 +470,7 @@ src/
467
470
  ## 🧪 测试
468
471
 
469
472
  <details>
470
- <summary>445 pass · 1 skipped · 零外部依赖</summary>
473
+ <summary>608 pass · 1 skipped · 零外部依赖</summary>
471
474
 
472
475
  ```bash
473
476
  npm test
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-jaw",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Personal AI assistant powered by 5 engines (Claude, Codex, Gemini, OpenCode, Copilot) — Web, Terminal, and Telegram interfaces with 107 built-in skills",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -1,4 +1,4 @@
1
- var Bn=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var n in t)Bn(e,n,{get:t[n],enumerable:!0})};var l,w=b(()=>{"use strict";l={ws:null,agentBusy:!1,employees:[],allSkills:[],currentSkillFilter:"all",currentAgentDiv:null,attachedFiles:[],heartbeatJobs:[],cliStatusCache:null,cliStatusTs:0}});var Bt={};O(Bt,{api:()=>y,apiFire:()=>C,apiJson:()=>f});async function y(e,t={}){try{let n=await fetch(e,t);if(!n.ok)return console.warn(`[api] ${t.method||"GET"} ${e} \u2192 ${n.status}`),null;if(!(n.headers.get("content-type")||"").includes("json"))return null;let i=await n.json();return i&&typeof i=="object"&&"ok"in i&&"data"in i?i.ok?i.data:(console.warn(`[api] ${e} \u2192 ok:false`,i.error||""),null):i}catch(n){return console.warn(`[api] ${e} failed:`,n.message),null}}async function f(e,t,n){return y(e,{method:t,headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})}function C(e,t="POST",n){let o={method:t};n&&(o.headers={"Content-Type":"application/json"},o.body=JSON.stringify(n)),fetch(e,o).catch(()=>{})}var L=b(()=>{"use strict"});function Pt(e){let t={};for(let[n,o]of Object.entries(e))t[n]=Array.isArray(o?.models)?[...o.models]:[];return t}function Rt(e){let t={};for(let[n,o]of Object.entries(e||{})){if(!o||typeof o!="object")continue;let i=o,a={label:i.label||n,efforts:Array.isArray(i.efforts)?[...i.efforts]:[],models:Array.isArray(i.models)?[...i.models]:[]};typeof i.effortNote=="string"&&i.effortNote.trim()&&(a.effortNote=i.effortNote),t[n]=a}return t}function $t(e){let t=Rt(e);return Object.keys(t).length?(U=t,Ot=Object.keys(t),$=Pt(t),!0):!1}async function oe(){try{let e=await y("/api/cli-registry");if(!e||!$t(e))throw new Error("invalid registry")}catch(e){console.warn("[cli-registry] fallback:",e.message),$t(At)}return U}function H(){return Ot}function ie(e){return U[e]||null}var At,U,Ot,$,W,ae=b(()=>{"use strict";L();At={claude:{label:"Claude",efforts:["low","medium","high"],models:["claude-sonnet-4-6","claude-opus-4-6","claude-sonnet-4-6[1m]","claude-opus-4-6[1m]","claude-haiku-4-5-20251001"]},codex:{label:"Codex",efforts:["low","medium","high","xhigh"],models:["gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.2-codex","gpt-5.1-codex-max","gpt-5.1-codex-mini"]},gemini:{label:"Gemini",efforts:[],models:["gemini-3.0-pro-preview","gemini-3.1-pro-preview","gemini-2.5-pro","gemini-3-flash-preview","gemini-2.5-flash"]},opencode:{label:"OpenCode",efforts:["minimal","low","high","max"],models:["anthropic/claude-opus-4-6-thinking","anthropic/claude-sonnet-4-6-thinking","anthropic/claude-sonnet-4-6","openai/gpt-5.3-codex-xhigh","openai/gpt-5.3-codex-high","opencode/big-pickle","opencode/GLM-5 Free","opencode/MiniMax M2.5 Free","opencode/Kimi K2.5 Free","opencode/GPT 5 Nano Free","opencode/Grok Code Fast 1 Free"]},copilot:{label:"Copilot",efforts:["low","medium","high"],effortNote:"\u2192 ~/.copilot/config.json",models:["claude-sonnet-4.6","claude-opus-4.6","claude-opus-4.6-fast","claude-haiku-4.5","gpt-5.3-codex","gpt-5.2-codex","gpt-5.1-codex","gpt-4.1","gpt-5-mini","gemini-3-pro-preview"]}};U=Rt(At),Ot=Object.keys(U),$=Pt(U);W=[{value:"frontend",labelKey:"role.label.frontend",label:"Frontend",prompt:"UI/UX, CSS, components",skill:"dev-frontend"},{value:"backend",labelKey:"role.label.backend",label:"Backend",prompt:"API, DB, server logic",skill:"dev-backend"},{value:"data",labelKey:"role.label.data",label:"Data",prompt:"Data pipeline, analysis, ML",skill:"dev-data"},{value:"docs",labelKey:"role.label.docs",label:"Docs",prompt:"Documentation, README, API docs",skill:"documentation"},{value:"custom",labelKey:"role.label.custom",label:"Custom...",prompt:"",skill:null}]});var G={};O(G,{addEmployee:()=>Be,deleteEmployee:()=>$e,loadEmployees:()=>He,onEmpCliChange:()=>Ae,onEmpRoleChange:()=>Pe,renderEmployees:()=>Dt,updateEmployee:()=>B});async function He(){let e=await y("/api/employees");l.employees=e||[],Dt()}function Dt(){let e=document.getElementById("employeesList");if(!e)return;let t=l.employees;if(t.length===0){e.innerHTML=`<div style="color:var(--text-dim);font-size:11px;padding:4px 0">${c("emp.addPrompt")}</div>`;return}let n=H();e.innerHTML=t.map(o=>{let i=$[o.cli]||[],a=$n[o.role||""],r=a?W.find(p=>p.value===a):W.find(p=>p.prompt===o.role),d=r?r.value:o.role?"custom":"frontend",s=d==="custom",u=Ft(o.id),g=u?.phase||o.phase,v=u?.phaseLabel||o.phaseLabel,E=g?`<span style="background:${An[g]||"#888"};color:#000;padding:1px 6px;border-radius:9px;font-size:9px">${v||"P"+g}</span>`:"";return`
1
+ var $n=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var n in t)$n(e,n,{get:t[n],enumerable:!0})};var l,w=b(()=>{"use strict";l={ws:null,agentBusy:!1,employees:[],allSkills:[],currentSkillFilter:"all",currentAgentDiv:null,attachedFiles:[],heartbeatJobs:[],cliStatusCache:null,cliStatusTs:0}});var $t={};O($t,{api:()=>y,apiFire:()=>C,apiJson:()=>f});async function y(e,t={}){try{let n=await fetch(e,t);if(!n.ok)return console.warn(`[api] ${t.method||"GET"} ${e} \u2192 ${n.status}`),null;if(!(n.headers.get("content-type")||"").includes("json"))return null;let i=await n.json();return i&&typeof i=="object"&&"ok"in i&&"data"in i?i.ok?i.data:(console.warn(`[api] ${e} \u2192 ok:false`,i.error||""),null):i}catch(n){return console.warn(`[api] ${e} failed:`,n.message),null}}async function f(e,t,n){return y(e,{method:t,headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})}function C(e,t="POST",n){let o={method:t};n&&(o.headers={"Content-Type":"application/json"},o.body=JSON.stringify(n)),fetch(e,o).catch(()=>{})}var L=b(()=>{"use strict"});function Pt(e){let t={};for(let[n,o]of Object.entries(e))t[n]=Array.isArray(o?.models)?[...o.models]:[];return t}function Rt(e){let t={};for(let[n,o]of Object.entries(e||{})){if(!o||typeof o!="object")continue;let i=o,a={label:i.label||n,efforts:Array.isArray(i.efforts)?[...i.efforts]:[],models:Array.isArray(i.models)?[...i.models]:[]};typeof i.effortNote=="string"&&i.effortNote.trim()&&(a.effortNote=i.effortNote),t[n]=a}return t}function Bt(e){let t=Rt(e);return Object.keys(t).length?(U=t,Ot=Object.keys(t),B=Pt(t),!0):!1}async function oe(){try{let e=await y("/api/cli-registry");if(!e||!Bt(e))throw new Error("invalid registry")}catch(e){console.warn("[cli-registry] fallback:",e.message),Bt(At)}return U}function H(){return Ot}function ie(e){return U[e]||null}var At,U,Ot,B,W,ae=b(()=>{"use strict";L();At={claude:{label:"Claude",efforts:["low","medium","high"],models:["claude-sonnet-4-6","claude-opus-4-6","claude-sonnet-4-6[1m]","claude-opus-4-6[1m]","claude-haiku-4-5-20251001"]},codex:{label:"Codex",efforts:["low","medium","high","xhigh"],models:["gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.2-codex","gpt-5.1-codex-max","gpt-5.1-codex-mini"]},gemini:{label:"Gemini",efforts:[],models:["gemini-3.0-pro-preview","gemini-3.1-pro-preview","gemini-2.5-pro","gemini-3-flash-preview","gemini-2.5-flash"]},opencode:{label:"OpenCode",efforts:["minimal","low","high","max"],models:["anthropic/claude-opus-4-6-thinking","anthropic/claude-sonnet-4-6-thinking","anthropic/claude-sonnet-4-6","openai/gpt-5.3-codex-xhigh","openai/gpt-5.3-codex-high","opencode/big-pickle","opencode/GLM-5 Free","opencode/MiniMax M2.5 Free","opencode/Kimi K2.5 Free","opencode/GPT 5 Nano Free","opencode/Grok Code Fast 1 Free"]},copilot:{label:"Copilot",efforts:["low","medium","high"],effortNote:"\u2192 ~/.copilot/config.json",models:["claude-sonnet-4.6","claude-opus-4.6","claude-opus-4.6-fast","claude-haiku-4.5","gpt-5.3-codex","gpt-5.2-codex","gpt-5.1-codex","gpt-4.1","gpt-5-mini","gemini-3-pro-preview"]}};U=Rt(At),Ot=Object.keys(U),B=Pt(U);W=[{value:"frontend",labelKey:"role.label.frontend",label:"Frontend",prompt:"UI/UX, CSS, components",skill:"dev-frontend"},{value:"backend",labelKey:"role.label.backend",label:"Backend",prompt:"API, DB, server logic",skill:"dev-backend"},{value:"data",labelKey:"role.label.data",label:"Data",prompt:"Data pipeline, analysis, ML",skill:"dev-data"},{value:"docs",labelKey:"role.label.docs",label:"Docs",prompt:"Documentation, README, API docs",skill:"documentation"},{value:"custom",labelKey:"role.label.custom",label:"Custom...",prompt:"",skill:null}]});var G={};O(G,{addEmployee:()=>$e,deleteEmployee:()=>Be,loadEmployees:()=>He,onEmpCliChange:()=>Ae,onEmpRoleChange:()=>Pe,renderEmployees:()=>Dt,updateEmployee:()=>$});async function He(){let e=await y("/api/employees");l.employees=e||[],Dt()}function Dt(){let e=document.getElementById("employeesList");if(!e)return;let t=l.employees;if(t.length===0){e.innerHTML=`<div style="color:var(--text-dim);font-size:11px;padding:4px 0">${c("emp.addPrompt")}</div>`;return}let n=H();e.innerHTML=t.map(o=>{let i=B[o.cli]||[],a=Bn[o.role||""],r=a?W.find(p=>p.value===a):W.find(p=>p.prompt===o.role),d=r?r.value:o.role?"custom":"frontend",s=d==="custom",u=Ft(o.id),g=u?.phase||o.phase,v=u?.phaseLabel||o.phaseLabel,E=g?`<span style="background:${An[g]||"#888"};color:#000;padding:1px 6px;border-radius:9px;font-size:9px">${v||"P"+g}</span>`:"";return`
2
2
  <div class="settings-group" style="margin-bottom:8px;padding:8px 10px">
3
3
  <div style="display:flex;align-items:center;gap:6px;margin-bottom:6px">
4
4
  <span style="width:8px;height:8px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0"></span>
@@ -19,6 +19,8 @@ var Bn=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{fo
19
19
  <select data-emp-model="${o.id}">
20
20
  <option value="default"${!o.model||o.model==="default"?" selected":""}>default</option>
21
21
  ${i.map(p=>`<option${o.model===p?" selected":""}>${p}</option>`).join("")}
22
+ ${o.model&&o.model!=="default"&&!i.includes(o.model)?`<option selected>${o.model}</option>`:""}
23
+ <option value="__custom__">${c("emp.customModel")}</option>
22
24
  </select>
23
25
  </div>
24
26
  </div>
@@ -34,7 +36,7 @@ var Bn=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{fo
34
36
  <span style="color:${o.status==="running"?"#fbbf24":"var(--green)"}">\u25CF ${o.status||"idle"}</span>
35
37
  ${E}
36
38
  </div>
37
- </div>`}).join("")}async function Be(){await f("/api/employees","POST",{})}async function B(e,t){await f(`/api/employees/${e}`,"PUT",t)}async function $e(e){C(`/api/employees/${e}`,"DELETE")}function Ae(e,t){let n=$[t]||[],o=document.querySelector(`[data-emp-model="${e}"]`);o&&(o.innerHTML='<option value="default" selected>default</option>'+n.map(i=>`<option>${m(i)}</option>`).join("")+`<option value="__custom__">${c("emp.customModel")}</option>`),B(e,{cli:t,model:"default"})}function Pe(e,t){let n=W.find(i=>i.value===t),o=document.querySelector(`[data-emp-custom="${e}"]`);o&&(t==="custom"?(o.style.display="block",o.focus()):(o.style.display="none",o.value="",B(e,{role:n?.prompt||""})))}var $n,An,D=b(()=>{"use strict";w();ae();A();Re();M();L();$n={"React/Vue \uAE30\uBC18 UI \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C, \uC2A4\uD0C0\uC77C\uB9C1":"frontend","API \uC11C\uBC84, DB \uC2A4\uD0A4\uB9C8, \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1 \uAD6C\uD604":"backend","\uD504\uB860\uD2B8\uC5D4\uB4DC\uC640 \uBC31\uC5D4\uB4DC \uBAA8\uB450 \uB2F4\uB2F9":"frontend","CI/CD, Docker, \uC778\uD504\uB77C \uC790\uB3D9\uD654":"backend","\uD14C\uC2A4\uD2B8 \uC791\uC131, \uBC84\uADF8 \uC7AC\uD604, \uD488\uC9C8 \uAD00\uB9AC":"custom","\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, ETL, \uBD84\uC11D \uCFFC\uB9AC":"data","API \uBB38\uC11C\uD654, README, \uAC00\uC774\uB4DC \uC791\uC131":"docs","UI/UX \uAD6C\uD604, CSS, \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C":"frontend","API, DB, \uC11C\uBC84 \uB85C\uC9C1 \uAD6C\uD604":"backend","\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, \uBD84\uC11D, ML":"data","\uBB38\uC11C\uD654, README, API docs":"docs","UI/UX, CSS, components":"frontend","API, DB, server logic":"backend","Data pipeline, analysis, ML":"data","Documentation, README, API docs":"docs"},An={1:"#60a5fa",2:"#a78bfa",3:"#34d399",4:"#fbbf24",5:"#f472b6"}});var je={};O(je,{filterSkills:()=>Fe,loadSkills:()=>jt,renderSkills:()=>Oe,toggleSkill:()=>De});async function jt(){try{let e=await _t("/api/skills");l.allSkills=await e.json(),Oe()}catch{let e=document.getElementById("skillsList");e&&(e.innerHTML=`<div style="color:var(--text-dim);font-size:11px">${c("skill.loadFail")}</div>`)}}function Oe(){let e=document.getElementById("skillsList"),t=document.getElementById("skillsCount");if(!e||!t)return;let n=l.allSkills,o=n;l.currentSkillFilter==="installed"?o=n.filter(a=>a.enabled):l.currentSkillFilter==="other"?o=n.filter(a=>!Pn.includes(a.category||"")):l.currentSkillFilter!=="all"&&(o=n.filter(a=>a.category===l.currentSkillFilter));let i=n.filter(a=>a.enabled).length;t.textContent=c("skill.count",{active:i,total:n.length}),e.innerHTML=o.map(a=>{let r=[];return a.requires?.env&&r.push("\u{1F511} "+a.requires.env.join(", ")),a.requires?.bins&&r.push("\u2699\uFE0F "+a.requires.bins.join(", ")),a.install&&r.push(a.install),`
39
+ </div>`}).join("")}async function $e(){await f("/api/employees","POST",{})}async function $(e,t){await f(`/api/employees/${e}`,"PUT",t)}async function Be(e){C(`/api/employees/${e}`,"DELETE")}function Ae(e,t){let n=B[t]||[],o=document.querySelector(`[data-emp-model="${e}"]`);o&&(o.innerHTML='<option value="default" selected>default</option>'+n.map(i=>`<option>${m(i)}</option>`).join("")+`<option value="__custom__">${c("emp.customModel")}</option>`),$(e,{cli:t,model:"default"})}function Pe(e,t){let n=W.find(i=>i.value===t),o=document.querySelector(`[data-emp-custom="${e}"]`);o&&(t==="custom"?(o.style.display="block",o.focus()):(o.style.display="none",o.value="",$(e,{role:n?.prompt||""})))}var Bn,An,D=b(()=>{"use strict";w();ae();A();Re();M();L();Bn={"React/Vue \uAE30\uBC18 UI \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C, \uC2A4\uD0C0\uC77C\uB9C1":"frontend","API \uC11C\uBC84, DB \uC2A4\uD0A4\uB9C8, \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1 \uAD6C\uD604":"backend","\uD504\uB860\uD2B8\uC5D4\uB4DC\uC640 \uBC31\uC5D4\uB4DC \uBAA8\uB450 \uB2F4\uB2F9":"frontend","CI/CD, Docker, \uC778\uD504\uB77C \uC790\uB3D9\uD654":"backend","\uD14C\uC2A4\uD2B8 \uC791\uC131, \uBC84\uADF8 \uC7AC\uD604, \uD488\uC9C8 \uAD00\uB9AC":"custom","\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, ETL, \uBD84\uC11D \uCFFC\uB9AC":"data","API \uBB38\uC11C\uD654, README, \uAC00\uC774\uB4DC \uC791\uC131":"docs","UI/UX \uAD6C\uD604, CSS, \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C":"frontend","API, DB, \uC11C\uBC84 \uB85C\uC9C1 \uAD6C\uD604":"backend","\uB370\uC774\uD130 \uD30C\uC774\uD504\uB77C\uC778, \uBD84\uC11D, ML":"data","\uBB38\uC11C\uD654, README, API docs":"docs","UI/UX, CSS, components":"frontend","API, DB, server logic":"backend","Data pipeline, analysis, ML":"data","Documentation, README, API docs":"docs"},An={1:"#60a5fa",2:"#a78bfa",3:"#34d399",4:"#fbbf24",5:"#f472b6"}});var je={};O(je,{filterSkills:()=>Fe,loadSkills:()=>jt,renderSkills:()=>Oe,toggleSkill:()=>De});async function jt(){try{let e=await _t("/api/skills");l.allSkills=await e.json(),Oe()}catch{let e=document.getElementById("skillsList");e&&(e.innerHTML=`<div style="color:var(--text-dim);font-size:11px">${c("skill.loadFail")}</div>`)}}function Oe(){let e=document.getElementById("skillsList"),t=document.getElementById("skillsCount");if(!e||!t)return;let n=l.allSkills,o=n;l.currentSkillFilter==="installed"?o=n.filter(a=>a.enabled):l.currentSkillFilter==="other"?o=n.filter(a=>!Pn.includes(a.category||"")):l.currentSkillFilter!=="all"&&(o=n.filter(a=>a.category===l.currentSkillFilter));let i=n.filter(a=>a.enabled).length;t.textContent=c("skill.count",{active:i,total:n.length}),e.innerHTML=o.map(a=>{let r=[];return a.requires?.env&&r.push("\u{1F511} "+a.requires.env.join(", ")),a.requires?.bins&&r.push("\u2699\uFE0F "+a.requires.bins.join(", ")),a.install&&r.push(a.install),`
38
40
  <div class="skill-card ${a.enabled?"enabled":""}">
39
41
  <div class="skill-card-header">
40
42
  <span class="skill-emoji">${m(a.emoji||"\u{1F527}")}</span>
@@ -57,7 +59,7 @@ var Bn=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{fo
57
59
  <span class="cmd-desc">${_e(o.desc)}</span>
58
60
  ${o.args?`<span class="cmd-args">${_e(o.args)}</span>`:""}
59
61
  </div>`}).join(""),Jt(),t.setAttribute("aria-activedescendant",x>=0?`cmd-item-${x}`:"");let n=e.querySelector(".selected");n&&n.scrollIntoView({block:"nearest"})}function Ne(e){let t=k[x],n=j();if(!t||!n){S();return}if(S(),t.args||!e){n.value=`/${t.name} `,n.focus(),n.selectionStart=n.selectionEnd=n.value.length;return}n.value=`/${t.name}`,n.dispatchEvent(new Event("cmd-execute",{bubbles:!0}))}async function Je(){try{let e=le(),t=`/api/commands?interface=web&locale=${encodeURIComponent(e)}`;qe=await y(t,{headers:{"Accept-Language":e}})||[]}catch(e){console.warn("[slash-commands] loadCommands failed:",e.message),qe=[]}}function S(){let e=de();P&&(clearTimeout(P),P=null),e&&(e.classList.remove("visible"),P=setTimeout(()=>{e.classList.contains("visible")||(e.style.display="none",e.innerHTML="")},150)),F=!1,x=-1,k=[];let t=j();t&&(t.setAttribute("aria-expanded","false"),t.setAttribute("aria-activedescendant",""))}function me(e){let t=String(e||"");if(!t.startsWith("/")||t.includes(" ")||t.includes(`
60
- `)||zt(t)){S();return}k=Rn(t),x=k.length?0:-1,ce()}function ze(e){return F?k.length?e.key==="ArrowDown"?(e.preventDefault(),x=Math.min(k.length-1,x+1),ce(),!0):e.key==="ArrowUp"?(e.preventDefault(),x=Math.max(0,x-1),ce(),!0):e.key==="Tab"?(e.preventDefault(),Ne(!1),!0):e.key==="Enter"&&!e.shiftKey&&!e.isComposing?(e.preventDefault(),Ne(!0),!0):e.key==="Escape"?(e.preventDefault(),S(),!0):!1:e.key==="Escape"?(e.preventDefault(),S(),!0):!1:(e.key==="ArrowDown"||e.key==="ArrowUp")&&!e.isComposing?(me(j()?.value||""),F?(x=e.key==="ArrowUp"?k.length-1:0,ce(),e.preventDefault(),!0):!1):!1}function Ke(e){let n=e.target.closest(".cmd-item");if(!n)return;let o=parseInt(n.dataset.index||"-1",10);Number.isNaN(o)||o<0||(x=Math.min(o,k.length-1),Ne(!0))}function Ue(e){if(!F)return;let t=de(),n=j();if(!t||!n)return;let o=e.target;!t.contains(o)&&o!==n&&S()}function On(){return F}var qe,k,x,F,P,de,j,ue=b(()=>{"use strict";re();M();L();qe=[],k=[],x=-1,F=!1,P=null;de=()=>document.getElementById("cmdDropdown"),j=()=>document.getElementById("chatInput")});var X={};O(X,{applyCustomModel:()=>ot,closePromptModal:()=>q,getModelValue:()=>Qt,handleModelSelect:()=>nt,installMcpGlobal:()=>tt,loadCliStatus:()=>ve,loadFallbackOrder:()=>Yt,loadMcpServers:()=>Ze,loadSettings:()=>Xe,onCliChange:()=>pe,openPromptModal:()=>at,saveActiveCliSettings:()=>_,saveFallbackOrder:()=>it,savePerCli:()=>V,savePromptFromModal:()=>st,saveTelegramSettings:()=>ge,setForwardAll:()=>ye,setPerm:()=>Gt,setTelegram:()=>fe,syncMcpServers:()=>et,updateSettings:()=>Qe});function Ye(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Y(e){return document.getElementById("model"+Ye(e))}function Ut(e){return document.getElementById("customModel"+Ye(e))}function Ve(e){return document.getElementById("effort"+Ye(e))}function Wt(e,t,{includeCustom:n=!1,includeDefault:o=!1,selected:i=""}={}){if(!e)return;let a=o?'<option value="default">default</option>':"",r=n?`<option value="__custom__">${c("model.customOption")}</option>`:"",d=(t||[]).map(s=>`<option value="${m(s)}">${m(s)}</option>`).join("");e.innerHTML=a+d+r,i&&Array.from(e.options).some(s=>s.value===i)&&(e.value=i)}function Q(e,t){if(!e||!t||Array.from(e.options).some(i=>i.value===t))return;let n=document.createElement("option");n.value=t,n.textContent=t;let o=e.querySelector('option[value="__custom__"]');o?e.insertBefore(n,o):e.appendChild(n)}function Dn(e=null){let t=H(),n=document.getElementById("selCli");if(n){let i=e?.cli||n.value||t[0]||"claude";n.innerHTML=t.map(a=>{let r=ie(a)?.label||a;return`<option value="${m(a)}">${m(r)}</option>`}).join(""),Array.from(n.options).some(a=>a.value===i)&&(n.value=i)}let o=document.getElementById("memCli");if(o){let i=e?.memory?.cli||o.value||"";o.innerHTML='<option value="">(active CLI)</option>'+t.map(a=>`<option value="${m(a)}">${m(a)}</option>`).join(""),Array.from(o.options).some(a=>a.value===i)&&(o.value=i)}}function Fn(e=null){for(let t of H()){let n=Y(t);if(n){let i=e?.perCli?.[t]?.model||n.value||"";Wt(n,$[t]||[],{includeCustom:!0,selected:i}),i&&!Array.from(n.options).some(a=>a.value===i)&&(Q(n,i),n.value=i)}let o=Ve(t);if(o){let i=ie(t),a=[""].concat(i?.efforts||[]),r=e?.perCli?.[t]?.effort||o.value||"",d=[...new Set(a)],s=i?.efforts?.length===0&&i?.effortNote?i.effortNote:"\u2014 none";o.innerHTML=d.map(u=>u?`<option value="${m(u)}">${m(u)}</option>`:`<option value="">${m(s)}</option>`).join(""),i?.effortNote&&(o.title=i.effortNote),o.disabled=i?.efforts?.length===0&&!!i?.effortNote,Array.from(o.options).some(u=>u.value===r)&&(o.value=r)}}}function Ge(e,t=""){let n=document.getElementById("selEffort");if(!n)return;let o=ie(e);if(o?.effortNote){n.innerHTML=`<option value="">${m(o.effortNote)}</option>`,n.title=o.effortNote,n.disabled=!0;return}let i=[""].concat(o?.efforts||[]),a=[...new Set(i)];n.innerHTML=a.map(r=>r?`<option value="${m(r)}">${m(r)}</option>`:'<option value="">\u2014 none</option>').join(""),n.disabled=!1,n.title="",Array.from(n.options).some(r=>r.value===t)&&(n.value=t)}async function Xe(){await oe();let e=await y("/api/settings");if(!e)return;Nt(e.locale??""),Dn(e),Fn(e);let t=document.getElementById("selCli");t&&Array.from(t.options).some(u=>u.value===e.cli)&&(t.value=e.cli);let n=document.getElementById("inpCwd");n&&(n.textContent=e.workingDir);let o=document.getElementById("headerCli");if(o&&(o.textContent=e.cli),Gt(e.permissions,!1),e.perCli)for(let[u,g]of Object.entries(e.perCli)){let v=Y(u),E=Ve(u);v&&g.model&&(Q(v,g.model),v.value=g.model),E&&(E.value=g.effort||"")}pe(!1);let i=e.activeOverrides?.[e.cli]||{},a=e.perCli?.[e.cli]||{},r=i.model||a.model,d=i.effort||a.effort||"",s=document.getElementById("selModel");r&&s&&(s.value=r),Ge(e.cli,d),jn(e),Yt(e),Ze()}async function Ze(){try{let e=await y("/api/mcp");if(!e)return;let t=document.getElementById("mcpServerList");if(!t)return;let n=Object.entries(e.servers||{});if(!n.length){t.textContent=c("mcp.noServers");return}t.innerHTML=n.map(([o,i])=>`<div style="padding:2px 0">\u2022 <b>${o}</b> <span style="opacity:.6">${i.command} ${(i.args||[]).slice(0,2).join(" ")}</span></div>`).join("")}catch{}}async function et(){let e=document.getElementById("mcpSyncResult");if(e){e.style.display="block",e.textContent=c("mcp.syncing");try{let t=await f("/api/mcp/sync","POST",{});if(!t){e.textContent="\u274C sync failed";return}let n=t.results||{};e.innerHTML=Object.entries(n).map(([o,i])=>`${i?"\u2705":"\u23ED\uFE0F"} ${o}`).join(" &nbsp; ")}catch(t){e.textContent="\u274C "+t.message}}}async function tt(){let e=document.getElementById("mcpSyncResult");if(e){e.style.display="block",e.textContent=c("mcp.installing");try{let t=await f("/api/mcp/install","POST",{});if(!t){e.textContent="\u274C install failed";return}e.innerHTML=Object.entries(t.results||{}).map(([n,o])=>`${o.status==="installed"?"\u2705":o.status==="skip"?"\u23ED\uFE0F":"\u274C"} <b>${n}</b>: ${o.status}${o.bin?" \u2192 "+o.bin:""}`).join("<br>"),Ze()}catch(t){e.textContent="\u274C "+t.message}}}async function Qe(){let e={cli:document.getElementById("selCli")?.value||"claude"},t=document.getElementById("headerCli");t&&(t.textContent=e.cli),await f("/api/settings","PUT",e)}function Gt(e,t=!0){t&&C("/api/settings","PUT",{permissions:"auto"})}function Qt(e){let t=Y(e);return t?t.value==="__custom__"?Ut(e)?.value?.trim()||t.options[0]?.value||"default":t.value:"default"}function nt(e,t){let n=Ut(e);n&&(t.value==="__custom__"?(n.style.display="block",n.focus()):(n.style.display="none",V()))}function ot(e,t){let n=t.value.trim();if(!n)return;let o=Y(e);o&&(Q(o,n),o.value=n,t.style.display="none",V())}async function V(){let e={};for(let t of H()){if(!Y(t))continue;let o=Ve(t);e[t]={model:Qt(t),effort:o?o.value:""}}await f("/api/settings","PUT",{perCli:e})}function pe(e=!0){let t=document.getElementById("selCli")?.value||"claude",n=$[t]||[],o=document.getElementById("selModel");Wt(o,n,{includeCustom:!0,includeDefault:!0});let i=document.getElementById("headerCli");i&&(i.textContent=t),Ge(t);let a=document.getElementById("selModelCustom");a&&a.remove();let r=document.createElement("input");if(r.type="text",r.id="selModelCustom",r.className="custom-model-input",r.placeholder=c("model.placeholder"),r.style.display="none",r.onchange=function(){let d=this.value.trim();!d||!o||(Q(o,d),o.value=d,this.style.display="none",_())},!o){e&&Qe();return}o.parentElement?.appendChild(r),o.onchange=function(){this.value==="__custom__"?(r.style.display="block",r.focus()):(r.style.display="none",_())},y("/api/settings").then(d=>{if(!d)return;let s=d.activeOverrides?.[t]||{},u=d.perCli?.[t]||{},g=s.model||u.model,v=s.effort||u.effort||"";g&&o&&(Q(o,g),o.value=g),Ge(t,v)}),e&&Qe()}async function _(){let e=document.getElementById("selCli")?.value||"claude",n=document.getElementById("selModel")?.value||"default";n==="__custom__"&&(n=document.getElementById("selModelCustom")?.value?.trim()||"default");let o=document.getElementById("selEffort"),i={};i[e]={model:n},o&&!o.disabled&&(i[e].effort=o.value||""),await f("/api/settings","PUT",{activeOverrides:i})}async function ge(){let e=document.getElementById("tgToken")?.value.trim()||"",t=document.getElementById("tgChatIds")?.value.trim()||"",n=t?t.split(",").map(o=>parseInt(o.trim(),10)).filter(o=>!isNaN(o)):[];await f("/api/settings","PUT",{telegram:{token:e,allowedChatIds:n}})}async function fe(e){document.getElementById("tgOn")?.classList.toggle("active",e),document.getElementById("tgOff")?.classList.toggle("active",!e),await f("/api/settings","PUT",{telegram:{enabled:e}})}async function ye(e){document.getElementById("tgForwardOn")?.classList.toggle("active",e),document.getElementById("tgForwardOff")?.classList.toggle("active",!e),await f("/api/settings","PUT",{telegram:{forwardAll:e}})}function jn(e){if(!e.telegram)return;let t=e.telegram;document.getElementById("tgOn")?.classList.toggle("active",!!t.enabled),document.getElementById("tgOff")?.classList.toggle("active",!t.enabled);let n=document.getElementById("tgToken");t.token&&n&&(n.value=t.token);let o=document.getElementById("tgChatIds");t.allowedChatIds?.length&&o&&(o.value=t.allowedChatIds.join(", "));let i=t.forwardAll!==!1;document.getElementById("tgForwardOn")?.classList.toggle("active",i),document.getElementById("tgForwardOff")?.classList.toggle("active",!i)}function Yt(e){let t=document.getElementById("fallbackOrderList");if(!t)return;let n=Object.keys(e.perCli||{}),o=e.fallbackOrder||[],i=Math.min(n.length-1,3),a="";for(let r=0;r<i;r++){let d=o[r]||"",s=n.map(u=>`<option value="${u}" ${u===d?"selected":""}>${u}</option>`).join("");a+=`
62
+ `)||zt(t)){S();return}k=Rn(t),x=k.length?0:-1,ce()}function ze(e){return F?k.length?e.key==="ArrowDown"?(e.preventDefault(),x=Math.min(k.length-1,x+1),ce(),!0):e.key==="ArrowUp"?(e.preventDefault(),x=Math.max(0,x-1),ce(),!0):e.key==="Tab"?(e.preventDefault(),Ne(!1),!0):e.key==="Enter"&&!e.shiftKey&&!e.isComposing?(e.preventDefault(),Ne(!0),!0):e.key==="Escape"?(e.preventDefault(),S(),!0):!1:e.key==="Escape"?(e.preventDefault(),S(),!0):!1:(e.key==="ArrowDown"||e.key==="ArrowUp")&&!e.isComposing?(me(j()?.value||""),F?(x=e.key==="ArrowUp"?k.length-1:0,ce(),e.preventDefault(),!0):!1):!1}function Ke(e){let n=e.target.closest(".cmd-item");if(!n)return;let o=parseInt(n.dataset.index||"-1",10);Number.isNaN(o)||o<0||(x=Math.min(o,k.length-1),Ne(!0))}function Ue(e){if(!F)return;let t=de(),n=j();if(!t||!n)return;let o=e.target;!t.contains(o)&&o!==n&&S()}function On(){return F}var qe,k,x,F,P,de,j,ue=b(()=>{"use strict";re();M();L();qe=[],k=[],x=-1,F=!1,P=null;de=()=>document.getElementById("cmdDropdown"),j=()=>document.getElementById("chatInput")});var X={};O(X,{applyCustomModel:()=>ot,closePromptModal:()=>q,getModelValue:()=>Qt,handleModelSelect:()=>nt,installMcpGlobal:()=>tt,loadCliStatus:()=>ve,loadFallbackOrder:()=>Yt,loadMcpServers:()=>Ze,loadSettings:()=>Xe,onCliChange:()=>pe,openPromptModal:()=>at,saveActiveCliSettings:()=>_,saveFallbackOrder:()=>it,savePerCli:()=>V,savePromptFromModal:()=>st,saveTelegramSettings:()=>ge,setForwardAll:()=>ye,setPerm:()=>Gt,setTelegram:()=>fe,syncMcpServers:()=>et,updateSettings:()=>Qe});function Ye(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Y(e){return document.getElementById("model"+Ye(e))}function Ut(e){return document.getElementById("customModel"+Ye(e))}function Ve(e){return document.getElementById("effort"+Ye(e))}function Wt(e,t,{includeCustom:n=!1,includeDefault:o=!1,selected:i=""}={}){if(!e)return;let a=o?'<option value="default">default</option>':"",r=n?`<option value="__custom__">${c("model.customOption")}</option>`:"",d=(t||[]).map(s=>`<option value="${m(s)}">${m(s)}</option>`).join("");e.innerHTML=a+d+r,i&&Array.from(e.options).some(s=>s.value===i)&&(e.value=i)}function Q(e,t){if(!e||!t||Array.from(e.options).some(i=>i.value===t))return;let n=document.createElement("option");n.value=t,n.textContent=t;let o=e.querySelector('option[value="__custom__"]');o?e.insertBefore(n,o):e.appendChild(n)}function Dn(e=null){let t=H(),n=document.getElementById("selCli");if(n){let i=e?.cli||n.value||t[0]||"claude";n.innerHTML=t.map(a=>{let r=ie(a)?.label||a;return`<option value="${m(a)}">${m(r)}</option>`}).join(""),Array.from(n.options).some(a=>a.value===i)&&(n.value=i)}let o=document.getElementById("memCli");if(o){let i=e?.memory?.cli||o.value||"";o.innerHTML='<option value="">(active CLI)</option>'+t.map(a=>`<option value="${m(a)}">${m(a)}</option>`).join(""),Array.from(o.options).some(a=>a.value===i)&&(o.value=i)}}function Fn(e=null){for(let t of H()){let n=Y(t);if(n){let i=e?.perCli?.[t]?.model||n.value||"";Wt(n,B[t]||[],{includeCustom:!0,selected:i}),i&&!Array.from(n.options).some(a=>a.value===i)&&(Q(n,i),n.value=i)}let o=Ve(t);if(o){let i=ie(t),a=[""].concat(i?.efforts||[]),r=e?.perCli?.[t]?.effort||o.value||"",d=[...new Set(a)],s=i?.efforts?.length===0&&i?.effortNote?i.effortNote:"\u2014 none";o.innerHTML=d.map(u=>u?`<option value="${m(u)}">${m(u)}</option>`:`<option value="">${m(s)}</option>`).join(""),i?.effortNote&&(o.title=i.effortNote),o.disabled=i?.efforts?.length===0&&!!i?.effortNote,Array.from(o.options).some(u=>u.value===r)&&(o.value=r)}}}function Ge(e,t=""){let n=document.getElementById("selEffort");if(!n)return;let o=ie(e);if(o?.effortNote){n.innerHTML=`<option value="">${m(o.effortNote)}</option>`,n.title=o.effortNote,n.disabled=!0;return}let i=[""].concat(o?.efforts||[]),a=[...new Set(i)];n.innerHTML=a.map(r=>r?`<option value="${m(r)}">${m(r)}</option>`:'<option value="">\u2014 none</option>').join(""),n.disabled=!1,n.title="",Array.from(n.options).some(r=>r.value===t)&&(n.value=t)}async function Xe(){await oe();let e=await y("/api/settings");if(!e)return;Nt(e.locale??""),Dn(e),Fn(e);let t=document.getElementById("selCli");t&&Array.from(t.options).some(u=>u.value===e.cli)&&(t.value=e.cli);let n=document.getElementById("inpCwd");n&&(n.textContent=e.workingDir);let o=document.getElementById("headerCli");if(o&&(o.textContent=e.cli),Gt(e.permissions,!1),e.perCli)for(let[u,g]of Object.entries(e.perCli)){let v=Y(u),E=Ve(u);v&&g.model&&(Q(v,g.model),v.value=g.model),E&&(E.value=g.effort||"")}pe(!1);let i=e.activeOverrides?.[e.cli]||{},a=e.perCli?.[e.cli]||{},r=i.model||a.model,d=i.effort||a.effort||"",s=document.getElementById("selModel");r&&s&&(s.value=r),Ge(e.cli,d),jn(e),Yt(e),Ze()}async function Ze(){try{let e=await y("/api/mcp");if(!e)return;let t=document.getElementById("mcpServerList");if(!t)return;let n=Object.entries(e.servers||{});if(!n.length){t.textContent=c("mcp.noServers");return}t.innerHTML=n.map(([o,i])=>`<div style="padding:2px 0">\u2022 <b>${o}</b> <span style="opacity:.6">${i.command} ${(i.args||[]).slice(0,2).join(" ")}</span></div>`).join("")}catch{}}async function et(){let e=document.getElementById("mcpSyncResult");if(e){e.style.display="block",e.textContent=c("mcp.syncing");try{let t=await f("/api/mcp/sync","POST",{});if(!t){e.textContent="\u274C sync failed";return}let n=t.results||{};e.innerHTML=Object.entries(n).map(([o,i])=>`${i?"\u2705":"\u23ED\uFE0F"} ${o}`).join(" &nbsp; ")}catch(t){e.textContent="\u274C "+t.message}}}async function tt(){let e=document.getElementById("mcpSyncResult");if(e){e.style.display="block",e.textContent=c("mcp.installing");try{let t=await f("/api/mcp/install","POST",{});if(!t){e.textContent="\u274C install failed";return}e.innerHTML=Object.entries(t.results||{}).map(([n,o])=>`${o.status==="installed"?"\u2705":o.status==="skip"?"\u23ED\uFE0F":"\u274C"} <b>${n}</b>: ${o.status}${o.bin?" \u2192 "+o.bin:""}`).join("<br>"),Ze()}catch(t){e.textContent="\u274C "+t.message}}}async function Qe(){let e={cli:document.getElementById("selCli")?.value||"claude"},t=document.getElementById("headerCli");t&&(t.textContent=e.cli),await f("/api/settings","PUT",e)}function Gt(e,t=!0){t&&C("/api/settings","PUT",{permissions:"auto"})}function Qt(e){let t=Y(e);return t?t.value==="__custom__"?Ut(e)?.value?.trim()||t.options[0]?.value||"default":t.value:"default"}function nt(e,t){let n=Ut(e);n&&(t.value==="__custom__"?(n.style.display="block",n.focus()):(n.style.display="none",V()))}function ot(e,t){let n=t.value.trim();if(!n)return;let o=Y(e);o&&(Q(o,n),o.value=n,t.style.display="none",V())}async function V(){let e={};for(let t of H()){if(!Y(t))continue;let o=Ve(t);e[t]={model:Qt(t),effort:o?o.value:""}}await f("/api/settings","PUT",{perCli:e})}function pe(e=!0){let t=document.getElementById("selCli")?.value||"claude",n=B[t]||[],o=document.getElementById("selModel");Wt(o,n,{includeCustom:!0,includeDefault:!0});let i=document.getElementById("headerCli");i&&(i.textContent=t),Ge(t);let a=document.getElementById("selModelCustom");a&&a.remove();let r=document.createElement("input");if(r.type="text",r.id="selModelCustom",r.className="custom-model-input",r.placeholder=c("model.placeholder"),r.style.display="none",r.onchange=function(){let d=this.value.trim();!d||!o||(Q(o,d),o.value=d,this.style.display="none",_())},!o){e&&Qe();return}o.parentElement?.appendChild(r),o.onchange=function(){this.value==="__custom__"?(r.style.display="block",r.focus()):(r.style.display="none",_())},y("/api/settings").then(d=>{if(!d)return;let s=d.activeOverrides?.[t]||{},u=d.perCli?.[t]||{},g=s.model||u.model,v=s.effort||u.effort||"";g&&o&&(Q(o,g),o.value=g),Ge(t,v)}),e&&Qe()}async function _(){let e=document.getElementById("selCli")?.value||"claude",n=document.getElementById("selModel")?.value||"default";n==="__custom__"&&(n=document.getElementById("selModelCustom")?.value?.trim()||"default");let o=document.getElementById("selEffort"),i={};i[e]={model:n},o&&!o.disabled&&(i[e].effort=o.value||""),await f("/api/settings","PUT",{activeOverrides:i})}async function ge(){let e=document.getElementById("tgToken")?.value.trim()||"",t=document.getElementById("tgChatIds")?.value.trim()||"",n=t?t.split(",").map(o=>parseInt(o.trim(),10)).filter(o=>!isNaN(o)):[];await f("/api/settings","PUT",{telegram:{token:e,allowedChatIds:n}})}async function fe(e){document.getElementById("tgOn")?.classList.toggle("active",e),document.getElementById("tgOff")?.classList.toggle("active",!e),await f("/api/settings","PUT",{telegram:{enabled:e}})}async function ye(e){document.getElementById("tgForwardOn")?.classList.toggle("active",e),document.getElementById("tgForwardOff")?.classList.toggle("active",!e),await f("/api/settings","PUT",{telegram:{forwardAll:e}})}function jn(e){if(!e.telegram)return;let t=e.telegram;document.getElementById("tgOn")?.classList.toggle("active",!!t.enabled),document.getElementById("tgOff")?.classList.toggle("active",!t.enabled);let n=document.getElementById("tgToken");t.token&&n&&(n.value=t.token);let o=document.getElementById("tgChatIds");t.allowedChatIds?.length&&o&&(o.value=t.allowedChatIds.join(", "));let i=t.forwardAll!==!1;document.getElementById("tgForwardOn")?.classList.toggle("active",i),document.getElementById("tgForwardOff")?.classList.toggle("active",!i)}function Yt(e){let t=document.getElementById("fallbackOrderList");if(!t)return;let n=Object.keys(e.perCli||{}),o=e.fallbackOrder||[],i=Math.min(n.length-1,3),a="";for(let r=0;r<i;r++){let d=o[r]||"",s=n.map(u=>`<option value="${u}" ${u===d?"selected":""}>${u}</option>`).join("");a+=`
61
63
  <div class="settings-row sub-row">
62
64
  <label style="min-width:60px">Fallback ${r+1}</label>
63
65
  <select id="fallback${r}"
@@ -89,7 +91,7 @@ var Bn=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{fo
89
91
  ${v}
90
92
  ${E}
91
93
  </div>
92
- `}o&&(o.innerHTML=a)}function at(){y("/api/prompt").then(e=>{if(!e)return;let t=document.getElementById("modalPromptEditor");t&&(t.value=e.content||""),document.getElementById("promptModal")?.classList.add("open")})}function q(e){e&&e.target!==e.currentTarget||document.getElementById("promptModal")?.classList.remove("open")}async function st(){let t=document.getElementById("modalPromptEditor")?.value||"";await f("/api/prompt","PUT",{content:t}),document.getElementById("promptModal")?.classList.remove("open")}var N=b(()=>{"use strict";ae();A();re();M();L();w()});async function Vt(){let e=null;try{e=localStorage.getItem("claw_locale")}catch{}if(!e){let t=(navigator.language||"ko").split(/[-_]/)[0].toLowerCase();e=["en","ko"].includes(t)?t:"ko"}he=await lt("ko"),e==="ko"?ee=he:ee=await lt(e),Z=e,Xt()}async function lt(e){try{let{api:t}=await Promise.resolve().then(()=>(L(),Bt));return await t(`/api/i18n/${e}`)||{}}catch{return{}}}function c(e,t={}){let n=ee[e]??he[e]??e;for(let[o,i]of Object.entries(t))n=n.replaceAll(`{${o}}`,String(i));return n}function Xt(){document.querySelectorAll("[data-i18n]").forEach(e=>{let t=e.getAttribute("data-i18n");t&&(e.textContent=c(t))}),document.querySelectorAll("[data-i18n-placeholder]").forEach(e=>{let t=e.getAttribute("data-i18n-placeholder");t&&(e.placeholder=c(t))}),document.querySelectorAll("[data-i18n-title]").forEach(e=>{let t=e.getAttribute("data-i18n-title");t&&(e.title=c(t))}),document.querySelectorAll("[data-i18n-aria]").forEach(e=>{let t=e.getAttribute("data-i18n-aria");t&&e.setAttribute("aria-label",c(t))})}async function Zt(e){if(e!==Z){e==="ko"?ee=he:ee=await lt(e),Z=e;try{localStorage.setItem("claw_locale",e)}catch{}Xt();try{let{loadEmployees:t}=await Promise.resolve().then(()=>(D(),G));t()}catch{}try{let{loadSkills:t}=await Promise.resolve().then(()=>(se(),je));t()}catch{}try{let{loadCommands:t}=await Promise.resolve().then(()=>(ue(),We));t()}catch{}try{let{loadSettings:t}=await Promise.resolve().then(()=>(N(),X));t()}catch{}}}function te(){return Z}function _t(e,t={}){let n=new URL(e,location.origin);return n.searchParams.has("locale")||n.searchParams.set("locale",Z),fetch(n.toString(),t)}var Z,ee,he,M=b(()=>{"use strict";Z="ko",ee={},he={}});function en(e){let t=[],n=e.replace(/```[\s\S]*?```/g,o=>(t.push(o),`\0P${t.length-1}\0`)).replace(/`[^`]+`/g,o=>(t.push(o),`\0P${t.length-1}\0`));return n=n.replace(/([\p{P}])\*\*(?=[^\s\p{P}])/gu,(o,i)=>i==="*"?o:i+"\u200B**"),n=n.replace(/\x00P(\d+)\x00/g,(o,i)=>t[Number(i)]),n}var tn=b(()=>{"use strict"});function m(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function an(e){return typeof DOMPurify<"u"?DOMPurify.sanitize(e,{USE_PROFILES:{html:!0,svg:!0,svgFilters:!0},FORBID_TAGS:["script","style","iframe","object","embed","form"],FORBID_ATTR:["onerror","onclick","onload","onmouseover","onfocus","onblur"],ADD_TAGS:["use"],ADD_ATTR:["aria-hidden","xmlns","viewBox"]}):e.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi,"").replace(/\bon\w+\s*=/gi,"data-removed=").replace(/javascript\s*:/gi,"about:blank")}function be(e){let t=e.replace(/```json\n[\s\S]*?\n```/g,"");return t=t.replace(/\{[\s\S]*"subtasks"\s*:\s*\[[\s\S]*?\]\s*\}/g,"").trim(),t}function _n(e){let t=[],n=[],o=e.replace(/```[\s\S]*?```/g,i=>(n.push(i),`\0C${n.length-1}\0`)).replace(/`[^`]+`/g,i=>(n.push(i),`\0C${n.length-1}\0`));return o=o.replace(/\$\$([\s\S]+?)\$\$/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!0}),`\0MATH-${t.length-1}\0`)),o=o.replace(/\\\[([\s\S]+?)\\\]/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!0}),`\0MATH-${t.length-1}\0`)),o=o.replace(/(?<!\$)\$(?!\$)([^\n$]+?)\$(?!\$)/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!1}),`\0MATH-${t.length-1}\0`)),o=o.replace(/\\\((.+?)\\\)/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!1}),`\0MATH-${t.length-1}\0`)),o=o.replace(/\x00C(\d+)\x00/g,(i,a)=>n[Number(a)]),{text:o,blocks:t}}function qn(e,t){return e.replace(/\x00MATH-(\d+)\x00/g,(n,o)=>{let i=t[Number(o)];if(!i)return'<code title="math placeholder error">[math error]</code>';if(typeof katex>"u")return i.displayMode?`<pre><code>${m(i.tex)}</code></pre>`:`<code>${m(i.tex)}</code>`;try{return katex.renderToString(i.tex,{displayMode:i.displayMode,throwOnError:!1})}catch{return i.displayMode?`<pre><code>${m(i.tex)}</code></pre>`:`<code>${m(i.tex)}</code>`}})}function Jn(){typeof mermaid>"u"||document.querySelectorAll(".mermaid-pending").forEach(async e=>{e.classList.remove("mermaid-pending");let t=e.textContent||"",n=`mermaid-${++Nn}`;try{let{svg:o}=await mermaid.render(n,t);e.innerHTML=an(o),e.classList.add("mermaid-rendered")}catch(o){let i=o?.message||o?.str||"Unknown error";e.innerHTML=`
94
+ `}o&&(o.innerHTML=a)}function at(){y("/api/prompt").then(e=>{if(!e)return;let t=document.getElementById("modalPromptEditor");t&&(t.value=e.content||""),document.getElementById("promptModal")?.classList.add("open")})}function q(e){e&&e.target!==e.currentTarget||document.getElementById("promptModal")?.classList.remove("open")}async function st(){let t=document.getElementById("modalPromptEditor")?.value||"";await f("/api/prompt","PUT",{content:t}),document.getElementById("promptModal")?.classList.remove("open")}var N=b(()=>{"use strict";ae();A();re();M();L();w()});async function Vt(){let e=null;try{e=localStorage.getItem("claw_locale")}catch{}if(!e){let t=(navigator.language||"ko").split(/[-_]/)[0].toLowerCase();e=["en","ko"].includes(t)?t:"ko"}he=await lt("ko"),e==="ko"?ee=he:ee=await lt(e),Z=e,Xt()}async function lt(e){try{let{api:t}=await Promise.resolve().then(()=>(L(),$t));return await t(`/api/i18n/${e}`)||{}}catch{return{}}}function c(e,t={}){let n=ee[e]??he[e]??e;for(let[o,i]of Object.entries(t))n=n.replaceAll(`{${o}}`,String(i));return n}function Xt(){document.querySelectorAll("[data-i18n]").forEach(e=>{let t=e.getAttribute("data-i18n");t&&(e.textContent=c(t))}),document.querySelectorAll("[data-i18n-placeholder]").forEach(e=>{let t=e.getAttribute("data-i18n-placeholder");t&&(e.placeholder=c(t))}),document.querySelectorAll("[data-i18n-title]").forEach(e=>{let t=e.getAttribute("data-i18n-title");t&&(e.title=c(t))}),document.querySelectorAll("[data-i18n-aria]").forEach(e=>{let t=e.getAttribute("data-i18n-aria");t&&e.setAttribute("aria-label",c(t))})}async function Zt(e){if(e!==Z){e==="ko"?ee=he:ee=await lt(e),Z=e;try{localStorage.setItem("claw_locale",e)}catch{}Xt();try{let{loadEmployees:t}=await Promise.resolve().then(()=>(D(),G));t()}catch{}try{let{loadSkills:t}=await Promise.resolve().then(()=>(se(),je));t()}catch{}try{let{loadCommands:t}=await Promise.resolve().then(()=>(ue(),We));t()}catch{}try{let{loadSettings:t}=await Promise.resolve().then(()=>(N(),X));t()}catch{}}}function te(){return Z}function _t(e,t={}){let n=new URL(e,location.origin);return n.searchParams.has("locale")||n.searchParams.set("locale",Z),fetch(n.toString(),t)}var Z,ee,he,M=b(()=>{"use strict";Z="ko",ee={},he={}});function en(e){let t=[],n=e.replace(/```[\s\S]*?```/g,o=>(t.push(o),`\0P${t.length-1}\0`)).replace(/`[^`]+`/g,o=>(t.push(o),`\0P${t.length-1}\0`));return n=n.replace(/([\p{P}])\*\*(?=[^\s\p{P}])/gu,(o,i)=>i==="*"?o:i+"\u200B**"),n=n.replace(/\x00P(\d+)\x00/g,(o,i)=>t[Number(i)]),n}var tn=b(()=>{"use strict"});function m(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function an(e){return typeof DOMPurify<"u"?DOMPurify.sanitize(e,{USE_PROFILES:{html:!0,svg:!0,svgFilters:!0},FORBID_TAGS:["script","style","iframe","object","embed","form"],FORBID_ATTR:["onerror","onclick","onload","onmouseover","onfocus","onblur"],ADD_TAGS:["use"],ADD_ATTR:["aria-hidden","xmlns","viewBox"]}):e.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi,"").replace(/\bon\w+\s*=/gi,"data-removed=").replace(/javascript\s*:/gi,"about:blank")}function be(e){let t=e.replace(/```json\n[\s\S]*?\n```/g,"");return t=t.replace(/\{[\s\S]*"subtasks"\s*:\s*\[[\s\S]*?\]\s*\}/g,"").trim(),t}function _n(e){let t=[],n=[],o=e.replace(/```[\s\S]*?```/g,i=>(n.push(i),`\0C${n.length-1}\0`)).replace(/`[^`]+`/g,i=>(n.push(i),`\0C${n.length-1}\0`));return o=o.replace(/\$\$([\s\S]+?)\$\$/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!0}),`\0MATH-${t.length-1}\0`)),o=o.replace(/\\\[([\s\S]+?)\\\]/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!0}),`\0MATH-${t.length-1}\0`)),o=o.replace(/(?<!\$)\$(?!\$)([^\n$]+?)\$(?!\$)/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!1}),`\0MATH-${t.length-1}\0`)),o=o.replace(/\\\((.+?)\\\)/g,(i,a)=>(t.push({tex:a.trim(),displayMode:!1}),`\0MATH-${t.length-1}\0`)),o=o.replace(/\x00C(\d+)\x00/g,(i,a)=>n[Number(a)]),{text:o,blocks:t}}function qn(e,t){return e.replace(/\x00MATH-(\d+)\x00/g,(n,o)=>{let i=t[Number(o)];if(!i)return'<code title="math placeholder error">[math error]</code>';if(typeof katex>"u")return i.displayMode?`<pre><code>${m(i.tex)}</code></pre>`:`<code>${m(i.tex)}</code>`;try{return katex.renderToString(i.tex,{displayMode:i.displayMode,throwOnError:!1})}catch{return i.displayMode?`<pre><code>${m(i.tex)}</code></pre>`:`<code>${m(i.tex)}</code>`}})}function Jn(){typeof mermaid>"u"||document.querySelectorAll(".mermaid-pending").forEach(async e=>{e.classList.remove("mermaid-pending");let t=e.textContent||"",n=`mermaid-${++Nn}`;try{let{svg:o}=await mermaid.render(n,t);e.innerHTML=an(o),e.classList.add("mermaid-rendered")}catch(o){let i=o?.message||o?.str||"Unknown error";e.innerHTML=`
93
95
  <div style="border:1px solid #ef4444;border-radius:6px;padding:8px;margin:4px 0">
94
96
  <div style="color:#ef4444;font-size:11px;margin-bottom:4px">\u26A0\uFE0F ${m(c("mermaid.renderFail")||"Mermaid render failed")}</div>
95
97
  <div style="color:#fbbf24;font-size:10px;margin-bottom:6px">${m(i.slice(0,200))}</div>
@@ -131,5 +133,5 @@ var Bn=Object.defineProperty;var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{fo
131
133
  <button data-mem-back style="background:none;border:none;color:var(--accent);cursor:pointer;font-size:11px">\u2190 back</button>
132
134
  </div>
133
135
  <pre style="background:var(--bg);padding:8px;border-radius:4px;font-size:11px;white-space:pre-wrap;max-height:50vh;overflow-y:auto;color:var(--text)">${m(t.content)}</pre>
134
- `)}w();ae();dt();var Tt="sidebarState";function Tn(){let e=JSON.parse(localStorage.getItem(Tt)||"{}");e.left&&document.body.classList.add("left-collapsed"),e.right&&document.body.classList.add("right-collapsed"),document.getElementById("toggleLeft")?.addEventListener("click",It),document.getElementById("toggleRight")?.addEventListener("click",wt),window.addEventListener("resize",()=>{if(window.innerWidth>900){document.body.classList.remove("left-expanded","right-expanded");let t=JSON.parse(localStorage.getItem(Tt)||"{}");document.body.classList.toggle("left-collapsed",!!t.left),document.body.classList.toggle("right-collapsed",!!t.right)}else document.body.classList.remove("left-collapsed","right-collapsed");Te()}),window.innerWidth<=900&&document.body.classList.remove("left-collapsed","right-collapsed"),Te()}function Ie(){return window.innerWidth<=900}function It(){Ie()?document.body.classList.toggle("left-expanded"):document.body.classList.toggle("left-collapsed"),In(),Te()}function wt(){Ie()?document.body.classList.toggle("right-expanded"):document.body.classList.toggle("right-collapsed"),In(),Te()}function Vn(){return Ie()?document.body.classList.contains("left-expanded"):!document.body.classList.contains("left-collapsed")}function Xn(){return Ie()?document.body.classList.contains("right-expanded"):!document.body.classList.contains("right-collapsed")}function Te(){let e=document.getElementById("toggleLeft"),t=document.getElementById("toggleRight");e&&(e.textContent=Vn()?"\u25C0":"\u25B6"),t&&(t.textContent=Xn()?"\u25B6":"\u25C0")}function In(){localStorage.setItem(Tt,JSON.stringify({left:document.body.classList.contains("left-collapsed"),right:document.body.classList.contains("right-collapsed")}))}var wn="theme",Zn="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css",eo="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css";function Cn(){let e=localStorage.getItem(wn),t=window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";Hn(e||t),document.getElementById("toggleTheme")?.addEventListener("click",to)}function to(){let t=(document.documentElement.getAttribute("data-theme")||"dark")==="dark"?"light":"dark";Hn(t),localStorage.setItem(wn,t)}function Hn(e){document.documentElement.setAttribute("data-theme",e);let t=document.getElementById("toggleTheme");t&&t.classList.toggle("is-light",e==="light");let n=document.getElementById("hljsTheme");n&&(n.href=e==="dark"?Zn:eo)}M();window.addEventListener("unhandledrejection",e=>{console.error("[unhandled]",e.reason),e.preventDefault()});window.addEventListener("error",e=>{console.error("[error]",e.message,e.filename,e.lineno)});document.getElementById("btnSend")?.addEventListener("click",Me);var Ct=document.getElementById("chatInput");Ct?.addEventListener("keydown",e=>{ze(e)||gn(e)});var we=0;Ct?.addEventListener("input",e=>{e.isComposing||(we&&cancelAnimationFrame(we),we=requestAnimationFrame(()=>{me(e.target?.value||""),we=0}))});Ct?.addEventListener("cmd-execute",()=>{Me()});document.getElementById("cmdDropdown")?.addEventListener("click",Ke);document.addEventListener("click",Ue);document.getElementById("filePreviewClear")?.addEventListener("click",Le);document.getElementById("filePreviewList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-file-idx]");t&&fn(+(t.dataset.fileIdx||"0"))});document.querySelector(".btn-attach")?.addEventListener("click",()=>{document.getElementById("fileInput")?.click()});document.getElementById("memorySidebarBtn")?.addEventListener("click",Se);document.getElementById("btnClearChat")?.addEventListener("click",yn);document.getElementById("hbSidebarBtn")?.addEventListener("click",bn);document.getElementById("langToggle")?.addEventListener("click",async()=>{let e=te()==="ko"?"en":"ko";await Zt(e);let t=document.getElementById("langToggle");t&&(t.textContent=`\u{1F310} ${c("lang."+e)}`),l.ws&&l.ws.close()});document.querySelector(".tab-bar")?.addEventListener("click",e=>{let t=e.target?.closest(".tab-btn");if(!t)return;let o=[...t.parentElement?.children||[]].filter(a=>a.classList.contains("tab-btn")).indexOf(t),i=["agents","skills","settings"];i[o]&&pt(i[o],t)});document.querySelector(".sidebar-save-bar .btn-save")?.addEventListener("click",gt);document.getElementById("selCli")?.addEventListener("change",()=>pe());document.getElementById("selModel")?.addEventListener("change",()=>_());document.getElementById("selEffort")?.addEventListener("change",()=>_());document.querySelector('[data-action="addEmployee"]')?.addEventListener("click",Be);document.getElementById("employeesList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-emp-delete]");if(t){$e(t.dataset.empDelete||"");return}});document.getElementById("employeesList")?.addEventListener("change",e=>{let t=e.target,n=t.closest("[data-emp-name]");if(n){B(n.dataset.empName||"",{name:t.value});return}let o=t.closest("[data-emp-cli]");if(o){Ae(o.dataset.empCli||"",t.value);return}let i=t.closest("[data-emp-model]");if(i){if(t.value==="__custom__"){let d=prompt(c("model.promptInput"));if(d?.trim()){let s=document.createElement("option");s.value=d.trim(),s.textContent=d.trim();let u=t.querySelector('option[value="__custom__"]');u&&t.insertBefore(s,u),t.value=d.trim(),B(i.dataset.empModel||"",{model:d.trim()})}else t.value="default"}else B(i.dataset.empModel||"",{model:t.value});return}let a=t.closest("[data-emp-role]");if(a){Pe(a.dataset.empRole||"",t.value);return}let r=t.closest("[data-emp-custom]");if(r){B(r.dataset.empCustom||"",{role:t.value});return}});document.getElementById("skillsList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-skill-id]");t&&De(t.dataset.skillId||"",t.dataset.skillEnabled==="true")});document.querySelector("#tabSkills")?.addEventListener("click",e=>{let t=e.target?.closest(".skill-filter");if(t){let n=t.dataset.filter||"all";Fe(n,t)}});document.querySelector('[data-action="openPrompt"]')?.addEventListener("click",at);document.getElementById("tgOff")?.addEventListener("click",()=>fe(!1));document.getElementById("tgOn")?.addEventListener("click",()=>fe(!0));document.getElementById("tgForwardOff")?.addEventListener("click",()=>ye(!1));document.getElementById("tgForwardOn")?.addEventListener("click",()=>ye(!0));document.getElementById("tgToken")?.addEventListener("change",ge);document.getElementById("tgChatIds")?.addEventListener("change",ge);document.getElementById("fallbackOrderList")?.addEventListener("change",it);function no(){for(let e of H()){let t=e.charAt(0).toUpperCase()+e.slice(1),n=document.getElementById("model"+t);n&&n.addEventListener("change",function(){nt(e,this)});let o=document.getElementById("customModel"+t);o&&o.addEventListener("change",function(){ot(e,this)});let i=document.getElementById("effort"+t);i&&i.addEventListener("change",V)}}document.querySelector('[data-action="syncMcp"]')?.addEventListener("click",et);document.querySelector('[data-action="installMcp"]')?.addEventListener("click",tt);document.querySelector('[data-action="refreshCli"]')?.addEventListener("click",()=>ve(!0));document.getElementById("cliStatusInterval")?.addEventListener("change",function(){localStorage.setItem("cliStatusInterval",this.value)});document.getElementById("promptModal")?.addEventListener("click",e=>q(e));document.querySelector("#promptModal .modal-box")?.addEventListener("click",e=>e.stopPropagation());document.querySelector('[data-action="closePrompt"]')?.addEventListener("click",()=>q());document.querySelector('[data-action="cancelPrompt"]')?.addEventListener("click",()=>q());document.querySelector('[data-action="savePrompt"]')?.addEventListener("click",st);document.addEventListener("keydown",e=>{e.key==="Escape"&&q()});document.getElementById("heartbeatModal")?.addEventListener("click",e=>Lt(e));document.querySelector("#heartbeatModal .modal-box")?.addEventListener("click",e=>e.stopPropagation());document.querySelector('[data-action="closeHeartbeat"]')?.addEventListener("click",()=>Lt());document.querySelector('[data-action="addHeartbeat"]')?.addEventListener("click",En);document.getElementById("hbJobsList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-hb-toggle]");if(t){Ln(+(t.dataset.hbToggle||"0"));return}let n=e.target?.closest("[data-hb-remove]");if(n){xn(+(n.dataset.hbRemove||"0"));return}});document.getElementById("hbJobsList")?.addEventListener("change",e=>{let t=e.target,n=t.closest("[data-hb-name]");if(n){l.heartbeatJobs[+(n.dataset.hbName||"0")].name=t.value,R();return}let o=t.closest("[data-hb-minutes]");if(o){l.heartbeatJobs[+(o.dataset.hbMinutes||"0")].schedule={kind:"every",minutes:+t.value},R();return}let i=t.closest("[data-hb-prompt]");if(i){l.heartbeatJobs[+(i.dataset.hbPrompt||"0")].prompt=t.value,R();return}});document.getElementById("memoryModal")?.addEventListener("click",e=>Mt(e));document.querySelector("#memoryModal .modal-box")?.addEventListener("click",e=>e.stopPropagation());document.querySelector('[data-action="closeMemory"]')?.addEventListener("click",()=>Mt());document.getElementById("memTabBtnSettings")?.addEventListener("click",()=>kt("settings"));document.getElementById("memTabBtnFiles")?.addEventListener("click",()=>kt("files"));document.getElementById("memOn")?.addEventListener("click",()=>St(!0));document.getElementById("memOff")?.addEventListener("click",()=>St(!1));document.getElementById("memFlushEvery")?.addEventListener("change",ne);document.getElementById("memCli")?.addEventListener("change",ne);document.getElementById("memModel")?.addEventListener("change",ne);document.getElementById("memRetention")?.addEventListener("change",ne);document.getElementById("memFilesList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-mem-delete]");if(t){e.stopPropagation(),kn(t.dataset.memDelete||"");return}let n=e.target?.closest("[data-mem-view]");if(n){Sn(n.dataset.memView||"");return}if(e.target?.closest("[data-mem-back]")){Se();return}});async function oo(){await Vt();let e=document.getElementById("langToggle");e&&(e.textContent=`\u{1F310} ${c("lang."+te())}`),await oe(),no(),ht(),hn(),vn(),await Je(),await Xe(),ve(),ft(),He(),Mn(),dn(),Tn(),Cn(),yt()}oo().catch(e=>{console.error("[bootstrap]",e)});document.addEventListener("keydown",e=>{e.key==="Escape"&&document.querySelectorAll(".modal-overlay.open").forEach(t=>{t.classList.remove("open")})});document.getElementById("mobileMenuLeft")?.addEventListener("click",It);document.getElementById("mobileMenuRight")?.addEventListener("click",wt);
136
+ `)}w();ae();dt();var Tt="sidebarState";function Tn(){let e=JSON.parse(localStorage.getItem(Tt)||"{}");e.left&&document.body.classList.add("left-collapsed"),e.right&&document.body.classList.add("right-collapsed"),document.getElementById("toggleLeft")?.addEventListener("click",It),document.getElementById("toggleRight")?.addEventListener("click",wt),window.addEventListener("resize",()=>{if(window.innerWidth>900){document.body.classList.remove("left-expanded","right-expanded");let t=JSON.parse(localStorage.getItem(Tt)||"{}");document.body.classList.toggle("left-collapsed",!!t.left),document.body.classList.toggle("right-collapsed",!!t.right)}else document.body.classList.remove("left-collapsed","right-collapsed");Te()}),window.innerWidth<=900&&document.body.classList.remove("left-collapsed","right-collapsed"),Te()}function Ie(){return window.innerWidth<=900}function It(){Ie()?document.body.classList.toggle("left-expanded"):document.body.classList.toggle("left-collapsed"),In(),Te()}function wt(){Ie()?document.body.classList.toggle("right-expanded"):document.body.classList.toggle("right-collapsed"),In(),Te()}function Vn(){return Ie()?document.body.classList.contains("left-expanded"):!document.body.classList.contains("left-collapsed")}function Xn(){return Ie()?document.body.classList.contains("right-expanded"):!document.body.classList.contains("right-collapsed")}function Te(){let e=document.getElementById("toggleLeft"),t=document.getElementById("toggleRight");e&&(e.textContent=Vn()?"\u25C0":"\u25B6"),t&&(t.textContent=Xn()?"\u25B6":"\u25C0")}function In(){localStorage.setItem(Tt,JSON.stringify({left:document.body.classList.contains("left-collapsed"),right:document.body.classList.contains("right-collapsed")}))}var wn="theme",Zn="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css",eo="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css";function Cn(){let e=localStorage.getItem(wn),t=window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";Hn(e||t),document.getElementById("toggleTheme")?.addEventListener("click",to)}function to(){let t=(document.documentElement.getAttribute("data-theme")||"dark")==="dark"?"light":"dark";Hn(t),localStorage.setItem(wn,t)}function Hn(e){document.documentElement.setAttribute("data-theme",e);let t=document.getElementById("toggleTheme");t&&t.classList.toggle("is-light",e==="light");let n=document.getElementById("hljsTheme");n&&(n.href=e==="dark"?Zn:eo)}M();window.addEventListener("unhandledrejection",e=>{console.error("[unhandled]",e.reason),e.preventDefault()});window.addEventListener("error",e=>{console.error("[error]",e.message,e.filename,e.lineno)});document.getElementById("btnSend")?.addEventListener("click",Me);var Ct=document.getElementById("chatInput");Ct?.addEventListener("keydown",e=>{ze(e)||gn(e)});var we=0;Ct?.addEventListener("input",e=>{e.isComposing||(we&&cancelAnimationFrame(we),we=requestAnimationFrame(()=>{me(e.target?.value||""),we=0}))});Ct?.addEventListener("cmd-execute",()=>{Me()});document.getElementById("cmdDropdown")?.addEventListener("click",Ke);document.addEventListener("click",Ue);document.getElementById("filePreviewClear")?.addEventListener("click",Le);document.getElementById("filePreviewList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-file-idx]");t&&fn(+(t.dataset.fileIdx||"0"))});document.querySelector(".btn-attach")?.addEventListener("click",()=>{document.getElementById("fileInput")?.click()});document.getElementById("memorySidebarBtn")?.addEventListener("click",Se);document.getElementById("btnClearChat")?.addEventListener("click",yn);document.getElementById("hbSidebarBtn")?.addEventListener("click",bn);document.getElementById("langToggle")?.addEventListener("click",async()=>{let e=te()==="ko"?"en":"ko";await Zt(e);let t=document.getElementById("langToggle");t&&(t.textContent=`\u{1F310} ${c("lang."+e)}`),l.ws&&l.ws.close()});document.querySelector(".tab-bar")?.addEventListener("click",e=>{let t=e.target?.closest(".tab-btn");if(!t)return;let o=[...t.parentElement?.children||[]].filter(a=>a.classList.contains("tab-btn")).indexOf(t),i=["agents","skills","settings"];i[o]&&pt(i[o],t)});document.querySelector(".sidebar-save-bar .btn-save")?.addEventListener("click",gt);document.getElementById("selCli")?.addEventListener("change",()=>pe());document.getElementById("selModel")?.addEventListener("change",()=>_());document.getElementById("selEffort")?.addEventListener("change",()=>_());document.querySelector('[data-action="addEmployee"]')?.addEventListener("click",$e);document.getElementById("employeesList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-emp-delete]");if(t){Be(t.dataset.empDelete||"");return}});document.getElementById("employeesList")?.addEventListener("change",e=>{let t=e.target,n=t.closest("[data-emp-name]");if(n){$(n.dataset.empName||"",{name:t.value});return}let o=t.closest("[data-emp-cli]");if(o){Ae(o.dataset.empCli||"",t.value);return}let i=t.closest("[data-emp-model]");if(i){if(t.value==="__custom__"){let d=prompt(c("model.promptInput"));if(d?.trim()){let s=document.createElement("option");s.value=d.trim(),s.textContent=d.trim();let u=t.querySelector('option[value="__custom__"]');u&&t.insertBefore(s,u),t.value=d.trim(),$(i.dataset.empModel||"",{model:d.trim()})}else t.value="default"}else $(i.dataset.empModel||"",{model:t.value});return}let a=t.closest("[data-emp-role]");if(a){Pe(a.dataset.empRole||"",t.value);return}let r=t.closest("[data-emp-custom]");if(r){$(r.dataset.empCustom||"",{role:t.value});return}});document.getElementById("skillsList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-skill-id]");t&&De(t.dataset.skillId||"",t.dataset.skillEnabled==="true")});document.querySelector("#tabSkills")?.addEventListener("click",e=>{let t=e.target?.closest(".skill-filter");if(t){let n=t.dataset.filter||"all";Fe(n,t)}});document.querySelector('[data-action="openPrompt"]')?.addEventListener("click",at);document.getElementById("tgOff")?.addEventListener("click",()=>fe(!1));document.getElementById("tgOn")?.addEventListener("click",()=>fe(!0));document.getElementById("tgForwardOff")?.addEventListener("click",()=>ye(!1));document.getElementById("tgForwardOn")?.addEventListener("click",()=>ye(!0));document.getElementById("tgToken")?.addEventListener("change",ge);document.getElementById("tgChatIds")?.addEventListener("change",ge);document.getElementById("fallbackOrderList")?.addEventListener("change",it);function no(){for(let e of H()){let t=e.charAt(0).toUpperCase()+e.slice(1),n=document.getElementById("model"+t);n&&n.addEventListener("change",function(){nt(e,this)});let o=document.getElementById("customModel"+t);o&&o.addEventListener("change",function(){ot(e,this)});let i=document.getElementById("effort"+t);i&&i.addEventListener("change",V)}}document.querySelector('[data-action="syncMcp"]')?.addEventListener("click",et);document.querySelector('[data-action="installMcp"]')?.addEventListener("click",tt);document.querySelector('[data-action="refreshCli"]')?.addEventListener("click",()=>ve(!0));document.getElementById("cliStatusInterval")?.addEventListener("change",function(){localStorage.setItem("cliStatusInterval",this.value)});document.getElementById("promptModal")?.addEventListener("click",e=>q(e));document.querySelector("#promptModal .modal-box")?.addEventListener("click",e=>e.stopPropagation());document.querySelector('[data-action="closePrompt"]')?.addEventListener("click",()=>q());document.querySelector('[data-action="cancelPrompt"]')?.addEventListener("click",()=>q());document.querySelector('[data-action="savePrompt"]')?.addEventListener("click",st);document.addEventListener("keydown",e=>{e.key==="Escape"&&q()});document.getElementById("heartbeatModal")?.addEventListener("click",e=>Lt(e));document.querySelector("#heartbeatModal .modal-box")?.addEventListener("click",e=>e.stopPropagation());document.querySelector('[data-action="closeHeartbeat"]')?.addEventListener("click",()=>Lt());document.querySelector('[data-action="addHeartbeat"]')?.addEventListener("click",En);document.getElementById("hbJobsList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-hb-toggle]");if(t){Ln(+(t.dataset.hbToggle||"0"));return}let n=e.target?.closest("[data-hb-remove]");if(n){xn(+(n.dataset.hbRemove||"0"));return}});document.getElementById("hbJobsList")?.addEventListener("change",e=>{let t=e.target,n=t.closest("[data-hb-name]");if(n){l.heartbeatJobs[+(n.dataset.hbName||"0")].name=t.value,R();return}let o=t.closest("[data-hb-minutes]");if(o){l.heartbeatJobs[+(o.dataset.hbMinutes||"0")].schedule={kind:"every",minutes:+t.value},R();return}let i=t.closest("[data-hb-prompt]");if(i){l.heartbeatJobs[+(i.dataset.hbPrompt||"0")].prompt=t.value,R();return}});document.getElementById("memoryModal")?.addEventListener("click",e=>Mt(e));document.querySelector("#memoryModal .modal-box")?.addEventListener("click",e=>e.stopPropagation());document.querySelector('[data-action="closeMemory"]')?.addEventListener("click",()=>Mt());document.getElementById("memTabBtnSettings")?.addEventListener("click",()=>kt("settings"));document.getElementById("memTabBtnFiles")?.addEventListener("click",()=>kt("files"));document.getElementById("memOn")?.addEventListener("click",()=>St(!0));document.getElementById("memOff")?.addEventListener("click",()=>St(!1));document.getElementById("memFlushEvery")?.addEventListener("change",ne);document.getElementById("memCli")?.addEventListener("change",ne);document.getElementById("memModel")?.addEventListener("change",ne);document.getElementById("memRetention")?.addEventListener("change",ne);document.getElementById("memFilesList")?.addEventListener("click",e=>{let t=e.target?.closest("[data-mem-delete]");if(t){e.stopPropagation(),kn(t.dataset.memDelete||"");return}let n=e.target?.closest("[data-mem-view]");if(n){Sn(n.dataset.memView||"");return}if(e.target?.closest("[data-mem-back]")){Se();return}});async function oo(){await Vt();let e=document.getElementById("langToggle");e&&(e.textContent=`\u{1F310} ${c("lang."+te())}`),await oe(),no(),ht(),hn(),vn(),await Je(),await Xe(),ve(),ft(),He(),Mn(),dn(),Tn(),Cn(),yt()}oo().catch(e=>{console.error("[bootstrap]",e)});document.addEventListener("keydown",e=>{e.key==="Escape"&&document.querySelectorAll(".modal-overlay.open").forEach(t=>{t.classList.remove("open")})});document.getElementById("mobileMenuLeft")?.addEventListener("click",It);document.getElementById("mobileMenuRight")?.addEventListener("click",wt);
135
137
  //# sourceMappingURL=bundle.js.map