@tekmidian/pai 0.66.2 → 0.66.4

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 (85) hide show
  1. package/dist/{aibroker-client-CHEEvJZW.mjs → aibroker-client-Ck3p3k_-.mjs} +1 -1
  2. package/dist/{aibroker-client-Dfv7j1Od.mjs → aibroker-client-WCZi_tn-.mjs} +2 -2
  3. package/dist/{aibroker-client-Dfv7j1Od.mjs.map → aibroker-client-WCZi_tn-.mjs.map} +1 -1
  4. package/dist/{chain-D5876UQX.mjs → chain-BhPwBDXB.mjs} +3 -3
  5. package/dist/{chain-D5876UQX.mjs.map → chain-BhPwBDXB.mjs.map} +1 -1
  6. package/dist/cli/index.mjs +13 -13
  7. package/dist/cli/program.mjs +13 -13
  8. package/dist/{config-DKIA7wgF.mjs → config-CnsDMETf.mjs} +1 -1
  9. package/dist/{config-C-LiGlop.mjs → config-Ddc4DIPk.mjs} +5 -3
  10. package/dist/config-Ddc4DIPk.mjs.map +1 -0
  11. package/dist/{context-handover-cache-9PGvXRIw.mjs → context-handover-cache-BbCYQUGo.mjs} +244 -10
  12. package/dist/context-handover-cache-BbCYQUGo.mjs.map +1 -0
  13. package/dist/daemon/index.mjs +11 -11
  14. package/dist/{daemon-BUgNvMUh.mjs → daemon-DzXOfieK.mjs} +37 -18
  15. package/dist/daemon-DzXOfieK.mjs.map +1 -0
  16. package/dist/daemon-UJtRscyO.mjs +18 -0
  17. package/dist/daemon-mcp/index.mjs +9 -9
  18. package/dist/{embeddings-CEBGrzwu.mjs → embeddings-D0WOQpYR.mjs} +1 -1
  19. package/dist/{embeddings-DOLZnT1X.mjs → embeddings-DMVzpvRZ.mjs} +18 -9
  20. package/dist/embeddings-DMVzpvRZ.mjs.map +1 -0
  21. package/dist/{factory-Ypf8r0fK.mjs → factory-CXFHwvcv.mjs} +5 -5
  22. package/dist/{factory-Ypf8r0fK.mjs.map → factory-CXFHwvcv.mjs.map} +1 -1
  23. package/dist/{factory-DrBg24UT.mjs → factory-CnKsU6zX.mjs} +4 -4
  24. package/dist/{fallback-D51R4shY.mjs → fallback-CoooFqyA.mjs} +4 -4
  25. package/dist/{fallback-D51R4shY.mjs.map → fallback-CoooFqyA.mjs.map} +1 -1
  26. package/dist/hooks/block-sleep-poll.mjs +6 -5
  27. package/dist/hooks/block-sleep-poll.mjs.map +3 -3
  28. package/dist/hooks/context-compression-hook.mjs +1 -0
  29. package/dist/hooks/context-compression-hook.mjs.map +2 -2
  30. package/dist/hooks/load-project-context.mjs +6 -5
  31. package/dist/hooks/load-project-context.mjs.map +3 -3
  32. package/dist/hooks/post-compact-inject.mjs +6 -5
  33. package/dist/hooks/post-compact-inject.mjs.map +3 -3
  34. package/dist/hooks/route-agents-to-worker.mjs +6 -5
  35. package/dist/hooks/route-agents-to-worker.mjs.map +3 -3
  36. package/dist/hooks/security-validator.mjs +1 -0
  37. package/dist/hooks/security-validator.mjs.map +2 -2
  38. package/dist/hooks/whisper-rules.mjs +1 -0
  39. package/dist/hooks/whisper-rules.mjs.map +2 -2
  40. package/dist/hooks/worker-guard.mjs +6 -5
  41. package/dist/hooks/worker-guard.mjs.map +3 -3
  42. package/dist/hooks/worker-proxy.mjs +6 -5
  43. package/dist/hooks/worker-proxy.mjs.map +3 -3
  44. package/dist/hooks/worker-status-line.mjs +6 -5
  45. package/dist/hooks/worker-status-line.mjs.map +3 -3
  46. package/dist/hooks/worker-supervision.mjs +6 -5
  47. package/dist/hooks/worker-supervision.mjs.map +3 -3
  48. package/dist/{ipc-client-BLYX51nG.mjs → ipc-client-DkxRay-o.mjs} +2 -2
  49. package/dist/{ipc-client-BLYX51nG.mjs.map → ipc-client-DkxRay-o.mjs.map} +1 -1
  50. package/dist/main-resolver-DrHtx8iW.mjs +7 -0
  51. package/dist/{main-resolver-kVkMJZUD.mjs → main-resolver-SfGGg1DB.mjs} +6 -6
  52. package/dist/{main-resolver-kVkMJZUD.mjs.map → main-resolver-SfGGg1DB.mjs.map} +1 -1
  53. package/dist/{pai-home-Cm9rcJgX.mjs → pai-home-UncxWxlX.mjs} +1 -1
  54. package/dist/{pai-home-Cm9rcJgX.mjs.map → pai-home-UncxWxlX.mjs.map} +1 -1
  55. package/dist/{planner-D5yt0EfA.mjs → planner-C43lzcw5.mjs} +8 -8
  56. package/dist/{planner-D5yt0EfA.mjs.map → planner-C43lzcw5.mjs.map} +1 -1
  57. package/dist/postgres-B2BEBT-J.mjs +5 -0
  58. package/dist/{postgres-D3xc2RB4.mjs → postgres-BxmyQHoA.mjs} +53 -5
  59. package/dist/postgres-BxmyQHoA.mjs.map +1 -0
  60. package/dist/{program-DIXRtAFy.mjs → program-DB-hoyfW.mjs} +124 -172
  61. package/dist/program-DB-hoyfW.mjs.map +1 -0
  62. package/dist/{query-feedback-B7FYE4JR.mjs → query-feedback-BPdapXKd.mjs} +2 -2
  63. package/dist/{query-feedback-B7FYE4JR.mjs.map → query-feedback-BPdapXKd.mjs.map} +1 -1
  64. package/dist/{run-env-Bnmf6bRI.mjs → run-env-CQRnxNht.mjs} +3 -3
  65. package/dist/{run-env-Bnmf6bRI.mjs.map → run-env-CQRnxNht.mjs.map} +1 -1
  66. package/dist/{run-CLYTOm0x.mjs → run-wi5NEkJd.mjs} +118 -9
  67. package/dist/run-wi5NEkJd.mjs.map +1 -0
  68. package/dist/{runtime-paths-D3FKAm69.mjs → runtime-paths-Bw3Jk8qJ.mjs} +4 -2
  69. package/dist/runtime-paths-Bw3Jk8qJ.mjs.map +1 -0
  70. package/dist/{zettelkasten-BhZMvmoK.mjs → zettelkasten-BRIaHzFm.mjs} +2 -2
  71. package/dist/{zettelkasten-BhZMvmoK.mjs.map → zettelkasten-BRIaHzFm.mjs.map} +1 -1
  72. package/dist/{zettelkasten-BwV1pluL.mjs → zettelkasten-G0-ZTybr.mjs} +3 -3
  73. package/docs/commands/memory.md +2 -0
  74. package/package.json +1 -1
  75. package/dist/config-C-LiGlop.mjs.map +0 -1
  76. package/dist/context-handover-cache-9PGvXRIw.mjs.map +0 -1
  77. package/dist/daemon-BUgNvMUh.mjs.map +0 -1
  78. package/dist/daemon-DL0eglMJ.mjs +0 -18
  79. package/dist/embeddings-DOLZnT1X.mjs.map +0 -1
  80. package/dist/main-resolver-BYgP86C1.mjs +0 -7
  81. package/dist/postgres-BmLr0MUm.mjs +0 -5
  82. package/dist/postgres-D3xc2RB4.mjs.map +0 -1
  83. package/dist/program-DIXRtAFy.mjs.map +0 -1
  84. package/dist/run-CLYTOm0x.mjs.map +0 -1
  85. package/dist/runtime-paths-D3FKAm69.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import { i as getRegistryBackend } from "./factory-Ypf8r0fK.mjs";
2
- import { a as paiHomePath, o as resolvePaiFile } from "./pai-home-Cm9rcJgX.mjs";
3
- import { A as resolveProviderKey, D as readWorkersSection, E as providerKeyPath, O as resolveCapability, T as providerCostTier, _ as classModelCapability, b as getProviderOrNative, f as NATIVE_ANTHROPIC_MODELS, g as assertProviderRunnable, h as WorkersConfigError, k as resolveModelCapability, m as WORKER_CLASSES, n as claudeCommand, o as DEFAULT_LOG_DIR, r as ANTHROPIC_NATIVE, t as buildRunEnv, x as isModelCapability, y as expandHome } from "./run-env-Bnmf6bRI.mjs";
1
+ import { i as getRegistryBackend } from "./factory-CXFHwvcv.mjs";
2
+ import { a as paiHomePath, o as resolvePaiFile } from "./pai-home-UncxWxlX.mjs";
3
+ import { A as resolveProviderKey, D as readWorkersSection, E as providerKeyPath, O as resolveCapability, T as providerCostTier, _ as classModelCapability, b as getProviderOrNative, f as NATIVE_ANTHROPIC_MODELS, g as assertProviderRunnable, h as WorkersConfigError, k as resolveModelCapability, m as WORKER_CLASSES, n as claudeCommand, o as DEFAULT_LOG_DIR, r as ANTHROPIC_NATIVE, t as buildRunEnv, x as isModelCapability, y as expandHome } from "./run-env-CQRnxNht.mjs";
4
4
  import { appendFileSync, closeSync, existsSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync, writeSync } from "node:fs";
5
5
  import { homedir, platform, tmpdir } from "node:os";
6
6
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
@@ -1046,6 +1046,109 @@ function ledgerSummary(path, scope, lastN = 15, now = /* @__PURE__ */ new Date()
1046
1046
  };
1047
1047
  }
1048
1048
 
1049
+ //#endregion
1050
+ //#region src/workers/pending.ts
1051
+ /**
1052
+ * Pending worker results: finished workers whose worktree branch still holds
1053
+ * work that never reached the repo (commits not in HEAD, or uncommitted
1054
+ * files). Surfaced by `pai worker ps/pending`, the SessionStart hook, the
1055
+ * status line and the prepublish gate so an unmerged fix cannot be forgotten.
1056
+ */
1057
+ /** Stale after this long: `pai worker gc` (archive) instead of merge. */
1058
+ const STALE_HOURS = 24;
1059
+ function toplevel(dir) {
1060
+ try {
1061
+ return git(dir, ["rev-parse", "--show-toplevel"]);
1062
+ } catch {
1063
+ return null;
1064
+ }
1065
+ }
1066
+ function fmtAge(ms) {
1067
+ const h = Math.floor(ms / 36e5);
1068
+ return h >= 48 ? `${Math.floor(h / 24)}d` : h >= 1 ? `${h}h` : `${Math.floor(ms / 6e4)}m`;
1069
+ }
1070
+ /** Finished workers with unmerged work; `repoRoot` limits to one repo, else every repo. */
1071
+ function pendingResults(logDir, repoRoot, now = Date.now()) {
1072
+ const want = repoRoot ? toplevel(repoRoot) : null;
1073
+ if (repoRoot && !want) return [];
1074
+ const out = [];
1075
+ for (const st of loadStatuses(logDir)) {
1076
+ if (st.archived || st.merged || isLive(st)) continue;
1077
+ if (!st.worktreeDir || !existsSync(st.worktreeDir)) continue;
1078
+ const repo = toplevel(st.cwd);
1079
+ if (!repo || want && repo !== want) continue;
1080
+ let commits = 0;
1081
+ let dirty = 0;
1082
+ try {
1083
+ if (st.branch) commits = git(repo, [
1084
+ "cherry",
1085
+ "HEAD",
1086
+ `refs/heads/${st.branch}`
1087
+ ]).split("\n").filter((l) => l.startsWith("+")).length;
1088
+ dirty = uncommittedPaths(st.worktreeDir).filter((p) => !/(^|\/)node_modules(\/|$)/.test(p)).length;
1089
+ } catch {
1090
+ continue;
1091
+ }
1092
+ if (!commits && !dirty) continue;
1093
+ let ageMs = 0;
1094
+ try {
1095
+ ageMs = Math.max(0, now - statSync(statusPath(logDir, st.id)).mtimeMs);
1096
+ } catch {}
1097
+ out.push({
1098
+ id: st.id,
1099
+ label: st.label,
1100
+ repo,
1101
+ ageMs,
1102
+ age: fmtAge(ageMs),
1103
+ commits,
1104
+ dirty
1105
+ });
1106
+ }
1107
+ return out;
1108
+ }
1109
+ /** One human line per result, with the exact next command. */
1110
+ function formatPending(results, showRepo = false) {
1111
+ return results.map((r) => {
1112
+ const next = r.ageMs > STALE_HOURS * 36e5 ? "pai worker gc" : `pai worker merge ${r.id}`;
1113
+ const repo = showRepo ? ` ${r.repo}` : "";
1114
+ return `${r.id} ${r.age} ${r.commits} commit(s), ${r.dirty} dirty ${r.label}${repo} -> ${next}`;
1115
+ }).join("\n");
1116
+ }
1117
+ /**
1118
+ * Release gate: exit code and message for `pai worker pending --gate`.
1119
+ * PAI_ALLOW_PENDING=1 overrides.
1120
+ */
1121
+ function pendingGate(results, env = process.env) {
1122
+ if (!results.length || env.PAI_ALLOW_PENDING === "1") return {
1123
+ code: 0,
1124
+ message: ""
1125
+ };
1126
+ return {
1127
+ code: 1,
1128
+ message: `${results.length} unmerged worker result(s) in this repo — merge or discard before publishing:\n${formatPending(results)}\nOverride deliberately with PAI_ALLOW_PENDING=1.`
1129
+ };
1130
+ }
1131
+ /** Invalidate pending cache entries for a repo and its subdirectories. */
1132
+ function invalidatePendingCache(logDir, repoRoot) {
1133
+ const file = join(logDir, "pending-cache.json");
1134
+ let cache = {};
1135
+ try {
1136
+ cache = JSON.parse(readFileSync(file, "utf8"));
1137
+ } catch {
1138
+ return;
1139
+ }
1140
+ const resolved = repoRoot.endsWith("/") ? repoRoot : `${repoRoot}/`;
1141
+ let changed = false;
1142
+ for (const key of Object.keys(cache)) if (key === repoRoot || key.startsWith(resolved)) {
1143
+ delete cache[key];
1144
+ changed = true;
1145
+ }
1146
+ if (!changed) return;
1147
+ try {
1148
+ writeFileSync(file, JSON.stringify(cache));
1149
+ } catch {}
1150
+ }
1151
+
1049
1152
  //#endregion
1050
1153
  //#region src/workers/worktree.ts
1051
1154
  /**
@@ -1290,6 +1393,7 @@ function recordWorktree(logDir, status, info, ok) {
1290
1393
  s.worktreeSnapshot = null;
1291
1394
  }
1292
1395
  saveStatus(logDir, s);
1396
+ invalidatePendingCache(logDir, s.cwd);
1293
1397
  return s;
1294
1398
  }
1295
1399
  function safeCommitsSince(dir, base) {
@@ -1824,6 +1928,7 @@ function mergeWorker(logDir, id, opts = {}) {
1824
1928
  ...st,
1825
1929
  merged: true
1826
1930
  });
1931
+ invalidatePendingCache(logDir, st.cwd);
1827
1932
  const base = `merged ${st.branch} into ${st.cwd} (worktree removed${branchGone ? ", branch deleted" : "; branch kept: git refused -d"})`;
1828
1933
  const notes = [];
1829
1934
  if (salvage.committed.length) notes.push(`salvaged ${salvage.committed.length} uncommitted change(s): ${salvage.committed.join(", ")}`);
@@ -1854,6 +1959,7 @@ function discardWorker(logDir, id) {
1854
1959
  commits: null,
1855
1960
  merged: false
1856
1961
  });
1962
+ invalidatePendingCache(logDir, st.cwd);
1857
1963
  return `discarded worker ${id}: worktree removed${branchGone ? `, branch ${st.branch} deleted` : ""}`;
1858
1964
  }
1859
1965
  function mustHaveBranch(logDir, id) {
@@ -2008,9 +2114,12 @@ function gcWorktrees(logDir, olderThanHours = 24, dryRun = false, now = Date.now
2008
2114
  }
2009
2115
  archive(ent.name, dir, null);
2010
2116
  }
2011
- if (!dryRun) for (const repo of new Set(loadStatuses(logDir).map((s) => s.cwd))) try {
2012
- git(repo, ["worktree", "prune"]);
2013
- } catch {}
2117
+ if (!dryRun) for (const repo of new Set(loadStatuses(logDir).map((s) => s.cwd))) {
2118
+ try {
2119
+ git(repo, ["worktree", "prune"]);
2120
+ } catch {}
2121
+ invalidatePendingCache(logDir, repo);
2122
+ }
2014
2123
  return out;
2015
2124
  }
2016
2125
  /** Run `gcWorktrees` at most once per `everyMin` minutes (stamp file in the logDir). */
@@ -4472,7 +4581,7 @@ async function runWorker(opts) {
4472
4581
  if (gc?.length) process.stderr.write(`pai worker: archived ${gc.length} leftover worktree(s) (pai worker gc)\n`);
4473
4582
  } catch {}
4474
4583
  if (opts.className === "plan" && !opts._planner) {
4475
- const { runPlanner } = await import("./planner-D5yt0EfA.mjs");
4584
+ const { runPlanner } = await import("./planner-C43lzcw5.mjs");
4476
4585
  return runPlanner(opts);
4477
4586
  }
4478
4587
  const parent = launchParent(opts.parent);
@@ -5731,5 +5840,5 @@ function resultFromOutput(out) {
5731
5840
  }
5732
5841
 
5733
5842
  //#endregion
5734
- export { longInlinePromptHint as $, git as A, contextLabel as B, itermUuid as C, workerInScope as D, sessionTag as E, appendLedger as F, loadStatus as G, elapsedOf as H, ledgerSummary as I, nowStamp as J, loadStatuses as K, UNLABELED as L, uncommittedPaths as M, verifyWorker as N, discardWorker as O, worktreesDir as P, waitForTerminalStatus as Q, ageOf as R, itermForClaudeSession as S, sessionMapPath as T, isChatPane as U, contextPercent as V, isLive as W, saveStatus as X, ownsPid as Y, setWorkerLabel as Z, markControlsHeld as _, expandMcpNames as _t, deadlineLabel as a, clearCooldown as at, requestKill as b, handoffFromInside as c, resolveTarget as ct, workerDepth as d, ledgerPath as dt, parseRunnerArgs as et, checkPaneForWorker as f, statusPath as ft, clickrControlsArgv as g, describeMcp as gt, openPaneForWorker as h, projectLaunchConfig as ht, usageContextTokens as i, stopProxy as it, mergeWorker as j, gcWorktrees as k, readInbox as l, ensureNoMcpConfig as lt, openFollowPane as m, pinNotices as mt, runWorker as n, DEFAULT_PROXY_PORT as nt, parseWorkerReport as o, probeQuota as ot, closeEndedPanes as p, workersLogDir as pt, newWorkerId as q, testProvider as r, ensureProxyRunning as rt, renderReport as s, quotaSkipThreshold as st, printResult as t, shortText as tt, sayToWorker as u, eventsPath as ut, callerDescription as v, resolveSession as w, currentTabKey as x, endLabel as y, alive as z };
5735
- //# sourceMappingURL=run-CLYTOm0x.mjs.map
5843
+ export { setWorkerLabel as $, git as A, ageOf as B, itermUuid as C, workerInScope as D, sessionTag as E, pendingGate as F, isChatPane as G, contextLabel as H, pendingResults as I, loadStatuses as J, isLive as K, appendLedger as L, verifyWorker as M, worktreesDir as N, discardWorker as O, formatPending as P, saveStatus as Q, ledgerSummary as R, itermForClaudeSession as S, sessionMapPath as T, contextPercent as U, alive as V, elapsedOf as W, nowStamp as X, newWorkerId as Y, ownsPid as Z, markControlsHeld as _, describeMcp as _t, deadlineLabel as a, ensureProxyRunning as at, requestKill as b, handoffFromInside as c, probeQuota as ct, workerDepth as d, ensureNoMcpConfig as dt, waitForTerminalStatus as et, checkPaneForWorker as f, eventsPath as ft, clickrControlsArgv as g, projectLaunchConfig as gt, openPaneForWorker as h, pinNotices as ht, usageContextTokens as i, DEFAULT_PROXY_PORT as it, mergeWorker as j, gcWorktrees as k, readInbox as l, quotaSkipThreshold as lt, openFollowPane as m, workersLogDir as mt, runWorker as n, parseRunnerArgs as nt, parseWorkerReport as o, stopProxy as ot, closeEndedPanes as p, ledgerPath as pt, loadStatus as q, testProvider as r, shortText as rt, renderReport as s, clearCooldown as st, printResult as t, longInlinePromptHint as tt, sayToWorker as u, resolveTarget as ut, callerDescription as v, expandMcpNames as vt, resolveSession as w, currentTabKey as x, endLabel as y, UNLABELED as z };
5844
+ //# sourceMappingURL=run-wi5NEkJd.mjs.map