@tekmidian/pai 0.66.48 → 0.66.49
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/dist/auto-route-CMARQbQ4.mjs +8 -0
- package/dist/{auto-route-DrncbMaz.mjs → auto-route-Dpm6nZ6X.mjs} +2 -2
- package/dist/{auto-route-DrncbMaz.mjs.map → auto-route-Dpm6nZ6X.mjs.map} +1 -1
- package/dist/{chain-Bba4Y8A8.mjs → chain-xSc3-u0X.mjs} +5 -5
- package/dist/{chain-Bba4Y8A8.mjs.map → chain-xSc3-u0X.mjs.map} +1 -1
- package/dist/cli/index.mjs +14 -14
- package/dist/cli/program.mjs +14 -14
- package/dist/{config-2pR0RqHM.mjs → config-CYjjGSWq.mjs} +41 -4
- package/dist/config-CYjjGSWq.mjs.map +1 -0
- package/dist/config-IuOG1W92.mjs +4 -0
- package/dist/daemon/index.mjs +10 -10
- package/dist/{daemon-C25MKGD8.mjs → daemon-BIG7XcqE.mjs} +10 -10
- package/dist/{daemon-C6K3kikA.mjs → daemon-CiSmbylJ.mjs} +7 -7
- package/dist/{daemon-C6K3kikA.mjs.map → daemon-CiSmbylJ.mjs.map} +1 -1
- package/dist/daemon-mcp/index.mjs +8 -8
- package/dist/{fallback-DyhAZAOe.mjs → fallback-BgAukP8r.mjs} +6 -5
- package/dist/fallback-BgAukP8r.mjs.map +1 -0
- package/dist/hooks/block-sleep-poll.mjs.map +2 -2
- package/dist/hooks/load-project-context.mjs +26 -2
- package/dist/hooks/load-project-context.mjs.map +2 -2
- package/dist/hooks/route-agents-to-worker.mjs +26 -2
- package/dist/hooks/route-agents-to-worker.mjs.map +2 -2
- package/dist/hooks/security-validator.mjs +26 -2
- package/dist/hooks/security-validator.mjs.map +2 -2
- package/dist/hooks/worker-guard.mjs +26 -2
- package/dist/hooks/worker-guard.mjs.map +2 -2
- package/dist/hooks/worker-pool-host.mjs +242 -14
- package/dist/hooks/worker-pool-host.mjs.map +4 -4
- package/dist/hooks/worker-proxy.mjs +26 -2
- package/dist/hooks/worker-proxy.mjs.map +2 -2
- package/dist/hooks/worker-status-line.mjs +26 -2
- package/dist/hooks/worker-status-line.mjs.map +2 -2
- package/dist/hooks/worker-supervision.mjs +26 -2
- package/dist/hooks/worker-supervision.mjs.map +2 -2
- package/dist/index.mjs +4 -4
- package/dist/{local-EmOjw5jq.mjs → local-Bt-7L0oB.mjs} +3 -3
- package/dist/{local-EmOjw5jq.mjs.map → local-Bt-7L0oB.mjs.map} +1 -1
- package/dist/local-oqPQEmhb.mjs +7 -0
- package/dist/{local-tiers-BIINbhkY.mjs → local-tiers-C0QSQcP1.mjs} +2 -2
- package/dist/{local-tiers-8fmjiySw.mjs → local-tiers-_ZOTbjeP.mjs} +2 -2
- package/dist/{local-tiers-8fmjiySw.mjs.map → local-tiers-_ZOTbjeP.mjs.map} +1 -1
- package/dist/{main-resolver-DBXvnYKp.mjs → main-resolver-BwjexuSA.mjs} +3 -3
- package/dist/{main-resolver-B10-lsU0.mjs → main-resolver-CVo0ab7j.mjs} +3 -3
- package/dist/{main-resolver-B10-lsU0.mjs.map → main-resolver-CVo0ab7j.mjs.map} +1 -1
- package/dist/{pai-marker-CDwQOpQ8.mjs → pai-marker-CJ6WMt05.mjs} +4 -4
- package/dist/{pai-marker-CDwQOpQ8.mjs.map → pai-marker-CJ6WMt05.mjs.map} +1 -1
- package/dist/{planner-dO-3PLjD.mjs → planner-ZKXZf9JS.mjs} +8 -8
- package/dist/{planner-dO-3PLjD.mjs.map → planner-ZKXZf9JS.mjs.map} +1 -1
- package/dist/{pool-DLhqOY3P.mjs → pool-CgsnP3La.mjs} +3 -3
- package/dist/{pool-DLhqOY3P.mjs.map → pool-CgsnP3La.mjs.map} +1 -1
- package/dist/{pool-cli-DerrWWpP.mjs → pool-cli-kGGuZCzJ.mjs} +4 -4
- package/dist/{pool-cli-DerrWWpP.mjs.map → pool-cli-kGGuZCzJ.mjs.map} +1 -1
- package/dist/{program-B7gVKc-u.mjs → program-DgcwJN6Z.mjs} +25 -463
- package/dist/program-DgcwJN6Z.mjs.map +1 -0
- package/dist/{run-a_JzcVwv.mjs → run-CsrBbtj_.mjs} +686 -21
- package/dist/run-CsrBbtj_.mjs.map +1 -0
- package/dist/{run-env-DyFZ8C1s.mjs → run-env-Cyw2iwBh.mjs} +15 -5
- package/dist/{run-env-DyFZ8C1s.mjs.map → run-env-Cyw2iwBh.mjs.map} +1 -1
- package/dist/{status-C3fBJKU_.mjs → status-B0br9zV0.mjs} +2 -2
- package/dist/status-B0br9zV0.mjs.map +1 -0
- package/dist/{supervisor-B_2JKYxe.mjs → supervisor-BZA0KICt.mjs} +7 -7
- package/dist/{supervisor-B_2JKYxe.mjs.map → supervisor-BZA0KICt.mjs.map} +1 -1
- package/dist/workers-config-BifEz8ns.mjs +4 -0
- package/dist/{worktree-lnmAOFQv.mjs → worktree-B6d-1uIn.mjs} +2 -2
- package/dist/{worktree-lnmAOFQv.mjs.map → worktree-B6d-1uIn.mjs.map} +1 -1
- package/docs/worker.md +22 -0
- package/package.json +1 -1
- package/dist/auto-route-DYuVfXwc.mjs +0 -8
- package/dist/config-2pR0RqHM.mjs.map +0 -1
- package/dist/config-CQWpEdXb.mjs +0 -4
- package/dist/fallback-DyhAZAOe.mjs.map +0 -1
- package/dist/local-B5SekWOC.mjs +0 -7
- package/dist/program-B7gVKc-u.mjs.map +0 -1
- package/dist/run-a_JzcVwv.mjs.map +0 -1
- package/dist/status-C3fBJKU_.mjs.map +0 -1
- package/dist/workers-config-nXSiW07z.mjs +0 -4
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import "./utils-B47_aWgA.mjs";
|
|
2
2
|
import { a as slugify, i as parseSessionFilename, n as decodeEncodedDir, r as migrateFromJson } from "./migrate-CYccXTAA.mjs";
|
|
3
3
|
import "./config-DSdCEcHS.mjs";
|
|
4
|
-
import "./config-
|
|
5
|
-
import "./status-
|
|
6
|
-
import "./worktree-
|
|
7
|
-
import { n as ensurePaiMarker, r as readPaiMarker, t as discoverPaiMarkers } from "./pai-marker-
|
|
4
|
+
import "./config-CYjjGSWq.mjs";
|
|
5
|
+
import "./status-B0br9zV0.mjs";
|
|
6
|
+
import "./worktree-B6d-1uIn.mjs";
|
|
7
|
+
import { n as ensurePaiMarker, r as readPaiMarker, t as discoverPaiMarkers } from "./pai-marker-CJ6WMt05.mjs";
|
|
8
8
|
import { d as estimateTokens, l as buildOutline, p as parseHeadings, r as detectTier, u as chunkMarkdown } from "./helpers-CU6YCGGN.mjs";
|
|
9
9
|
import { i as populateSlugs, n as buildFtsQuery } from "./search-qLyvfhwY.mjs";
|
|
10
10
|
import { n as rerankResults, t as configureRerankerModel } from "./reranker-CdQMYXm-.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as ok, i as err, n as dim } from "./utils-B47_aWgA.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { a as fmtRss, d as readLocalConfig, l as parseServers, n as LocalTierError, p as stopLine, u as planStart } from "./local-tiers-
|
|
2
|
+
import { et as workersYamlPath } from "./config-CYjjGSWq.mjs";
|
|
3
|
+
import { a as fmtRss, d as readLocalConfig, l as parseServers, n as LocalTierError, p as stopLine, u as planStart } from "./local-tiers-_ZOTbjeP.mjs";
|
|
4
4
|
import { closeSync, mkdirSync, openSync } from "node:fs";
|
|
5
5
|
import { dirname } from "node:path";
|
|
6
6
|
import { execFileSync, spawn } from "node:child_process";
|
|
@@ -98,4 +98,4 @@ function registerWorkerLocalCommand(workerCmd) {
|
|
|
98
98
|
|
|
99
99
|
//#endregion
|
|
100
100
|
export { stopAll as a, startTier as i, listServers as n, registerWorkerLocalCommand as r, isUp as t };
|
|
101
|
-
//# sourceMappingURL=local-
|
|
101
|
+
//# sourceMappingURL=local-Bt-7L0oB.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-
|
|
1
|
+
{"version":3,"file":"local-Bt-7L0oB.mjs","names":[],"sources":["../src/cli/commands/worker/local.ts"],"sourcesContent":["/**\n * `pai worker local <tier>|off|status` — switch which single local model\n * server runs. Does not change worker routing (`pai worker use` does).\n */\n\nimport type { Command } from \"commander\";\nimport { execFileSync, spawn } from \"node:child_process\";\nimport { closeSync, mkdirSync, openSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { workersYamlPath } from \"../../../workers/workers-config.js\";\nimport {\n fmtRss, LocalTierError, parseServers, planStart, readLocalConfig, stopLine,\n type LocalConfig, type LocalTier, type RunningServer, type StartPlan,\n} from \"../../../workers/local-tiers.js\";\nimport { ok, err, dim } from \"../../utils.js\";\n\nconst READY_TIMEOUT_MS = 10 * 60 * 1000;\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport function listServers(cfg: LocalConfig): RunningServer[] {\n const out = execFileSync(\"ps\", [\"-axo\", \"pid=,rss=,command=\"], { encoding: \"utf8\", maxBuffer: 64 * 1024 * 1024 });\n return parseServers(out, cfg);\n}\n\nexport async function stopAll(cfg: LocalConfig): Promise<void> {\n const servers = listServers(cfg);\n for (const s of servers) process.kill(s.pid, \"SIGTERM\");\n const deadline = Date.now() + 60_000;\n while (listServers(cfg).length > 0 && Date.now() < deadline) await sleep(1000);\n for (const s of listServers(cfg)) process.kill(s.pid, \"SIGKILL\");\n}\n\nexport async function isUp(port: number): Promise<boolean> {\n try {\n const r = await fetch(`http://127.0.0.1:${port}/v1/models`, { signal: AbortSignal.timeout(3000) });\n return r.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Stop every local server, start `tier`'s and wait until it answers.\n * Shared by `pai worker local <tier>` and the bare-`pai` model picker.\n */\nexport async function startTier(\n cfg: LocalConfig,\n target: string,\n tier: LocalTier,\n plan: StartPlan = planStart(cfg, tier),\n): Promise<void> {\n await stopAll(cfg);\n mkdirSync(dirname(plan.logPath), { recursive: true });\n const fd = openSync(plan.logPath, \"w\");\n const [cmd, ...args] = plan.argv;\n const child = spawn(cmd, args, {\n env: { ...process.env, ...plan.env },\n detached: true,\n stdio: [\"ignore\", fd, fd],\n });\n child.unref();\n closeSync(fd);\n console.log(dim(`starting ${tier.provider} (${tier.served}) on :${tier.port}, log ${plan.logPath}`));\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (!(await isUp(tier.port))) {\n if (child.exitCode !== null) throw new LocalTierError(`server exited (${child.exitCode}); see ${plan.logPath}`);\n if (Date.now() > deadline) throw new LocalTierError(`not ready after 10 min; see ${plan.logPath}`);\n await sleep(5000);\n }\n const s = listServers(cfg).find((x) => x.port === tier.port);\n console.log(ok(`${target} up: ${tier.provider} on port ${tier.port}${s ? `, rss ${fmtRss(s.rssKb)}` : \"\"}`));\n}\n\nfunction printStatus(cfg: LocalConfig): void {\n const servers = listServers(cfg);\n if (servers.length === 0) {\n console.log(dim(\"no local model server running\"));\n }\n for (const s of servers) {\n console.log(`${s.tier ?? \"?\"} provider=${s.provider ?? \"?\"} port=${s.port ?? \"?\"} pid=${s.pid} rss=${fmtRss(s.rssKb)}`);\n }\n console.log(dim(`tiers: ${Object.keys(cfg.tiers).join(\", \") || \"(none configured)\"}`));\n}\n\nexport function registerWorkerLocalCommand(workerCmd: Command): void {\n workerCmd\n .command(\"local <target>\")\n .description(\n \"Switch the one running local model server: <tier> (stop all, start that tier),\\n\" +\n \"off (stop all), status (what is up). Tiers come from local_tiers: in workers.yaml.\\n\" +\n \"Does not change worker routing.\"\n )\n .option(\"--dry-run\", \"Print the exact commands without starting or stopping anything\")\n .action(async (target: string, opts: { dryRun?: boolean }) => {\n try {\n const cfg = readLocalConfig(workersYamlPath());\n if (target === \"status\") return printStatus(cfg);\n if (target === \"off\") {\n if (opts.dryRun) return void console.log(stopLine(cfg));\n await stopAll(cfg);\n console.log(ok(\"local model servers stopped\"));\n return;\n }\n const tier = cfg.tiers[target];\n if (!tier) {\n throw new LocalTierError(`no tier \"${target}\" (configured: ${Object.keys(cfg.tiers).join(\", \") || \"none\"})`);\n }\n const plan = planStart(cfg, tier);\n if (opts.dryRun) {\n console.log(stopLine(cfg));\n console.log(\"sleep 10\");\n console.log(plan.line);\n console.log(`until curl -s -m 3 http://127.0.0.1:${tier.port}/v1/models > /dev/null; do sleep 5; done`);\n return;\n }\n await startTier(cfg, target, tier, plan);\n } catch (e) {\n console.error(err(\"pai worker local: \") + (e instanceof Error ? e.message : String(e)));\n process.exitCode = 1;\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import "./utils-B47_aWgA.mjs";
|
|
2
|
+
import "./config-DSdCEcHS.mjs";
|
|
3
|
+
import "./config-CYjjGSWq.mjs";
|
|
4
|
+
import "./local-tiers-_ZOTbjeP.mjs";
|
|
5
|
+
import { a as stopAll, i as startTier, n as listServers, r as registerWorkerLocalCommand, t as isUp } from "./local-Bt-7L0oB.mjs";
|
|
6
|
+
|
|
7
|
+
export { isUp, listServers, startTier };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./config-DSdCEcHS.mjs";
|
|
2
|
-
import "./config-
|
|
3
|
-
import { a as fmtRss, c as parseLocalConfig, d as readLocalConfig, f as resolveModelPath, i as findModelPath, l as parseServers, n as LocalTierError, o as installedModelDirs, p as stopLine, r as defaultLauncher, s as logPathFor, t as DEFAULT_COMMON_FLAGS, u as planStart } from "./local-tiers-
|
|
2
|
+
import "./config-CYjjGSWq.mjs";
|
|
3
|
+
import { a as fmtRss, c as parseLocalConfig, d as readLocalConfig, f as resolveModelPath, i as findModelPath, l as parseServers, n as LocalTierError, o as installedModelDirs, p as stopLine, r as defaultLauncher, s as logPathFor, t as DEFAULT_COMMON_FLAGS, u as planStart } from "./local-tiers-_ZOTbjeP.mjs";
|
|
4
4
|
|
|
5
5
|
export { findModelPath, planStart, readLocalConfig };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as expandHome } from "./config-CYjjGSWq.mjs";
|
|
2
2
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
@@ -238,4 +238,4 @@ function findModelPath(served, dirs = installedModelDirs()) {
|
|
|
238
238
|
|
|
239
239
|
//#endregion
|
|
240
240
|
export { fmtRss as a, parseLocalConfig as c, readLocalConfig as d, resolveModelPath as f, findModelPath as i, parseServers as l, LocalTierError as n, installedModelDirs as o, stopLine as p, defaultLauncher as r, logPathFor as s, DEFAULT_COMMON_FLAGS as t, planStart as u };
|
|
241
|
-
//# sourceMappingURL=local-tiers-
|
|
241
|
+
//# sourceMappingURL=local-tiers-_ZOTbjeP.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-tiers-8fmjiySw.mjs","names":[],"sources":["../src/workers/local-tiers.ts"],"sourcesContent":["/**\n * local-tiers.ts — one local model server at a time, chosen by tier.\n *\n * `pai worker local <tier>` stops every running serve_patched server and\n * starts the tier's model; `off` stops all; `status` reports what is up.\n * Tiers are config, not code: `local_tiers:` and `local_launcher:` in\n * workers.yaml. A tier names a worker provider (so port and served model\n * name default to that provider's url and default model).\n *\n * This never touches worker routing (`pai worker use` does that).\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { expandHome } from \"./config.js\";\n\nexport class LocalTierError extends Error {}\n\nexport interface LocalLauncher {\n python: string;\n script: string;\n /** Flags shared by every tier, as one shell-split string. */\n flags: string[];\n /** Chat-template kwargs JSON (thinking off by default). */\n templateKwargs: string;\n /** Environment for the server process. */\n env: Record<string, string>;\n /** Process-name fragment that identifies a running server. */\n processMatch: string;\n}\n\nexport interface LocalTier {\n tier: string;\n provider: string;\n /** Model path; a `*` path segment is expanded against the directory. */\n model: string;\n served: string;\n port: number;\n flags: string[];\n}\n\nexport interface LocalConfig {\n launcher: LocalLauncher;\n tiers: Record<string, LocalTier>;\n}\n\nexport const DEFAULT_COMMON_FLAGS =\n \"--host 127.0.0.1 --continuous-batching --enable-prefix-cache --cache-memory-mb 8000 \" +\n \"--gpu-memory-utilization 0.30 --chunked-prefill-tokens 4096 --max-num-seqs 3 \" +\n \"--max-request-tokens 131072 --max-tokens 32768 --enable-auto-tool-choice \" +\n \"--tool-call-parser qwen3_coder --reasoning-parser qwen3\";\n\nexport function defaultLauncher(): LocalLauncher {\n const home = homedir();\n return {\n python: join(home, \".local/share/uv/tools/vllm-mlx/bin/python\"),\n script: join(home, \".local/share/vllm-mlx-serve/serve_patched_fold_text.py\"),\n flags: DEFAULT_COMMON_FLAGS.split(/\\s+/),\n templateKwargs: '{\"enable_thinking\": false}',\n env: { PF_FORCE_TEXT: \"1\" },\n processMatch: \"serve_patched\",\n };\n}\n\nfunction str(v: unknown, what: string): string | undefined {\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"string\" || v === \"\") throw new LocalTierError(`${what}: must be a non-empty string`);\n return v;\n}\n\nfunction flagList(v: unknown, what: string): string[] {\n if (v === undefined || v === null) return [];\n if (Array.isArray(v) && v.every((x) => typeof x === \"string\")) return v as string[];\n const s = str(v, what);\n return s ? s.split(/\\s+/) : [];\n}\n\n/**\n * Parse the local_launcher / local_tiers keys of a workers.yaml root.\n * `providerUrls`/`providerModels` supply the port and served-name fallbacks.\n */\nexport function parseLocalConfig(\n root: Record<string, unknown>,\n providers: Record<string, { url?: string; model?: string }>,\n): LocalConfig {\n const launcher = defaultLauncher();\n const lr = root.local_launcher;\n if (lr !== undefined && lr !== null) {\n if (typeof lr !== \"object\" || Array.isArray(lr)) throw new LocalTierError(\"local_launcher: must be a mapping\");\n const l = lr as Record<string, unknown>;\n const python = str(l.python, \"local_launcher.python\");\n const script = str(l.script, \"local_launcher.script\");\n if (python) launcher.python = expandHome(python);\n if (script) launcher.script = expandHome(script);\n if (l.flags !== undefined) launcher.flags = flagList(l.flags, \"local_launcher.flags\");\n const tk = str(l.template_kwargs, \"local_launcher.template_kwargs\");\n if (tk) launcher.templateKwargs = tk;\n const pm = str(l.process_match, \"local_launcher.process_match\");\n if (pm) launcher.processMatch = pm;\n if (l.env && typeof l.env === \"object\") {\n launcher.env = Object.fromEntries(Object.entries(l.env as Record<string, unknown>).map(([k, v]) => [k, String(v)]));\n }\n }\n\n const tiers: Record<string, LocalTier> = {};\n const tr = root.local_tiers;\n if (tr !== undefined && tr !== null) {\n if (typeof tr !== \"object\" || Array.isArray(tr)) throw new LocalTierError(\"local_tiers: must be a mapping\");\n for (const [name, raw] of Object.entries(tr as Record<string, unknown>)) {\n const where = `local_tiers.${name}`;\n if (!raw || typeof raw !== \"object\") throw new LocalTierError(`${where}: must be a mapping`);\n const t = raw as Record<string, unknown>;\n const provider = str(t.provider, `${where}.provider`);\n if (!provider) throw new LocalTierError(`${where}.provider: required`);\n const model = str(t.model, `${where}.model`);\n if (!model) throw new LocalTierError(`${where}.model: required`);\n const p = providers[provider];\n let port = t.port === undefined ? undefined : Number(t.port);\n if (port === undefined && p?.url) {\n const m = /:(\\d+)(?:\\/|$)/.exec(p.url);\n if (m) port = Number(m[1]);\n }\n if (port === undefined || !Number.isInteger(port) || port <= 0) {\n throw new LocalTierError(`${where}.port: missing and not derivable from provider \"${provider}\"`);\n }\n const served = str(t.served, `${where}.served`) ?? p?.model;\n if (!served) throw new LocalTierError(`${where}.served: missing and provider \"${provider}\" has no default model`);\n tiers[name] = { tier: name, provider, model: expandHome(model), served, port, flags: flagList(t.flags, `${where}.flags`) };\n }\n }\n return { launcher, tiers };\n}\n\n/** Read the local config from a workers.yaml file. */\nexport function readLocalConfig(yamlPath: string): LocalConfig {\n let root: Record<string, unknown> = {};\n if (existsSync(yamlPath)) {\n const doc = parse(readFileSync(yamlPath, \"utf8\"));\n if (doc && typeof doc === \"object\") root = doc as Record<string, unknown>;\n }\n const providers: Record<string, { url?: string; model?: string }> = {};\n const pr = root.providers;\n if (pr && typeof pr === \"object\") {\n for (const [name, raw] of Object.entries(pr as Record<string, unknown>)) {\n const p = (raw ?? {}) as { url?: unknown; models?: { default?: unknown } };\n providers[name] = {\n url: typeof p.url === \"string\" ? p.url : undefined,\n model: typeof p.models?.default === \"string\" ? p.models.default : undefined,\n };\n }\n }\n return parseLocalConfig(root, providers);\n}\n\n/** Expand `*` path segments to the first (sorted) existing entry. Unresolvable → input unchanged. */\nexport function resolveModelPath(pattern: string): string {\n if (!pattern.includes(\"*\")) return pattern;\n const segs = pattern.split(\"/\");\n let cur = segs[0] === \"\" ? \"/\" : segs[0];\n for (const seg of segs.slice(1)) {\n if (!seg.includes(\"*\")) {\n cur = join(cur, seg);\n continue;\n }\n const re = new RegExp(\"^\" + seg.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") + \"$\");\n let hit: string | undefined;\n try {\n hit = readdirSync(cur).filter((e) => re.test(e)).sort()[0];\n } catch {\n return pattern;\n }\n if (!hit) return pattern;\n cur = join(cur, hit);\n }\n return cur;\n}\n\nfunction shq(s: string): string {\n return /^[A-Za-z0-9_@%+=:,./-]+$/.test(s) ? s : `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport interface StartPlan {\n env: Record<string, string>;\n argv: string[];\n logPath: string;\n /** Shell rendering of the above, log redirect included. */\n line: string;\n}\n\nexport function logPathFor(provider: string): string {\n return join(homedir(), \".cache/pai/local-server\", `${provider}.log`);\n}\n\nexport function planStart(cfg: LocalConfig, tier: LocalTier): StartPlan {\n const l = cfg.launcher;\n const argv = [\n l.python, l.script, \"serve\", resolveModelPath(tier.model),\n \"--served-model-name\", tier.served,\n \"--port\", String(tier.port),\n ...l.flags, ...tier.flags,\n \"--default-chat-template-kwargs\", l.templateKwargs,\n ];\n const logPath = logPathFor(tier.provider);\n const envPart = Object.entries(l.env).map(([k, v]) => `${k}=${shq(v)}`).join(\" \");\n const line = `${envPart ? envPart + \" \" : \"\"}nohup ${argv.map(shq).join(\" \")} > ${shq(logPath)} 2>&1 < /dev/null &`;\n return { env: l.env, argv, logPath, line };\n}\n\nexport function stopLine(cfg: LocalConfig): string {\n return `for p in $(pgrep -f ${shq(cfg.launcher.processMatch)}); do kill $p; done`;\n}\n\nexport interface RunningServer {\n pid: number;\n rssKb: number;\n port: number | null;\n tier: string | null;\n provider: string | null;\n}\n\n/** Parse `ps -axo pid=,rss=,command=` output for servers matching processMatch. */\nexport function parseServers(psOut: string, cfg: LocalConfig, selfPid = process.pid): RunningServer[] {\n const out: RunningServer[] = [];\n for (const line of psOut.split(\"\\n\")) {\n const m = /^\\s*(\\d+)\\s+(\\d+)\\s+(.*)$/.exec(line);\n if (!m) continue;\n const pid = Number(m[1]);\n const cmd = m[3];\n if (pid === selfPid || !cmd.includes(cfg.launcher.processMatch)) continue;\n // Skip the CLI / shells that merely mention the match string.\n if (!/\\bserve\\b/.test(cmd) || !cmd.includes(\"--port\")) continue;\n const pm = /--port\\s+(\\d+)/.exec(cmd);\n const port = pm ? Number(pm[1]) : null;\n const tier = Object.values(cfg.tiers).find((t) => t.port === port) ?? null;\n out.push({ pid, rssKb: Number(m[2]), port, tier: tier?.tier ?? null, provider: tier?.provider ?? null });\n }\n return out;\n}\n\nexport function fmtRss(kb: number): string {\n return kb >= 1048576 ? `${(kb / 1048576).toFixed(1)} GB` : `${Math.round(kb / 1024)} MB`;\n}\n\nconst norm = (s: string): string => s.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n\n/** Model directories on disk: HF snapshots and LM Studio models, nothing else. */\nexport function installedModelDirs(home = homedir()): { name: string; path: string }[] {\n const out: { name: string; path: string }[] = [];\n const ls = (d: string): string[] => {\n try {\n return readdirSync(d).sort();\n } catch {\n return [];\n }\n };\n const hub = join(home, \".cache/huggingface/hub\");\n for (const e of ls(hub)) {\n if (!e.startsWith(\"models--\")) continue;\n const snap = ls(join(hub, e, \"snapshots\"))[0];\n if (snap) out.push({ name: e.split(\"--\").slice(2).join(\"--\"), path: join(hub, e, \"snapshots\", snap) });\n }\n const lms = join(home, \".lmstudio/models\");\n for (const org of ls(lms)) {\n for (const m of ls(join(lms, org))) out.push({ name: m, path: join(lms, org, m) });\n }\n return out;\n}\n\n/**\n * Model path for a provider's default model name (e.g. \"qwen3-coder-30b\"):\n * the first installed directory whose name contains it, ignoring case and\n * punctuation. Null when nothing matches.\n */\nexport function findModelPath(served: string, dirs: { name: string; path: string }[] = installedModelDirs()): string | null {\n const want = norm(served);\n if (!want) return null;\n return dirs.find((d) => norm(d.name).includes(want))?.path ?? null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"local-tiers-_ZOTbjeP.mjs","names":[],"sources":["../src/workers/local-tiers.ts"],"sourcesContent":["/**\n * local-tiers.ts — one local model server at a time, chosen by tier.\n *\n * `pai worker local <tier>` stops every running serve_patched server and\n * starts the tier's model; `off` stops all; `status` reports what is up.\n * Tiers are config, not code: `local_tiers:` and `local_launcher:` in\n * workers.yaml. A tier names a worker provider (so port and served model\n * name default to that provider's url and default model).\n *\n * This never touches worker routing (`pai worker use` does that).\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { expandHome } from \"./config.js\";\n\nexport class LocalTierError extends Error {}\n\nexport interface LocalLauncher {\n python: string;\n script: string;\n /** Flags shared by every tier, as one shell-split string. */\n flags: string[];\n /** Chat-template kwargs JSON (thinking off by default). */\n templateKwargs: string;\n /** Environment for the server process. */\n env: Record<string, string>;\n /** Process-name fragment that identifies a running server. */\n processMatch: string;\n}\n\nexport interface LocalTier {\n tier: string;\n provider: string;\n /** Model path; a `*` path segment is expanded against the directory. */\n model: string;\n served: string;\n port: number;\n flags: string[];\n}\n\nexport interface LocalConfig {\n launcher: LocalLauncher;\n tiers: Record<string, LocalTier>;\n}\n\nexport const DEFAULT_COMMON_FLAGS =\n \"--host 127.0.0.1 --continuous-batching --enable-prefix-cache --cache-memory-mb 8000 \" +\n \"--gpu-memory-utilization 0.30 --chunked-prefill-tokens 4096 --max-num-seqs 3 \" +\n \"--max-request-tokens 131072 --max-tokens 32768 --enable-auto-tool-choice \" +\n \"--tool-call-parser qwen3_coder --reasoning-parser qwen3\";\n\nexport function defaultLauncher(): LocalLauncher {\n const home = homedir();\n return {\n python: join(home, \".local/share/uv/tools/vllm-mlx/bin/python\"),\n script: join(home, \".local/share/vllm-mlx-serve/serve_patched_fold_text.py\"),\n flags: DEFAULT_COMMON_FLAGS.split(/\\s+/),\n templateKwargs: '{\"enable_thinking\": false}',\n env: { PF_FORCE_TEXT: \"1\" },\n processMatch: \"serve_patched\",\n };\n}\n\nfunction str(v: unknown, what: string): string | undefined {\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"string\" || v === \"\") throw new LocalTierError(`${what}: must be a non-empty string`);\n return v;\n}\n\nfunction flagList(v: unknown, what: string): string[] {\n if (v === undefined || v === null) return [];\n if (Array.isArray(v) && v.every((x) => typeof x === \"string\")) return v as string[];\n const s = str(v, what);\n return s ? s.split(/\\s+/) : [];\n}\n\n/**\n * Parse the local_launcher / local_tiers keys of a workers.yaml root.\n * `providerUrls`/`providerModels` supply the port and served-name fallbacks.\n */\nexport function parseLocalConfig(\n root: Record<string, unknown>,\n providers: Record<string, { url?: string; model?: string }>,\n): LocalConfig {\n const launcher = defaultLauncher();\n const lr = root.local_launcher;\n if (lr !== undefined && lr !== null) {\n if (typeof lr !== \"object\" || Array.isArray(lr)) throw new LocalTierError(\"local_launcher: must be a mapping\");\n const l = lr as Record<string, unknown>;\n const python = str(l.python, \"local_launcher.python\");\n const script = str(l.script, \"local_launcher.script\");\n if (python) launcher.python = expandHome(python);\n if (script) launcher.script = expandHome(script);\n if (l.flags !== undefined) launcher.flags = flagList(l.flags, \"local_launcher.flags\");\n const tk = str(l.template_kwargs, \"local_launcher.template_kwargs\");\n if (tk) launcher.templateKwargs = tk;\n const pm = str(l.process_match, \"local_launcher.process_match\");\n if (pm) launcher.processMatch = pm;\n if (l.env && typeof l.env === \"object\") {\n launcher.env = Object.fromEntries(Object.entries(l.env as Record<string, unknown>).map(([k, v]) => [k, String(v)]));\n }\n }\n\n const tiers: Record<string, LocalTier> = {};\n const tr = root.local_tiers;\n if (tr !== undefined && tr !== null) {\n if (typeof tr !== \"object\" || Array.isArray(tr)) throw new LocalTierError(\"local_tiers: must be a mapping\");\n for (const [name, raw] of Object.entries(tr as Record<string, unknown>)) {\n const where = `local_tiers.${name}`;\n if (!raw || typeof raw !== \"object\") throw new LocalTierError(`${where}: must be a mapping`);\n const t = raw as Record<string, unknown>;\n const provider = str(t.provider, `${where}.provider`);\n if (!provider) throw new LocalTierError(`${where}.provider: required`);\n const model = str(t.model, `${where}.model`);\n if (!model) throw new LocalTierError(`${where}.model: required`);\n const p = providers[provider];\n let port = t.port === undefined ? undefined : Number(t.port);\n if (port === undefined && p?.url) {\n const m = /:(\\d+)(?:\\/|$)/.exec(p.url);\n if (m) port = Number(m[1]);\n }\n if (port === undefined || !Number.isInteger(port) || port <= 0) {\n throw new LocalTierError(`${where}.port: missing and not derivable from provider \"${provider}\"`);\n }\n const served = str(t.served, `${where}.served`) ?? p?.model;\n if (!served) throw new LocalTierError(`${where}.served: missing and provider \"${provider}\" has no default model`);\n tiers[name] = { tier: name, provider, model: expandHome(model), served, port, flags: flagList(t.flags, `${where}.flags`) };\n }\n }\n return { launcher, tiers };\n}\n\n/** Read the local config from a workers.yaml file. */\nexport function readLocalConfig(yamlPath: string): LocalConfig {\n let root: Record<string, unknown> = {};\n if (existsSync(yamlPath)) {\n const doc = parse(readFileSync(yamlPath, \"utf8\"));\n if (doc && typeof doc === \"object\") root = doc as Record<string, unknown>;\n }\n const providers: Record<string, { url?: string; model?: string }> = {};\n const pr = root.providers;\n if (pr && typeof pr === \"object\") {\n for (const [name, raw] of Object.entries(pr as Record<string, unknown>)) {\n const p = (raw ?? {}) as { url?: unknown; models?: { default?: unknown } };\n providers[name] = {\n url: typeof p.url === \"string\" ? p.url : undefined,\n model: typeof p.models?.default === \"string\" ? p.models.default : undefined,\n };\n }\n }\n return parseLocalConfig(root, providers);\n}\n\n/** Expand `*` path segments to the first (sorted) existing entry. Unresolvable → input unchanged. */\nexport function resolveModelPath(pattern: string): string {\n if (!pattern.includes(\"*\")) return pattern;\n const segs = pattern.split(\"/\");\n let cur = segs[0] === \"\" ? \"/\" : segs[0];\n for (const seg of segs.slice(1)) {\n if (!seg.includes(\"*\")) {\n cur = join(cur, seg);\n continue;\n }\n const re = new RegExp(\"^\" + seg.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") + \"$\");\n let hit: string | undefined;\n try {\n hit = readdirSync(cur).filter((e) => re.test(e)).sort()[0];\n } catch {\n return pattern;\n }\n if (!hit) return pattern;\n cur = join(cur, hit);\n }\n return cur;\n}\n\nfunction shq(s: string): string {\n return /^[A-Za-z0-9_@%+=:,./-]+$/.test(s) ? s : `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport interface StartPlan {\n env: Record<string, string>;\n argv: string[];\n logPath: string;\n /** Shell rendering of the above, log redirect included. */\n line: string;\n}\n\nexport function logPathFor(provider: string): string {\n return join(homedir(), \".cache/pai/local-server\", `${provider}.log`);\n}\n\nexport function planStart(cfg: LocalConfig, tier: LocalTier): StartPlan {\n const l = cfg.launcher;\n const argv = [\n l.python, l.script, \"serve\", resolveModelPath(tier.model),\n \"--served-model-name\", tier.served,\n \"--port\", String(tier.port),\n ...l.flags, ...tier.flags,\n \"--default-chat-template-kwargs\", l.templateKwargs,\n ];\n const logPath = logPathFor(tier.provider);\n const envPart = Object.entries(l.env).map(([k, v]) => `${k}=${shq(v)}`).join(\" \");\n const line = `${envPart ? envPart + \" \" : \"\"}nohup ${argv.map(shq).join(\" \")} > ${shq(logPath)} 2>&1 < /dev/null &`;\n return { env: l.env, argv, logPath, line };\n}\n\nexport function stopLine(cfg: LocalConfig): string {\n return `for p in $(pgrep -f ${shq(cfg.launcher.processMatch)}); do kill $p; done`;\n}\n\nexport interface RunningServer {\n pid: number;\n rssKb: number;\n port: number | null;\n tier: string | null;\n provider: string | null;\n}\n\n/** Parse `ps -axo pid=,rss=,command=` output for servers matching processMatch. */\nexport function parseServers(psOut: string, cfg: LocalConfig, selfPid = process.pid): RunningServer[] {\n const out: RunningServer[] = [];\n for (const line of psOut.split(\"\\n\")) {\n const m = /^\\s*(\\d+)\\s+(\\d+)\\s+(.*)$/.exec(line);\n if (!m) continue;\n const pid = Number(m[1]);\n const cmd = m[3];\n if (pid === selfPid || !cmd.includes(cfg.launcher.processMatch)) continue;\n // Skip the CLI / shells that merely mention the match string.\n if (!/\\bserve\\b/.test(cmd) || !cmd.includes(\"--port\")) continue;\n const pm = /--port\\s+(\\d+)/.exec(cmd);\n const port = pm ? Number(pm[1]) : null;\n const tier = Object.values(cfg.tiers).find((t) => t.port === port) ?? null;\n out.push({ pid, rssKb: Number(m[2]), port, tier: tier?.tier ?? null, provider: tier?.provider ?? null });\n }\n return out;\n}\n\nexport function fmtRss(kb: number): string {\n return kb >= 1048576 ? `${(kb / 1048576).toFixed(1)} GB` : `${Math.round(kb / 1024)} MB`;\n}\n\nconst norm = (s: string): string => s.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n\n/** Model directories on disk: HF snapshots and LM Studio models, nothing else. */\nexport function installedModelDirs(home = homedir()): { name: string; path: string }[] {\n const out: { name: string; path: string }[] = [];\n const ls = (d: string): string[] => {\n try {\n return readdirSync(d).sort();\n } catch {\n return [];\n }\n };\n const hub = join(home, \".cache/huggingface/hub\");\n for (const e of ls(hub)) {\n if (!e.startsWith(\"models--\")) continue;\n const snap = ls(join(hub, e, \"snapshots\"))[0];\n if (snap) out.push({ name: e.split(\"--\").slice(2).join(\"--\"), path: join(hub, e, \"snapshots\", snap) });\n }\n const lms = join(home, \".lmstudio/models\");\n for (const org of ls(lms)) {\n for (const m of ls(join(lms, org))) out.push({ name: m, path: join(lms, org, m) });\n }\n return out;\n}\n\n/**\n * Model path for a provider's default model name (e.g. \"qwen3-coder-30b\"):\n * the first installed directory whose name contains it, ignoring case and\n * punctuation. Null when nothing matches.\n */\nexport function findModelPath(served: string, dirs: { name: string; path: string }[] = installedModelDirs()): string | null {\n const want = norm(served);\n if (!want) return null;\n return dirs.find((d) => norm(d.name).includes(want))?.path ?? null;\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "./utils-B47_aWgA.mjs";
|
|
2
2
|
import "./config-DSdCEcHS.mjs";
|
|
3
|
-
import "./config-
|
|
4
|
-
import { i as resumeTargetFor, n as resolveSessionDir, r as resumeCandidateFor, t as cmdMain } from "./main-resolver-
|
|
5
|
-
import "./run-env-
|
|
3
|
+
import "./config-CYjjGSWq.mjs";
|
|
4
|
+
import { i as resumeTargetFor, n as resolveSessionDir, r as resumeCandidateFor, t as cmdMain } from "./main-resolver-CVo0ab7j.mjs";
|
|
5
|
+
import "./run-env-Cyw2iwBh.mjs";
|
|
6
6
|
import "./aibroker-client-Dome-XV2.mjs";
|
|
7
7
|
|
|
8
8
|
export { cmdMain };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c as ok, g as warn, h as smartDecodeDir, i as err, l as renderTable, n as dim, o as header } from "./utils-B47_aWgA.mjs";
|
|
2
2
|
import { c as migratePaiFile, d as resolvePaiFile, u as paiHomePath } from "./runtime-paths-DkZoxofH.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { n as claudeCommand, t as buildRunEnv } from "./run-env-
|
|
3
|
+
import { R as readWorkersSection, ot as stripModelVariant, t as ANTHROPIC_NATIVE } from "./config-CYjjGSWq.mjs";
|
|
4
|
+
import { n as claudeCommand, t as buildRunEnv } from "./run-env-Cyw2iwBh.mjs";
|
|
5
5
|
import { r as fetchLiveSessions, s as switchToSession } from "./aibroker-client-Dome-XV2.mjs";
|
|
6
6
|
import { closeSync, copyFileSync, createReadStream, existsSync, fstatSync, linkSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, realpathSync, renameSync, statSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { homedir } from "node:os";
|
|
@@ -2111,4 +2111,4 @@ async function cmdMain(query, pickN, opts) {
|
|
|
2111
2111
|
|
|
2112
2112
|
//#endregion
|
|
2113
2113
|
export { resolveSessionByNameOrId as _, buildDeduped as a, hasConversation as c, providerResumePlan as d, restoreTopLevel as f, migrateSessionScanCache as g, fmtAge as h, resumeTargetFor as i, launchInDir as l, printExitDir as m, resolveSessionDir as n, normalizeName as o, resumeArgvText as p, resumeCandidateFor as r, renderDedupedSessions as s, cmdMain as t, launchPrompt as u, scanCacheFilePath as v, scanSessions as y };
|
|
2114
|
-
//# sourceMappingURL=main-resolver-
|
|
2114
|
+
//# sourceMappingURL=main-resolver-CVo0ab7j.mjs.map
|