@tekmidian/pai 0.39.0 → 0.40.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 +41 -0
- package/dist/{auto-route-BlWOWT4z.mjs → auto-route-BwzmlW3W.mjs} +2 -2
- package/dist/{auto-route-BlWOWT4z.mjs.map → auto-route-BwzmlW3W.mjs.map} +1 -1
- package/dist/{chain-CTtHligI.mjs → chain-DhVHVnmT.mjs} +263 -791
- package/dist/chain-DhVHVnmT.mjs.map +1 -0
- package/dist/cli/index.mjs +10 -8
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/program.mjs +10 -8
- package/dist/{clusters-wlK0w41E.mjs → clusters-DRHhfli9.mjs} +1 -1
- package/dist/{clusters-wlK0w41E.mjs.map → clusters-DRHhfli9.mjs.map} +1 -1
- package/dist/{config-B64vFg14.mjs → config-D1G9IFpn.mjs} +50 -3
- package/dist/config-D1G9IFpn.mjs.map +1 -0
- package/dist/{config-C_ErGddD.mjs → config-DD52BPB-.mjs} +1 -1
- package/dist/config-Dl8lT4Lu.mjs +527 -0
- package/dist/config-Dl8lT4Lu.mjs.map +1 -0
- package/dist/{context-handover-cache-BpUojjsi.mjs → context-handover-cache-C6_rs7JT.mjs} +112 -24
- package/dist/context-handover-cache-C6_rs7JT.mjs.map +1 -0
- package/dist/daemon/index.mjs +12 -10
- package/dist/daemon/index.mjs.map +1 -1
- package/dist/daemon-BSL9sXxm.mjs +22 -0
- package/dist/{daemon-CTkN_Vn8.mjs → daemon-CpdVUnl_.mjs} +26 -26
- package/dist/{daemon-CTkN_Vn8.mjs.map → daemon-CpdVUnl_.mjs.map} +1 -1
- package/dist/daemon-mcp/index.mjs +127 -6
- package/dist/daemon-mcp/index.mjs.map +1 -1
- package/dist/detector-BLVOCiJ_.mjs +5 -0
- package/dist/{detector-Bwk_4Pk4.mjs → detector-smpCm7ku.mjs} +1 -1
- package/dist/{detector-Bwk_4Pk4.mjs.map → detector-smpCm7ku.mjs.map} +1 -1
- package/dist/{factory-A9x-T2Kg.mjs → factory-Bc5EyN54.mjs} +7 -7
- package/dist/{factory-A9x-T2Kg.mjs.map → factory-Bc5EyN54.mjs.map} +1 -1
- package/dist/factory-C7ua_3ik.mjs +3 -0
- package/dist/{providers-FYkZjn_C.mjs → fallback-CdXv-Np0.mjs} +411 -51
- package/dist/fallback-CdXv-Np0.mjs.map +1 -0
- package/dist/hooks/context-compression-hook.mjs +136 -22
- package/dist/hooks/context-compression-hook.mjs.map +4 -4
- package/dist/hooks/post-compact-inject.mjs +98 -7
- package/dist/hooks/post-compact-inject.mjs.map +4 -4
- package/dist/hooks/route-agents-to-worker.mjs +75 -6
- package/dist/hooks/route-agents-to-worker.mjs.map +2 -2
- package/dist/hooks/worker-proxy.mjs +75 -6
- package/dist/hooks/worker-proxy.mjs.map +2 -2
- package/dist/hooks/worker-status-line.mjs +149 -90
- package/dist/hooks/worker-status-line.mjs.map +4 -4
- package/dist/{indexer-backend-TG64CCQC.mjs → indexer-backend-rohVVKrA.mjs} +1 -1
- package/dist/{indexer-backend-TG64CCQC.mjs.map → indexer-backend-rohVVKrA.mjs.map} +1 -1
- package/dist/{ipc-client-BmypMNYk.mjs → ipc-client-C7AVpsyv.mjs} +2 -2
- package/dist/{ipc-client-BmypMNYk.mjs.map → ipc-client-C7AVpsyv.mjs.map} +1 -1
- package/dist/{kg-entity-r8duqhi9.mjs → kg-entity-DbOMPdF9.mjs} +1 -1
- package/dist/{kg-entity-r8duqhi9.mjs.map → kg-entity-DbOMPdF9.mjs.map} +1 -1
- package/dist/{latent-ideas-B7wq75Pt.mjs → latent-ideas-iNp5s55R.mjs} +2 -2
- package/dist/{latent-ideas-B7wq75Pt.mjs.map → latent-ideas-iNp5s55R.mjs.map} +1 -1
- package/dist/{link-boost-HkG7JWZR.mjs → link-boost-NNzADHX_.mjs} +1 -1
- package/dist/{link-boost-HkG7JWZR.mjs.map → link-boost-NNzADHX_.mjs.map} +1 -1
- package/dist/{main-resolver-DlaLOFBA.mjs → main-resolver-CM1IHbuu.mjs} +78 -75
- package/dist/main-resolver-CM1IHbuu.mjs.map +1 -0
- package/dist/main-resolver-E5WlilhM.mjs +6 -0
- package/dist/{neighborhood-lThN-MaQ.mjs → neighborhood-AGL7oXQ2.mjs} +1 -1
- package/dist/{neighborhood-lThN-MaQ.mjs.map → neighborhood-AGL7oXQ2.mjs.map} +1 -1
- package/dist/{note-context-b6k0mAKi.mjs → note-context-BHwYpSFf.mjs} +1 -1
- package/dist/{note-context-b6k0mAKi.mjs.map → note-context-BHwYpSFf.mjs.map} +1 -1
- package/dist/{planner-BDI7bE9B.mjs → planner-Cm3g6fWH.mjs} +5 -3
- package/dist/{planner-BDI7bE9B.mjs.map → planner-Cm3g6fWH.mjs.map} +1 -1
- package/dist/{postgres-mW1n7Vi1.mjs → postgres-Dwxe290H.mjs} +1 -1
- package/dist/{postgres-mW1n7Vi1.mjs.map → postgres-Dwxe290H.mjs.map} +1 -1
- package/dist/{program-DXBwJV7h.mjs → program-AR0qlYRg.mjs} +334 -78
- package/dist/program-AR0qlYRg.mjs.map +1 -0
- package/dist/query-feedback-CGcEiGtY.mjs +3 -0
- package/dist/{query-feedback-BV4CcxqS.mjs → query-feedback-DZfjI34w.mjs} +1 -1
- package/dist/{query-feedback-BV4CcxqS.mjs.map → query-feedback-DZfjI34w.mjs.map} +1 -1
- package/dist/router-CAtyVQud.mjs +3 -0
- package/dist/{router-DcHKnEPa.mjs → router-DHracTUC.mjs} +1 -1
- package/dist/{router-DcHKnEPa.mjs.map → router-DHracTUC.mjs.map} +1 -1
- package/dist/server-BOuAOj9b.mjs +386 -0
- package/dist/server-BOuAOj9b.mjs.map +1 -0
- package/dist/skills/Worker/SKILL.md +19 -1
- package/dist/{sources-kLnQsNrW.mjs → sources-ju6AA7lL.mjs} +1 -1
- package/dist/{sources-kLnQsNrW.mjs.map → sources-ju6AA7lL.mjs.map} +1 -1
- package/dist/{sqlite-BenGr3UP.mjs → sqlite-kFZeWCJ2.mjs} +1 -1
- package/dist/{sqlite-BenGr3UP.mjs.map → sqlite-kFZeWCJ2.mjs.map} +1 -1
- package/dist/{state-Ca9F_sZc.mjs → state-DH_mp5Xe.mjs} +1 -1
- package/dist/{state-CAeyOdfq.mjs → state-ahFAbD8b.mjs} +1 -1
- package/dist/{state-CAeyOdfq.mjs.map → state-ahFAbD8b.mjs.map} +1 -1
- package/dist/{themes-BI4GMRP9.mjs → themes-DqhNUUQk.mjs} +1 -1
- package/dist/{themes-BI4GMRP9.mjs.map → themes-DqhNUUQk.mjs.map} +1 -1
- package/dist/{tools-DGcB3o_S.mjs → tools-CMlHa9lZ.mjs} +14 -14
- package/dist/{tools-DGcB3o_S.mjs.map → tools-CMlHa9lZ.mjs.map} +1 -1
- package/dist/{tools-Bp7hj6OW.mjs → tools-COna9vZR.mjs} +1 -1
- package/dist/{trace-bobARFEX.mjs → trace-DTP6k4B_.mjs} +1 -1
- package/dist/{trace-bobARFEX.mjs.map → trace-DTP6k4B_.mjs.map} +1 -1
- package/dist/{vault-indexer-C3OfXTNF.mjs → vault-indexer-YMH22mLU.mjs} +1 -1
- package/dist/{vault-indexer-C3OfXTNF.mjs.map → vault-indexer-YMH22mLU.mjs.map} +1 -1
- package/dist/{work-queue-worker-R7UGIag_.mjs → work-queue-worker-B3nl8yyn.mjs} +23 -26
- package/dist/work-queue-worker-B3nl8yyn.mjs.map +1 -0
- package/dist/work-queue-worker-BM1GcAAq.mjs +14 -0
- package/dist/{zettelkasten-m5QPtb-L.mjs → zettelkasten-DDvKRm2V.mjs} +3 -3
- package/dist/{zettelkasten-m5QPtb-L.mjs.map → zettelkasten-DDvKRm2V.mjs.map} +1 -1
- package/docs/commands/README.md +5 -2
- package/docs/commands/worker.md +66 -5
- package/docs/images/provider-abstraction-live.png +0 -0
- package/docs/images/workers.png +0 -0
- package/docs/launcher-independence.md +70 -0
- package/docs/provider-abstraction.md +87 -0
- package/docs/provider-independence-details.md +330 -0
- package/docs/provider-independence.md +75 -0
- package/docs/worker.md +72 -11
- package/package.json +1 -1
- package/scripts/build-hooks.mjs +6 -1
- package/scripts/build-skill-stubs.mjs +17 -4
- package/src/hooks/ts/lib/context-fill.test.ts +158 -4
- package/src/hooks/ts/lib/context-fill.ts +102 -35
- package/statusline-command.sh +120 -21
- package/dist/chain-CTtHligI.mjs.map +0 -1
- package/dist/config-B64vFg14.mjs.map +0 -1
- package/dist/context-handover-cache-BpUojjsi.mjs.map +0 -1
- package/dist/daemon-CmHHmKpg.mjs +0 -20
- package/dist/detector-DO730Zq0.mjs +0 -5
- package/dist/factory-BD-np0Vd.mjs +0 -3
- package/dist/main-resolver-D6IImXvF.mjs +0 -4
- package/dist/main-resolver-DlaLOFBA.mjs.map +0 -1
- package/dist/program-DXBwJV7h.mjs.map +0 -1
- package/dist/providers-FYkZjn_C.mjs.map +0 -1
- package/dist/query-feedback-DSVyHtrG.mjs +0 -3
- package/dist/router-Bk77E7hj.mjs +0 -3
- package/dist/runtime-paths-rni52zHX.mjs +0 -50
- package/dist/runtime-paths-rni52zHX.mjs.map +0 -1
- package/dist/work-queue-worker-DW8lz-Oo.mjs +0 -11
- package/dist/work-queue-worker-R7UGIag_.mjs.map +0 -1
|
@@ -132,6 +132,7 @@ var CONFIG_DIR = join(homedir(), ".config", "pai");
|
|
|
132
132
|
var CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
133
133
|
|
|
134
134
|
// src/workers/config.ts
|
|
135
|
+
var MODEL_TIERS = ["haiku", "sonnet", "opus"];
|
|
135
136
|
var PROVIDER_TAGS = [
|
|
136
137
|
"code",
|
|
137
138
|
"vision",
|
|
@@ -140,6 +141,10 @@ var PROVIDER_TAGS = [
|
|
|
140
141
|
"fast",
|
|
141
142
|
"reasoning"
|
|
142
143
|
];
|
|
144
|
+
var MODEL_CAPABILITIES = ["default", "fast", "image"];
|
|
145
|
+
function isModelCapability(v) {
|
|
146
|
+
return MODEL_CAPABILITIES.includes(v);
|
|
147
|
+
}
|
|
143
148
|
var DEFAULT_LOG_DIR = "~/.claude/logs/workers";
|
|
144
149
|
var DEFAULT_PANE = {
|
|
145
150
|
enabled: true,
|
|
@@ -168,7 +173,8 @@ function defaultWorkersConfig() {
|
|
|
168
173
|
pane: { ...DEFAULT_PANE },
|
|
169
174
|
logDir: DEFAULT_LOG_DIR,
|
|
170
175
|
routing: { ...DEFAULT_ROUTING2, order: [] },
|
|
171
|
-
tree: { ...DEFAULT_TREE }
|
|
176
|
+
tree: { ...DEFAULT_TREE },
|
|
177
|
+
fallback: null
|
|
172
178
|
};
|
|
173
179
|
}
|
|
174
180
|
var WorkersConfigError = class extends Error {
|
|
@@ -200,7 +206,35 @@ function parseProvider(name, raw) {
|
|
|
200
206
|
const m = modelsRaw;
|
|
201
207
|
const defaultModel = str(m.default);
|
|
202
208
|
if (!defaultModel) bad(`.providers.${name}.models.default`, "is required");
|
|
203
|
-
const
|
|
209
|
+
const models = { default: defaultModel };
|
|
210
|
+
for (const key of Object.keys(m)) {
|
|
211
|
+
if (key === "default") continue;
|
|
212
|
+
if (!isModelCapability(key)) {
|
|
213
|
+
bad(
|
|
214
|
+
`.providers.${name}.models.${key}`,
|
|
215
|
+
`"${key}" is not a model capability (from: ${MODEL_CAPABILITIES.join(", ")})`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
const id = str(m[key]);
|
|
219
|
+
if (!id) bad(`.providers.${name}.models.${key}`, "must be a non-empty model id");
|
|
220
|
+
models[key] = id;
|
|
221
|
+
}
|
|
222
|
+
let modelTiers;
|
|
223
|
+
if (p.modelTiers !== void 0) {
|
|
224
|
+
if (typeof p.modelTiers !== "object" || p.modelTiers === null || Array.isArray(p.modelTiers)) {
|
|
225
|
+
bad(`.providers.${name}.modelTiers`, "must be an object of model id \u2192 haiku | sonnet | opus");
|
|
226
|
+
}
|
|
227
|
+
modelTiers = {};
|
|
228
|
+
for (const [id, tier] of Object.entries(p.modelTiers)) {
|
|
229
|
+
if (typeof tier !== "string" || !MODEL_TIERS.includes(tier)) {
|
|
230
|
+
bad(
|
|
231
|
+
`.providers.${name}.modelTiers.${id}`,
|
|
232
|
+
`must be "haiku", "sonnet" or "opus" (got ${JSON.stringify(tier)})`
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
modelTiers[id] = tier;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
204
238
|
const env = {};
|
|
205
239
|
if (p.env !== void 0) {
|
|
206
240
|
if (typeof p.env !== "object" || p.env === null || Array.isArray(p.env)) {
|
|
@@ -250,7 +284,8 @@ function parseProvider(name, raw) {
|
|
|
250
284
|
protocol,
|
|
251
285
|
baseUrl,
|
|
252
286
|
keyFile,
|
|
253
|
-
models
|
|
287
|
+
models,
|
|
288
|
+
...modelTiers ? { modelTiers } : {},
|
|
254
289
|
env,
|
|
255
290
|
...str(p.note) ? { note: str(p.note) } : {},
|
|
256
291
|
...upstreamUrl ? { upstreamUrl } : {},
|
|
@@ -414,6 +449,39 @@ function parseWorkersConfig(raw) {
|
|
|
414
449
|
const active = w.active === void 0 || w.active === null ? null : str(w.active);
|
|
415
450
|
if (active !== null && active !== "auto" && !(active in providers)) {
|
|
416
451
|
}
|
|
452
|
+
let fallback = null;
|
|
453
|
+
if (w.fallback !== void 0 && w.fallback !== null) {
|
|
454
|
+
if (typeof w.fallback !== "object" || Array.isArray(w.fallback)) {
|
|
455
|
+
bad(".fallback", "must be an object (written by `pai worker fallback on`)");
|
|
456
|
+
}
|
|
457
|
+
const f = w.fallback;
|
|
458
|
+
const provider = str(f.provider);
|
|
459
|
+
if (!provider) bad(".fallback.provider", "is required");
|
|
460
|
+
const savedRaw = f.saved;
|
|
461
|
+
if (typeof savedRaw !== "object" || savedRaw === null || Array.isArray(savedRaw)) {
|
|
462
|
+
bad(".fallback.saved", "must be an object");
|
|
463
|
+
}
|
|
464
|
+
const s = savedRaw;
|
|
465
|
+
if (typeof s.env !== "object" || s.env === null || Array.isArray(s.env)) {
|
|
466
|
+
bad(".fallback.saved.env", "must be an object of env key \u2192 previous value or null");
|
|
467
|
+
}
|
|
468
|
+
const env = {};
|
|
469
|
+
for (const [k, v] of Object.entries(s.env)) {
|
|
470
|
+
env[k] = v === null || typeof v === "string" ? v : null;
|
|
471
|
+
}
|
|
472
|
+
if (s.model !== null && s.model !== void 0 && typeof s.model !== "string") {
|
|
473
|
+
bad(".fallback.saved.model", "must be a string or null");
|
|
474
|
+
}
|
|
475
|
+
fallback = {
|
|
476
|
+
provider,
|
|
477
|
+
saved: {
|
|
478
|
+
env,
|
|
479
|
+
model: typeof s.model === "string" ? s.model : null,
|
|
480
|
+
envExisted: s.envExisted === true
|
|
481
|
+
},
|
|
482
|
+
on: str(f.on) || (/* @__PURE__ */ new Date(0)).toISOString()
|
|
483
|
+
};
|
|
484
|
+
}
|
|
417
485
|
return {
|
|
418
486
|
enabled: w.enabled === void 0 ? d.enabled : w.enabled === true,
|
|
419
487
|
active,
|
|
@@ -423,11 +491,12 @@ function parseWorkersConfig(raw) {
|
|
|
423
491
|
pane,
|
|
424
492
|
logDir: str(w.logDir) || d.logDir,
|
|
425
493
|
routing,
|
|
426
|
-
tree
|
|
494
|
+
tree,
|
|
495
|
+
fallback
|
|
427
496
|
};
|
|
428
497
|
}
|
|
429
|
-
function readWorkersSection() {
|
|
430
|
-
const raw = readJsonStrict(
|
|
498
|
+
function readWorkersSection(path = CONFIG_FILE) {
|
|
499
|
+
const raw = readJsonStrict(path, "~/.config/pai/config.json");
|
|
431
500
|
return { raw, workers: parseWorkersConfig(raw.workers) };
|
|
432
501
|
}
|
|
433
502
|
function expandHome(p) {
|