saros-proxy 0.3.0 → 0.5.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 CHANGED
@@ -134,8 +134,6 @@ Install Saros Proxy for my opencode. (https://github.com/vitorvilaca3011/saros-p
134
134
  Follow the instructions on LLM_INSTRUCTIONS.md.
135
135
  ```
136
136
 
137
- Your AI will take it from there. For a more detailed reference your assistant can read: [`LLM_INSTRUCTIONS.md`](LLM_INSTRUCTIONS.md).
138
-
139
137
  ---
140
138
 
141
139
  ### Quick Install (npm)
@@ -386,12 +384,37 @@ npx tsx src/index.ts
386
384
  npx tsx src/index.ts --config /etc/saros/config.yaml
387
385
  ```
388
386
 
389
- ### Run as background service (Linux)
387
+ ### Run as background daemon (all platforms)
388
+
389
+ The proxy ships with a built-in daemon. Once installed globally (`npm install -g saros-proxy`):
390
390
 
391
391
  ```bash
392
- nohup npx tsx src/index.ts > proxy.log 2>&1 &
392
+ # Start the daemon (background)
393
+ saros-proxy start --port 3000
394
+
395
+ # Check status
396
+ saros-proxy status
397
+
398
+ # Stop it
399
+ saros-proxy stop
400
+
401
+ # Sync models from src/constants.ts to opencode.json
402
+ saros-proxy sync-models
393
403
  ```
394
404
 
405
+ The `start` command automatically syncs model definitions to `~/.config/opencode/opencode.json`.
406
+
407
+ **Daemon config path:** By default the daemon looks for `config.yaml` at:
408
+ - Linux/macOS: `~/.config/saros/config.yaml`
409
+ - Windows: `%LOCALAPPDATA%\saros\config.yaml`
410
+
411
+ Override with `--config`:
412
+ ```bash
413
+ saros-proxy start --port 3000 --config /path/to/config.yaml
414
+ ```
415
+
416
+ The PID file is stored at `~/.config/saros/daemon.pid`. The child process runs with `NODE_ENV=production` (JSON logging).
417
+
395
418
  ---
396
419
 
397
420
  ## OpenCode Integration
@@ -0,0 +1,10 @@
1
+ /**
2
+ * autostart.ts — Register/unregister the daemon to start on user login.
3
+ *
4
+ * Windows: creates a silent VBScript in the Startup folder
5
+ * macOS: creates a launchd agent plist (TODO)
6
+ * Linux: creates a systemd --user service (TODO)
7
+ */
8
+ export declare function autostartInstall(port?: number): void;
9
+ export declare function autostartUninstall(): void;
10
+ export declare function autostartStatus(): void;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * autostart.ts — Register/unregister the daemon to start on user login.
3
+ *
4
+ * Windows: creates a silent VBScript in the Startup folder
5
+ * macOS: creates a launchd agent plist (TODO)
6
+ * Linux: creates a systemd --user service (TODO)
7
+ */
8
+ import { existsSync, writeFileSync, rmSync, readFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { homedir } from 'node:os';
11
+ // ---------------------------------------------------------------------------
12
+ // Helpers
13
+ // ---------------------------------------------------------------------------
14
+ /** Windows Startup folder (%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup) */
15
+ function windowsStartupDir() {
16
+ const appData = process.env.APPDATA || join(homedir(), 'AppData', 'Roaming');
17
+ return join(appData, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
18
+ }
19
+ function vbsPath() {
20
+ return join(windowsStartupDir(), 'saros-proxy-daemon.vbs');
21
+ }
22
+ /**
23
+ * Resolve the saros-proxy command path.
24
+ * On Windows with a global install this is typically %APPDATA%\npm\saros-proxy.cmd.
25
+ * Falls back to the bare command name which works if the npm bin directory is on PATH.
26
+ */
27
+ function resolveCommand() {
28
+ // When running via `node dist/cli/autostart.js`, use the sibling dist/index.js
29
+ // so we don't depend on PATH resolution.
30
+ const viaDist = join(import.meta.dirname, '..', '..', 'dist', 'index.js');
31
+ if (existsSync(viaDist)) {
32
+ return `"${process.execPath}" "${viaDist}"`;
33
+ }
34
+ // Fallback: assume `saros-proxy` is on PATH
35
+ return 'saros-proxy';
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Public API
39
+ // ---------------------------------------------------------------------------
40
+ export function autostartInstall(port) {
41
+ const command = resolveCommand();
42
+ const portArg = port ? ` --port ${port}` : '';
43
+ const vbs = [
44
+ "' Saros proxy auto-start (generated by `saros-proxy autostart install`)",
45
+ 'Dim shell',
46
+ 'Set shell = CreateObject("WScript.Shell")',
47
+ `shell.Run "${command} start${portArg}", 0, False`,
48
+ 'Set shell = Nothing',
49
+ ].join('\n');
50
+ writeFileSync(vbsPath(), vbs, 'utf-8');
51
+ console.log(`Auto-start installed: ${vbsPath()}`);
52
+ }
53
+ export function autostartUninstall() {
54
+ const path = vbsPath();
55
+ if (!existsSync(path)) {
56
+ console.log('No auto-start entry found.');
57
+ return;
58
+ }
59
+ rmSync(path);
60
+ console.log(`Auto-start removed: ${path}`);
61
+ }
62
+ export function autostartStatus() {
63
+ const path = vbsPath();
64
+ if (existsSync(path)) {
65
+ const content = readFileSync(path, 'utf-8').trim();
66
+ const match = content.match(/start(--port (\d+))?/);
67
+ const portInfo = match?.[2] ? ` on port ${match[2]}` : '';
68
+ console.log(`Auto-start is enabled${portInfo}. File: ${path}`);
69
+ }
70
+ else {
71
+ console.log('Auto-start is not installed.');
72
+ }
73
+ }
74
+ //# sourceMappingURL=autostart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autostart.js","sourceRoot":"","sources":["../../src/cli/autostart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * daemon.ts — Start/stop the proxy as a background process.
3
+ *
4
+ * Usage:
5
+ * saros-proxy start [--port <port>] [--config <path>]
6
+ * saros-proxy stop
7
+ * saros-proxy status
8
+ *
9
+ * Daemon lifecycle:
10
+ * start → spawns detached `node dist/index.js` process, saves PID
11
+ * stop → kills the process (taskkill /T /F on Windows), removes PID file
12
+ * status → checks if the process is still alive
13
+ */
14
+ export declare function daemonStart(port?: number, configPath?: string): void;
15
+ export declare function daemonStop(): void;
16
+ export declare function daemonStatus(): void;
@@ -0,0 +1,188 @@
1
+ /**
2
+ * daemon.ts — Start/stop the proxy as a background process.
3
+ *
4
+ * Usage:
5
+ * saros-proxy start [--port <port>] [--config <path>]
6
+ * saros-proxy stop
7
+ * saros-proxy status
8
+ *
9
+ * Daemon lifecycle:
10
+ * start → spawns detached `node dist/index.js` process, saves PID
11
+ * stop → kills the process (taskkill /T /F on Windows), removes PID file
12
+ * status → checks if the process is still alive
13
+ */
14
+ import { spawn, execFileSync } from 'node:child_process';
15
+ import { existsSync, writeFileSync, readFileSync, rmSync, mkdirSync } from 'node:fs';
16
+ import { resolve as pathResolve, join as pathJoin } from 'node:path';
17
+ import { homedir } from 'node:os';
18
+ import { fileURLToPath } from 'node:url';
19
+ import { syncModelsToOpencodeConfig } from './opencode-config.js';
20
+ // ---------------------------------------------------------------------------
21
+ // Constants
22
+ // ---------------------------------------------------------------------------
23
+ const PID_DIR = pathJoin(homedir(), '.config', 'saros');
24
+ const PID_FILE = pathJoin(PID_DIR, 'daemon.pid');
25
+ const PACKAGE_ROOT = pathResolve(fileURLToPath(import.meta.url), '..', '..', '..');
26
+ const ENTRY_POINT = pathResolve(PACKAGE_ROOT, 'dist', 'index.js');
27
+ // ---------------------------------------------------------------------------
28
+ // PID file management
29
+ // ---------------------------------------------------------------------------
30
+ function ensurePidDir() {
31
+ if (!existsSync(PID_DIR)) {
32
+ mkdirSync(PID_DIR, { recursive: true });
33
+ }
34
+ }
35
+ function readPid() {
36
+ try {
37
+ return readFileSync(PID_FILE, 'utf-8').trim();
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ function writePid(pid) {
44
+ ensurePidDir();
45
+ writeFileSync(PID_FILE, String(pid), 'utf-8');
46
+ }
47
+ function deletePid() {
48
+ try {
49
+ rmSync(PID_FILE);
50
+ }
51
+ catch {
52
+ // ignore
53
+ }
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Process management
57
+ // ---------------------------------------------------------------------------
58
+ /** Check if a process is alive by PID. Cross-platform. */
59
+ function isProcessAlive(pid) {
60
+ try {
61
+ if (process.platform === 'win32') {
62
+ execFileSync('tasklist', ['/FI', `PID eq ${pid}`, '/NH'], {
63
+ windowsHide: true,
64
+ timeout: 5000,
65
+ stdio: 'pipe',
66
+ });
67
+ return true;
68
+ }
69
+ process.kill(pid, 0);
70
+ return true;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ /** Kill a process and all its children. Cross-platform. */
77
+ function killProcess(pid) {
78
+ if (process.platform === 'win32') {
79
+ try {
80
+ execFileSync('taskkill', ['/T', '/F', '/PID', String(pid)], {
81
+ windowsHide: true,
82
+ timeout: 10000,
83
+ });
84
+ }
85
+ catch {
86
+ // Process may already be dead — ignore
87
+ }
88
+ }
89
+ else {
90
+ try {
91
+ process.kill(pid, 'SIGKILL');
92
+ }
93
+ catch {
94
+ // Process may already be dead — ignore
95
+ }
96
+ }
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // Public API
100
+ // ---------------------------------------------------------------------------
101
+ export function daemonStart(port, configPath) {
102
+ ensurePidDir();
103
+ // Build args for the child process — pass through any overrides
104
+ const args = [ENTRY_POINT];
105
+ if (port)
106
+ args.push('--port', String(port));
107
+ if (configPath)
108
+ args.push('--config', configPath);
109
+ // Spawn detached child (no console window on Windows)
110
+ const child = spawn('node', args, {
111
+ cwd: PACKAGE_ROOT,
112
+ stdio: ['ignore', 'ignore', 'ignore'], // child logs to its own stderr via pino
113
+ detached: true,
114
+ windowsHide: true,
115
+ env: {
116
+ ...process.env,
117
+ NODE_ENV: 'production',
118
+ },
119
+ });
120
+ // Allow parent to exit independently while child continues
121
+ child.unref();
122
+ const pid = child.pid;
123
+ writePid(pid);
124
+ // Wait briefly then verify the process is alive
125
+ setTimeout(() => {
126
+ if (isProcessAlive(pid)) {
127
+ console.log(`Proxy started (PID ${pid}) on port ${port ?? 3000}`);
128
+ // Sync models to opencode.json — log warning on failure, don't block
129
+ const syncResult = syncModelsToOpencodeConfig();
130
+ if (syncResult.success) {
131
+ console.log(`Models synced to ${syncResult.path}`);
132
+ }
133
+ else {
134
+ console.warn(`Model sync skipped: ${syncResult.error}`);
135
+ }
136
+ process.exit(0);
137
+ }
138
+ else {
139
+ console.error('Proxy exited shortly after starting. Check your config.');
140
+ deletePid();
141
+ process.exit(1);
142
+ }
143
+ }, 2000);
144
+ }
145
+ export function daemonStop() {
146
+ const pid = readPid();
147
+ if (!pid) {
148
+ console.log('No running proxy daemon found.');
149
+ process.exit(0);
150
+ }
151
+ const pidNum = Number(pid);
152
+ if (!isProcessAlive(pidNum)) {
153
+ console.log(`Daemon process (PID ${pid}) is not running. Cleaning up PID file.`);
154
+ deletePid();
155
+ process.exit(0);
156
+ }
157
+ killProcess(pidNum);
158
+ deletePid();
159
+ // Wait a moment to confirm it's gone
160
+ setTimeout(() => {
161
+ if (isProcessAlive(pidNum)) {
162
+ console.error(`Failed to stop daemon (PID ${pid}). Try: taskkill /F /PID ${pid}`);
163
+ process.exit(1);
164
+ }
165
+ else {
166
+ console.log(`Proxy (PID ${pid}) stopped.`);
167
+ process.exit(0);
168
+ }
169
+ }, 1000);
170
+ }
171
+ export function daemonStatus() {
172
+ const pid = readPid();
173
+ if (!pid) {
174
+ console.log('Daemon is not running.');
175
+ process.exit(0);
176
+ }
177
+ const pidNum = Number(pid);
178
+ if (isProcessAlive(pidNum)) {
179
+ console.log(`Proxy is running (PID ${pid}).`);
180
+ process.exit(0);
181
+ }
182
+ else {
183
+ console.log(`Stale PID file (PID ${pid} is gone). Cleaning up.`);
184
+ deletePid();
185
+ process.exit(1);
186
+ }
187
+ }
188
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,16 @@ export interface OpencodeConfigResult {
22
22
  export declare function updateOpencodeConfig(port: number, options?: {
23
23
  configPath?: string;
24
24
  }): OpencodeConfigResult;
25
+ /**
26
+ * Sync models from OPENCODE_MODELS into an existing opencode.json.
27
+ * Only replaces the `saros-proxy.models` field — preserves everything else.
28
+ *
29
+ * @param options.configPath — Explicit path to opencode.json (optional, for testing)
30
+ * @returns Result object with success status and path
31
+ */
32
+ export declare function syncModelsToOpencodeConfig(options?: {
33
+ configPath?: string;
34
+ }): OpencodeConfigResult;
25
35
  /**
26
36
  * Generate a manual configuration snippet that users can paste.
27
37
  */
@@ -104,6 +104,59 @@ export function updateOpencodeConfig(port, options = {}) {
104
104
  // ---------------------------------------------------------------------------
105
105
  // Manual config snippet (for users who decline automatic setup)
106
106
  // ---------------------------------------------------------------------------
107
+ /**
108
+ * Sync models from OPENCODE_MODELS into an existing opencode.json.
109
+ * Only replaces the `saros-proxy.models` field — preserves everything else.
110
+ *
111
+ * @param options.configPath — Explicit path to opencode.json (optional, for testing)
112
+ * @returns Result object with success status and path
113
+ */
114
+ export function syncModelsToOpencodeConfig(options = {}) {
115
+ const configPath = options.configPath ?? getDefaultOpencodeConfigPath();
116
+ if (!existsSync(configPath)) {
117
+ return { success: false, error: 'opencode.json not found at ' + configPath };
118
+ }
119
+ try {
120
+ const raw = readFileSync(configPath, 'utf-8');
121
+ const config = JSON.parse(raw);
122
+ const provider = config.provider;
123
+ if (!provider) {
124
+ return { success: false, error: 'Config has no "provider" section' };
125
+ }
126
+ const sarosProvider = provider['saros-proxy'];
127
+ if (!sarosProvider || typeof sarosProvider !== 'object' || Array.isArray(sarosProvider)) {
128
+ return { success: false, error: 'saros-proxy provider config is missing or malformed' };
129
+ }
130
+ // Backup before modifying
131
+ const backupPath = `${configPath}.backup`;
132
+ copyFileSync(configPath, backupPath);
133
+ // Only replace models — preserve everything else
134
+ sarosProvider.models = OPENCODE_MODELS;
135
+ // Write
136
+ const json = JSON.stringify(config, null, 2);
137
+ writeFileSync(configPath, json, 'utf-8');
138
+ // Validate: re-read to ensure we didn't corrupt it
139
+ try {
140
+ const verifyRaw = readFileSync(configPath, 'utf-8');
141
+ JSON.parse(verifyRaw);
142
+ }
143
+ catch {
144
+ if (existsSync(backupPath)) {
145
+ copyFileSync(backupPath, configPath);
146
+ }
147
+ return {
148
+ success: false,
149
+ path: configPath,
150
+ error: 'Failed to write valid JSON after sync. Restored from backup.',
151
+ };
152
+ }
153
+ return { success: true, path: configPath };
154
+ }
155
+ catch (err) {
156
+ const message = err instanceof Error ? err.message : String(err);
157
+ return { success: false, path: configPath, error: message };
158
+ }
159
+ }
107
160
  /**
108
161
  * Generate a manual configuration snippet that users can paste.
109
162
  */
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/cli/opencode-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,sEAAsE;AACtE,MAAM,UAAU,4BAA4B;IAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC5D,CAAC;AAaD,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,4BAA4B,EAAE,CAAC;IAExE,IAAI,CAAC;QACH,IAAI,MAA+B,CAAC;QACpC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,iCAAiC;YACjC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,uEAAuE;iBAC/E,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,UAAU,GAAG,GAAG,UAAU,SAAS,CAAC;YAC1C,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,MAAM,GAAG,EAAE,CAAC;YACZ,OAAO,GAAG,IAAI,CAAC;YAEf,kCAAkC;YAClC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,cAAc,GAAG;YACrB,GAAG,EAAE,2BAA2B;YAChC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE;gBACP,OAAO,EAAE,oBAAoB,IAAI,YAAY;gBAC7C,MAAM,EAAE,UAAU;aACnB;YACD,MAAM,EAAE,eAAe;SACxB,CAAC;QAEF,6BAA6B;QAC7B,MAAM,gBAAgB,GAAI,MAAM,CAAC,QAAgD,IAAI,EAAE,CAAC;QACxF,MAAM,CAAC,QAAQ,GAAG;YAChB,GAAG,gBAAgB;YACnB,aAAa,EAAE,cAAc;SAC9B,CAAC;QAEF,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,6DAA6D;QAC7D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;YACnC,MAAM,UAAU,GAAG,GAAG,UAAU,SAAS,CAAC;YAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACvC,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,iEAAiE;aACzE,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,MAAM,cAAc,GAAG;QACrB,GAAG,EAAE,2BAA2B;QAC9B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE;YACP,OAAO,EAAE,oBAAoB,IAAI,YAAY;YAC7C,MAAM,EAAE,UAAU;SACnB;QACD,MAAM,EAAE,eAAe;KACxB,CAAC;IAEJ,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,QAAQ,EAAE;YACR,aAAa,EAAE,cAAc;SAC9B;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/cli/opencode-config.ts"],"names":[],"mappings":"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"}
package/dist/constants.js CHANGED
@@ -25,137 +25,162 @@ export const WORKSPACE_ID_REGEX = /^wrk_[A-Za-z0-9]+$/;
25
25
  // OpenCode client model definitions for proxy provider configuration
26
26
  // Source: https://opencode.ai/zen/go/v1/models (18 models as of 2026-06-06)
27
27
  export const OPENCODE_MODELS = {
28
- // GLM series (~200K context)
28
+ // GLM series (Z.AI/Zhipu - 202K context, 32K output, text-only)
29
+ // Blocklisted in OpenCode — no auto variants; reasoning via interleaved reasoning_content only
29
30
  'glm-5': {
30
31
  id: 'glm-5',
31
32
  name: 'GLM-5',
32
33
  tool_call: true,
33
- limit: { context: 200000, output: 8192 },
34
- modalities: { input: ['text', 'image'], output: ['text'] },
34
+ reasoning: true,
35
+ limit: { context: 202752, output: 32768 },
36
+ modalities: { input: ['text'], output: ['text'] },
35
37
  },
36
38
  'glm-5.1': {
37
39
  id: 'glm-5.1',
38
40
  name: 'GLM-5.1',
39
41
  tool_call: true,
40
- limit: { context: 200000, output: 8192 },
41
- modalities: { input: ['text', 'image'], output: ['text'] },
42
+ reasoning: true,
43
+ limit: { context: 202752, output: 32768 },
44
+ modalities: { input: ['text'], output: ['text'] },
42
45
  },
43
- // Kimi series (~256K context)
46
+ // Kimi series (Moonshot - 262K context, 65K output, multimodal)
47
+ // Blocklisted in OpenCode — no reasoning_effort support via opencode-go
44
48
  'kimi-k2.5': {
45
49
  id: 'kimi-k2.5',
46
50
  name: 'Kimi K2.5',
47
51
  tool_call: true,
48
- limit: { context: 256000, output: 8192 },
49
- modalities: { input: ['text', 'image'], output: ['text'] },
52
+ reasoning: true,
53
+ limit: { context: 262144, output: 65536 },
54
+ modalities: { input: ['text', 'image', 'video'], output: ['text'] },
50
55
  },
51
56
  'kimi-k2.6': {
52
57
  id: 'kimi-k2.6',
53
58
  name: 'Kimi K2.6',
54
59
  tool_call: true,
55
- limit: { context: 256000, output: 8192 },
56
- modalities: { input: ['text', 'image'], output: ['text'] },
60
+ reasoning: true,
61
+ limit: { context: 262144, output: 65536 },
62
+ modalities: { input: ['text', 'image', 'video'], output: ['text'] },
57
63
  },
58
- // DeepSeek V4 series
64
+ // DeepSeek V4 series (1M context, 384K output, text-only)
65
+ // NOT blocklisted - OpenCode auto-generates low/medium/high/max variants
59
66
  'deepseek-v4-pro': {
60
67
  id: 'deepseek-v4-pro',
61
68
  name: 'DeepSeek V4 Pro',
62
69
  tool_call: true,
63
- limit: { context: 128000, output: 8192 },
64
- modalities: { input: ['text', 'image'], output: ['text'] },
70
+ reasoning: true,
71
+ limit: { context: 1000000, output: 384000 },
72
+ modalities: { input: ['text'], output: ['text'] },
65
73
  },
66
74
  'deepseek-v4-flash': {
67
75
  id: 'deepseek-v4-flash',
68
76
  name: 'DeepSeek V4 Flash',
69
77
  tool_call: true,
70
- limit: { context: 128000, output: 8192 },
71
- modalities: { input: ['text', 'image'], output: ['text'] },
78
+ reasoning: true,
79
+ limit: { context: 1000000, output: 384000 },
80
+ modalities: { input: ['text'], output: ['text'] },
72
81
  },
73
- // MiMo series (200K context for v2)
82
+ // MiMo series (Xiaomi - 1M context except V2 Omni 262K)
83
+ // NOT blocklisted - OpenCode auto-generates low/medium/high variants (reasoning_effort supported)
74
84
  'mimo-v2.5': {
75
85
  id: 'mimo-v2.5',
76
86
  name: 'MiMo V2.5',
77
87
  tool_call: true,
78
- limit: { context: 128000, output: 8192 },
79
- modalities: { input: ['text', 'image'], output: ['text'] },
88
+ reasoning: true,
89
+ limit: { context: 1000000, output: 128000 },
90
+ modalities: { input: ['text', 'image', 'audio', 'video'], output: ['text'] },
80
91
  },
81
92
  'mimo-v2.5-pro': {
82
93
  id: 'mimo-v2.5-pro',
83
94
  name: 'MiMo V2.5 Pro',
84
95
  tool_call: true,
85
- limit: { context: 128000, output: 8192 },
86
- modalities: { input: ['text', 'image'], output: ['text'] },
96
+ reasoning: true,
97
+ limit: { context: 1048576, output: 128000 },
98
+ modalities: { input: ['text'], output: ['text'] },
87
99
  },
88
100
  'mimo-v2-pro': {
89
101
  id: 'mimo-v2-pro',
90
102
  name: 'MiMo V2 Pro',
91
103
  tool_call: true,
92
- limit: { context: 200000, output: 8192 },
93
- modalities: { input: ['text', 'image'], output: ['text'] },
104
+ reasoning: true,
105
+ limit: { context: 1048576, output: 128000 },
106
+ modalities: { input: ['text'], output: ['text'] },
94
107
  },
95
108
  'mimo-v2-omni': {
96
109
  id: 'mimo-v2-omni',
97
110
  name: 'MiMo V2 Omni',
98
111
  tool_call: true,
99
- limit: { context: 200000, output: 8192 },
100
- modalities: { input: ['text', 'image'], output: ['text'] },
112
+ reasoning: true,
113
+ limit: { context: 262144, output: 128000 },
114
+ modalities: { input: ['text', 'image', 'audio', 'pdf'], output: ['text'] },
101
115
  },
102
- // MiniMax series (Anthropic-compatible API)
116
+ // MiniMax series (Anthropic-compatible - 512K context for M3, 204K for M2.x)
117
+ // Blocklisted in OpenCode — no auto variants; uses Anthropic thinking blocks, not reasoning_effort
103
118
  'minimax-m3': {
104
119
  id: 'minimax-m3',
105
120
  name: 'MiniMax M3',
106
121
  tool_call: true,
107
- limit: { context: 128000, output: 8192 },
108
- modalities: { input: ['text', 'image'], output: ['text'] },
122
+ reasoning: true,
123
+ limit: { context: 512000, output: 131072 },
124
+ modalities: { input: ['text', 'image', 'video'], output: ['text'] },
109
125
  },
110
126
  'minimax-m2.7': {
111
127
  id: 'minimax-m2.7',
112
128
  name: 'MiniMax M2.7',
113
129
  tool_call: true,
114
- limit: { context: 128000, output: 8192 },
115
- modalities: { input: ['text', 'image'], output: ['text'] },
130
+ reasoning: true,
131
+ limit: { context: 204800, output: 131072 },
132
+ modalities: { input: ['text'], output: ['text'] },
116
133
  },
117
134
  'minimax-m2.5': {
118
135
  id: 'minimax-m2.5',
119
136
  name: 'MiniMax M2.5',
120
137
  tool_call: true,
121
- limit: { context: 128000, output: 8192 },
122
- modalities: { input: ['text', 'image'], output: ['text'] },
138
+ reasoning: true,
139
+ limit: { context: 204800, output: 65536 },
140
+ modalities: { input: ['text'], output: ['text'] },
123
141
  },
124
- // Qwen series (1M context for 3.6/3.5 Plus)
142
+ // Qwen series (Alibaba - Anthropic-compatible, 1M context except 3.5 Plus 262K)
143
+ // Blocklisted in OpenCode — no auto variants; uses Anthropic thinking blocks, not reasoning_effort
125
144
  'qwen3.7-max': {
126
145
  id: 'qwen3.7-max',
127
146
  name: 'Qwen 3.7 Max',
128
147
  tool_call: true,
129
- limit: { context: 256000, output: 8192 },
130
- modalities: { input: ['text', 'image'], output: ['text'] },
148
+ reasoning: true,
149
+ limit: { context: 1000000, output: 65536 },
150
+ modalities: { input: ['text'], output: ['text'] },
131
151
  },
132
152
  'qwen3.7-plus': {
133
153
  id: 'qwen3.7-plus',
134
154
  name: 'Qwen 3.7 Plus',
135
155
  tool_call: true,
136
- limit: { context: 256000, output: 8192 },
137
- modalities: { input: ['text', 'image'], output: ['text'] },
156
+ reasoning: true,
157
+ limit: { context: 1000000, output: 65536 },
158
+ modalities: { input: ['text', 'image', 'video'], output: ['text'] },
138
159
  },
139
160
  'qwen3.6-plus': {
140
161
  id: 'qwen3.6-plus',
141
162
  name: 'Qwen 3.6 Plus',
142
163
  tool_call: true,
164
+ reasoning: true,
143
165
  limit: { context: 1000000, output: 65536 },
144
- modalities: { input: ['text', 'image'], output: ['text'] },
166
+ modalities: { input: ['text', 'image', 'video'], output: ['text'] },
145
167
  },
146
168
  'qwen3.5-plus': {
147
169
  id: 'qwen3.5-plus',
148
170
  name: 'Qwen 3.5 Plus',
149
171
  tool_call: true,
150
- limit: { context: 1000000, output: 65536 },
151
- modalities: { input: ['text', 'image'], output: ['text'] },
172
+ reasoning: true,
173
+ limit: { context: 262144, output: 65536 },
174
+ modalities: { input: ['text', 'image', 'video'], output: ['text'] },
152
175
  },
153
- // HY3 Preview
176
+ // HY3 Preview (Tencent - 256K context, 64K output, text-only)
177
+ // NOT blocklisted - OpenCode auto-generates low/medium/high variants (reasoning_effort supported)
154
178
  'hy3-preview': {
155
179
  id: 'hy3-preview',
156
180
  name: 'HY3 Preview',
157
- tool_call: false,
158
- limit: { context: 128000, output: 8192 },
181
+ tool_call: true,
182
+ reasoning: true,
183
+ limit: { context: 256000, output: 64000 },
159
184
  modalities: { input: ['text'], output: ['text'] },
160
185
  },
161
186
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,87 +15,140 @@ import { createProxyApp } from './proxy.js';
15
15
  import { logger, maskKey } from './logger.js';
16
16
  import { startScraper, stopScraper } from './scraper.js';
17
17
  import { FORCE_SHUTDOWN_TIMEOUT_MS } from './constants.js';
18
+ import { daemonStart, daemonStop, daemonStatus } from './cli/daemon.js';
19
+ import { syncModelsToOpencodeConfig } from './cli/opencode-config.js';
20
+ import { autostartInstall, autostartUninstall, autostartStatus } from './cli/autostart.js';
18
21
  // ---------------------------------------------------------------------------
19
- // Subcommand: 'setup'delegate to the interactive setup wizard
22
+ // Subcommand dispatchif/else if prevents fallthrough to server code
20
23
  // ---------------------------------------------------------------------------
21
- if (process.argv[2] === 'setup') {
24
+ const subcommand = process.argv[2];
25
+ if (subcommand === 'start') {
26
+ const args = process.argv.slice(3);
27
+ let port;
28
+ let configPath;
29
+ for (let i = 0; i < args.length; i++) {
30
+ if (args[i] === '--port' && args[i + 1]) {
31
+ port = Number(args[++i]);
32
+ }
33
+ else if (args[i] === '--config' && args[i + 1]) {
34
+ configPath = args[++i];
35
+ }
36
+ }
37
+ daemonStart(port, configPath);
38
+ // daemonStart owns its own exit path via setTimeout
39
+ }
40
+ else if (subcommand === 'stop') {
41
+ daemonStop();
42
+ }
43
+ else if (subcommand === 'status') {
44
+ daemonStatus();
45
+ }
46
+ else if (subcommand === 'sync-models') {
47
+ const result = syncModelsToOpencodeConfig();
48
+ if (result.success) {
49
+ console.log(`Models synced to ${result.path}`);
50
+ process.exit(0);
51
+ }
52
+ else {
53
+ console.error(`Failed: ${result.error}`);
54
+ process.exit(1);
55
+ }
56
+ }
57
+ else if (process.argv[2] === 'setup') {
22
58
  const { setup } = await import('./cli/setup.js');
23
59
  const { getDefaultConfigPath } = await import('./config.js');
24
60
  await setup(dirname(getDefaultConfigPath()));
25
61
  process.exit(0);
26
62
  }
27
- // ---------------------------------------------------------------------------
28
- // Configuration
29
- // ---------------------------------------------------------------------------
30
- let config;
31
- try {
32
- config = loadConfig();
33
- }
34
- catch (err) {
35
- logger.error({ err }, 'Failed to load configuration');
36
- process.exit(1);
37
- }
38
- logger.info('Loaded %d API key(s):', config.keys.length);
39
- for (const k of config.keys) {
40
- logger.info(' - %s: %s', k.label, maskKey(k.key));
41
- }
42
- // ---------------------------------------------------------------------------
43
- // Security startup banner
44
- // ---------------------------------------------------------------------------
45
- function logSecurityWarnings(cfg) {
46
- // Not binding to localhost — warn about exposure
47
- if (cfg.host !== '127.0.0.1' && cfg.host !== 'localhost') {
48
- logger.warn('Proxy binding to "%s" — not localhost. Ensure firewall rules are set.', cfg.host);
63
+ else if (subcommand === 'autostart') {
64
+ const action = process.argv[3];
65
+ if (action === 'install') {
66
+ const args = process.argv.slice(4);
67
+ let port;
68
+ for (let i = 0; i < args.length; i++) {
69
+ if (args[i] === '--port' && args[i + 1]) {
70
+ port = Number(args[++i]);
71
+ }
72
+ }
73
+ autostartInstall(port);
74
+ process.exit(0);
49
75
  }
50
- // Unusually long request timeout
51
- if (cfg.requestTimeoutMs > 60_000) {
52
- logger.warn('Request timeout is %dms (>60s) — may cause resource exhaustion', cfg.requestTimeoutMs);
76
+ else if (action === 'uninstall') {
77
+ autostartUninstall();
78
+ process.exit(0);
53
79
  }
54
- // CORS allowing all origins (empty allowedOrigins means all are allowed)
55
- if (cfg.allowedOrigins.length === 0) {
56
- logger.warn('CORS allows all origins — restrict in production');
80
+ else {
81
+ autostartStatus();
82
+ process.exit(0);
57
83
  }
58
- logger.info('Security: %d API keys loaded (all masked in logs)', cfg.keys.length);
59
84
  }
60
- logSecurityWarnings(config);
61
- // ---------------------------------------------------------------------------
62
- // Server
63
- // ---------------------------------------------------------------------------
64
- const app = createProxyApp(config);
65
- const server = serve({ fetch: app.fetch, port: config.port, hostname: config.host }, (info) => {
66
- logger.info('Proxy listening on http://%s:%d', info.address, info.port);
67
- logger.info('Upstream: %s', config.upstreamBaseUrl);
68
- logger.info('API keys loaded: %d', config.keys.length);
69
- // Start usage-based scraper if configured
70
- if (config.scraping?.enabled && config.scraping.accounts.length > 0) {
71
- startScraper(config.scraping.accounts, config.scraping.intervalMs);
85
+ else {
86
+ // -----------------------------------------------------------------------
87
+ // No subcommand — start proxy in foreground (original behavior)
88
+ // -----------------------------------------------------------------------
89
+ let config;
90
+ try {
91
+ config = loadConfig();
72
92
  }
73
- else {
74
- logger.info('Usage-based scraping disabled (not configured or no accounts)');
93
+ catch (err) {
94
+ logger.error({ err }, 'Failed to load configuration');
95
+ process.exit(1);
75
96
  }
76
- });
77
- // ---------------------------------------------------------------------------
78
- // Graceful shutdown
79
- // ---------------------------------------------------------------------------
80
- let isShuttingDown = false;
81
- function gracefulShutdown(signal) {
82
- if (isShuttingDown)
83
- return;
84
- isShuttingDown = true;
85
- logger.info('Received %s, starting graceful shutdown...', signal);
86
- // Stop background scraper
87
- stopScraper();
88
- // Stop accepting new connections
89
- server.close(() => {
90
- logger.info('Server closed');
91
- process.exit(0);
97
+ logger.info('Loaded %d API key(s):', config.keys.length);
98
+ for (const k of config.keys) {
99
+ logger.info(' - %s: %s', k.label, maskKey(k.key));
100
+ }
101
+ // -----------------------------------------------------------------------
102
+ // Security startup banner
103
+ // -----------------------------------------------------------------------
104
+ function logSecurityWarnings(cfg) {
105
+ if (cfg.host !== '127.0.0.1' && cfg.host !== 'localhost') {
106
+ logger.warn('Proxy binding to "%s" not localhost. Ensure firewall rules are set.', cfg.host);
107
+ }
108
+ if (cfg.requestTimeoutMs > 60_000) {
109
+ logger.warn('Request timeout is %dms (>60s) — may cause resource exhaustion', cfg.requestTimeoutMs);
110
+ }
111
+ if (cfg.allowedOrigins.length === 0) {
112
+ logger.warn('CORS allows all origins — restrict in production');
113
+ }
114
+ logger.info('Security: %d API keys loaded (all masked in logs)', cfg.keys.length);
115
+ }
116
+ logSecurityWarnings(config);
117
+ // -----------------------------------------------------------------------
118
+ // Server
119
+ // -----------------------------------------------------------------------
120
+ const app = createProxyApp(config);
121
+ const server = serve({ fetch: app.fetch, port: config.port, hostname: config.host }, (info) => {
122
+ logger.info('Proxy listening on http://%s:%d', info.address, info.port);
123
+ logger.info('Upstream: %s', config.upstreamBaseUrl);
124
+ logger.info('API keys loaded: %d', config.keys.length);
125
+ if (config.scraping?.enabled && config.scraping.accounts.length > 0) {
126
+ startScraper(config.scraping.accounts, config.scraping.intervalMs);
127
+ }
128
+ else {
129
+ logger.info('Usage-based scraping disabled (not configured or no accounts)');
130
+ }
92
131
  });
93
- // Force exit after forced shutdown timeout
94
- setTimeout(() => {
95
- logger.error('Forced shutdown after timeout');
96
- process.exit(1);
97
- }, FORCE_SHUTDOWN_TIMEOUT_MS);
132
+ // -----------------------------------------------------------------------
133
+ // Graceful shutdown
134
+ // -----------------------------------------------------------------------
135
+ let isShuttingDown = false;
136
+ function gracefulShutdown(signal) {
137
+ if (isShuttingDown)
138
+ return;
139
+ isShuttingDown = true;
140
+ logger.info('Received %s, starting graceful shutdown...', signal);
141
+ stopScraper();
142
+ server.close(() => {
143
+ logger.info('Server closed');
144
+ process.exit(0);
145
+ });
146
+ setTimeout(() => {
147
+ logger.error('Forced shutdown after timeout');
148
+ process.exit(1);
149
+ }, FORCE_SHUTDOWN_TIMEOUT_MS);
150
+ }
151
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
152
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
98
153
  }
99
- process.on('SIGINT', () => gracefulShutdown('SIGINT'));
100
- process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
101
154
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/logger.js CHANGED
@@ -20,16 +20,31 @@ export function maskKey(key) {
20
20
  return key.slice(0, 4) + '****';
21
21
  return key.slice(0, 4) + '...' + key.slice(-4);
22
22
  }
23
- const isDev = process.env.NODE_ENV !== 'production';
24
- export const logger = pino({
25
- level: process.env.LOG_LEVEL || 'info',
26
- ...(isDev
27
- ? {
28
- transport: {
29
- target: 'pino-pretty',
30
- options: { colorize: true },
31
- },
32
- }
33
- : {}),
34
- });
23
+ function createLogger() {
24
+ const isDev = process.env.NODE_ENV !== 'production';
25
+ return pino({
26
+ level: process.env.LOG_LEVEL || 'info',
27
+ ...(isDev
28
+ ? {
29
+ transport: tryTransport('pino-pretty', { colorize: true }),
30
+ }
31
+ : {}),
32
+ });
33
+ }
34
+ /**
35
+ * Try to load a pino transport; return undefined if the target package
36
+ * is not available. This lets the CLI work from a `npm install -g` that
37
+ * only ships production dependencies.
38
+ */
39
+ function tryTransport(target, options) {
40
+ try {
41
+ // pino.transport throws at runtime if the target package is missing
42
+ pino.transport({ target, options });
43
+ return { target, options };
44
+ }
45
+ catch {
46
+ return undefined; // fall back to JSON logging
47
+ }
48
+ }
49
+ export const logger = createLogger();
35
50
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtE,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,CAAC,yCAAyC;IAEpE,sCAAsC;IACtC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACtD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,GAAG,CAAC,KAAK;QACP,CAAC,CAAC;YACE,SAAS,EAAE;gBACT,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC5B;SACF;QACH,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtE,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,CAAC,yCAAyC;IAEpE,sCAAsC;IACtC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACtD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAEpD,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,GAAG,CAAC,KAAK;YACP,CAAC,CAAC;gBACE,SAAS,EAAE,YAAY,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aAC3D;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,MAAc,EACd,OAAgC;IAEhC,IAAI,CAAC;QACH,oEAAoE;QACpE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,CAAC,4BAA4B;IAChD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "saros-proxy",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Saros — predictive multi-account proxy for the OpenCode-Go API. Cycles between accounts before they exhaust.",
5
5
  "type": "module",
6
6
  "bin": {