droid-patch 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -8
- package/README.zh-CN.md +80 -5
- package/dist/{alias-C2Iew8yJ.mjs → alias-CX4QSelz.mjs} +4 -3
- package/dist/alias-CX4QSelz.mjs.map +1 -0
- package/dist/cli.mjs +440 -451
- package/dist/cli.mjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/alias-C2Iew8yJ.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -62,8 +62,9 @@ npx droid-patch --skip-login -o /path/to/dir my-droid
|
|
|
62
62
|
| `--is-custom` | Patch `isCustom:!0` to `isCustom:!1` (enables context compression for custom models) |
|
|
63
63
|
| `--skip-login` | Bypass login by injecting a fake `FACTORY_API_KEY` into the binary |
|
|
64
64
|
| `--api-base <url>` | Replace API URL (standalone: binary patch, max 22 chars; with `--websearch`: proxy forward target, no limit) |
|
|
65
|
-
| `--websearch` |
|
|
66
|
-
| `--
|
|
65
|
+
| `--websearch` | External providers mode: Smithery, Google PSE, Serper, Brave, SearXNG, DuckDuckGo |
|
|
66
|
+
| `--websearch-proxy` | Native provider mode: use model's built-in web_search (requires proxy plugin) |
|
|
67
|
+
| `--standalone` | Standalone mode: mock non-LLM Factory APIs (use with `--websearch` or `--websearch-proxy`) |
|
|
67
68
|
| `--reasoning-effort` | Enable reasoning effort UI selector for custom models (set to high) |
|
|
68
69
|
| `--disable-telemetry` | Disable telemetry and Sentry error reporting |
|
|
69
70
|
| `--dry-run` | Verify patches without actually modifying the binary |
|
|
@@ -195,15 +196,24 @@ npx droid-patch --websearch --api-base "http://127.0.0.1:20002" droid-custom
|
|
|
195
196
|
npx droid-patch --websearch --api-base "http://my-proxy.example.com:3000" droid-custom
|
|
196
197
|
```
|
|
197
198
|
|
|
199
|
+
### `--websearch` vs `--websearch-proxy`
|
|
200
|
+
|
|
201
|
+
**Important**: `--websearch` and `--websearch-proxy` are **mutually exclusive** - you can only use one at a time.
|
|
202
|
+
|
|
203
|
+
| Mode | Description | Requires |
|
|
204
|
+
| ------------------- | ------------------------------------ | --------------------------- |
|
|
205
|
+
| `--websearch` | External search providers | Environment variables |
|
|
206
|
+
| `--websearch-proxy` | Model's native web_search capability | Proxy plugin + custom model |
|
|
207
|
+
|
|
198
208
|
### `--websearch`
|
|
199
209
|
|
|
200
|
-
Enables WebSearch
|
|
210
|
+
Enables WebSearch via **external search providers** through a local proxy server.
|
|
201
211
|
|
|
202
|
-
**Purpose**: Enable WebSearch
|
|
212
|
+
**Purpose**: Enable WebSearch using third-party search APIs.
|
|
203
213
|
|
|
204
214
|
**Features**:
|
|
205
215
|
|
|
206
|
-
- **Multiple search providers** with automatic fallback
|
|
216
|
+
- **Multiple search providers** with automatic fallback (Smithery > Google PSE > Serper > Brave > SearXNG > DuckDuckGo)
|
|
207
217
|
- **Per-instance proxy**: Each droid instance runs its own proxy on an auto-assigned port
|
|
208
218
|
- **Auto-cleanup**: Proxy automatically stops when droid exits
|
|
209
219
|
- **Forward target**: Use `--api-base` with `--websearch` to forward non-search requests to a custom backend
|
|
@@ -222,6 +232,71 @@ npx droid-patch --websearch --api-base=http://127.0.0.1:20002 droid-custom
|
|
|
222
232
|
droid-search
|
|
223
233
|
```
|
|
224
234
|
|
|
235
|
+
### `--websearch-proxy`
|
|
236
|
+
|
|
237
|
+
Enables WebSearch via **model's native web_search capability** (e.g., Claude's `web_search_20250305` tool).
|
|
238
|
+
|
|
239
|
+
**Purpose**: Use the LLM provider's built-in web search instead of external providers.
|
|
240
|
+
|
|
241
|
+
**Requirements**:
|
|
242
|
+
|
|
243
|
+
1. **Custom model** configured in `~/.factory/settings.json` with a supported provider (`anthropic` or `openai`)
|
|
244
|
+
2. **Proxy plugin** ([jixoai/proxy](https://github.com/jixoai/proxy)) to handle Claude Code format conversion
|
|
245
|
+
|
|
246
|
+
**Features**:
|
|
247
|
+
|
|
248
|
+
- Reads model configuration from `~/.factory/settings.json`
|
|
249
|
+
- Supports Anthropic (`web_search_20250305`) and OpenAI (`web_search`) native tools
|
|
250
|
+
- Automatically detects current model's provider
|
|
251
|
+
- No external API keys needed (uses your LLM provider's search)
|
|
252
|
+
|
|
253
|
+
**Usage**:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# Create alias with native websearch (requires proxy plugin)
|
|
257
|
+
npx droid-patch --is-custom --skip-login --websearch-proxy droid-native
|
|
258
|
+
|
|
259
|
+
# Combine with reasoning effort
|
|
260
|
+
npx droid-patch --is-custom --skip-login --reasoning-effort --websearch-proxy droid-full
|
|
261
|
+
|
|
262
|
+
# Debug mode
|
|
263
|
+
DROID_SEARCH_DEBUG=1 droid-native
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Proxy Plugin Setup**:
|
|
267
|
+
|
|
268
|
+
The `--websearch-proxy` mode requires the [jixoai/proxy](https://github.com/jixoai/proxy) plugin to convert between Claude Code format and standard Anthropic API format.
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# Clone and setup the proxy
|
|
272
|
+
git clone https://github.com/jixoai/proxy.git
|
|
273
|
+
cd proxy
|
|
274
|
+
|
|
275
|
+
# Install and run (see proxy README for details)
|
|
276
|
+
pnpm install
|
|
277
|
+
pnpm dev
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Configure your custom model in `~/.factory/settings.json`:
|
|
281
|
+
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"customModels": [
|
|
285
|
+
{
|
|
286
|
+
"model": "claude-sonnet-4-20250514",
|
|
287
|
+
"id": "custom:Claude-Proxy-0",
|
|
288
|
+
"baseUrl": "http://127.0.0.1:20002/droid",
|
|
289
|
+
"apiKey": "your-api-key",
|
|
290
|
+
"displayName": "Claude [proxy]",
|
|
291
|
+
"provider": "anthropic"
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
"sessionDefaultSettings": {
|
|
295
|
+
"model": "custom:Claude-Proxy-0"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
225
300
|
### `--reasoning-effort`
|
|
226
301
|
|
|
227
302
|
Enables reasoning effort control for custom models by patching the binary to:
|
|
@@ -600,22 +675,31 @@ droid-search
|
|
|
600
675
|
## Examples
|
|
601
676
|
|
|
602
677
|
```bash
|
|
603
|
-
# Quick start: create droid with websearch
|
|
678
|
+
# Quick start: create droid with websearch (external providers)
|
|
604
679
|
npx droid-patch --websearch droid-search
|
|
605
680
|
droid-search # Just works!
|
|
606
681
|
|
|
607
|
-
# Full-featured droid
|
|
682
|
+
# Full-featured droid with external websearch
|
|
608
683
|
npx droid-patch --is-custom --skip-login --websearch --reasoning-effort droid-full
|
|
609
684
|
|
|
685
|
+
# Native websearch via proxy plugin (requires jixoai/proxy)
|
|
686
|
+
npx droid-patch --is-custom --skip-login --websearch-proxy droid-native
|
|
687
|
+
|
|
688
|
+
# Native websearch + reasoning effort
|
|
689
|
+
npx droid-patch --is-custom --skip-login --reasoning-effort --websearch-proxy droid-native-full
|
|
690
|
+
|
|
610
691
|
# Standalone mode: websearch + mock non-LLM APIs
|
|
611
692
|
npx droid-patch --websearch --standalone droid-local
|
|
612
693
|
|
|
613
694
|
# Privacy mode: disable telemetry
|
|
614
695
|
npx droid-patch --disable-telemetry droid-private
|
|
615
696
|
|
|
616
|
-
# Full local setup: all features combined
|
|
697
|
+
# Full local setup: all features combined (external websearch)
|
|
617
698
|
npx droid-patch --is-custom --skip-login --websearch --standalone --disable-telemetry droid-full-local
|
|
618
699
|
|
|
700
|
+
# Full local setup with native websearch
|
|
701
|
+
npx droid-patch --is-custom --skip-login --websearch-proxy --standalone --disable-telemetry droid-native-local
|
|
702
|
+
|
|
619
703
|
# Websearch with custom backend
|
|
620
704
|
npx droid-patch --websearch --api-base=http://127.0.0.1:20002 droid-custom
|
|
621
705
|
|
package/README.zh-CN.md
CHANGED
|
@@ -62,8 +62,9 @@ npx droid-patch --skip-login -o /path/to/dir my-droid
|
|
|
62
62
|
| `--is-custom` | 将 `isCustom:!0` 修改为 `isCustom:!1`(为自定义模型启用上下文压缩) |
|
|
63
63
|
| `--skip-login` | 通过注入假的 `FACTORY_API_KEY` 跳过登录验证 |
|
|
64
64
|
| `--api-base <url>` | 替换 API URL(单独使用:二进制补丁,最多 22 字符;与 `--websearch` 配合:代理转发目标,无限制) |
|
|
65
|
-
| `--websearch` |
|
|
66
|
-
| `--
|
|
65
|
+
| `--websearch` | 外部搜索模式:使用 Smithery、Google PSE、Serper、Brave、SearXNG、DuckDuckGo |
|
|
66
|
+
| `--websearch-proxy` | 原生搜索模式:使用模型内置的 web_search 能力(需要 proxy 插件) |
|
|
67
|
+
| `--standalone` | 独立模式:mock 非 LLM 的 Factory API(与 `--websearch` 或 `--websearch-proxy` 配合使用) |
|
|
67
68
|
| `--reasoning-effort` | 为自定义模型启用推理强度 UI 选择器(设置为 high) |
|
|
68
69
|
| `--disable-telemetry` | 禁用遥测数据上传和 Sentry 错误报告 |
|
|
69
70
|
| `--dry-run` | 验证修补但不实际修改二进制文件 |
|
|
@@ -195,15 +196,24 @@ npx droid-patch --websearch --api-base "http://127.0.0.1:20002" droid-custom
|
|
|
195
196
|
npx droid-patch --websearch --api-base "http://my-proxy.example.com:3000" droid-custom
|
|
196
197
|
```
|
|
197
198
|
|
|
199
|
+
### `--websearch` vs `--websearch-proxy`
|
|
200
|
+
|
|
201
|
+
**重要**:`--websearch` 和 `--websearch-proxy` **互斥** - 只能选择其中一个。
|
|
202
|
+
|
|
203
|
+
| 模式 | 描述 | 需要 |
|
|
204
|
+
| ------------------- | ------------------------ | ----------------------- |
|
|
205
|
+
| `--websearch` | 外部搜索提供商 | 环境变量配置 |
|
|
206
|
+
| `--websearch-proxy` | 模型原生 web_search 能力 | proxy 插件 + 自定义模型 |
|
|
207
|
+
|
|
198
208
|
### `--websearch`
|
|
199
209
|
|
|
200
|
-
通过本地代理服务器启用
|
|
210
|
+
通过本地代理服务器启用 **外部搜索提供商** 的 WebSearch 功能。
|
|
201
211
|
|
|
202
|
-
|
|
212
|
+
**用途**:使用第三方搜索 API 实现 WebSearch。
|
|
203
213
|
|
|
204
214
|
**特性**:
|
|
205
215
|
|
|
206
|
-
-
|
|
216
|
+
- **多搜索提供商**:自动降级(Smithery > Google PSE > Serper > Brave > SearXNG > DuckDuckGo)
|
|
207
217
|
- **每实例独立代理**:每个 droid 实例运行自己的代理,自动分配端口
|
|
208
218
|
- **自动清理**:droid 退出时代理自动停止
|
|
209
219
|
- **转发目标**:使用 `--api-base` 配合 `--websearch` 可将非搜索请求转发到自定义后端
|
|
@@ -222,6 +232,71 @@ npx droid-patch --websearch --api-base=http://127.0.0.1:20002 droid-custom
|
|
|
222
232
|
droid-search
|
|
223
233
|
```
|
|
224
234
|
|
|
235
|
+
### `--websearch-proxy`
|
|
236
|
+
|
|
237
|
+
通过 **模型原生 web_search 能力**(如 Claude 的 `web_search_20250305` 工具)启用 WebSearch。
|
|
238
|
+
|
|
239
|
+
**用途**:使用 LLM 提供商内置的网页搜索,而非外部提供商。
|
|
240
|
+
|
|
241
|
+
**需求**:
|
|
242
|
+
|
|
243
|
+
1. 在 `~/.factory/settings.json` 中配置支持的 provider(`anthropic` 或 `openai`)的 **自定义模型**
|
|
244
|
+
2. **Proxy 插件**([jixoai/proxy](https://github.com/jixoai/proxy))处理 Claude Code 格式转换
|
|
245
|
+
|
|
246
|
+
**特性**:
|
|
247
|
+
|
|
248
|
+
- 从 `~/.factory/settings.json` 读取模型配置
|
|
249
|
+
- 支持 Anthropic(`web_search_20250305`)和 OpenAI(`web_search`)原生工具
|
|
250
|
+
- 自动检测当前模型的 provider
|
|
251
|
+
- 无需外部 API 密钥(使用 LLM 提供商的搜索)
|
|
252
|
+
|
|
253
|
+
**使用方法**:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# 创建带原生 websearch 的别名(需要 proxy 插件)
|
|
257
|
+
npx droid-patch --is-custom --skip-login --websearch-proxy droid-native
|
|
258
|
+
|
|
259
|
+
# 配合推理强度使用
|
|
260
|
+
npx droid-patch --is-custom --skip-login --reasoning-effort --websearch-proxy droid-full
|
|
261
|
+
|
|
262
|
+
# 调试模式
|
|
263
|
+
DROID_SEARCH_DEBUG=1 droid-native
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Proxy 插件设置**:
|
|
267
|
+
|
|
268
|
+
`--websearch-proxy` 模式需要 [jixoai/proxy](https://github.com/jixoai/proxy) 插件在 Claude Code 格式和标准 Anthropic API 格式之间转换。
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# 克隆并设置 proxy
|
|
272
|
+
git clone https://github.com/jixoai/proxy.git
|
|
273
|
+
cd proxy
|
|
274
|
+
|
|
275
|
+
# 安装并运行(详见 proxy README)
|
|
276
|
+
pnpm install
|
|
277
|
+
pnpm dev
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
在 `~/.factory/settings.json` 中配置自定义模型:
|
|
281
|
+
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"customModels": [
|
|
285
|
+
{
|
|
286
|
+
"model": "claude-sonnet-4-20250514",
|
|
287
|
+
"id": "custom:Claude-Proxy-0",
|
|
288
|
+
"baseUrl": "http://127.0.0.1:20002/droid",
|
|
289
|
+
"apiKey": "your-api-key",
|
|
290
|
+
"displayName": "Claude [proxy]",
|
|
291
|
+
"provider": "anthropic"
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
"sessionDefaultSettings": {
|
|
295
|
+
"model": "custom:Claude-Proxy-0"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
225
300
|
### `--reasoning-effort`
|
|
226
301
|
|
|
227
302
|
通过修补二进制文件为自定义模型启用推理强度控制:
|
|
@@ -255,12 +255,13 @@ function formatPatches(patches) {
|
|
|
255
255
|
const applied = [];
|
|
256
256
|
if (patches.isCustom) applied.push("isCustom");
|
|
257
257
|
if (patches.skipLogin) applied.push("skipLogin");
|
|
258
|
-
if (patches.apiBase && !patches.websearch) applied.push(`apiBase(${patches.apiBase})`);
|
|
258
|
+
if (patches.apiBase && !patches.websearch && !patches.websearchProxy) applied.push(`apiBase(${patches.apiBase})`);
|
|
259
259
|
if (patches.websearch) {
|
|
260
260
|
const target = patches.apiBase || "api.factory.ai";
|
|
261
261
|
applied.push(`websearch(${target})`);
|
|
262
262
|
}
|
|
263
|
-
if (patches.
|
|
263
|
+
if (patches.websearchProxy) applied.push("websearchProxy(native)");
|
|
264
|
+
if (patches.proxy && !patches.websearch && !patches.websearchProxy) applied.push(`websearch(${patches.proxy})`);
|
|
264
265
|
if (patches.reasoningEffort) applied.push("reasoningEffort");
|
|
265
266
|
if (patches.noTelemetry) applied.push("noTelemetry");
|
|
266
267
|
if (patches.standalone) applied.push("standalone");
|
|
@@ -980,4 +981,4 @@ async function clearAllAliases() {
|
|
|
980
981
|
|
|
981
982
|
//#endregion
|
|
982
983
|
export { removeAlias as a, restoreOriginal as c, listAllMetadata as d, loadAliasMetadata as f, listAliases as i, createMetadata as l, patchDroid as m, createAlias as n, removeAliasesByFilter as o, saveAliasMetadata as p, createAliasForWrapper as r, replaceOriginal as s, clearAllAliases as t, formatPatches as u };
|
|
983
|
-
//# sourceMappingURL=alias-
|
|
984
|
+
//# sourceMappingURL=alias-CX4QSelz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias-CX4QSelz.mjs","names":["results: PatchResult[]","positions: number[]","metaList: AliasMetadata[]","applied: string[]","exportLine: string","binaryDest","aliases: AliasInfo[]","matchingAliases: string[]"],"sources":["../src/patcher.ts","../src/metadata.ts","../src/alias.ts"],"sourcesContent":["import { readFile, writeFile, copyFile, chmod, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { styleText } from \"node:util\";\n\nexport interface Patch {\n name: string;\n description: string;\n pattern: Buffer;\n replacement: Buffer;\n}\n\nexport interface PatchOptions {\n inputPath: string;\n outputPath?: string;\n patches: Patch[];\n dryRun?: boolean;\n backup?: boolean;\n verbose?: boolean;\n}\n\ninterface PatchResult {\n name: string;\n found: number;\n positions?: number[];\n success: boolean;\n alreadyPatched?: boolean;\n}\n\nexport interface PatchDroidResult {\n success: boolean;\n dryRun?: boolean;\n results: PatchResult[];\n outputPath?: string;\n noPatchNeeded?: boolean;\n patchedCount?: number;\n}\n\nexport async function patchDroid(options: PatchOptions): Promise<PatchDroidResult> {\n const {\n inputPath,\n outputPath,\n patches,\n dryRun = false,\n backup = true,\n verbose = false,\n } = options;\n\n const finalOutputPath = outputPath || `${inputPath}.patched`;\n\n if (!existsSync(inputPath)) {\n throw new Error(`Binary not found: ${inputPath}`);\n }\n\n const stats = await stat(inputPath);\n const fileSizeMB = (stats.size / (1024 * 1024)).toFixed(2);\n\n console.log(styleText(\"white\", `[*] Reading binary: ${styleText(\"cyan\", inputPath)}`));\n console.log(styleText(\"white\", `[*] File size: ${styleText(\"cyan\", fileSizeMB)} MB`));\n console.log();\n\n const data = await readFile(inputPath);\n const buffer = Buffer.from(data);\n\n // Use a working buffer that gets updated after each patch application\n // This ensures later patches search against the already-patched content\n const workingBuffer = Buffer.from(buffer);\n\n const results: PatchResult[] = [];\n\n for (const patch of patches) {\n console.log(styleText(\"white\", `[*] Checking patch: ${styleText(\"yellow\", patch.name)}`));\n console.log(styleText(\"gray\", ` ${patch.description}`));\n\n // Search in the working buffer (which may have earlier patches applied)\n const positions = findAllPositions(workingBuffer, patch.pattern);\n\n if (positions.length === 0) {\n console.log(styleText(\"yellow\", ` ! Pattern not found - may already be patched`));\n results.push({\n name: patch.name,\n found: 0,\n success: false,\n alreadyPatched: workingBuffer.includes(patch.replacement),\n });\n\n const replacementPositions = findAllPositions(workingBuffer, patch.replacement);\n if (replacementPositions.length > 0) {\n console.log(\n styleText(\n \"blue\",\n ` ✓ Found ${replacementPositions.length} occurrences of patched pattern`,\n ),\n );\n console.log(styleText(\"blue\", ` ✓ Binary appears to be already patched`));\n results[results.length - 1].alreadyPatched = true;\n results[results.length - 1].success = true;\n }\n continue;\n }\n\n console.log(styleText(\"green\", ` ✓ Found ${positions.length} occurrences`));\n\n if (verbose) {\n for (const pos of positions.slice(0, 5)) {\n const context = getContext(workingBuffer, pos, patch.pattern.length, 25);\n console.log(\n styleText(\"gray\", ` @ 0x${pos.toString(16).padStart(8, \"0\")}: ...${context}...`),\n );\n }\n if (positions.length > 5) {\n console.log(styleText(\"gray\", ` ... and ${positions.length - 5} more`));\n }\n }\n\n // Apply patch immediately to working buffer so later patches see updated content\n if (!dryRun) {\n for (const pos of positions) {\n patch.replacement.copy(workingBuffer, pos);\n }\n }\n\n results.push({\n name: patch.name,\n found: positions.length,\n positions,\n success: true,\n });\n }\n\n console.log();\n\n if (dryRun) {\n console.log(styleText(\"blue\", \"─\".repeat(60)));\n console.log(styleText([\"blue\", \"bold\"], \" DRY RUN RESULTS\"));\n console.log(styleText(\"blue\", \"─\".repeat(60)));\n console.log();\n\n for (const result of results) {\n if (result.alreadyPatched) {\n console.log(styleText(\"blue\", ` [✓] ${result.name}: Already patched`));\n } else if (result.found > 0) {\n console.log(\n styleText(\"green\", ` [✓] ${result.name}: ${result.found} occurrences will be patched`),\n );\n } else {\n console.log(styleText(\"yellow\", ` [!] ${result.name}: Pattern not found`));\n }\n }\n\n return {\n success: results.every((r) => r.success || r.alreadyPatched),\n dryRun: true,\n results,\n };\n }\n\n const patchesNeeded = results.filter((r) => r.found > 0 && !r.alreadyPatched);\n\n if (patchesNeeded.length === 0) {\n const allPatched = results.every((r) => r.alreadyPatched);\n if (allPatched) {\n console.log(styleText(\"blue\", \"[*] All patches already applied. Binary is up to date.\"));\n return {\n success: true,\n outputPath: inputPath,\n results,\n noPatchNeeded: true,\n };\n }\n console.log(styleText(\"yellow\", \"[!] No patches could be applied.\"));\n return { success: false, results };\n }\n\n if (backup) {\n const backupPath = `${inputPath}.backup`;\n if (!existsSync(backupPath)) {\n await copyFile(inputPath, backupPath);\n console.log(styleText(\"white\", `[*] Created backup: ${styleText(\"cyan\", backupPath)}`));\n } else {\n console.log(styleText(\"gray\", `[*] Backup already exists: ${backupPath}`));\n }\n }\n\n console.log(styleText(\"white\", \"[*] Applying patches...\"));\n // Patches have already been applied to workingBuffer during the check phase\n // Count total patches applied\n const totalPatched = results.reduce((sum, r) => sum + (r.positions?.length || 0), 0);\n\n console.log(styleText(\"green\", `[*] Applied ${totalPatched} patches`));\n\n await writeFile(finalOutputPath, workingBuffer);\n console.log(\n styleText(\"white\", `[*] Patched binary saved: ${styleText(\"cyan\", finalOutputPath)}`),\n );\n\n await chmod(finalOutputPath, 0o755);\n console.log(styleText(\"gray\", \"[*] Set executable permission\"));\n\n console.log();\n console.log(styleText(\"white\", \"[*] Verifying patches...\"));\n const verifyBuffer = await readFile(finalOutputPath);\n\n let allVerified = true;\n for (const patch of patches) {\n const oldCount = findAllPositions(verifyBuffer, patch.pattern).length;\n const newCount = findAllPositions(verifyBuffer, patch.replacement).length;\n\n if (oldCount === 0) {\n console.log(styleText(\"green\", ` ✓ ${patch.name}: Verified (${newCount} patched)`));\n } else {\n console.log(styleText(\"red\", ` ✗ ${patch.name}: ${oldCount} occurrences not patched`));\n allVerified = false;\n }\n }\n\n if (allVerified) {\n console.log();\n console.log(styleText(\"green\", \"[+] All patches verified successfully!\"));\n }\n\n if (process.platform === \"darwin\") {\n console.log();\n try {\n console.log(styleText(\"gray\", \"[*] Re-signing binary for macOS...\"));\n execSync(`codesign --force --deep --sign - \"${finalOutputPath}\"`, {\n stdio: \"pipe\",\n });\n console.log(styleText(\"green\", \"[*] Binary re-signed successfully\"));\n } catch {\n console.log(styleText(\"yellow\", \"[!] Could not re-sign binary\"));\n console.log(\n styleText(\n \"gray\",\n ` You may need to run: codesign --force --deep --sign - ${finalOutputPath}`,\n ),\n );\n }\n\n try {\n execSync(`xattr -cr \"${finalOutputPath}\"`, { stdio: \"pipe\" });\n } catch {\n // Ignore\n }\n }\n\n return {\n success: allVerified,\n outputPath: finalOutputPath,\n results,\n patchedCount: totalPatched,\n };\n}\n\nfunction findAllPositions(buffer: Buffer, pattern: Buffer): number[] {\n const positions: number[] = [];\n let pos = 0;\n\n while (true) {\n pos = buffer.indexOf(pattern, pos);\n if (pos === -1) break;\n positions.push(pos);\n pos += pattern.length;\n }\n\n return positions;\n}\n\nfunction getContext(\n buffer: Buffer,\n position: number,\n patternLength: number,\n contextSize: number,\n): string {\n const start = Math.max(0, position - contextSize);\n const end = Math.min(buffer.length, position + patternLength + contextSize);\n const slice = buffer.slice(start, end);\n\n let str = \"\";\n for (let i = 0; i < slice.length; i++) {\n const c = slice[i];\n if (c >= 32 && c < 127) {\n str += String.fromCharCode(c);\n } else {\n str += \".\";\n }\n }\n return str;\n}\n","/**\n * Alias Metadata Management\n *\n * Stores and retrieves metadata about created aliases, including\n * which patches were applied. This enables the `update` command\n * to re-apply the same patches when the original droid binary is updated.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/**\n * Metadata structure for an alias\n */\nexport interface AliasMetadata {\n /** Alias name */\n name: string;\n /** ISO timestamp when created */\n createdAt: string;\n /** ISO timestamp when last updated */\n updatedAt: string;\n /** Path to the original droid binary used for patching */\n originalBinaryPath: string;\n /** Path where the alias symlink was created */\n aliasPath?: string;\n /** droid-patch version used to create this alias */\n droidPatchVersion?: string;\n /** droid binary version */\n droidVersion?: string;\n /** Patches that were applied */\n patches: {\n isCustom: boolean;\n skipLogin: boolean;\n /** API base URL for binary patching or websearch forward target */\n apiBase: string | null;\n /** Whether websearch is enabled (external providers mode) */\n websearch: boolean;\n /** Whether websearch-proxy is enabled (native provider mode) */\n websearchProxy?: boolean;\n /** @deprecated Old proxy field, kept for backward compatibility */\n proxy?: string | null;\n reasoningEffort: boolean;\n /** Whether telemetry/Sentry is disabled */\n noTelemetry?: boolean;\n /** Standalone mode: mock non-LLM Factory APIs */\n standalone?: boolean;\n /** Hardcode autonomy mode to auto-high */\n autoHigh?: boolean;\n };\n}\n\n// Directory for storing metadata files\nconst META_DIR = join(homedir(), \".droid-patch\", \"meta\");\n\n/**\n * Ensure metadata directory exists\n */\nasync function ensureMetaDir(): Promise<void> {\n if (!existsSync(META_DIR)) {\n await mkdir(META_DIR, { recursive: true });\n }\n}\n\n/**\n * Get the path to a metadata file for an alias\n */\nfunction getMetaPath(aliasName: string): string {\n return join(META_DIR, `${aliasName}.json`);\n}\n\n/**\n * Save alias metadata to disk\n */\nexport async function saveAliasMetadata(meta: AliasMetadata): Promise<void> {\n await ensureMetaDir();\n const metaPath = getMetaPath(meta.name);\n await writeFile(metaPath, JSON.stringify(meta, null, 2));\n}\n\n/**\n * Load alias metadata from disk\n * Returns null if metadata doesn't exist\n */\nexport async function loadAliasMetadata(aliasName: string): Promise<AliasMetadata | null> {\n const metaPath = getMetaPath(aliasName);\n if (!existsSync(metaPath)) {\n return null;\n }\n try {\n const content = await readFile(metaPath, \"utf-8\");\n return JSON.parse(content) as AliasMetadata;\n } catch {\n return null;\n }\n}\n\n/**\n * List all alias metadata\n */\nexport async function listAllMetadata(): Promise<AliasMetadata[]> {\n await ensureMetaDir();\n\n const files = await readdir(META_DIR);\n const metaList: AliasMetadata[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n const aliasName = file.replace(/\\.json$/, \"\");\n const meta = await loadAliasMetadata(aliasName);\n if (meta) {\n metaList.push(meta);\n }\n }\n\n return metaList;\n}\n\n/**\n * Remove alias metadata\n */\nexport async function removeAliasMetadata(aliasName: string): Promise<boolean> {\n const metaPath = getMetaPath(aliasName);\n if (!existsSync(metaPath)) {\n return false;\n }\n try {\n await unlink(metaPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create a new metadata object with current timestamp\n */\nexport function createMetadata(\n name: string,\n originalBinaryPath: string,\n patches: AliasMetadata[\"patches\"],\n options?: {\n droidPatchVersion?: string;\n droidVersion?: string;\n aliasPath?: string;\n },\n): AliasMetadata {\n const now = new Date().toISOString();\n return {\n name,\n createdAt: now,\n updatedAt: now,\n originalBinaryPath,\n aliasPath: options?.aliasPath,\n droidPatchVersion: options?.droidPatchVersion,\n droidVersion: options?.droidVersion,\n patches,\n };\n}\n\n/**\n * Format patches for display\n */\nexport function formatPatches(patches: AliasMetadata[\"patches\"]): string {\n const applied: string[] = [];\n if (patches.isCustom) applied.push(\"isCustom\");\n if (patches.skipLogin) applied.push(\"skipLogin\");\n // Show apiBase only when not using websearch (binary patch mode)\n if (patches.apiBase && !patches.websearch && !patches.websearchProxy)\n applied.push(`apiBase(${patches.apiBase})`);\n // Show websearch with optional custom target (external providers mode)\n if (patches.websearch) {\n const target = patches.apiBase || \"api.factory.ai\";\n applied.push(`websearch(${target})`);\n }\n // Show websearchProxy (native provider mode)\n if (patches.websearchProxy) {\n applied.push(\"websearchProxy(native)\");\n }\n // Support old proxy field for backward compatibility\n if (patches.proxy && !patches.websearch && !patches.websearchProxy)\n applied.push(`websearch(${patches.proxy})`);\n if (patches.reasoningEffort) applied.push(\"reasoningEffort\");\n if (patches.noTelemetry) applied.push(\"noTelemetry\");\n if (patches.standalone) applied.push(\"standalone\");\n if (patches.autoHigh) applied.push(\"autoHigh\");\n return applied.length > 0 ? applied.join(\", \") : \"(none)\";\n}\n","import {\n existsSync,\n mkdirSync,\n readdirSync,\n unlinkSync,\n lstatSync,\n readFileSync,\n appendFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { symlink, readlink, unlink, copyFile, chmod } from \"node:fs/promises\";\nimport { join, basename, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execSync } from \"node:child_process\";\nimport { styleText } from \"node:util\";\nimport { removeAliasMetadata, loadAliasMetadata, formatPatches } from \"./metadata.ts\";\n\nconst DROID_PATCH_DIR = join(homedir(), \".droid-patch\");\nconst ALIASES_DIR = join(DROID_PATCH_DIR, \"aliases\");\nconst BINS_DIR = join(DROID_PATCH_DIR, \"bins\");\n\nconst COMMON_PATH_DIRS = [\n join(homedir(), \".local/bin\"),\n join(homedir(), \"bin\"),\n join(homedir(), \".bin\"),\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n join(homedir(), \".npm-global/bin\"),\n join(homedir(), \".npm/bin\"),\n join(homedir(), \".pnpm-global/bin\"),\n join(homedir(), \".yarn/bin\"),\n join(homedir(), \".config/yarn/global/node_modules/.bin\"),\n join(homedir(), \".cargo/bin\"),\n join(homedir(), \"go/bin\"),\n join(homedir(), \".deno/bin\"),\n join(homedir(), \".bun/bin\"),\n join(homedir(), \".local/share/mise/shims\"),\n join(homedir(), \".asdf/shims\"),\n join(homedir(), \".nvm/current/bin\"),\n join(homedir(), \".volta/bin\"),\n join(homedir(), \".fnm/current/bin\"),\n];\n\nfunction ensureDirectories(): void {\n if (!existsSync(DROID_PATCH_DIR)) {\n mkdirSync(DROID_PATCH_DIR, { recursive: true });\n }\n if (!existsSync(ALIASES_DIR)) {\n mkdirSync(ALIASES_DIR, { recursive: true });\n }\n if (!existsSync(BINS_DIR)) {\n mkdirSync(BINS_DIR, { recursive: true });\n }\n}\n\nfunction checkPathInclusion(): boolean {\n const pathEnv = process.env.PATH || \"\";\n return pathEnv.split(\":\").includes(ALIASES_DIR);\n}\n\nexport function findWritablePathDir(): string | null {\n const pathEnv = process.env.PATH || \"\";\n const pathDirs = pathEnv.split(\":\");\n\n for (const dir of COMMON_PATH_DIRS) {\n if (pathDirs.includes(dir)) {\n try {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n const testFile = join(dir, `.droid-patch-test-${Date.now()}`);\n writeFileSync(testFile, \"\");\n unlinkSync(testFile);\n return dir;\n } catch {\n continue;\n }\n }\n }\n\n return null;\n}\n\nfunction getShellConfigPath(): string {\n const shell = process.env.SHELL || \"/bin/bash\";\n const shellName = basename(shell);\n\n switch (shellName) {\n case \"zsh\":\n return join(homedir(), \".zshrc\");\n case \"bash\": {\n const bashProfile = join(homedir(), \".bash_profile\");\n if (existsSync(bashProfile)) return bashProfile;\n return join(homedir(), \".bashrc\");\n }\n case \"fish\":\n return join(homedir(), \".config/fish/config.fish\");\n default:\n return join(homedir(), \".profile\");\n }\n}\n\nfunction isPathConfigured(shellConfigPath: string): boolean {\n if (!existsSync(shellConfigPath)) {\n return false;\n }\n\n try {\n const content = readFileSync(shellConfigPath, \"utf-8\");\n return content.includes(\".droid-patch/aliases\") || content.includes(\"droid-patch/aliases\");\n } catch {\n return false;\n }\n}\n\nfunction addPathToShellConfig(shellConfigPath: string, verbose = false): boolean {\n const shell = process.env.SHELL || \"/bin/bash\";\n const shellName = basename(shell);\n\n let exportLine: string;\n if (shellName === \"fish\") {\n exportLine = `\\n# Added by droid-patch\\nfish_add_path \"${ALIASES_DIR}\"\\n`;\n } else {\n exportLine = `\\n# Added by droid-patch\\nexport PATH=\"${ALIASES_DIR}:$PATH\"\\n`;\n }\n\n try {\n appendFileSync(shellConfigPath, exportLine);\n if (verbose) {\n console.log(styleText(\"gray\", ` Added PATH export to: ${shellConfigPath}`));\n }\n return true;\n } catch (error) {\n console.log(\n styleText(\"yellow\", `[!] Could not write to ${shellConfigPath}: ${(error as Error).message}`),\n );\n return false;\n }\n}\n\nexport interface CreateAliasResult {\n aliasPath: string;\n binaryPath: string;\n immediate?: boolean;\n}\n\nexport async function createAlias(\n patchedBinaryPath: string,\n aliasName: string,\n verbose = false,\n): Promise<CreateAliasResult> {\n ensureDirectories();\n\n console.log(styleText(\"white\", `[*] Creating alias: ${styleText(\"cyan\", aliasName)}`));\n\n const writablePathDir = findWritablePathDir();\n\n if (writablePathDir) {\n const targetPath = join(writablePathDir, aliasName);\n const binaryDest = join(BINS_DIR, `${aliasName}-patched`);\n await copyFile(patchedBinaryPath, binaryDest);\n await chmod(binaryDest, 0o755);\n\n if (verbose) {\n console.log(styleText(\"gray\", ` Stored binary: ${binaryDest}`));\n }\n\n if (existsSync(targetPath)) {\n await unlink(targetPath);\n if (verbose) {\n console.log(styleText(\"gray\", ` Removed existing: ${targetPath}`));\n }\n }\n\n await symlink(binaryDest, targetPath);\n\n if (process.platform === \"darwin\") {\n try {\n console.log(styleText(\"gray\", \"[*] Re-signing binary for macOS...\"));\n execSync(`codesign --force --deep --sign - \"${binaryDest}\"`, {\n stdio: \"pipe\",\n });\n console.log(styleText(\"green\", \"[*] Binary re-signed successfully\"));\n } catch {\n console.log(styleText(\"yellow\", \"[!] Could not re-sign binary\"));\n }\n\n try {\n execSync(`xattr -cr \"${binaryDest}\"`, { stdio: \"pipe\" });\n } catch {\n // Ignore\n }\n }\n\n console.log(styleText(\"green\", `[*] Created: ${targetPath} -> ${binaryDest}`));\n console.log();\n console.log(styleText(\"green\", \"─\".repeat(60)));\n console.log(styleText([\"green\", \"bold\"], \" ALIAS READY - NO ACTION REQUIRED!\"));\n console.log(styleText(\"green\", \"─\".repeat(60)));\n console.log();\n console.log(\n styleText(\n \"white\",\n `The alias \"${styleText([\"cyan\", \"bold\"], aliasName)}\" is now available in ALL terminals.`,\n ),\n );\n console.log(styleText(\"gray\", `(Installed to: ${writablePathDir})`));\n\n return {\n aliasPath: targetPath,\n binaryPath: binaryDest,\n immediate: true,\n };\n }\n\n console.log(styleText(\"yellow\", \"[*] No writable PATH directory found, using fallback...\"));\n\n const binaryDest = join(BINS_DIR, `${aliasName}-patched`);\n await copyFile(patchedBinaryPath, binaryDest);\n await chmod(binaryDest, 0o755);\n\n if (verbose) {\n console.log(styleText(\"gray\", ` Copied binary to: ${binaryDest}`));\n }\n\n if (process.platform === \"darwin\") {\n try {\n console.log(styleText(\"gray\", \"[*] Re-signing binary for macOS...\"));\n execSync(`codesign --force --deep --sign - \"${binaryDest}\"`, {\n stdio: \"pipe\",\n });\n console.log(styleText(\"green\", \"[*] Binary re-signed successfully\"));\n } catch {\n console.log(\n styleText(\"yellow\", \"[!] Could not re-sign binary. You may need to do this manually:\"),\n );\n console.log(styleText(\"gray\", ` codesign --force --deep --sign - \"${binaryDest}\"`));\n }\n\n try {\n execSync(`xattr -cr \"${binaryDest}\"`, { stdio: \"pipe\" });\n } catch {\n // Ignore\n }\n }\n\n const symlinkPath = join(ALIASES_DIR, aliasName);\n\n if (existsSync(symlinkPath)) {\n await unlink(symlinkPath);\n if (verbose) {\n console.log(styleText(\"gray\", ` Removed existing symlink`));\n }\n }\n\n await symlink(binaryDest, symlinkPath);\n await chmod(symlinkPath, 0o755);\n\n console.log(styleText(\"green\", `[*] Created symlink: ${symlinkPath} -> ${binaryDest}`));\n\n const shellConfig = getShellConfigPath();\n\n if (!checkPathInclusion()) {\n if (!isPathConfigured(shellConfig)) {\n console.log(styleText(\"white\", `[*] Configuring PATH in ${shellConfig}...`));\n\n if (addPathToShellConfig(shellConfig, verbose)) {\n console.log(styleText(\"green\", `[*] PATH configured successfully!`));\n console.log();\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log(styleText([\"yellow\", \"bold\"], \" ACTION REQUIRED\"));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log();\n console.log(styleText(\"white\", \"To use the alias in this terminal, run:\"));\n console.log();\n console.log(styleText(\"cyan\", ` source ${shellConfig}`));\n console.log();\n console.log(styleText(\"gray\", \"Or simply open a new terminal window.\"));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n } else {\n const exportLine = `export PATH=\"${ALIASES_DIR}:$PATH\"`;\n console.log();\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log(styleText([\"yellow\", \"bold\"], \" Manual PATH Configuration Required\"));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log();\n console.log(styleText(\"white\", \"Add this line to your shell config:\"));\n console.log(styleText(\"cyan\", ` ${exportLine}`));\n console.log();\n console.log(styleText(\"gray\", `Shell config file: ${shellConfig}`));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n }\n } else {\n console.log(styleText(\"green\", `[*] PATH already configured in ${shellConfig}`));\n console.log();\n console.log(\n styleText(\n \"yellow\",\n `Note: Run \\`source ${shellConfig}\\` or open a new terminal to use the alias.`,\n ),\n );\n }\n } else {\n console.log(styleText(\"green\", `[*] PATH already includes aliases directory`));\n console.log();\n console.log(\n styleText(\n \"green\",\n `You can now use \"${styleText([\"cyan\", \"bold\"], aliasName)}\" command directly!`,\n ),\n );\n }\n\n return {\n aliasPath: symlinkPath,\n binaryPath: binaryDest,\n };\n}\n\nexport async function removeAlias(aliasName: string): Promise<void> {\n console.log(styleText(\"white\", `[*] Removing alias: ${styleText(\"cyan\", aliasName)}`));\n\n let removed = false;\n\n // Check common PATH directories for symlinks\n for (const pathDir of COMMON_PATH_DIRS) {\n const pathSymlink = join(pathDir, aliasName);\n if (existsSync(pathSymlink)) {\n try {\n const stats = lstatSync(pathSymlink);\n if (stats.isSymbolicLink()) {\n const target = await readlink(pathSymlink);\n // Support regular aliases, old websearch wrappers, and new proxy wrappers\n if (\n target.includes(\".droid-patch/bins\") ||\n target.includes(\".droid-patch/websearch\") ||\n target.includes(\".droid-patch/proxy\") ||\n target.includes(\".droid-patch/statusline\")\n ) {\n await unlink(pathSymlink);\n console.log(styleText(\"green\", ` Removed: ${pathSymlink}`));\n removed = true;\n }\n }\n } catch {\n // Ignore\n }\n }\n }\n\n // Check aliases directory\n const symlinkPath = join(ALIASES_DIR, aliasName);\n if (existsSync(symlinkPath)) {\n await unlink(symlinkPath);\n console.log(styleText(\"green\", ` Removed: ${symlinkPath}`));\n removed = true;\n }\n\n // Remove binary if exists\n const binaryPath = join(BINS_DIR, `${aliasName}-patched`);\n if (existsSync(binaryPath)) {\n await unlink(binaryPath);\n console.log(styleText(\"green\", ` Removed binary: ${binaryPath}`));\n removed = true;\n }\n\n // Remove new proxy wrapper and related files if exist\n const proxyDir = join(DROID_PATCH_DIR, \"proxy\");\n const proxyWrapperPath = join(proxyDir, aliasName);\n const proxyScriptPath = join(proxyDir, `${aliasName}-proxy.js`);\n\n if (existsSync(proxyWrapperPath)) {\n await unlink(proxyWrapperPath);\n console.log(styleText(\"green\", ` Removed wrapper: ${proxyWrapperPath}`));\n removed = true;\n }\n\n if (existsSync(proxyScriptPath)) {\n await unlink(proxyScriptPath);\n console.log(styleText(\"green\", ` Removed proxy script: ${proxyScriptPath}`));\n removed = true;\n }\n\n // Remove old websearch wrapper and related files if exist (backward compatibility)\n const websearchDir = join(DROID_PATCH_DIR, \"websearch\");\n const wrapperPath = join(websearchDir, aliasName);\n const oldProxyPath = join(websearchDir, `${aliasName}-proxy.js`);\n const preloadPath = join(websearchDir, `${aliasName}-preload.js`);\n\n if (existsSync(wrapperPath)) {\n await unlink(wrapperPath);\n console.log(styleText(\"green\", ` Removed legacy wrapper: ${wrapperPath}`));\n removed = true;\n }\n\n if (existsSync(oldProxyPath)) {\n await unlink(oldProxyPath);\n console.log(styleText(\"green\", ` Removed legacy proxy: ${oldProxyPath}`));\n removed = true;\n }\n\n if (existsSync(preloadPath)) {\n await unlink(preloadPath);\n console.log(styleText(\"green\", ` Removed legacy preload: ${preloadPath}`));\n removed = true;\n }\n\n // Remove statusline wrapper and monitor script if exist\n const statuslineDir = join(DROID_PATCH_DIR, \"statusline\");\n const statuslineWrapperPath = join(statuslineDir, aliasName);\n const statuslineMonitorPath = join(statuslineDir, `${aliasName}-statusline.js`);\n const statuslineSessionsPath = join(statuslineDir, `${aliasName}-sessions.js`);\n\n if (existsSync(statuslineWrapperPath)) {\n await unlink(statuslineWrapperPath);\n console.log(styleText(\"green\", ` Removed statusline wrapper: ${statuslineWrapperPath}`));\n removed = true;\n }\n\n if (existsSync(statuslineMonitorPath)) {\n await unlink(statuslineMonitorPath);\n console.log(styleText(\"green\", ` Removed statusline monitor: ${statuslineMonitorPath}`));\n removed = true;\n }\n\n if (existsSync(statuslineSessionsPath)) {\n await unlink(statuslineSessionsPath);\n console.log(styleText(\"green\", ` Removed sessions browser: ${statuslineSessionsPath}`));\n removed = true;\n }\n\n // Remove metadata\n const metaRemoved = await removeAliasMetadata(aliasName);\n if (metaRemoved) {\n console.log(styleText(\"green\", ` Removed metadata`));\n removed = true;\n }\n\n if (!removed) {\n console.log(styleText(\"yellow\", ` Alias \"${aliasName}\" not found`));\n } else {\n console.log(styleText(\"green\", `[*] Alias \"${aliasName}\" removed successfully`));\n }\n}\n\nexport async function listAliases(): Promise<void> {\n ensureDirectories();\n\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log(styleText([\"cyan\", \"bold\"], \" Droid-Patch Aliases\"));\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log();\n\n interface AliasInfo {\n name: string;\n target: string;\n location: string;\n immediate: boolean;\n }\n\n const aliases: AliasInfo[] = [];\n\n for (const pathDir of COMMON_PATH_DIRS) {\n if (!existsSync(pathDir)) continue;\n\n try {\n const files = readdirSync(pathDir);\n for (const file of files) {\n const fullPath = join(pathDir, file);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(fullPath);\n // Support regular aliases, old websearch wrappers, and new proxy wrappers\n if (\n target.includes(\".droid-patch/bins\") ||\n target.includes(\".droid-patch/websearch\") ||\n target.includes(\".droid-patch/proxy\") ||\n target.includes(\".droid-patch/statusline\")\n ) {\n aliases.push({\n name: file,\n target,\n location: pathDir,\n immediate: true,\n });\n }\n }\n } catch {\n // Ignore\n }\n }\n } catch {\n // Directory can't be read\n }\n }\n\n try {\n const files = readdirSync(ALIASES_DIR);\n\n for (const file of files) {\n const fullPath = join(ALIASES_DIR, file);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(fullPath);\n if (!aliases.find((a) => a.name === file)) {\n aliases.push({\n name: file,\n target,\n location: ALIASES_DIR,\n immediate: false,\n });\n }\n }\n } catch {\n // Ignore\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n if (aliases.length === 0) {\n console.log(styleText(\"gray\", \" No aliases configured.\"));\n console.log();\n console.log(styleText(\"gray\", \" Create one with: npx droid-patch --is-custom <alias-name>\"));\n } else {\n console.log(styleText(\"white\", ` Found ${aliases.length} alias(es):`));\n console.log();\n for (const alias of aliases) {\n const status = alias.immediate\n ? styleText(\"green\", \"✓ immediate\")\n : styleText(\"yellow\", \"requires source\");\n console.log(styleText(\"green\", ` • ${styleText([\"cyan\", \"bold\"], alias.name)} [${status}]`));\n console.log(styleText(\"gray\", ` → ${alias.target}`));\n\n // Load and display metadata\n const meta = await loadAliasMetadata(alias.name);\n if (meta) {\n // Version info\n const patchVer = meta.droidPatchVersion\n ? `droid-patch@${meta.droidPatchVersion}`\n : \"unknown\";\n const droidVer = meta.droidVersion ? `droid@${meta.droidVersion}` : \"unknown\";\n console.log(styleText(\"gray\", ` Versions: ${patchVer}, ${droidVer}`));\n\n // Flags/patches\n const flags = formatPatches(meta.patches);\n console.log(styleText(\"gray\", ` Flags: ${flags}`));\n\n // Created time\n if (meta.createdAt) {\n const date = new Date(meta.createdAt).toLocaleString();\n console.log(styleText(\"gray\", ` Created: ${date}`));\n }\n } else {\n console.log(styleText(\"yellow\", ` (no metadata - created by older version)`));\n }\n console.log();\n }\n }\n\n console.log();\n console.log(styleText(\"gray\", ` Aliases directory: ${ALIASES_DIR}`));\n console.log(\n styleText(\n \"gray\",\n ` PATH configured: ${checkPathInclusion() ? styleText(\"green\", \"Yes\") : styleText(\"yellow\", \"No\")}`,\n ),\n );\n console.log();\n}\n\nexport interface ReplaceOriginalResult {\n originalPath: string;\n backupPath: string;\n}\n\nexport async function replaceOriginal(\n patchedBinaryPath: string,\n originalPath: string,\n verbose = false,\n): Promise<ReplaceOriginalResult> {\n ensureDirectories();\n\n console.log(\n styleText(\"white\", `[*] Replacing original binary: ${styleText(\"cyan\", originalPath)}`),\n );\n\n const latestBackupPath = join(BINS_DIR, \"droid-original-latest\");\n\n if (!existsSync(latestBackupPath)) {\n await copyFile(originalPath, latestBackupPath);\n console.log(styleText(\"green\", `[*] Created backup: ${latestBackupPath}`));\n } else {\n if (verbose) {\n console.log(styleText(\"gray\", ` Backup already exists: ${latestBackupPath}`));\n }\n }\n\n await copyFile(patchedBinaryPath, originalPath);\n await chmod(originalPath, 0o755);\n console.log(styleText(\"green\", `[*] Replaced: ${originalPath}`));\n\n if (process.platform === \"darwin\") {\n try {\n console.log(styleText(\"gray\", \"[*] Re-signing binary for macOS...\"));\n execSync(`codesign --force --deep --sign - \"${originalPath}\"`, {\n stdio: \"pipe\",\n });\n console.log(styleText(\"green\", \"[*] Binary re-signed successfully\"));\n } catch {\n console.log(styleText(\"yellow\", \"[!] Could not re-sign binary. You may need to run:\"));\n console.log(styleText(\"gray\", ` codesign --force --deep --sign - \"${originalPath}\"`));\n }\n\n try {\n execSync(`xattr -cr \"${originalPath}\"`, { stdio: \"pipe\" });\n } catch {\n // Ignore\n }\n }\n\n console.log();\n console.log(styleText(\"green\", \"─\".repeat(60)));\n console.log(styleText([\"green\", \"bold\"], \" REPLACEMENT COMPLETE\"));\n console.log(styleText(\"green\", \"─\".repeat(60)));\n console.log();\n console.log(styleText(\"white\", \"The patched binary is now active in all terminals.\"));\n console.log(styleText(\"white\", \"No need to restart or source anything!\"));\n console.log();\n console.log(styleText(\"gray\", `To restore the original, run:`));\n console.log(styleText(\"cyan\", ` npx droid-patch restore`));\n\n return {\n originalPath,\n backupPath: latestBackupPath,\n };\n}\n\n/**\n * Create alias for wrapper script\n * Unlike createAlias, this function creates symlink pointing to wrapper script\n * Used for features like websearch that require preprocessing\n */\nexport async function createAliasForWrapper(\n wrapperPath: string,\n aliasName: string,\n verbose = false,\n): Promise<CreateAliasResult> {\n ensureDirectories();\n\n console.log(styleText(\"white\", `[*] Creating alias: ${styleText(\"cyan\", aliasName)}`));\n\n const writablePathDir = findWritablePathDir();\n\n if (writablePathDir) {\n const targetPath = join(writablePathDir, aliasName);\n\n if (verbose) {\n console.log(styleText(\"gray\", ` Wrapper: ${wrapperPath}`));\n }\n\n if (existsSync(targetPath)) {\n await unlink(targetPath);\n if (verbose) {\n console.log(styleText(\"gray\", ` Removed existing: ${targetPath}`));\n }\n }\n\n await symlink(wrapperPath, targetPath);\n\n console.log(styleText(\"green\", `[*] Created: ${targetPath} -> ${wrapperPath}`));\n console.log();\n console.log(styleText(\"green\", \"─\".repeat(60)));\n console.log(styleText([\"green\", \"bold\"], \" ALIAS READY - NO ACTION REQUIRED!\"));\n console.log(styleText(\"green\", \"─\".repeat(60)));\n console.log();\n console.log(\n styleText(\n \"white\",\n `The alias \"${styleText([\"cyan\", \"bold\"], aliasName)}\" is now available in ALL terminals.`,\n ),\n );\n console.log(styleText(\"gray\", `(Installed to: ${writablePathDir})`));\n\n return {\n aliasPath: targetPath,\n binaryPath: wrapperPath,\n immediate: true,\n };\n }\n\n // Fallback: use ~/.droid-patch/aliases\n console.log(styleText(\"yellow\", \"[*] No writable PATH directory found, using fallback...\"));\n\n const symlinkPath = join(ALIASES_DIR, aliasName);\n\n if (existsSync(symlinkPath)) {\n await unlink(symlinkPath);\n if (verbose) {\n console.log(styleText(\"gray\", ` Removed existing symlink`));\n }\n }\n\n await symlink(wrapperPath, symlinkPath);\n\n console.log(styleText(\"green\", `[*] Created symlink: ${symlinkPath} -> ${wrapperPath}`));\n\n const shellConfig = getShellConfigPath();\n\n if (!checkPathInclusion()) {\n if (!isPathConfigured(shellConfig)) {\n console.log(styleText(\"white\", `[*] Configuring PATH in ${shellConfig}...`));\n\n if (addPathToShellConfig(shellConfig, verbose)) {\n console.log(styleText(\"green\", `[*] PATH configured successfully!`));\n console.log();\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log(styleText([\"yellow\", \"bold\"], \" ACTION REQUIRED\"));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log();\n console.log(styleText(\"white\", \"To use the alias in this terminal, run:\"));\n console.log();\n console.log(styleText(\"cyan\", ` source ${shellConfig}`));\n console.log();\n console.log(styleText(\"gray\", \"Or simply open a new terminal window.\"));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n } else {\n const exportLine = `export PATH=\"${ALIASES_DIR}:$PATH\"`;\n console.log();\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log(styleText([\"yellow\", \"bold\"], \" Manual PATH Configuration Required\"));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n console.log();\n console.log(styleText(\"white\", \"Add this line to your shell config:\"));\n console.log(styleText(\"cyan\", ` ${exportLine}`));\n console.log();\n console.log(styleText(\"gray\", `Shell config file: ${shellConfig}`));\n console.log(styleText(\"yellow\", \"─\".repeat(60)));\n }\n } else {\n console.log(styleText(\"green\", `[*] PATH already configured in ${shellConfig}`));\n console.log();\n console.log(\n styleText(\n \"yellow\",\n `Note: Run \\`source ${shellConfig}\\` or open a new terminal to use the alias.`,\n ),\n );\n }\n } else {\n console.log(styleText(\"green\", `[*] PATH already includes aliases directory`));\n console.log();\n console.log(\n styleText(\n \"green\",\n `You can now use \"${styleText([\"cyan\", \"bold\"], aliasName)}\" command directly!`,\n ),\n );\n }\n\n return {\n aliasPath: symlinkPath,\n binaryPath: wrapperPath,\n };\n}\n\nexport async function restoreOriginal(originalPath: string): Promise<void> {\n ensureDirectories();\n\n const latestBackupPath = join(BINS_DIR, \"droid-original-latest\");\n\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log(styleText([\"cyan\", \"bold\"], \" Restore Original Droid\"));\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log();\n\n if (!existsSync(latestBackupPath)) {\n const localBackup = `${originalPath}.backup`;\n if (existsSync(localBackup)) {\n console.log(styleText(\"white\", `[*] Found local backup: ${localBackup}`));\n console.log(styleText(\"white\", `[*] Restoring to: ${originalPath}`));\n\n await copyFile(localBackup, originalPath);\n await chmod(originalPath, 0o755);\n\n if (process.platform === \"darwin\") {\n try {\n execSync(`codesign --force --deep --sign - \"${originalPath}\"`, {\n stdio: \"pipe\",\n });\n execSync(`xattr -cr \"${originalPath}\"`, { stdio: \"pipe\" });\n } catch {\n // Ignore\n }\n }\n\n console.log();\n console.log(styleText(\"green\", \"═\".repeat(60)));\n console.log(styleText([\"green\", \"bold\"], \" RESTORE COMPLETE\"));\n console.log(styleText(\"green\", \"═\".repeat(60)));\n console.log();\n console.log(styleText(\"green\", \"Original droid binary has been restored from local backup.\"));\n return;\n }\n\n console.log(styleText(\"red\", \"[!] No backup found.\"));\n console.log(styleText(\"gray\", ` Checked: ${latestBackupPath}`));\n console.log(styleText(\"gray\", ` Checked: ${localBackup}`));\n console.log();\n console.log(styleText(\"gray\", \"If you have a manual backup, restore it with:\"));\n console.log(styleText(\"cyan\", ` cp /path/to/backup ${originalPath}`));\n return;\n }\n\n console.log(styleText(\"white\", `[*] Restoring from: ${latestBackupPath}`));\n console.log(styleText(\"white\", `[*] Restoring to: ${originalPath}`));\n\n const targetDir = dirname(originalPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n await copyFile(latestBackupPath, originalPath);\n await chmod(originalPath, 0o755);\n\n if (process.platform === \"darwin\") {\n try {\n execSync(`codesign --force --deep --sign - \"${originalPath}\"`, {\n stdio: \"pipe\",\n });\n execSync(`xattr -cr \"${originalPath}\"`, { stdio: \"pipe\" });\n } catch {\n // Ignore\n }\n }\n\n console.log();\n console.log(styleText(\"green\", \"═\".repeat(60)));\n console.log(styleText([\"green\", \"bold\"], \" RESTORE COMPLETE\"));\n console.log(styleText(\"green\", \"═\".repeat(60)));\n console.log();\n console.log(styleText(\"green\", \"Original droid binary has been restored.\"));\n console.log(styleText(\"green\", \"All terminals will now use the original version.\"));\n}\n\n/**\n * Filter options for removing aliases\n * Uses the same names as CLI options for consistency\n */\nexport type FilterFlag =\n | \"is-custom\"\n | \"skip-login\"\n | \"websearch\"\n | \"api-base\"\n | \"reasoning-effort\"\n | \"disable-telemetry\"\n | \"standalone\";\n\nexport interface RemoveFilterOptions {\n /** Remove aliases created by this droid-patch version */\n patchVersion?: string;\n /** Remove aliases for this droid version */\n droidVersion?: string;\n /** Remove aliases that have these flags enabled (all must match) */\n flags?: FilterFlag[];\n}\n\n/**\n * Remove aliases matching filter criteria\n */\nexport async function removeAliasesByFilter(filter: RemoveFilterOptions): Promise<void> {\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log(styleText([\"cyan\", \"bold\"], \" Remove Aliases by Filter\"));\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log();\n\n // Show filter criteria\n if (filter.patchVersion) {\n console.log(styleText(\"white\", ` Filter: droid-patch version = ${filter.patchVersion}`));\n }\n if (filter.droidVersion) {\n console.log(styleText(\"white\", ` Filter: droid version = ${filter.droidVersion}`));\n }\n if (filter.flags && filter.flags.length > 0) {\n console.log(styleText(\"white\", ` Filter: flags = ${filter.flags.join(\", \")}`));\n }\n console.log();\n\n // Collect all alias names\n const aliasNames = new Set<string>();\n\n // Check common PATH directories for symlinks\n for (const pathDir of COMMON_PATH_DIRS) {\n if (!existsSync(pathDir)) continue;\n\n try {\n const files = readdirSync(pathDir);\n for (const file of files) {\n const fullPath = join(pathDir, file);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(fullPath);\n if (\n target.includes(\".droid-patch/bins\") ||\n target.includes(\".droid-patch/websearch\") ||\n target.includes(\".droid-patch/proxy\") ||\n target.includes(\".droid-patch/statusline\")\n ) {\n aliasNames.add(file);\n }\n }\n } catch {\n // Ignore\n }\n }\n } catch {\n // Directory can't be read\n }\n }\n\n // Check aliases directory\n if (existsSync(ALIASES_DIR)) {\n try {\n const files = readdirSync(ALIASES_DIR);\n for (const file of files) {\n const fullPath = join(ALIASES_DIR, file);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n aliasNames.add(file);\n }\n } catch {\n // Ignore\n }\n }\n } catch {\n // Directory can't be read\n }\n }\n\n // Filter aliases by metadata\n const matchingAliases: string[] = [];\n\n for (const aliasName of aliasNames) {\n const meta = await loadAliasMetadata(aliasName);\n\n // If no metadata, skip (can't filter without metadata)\n if (!meta) {\n continue;\n }\n\n let matches = true;\n\n // Check droid-patch version\n if (filter.patchVersion && meta.droidPatchVersion !== filter.patchVersion) {\n matches = false;\n }\n\n // Check droid version\n if (filter.droidVersion && meta.droidVersion !== filter.droidVersion) {\n matches = false;\n }\n\n // Check flags (all specified flags must match)\n if (filter.flags && filter.flags.length > 0) {\n const patches = meta.patches;\n for (const flag of filter.flags) {\n switch (flag) {\n case \"is-custom\":\n if (!patches.isCustom) matches = false;\n break;\n case \"skip-login\":\n if (!patches.skipLogin) matches = false;\n break;\n case \"websearch\":\n if (!patches.websearch) matches = false;\n break;\n case \"reasoning-effort\":\n if (!patches.reasoningEffort) matches = false;\n break;\n case \"api-base\":\n if (!patches.apiBase) matches = false;\n break;\n case \"disable-telemetry\":\n if (!patches.noTelemetry) matches = false;\n break;\n case \"standalone\":\n if (!patches.standalone) matches = false;\n break;\n }\n if (!matches) break;\n }\n }\n\n if (matches) {\n matchingAliases.push(aliasName);\n }\n }\n\n if (matchingAliases.length === 0) {\n console.log(styleText(\"yellow\", \" No aliases match the filter criteria.\"));\n console.log();\n return;\n }\n\n console.log(styleText(\"white\", ` Found ${matchingAliases.length} matching alias(es):`));\n for (const name of matchingAliases) {\n console.log(styleText(\"gray\", ` • ${name}`));\n }\n console.log();\n\n // Remove each matching alias\n for (const aliasName of matchingAliases) {\n await removeAlias(aliasName);\n console.log();\n }\n\n console.log(styleText(\"green\", `[*] Removed ${matchingAliases.length} alias(es)`));\n}\n\n/**\n * Clear all droid-patch aliases and related files\n */\nexport async function clearAllAliases(): Promise<void> {\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log(styleText([\"cyan\", \"bold\"], \" Clearing All Droid-Patch Data\"));\n console.log(styleText(\"cyan\", \"═\".repeat(60)));\n console.log();\n\n // Collect all alias names\n const aliasNames = new Set<string>();\n\n // Check common PATH directories for symlinks\n for (const pathDir of COMMON_PATH_DIRS) {\n if (!existsSync(pathDir)) continue;\n\n try {\n const files = readdirSync(pathDir);\n for (const file of files) {\n const fullPath = join(pathDir, file);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(fullPath);\n if (\n target.includes(\".droid-patch/bins\") ||\n target.includes(\".droid-patch/websearch\") ||\n target.includes(\".droid-patch/proxy\") ||\n target.includes(\".droid-patch/statusline\")\n ) {\n aliasNames.add(file);\n }\n }\n } catch {\n // Ignore\n }\n }\n } catch {\n // Directory can't be read\n }\n }\n\n // Check aliases directory\n if (existsSync(ALIASES_DIR)) {\n try {\n const files = readdirSync(ALIASES_DIR);\n for (const file of files) {\n const fullPath = join(ALIASES_DIR, file);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n aliasNames.add(file);\n }\n } catch {\n // Ignore\n }\n }\n } catch {\n // Directory can't be read\n }\n }\n\n if (aliasNames.size === 0) {\n console.log(styleText(\"yellow\", \" No aliases found.\"));\n } else {\n console.log(styleText(\"white\", ` Found ${aliasNames.size} alias(es) to remove:`));\n for (const name of aliasNames) {\n console.log(styleText(\"gray\", ` • ${name}`));\n }\n console.log();\n\n // Remove each alias\n for (const aliasName of aliasNames) {\n await removeAlias(aliasName);\n console.log();\n }\n }\n\n // Clean up directories (including legacy files)\n console.log(styleText(\"white\", \" Cleaning up directories...\"));\n const dirsToClean = [\n join(DROID_PATCH_DIR, \"bins\"),\n join(DROID_PATCH_DIR, \"aliases\"),\n join(DROID_PATCH_DIR, \"proxy\"),\n join(DROID_PATCH_DIR, \"websearch\"),\n join(DROID_PATCH_DIR, \"statusline\"),\n ];\n\n for (const dir of dirsToClean) {\n if (existsSync(dir)) {\n try {\n const files = readdirSync(dir);\n for (const file of files) {\n const fullPath = join(dir, file);\n try {\n await unlink(fullPath);\n console.log(styleText(\"green\", ` Removed: ${fullPath}`));\n } catch {\n // Ignore\n }\n }\n } catch {\n // Ignore\n }\n }\n }\n\n // Clean up legacy temp files from old versions\n const legacyTempFiles = [\"/tmp/droid-search-proxy.pid\", \"/tmp/droid-search-proxy.log\"];\n\n for (const tempFile of legacyTempFiles) {\n if (existsSync(tempFile)) {\n try {\n await unlink(tempFile);\n console.log(styleText(\"green\", ` Removed legacy: ${tempFile}`));\n } catch {\n // Ignore\n }\n }\n }\n\n // Clean up temp port files (pattern: /tmp/droid-websearch-*.port)\n try {\n const tmpFiles = readdirSync(\"/tmp\");\n for (const file of tmpFiles) {\n if (file.startsWith(\"droid-websearch-\") && file.endsWith(\".port\")) {\n const fullPath = join(\"/tmp\", file);\n try {\n await unlink(fullPath);\n console.log(styleText(\"green\", ` Removed temp: ${fullPath}`));\n } catch {\n // Ignore\n }\n }\n // Also clean old droid-search-proxy-*.port files\n if (file.startsWith(\"droid-search-proxy-\") && file.endsWith(\".port\")) {\n const fullPath = join(\"/tmp\", file);\n try {\n await unlink(fullPath);\n console.log(styleText(\"green\", ` Removed legacy temp: ${fullPath}`));\n } catch {\n // Ignore\n }\n }\n }\n } catch {\n // Ignore\n }\n\n // Clean up metadata file\n const metadataFile = join(DROID_PATCH_DIR, \"metadata.json\");\n if (existsSync(metadataFile)) {\n try {\n await unlink(metadataFile);\n console.log(styleText(\"green\", ` Removed: ${metadataFile}`));\n } catch {\n // Ignore\n }\n }\n\n console.log();\n console.log(styleText(\"green\", \"[*] All droid-patch data cleared successfully\"));\n}\n"],"mappings":"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"}
|