pi-para 0.6.0 → 0.6.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 (213) hide show
  1. package/ARCHITECTURE.md +0 -9
  2. package/CHANGELOG.md +22 -0
  3. package/CONFIGURATION.md +5 -23
  4. package/README.md +7 -31
  5. package/SETUP.md +5 -3
  6. package/STRUCTURE.md +0 -9
  7. package/dist/atomic-write.d.ts +2 -0
  8. package/dist/atomic-write.d.ts.map +1 -0
  9. package/dist/atomic-write.js +18 -0
  10. package/dist/atomic-write.js.map +1 -0
  11. package/dist/capture.d.ts +34 -0
  12. package/dist/capture.d.ts.map +1 -0
  13. package/dist/capture.js +461 -0
  14. package/dist/capture.js.map +1 -0
  15. package/dist/cli-legacy.d.ts +4 -0
  16. package/dist/cli-legacy.d.ts.map +1 -0
  17. package/dist/cli-legacy.js +41 -0
  18. package/dist/cli-legacy.js.map +1 -0
  19. package/dist/cli.d.ts +8 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +427 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands.d.ts +15 -0
  24. package/dist/commands.d.ts.map +1 -0
  25. package/dist/commands.js +791 -0
  26. package/dist/commands.js.map +1 -0
  27. package/dist/config.d.ts +94 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +228 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/context.d.ts +63 -0
  32. package/dist/context.d.ts.map +1 -0
  33. package/dist/context.js +311 -0
  34. package/dist/context.js.map +1 -0
  35. package/dist/credentials.d.ts +27 -0
  36. package/dist/credentials.d.ts.map +1 -0
  37. package/dist/credentials.js +85 -0
  38. package/dist/credentials.js.map +1 -0
  39. package/dist/daemon.d.ts +49 -0
  40. package/dist/daemon.d.ts.map +1 -0
  41. package/dist/daemon.js +226 -0
  42. package/dist/daemon.js.map +1 -0
  43. package/dist/doctor.d.ts +20 -0
  44. package/dist/doctor.d.ts.map +1 -0
  45. package/dist/doctor.js +197 -0
  46. package/dist/doctor.js.map +1 -0
  47. package/dist/frontmatter.d.ts +59 -0
  48. package/dist/frontmatter.d.ts.map +1 -0
  49. package/dist/frontmatter.js +170 -0
  50. package/dist/frontmatter.js.map +1 -0
  51. package/dist/index.d.ts +21 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +357 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/ingest.d.ts +88 -0
  56. package/dist/ingest.d.ts.map +1 -0
  57. package/dist/ingest.js +105 -0
  58. package/dist/ingest.js.map +1 -0
  59. package/dist/link-discovery.d.ts +40 -0
  60. package/dist/link-discovery.d.ts.map +1 -0
  61. package/dist/link-discovery.js +122 -0
  62. package/dist/link-discovery.js.map +1 -0
  63. package/dist/link-utils.d.ts +30 -0
  64. package/dist/link-utils.d.ts.map +1 -0
  65. package/dist/link-utils.js +145 -0
  66. package/dist/link-utils.js.map +1 -0
  67. package/dist/lint.d.ts +39 -0
  68. package/dist/lint.d.ts.map +1 -0
  69. package/dist/lint.js +827 -0
  70. package/dist/lint.js.map +1 -0
  71. package/dist/maintainer.d.ts +24 -0
  72. package/dist/maintainer.d.ts.map +1 -0
  73. package/dist/maintainer.js +358 -0
  74. package/dist/maintainer.js.map +1 -0
  75. package/dist/model-resolver.d.ts +30 -0
  76. package/dist/model-resolver.d.ts.map +1 -0
  77. package/dist/model-resolver.js +71 -0
  78. package/dist/model-resolver.js.map +1 -0
  79. package/dist/paths.d.ts +20 -0
  80. package/dist/paths.d.ts.map +1 -0
  81. package/dist/paths.js +33 -0
  82. package/dist/paths.js.map +1 -0
  83. package/dist/processor.d.ts +14 -0
  84. package/dist/processor.d.ts.map +1 -0
  85. package/dist/processor.js +361 -0
  86. package/dist/processor.js.map +1 -0
  87. package/dist/qmd-providers.d.ts +12 -0
  88. package/dist/qmd-providers.d.ts.map +1 -0
  89. package/dist/qmd-providers.js +45 -0
  90. package/dist/qmd-providers.js.map +1 -0
  91. package/dist/query.d.ts +69 -0
  92. package/dist/query.d.ts.map +1 -0
  93. package/dist/query.js +120 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/raw.d.ts +57 -0
  96. package/dist/raw.d.ts.map +1 -0
  97. package/dist/raw.js +219 -0
  98. package/dist/raw.js.map +1 -0
  99. package/dist/redact.d.ts +21 -0
  100. package/dist/redact.d.ts.map +1 -0
  101. package/dist/redact.js +143 -0
  102. package/dist/redact.js.map +1 -0
  103. package/dist/repair.d.ts +11 -0
  104. package/dist/repair.d.ts.map +1 -0
  105. package/dist/repair.js +41 -0
  106. package/dist/repair.js.map +1 -0
  107. package/dist/scheduler/controls.d.ts +35 -0
  108. package/dist/scheduler/controls.d.ts.map +1 -0
  109. package/dist/scheduler/controls.js +98 -0
  110. package/dist/scheduler/controls.js.map +1 -0
  111. package/dist/scheduler/index.d.ts +70 -0
  112. package/dist/scheduler/index.d.ts.map +1 -0
  113. package/dist/scheduler/index.js +245 -0
  114. package/dist/scheduler/index.js.map +1 -0
  115. package/dist/scheduler/leases.d.ts +22 -0
  116. package/dist/scheduler/leases.d.ts.map +1 -0
  117. package/dist/scheduler/leases.js +74 -0
  118. package/dist/scheduler/leases.js.map +1 -0
  119. package/dist/scheduler/session-capture.d.ts +33 -0
  120. package/dist/scheduler/session-capture.d.ts.map +1 -0
  121. package/dist/scheduler/session-capture.js +108 -0
  122. package/dist/scheduler/session-capture.js.map +1 -0
  123. package/dist/scheduler/state.d.ts +56 -0
  124. package/dist/scheduler/state.d.ts.map +1 -0
  125. package/dist/scheduler/state.js +210 -0
  126. package/dist/scheduler/state.js.map +1 -0
  127. package/dist/scope.d.ts +54 -0
  128. package/dist/scope.d.ts.map +1 -0
  129. package/dist/scope.js +161 -0
  130. package/dist/scope.js.map +1 -0
  131. package/dist/scripts/bulk-link-fix.d.ts +9 -0
  132. package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
  133. package/dist/scripts/bulk-link-fix.js +106 -0
  134. package/dist/scripts/bulk-link-fix.js.map +1 -0
  135. package/dist/session-tools.d.ts +33 -0
  136. package/dist/session-tools.d.ts.map +1 -0
  137. package/dist/session-tools.js +211 -0
  138. package/dist/session-tools.js.map +1 -0
  139. package/dist/settings.d.ts +37 -0
  140. package/dist/settings.d.ts.map +1 -0
  141. package/dist/settings.js +176 -0
  142. package/dist/settings.js.map +1 -0
  143. package/dist/setup.d.ts +29 -0
  144. package/dist/setup.d.ts.map +1 -0
  145. package/dist/setup.js +90 -0
  146. package/dist/setup.js.map +1 -0
  147. package/dist/state.d.ts +54 -0
  148. package/dist/state.d.ts.map +1 -0
  149. package/dist/state.js +176 -0
  150. package/dist/state.js.map +1 -0
  151. package/dist/status.d.ts +22 -0
  152. package/dist/status.d.ts.map +1 -0
  153. package/dist/status.js +93 -0
  154. package/dist/status.js.map +1 -0
  155. package/dist/store.d.ts +71 -0
  156. package/dist/store.d.ts.map +1 -0
  157. package/dist/store.js +282 -0
  158. package/dist/store.js.map +1 -0
  159. package/dist/summarize.d.ts +60 -0
  160. package/dist/summarize.d.ts.map +1 -0
  161. package/dist/summarize.js +266 -0
  162. package/dist/summarize.js.map +1 -0
  163. package/dist/tag-registry.d.ts +56 -0
  164. package/dist/tag-registry.d.ts.map +1 -0
  165. package/dist/tag-registry.js +146 -0
  166. package/dist/tag-registry.js.map +1 -0
  167. package/dist/templates/prompts.d.ts +51 -0
  168. package/dist/templates/prompts.d.ts.map +1 -0
  169. package/dist/templates/prompts.js +203 -0
  170. package/dist/templates/prompts.js.map +1 -0
  171. package/dist/tools.d.ts +26 -0
  172. package/dist/tools.d.ts.map +1 -0
  173. package/dist/tools.js +1198 -0
  174. package/dist/tools.js.map +1 -0
  175. package/dist/watcher.d.ts +25 -0
  176. package/dist/watcher.d.ts.map +1 -0
  177. package/dist/watcher.js +84 -0
  178. package/dist/watcher.js.map +1 -0
  179. package/dist/webui/client/dist/index.html +1885 -0
  180. package/dist/webui/server.d.ts +31 -0
  181. package/dist/webui/server.d.ts.map +1 -0
  182. package/dist/webui/server.js +566 -0
  183. package/dist/webui/server.js.map +1 -0
  184. package/dist/wiki-tool-guidance.d.ts +6 -0
  185. package/dist/wiki-tool-guidance.d.ts.map +1 -0
  186. package/dist/wiki-tool-guidance.js +70 -0
  187. package/dist/wiki-tool-guidance.js.map +1 -0
  188. package/dist/wiki.d.ts +108 -0
  189. package/dist/wiki.d.ts.map +1 -0
  190. package/dist/wiki.js +497 -0
  191. package/dist/wiki.js.map +1 -0
  192. package/package.json +2 -1
  193. package/scripts/build-assets.mjs +1 -13
  194. package/skills/setup/SKILL.md +1 -1
  195. package/src/cli.ts +0 -70
  196. package/src/commands.ts +78 -3
  197. package/src/config.ts +0 -25
  198. package/src/doctor.ts +21 -1
  199. package/src/index.ts +16 -38
  200. package/src/scheduler/index.ts +64 -0
  201. package/src/settings.ts +88 -0
  202. package/src/setup.ts +1 -1
  203. package/src/templates/prompts.ts +0 -56
  204. package/scripts/gepa/dataset.py +0 -192
  205. package/scripts/gepa/lm_providers.py +0 -472
  206. package/scripts/gepa/metric.py +0 -279
  207. package/scripts/gepa/optimize.py +0 -367
  208. package/scripts/gepa/program.py +0 -99
  209. package/scripts/gepa/pyproject.toml +0 -19
  210. package/scripts/gepa/run-all.sh +0 -53
  211. package/scripts/gepa/wiki_reader.py +0 -113
  212. package/src/gepa/index.ts +0 -287
  213. package/src/gepa/optimized/capture-prompt.txt +0 -65
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../src/wiki.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-para",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "PARA Knowledge Base Extension for pi — persistent, LLM-curated personal wiki",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -146,6 +146,7 @@
146
146
  "scripts": {
147
147
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
148
148
  "build": "tsc -p tsconfig.json && node scripts/build-assets.mjs",
149
+ "prepack": "npm run build",
149
150
  "check": "tsc --noEmit",
150
151
  "test": "vitest --run",
151
152
  "test:coverage": "vitest --run --coverage",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /* v8 ignore start */
3
3
  // Cross-platform post-tsc asset copy (replaces POSIX mkdir -p/cp in npm build).
4
- import { cp, mkdir, readdir } from "node:fs/promises";
4
+ import { cp, mkdir } from "node:fs/promises";
5
5
  import { existsSync } from "node:fs";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { join, resolve, dirname } from "node:path";
@@ -15,15 +15,3 @@ await mkdir(webuiDestDir, { recursive: true });
15
15
  if (existsSync(webuiSrc)) {
16
16
  await cp(webuiSrc, join(webuiDestDir, "index.html"));
17
17
  }
18
-
19
- // 2. GEPA optimized prompt text files (optional)
20
- const gepaSrcDir = join(root, "src", "gepa", "optimized");
21
- const gepaDestDir = join(root, "dist", "gepa", "optimized");
22
- await mkdir(gepaDestDir, { recursive: true });
23
- if (existsSync(gepaSrcDir)) {
24
- for (const entry of await readdir(gepaSrcDir)) {
25
- if (entry.endsWith(".txt")) {
26
- await cp(join(gepaSrcDir, entry), join(gepaDestDir, entry));
27
- }
28
- }
29
- }
@@ -10,7 +10,7 @@ Read and follow the instructions in `SETUP.md` at the root of the pi-para packag
10
10
  The setup file is at: `{{skill_dir}}/../../SETUP.md`
11
11
 
12
12
  Steps:
13
- 1. `pi install @picassio/pi-para` (extension)
13
+ 1. `pi install npm:pi-para` (extension)
14
14
  2. `npm install -g @picassio/qmd` (search engine)
15
15
  3. Configure `~/.config/qmd/index.yml` (providers)
16
16
  4. Set `daemonModel` in `~/.pi/wiki/config.json` (daemon LLM)
package/src/cli.ts CHANGED
@@ -413,75 +413,6 @@ async function main() {
413
413
  break;
414
414
  }
415
415
 
416
- case "gepa": {
417
- const sub = args[1];
418
- const { runGEPA, listOptimized, compareTarget, extractTargets } = await import("./gepa/index.js");
419
- switch (sub) {
420
- case "optimize": {
421
- const g = (flag: string) => { const i = args.indexOf(flag); return i >= 0 ? args[i + 1] : undefined; };
422
- try {
423
- await runGEPA({
424
- target: g("--target"),
425
- studentModel: g("--student-model") ?? g("--model"),
426
- teacherModel: g("--teacher-model") ?? g("--reflection-model"),
427
- judgeModel: g("--judge-model"),
428
- auto: (g("--auto") ?? undefined) as "light" | "medium" | "heavy" | undefined,
429
- maxMetricCalls: g("--max-metric-calls") ? parseInt(g("--max-metric-calls")!) : undefined,
430
- threads: g("--threads") ? parseInt(g("--threads")!) : undefined,
431
- seed: g("--seed") ? parseInt(g("--seed")!) : undefined,
432
- });
433
- } catch (err) {
434
- console.error(`[gepa] Error: ${err instanceof Error ? err.message : err}`);
435
- process.exit(1);
436
- }
437
- break;
438
- }
439
- case "list": {
440
- const items = listOptimized();
441
- if (items.length === 0) { console.log("No optimized prompts. Run 'gepa optimize' first."); }
442
- else { for (const i of items) console.log(` ${i.name}: score=${i.score.toFixed(3)} model=${i.model}`); }
443
- break;
444
- }
445
- case "targets": {
446
- for (const t of extractTargets()) console.log(` ${t.name} (${t.type}): ${t.content.length} chars`);
447
- break;
448
- }
449
- case "compare": {
450
- const name = args[args.indexOf("--target") + 1];
451
- if (!name) { console.error("Usage: gepa compare --target <name>"); process.exit(1); }
452
- const d = compareTarget(name);
453
- if (!d) console.log(`No optimized version for '${name}'.`);
454
- else { console.log("=== ORIGINAL ===\n" + d.original.slice(0, 500)); console.log("\n=== OPTIMIZED ===\n" + d.optimized.slice(0, 500)); }
455
- break;
456
- }
457
- default:
458
- console.log(`pi-para gepa — GEPA prompt optimizer (DSPy GEPA via uv)
459
-
460
- Subcommands:
461
- optimize Run DSPy GEPA optimization
462
- list Show optimized prompts and scores
463
- targets List all 22 optimization targets
464
- compare Compare original vs optimized for a target
465
-
466
- Options (optimize):
467
- --target <name> Optimize only this target
468
- --student-model <spec> Student LM — runs proxy (default: anthropic/claude-sonnet-4-20250514)
469
- --teacher-model <spec> Teacher/reflection LM — proposes mutations (default: anthropic/claude-opus-4-6)
470
- --judge-model <spec> Judge LM — scores output (default: same as student)
471
- --model <spec> Shorthand for --student-model
472
- --reflection-model <spec> Shorthand for --teacher-model
473
- --auto light|medium|heavy Budget preset (default: light)
474
- --max-metric-calls <N> Override auto with explicit budget
475
- --threads <N> Parallel eval threads (default: 2)
476
- --seed <N> Random seed (default: 42)
477
-
478
- Config (persistent defaults in ~/.pi/wiki/config.json):
479
- gepa.studentModel gepa.teacherModel gepa.judgeModel
480
- gepa.auto gepa.threads gepa.seed
481
- gepa.useOptimized (toggle optimized prompts at runtime)`);
482
- }
483
- break;
484
- }
485
416
 
486
417
  default:
487
418
  console.log(`pi-para — PARA wiki extension CLI
@@ -498,7 +429,6 @@ Primary commands:
498
429
  providers List credential refs and local secrets
499
430
  providers set-secret <name> <value>
500
431
  providers remove-secret <name>
501
- gepa <subcommand> GEPA prompt optimizer (optimize, list, targets, compare)
502
432
 
503
433
  Legacy compatibility commands:
504
434
  start Deprecated daemon foreground mode
package/src/commands.ts CHANGED
@@ -652,9 +652,12 @@ ${goal} — verified and complete.
652
652
  disableRerank,
653
653
  setProviderProfileField,
654
654
  setProviderDims,
655
+ PROVIDER_PRESETS,
656
+ applyProviderPreset,
655
657
  } = await import("./settings.js");
656
658
  const { listSchedulerTasks } = await import("./scheduler/controls.js");
657
- const { setSecret } = await import("./credentials.js");
659
+ const { setSecret, removeSecret, readSecretStore, redactCredential } = await import("./credentials.js");
660
+ const { existsSync } = await import("node:fs");
658
661
 
659
662
  const loaded = await loadParaConfig({ migrate: true });
660
663
  const config = loaded.config;
@@ -666,6 +669,12 @@ ${goal} — verified and complete.
666
669
  const queuedTasks = listSchedulerTasks(wikiDir, { status: "queued" }).length;
667
670
  const failedTasks = listSchedulerTasks(wikiDir, { status: "failed" }).length;
668
671
 
672
+ const secretStore = await readSecretStore(loaded.paths.secretsPath).catch(() => ({ version: 1 as const, secrets: {} }));
673
+ const secretCount = Object.keys(secretStore.secrets).length;
674
+ const secretsLabel = existsSync(loaded.paths.secretsPath)
675
+ ? `${secretCount} secret(s) in secrets.json`
676
+ : "secrets.json not created yet";
677
+
669
678
  const choice = await ctx.ui.select("Wiki Settings", [
670
679
  `[Context] Max tokens: ${config.context.maxTokens}`,
671
680
  `[Search] Limit: ${config.context.searchLimit}, Graph boost: ${config.context.searchGraphBoost}`,
@@ -674,6 +683,7 @@ ${goal} — verified and complete.
674
683
  `[WebWiki] ${config.webWiki.enabled ? `Enabled at http://${config.webWiki.host}:${config.webWiki.port}` : "Disabled"}`,
675
684
  `[Embedding] ${providerProfileLabel(config.qmd.embedding)}`,
676
685
  `[Rerank] ${providerProfileLabel(config.qmd.rerank)}`,
686
+ `[Secrets] ${secretsLabel}`,
677
687
  `---`,
678
688
  `[Status] Scope: ${scope.name} | Pages: ${pageCount} | qmd: SDK | Scheduler: ${queuedTasks} queued, ${failedTasks} failed`,
679
689
  ]);
@@ -781,6 +791,52 @@ ${goal} — verified and complete.
781
791
  const val = await ctx.ui.input("Port:", String(config.webWiki.port));
782
792
  if (val) { setWebWikiPort(config, val); await persist(); }
783
793
  }
794
+ } else if (choice.startsWith("[Secrets]")) {
795
+ const entries = Object.entries(secretStore.secrets);
796
+ const sub = await ctx.ui.select(
797
+ `Secrets — ${loaded.paths.secretsPath}${existsSync(loaded.paths.secretsPath) ? "" : " (will be created on first save)"}`,
798
+ [
799
+ ...entries.map(([name, value]) => `${name}: ${redactCredential(value)}`),
800
+ "Add/update API key",
801
+ ...(entries.length > 0 ? ["Remove a secret"] : []),
802
+ ],
803
+ );
804
+ if (sub === "Add/update API key") {
805
+ const name = await ctx.ui.input("Secret name (e.g. embedding, rerank, capture):", "embedding");
806
+ if (name?.trim()) {
807
+ const value = await ctx.ui.input(`API key for "${name.trim()}" (never stored in wiki git):`, "");
808
+ if (value) {
809
+ const created = !existsSync(loaded.paths.secretsPath);
810
+ await setSecret(name.trim(), value, loaded.paths.secretsPath);
811
+ ctx.ui.notify(
812
+ created
813
+ ? `Created ${loaded.paths.secretsPath} (0600) and stored secret:${name.trim()}.`
814
+ : `Stored secret:${name.trim()}.`,
815
+ "info",
816
+ );
817
+ }
818
+ }
819
+ } else if (sub === "Remove a secret") {
820
+ const target = await ctx.ui.select("Remove which secret?", entries.map(([name]) => name));
821
+ if (target) {
822
+ await removeSecret(target, loaded.paths.secretsPath);
823
+ ctx.ui.notify(`Removed secret:${target}.`, "info");
824
+ }
825
+ } else if (sub && sub.includes(": ")) {
826
+ // Selected an existing secret — offer update/remove
827
+ const name = sub.split(": ")[0];
828
+ const action = await ctx.ui.select(`secret:${name}`, ["Update value", "Remove"]);
829
+ if (action === "Update value") {
830
+ const value = await ctx.ui.input(`New API key for "${name}":`, "");
831
+ if (value) {
832
+ await setSecret(name, value, loaded.paths.secretsPath);
833
+ ctx.ui.notify(`Updated secret:${name}.`, "info");
834
+ }
835
+ } else if (action === "Remove") {
836
+ await removeSecret(name, loaded.paths.secretsPath);
837
+ ctx.ui.notify(`Removed secret:${name}.`, "info");
838
+ }
839
+ }
784
840
  } else if (choice.startsWith("[Embedding]") || choice.startsWith("[Rerank]")) {
785
841
  const isEmbedding = choice.startsWith("[Embedding]");
786
842
  const profile = isEmbedding ? ensureEmbeddingProfile(config) : ensureRerankProfile(config);
@@ -796,8 +852,27 @@ ${goal} — verified and complete.
796
852
  ]);
797
853
 
798
854
  if (sub?.startsWith("Provider")) {
799
- const val = await ctx.ui.input("Provider id:", profile.provider);
800
- if (val) setProviderProfileField(profile, "provider", val);
855
+ const kind = isEmbedding ? "embedding" : "rerank";
856
+ const presetLabels = PROVIDER_PRESETS.map((p) => `${p.label} — ${p.baseUrl}`);
857
+ const pick = await ctx.ui.select(`Select ${kind} provider`, [...presetLabels, "custom (enter manually)"]);
858
+ if (pick === "custom (enter manually)") {
859
+ const val = await ctx.ui.input("Provider id:", profile.provider);
860
+ if (val) setProviderProfileField(profile, "provider", val);
861
+ const url = await ctx.ui.input("Base URL:", profile.baseUrl ?? "");
862
+ if (url) setProviderProfileField(profile, "baseUrl", url);
863
+ } else if (pick) {
864
+ const preset = PROVIDER_PRESETS[presetLabels.indexOf(pick)];
865
+ applyProviderPreset(profile, preset, kind as "embedding" | "rerank");
866
+ ctx.ui.notify(`Set ${kind} provider = ${preset.label} (${preset.baseUrl})`, "info");
867
+ // Offer API key entry right away — stores in ~/.pi/para/secrets.json
868
+ // (file is created on first write with 0600 permissions).
869
+ const key = await ctx.ui.input(`${preset.label} API key (empty to skip; stored as secret:${kind}):`, "");
870
+ if (key) {
871
+ await setSecret(kind, key, loaded.paths.secretsPath);
872
+ setProviderProfileField(profile, "credentialRef", `secret:${kind}`);
873
+ ctx.ui.notify(`Stored secret:${kind} and set credentialRef.`, "info");
874
+ }
875
+ }
801
876
  } else if (sub?.startsWith("Base URL")) {
802
877
  const val = await ctx.ui.input("Base URL:", profile.baseUrl ?? "");
803
878
  if (val) setProviderProfileField(profile, "baseUrl", val);
package/src/config.ts CHANGED
@@ -58,15 +58,6 @@ export interface ParaUserConfig {
58
58
  port: number;
59
59
  launch: "manual" | "disabled";
60
60
  };
61
- gepa: {
62
- useOptimized: boolean;
63
- studentModel: string;
64
- teacherModel: string;
65
- judgeModel: string;
66
- auto: "light" | "medium" | "heavy";
67
- threads: number;
68
- seed: number;
69
- };
70
61
  }
71
62
 
72
63
  export interface LegacyParaRuntimeConfig {
@@ -81,7 +72,6 @@ export interface LegacyParaRuntimeConfig {
81
72
  searchGraphBoost: boolean;
82
73
  daemonModel: string | null;
83
74
  webWiki: { enabled: boolean; host: string; port: number };
84
- gepa: ParaUserConfig["gepa"];
85
75
  }
86
76
 
87
77
  export interface LoadedParaConfig {
@@ -137,15 +127,6 @@ export function getDefaultUserConfig(homeDir?: string): ParaUserConfig {
137
127
  port: 10973,
138
128
  launch: "manual",
139
129
  },
140
- gepa: {
141
- useOptimized: false,
142
- studentModel: "anthropic/claude-sonnet-4-20250514",
143
- teacherModel: "anthropic/claude-opus-4-6",
144
- judgeModel: "anthropic/claude-sonnet-4-20250514",
145
- auto: "light",
146
- threads: 2,
147
- seed: 42,
148
- },
149
130
  };
150
131
  }
151
132
 
@@ -215,7 +196,6 @@ export function normalizeConfig(input: Partial<ParaUserConfig>, homeDir?: string
215
196
  qmd: { ...defaults.qmd, ...input.qmd },
216
197
  lint: { ...defaults.lint, ...input.lint },
217
198
  webWiki: { ...defaults.webWiki, ...input.webWiki },
218
- gepa: { ...defaults.gepa, ...input.gepa },
219
199
  };
220
200
  }
221
201
 
@@ -295,10 +275,6 @@ export function migrateLegacyConfig(
295
275
  config.webWiki.port = numberOr(legacy.webWiki.port, defaults.webWiki.port);
296
276
  }
297
277
 
298
- if (isRecord(legacy.gepa)) {
299
- config.gepa = { ...config.gepa, ...legacy.gepa } as ParaUserConfig["gepa"];
300
- }
301
-
302
278
  return config;
303
279
  }
304
280
 
@@ -321,7 +297,6 @@ export function toLegacyRuntimeConfig(config: ParaUserConfig): LegacyParaRuntime
321
297
  host: config.webWiki.host,
322
298
  port: config.webWiki.port,
323
299
  },
324
- gepa: config.gepa,
325
300
  };
326
301
  }
327
302
 
package/src/doctor.ts CHANGED
@@ -201,8 +201,28 @@ async function checkQmd(wikiDir: string, config: ParaUserConfig, secretsPath: st
201
201
  paraConfig: { ...config, qmd: { ...config.qmd, embedEnabled: false } },
202
202
  secretsPath,
203
203
  });
204
+ let embedInfo = "";
205
+ let pending = 0;
206
+ let hasVectorIndex = false;
207
+ try {
208
+ const status = await store.getStatus();
209
+ hasVectorIndex = Boolean(status.hasVectorIndex);
210
+ pending = status.needsEmbedding ?? 0;
211
+ const profile = config.qmd.embedding;
212
+ const endpointHost = profile?.baseUrl ? new URL(profile.baseUrl).host : "default";
213
+ const adapter = profile ? `${profile.provider}/${profile.model ?? "model not set"} at ${endpointHost}` : "no embedding profile";
214
+ embedInfo = ` — vector index: ${hasVectorIndex ? "yes" : "no"}, pending embeddings: ${pending}, embed: ${adapter}`;
215
+ } catch {
216
+ // status probe is best-effort
217
+ }
204
218
  await closeStore(store);
205
- return { name: "qmd-sdk", status: "ok", message: "store opened and updated with pi-para provider profiles" };
219
+ // Pending embeddings are expected transient state — the background
220
+ // qmd-embed scheduler task drains them while a Pi session is open — so
221
+ // report the numbers without failing the check.
222
+ const note = config.qmd.embedEnabled !== false && !hasVectorIndex && pending > 0
223
+ ? " (background qmd-embed task will process these while a Pi session is open)"
224
+ : "";
225
+ return { name: "qmd-sdk", status: "ok", message: `store opened and updated with pi-para provider profiles${embedInfo}${note}` };
206
226
  } catch (err) {
207
227
  return { name: "qmd-sdk", status: "error", message: err instanceof Error ? err.message : String(err), fixable: false };
208
228
  }
package/src/index.ts CHANGED
@@ -65,26 +65,6 @@ interface ParaConfig {
65
65
  host: string;
66
66
  port: number;
67
67
  };
68
- /** GEPA prompt optimizer settings */
69
- gepa: {
70
- /** When true, load optimized prompts from ~/.pi/wiki/gepa/optimized/ at runtime. */
71
- useOptimized: boolean;
72
- /** Student model — runs the proxy (generates wiki output). Fast + cheap.
73
- * Default: anthropic/claude-sonnet-4-20250514 */
74
- studentModel: string | null;
75
- /** Teacher/reflection model — proposes instruction mutations. Smart + creative.
76
- * Default: anthropic/claude-opus-4-6 */
77
- teacherModel: string | null;
78
- /** Judge model — scores candidate outputs (LLM-as-judge). Fast + cheap.
79
- * Default: same as studentModel */
80
- judgeModel: string | null;
81
- /** Budget preset: light (~460 calls), medium (~1500), heavy (~5000) */
82
- auto: "light" | "medium" | "heavy";
83
- /** Parallel eval threads */
84
- threads: number;
85
- /** Random seed for reproducibility */
86
- seed: number;
87
- };
88
68
  }
89
69
 
90
70
  function getDefaultConfig(): ParaConfig {
@@ -104,15 +84,6 @@ function getDefaultConfig(): ParaConfig {
104
84
  host: "0.0.0.0",
105
85
  port: 10973,
106
86
  },
107
- gepa: {
108
- useOptimized: true,
109
- studentModel: null,
110
- teacherModel: null,
111
- judgeModel: null,
112
- auto: "light",
113
- threads: 2,
114
- seed: 42,
115
- },
116
87
  };
117
88
  }
118
89
 
@@ -127,15 +98,7 @@ async function loadConfig(): Promise<LoadedRuntimeConfig> {
127
98
  const loaded = await loadParaConfig({ migrate: true });
128
99
  const runtime = toLegacyRuntimeConfig(loaded.config);
129
100
  return {
130
- runtime: {
131
- ...runtime,
132
- gepa: {
133
- ...runtime.gepa,
134
- studentModel: runtime.gepa.studentModel ?? null,
135
- teacherModel: runtime.gepa.teacherModel ?? null,
136
- judgeModel: runtime.gepa.judgeModel ?? null,
137
- },
138
- },
101
+ runtime,
139
102
  userConfig: loaded.config,
140
103
  secretsPath: loaded.paths.secretsPath,
141
104
  };
@@ -360,6 +323,7 @@ export default async function piPara(pi: ExtensionAPI): Promise<void> {
360
323
  // Capture handler registration is best-effort; manual capture remains available.
361
324
  }
362
325
 
326
+ const embedEnabled = loadedConfig.userConfig?.qmd.embedEnabled !== false;
363
327
  const schedulerEnabled = !isPrintModeProcess() && schedulerConfig?.enabled !== false;
364
328
  const scheduler = schedulerEnabled
365
329
  ? startWikiScheduler({
@@ -369,9 +333,23 @@ export default async function piPara(pi: ExtensionAPI): Promise<void> {
369
333
  storeProvider: () => store,
370
334
  markDirty: () => markContextDirty(),
371
335
  handlers: schedulerHandlers,
336
+ embedEnabled,
372
337
  })
373
338
  : null;
374
339
 
340
+ // Drain any pre-existing embedding backlog in the background. Startup
341
+ // opens the store with backgroundEmbed:false (fast print-mode exits), so
342
+ // without this new pages stayed BM25-only until an explicit embed pass.
343
+ if (scheduler && embedEnabled && store) {
344
+ try {
345
+ scheduler.embedEnabled = true;
346
+ scheduler.enqueue("qmd-embed", {}, { dedupeKey: "qmd-embed", priority: 5 });
347
+ void scheduler.tick();
348
+ } catch {
349
+ // Background embedding is best-effort; BM25 search works regardless.
350
+ }
351
+ }
352
+
375
353
  if (scheduler && startupCatchupEnabled) {
376
354
  try {
377
355
  const stateDb = new StateDB(wikiDir);
@@ -16,6 +16,12 @@ export interface WikiSchedulerOptions {
16
16
  storeProvider?: () => QMDStore | null;
17
17
  markDirty?: () => void;
18
18
  handlers?: Record<string, SchedulerTaskHandler>;
19
+ /**
20
+ * When true, wiki-maintenance chains a deduplicated `qmd-embed` task after
21
+ * reindexing so new/changed pages get vector embeddings in the background.
22
+ * Default false so standalone/test schedulers keep BM25-only behavior.
23
+ */
24
+ embedEnabled?: boolean;
19
25
  }
20
26
 
21
27
  export class WikiScheduler {
@@ -31,6 +37,7 @@ export class WikiScheduler {
31
37
  private readonly storeProvider: () => QMDStore | null;
32
38
  private readonly markDirty: () => void;
33
39
  private handlers: Record<string, SchedulerTaskHandler>;
40
+ embedEnabled: boolean;
34
41
 
35
42
  constructor(opts: WikiSchedulerOptions) {
36
43
  this.wikiDir = opts.wikiDir;
@@ -40,8 +47,10 @@ export class WikiScheduler {
40
47
  this.enabled = opts.enabled ?? true;
41
48
  this.storeProvider = opts.storeProvider ?? (() => null);
42
49
  this.markDirty = opts.markDirty ?? (() => {});
50
+ this.embedEnabled = opts.embedEnabled ?? false;
43
51
  this.handlers = {
44
52
  "wiki-maintenance": async () => this.runWikiMaintenance(),
53
+ "qmd-embed": async () => this.runQmdEmbed(),
45
54
  ...(opts.handlers ?? {}),
46
55
  };
47
56
  }
@@ -129,6 +138,40 @@ export class WikiScheduler {
129
138
  } finally {
130
139
  releaseLease(this.state.db, leaseKey, this.holderId);
131
140
  }
141
+ // Chain background embedding so changed pages become vector-searchable.
142
+ // Runs as its own task (deduplicated) so reindex latency stays low and
143
+ // embedding failures are recorded/retried instead of breaking maintenance.
144
+ if (this.embedEnabled) {
145
+ this.enqueue("qmd-embed", {}, { dedupeKey: "qmd-embed", priority: 5 });
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Generate vector embeddings for documents QMD reports as pending.
151
+ * Skips fast when the backlog is empty. Throws when the embedding pass
152
+ * reports errors so the scheduler records the failure and retries with
153
+ * backoff — BM25 search keeps working regardless.
154
+ */
155
+ private async runQmdEmbed(): Promise<void> {
156
+ const store = this.storeProvider();
157
+ if (!store) return;
158
+
159
+ const status = await store.getStatus();
160
+ const pending = status.needsEmbedding ?? 0;
161
+ if (pending === 0) return;
162
+
163
+ const leaseKey = `qmd-embed:${this.wikiDir}`;
164
+ if (!acquireLease(this.state.db, leaseKey, this.holderId, { ttlMs: 15 * 60_000 })) return;
165
+ try {
166
+ const result = await store.embed();
167
+ if (result.errors > 0) {
168
+ throw new Error(
169
+ `qmd embed finished with ${result.errors} error(s) (${result.chunksEmbedded} chunk(s) embedded, ${pending} doc(s) were pending)`,
170
+ );
171
+ }
172
+ } finally {
173
+ releaseLease(this.state.db, leaseKey, this.holderId);
174
+ }
132
175
  }
133
176
  }
134
177
 
@@ -200,6 +243,27 @@ export function enqueueWikiMaintenance(
200
243
  return null;
201
244
  }
202
245
 
246
+ /**
247
+ * Enqueue a deduplicated background embedding pass (e.g. at session startup
248
+ * to drain a pre-existing needsEmbedding backlog). No-op scheduling cost when
249
+ * the backlog is empty — the task exits after one getStatus() call.
250
+ */
251
+ export function enqueueQmdEmbed(
252
+ wikiDir: string,
253
+ store: QMDStore,
254
+ opts: { dbPath?: string } = {},
255
+ ): number {
256
+ const scheduler = getWikiScheduler({
257
+ wikiDir,
258
+ dbPath: opts.dbPath,
259
+ storeProvider: () => store,
260
+ });
261
+ scheduler.embedEnabled = true;
262
+ const id = scheduler.enqueue("qmd-embed", {}, { dedupeKey: "qmd-embed", priority: 5 });
263
+ void scheduler.tick();
264
+ return id;
265
+ }
266
+
203
267
  export function resetSchedulersForTests(): void {
204
268
  for (const timer of debounceTimers.values()) clearTimeout(timer);
205
269
  debounceTimers.clear();
package/src/settings.ts CHANGED
@@ -120,6 +120,94 @@ export function disableRerank(config: ParaUserConfig): void {
120
120
  config.qmd.rerank = null;
121
121
  }
122
122
 
123
+ // -- Provider presets ---------------------------------------------------------
124
+
125
+ /** Known API providers selectable in /wiki-settings (baseUrl + format prefilled). */
126
+ export interface ProviderPreset {
127
+ id: string;
128
+ label: string;
129
+ baseUrl: string;
130
+ apiFormat: "openai" | "anthropic";
131
+ defaultEmbedModel?: string;
132
+ defaultRerankModel?: string;
133
+ }
134
+
135
+ export const PROVIDER_PRESETS: ProviderPreset[] = [
136
+ {
137
+ id: "openai",
138
+ label: "OpenAI",
139
+ baseUrl: "https://api.openai.com/v1",
140
+ apiFormat: "openai",
141
+ defaultEmbedModel: "text-embedding-3-small",
142
+ },
143
+ {
144
+ id: "openrouter",
145
+ label: "OpenRouter",
146
+ baseUrl: "https://openrouter.ai/api/v1",
147
+ apiFormat: "openai",
148
+ defaultEmbedModel: "openai/text-embedding-3-small",
149
+ },
150
+ {
151
+ id: "gemini",
152
+ label: "Google Gemini (OpenAI-compatible)",
153
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
154
+ apiFormat: "openai",
155
+ defaultEmbedModel: "text-embedding-004",
156
+ },
157
+ {
158
+ id: "mistral",
159
+ label: "Mistral",
160
+ baseUrl: "https://api.mistral.ai/v1",
161
+ apiFormat: "openai",
162
+ defaultEmbedModel: "mistral-embed",
163
+ },
164
+ {
165
+ id: "voyage",
166
+ label: "Voyage AI",
167
+ baseUrl: "https://api.voyageai.com/v1",
168
+ apiFormat: "openai",
169
+ defaultEmbedModel: "voyage-3-lite",
170
+ defaultRerankModel: "rerank-2-lite",
171
+ },
172
+ {
173
+ id: "jina",
174
+ label: "Jina AI",
175
+ baseUrl: "https://api.jina.ai/v1",
176
+ apiFormat: "openai",
177
+ defaultEmbedModel: "jina-embeddings-v3",
178
+ defaultRerankModel: "jina-reranker-v2-base-multilingual",
179
+ },
180
+ {
181
+ id: "ollama",
182
+ label: "Ollama (local server)",
183
+ baseUrl: "http://127.0.0.1:11434/v1",
184
+ apiFormat: "openai",
185
+ defaultEmbedModel: "nomic-embed-text",
186
+ },
187
+ ];
188
+
189
+ export function findProviderPreset(id: string): ProviderPreset | undefined {
190
+ return PROVIDER_PRESETS.find((p) => p.id === id);
191
+ }
192
+
193
+ /**
194
+ * Apply a provider preset to an embedding/rerank profile: sets provider,
195
+ * baseUrl, apiFormat, and the preset's default model for the profile kind.
196
+ * Leaves credentialRef and dims untouched (dims must match any existing
197
+ * vector index; credential wiring is a separate explicit step).
198
+ */
199
+ export function applyProviderPreset(
200
+ profile: ProviderCredentialRef,
201
+ preset: ProviderPreset,
202
+ kind: "embedding" | "rerank",
203
+ ): void {
204
+ profile.provider = preset.id;
205
+ profile.baseUrl = preset.baseUrl;
206
+ profile.apiFormat = preset.apiFormat;
207
+ const model = kind === "embedding" ? preset.defaultEmbedModel : preset.defaultRerankModel;
208
+ if (model) profile.model = model;
209
+ }
210
+
123
211
  function parsePositiveInteger(value: string, fallback: number): number {
124
212
  const parsed = parseInt(value, 10);
125
213
  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
package/src/setup.ts CHANGED
@@ -79,7 +79,7 @@ export function formatSetupResult(result: SetupResult): string {
79
79
  const lines = [`pi-para setup ${result.dryRun ? "dry run " : ""}complete.`];
80
80
  for (const change of result.changes) lines.push(` ✓ ${change}`);
81
81
  for (const warning of result.warnings) lines.push(` ⚠ ${warning}`);
82
- lines.push("", "Next: restart open Pi sessions, then run /wiki or pi-para doctor.");
82
+ lines.push("", "Next: restart open Pi sessions, then run /wiki or `npx -y pi-para@latest doctor`.");
83
83
  return lines.join("\n");
84
84
  }
85
85