@tekmidian/pai 0.65.0 → 0.65.2

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 (131) hide show
  1. package/README.md +60 -1065
  2. package/dist/{async-CNn36gm4.mjs → async-C2Bm_Lal.mjs} +2 -2
  3. package/dist/{async-CNn36gm4.mjs.map → async-C2Bm_Lal.mjs.map} +1 -1
  4. package/dist/{auto-route-sLMU-NnM.mjs → auto-route-o0BOsXn7.mjs} +2 -2
  5. package/dist/{auto-route-sLMU-NnM.mjs.map → auto-route-o0BOsXn7.mjs.map} +1 -1
  6. package/dist/{chain-C8QO8gwj.mjs → chain-CT3SI-3z.mjs} +2 -2
  7. package/dist/{chain-C8QO8gwj.mjs.map → chain-CT3SI-3z.mjs.map} +1 -1
  8. package/dist/cli/index.mjs +12 -10
  9. package/dist/cli/index.mjs.map +1 -1
  10. package/dist/cli/program.mjs +10 -10
  11. package/dist/{clusters-PgIUYT_v.mjs → clusters-BCtD3fbe.mjs} +1 -1
  12. package/dist/{clusters-PgIUYT_v.mjs.map → clusters-BCtD3fbe.mjs.map} +1 -1
  13. package/dist/config-BbLFD7Uf.mjs.map +1 -1
  14. package/dist/{context-handover-cache-mGxq2-8f.mjs → context-handover-cache-CRSFdkNi.mjs} +2 -2
  15. package/dist/{context-handover-cache-mGxq2-8f.mjs.map → context-handover-cache-CRSFdkNi.mjs.map} +1 -1
  16. package/dist/daemon/index.mjs +12 -10
  17. package/dist/daemon/index.mjs.map +1 -1
  18. package/dist/daemon-DoTVK9z6.mjs +19 -0
  19. package/dist/{daemon-D2r1AQqE.mjs → daemon-SaPnmoyg.mjs} +23 -23
  20. package/dist/{daemon-D2r1AQqE.mjs.map → daemon-SaPnmoyg.mjs.map} +1 -1
  21. package/dist/daemon-mcp/index.mjs +7 -5
  22. package/dist/daemon-mcp/index.mjs.map +1 -1
  23. package/dist/detector-BEPFsINR.mjs +3 -0
  24. package/dist/{detector-CIHEXKsV.mjs → detector-BRTtAWrM.mjs} +1 -1
  25. package/dist/{detector-CIHEXKsV.mjs.map → detector-BRTtAWrM.mjs.map} +1 -1
  26. package/dist/{embeddings-BbNVXa_0.mjs → embeddings-Bx3q0QOY.mjs} +1 -1
  27. package/dist/{embeddings-BbNVXa_0.mjs.map → embeddings-Bx3q0QOY.mjs.map} +1 -1
  28. package/dist/{embeddings-CDfM63uC.mjs → embeddings-CcscYWwk.mjs} +1 -1
  29. package/dist/env-JNEIrQWg.mjs +14 -0
  30. package/dist/env-JNEIrQWg.mjs.map +1 -0
  31. package/dist/{factory-y36qGegI.mjs → factory-CNpPQQ-5.mjs} +7 -7
  32. package/dist/{factory-y36qGegI.mjs.map → factory-CNpPQQ-5.mjs.map} +1 -1
  33. package/dist/{factory-CaswxuJ0.mjs → factory-DY7x73mE.mjs} +1 -1
  34. package/dist/{fallback-CWDQYmJi.mjs → fallback-vHjFZP0Y.mjs} +2 -2
  35. package/dist/{fallback-CWDQYmJi.mjs.map → fallback-vHjFZP0Y.mjs.map} +1 -1
  36. package/dist/hooks/block-sleep-poll.mjs.map +1 -1
  37. package/dist/hooks/context-compression-hook.mjs.map +1 -1
  38. package/dist/hooks/load-project-context.mjs.map +2 -2
  39. package/dist/hooks/post-compact-inject.mjs.map +1 -1
  40. package/dist/hooks/route-agents-to-worker.mjs.map +1 -1
  41. package/dist/hooks/security-validator.mjs +2 -2
  42. package/dist/hooks/security-validator.mjs.map +1 -1
  43. package/dist/hooks/whisper-rules.mjs.map +1 -1
  44. package/dist/hooks/worker-guard.mjs.map +1 -1
  45. package/dist/hooks/worker-proxy.mjs.map +1 -1
  46. package/dist/hooks/worker-status-line.mjs.map +2 -2
  47. package/dist/hooks/worker-supervision.mjs.map +1 -1
  48. package/dist/{indexer-backend-Cnc7Tf5C.mjs → indexer-backend-DFF2FrYx.mjs} +1 -1
  49. package/dist/{kg-entity-COTUj1ZC.mjs → kg-entity-DCOcsVFD.mjs} +1 -1
  50. package/dist/{kg-entity-COTUj1ZC.mjs.map → kg-entity-DCOcsVFD.mjs.map} +1 -1
  51. package/dist/{latent-ideas-ByvMjVcb.mjs → latent-ideas-wwAXquGe.mjs} +3 -3
  52. package/dist/{latent-ideas-ByvMjVcb.mjs.map → latent-ideas-wwAXquGe.mjs.map} +1 -1
  53. package/dist/{link-boost-UiE-uooT.mjs → link-boost-CnI7UVMJ.mjs} +1 -1
  54. package/dist/{link-boost-UiE-uooT.mjs.map → link-boost-CnI7UVMJ.mjs.map} +1 -1
  55. package/dist/{main-resolver-CDe7DCso.mjs → main-resolver-CKNGux1B.mjs} +8 -8
  56. package/dist/{main-resolver-CDe7DCso.mjs.map → main-resolver-CKNGux1B.mjs.map} +1 -1
  57. package/dist/{main-resolver-DI-A7lSO.mjs → main-resolver-VSM5ytnA.mjs} +1 -1
  58. package/dist/{neighborhood-CvRHlqdR.mjs → neighborhood-2FsmzoxG.mjs} +2 -2
  59. package/dist/{neighborhood-CvRHlqdR.mjs.map → neighborhood-2FsmzoxG.mjs.map} +1 -1
  60. package/dist/{note-context-BrbfUIoP.mjs → note-context-De63k8na.mjs} +1 -1
  61. package/dist/{note-context-BrbfUIoP.mjs.map → note-context-De63k8na.mjs.map} +1 -1
  62. package/dist/{planner-8-shIa8t.mjs → planner-Dzs9-8AS.mjs} +4 -4
  63. package/dist/{planner-8-shIa8t.mjs.map → planner-Dzs9-8AS.mjs.map} +1 -1
  64. package/dist/{postgres-DYtZg7J7.mjs → postgres-Ceqsa64C.mjs} +3 -3
  65. package/dist/{postgres-DYtZg7J7.mjs.map → postgres-Ceqsa64C.mjs.map} +1 -1
  66. package/dist/{program-DiktbiWa.mjs → program-DK0mRRlf.mjs} +81 -59
  67. package/dist/program-DK0mRRlf.mjs.map +1 -0
  68. package/dist/{registry-postgres-DSrkxqfF.mjs → registry-postgres-nOfyBSIW.mjs} +1 -1
  69. package/dist/{registry-postgres-DSrkxqfF.mjs.map → registry-postgres-nOfyBSIW.mjs.map} +1 -1
  70. package/dist/{registry-sqlite-B2436JgX.mjs → registry-sqlite-DrCW1aRK.mjs} +1 -1
  71. package/dist/{registry-sqlite-B2436JgX.mjs.map → registry-sqlite-DrCW1aRK.mjs.map} +1 -1
  72. package/dist/router-CXUGsv85.mjs +3 -0
  73. package/dist/{router-aqLMvNMg.mjs → router-a5G7q8_3.mjs} +1 -1
  74. package/dist/{router-aqLMvNMg.mjs.map → router-a5G7q8_3.mjs.map} +1 -1
  75. package/dist/{run-DUZRSnIT.mjs → run-DMaCpvMW.mjs} +23 -5
  76. package/dist/run-DMaCpvMW.mjs.map +1 -0
  77. package/dist/{session-keepalive-CZUwp5IQ.mjs → session-keepalive-DVZ9-7qg.mjs} +2 -2
  78. package/dist/{session-keepalive-CZUwp5IQ.mjs.map → session-keepalive-DVZ9-7qg.mjs.map} +1 -1
  79. package/dist/skills/Tasks/SKILL.md +1 -1
  80. package/dist/{sources-DX4ElmrE.mjs → sources-CijVso3n.mjs} +1 -1
  81. package/dist/{sources-DX4ElmrE.mjs.map → sources-CijVso3n.mjs.map} +1 -1
  82. package/dist/{sqlite-BrEu3avy.mjs → sqlite-CqsTy6xo.mjs} +3 -3
  83. package/dist/{sqlite-BrEu3avy.mjs.map → sqlite-CqsTy6xo.mjs.map} +1 -1
  84. package/dist/{themes-BgqahYVM.mjs → themes-CTaOj3e1.mjs} +2 -2
  85. package/dist/{themes-BgqahYVM.mjs.map → themes-CTaOj3e1.mjs.map} +1 -1
  86. package/dist/{tools-gMGDIpJ9.mjs → tools-BcOKPBtg.mjs} +16 -16
  87. package/dist/{tools-gMGDIpJ9.mjs.map → tools-BcOKPBtg.mjs.map} +1 -1
  88. package/dist/{tools-BbqQIHPe.mjs → tools-C-_l0o8Z.mjs} +4 -4
  89. package/dist/{trace-CmAB7iJZ.mjs → trace-CtV0RO6n.mjs} +1 -1
  90. package/dist/{trace-CmAB7iJZ.mjs.map → trace-CtV0RO6n.mjs.map} +1 -1
  91. package/dist/{vault-indexer-Ddq51X20.mjs → vault-indexer-BG1sEVyM.mjs} +1 -1
  92. package/dist/{vault-indexer-Ddq51X20.mjs.map → vault-indexer-BG1sEVyM.mjs.map} +1 -1
  93. package/dist/{wakeup-CZw88uXf.mjs → wakeup-D8n33hYV.mjs} +2 -2
  94. package/dist/{wakeup-CZw88uXf.mjs.map → wakeup-D8n33hYV.mjs.map} +1 -1
  95. package/dist/{work-queue-worker-Taba_vcA.mjs → work-queue-worker-D7GHuj2I.mjs} +3 -3
  96. package/dist/{work-queue-worker-DCzfH0d1.mjs → work-queue-worker-DZiEMvBQ.mjs} +3 -3
  97. package/dist/{work-queue-worker-DCzfH0d1.mjs.map → work-queue-worker-DZiEMvBQ.mjs.map} +1 -1
  98. package/dist/{zettelkasten-Dwj67e4p.mjs → zettelkasten-CtGHQWPU.mjs} +3 -3
  99. package/dist/{zettelkasten-Dwj67e4p.mjs.map → zettelkasten-CtGHQWPU.mjs.map} +1 -1
  100. package/docs/auto-compact.md +31 -0
  101. package/docs/budget-advisor.md +48 -0
  102. package/docs/command-reference.md +25 -0
  103. package/docs/companion-projects.md +9 -0
  104. package/docs/context-preservation.md +43 -0
  105. package/docs/how-it-works.md +25 -0
  106. package/docs/install-linux.md +32 -0
  107. package/docs/install.md +56 -0
  108. package/docs/memory.md +96 -0
  109. package/docs/observations.md +58 -0
  110. package/docs/release-history.md +42 -0
  111. package/docs/rules-and-privacy.md +37 -0
  112. package/docs/search.md +169 -0
  113. package/docs/session-management.md +153 -0
  114. package/docs/session-notes.md +64 -0
  115. package/docs/skills.md +45 -0
  116. package/docs/task-bus.md +1 -2
  117. package/docs/use-cases.md +194 -0
  118. package/docs/what-you-can-ask.md +78 -0
  119. package/docs/worker-providers.md +58 -0
  120. package/docs/zettelkasten.md +37 -0
  121. package/package.json +1 -1
  122. package/plugins/productivity/skills/Tasks/SKILL.md +1 -1
  123. package/src/hooks/ts/pre-tool-use/security-validator.test.ts +23 -0
  124. package/src/hooks/ts/pre-tool-use/security-validator.ts +1 -1
  125. package/src/hooks/ts/session-start/load-project-context.ts +1 -1
  126. package/statusline-command.sh +1 -1
  127. package/dist/daemon-CX9JomIJ.mjs +0 -19
  128. package/dist/detector-C3Q7mxQU.mjs +0 -3
  129. package/dist/program-DiktbiWa.mjs.map +0 -1
  130. package/dist/router-S6C5BxzZ.mjs +0 -3
  131. package/dist/run-DUZRSnIT.mjs.map +0 -1
@@ -4,26 +4,26 @@ import { n as ensurePaiMarker } from "./pai-marker-D1MMswkz.mjs";
4
4
  import { t as STOP_WORDS } from "./stop-words-BdQuaE9K.mjs";
5
5
  import { t as applyRecencyBoost } from "./search-BOSphCJ1.mjs";
6
6
  import { n as resolveFromModule, t as packageRoot } from "./module-paths-DdRzbkUI.mjs";
7
- import { a as getStorageBackend, i as getRegistryBackend, r as createStorageBackend, s as humanDuration } from "./factory-y36qGegI.mjs";
8
- import { a as formatDetectionJson, i as formatDetection, n as migrateIdentityFile, r as detectProject } from "./wakeup-CZw88uXf.mjs";
9
- import { B as claudeProjectsDir, C as findLatestNote, H as scanTranscriptFolders, I as resolveHome, L as saveScanConfig, M as cmdScan, N as loadScanConfig, P as migrateScanConfig, R as upsertProject, S as applyContinue, T as readBodyFile, U as transcriptFiles, V as findMovedProjects, d as migrateWorkQueue, g as migrateSummaryCooldowns, t as readContextHandoverCache, v as extractAndStoreTriples, w as findNotesDir$1, x as appendCheckpointToNote, z as upsertSession } from "./context-handover-cache-mGxq2-8f.mjs";
7
+ import { a as getStorageBackend, i as getRegistryBackend, r as createStorageBackend, s as humanDuration } from "./factory-CNpPQQ-5.mjs";
8
+ import { a as formatDetectionJson, i as formatDetection, n as migrateIdentityFile, r as detectProject } from "./wakeup-D8n33hYV.mjs";
9
+ import { B as claudeProjectsDir, C as findLatestNote, H as scanTranscriptFolders, I as resolveHome, L as saveScanConfig, M as cmdScan, N as loadScanConfig, P as migrateScanConfig, R as upsertProject, S as applyContinue, T as readBodyFile, U as transcriptFiles, V as findMovedProjects, d as migrateWorkQueue, g as migrateSummaryCooldowns, t as readContextHandoverCache, v as extractAndStoreTriples, w as findNotesDir$1, x as appendCheckpointToNote, z as upsertSession } from "./context-handover-cache-CRSFdkNi.mjs";
10
10
  import { a as paiHomePath, i as paiHomeDir, n as migratePaiDir, o as resolvePaiFile, r as migratePaiFile, t as PaiFileMigrationError } from "./pai-home-Cm9rcJgX.mjs";
11
11
  import { b as OWNER_LABEL_PREFIX, c as migrateConfigFile, d as readMainConfigRaw, f as writeMainConfigRaw, h as resolvedMainConfigPath, l as paiConfigFilePath, m as migrateMainConfigToYaml, n as CONFIG_FILE$2, o as expandHome, p as MainConfigError, s as loadConfig, t as CONFIG_DIR, u as paiConfigYamlFilePath, v as readJsonStrict, x as UNROUTED, y as writeJsonAtomic } from "./config-BbLFD7Uf.mjs";
12
12
  import { a as schedulerLogPath, i as paiSocketPath, n as daemonLogPath, r as daemonPidPath } from "./runtime-paths-CHTg3ywb.mjs";
13
13
  import { B as contextWindowFromModelId, C as nativeAnthropicProvider, E as readWorkersSection, F as parseWorkersYamlDocument, I as relocateWorkersYaml, L as workersYamlLegacyNotice, M as inlineWorkersYamlKeys, N as migrateWorkersToYaml, P as needsWorkersYamlRelocation, R as workersYamlPath, S as maskKey, V as stripModelVariant, b as isModelCapability, f as PROVIDER_TAGS, j as initWorkersYaml, m as WorkersConfigError, r as ANTHROPIC_NATIVE, t as buildRunEnv, u as MODEL_CAPABILITIES, v as expandHome$1, y as getProviderOrNative, z as DEFAULT_CONTEXT_WINDOW } from "./run-env-BHWnXqle.mjs";
14
- import { $ as expandMcpNames, B as loadStatuses, C as discardWorker, D as uncommittedPaths, E as mergeWorker, G as setWorkerLabel, J as parseRunnerArgs, K as waitForTerminalStatus, L as isChatPane, Q as describeMcp, R as isLive, T as git, U as ownsPid, W as saveStatus, X as pinNotices, Z as projectLaunchConfig, a as parseWorkerReport, d as checkPaneForWorker, f as openFollowPane, h as markControlsHeld, i as usageContextTokens, j as UNLABELED, k as appendLedger, l as sayToWorker, m as clickrControlsArgv, n as runWorker, p as openPaneForWorker, q as longInlinePromptHint, r as testProvider, s as handoffFromInside, w as gcWorktrees, z as loadStatus } from "./run-DUZRSnIT.mjs";
14
+ import { $ as expandMcpNames, B as loadStatuses, C as discardWorker, D as uncommittedPaths, E as mergeWorker, G as setWorkerLabel, J as parseRunnerArgs, K as waitForTerminalStatus, L as isChatPane, Q as describeMcp, R as isLive, T as git, U as ownsPid, W as saveStatus, X as pinNotices, Z as projectLaunchConfig, a as parseWorkerReport, d as checkPaneForWorker, f as openFollowPane, h as markControlsHeld, i as usageContextTokens, j as UNLABELED, k as appendLedger, l as sayToWorker, m as clickrControlsArgv, n as runWorker, p as openPaneForWorker, q as longInlinePromptHint, r as testProvider, s as handoffFromInside, w as gcWorktrees, z as loadStatus } from "./run-DMaCpvMW.mjs";
15
15
  import { t as MergeError } from "./merge-DgU9OgZy.mjs";
16
16
  import { n as oldFederationPath, t as federationDbPath } from "./federation-db-BTyoufBh.mjs";
17
17
  import { r as registryDbPath, t as oldRegistryPath } from "./registry-db-C7voqML9.mjs";
18
- import { i as indexProjectWithBackend } from "./async-CNn36gm4.mjs";
18
+ import { i as indexProjectWithBackend } from "./async-C2Bm_Lal.mjs";
19
19
  import { t as PaiClient } from "./ipc-client-D16Xw6Uo.mjs";
20
- import { A as getConfigValueOp, C as setWorkersEnabled, D as useProvider, E as updateProvider, M as setConfigValueOp, N as unsetConfigValueOp, O as MainConfigOpsError, S as setProviderModel, T as unsetClass, _ as removeProvider, a as followWorkers, b as setClass, c as statusLineOutput, d as addProvider, f as classTargetText, g as modelPrefsText, h as describeProviders, i as fallbackStatusText, j as listConfigOp, k as formatConfigGetOutput, l as readSpecPrompt, m as describeModels, n as fallbackOn, o as psOutput, p as describeCapabilities, r as fallbackStatus, s as replayOutput, t as fallbackOff, u as resolveSpecPath, v as resolveProviderName, w as unsetCapabilityPreference, x as setProviderEnabled, y as setCapabilityPreference } from "./fallback-CWDQYmJi.mjs";
21
- import { _ as resolveSessionByNameOrId, a as buildDeduped, c as hasConversation, d as providerResumePlan, f as restoreTopLevel, g as migrateSessionScanCache, h as fmtAge$1, l as launchInDir, m as printExitDir, o as normalizeName$2, p as resumeArgvText, s as renderDedupedSessions, t as cmdMain, u as launchPrompt, v as scanCacheFilePath, y as scanSessions } from "./main-resolver-CDe7DCso.mjs";
20
+ import { A as getConfigValueOp, C as setWorkersEnabled, D as useProvider, E as updateProvider, M as setConfigValueOp, N as unsetConfigValueOp, O as MainConfigOpsError, S as setProviderModel, T as unsetClass, _ as removeProvider, a as followWorkers, b as setClass, c as statusLineOutput, d as addProvider, f as classTargetText, g as modelPrefsText, h as describeProviders, i as fallbackStatusText, j as listConfigOp, k as formatConfigGetOutput, l as readSpecPrompt, m as describeModels, n as fallbackOn, o as psOutput, p as describeCapabilities, r as fallbackStatus, s as replayOutput, t as fallbackOff, u as resolveSpecPath, v as resolveProviderName, w as unsetCapabilityPreference, x as setProviderEnabled, y as setCapabilityPreference } from "./fallback-vHjFZP0Y.mjs";
21
+ import { _ as resolveSessionByNameOrId, a as buildDeduped, c as hasConversation, d as providerResumePlan, f as restoreTopLevel, g as migrateSessionScanCache, h as fmtAge$1, l as launchInDir, m as printExitDir, o as normalizeName$2, p as resumeArgvText, s as renderDedupedSessions, t as cmdMain, u as launchPrompt, v as scanCacheFilePath, y as scanSessions } from "./main-resolver-CKNGux1B.mjs";
22
22
  import { n as queriesDirPath, t as migrateQueriesDir } from "./query-feedback-BIaZTTFO.mjs";
23
23
  import { _ as statusPath, h as ledgerPath, m as eventsPath, n as ensureProxyRunning, p as ensureNoMcpConfig, r as stopProxy, t as DEFAULT_PROXY_PORT, v as workersLogDir } from "./server-DlL1QI2k.mjs";
24
24
  import { i as sendToSession, n as fetchLiveSessions, r as revealItermSession, t as callAiBroker } from "./aibroker-client-C5Fw7DNz.mjs";
25
- import { a as totalUsageTokens, i as parseSessionUsage, r as sessionKeepaliveLedgerSummary, t as loadSessionKeepaliveState } from "./session-keepalive-CZUwp5IQ.mjs";
26
- import { t as runChain } from "./chain-C8QO8gwj.mjs";
25
+ import { a as totalUsageTokens, i as parseSessionUsage, r as sessionKeepaliveLedgerSummary, t as loadSessionKeepaliveState } from "./session-keepalive-DVZ9-7qg.mjs";
26
+ import { t as runChain } from "./chain-CT3SI-3z.mjs";
27
27
  import { appendFileSync, chmodSync, closeSync, copyFileSync, cpSync, createReadStream, existsSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, statSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
28
28
  import { homedir, platform, tmpdir, userInfo } from "node:os";
29
29
  import { basename, dirname, join, relative, resolve, sep } from "node:path";
@@ -162,7 +162,7 @@ async function cmdPromote(opts) {
162
162
  console.error(dim$1(` Pick a durable location for the new project.`));
163
163
  process.exit(1);
164
164
  }
165
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
165
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
166
166
  const registryBackend = await getRegistryBackend();
167
167
  const encodedDir = encodeDir(targetPath);
168
168
  if (await registryBackend.getProjectBySlug(slug) ?? await registryBackend.getProjectByRootPath(targetPath) ?? await registryBackend.getProjectByEncodedDir(encodedDir)) {
@@ -2046,7 +2046,7 @@ async function cmdUnregister(slug, opts = {}) {
2046
2046
  //#region src/cli/commands/project/projects-index.ts
2047
2047
  function registerProjectsCommands(projectsCmd) {
2048
2048
  projectsCmd.command("list", { isDefault: true }).description("Show the unified deduped listing (same as `pai`).\nUse --all to include cold / zero-session / archived projects.").option("--all", "Show all entries including cold / zero-session / archived projects").option("-n, --n <count>", "Max rows to show", "20").action(async (opts) => {
2049
- const { cmdMain } = await import("./main-resolver-DI-A7lSO.mjs");
2049
+ const { cmdMain } = await import("./main-resolver-VSM5ytnA.mjs");
2050
2050
  await cmdMain(void 0, void 0, opts);
2051
2051
  });
2052
2052
  projectsCmd.command("list-raw").description("Raw registry listing with slug, path, status, last_active columns").option("--all", "Include archived projects (default: active only)").option("--status <status>", "Filter by status: active | archived").option("--tag <tag>", "Filter by tag").option("--type <type>", "Filter by type").action(async (opts) => {
@@ -2912,7 +2912,7 @@ const DEFAULT_PAGE_SIZE = 500;
2912
2912
  async function runEmbed(backend, projectId, projectSlug, batchSize = 50, pageSize = DEFAULT_PAGE_SIZE) {
2913
2913
  const label = projectSlug ? `project ${projectSlug}` : "all projects";
2914
2914
  console.log(dim$1(`Generating embeddings for ${label} (this may take a while on first run)...`));
2915
- const { generateEmbeddings, serializeEmbedding } = await import("./embeddings-CDfM63uC.mjs");
2915
+ const { generateEmbeddings, serializeEmbedding } = await import("./embeddings-CcscYWwk.mjs");
2916
2916
  const { chunks: totalEstimate } = projectId !== void 0 ? await backend.getProjectStats(projectId) : await backend.getStats();
2917
2917
  let done = 0;
2918
2918
  let after = null;
@@ -3076,7 +3076,7 @@ function registerSearchCommand(memoryCmd) {
3076
3076
  let results;
3077
3077
  if (mode === "keyword") results = await backend.searchKeyword(query, searchOpts);
3078
3078
  else {
3079
- const { generateEmbedding } = await import("./embeddings-CDfM63uC.mjs");
3079
+ const { generateEmbedding } = await import("./embeddings-CcscYWwk.mjs");
3080
3080
  console.log(dim$1("Generating query embedding..."));
3081
3081
  const queryEmbedding = await generateEmbedding(query, true);
3082
3082
  if (mode === "semantic") results = await backend.searchSemantic(queryEmbedding, searchOpts);
@@ -3261,9 +3261,9 @@ function registerStatsCommands(memoryCmd) {
3261
3261
  //#region src/cli/commands/memory/sources-cmd.ts
3262
3262
  function registerSourcesCommand(memoryCmd) {
3263
3263
  memoryCmd.command("sources").description("Show what the indexer has taken in: composition by source, which roots\ncontent enters from, the heaviest single files, and how many chunks are\nrewritten per day (which distinguishes a finite backlog from a treadmill).").option("--limit <n>", "Rows per section (default 8)", "8").action(async (opts) => {
3264
- const { createStorageBackend } = await import("./factory-CaswxuJ0.mjs");
3264
+ const { createStorageBackend } = await import("./factory-DY7x73mE.mjs");
3265
3265
  const { loadConfig } = await import("./config-YinjgXEJ.mjs");
3266
- const { cmdMemorySources } = await import("./sources-DX4ElmrE.mjs");
3266
+ const { cmdMemorySources } = await import("./sources-CijVso3n.mjs");
3267
3267
  let backend;
3268
3268
  try {
3269
3269
  backend = await createStorageBackend(loadConfig());
@@ -3963,7 +3963,7 @@ async function escalate(task, headline, detail, state, now, opts) {
3963
3963
  state.alarmedAt[task.id] = now;
3964
3964
  let delivered = false;
3965
3965
  try {
3966
- const { routeNotification } = await import("./router-S6C5BxzZ.mjs");
3966
+ const { routeNotification } = await import("./router-CXUGsv85.mjs");
3967
3967
  const { loadConfig } = await import("./config-YinjgXEJ.mjs");
3968
3968
  delivered = (await routeNotification({
3969
3969
  event: "error",
@@ -6737,19 +6737,41 @@ Restart=on-failure
6737
6737
  WantedBy=default.target
6738
6738
  `;
6739
6739
  }
6740
- /** Warns (does not fail) when the user's systemd instance is not kept alive after logout. */
6741
- function warnIfLingerDisabled() {
6742
- const username = userInfo().username;
6743
- const result = spawnSync("loginctl", [
6744
- "show-user",
6745
- username,
6746
- "-p",
6747
- "Linger"
6748
- ], { encoding: "utf8" });
6749
- if (result.status === 0 && result.stdout.trim() !== "Linger=yes") {
6750
- console.log(warn$1(` Linger is off for ${username} — the daemon stops when you log out.`));
6751
- console.log(dim$1(` Enable it: loginctl enable-linger ${username}`));
6740
+ const runLoginctl = (args) => {
6741
+ const r = spawnSync("loginctl", args, { encoding: "utf8" });
6742
+ return {
6743
+ status: r.status,
6744
+ stdout: r.stdout ?? ""
6745
+ };
6746
+ };
6747
+ /**
6748
+ * Turns on systemd linger for the user (so the user unit survives logout) without sudo
6749
+ * or a prompt; prints the sudo command only when the system refuses. Linux only.
6750
+ */
6751
+ function ensureLinger(plat = process.platform, username = userInfo().username, loginctl = runLoginctl, log = console.log) {
6752
+ if (plat !== "linux") return;
6753
+ const linger = () => {
6754
+ const r = loginctl([
6755
+ "show-user",
6756
+ username,
6757
+ "-p",
6758
+ "Linger"
6759
+ ]);
6760
+ return r.status === 0 ? r.stdout.trim() : null;
6761
+ };
6762
+ const before = linger();
6763
+ if (before === null || before === "Linger=yes") return;
6764
+ loginctl([
6765
+ "--no-ask-password",
6766
+ "enable-linger",
6767
+ username
6768
+ ]);
6769
+ if (linger() === "Linger=yes") {
6770
+ log(ok$1(" linger: on (daemon survives logout)"));
6771
+ return;
6752
6772
  }
6773
+ log(warn$1(` Linger is off for ${username} — the daemon stops when you log out.`));
6774
+ log(dim$1(` Enable it: sudo loginctl enable-linger ${username}`));
6753
6775
  }
6754
6776
  async function cmdStatus$1() {
6755
6777
  const client = new PaiClient(loadConfig().socketPath);
@@ -6879,7 +6901,7 @@ function installServiceLinux(daemonBin) {
6879
6901
  ], { encoding: "utf8" });
6880
6902
  if (enableResult.status === 0) console.log(ok$1(" Enabled and started via systemd."));
6881
6903
  else console.log(warn$1(` systemctl enable --now: ${(enableResult.stderr || "").trim()}`));
6882
- warnIfLingerDisabled();
6904
+ ensureLinger();
6883
6905
  return true;
6884
6906
  }
6885
6907
  function cmdInstall() {
@@ -7075,7 +7097,7 @@ function cmdLogs(opts) {
7075
7097
  }
7076
7098
  function registerDaemonCommands(daemonCmd) {
7077
7099
  daemonCmd.command("serve").description("Start the PAI daemon in the foreground").action(async () => {
7078
- const { serve } = await import("./daemon-CX9JomIJ.mjs");
7100
+ const { serve } = await import("./daemon-DoTVK9z6.mjs");
7079
7101
  const { loadConfig: lc, ensureConfigDir } = await import("./config-YinjgXEJ.mjs");
7080
7102
  ensureConfigDir();
7081
7103
  await serve(lc());
@@ -8703,7 +8725,7 @@ function stepSummary(configUpdates, claudeMdGenerated, paiSkillInstalled, aiStee
8703
8725
  * Label wins because labels survive a task being moved between containers, and
8704
8726
  * because a task parked in the findings inbox has no meaningful container yet.
8705
8727
  *
8706
- * See Notes/docs/task-bus.md.
8728
+ * See docs/task-bus.md.
8707
8729
  */
8708
8730
  /**
8709
8731
  * Fold a tracker-supplied string onto its comparable form.
@@ -9702,7 +9724,7 @@ async function cmdExplore(note, opts) {
9702
9724
  const depth = parseInt(opts.depth ?? "3", 10);
9703
9725
  const direction = opts.direction ?? "both";
9704
9726
  const mode = opts.mode ?? "all";
9705
- const { zettelExplore } = await import("./zettelkasten-Dwj67e4p.mjs");
9727
+ const { zettelExplore } = await import("./zettelkasten-CtGHQWPU.mjs");
9706
9728
  const result = await zettelExplore(await getFedBackend(), {
9707
9729
  startNote: note,
9708
9730
  depth,
@@ -9767,7 +9789,7 @@ async function cmdHealth(opts) {
9767
9789
  const projectPath = opts.project;
9768
9790
  const recentDays = parseInt(opts.days ?? "30", 10);
9769
9791
  const includeTypes = opts.include ? opts.include.split(",").map((s) => s.trim()) : void 0;
9770
- const { zettelHealth } = await import("./zettelkasten-Dwj67e4p.mjs");
9792
+ const { zettelHealth } = await import("./zettelkasten-CtGHQWPU.mjs");
9771
9793
  const result = await zettelHealth(await getFedBackend(), {
9772
9794
  scope,
9773
9795
  projectPath,
@@ -9838,7 +9860,7 @@ async function cmdSurprise(note, opts) {
9838
9860
  const limit = parseInt(opts.limit ?? "10", 10);
9839
9861
  const minSimilarity = parseFloat(opts.minSimilarity ?? "0.3");
9840
9862
  const minGraphDistance = parseInt(opts.minDistance ?? "3", 10);
9841
- const { zettelSurprise } = await import("./zettelkasten-Dwj67e4p.mjs");
9863
+ const { zettelSurprise } = await import("./zettelkasten-CtGHQWPU.mjs");
9842
9864
  const backend = await getFedBackend();
9843
9865
  console.log();
9844
9866
  console.log(header(" PAI Zettel Surprise"));
@@ -9893,7 +9915,7 @@ async function cmdSuggest(note, opts) {
9893
9915
  const vaultProjectId = parseInt(opts.vaultProjectId, 10);
9894
9916
  const limit = parseInt(opts.limit ?? "5", 10);
9895
9917
  const excludeLinked = opts.excludeLinked !== false;
9896
- const { zettelSuggest } = await import("./zettelkasten-Dwj67e4p.mjs");
9918
+ const { zettelSuggest } = await import("./zettelkasten-CtGHQWPU.mjs");
9897
9919
  const backend = await getFedBackend();
9898
9920
  console.log();
9899
9921
  console.log(header(" PAI Zettel Suggest"));
@@ -9946,7 +9968,7 @@ async function cmdConverse(question, opts) {
9946
9968
  const vaultProjectId = parseInt(opts.vaultProjectId, 10);
9947
9969
  const depth = parseInt(opts.depth ?? "2", 10);
9948
9970
  const limit = parseInt(opts.limit ?? "15", 10);
9949
- const { zettelConverse } = await import("./zettelkasten-Dwj67e4p.mjs");
9971
+ const { zettelConverse } = await import("./zettelkasten-CtGHQWPU.mjs");
9950
9972
  const backend = await getFedBackend();
9951
9973
  console.log();
9952
9974
  console.log(header(" PAI Zettel Converse"));
@@ -10009,7 +10031,7 @@ async function cmdThemes(opts) {
10009
10031
  const minClusterSize = parseInt(opts.minSize ?? "3", 10);
10010
10032
  const maxThemes = parseInt(opts.maxThemes ?? "10", 10);
10011
10033
  const similarityThreshold = parseFloat(opts.threshold ?? "0.65");
10012
- const { zettelThemes } = await import("./zettelkasten-Dwj67e4p.mjs");
10034
+ const { zettelThemes } = await import("./zettelkasten-CtGHQWPU.mjs");
10013
10035
  const backend = await getFedBackend();
10014
10036
  console.log();
10015
10037
  console.log(header(" PAI Zettel Themes"));
@@ -14285,7 +14307,7 @@ function registerNotifyCommands(notifyCmd) {
14285
14307
  * and the bus reports ownership instead of delivering. PAI must stay useful on
14286
14308
  * machines that do not run iTerm2.
14287
14309
  *
14288
- * See Notes/docs/task-bus.md.
14310
+ * See docs/task-bus.md.
14289
14311
  */
14290
14312
  /**
14291
14313
  * How long AIBroker may spend on one dispatch, in seconds.
@@ -16084,7 +16106,7 @@ async function migrateToPostgres(opts = {}) {
16084
16106
  const dump = pgDump(container, pgConfig, dumpPath);
16085
16107
  if (!dump.ok) return refused(dump.reason, dryRun);
16086
16108
  }
16087
- const { PostgresBackend } = await import("./postgres-DYtZg7J7.mjs");
16109
+ const { PostgresBackend } = await import("./postgres-Ceqsa64C.mjs");
16088
16110
  await PostgresBackend.ensureDatabase(pgConfig);
16089
16111
  const sqlite = new BetterSqlite3(sqliteFederationPath, { readonly: true });
16090
16112
  const registrySqlite = sqliteRegistryPath === sqliteFederationPath ? sqlite : new BetterSqlite3(sqliteRegistryPath, { readonly: true });
@@ -16655,7 +16677,7 @@ async function getSessionTags(registryBackend, sessionId) {
16655
16677
  * Session CRUD commands: list, info, rename, slug, tag, route, active, auto-route.
16656
16678
  */
16657
16679
  async function cmdList(projectSlug, opts) {
16658
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16680
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16659
16681
  const registryBackend = await getRegistryBackend();
16660
16682
  const limit = parseInt(opts.limit ?? "20", 10);
16661
16683
  let project;
@@ -16720,7 +16742,7 @@ async function cmdList(projectSlug, opts) {
16720
16742
  console.log(dim$1(` ${rows.length} session(s) shown (limit: ${limit})`));
16721
16743
  }
16722
16744
  async function cmdInfo(projectSlug, sessionNumber) {
16723
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16745
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16724
16746
  const registryBackend = await getRegistryBackend();
16725
16747
  const project = await getProject$1(registryBackend, projectSlug);
16726
16748
  if (!project) {
@@ -16744,7 +16766,7 @@ async function cmdInfo(projectSlug, sessionNumber) {
16744
16766
  console.log();
16745
16767
  }
16746
16768
  async function cmdRename(projectSlug, numberOrLatest, newSlug) {
16747
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16769
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16748
16770
  await cmdRenameWith(await getRegistryBackend(), projectSlug, numberOrLatest, newSlug);
16749
16771
  }
16750
16772
  async function cmdRenameWith(registryBackend, projectSlug, numberOrLatest, newSlug) {
@@ -16807,7 +16829,7 @@ async function cmdRenameWith(registryBackend, projectSlug, numberOrLatest, newSl
16807
16829
  console.log();
16808
16830
  }
16809
16831
  async function cmdSlug(projectSlug, numberOrLatest, opts) {
16810
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16832
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16811
16833
  const registryBackend = await getRegistryBackend();
16812
16834
  const project = await getProject$1(registryBackend, projectSlug);
16813
16835
  if (!project) {
@@ -16837,7 +16859,7 @@ async function cmdSlug(projectSlug, numberOrLatest, opts) {
16837
16859
  }
16838
16860
  }
16839
16861
  async function cmdTag(projectSlug, sessionNumber, rawTags) {
16840
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16862
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16841
16863
  const registryBackend = await getRegistryBackend();
16842
16864
  const project = await getProject$1(registryBackend, projectSlug);
16843
16865
  if (!project) {
@@ -16877,7 +16899,7 @@ async function cmdTag(projectSlug, sessionNumber, rawTags) {
16877
16899
  console.log();
16878
16900
  }
16879
16901
  async function cmdRoute(projectSlug, sessionNumber, targetProjectSlug, opts) {
16880
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16902
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16881
16903
  const registryBackend = await getRegistryBackend();
16882
16904
  const project = await getProject$1(registryBackend, projectSlug);
16883
16905
  if (!project) {
@@ -16919,7 +16941,7 @@ async function cmdRoute(projectSlug, sessionNumber, targetProjectSlug, opts) {
16919
16941
  console.log();
16920
16942
  }
16921
16943
  async function cmdActive(opts) {
16922
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
16944
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
16923
16945
  const registryBackend = await getRegistryBackend();
16924
16946
  const minutes = parseInt(opts.minutes ?? "60", 10);
16925
16947
  const cutoff = Date.now() - minutes * 60 * 1e3;
@@ -17006,8 +17028,8 @@ async function cmdActive(opts) {
17006
17028
  ], rows));
17007
17029
  }
17008
17030
  async function cmdAutoRoute(opts) {
17009
- const { autoRoute, formatAutoRouteJson } = await import("./auto-route-sLMU-NnM.mjs");
17010
- const { getRegistryBackend, createStorageBackend } = await import("./factory-CaswxuJ0.mjs");
17031
+ const { autoRoute, formatAutoRouteJson } = await import("./auto-route-o0BOsXn7.mjs");
17032
+ const { getRegistryBackend, createStorageBackend } = await import("./factory-DY7x73mE.mjs");
17011
17033
  const { loadConfig } = await import("./config-YinjgXEJ.mjs");
17012
17034
  const config = loadConfig();
17013
17035
  const registryBackend = await getRegistryBackend();
@@ -17244,7 +17266,7 @@ async function cmdPause(opts) {
17244
17266
  process.exitCode = 1;
17245
17267
  return;
17246
17268
  }
17247
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
17269
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
17248
17270
  const registryBackend = await getRegistryBackend();
17249
17271
  const cwd = process.cwd();
17250
17272
  const project = await resolveProjectByCwd(registryBackend, cwd);
@@ -17639,7 +17661,7 @@ function buildStopBody(project, sessionId) {
17639
17661
  }
17640
17662
  }
17641
17663
  async function cmdHandover(projectSlug, numberOrLatest, sessionId) {
17642
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
17664
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
17643
17665
  const registryBackend = await getRegistryBackend();
17644
17666
  let project;
17645
17667
  if (projectSlug) {
@@ -17935,7 +17957,7 @@ function touchSentinel(rootPath) {
17935
17957
  async function cmdAutosave(opts) {
17936
17958
  const minGap = parseInt(opts.minGap ?? String(DEFAULT_MIN_GAP), 10);
17937
17959
  const cwd = process.cwd();
17938
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
17960
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
17939
17961
  const registryBackend = await getRegistryBackend();
17940
17962
  const project = await resolveProjectByCwd(registryBackend, cwd);
17941
17963
  if (!project) return;
@@ -20330,7 +20352,7 @@ async function countVectorDbPaths(oldPaths) {
20330
20352
  if (oldPaths.length === 0) return 0;
20331
20353
  try {
20332
20354
  const { loadConfig } = await import("./config-YinjgXEJ.mjs");
20333
- const { createStorageBackend } = await import("./factory-CaswxuJ0.mjs");
20355
+ const { createStorageBackend } = await import("./factory-DY7x73mE.mjs");
20334
20356
  const config = loadConfig();
20335
20357
  if (config.storageBackend !== "postgres") return 0;
20336
20358
  const backend = await createStorageBackend(config);
@@ -20348,7 +20370,7 @@ async function updateVectorDbPaths(moves) {
20348
20370
  if (moves.length === 0) return 0;
20349
20371
  try {
20350
20372
  const { loadConfig } = await import("./config-YinjgXEJ.mjs");
20351
- const { createStorageBackend } = await import("./factory-CaswxuJ0.mjs");
20373
+ const { createStorageBackend } = await import("./factory-DY7x73mE.mjs");
20352
20374
  const config = loadConfig();
20353
20375
  if (config.storageBackend !== "postgres") return 0;
20354
20376
  const backend = await createStorageBackend(config);
@@ -20435,7 +20457,7 @@ async function displayDryRun(plans) {
20435
20457
  console.log();
20436
20458
  }
20437
20459
  async function executeCleanup(plans, skipReindex) {
20438
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
20460
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
20439
20461
  const registryBackend = await getRegistryBackend();
20440
20462
  let deleted = 0;
20441
20463
  let renamed = 0;
@@ -20632,7 +20654,7 @@ async function executeCleanup(plans, skipReindex) {
20632
20654
  //#region src/cli/commands/session-cleanup/index.ts
20633
20655
  function registerSessionCleanupCommand(sessionCmd) {
20634
20656
  sessionCmd.command("cleanup [project-slug]").description("Clean up session notes: delete empties, auto-name unnamed, move into YYYY/MM/ hierarchy, renumber").option("--execute", "Actually perform the cleanup (default is dry-run)").option("--no-renumber", "Skip renumbering sessions after deletions").option("--no-reindex", "Skip triggering memory re-index after moves").action(async (projectSlug, opts) => {
20635
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
20657
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
20636
20658
  const registryBackend = await getRegistryBackend();
20637
20659
  const dryRun = !opts.execute;
20638
20660
  const skipReindex = opts.reindex === false;
@@ -20702,7 +20724,7 @@ function finalizeNote(notePath) {
20702
20724
  }
20703
20725
  async function cmdEnd(opts) {
20704
20726
  await cmdPause(opts);
20705
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
20727
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
20706
20728
  const registryBackend = await getRegistryBackend();
20707
20729
  const cwd = process.cwd();
20708
20730
  const project = await registryBackend.findProjectByCwdPrefix(cwd);
@@ -21150,7 +21172,7 @@ async function cmdFind(query, opts) {
21150
21172
  */
21151
21173
  async function getProjects(includeArchived) {
21152
21174
  try {
21153
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
21175
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
21154
21176
  const rows = await (await getRegistryBackend()).listProjectsWithSessionStats();
21155
21177
  return includeArchived ? rows : rows.filter((p) => p.status === "active");
21156
21178
  } catch {
@@ -21624,7 +21646,7 @@ async function cmdPick(opts = {}) {
21624
21646
  const onRemove = async (rec) => {
21625
21647
  if (!rec.slug) return false;
21626
21648
  try {
21627
- const { getRegistryBackend } = await import("./factory-CaswxuJ0.mjs");
21649
+ const { getRegistryBackend } = await import("./factory-DY7x73mE.mjs");
21628
21650
  const registryBackend = await getRegistryBackend();
21629
21651
  const project = await registryBackend.getProjectBySlug(rec.slug);
21630
21652
  if (!project || project.status !== "active") return false;
@@ -21909,4 +21931,4 @@ claude() {
21909
21931
 
21910
21932
  //#endregion
21911
21933
  export { drainStdio as n, buildProgram as t };
21912
- //# sourceMappingURL=program-DiktbiWa.mjs.map
21934
+ //# sourceMappingURL=program-DK0mRRlf.mjs.map