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.
- package/ARCHITECTURE.md +0 -9
- package/CHANGELOG.md +22 -0
- package/CONFIGURATION.md +5 -23
- package/README.md +7 -31
- package/SETUP.md +5 -3
- package/STRUCTURE.md +0 -9
- package/dist/atomic-write.d.ts +2 -0
- package/dist/atomic-write.d.ts.map +1 -0
- package/dist/atomic-write.js +18 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/capture.d.ts +34 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +461 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli-legacy.d.ts +4 -0
- package/dist/cli-legacy.d.ts.map +1 -0
- package/dist/cli-legacy.js +41 -0
- package/dist/cli-legacy.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +15 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +791 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +94 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +228 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +63 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +311 -0
- package/dist/context.js.map +1 -0
- package/dist/credentials.d.ts +27 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +85 -0
- package/dist/credentials.js.map +1 -0
- package/dist/daemon.d.ts +49 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +226 -0
- package/dist/daemon.js.map +1 -0
- package/dist/doctor.d.ts +20 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +197 -0
- package/dist/doctor.js.map +1 -0
- package/dist/frontmatter.d.ts +59 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +170 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +357 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +88 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +105 -0
- package/dist/ingest.js.map +1 -0
- package/dist/link-discovery.d.ts +40 -0
- package/dist/link-discovery.d.ts.map +1 -0
- package/dist/link-discovery.js +122 -0
- package/dist/link-discovery.js.map +1 -0
- package/dist/link-utils.d.ts +30 -0
- package/dist/link-utils.d.ts.map +1 -0
- package/dist/link-utils.js +145 -0
- package/dist/link-utils.js.map +1 -0
- package/dist/lint.d.ts +39 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +827 -0
- package/dist/lint.js.map +1 -0
- package/dist/maintainer.d.ts +24 -0
- package/dist/maintainer.d.ts.map +1 -0
- package/dist/maintainer.js +358 -0
- package/dist/maintainer.js.map +1 -0
- package/dist/model-resolver.d.ts +30 -0
- package/dist/model-resolver.d.ts.map +1 -0
- package/dist/model-resolver.js +71 -0
- package/dist/model-resolver.js.map +1 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +33 -0
- package/dist/paths.js.map +1 -0
- package/dist/processor.d.ts +14 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +361 -0
- package/dist/processor.js.map +1 -0
- package/dist/qmd-providers.d.ts +12 -0
- package/dist/qmd-providers.d.ts.map +1 -0
- package/dist/qmd-providers.js +45 -0
- package/dist/qmd-providers.js.map +1 -0
- package/dist/query.d.ts +69 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +120 -0
- package/dist/query.js.map +1 -0
- package/dist/raw.d.ts +57 -0
- package/dist/raw.d.ts.map +1 -0
- package/dist/raw.js +219 -0
- package/dist/raw.js.map +1 -0
- package/dist/redact.d.ts +21 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +143 -0
- package/dist/redact.js.map +1 -0
- package/dist/repair.d.ts +11 -0
- package/dist/repair.d.ts.map +1 -0
- package/dist/repair.js +41 -0
- package/dist/repair.js.map +1 -0
- package/dist/scheduler/controls.d.ts +35 -0
- package/dist/scheduler/controls.d.ts.map +1 -0
- package/dist/scheduler/controls.js +98 -0
- package/dist/scheduler/controls.js.map +1 -0
- package/dist/scheduler/index.d.ts +70 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +245 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/leases.d.ts +22 -0
- package/dist/scheduler/leases.d.ts.map +1 -0
- package/dist/scheduler/leases.js +74 -0
- package/dist/scheduler/leases.js.map +1 -0
- package/dist/scheduler/session-capture.d.ts +33 -0
- package/dist/scheduler/session-capture.d.ts.map +1 -0
- package/dist/scheduler/session-capture.js +108 -0
- package/dist/scheduler/session-capture.js.map +1 -0
- package/dist/scheduler/state.d.ts +56 -0
- package/dist/scheduler/state.d.ts.map +1 -0
- package/dist/scheduler/state.js +210 -0
- package/dist/scheduler/state.js.map +1 -0
- package/dist/scope.d.ts +54 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +161 -0
- package/dist/scope.js.map +1 -0
- package/dist/scripts/bulk-link-fix.d.ts +9 -0
- package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
- package/dist/scripts/bulk-link-fix.js +106 -0
- package/dist/scripts/bulk-link-fix.js.map +1 -0
- package/dist/session-tools.d.ts +33 -0
- package/dist/session-tools.d.ts.map +1 -0
- package/dist/session-tools.js +211 -0
- package/dist/session-tools.js.map +1 -0
- package/dist/settings.d.ts +37 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +176 -0
- package/dist/settings.js.map +1 -0
- package/dist/setup.d.ts +29 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +90 -0
- package/dist/setup.js.map +1 -0
- package/dist/state.d.ts +54 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +176 -0
- package/dist/state.js.map +1 -0
- package/dist/status.d.ts +22 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +93 -0
- package/dist/status.js.map +1 -0
- package/dist/store.d.ts +71 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +282 -0
- package/dist/store.js.map +1 -0
- package/dist/summarize.d.ts +60 -0
- package/dist/summarize.d.ts.map +1 -0
- package/dist/summarize.js +266 -0
- package/dist/summarize.js.map +1 -0
- package/dist/tag-registry.d.ts +56 -0
- package/dist/tag-registry.d.ts.map +1 -0
- package/dist/tag-registry.js +146 -0
- package/dist/tag-registry.js.map +1 -0
- package/dist/templates/prompts.d.ts +51 -0
- package/dist/templates/prompts.d.ts.map +1 -0
- package/dist/templates/prompts.js +203 -0
- package/dist/templates/prompts.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1198 -0
- package/dist/tools.js.map +1 -0
- package/dist/watcher.d.ts +25 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +84 -0
- package/dist/watcher.js.map +1 -0
- package/dist/webui/client/dist/index.html +1885 -0
- package/dist/webui/server.d.ts +31 -0
- package/dist/webui/server.d.ts.map +1 -0
- package/dist/webui/server.js +566 -0
- package/dist/webui/server.js.map +1 -0
- package/dist/wiki-tool-guidance.d.ts +6 -0
- package/dist/wiki-tool-guidance.d.ts.map +1 -0
- package/dist/wiki-tool-guidance.js +70 -0
- package/dist/wiki-tool-guidance.js.map +1 -0
- package/dist/wiki.d.ts +108 -0
- package/dist/wiki.d.ts.map +1 -0
- package/dist/wiki.js +497 -0
- package/dist/wiki.js.map +1 -0
- package/package.json +2 -1
- package/scripts/build-assets.mjs +1 -13
- package/skills/setup/SKILL.md +1 -1
- package/src/cli.ts +0 -70
- package/src/commands.ts +78 -3
- package/src/config.ts +0 -25
- package/src/doctor.ts +21 -1
- package/src/index.ts +16 -38
- package/src/scheduler/index.ts +64 -0
- package/src/settings.ts +88 -0
- package/src/setup.ts +1 -1
- package/src/templates/prompts.ts +0 -56
- package/scripts/gepa/dataset.py +0 -192
- package/scripts/gepa/lm_providers.py +0 -472
- package/scripts/gepa/metric.py +0 -279
- package/scripts/gepa/optimize.py +0 -367
- package/scripts/gepa/program.py +0 -99
- package/scripts/gepa/pyproject.toml +0 -19
- package/scripts/gepa/run-all.sh +0 -53
- package/scripts/gepa/wiki_reader.py +0 -113
- package/src/gepa/index.ts +0 -287
- package/src/gepa/optimized/capture-prompt.txt +0 -65
package/dist/wiki.js.map
ADDED
|
@@ -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.
|
|
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",
|
package/scripts/build-assets.mjs
CHANGED
|
@@ -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
|
|
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
|
-
}
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
|
800
|
-
|
|
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
|
-
|
|
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);
|
package/src/scheduler/index.ts
CHANGED
|
@@ -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
|
|