@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.
Files changed (126) hide show
  1. package/README.md +41 -0
  2. package/dist/{auto-route-BlWOWT4z.mjs → auto-route-BwzmlW3W.mjs} +2 -2
  3. package/dist/{auto-route-BlWOWT4z.mjs.map → auto-route-BwzmlW3W.mjs.map} +1 -1
  4. package/dist/{chain-CTtHligI.mjs → chain-DhVHVnmT.mjs} +263 -791
  5. package/dist/chain-DhVHVnmT.mjs.map +1 -0
  6. package/dist/cli/index.mjs +10 -8
  7. package/dist/cli/index.mjs.map +1 -1
  8. package/dist/cli/program.mjs +10 -8
  9. package/dist/{clusters-wlK0w41E.mjs → clusters-DRHhfli9.mjs} +1 -1
  10. package/dist/{clusters-wlK0w41E.mjs.map → clusters-DRHhfli9.mjs.map} +1 -1
  11. package/dist/{config-B64vFg14.mjs → config-D1G9IFpn.mjs} +50 -3
  12. package/dist/config-D1G9IFpn.mjs.map +1 -0
  13. package/dist/{config-C_ErGddD.mjs → config-DD52BPB-.mjs} +1 -1
  14. package/dist/config-Dl8lT4Lu.mjs +527 -0
  15. package/dist/config-Dl8lT4Lu.mjs.map +1 -0
  16. package/dist/{context-handover-cache-BpUojjsi.mjs → context-handover-cache-C6_rs7JT.mjs} +112 -24
  17. package/dist/context-handover-cache-C6_rs7JT.mjs.map +1 -0
  18. package/dist/daemon/index.mjs +12 -10
  19. package/dist/daemon/index.mjs.map +1 -1
  20. package/dist/daemon-BSL9sXxm.mjs +22 -0
  21. package/dist/{daemon-CTkN_Vn8.mjs → daemon-CpdVUnl_.mjs} +26 -26
  22. package/dist/{daemon-CTkN_Vn8.mjs.map → daemon-CpdVUnl_.mjs.map} +1 -1
  23. package/dist/daemon-mcp/index.mjs +127 -6
  24. package/dist/daemon-mcp/index.mjs.map +1 -1
  25. package/dist/detector-BLVOCiJ_.mjs +5 -0
  26. package/dist/{detector-Bwk_4Pk4.mjs → detector-smpCm7ku.mjs} +1 -1
  27. package/dist/{detector-Bwk_4Pk4.mjs.map → detector-smpCm7ku.mjs.map} +1 -1
  28. package/dist/{factory-A9x-T2Kg.mjs → factory-Bc5EyN54.mjs} +7 -7
  29. package/dist/{factory-A9x-T2Kg.mjs.map → factory-Bc5EyN54.mjs.map} +1 -1
  30. package/dist/factory-C7ua_3ik.mjs +3 -0
  31. package/dist/{providers-FYkZjn_C.mjs → fallback-CdXv-Np0.mjs} +411 -51
  32. package/dist/fallback-CdXv-Np0.mjs.map +1 -0
  33. package/dist/hooks/context-compression-hook.mjs +136 -22
  34. package/dist/hooks/context-compression-hook.mjs.map +4 -4
  35. package/dist/hooks/post-compact-inject.mjs +98 -7
  36. package/dist/hooks/post-compact-inject.mjs.map +4 -4
  37. package/dist/hooks/route-agents-to-worker.mjs +75 -6
  38. package/dist/hooks/route-agents-to-worker.mjs.map +2 -2
  39. package/dist/hooks/worker-proxy.mjs +75 -6
  40. package/dist/hooks/worker-proxy.mjs.map +2 -2
  41. package/dist/hooks/worker-status-line.mjs +149 -90
  42. package/dist/hooks/worker-status-line.mjs.map +4 -4
  43. package/dist/{indexer-backend-TG64CCQC.mjs → indexer-backend-rohVVKrA.mjs} +1 -1
  44. package/dist/{indexer-backend-TG64CCQC.mjs.map → indexer-backend-rohVVKrA.mjs.map} +1 -1
  45. package/dist/{ipc-client-BmypMNYk.mjs → ipc-client-C7AVpsyv.mjs} +2 -2
  46. package/dist/{ipc-client-BmypMNYk.mjs.map → ipc-client-C7AVpsyv.mjs.map} +1 -1
  47. package/dist/{kg-entity-r8duqhi9.mjs → kg-entity-DbOMPdF9.mjs} +1 -1
  48. package/dist/{kg-entity-r8duqhi9.mjs.map → kg-entity-DbOMPdF9.mjs.map} +1 -1
  49. package/dist/{latent-ideas-B7wq75Pt.mjs → latent-ideas-iNp5s55R.mjs} +2 -2
  50. package/dist/{latent-ideas-B7wq75Pt.mjs.map → latent-ideas-iNp5s55R.mjs.map} +1 -1
  51. package/dist/{link-boost-HkG7JWZR.mjs → link-boost-NNzADHX_.mjs} +1 -1
  52. package/dist/{link-boost-HkG7JWZR.mjs.map → link-boost-NNzADHX_.mjs.map} +1 -1
  53. package/dist/{main-resolver-DlaLOFBA.mjs → main-resolver-CM1IHbuu.mjs} +78 -75
  54. package/dist/main-resolver-CM1IHbuu.mjs.map +1 -0
  55. package/dist/main-resolver-E5WlilhM.mjs +6 -0
  56. package/dist/{neighborhood-lThN-MaQ.mjs → neighborhood-AGL7oXQ2.mjs} +1 -1
  57. package/dist/{neighborhood-lThN-MaQ.mjs.map → neighborhood-AGL7oXQ2.mjs.map} +1 -1
  58. package/dist/{note-context-b6k0mAKi.mjs → note-context-BHwYpSFf.mjs} +1 -1
  59. package/dist/{note-context-b6k0mAKi.mjs.map → note-context-BHwYpSFf.mjs.map} +1 -1
  60. package/dist/{planner-BDI7bE9B.mjs → planner-Cm3g6fWH.mjs} +5 -3
  61. package/dist/{planner-BDI7bE9B.mjs.map → planner-Cm3g6fWH.mjs.map} +1 -1
  62. package/dist/{postgres-mW1n7Vi1.mjs → postgres-Dwxe290H.mjs} +1 -1
  63. package/dist/{postgres-mW1n7Vi1.mjs.map → postgres-Dwxe290H.mjs.map} +1 -1
  64. package/dist/{program-DXBwJV7h.mjs → program-AR0qlYRg.mjs} +334 -78
  65. package/dist/program-AR0qlYRg.mjs.map +1 -0
  66. package/dist/query-feedback-CGcEiGtY.mjs +3 -0
  67. package/dist/{query-feedback-BV4CcxqS.mjs → query-feedback-DZfjI34w.mjs} +1 -1
  68. package/dist/{query-feedback-BV4CcxqS.mjs.map → query-feedback-DZfjI34w.mjs.map} +1 -1
  69. package/dist/router-CAtyVQud.mjs +3 -0
  70. package/dist/{router-DcHKnEPa.mjs → router-DHracTUC.mjs} +1 -1
  71. package/dist/{router-DcHKnEPa.mjs.map → router-DHracTUC.mjs.map} +1 -1
  72. package/dist/server-BOuAOj9b.mjs +386 -0
  73. package/dist/server-BOuAOj9b.mjs.map +1 -0
  74. package/dist/skills/Worker/SKILL.md +19 -1
  75. package/dist/{sources-kLnQsNrW.mjs → sources-ju6AA7lL.mjs} +1 -1
  76. package/dist/{sources-kLnQsNrW.mjs.map → sources-ju6AA7lL.mjs.map} +1 -1
  77. package/dist/{sqlite-BenGr3UP.mjs → sqlite-kFZeWCJ2.mjs} +1 -1
  78. package/dist/{sqlite-BenGr3UP.mjs.map → sqlite-kFZeWCJ2.mjs.map} +1 -1
  79. package/dist/{state-Ca9F_sZc.mjs → state-DH_mp5Xe.mjs} +1 -1
  80. package/dist/{state-CAeyOdfq.mjs → state-ahFAbD8b.mjs} +1 -1
  81. package/dist/{state-CAeyOdfq.mjs.map → state-ahFAbD8b.mjs.map} +1 -1
  82. package/dist/{themes-BI4GMRP9.mjs → themes-DqhNUUQk.mjs} +1 -1
  83. package/dist/{themes-BI4GMRP9.mjs.map → themes-DqhNUUQk.mjs.map} +1 -1
  84. package/dist/{tools-DGcB3o_S.mjs → tools-CMlHa9lZ.mjs} +14 -14
  85. package/dist/{tools-DGcB3o_S.mjs.map → tools-CMlHa9lZ.mjs.map} +1 -1
  86. package/dist/{tools-Bp7hj6OW.mjs → tools-COna9vZR.mjs} +1 -1
  87. package/dist/{trace-bobARFEX.mjs → trace-DTP6k4B_.mjs} +1 -1
  88. package/dist/{trace-bobARFEX.mjs.map → trace-DTP6k4B_.mjs.map} +1 -1
  89. package/dist/{vault-indexer-C3OfXTNF.mjs → vault-indexer-YMH22mLU.mjs} +1 -1
  90. package/dist/{vault-indexer-C3OfXTNF.mjs.map → vault-indexer-YMH22mLU.mjs.map} +1 -1
  91. package/dist/{work-queue-worker-R7UGIag_.mjs → work-queue-worker-B3nl8yyn.mjs} +23 -26
  92. package/dist/work-queue-worker-B3nl8yyn.mjs.map +1 -0
  93. package/dist/work-queue-worker-BM1GcAAq.mjs +14 -0
  94. package/dist/{zettelkasten-m5QPtb-L.mjs → zettelkasten-DDvKRm2V.mjs} +3 -3
  95. package/dist/{zettelkasten-m5QPtb-L.mjs.map → zettelkasten-DDvKRm2V.mjs.map} +1 -1
  96. package/docs/commands/README.md +5 -2
  97. package/docs/commands/worker.md +66 -5
  98. package/docs/images/provider-abstraction-live.png +0 -0
  99. package/docs/images/workers.png +0 -0
  100. package/docs/launcher-independence.md +70 -0
  101. package/docs/provider-abstraction.md +87 -0
  102. package/docs/provider-independence-details.md +330 -0
  103. package/docs/provider-independence.md +75 -0
  104. package/docs/worker.md +72 -11
  105. package/package.json +1 -1
  106. package/scripts/build-hooks.mjs +6 -1
  107. package/scripts/build-skill-stubs.mjs +17 -4
  108. package/src/hooks/ts/lib/context-fill.test.ts +158 -4
  109. package/src/hooks/ts/lib/context-fill.ts +102 -35
  110. package/statusline-command.sh +120 -21
  111. package/dist/chain-CTtHligI.mjs.map +0 -1
  112. package/dist/config-B64vFg14.mjs.map +0 -1
  113. package/dist/context-handover-cache-BpUojjsi.mjs.map +0 -1
  114. package/dist/daemon-CmHHmKpg.mjs +0 -20
  115. package/dist/detector-DO730Zq0.mjs +0 -5
  116. package/dist/factory-BD-np0Vd.mjs +0 -3
  117. package/dist/main-resolver-D6IImXvF.mjs +0 -4
  118. package/dist/main-resolver-DlaLOFBA.mjs.map +0 -1
  119. package/dist/program-DXBwJV7h.mjs.map +0 -1
  120. package/dist/providers-FYkZjn_C.mjs.map +0 -1
  121. package/dist/query-feedback-DSVyHtrG.mjs +0 -3
  122. package/dist/router-Bk77E7hj.mjs +0 -3
  123. package/dist/runtime-paths-rni52zHX.mjs +0 -50
  124. package/dist/runtime-paths-rni52zHX.mjs.map +0 -1
  125. package/dist/work-queue-worker-DW8lz-Oo.mjs +0 -11
  126. 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 fast = m.fast === void 0 ? void 0 : str(m.fast);
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: fast ? { default: defaultModel, fast } : { default: defaultModel },
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(CONFIG_FILE, "~/.config/pai/config.json");
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) {