pi-para 0.6.0 → 0.6.1
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 +13 -0
- package/CONFIGURATION.md +0 -23
- package/README.md +1 -29
- package/SETUP.md +1 -1
- 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 +719 -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 +176 -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 +342 -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 +48 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +193 -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 +19 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +106 -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/config.ts +0 -25
- package/src/index.ts +1 -38
- 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/paths.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
3
|
+
export function expandHome(path, homeDir = homedir()) {
|
|
4
|
+
if (path === "~")
|
|
5
|
+
return homeDir;
|
|
6
|
+
if (path.startsWith("~/") || path.startsWith("~\\"))
|
|
7
|
+
return join(homeDir, path.slice(2));
|
|
8
|
+
return path;
|
|
9
|
+
}
|
|
10
|
+
export function resolvePath(path, baseDir = process.cwd(), homeDir = homedir()) {
|
|
11
|
+
const expanded = expandHome(path, homeDir);
|
|
12
|
+
return isAbsolute(expanded) ? expanded : resolve(baseDir, expanded);
|
|
13
|
+
}
|
|
14
|
+
export function getParaPaths(opts = {}) {
|
|
15
|
+
const homeDir = opts.homeDir ?? homedir();
|
|
16
|
+
const agentDir = join(homeDir, ".pi", "agent");
|
|
17
|
+
const paraDir = join(homeDir, ".pi", "para");
|
|
18
|
+
const wikiDir = opts.wikiDir ? resolvePath(opts.wikiDir, process.cwd(), homeDir) : join(homeDir, ".pi", "wiki");
|
|
19
|
+
return {
|
|
20
|
+
homeDir,
|
|
21
|
+
agentDir,
|
|
22
|
+
paraDir,
|
|
23
|
+
wikiDir,
|
|
24
|
+
userConfigPath: join(paraDir, "config.jsonc"),
|
|
25
|
+
secretsPath: join(paraDir, "secrets.json"),
|
|
26
|
+
schedulerDbPath: join(wikiDir, ".pi-para.sqlite"),
|
|
27
|
+
qmdDbPath: join(wikiDir, ".qmd.sqlite"),
|
|
28
|
+
legacyConfigPath: join(wikiDir, "config.json"),
|
|
29
|
+
legacyQmdConfigPath: join(homeDir, ".config", "qmd", "index.yml"),
|
|
30
|
+
piSettingsPath: join(agentDir, "settings.json"),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBtD,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAO,GAAG,OAAO,EAAE;IAC1D,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO,EAAE;IACpF,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAA+C,EAAE;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAEhH,OAAO;QACL,OAAO;QACP,QAAQ;QACR,OAAO;QACP,OAAO;QACP,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAC7C,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAC1C,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACjD,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QACvC,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QAC9C,mBAAmB,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC;QACjE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session processor — uses Agent with session exploration tools
|
|
3
|
+
* to extract knowledge and write wiki pages.
|
|
4
|
+
*/
|
|
5
|
+
import type { Model } from "@earendil-works/pi-ai";
|
|
6
|
+
import type { QMDStore } from "qmd-engine";
|
|
7
|
+
export interface ProcessResult {
|
|
8
|
+
pagesCreated: string[];
|
|
9
|
+
pagesUpdated: string[];
|
|
10
|
+
skipped: boolean;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function processSession(sessionPath: string, wikiDir: string, store: QMDStore, scope: string, model: Model<any>, getApiKey: (provider: string) => Promise<string | undefined>): Promise<ProcessResult>;
|
|
14
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0B3C,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmOD,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAC3D,OAAO,CAAC,aAAa,CAAC,CA6IxB"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session processor — uses Agent with session exploration tools
|
|
3
|
+
* to extract knowledge and write wiki pages.
|
|
4
|
+
*/
|
|
5
|
+
import { Agent } from "@earendil-works/pi-agent-core";
|
|
6
|
+
import { readPage, writePage, listPages, writeIndex, appendLog, gitCommit, PARA_CATEGORIES, } from "./wiki.js";
|
|
7
|
+
import { validateFrontmatter } from "./frontmatter.js";
|
|
8
|
+
import { extractWikilinks, autoLinkSlugs, syncFrontmatterLinks } from "./link-utils.js";
|
|
9
|
+
import { normalizeTags, normalizeScopes } from "./tag-registry.js";
|
|
10
|
+
import { redactSecrets } from "./redact.js";
|
|
11
|
+
import { reindex, searchWiki } from "./store.js";
|
|
12
|
+
import { appendSessionDigest } from "./raw.js";
|
|
13
|
+
import { Type } from "typebox";
|
|
14
|
+
import { StringEnum } from "@earendil-works/pi-ai";
|
|
15
|
+
import { loadSession, createSessionTools } from "./session-tools.js";
|
|
16
|
+
// -- Wiki tools for the Agent ------------------------------------------------
|
|
17
|
+
const WikiWriteParams = Type.Object({
|
|
18
|
+
category: StringEnum(["projects", "areas", "resources", "archives"]),
|
|
19
|
+
slug: Type.String(),
|
|
20
|
+
title: Type.String(),
|
|
21
|
+
scope: Type.Array(Type.String()),
|
|
22
|
+
tags: Type.Array(Type.String()),
|
|
23
|
+
body: Type.String(),
|
|
24
|
+
});
|
|
25
|
+
const WikiQueryParams = Type.Object({ query: Type.String() });
|
|
26
|
+
const WikiReadParams = Type.Object({ path: Type.String({ description: "category/slug" }) });
|
|
27
|
+
function createWikiTools(wikiDir, store) {
|
|
28
|
+
const wikiWrite = {
|
|
29
|
+
name: "wiki_write",
|
|
30
|
+
label: "Wiki Write",
|
|
31
|
+
description: "Create or update a wiki page with PARA frontmatter.",
|
|
32
|
+
parameters: WikiWriteParams,
|
|
33
|
+
execute: async (_id, params) => {
|
|
34
|
+
const now = new Date().toISOString();
|
|
35
|
+
const slug = params.slug.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
36
|
+
const existing = await readPage(wikiDir, params.category, slug);
|
|
37
|
+
// Gather all existing slugs for auto-linking
|
|
38
|
+
const allRefs = await listPages(wikiDir);
|
|
39
|
+
const allSlugs = new Set(allRefs.map(r => r.slug));
|
|
40
|
+
allSlugs.add(slug);
|
|
41
|
+
// Auto-link slug mentions in body text, redact any secrets
|
|
42
|
+
const linkedBody = redactSecrets(autoLinkSlugs(params.body, allSlugs, slug)).text;
|
|
43
|
+
if (existing) {
|
|
44
|
+
// Update existing page (exact slug match)
|
|
45
|
+
const rawScope = params.scope.length > 0 ? params.scope : existing.frontmatter.scope;
|
|
46
|
+
const newScope = normalizeScopes(rawScope);
|
|
47
|
+
const mergedTags = [...new Set([...existing.frontmatter.tags, ...params.tags])];
|
|
48
|
+
const updated = {
|
|
49
|
+
...existing,
|
|
50
|
+
body: linkedBody,
|
|
51
|
+
frontmatter: {
|
|
52
|
+
...existing.frontmatter,
|
|
53
|
+
title: params.title,
|
|
54
|
+
scope: newScope,
|
|
55
|
+
tags: normalizeTags(mergedTags, newScope),
|
|
56
|
+
updated: now,
|
|
57
|
+
links: syncFrontmatterLinks(linkedBody),
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
await writePage(wikiDir, updated);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Create new page
|
|
64
|
+
const newScope = normalizeScopes(params.scope);
|
|
65
|
+
const fm = validateFrontmatter({
|
|
66
|
+
title: params.title,
|
|
67
|
+
para: params.category,
|
|
68
|
+
scope: newScope,
|
|
69
|
+
tags: normalizeTags(params.tags, newScope),
|
|
70
|
+
sources: [],
|
|
71
|
+
created: now,
|
|
72
|
+
updated: now,
|
|
73
|
+
links: syncFrontmatterLinks(linkedBody),
|
|
74
|
+
});
|
|
75
|
+
await writePage(wikiDir, { category: params.category, slug, frontmatter: fm, body: linkedBody });
|
|
76
|
+
}
|
|
77
|
+
await reindex(store);
|
|
78
|
+
await rebuildIndex(wikiDir);
|
|
79
|
+
await gitCommit(wikiDir, `capture: ${params.category}/${slug}`);
|
|
80
|
+
return {
|
|
81
|
+
content: [{ type: "text", text: `Wrote ${params.category}/${slug}` }],
|
|
82
|
+
details: { path: `${params.category}/${slug}`, existed: !!existing },
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
const wikiQuery = {
|
|
87
|
+
name: "wiki_query",
|
|
88
|
+
label: "Wiki Query",
|
|
89
|
+
description: "Search the wiki for existing pages (for deduplication).",
|
|
90
|
+
parameters: WikiQueryParams,
|
|
91
|
+
execute: async (_id, params) => {
|
|
92
|
+
const results = await searchWiki(store, params.query, { limit: 5 });
|
|
93
|
+
if (results.length === 0) {
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: "text", text: "No matching wiki pages found." }],
|
|
96
|
+
details: { count: 0 },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const text = results
|
|
100
|
+
.map((r) => `${r.page.path}: ${r.frontmatter.title} (score: ${r.score.toFixed(3)})`)
|
|
101
|
+
.join("\n");
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: "text", text: `Found ${results.length} pages:\n${text}` }],
|
|
104
|
+
details: { count: results.length },
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const wikiRead = {
|
|
109
|
+
name: "wiki_read",
|
|
110
|
+
label: "Wiki Read",
|
|
111
|
+
description: "Read an existing wiki page by path (category/slug).",
|
|
112
|
+
parameters: WikiReadParams,
|
|
113
|
+
execute: async (_id, params) => {
|
|
114
|
+
const parts = params.path.split("/");
|
|
115
|
+
if (parts.length !== 2) {
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: "text", text: `Invalid path: ${params.path}` }],
|
|
118
|
+
details: {},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const [cat, slug] = parts;
|
|
122
|
+
const page = await readPage(wikiDir, cat, slug);
|
|
123
|
+
if (!page) {
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: "text", text: `Page not found: ${params.path}` }],
|
|
126
|
+
details: {},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: "text", text: `# ${page.frontmatter.title}\n\n${page.body}` }],
|
|
131
|
+
details: { title: page.frontmatter.title },
|
|
132
|
+
};
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
return [wikiWrite, wikiQuery, wikiRead];
|
|
136
|
+
}
|
|
137
|
+
// -- Helpers -----------------------------------------------------------------
|
|
138
|
+
async function rebuildIndex(wikiDir) {
|
|
139
|
+
const allPages = await listPages(wikiDir);
|
|
140
|
+
const sections = {
|
|
141
|
+
projects: [], areas: [], resources: [], archives: [],
|
|
142
|
+
};
|
|
143
|
+
for (const ref of allPages) {
|
|
144
|
+
const page = await readPage(wikiDir, ref.category, ref.slug);
|
|
145
|
+
const title = page?.frontmatter.title ?? ref.title;
|
|
146
|
+
const summary = page?.body.split("\n").find(l => l.trim() && !l.startsWith("#") && !l.startsWith("---"))?.trim() ?? "";
|
|
147
|
+
const desc = summary.length > 120 ? summary.slice(0, 117) + "..." : summary;
|
|
148
|
+
sections[ref.category].push(`- [[${ref.slug}]] \u2014 ${title}${desc ? ": " + desc : ""}`);
|
|
149
|
+
}
|
|
150
|
+
const indexLines = [
|
|
151
|
+
"# Wiki Index", "",
|
|
152
|
+
"## Projects", "", sections.projects.length > 0 ? sections.projects.join("\n") : "_No active projects._", "",
|
|
153
|
+
"## Areas", "", sections.areas.length > 0 ? sections.areas.join("\n") : "_No areas._", "",
|
|
154
|
+
"## Resources", "", sections.resources.length > 0 ? sections.resources.join("\n") : "_No resources._", "",
|
|
155
|
+
"## Archives", "", sections.archives.length > 0 ? sections.archives.join("\n") : "_No archived items._",
|
|
156
|
+
];
|
|
157
|
+
await writeIndex(wikiDir, indexLines.join("\n"));
|
|
158
|
+
}
|
|
159
|
+
// -- System prompt -----------------------------------------------------------
|
|
160
|
+
const CAPTURE_SYSTEM_PROMPT = `You are a knowledge capture agent. You explore coding session transcripts and extract valuable knowledge into a PARA-structured wiki.
|
|
161
|
+
|
|
162
|
+
You have tools to explore the session:
|
|
163
|
+
- session_stats: Get an overview of the session (message count, topics)
|
|
164
|
+
- session_search: Search for keywords in the session
|
|
165
|
+
- session_slice: Read a specific character range of the session
|
|
166
|
+
|
|
167
|
+
And tools to write to the wiki:
|
|
168
|
+
- wiki_query: Search existing wiki pages (check for duplicates first!)
|
|
169
|
+
- wiki_read: Read an existing page
|
|
170
|
+
- wiki_write: Create or update a wiki page
|
|
171
|
+
|
|
172
|
+
PARA category rules (IMPORTANT):
|
|
173
|
+
- **resources/**: Use for almost everything — architecture docs, how-tos, debugging solutions, configs, patterns, reference material. This is the default.
|
|
174
|
+
- **areas/**: Only for ongoing responsibilities with no end date (e.g. server config, deployment procedures).
|
|
175
|
+
- **projects/**: ONLY for actual project goals with a defined end date. Do NOT use for documentation about a project's internals. A page like "pi-para-daemon" is a resource about pi-para, not a project.
|
|
176
|
+
- **archives/**: Never create pages here — pages get moved here when completed.
|
|
177
|
+
|
|
178
|
+
Scope rules:
|
|
179
|
+
- scope must be a project name in kebab-case (e.g. "pi-para", "qmd", "pi-mono")
|
|
180
|
+
- Do NOT put topic descriptions in scope (wrong: "session exploration", right: "pi-para")
|
|
181
|
+
|
|
182
|
+
Security rules:
|
|
183
|
+
- NEVER include API keys, tokens, passwords, or secrets in wiki pages
|
|
184
|
+
- Document WHERE the secret is stored (e.g. "API key in ~/.config/qmd/index.yml"), not the value itself
|
|
185
|
+
|
|
186
|
+
Your workflow:
|
|
187
|
+
1. Call session_stats to understand the session
|
|
188
|
+
2. For each topic, call wiki_query FIRST to find existing pages on that topic
|
|
189
|
+
3. Call session_search or session_slice to read the relevant discussion
|
|
190
|
+
4. If wiki_query found a matching page, call wiki_read to get its content, then wiki_write to UPDATE it (use the same slug)
|
|
191
|
+
5. Only create a NEW page if wiki_query returned no relevant results
|
|
192
|
+
|
|
193
|
+
CRITICAL: ALWAYS prefer updating existing pages over creating new ones. The wiki already has many pages — search before writing. If you find a page covering the same topic (even with a different title), update it by using its exact slug.
|
|
194
|
+
|
|
195
|
+
Capture ANY of these — even small facts:
|
|
196
|
+
- Architecture decisions and rationale
|
|
197
|
+
- Debugging solutions (root cause + fix)
|
|
198
|
+
- Server/infrastructure details (IPs, paths, configs)
|
|
199
|
+
- Build and deployment procedures
|
|
200
|
+
- Tool configurations and setup steps
|
|
201
|
+
- Package names and versions
|
|
202
|
+
- Project conventions and coding patterns
|
|
203
|
+
- Operational knowledge (how to restart, deploy, rollback)
|
|
204
|
+
|
|
205
|
+
Each wiki page must use this format:
|
|
206
|
+
## Topic
|
|
207
|
+
[What this covers]
|
|
208
|
+
|
|
209
|
+
## Key Facts
|
|
210
|
+
- [Fact 1]
|
|
211
|
+
- [Fact 2]
|
|
212
|
+
|
|
213
|
+
## Insights
|
|
214
|
+
- [Non-obvious finding]
|
|
215
|
+
|
|
216
|
+
## Sources
|
|
217
|
+
- [Session file path]
|
|
218
|
+
|
|
219
|
+
When done, respond with a summary of what you captured.`;
|
|
220
|
+
// -- Main processor ----------------------------------------------------------
|
|
221
|
+
export async function processSession(sessionPath, wikiDir, store, scope, model, getApiKey) {
|
|
222
|
+
// 1. Load session
|
|
223
|
+
const session = loadSession(sessionPath);
|
|
224
|
+
// 2. Quick check: worth processing?
|
|
225
|
+
const { stats } = session;
|
|
226
|
+
const hasToolCalls = stats.toolCalls > 0;
|
|
227
|
+
if (!hasToolCalls && (stats.totalMessages < 4 || stats.totalChars < 200)) {
|
|
228
|
+
return { pagesCreated: [], pagesUpdated: [], skipped: true, reason: "trivial session" };
|
|
229
|
+
}
|
|
230
|
+
// 3. Create tools
|
|
231
|
+
const sessionTools = createSessionTools(session);
|
|
232
|
+
const wikiTools = createWikiTools(wikiDir, store);
|
|
233
|
+
const allTools = [...sessionTools, ...wikiTools];
|
|
234
|
+
// 4. Spin up Agent with context pruning for long-running exploration.
|
|
235
|
+
// After many tool calls, the accumulated context can exceed the LLM's
|
|
236
|
+
// context window. Prune old session_slice/session_search results — the
|
|
237
|
+
// Agent already extracted what it needed from them.
|
|
238
|
+
// Use 75% of the model's context window (chars ≈ tokens * 4), leave headroom.
|
|
239
|
+
const contextWindowChars = (model.contextWindow ?? 128_000) * 4;
|
|
240
|
+
const MAX_CONTEXT_CHARS = Math.floor(contextWindowChars * 0.75);
|
|
241
|
+
const agent = new Agent({
|
|
242
|
+
initialState: {
|
|
243
|
+
systemPrompt: CAPTURE_SYSTEM_PROMPT,
|
|
244
|
+
model,
|
|
245
|
+
tools: allTools,
|
|
246
|
+
messages: [],
|
|
247
|
+
},
|
|
248
|
+
getApiKey,
|
|
249
|
+
transformContext: async (messages) => {
|
|
250
|
+
// Estimate total chars
|
|
251
|
+
let total = CAPTURE_SYSTEM_PROMPT.length;
|
|
252
|
+
for (const m of messages) {
|
|
253
|
+
if ("content" in m) {
|
|
254
|
+
const c = m.content;
|
|
255
|
+
if (typeof c === "string")
|
|
256
|
+
total += c.length;
|
|
257
|
+
else if (Array.isArray(c)) {
|
|
258
|
+
for (const b of c) {
|
|
259
|
+
if (typeof b === "object" && b !== null && "text" in b && typeof b.text === "string") {
|
|
260
|
+
total += b.text.length;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (total <= MAX_CONTEXT_CHARS)
|
|
267
|
+
return messages;
|
|
268
|
+
// Prune old tool results — truncate text blocks to 200 chars
|
|
269
|
+
return messages.map((m, i) => {
|
|
270
|
+
if (i >= messages.length - 10)
|
|
271
|
+
return m;
|
|
272
|
+
if (m.role !== "toolResult")
|
|
273
|
+
return m;
|
|
274
|
+
if (!("content" in m) || !Array.isArray(m.content))
|
|
275
|
+
return m;
|
|
276
|
+
const newContent = m.content.map(b => {
|
|
277
|
+
if (b.type === "text" && b.text.length > 200) {
|
|
278
|
+
return { type: "text", text: b.text.slice(0, 200) + "\n[pruned]" };
|
|
279
|
+
}
|
|
280
|
+
return b;
|
|
281
|
+
});
|
|
282
|
+
return { ...m, content: newContent };
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
// 5. Prompt the agent
|
|
287
|
+
const promptText = [
|
|
288
|
+
`Process this session and capture all valuable knowledge into the wiki.`,
|
|
289
|
+
`Session file: ${sessionPath}`,
|
|
290
|
+
`Project scope: ${scope}`,
|
|
291
|
+
`Start by calling session_stats to understand the session.`,
|
|
292
|
+
].join("\n");
|
|
293
|
+
try {
|
|
294
|
+
await agent.prompt(promptText);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
298
|
+
console.error(`[processor] Agent error: ${errMsg}`);
|
|
299
|
+
return {
|
|
300
|
+
pagesCreated: [],
|
|
301
|
+
pagesUpdated: [],
|
|
302
|
+
skipped: true,
|
|
303
|
+
reason: `Agent error: ${errMsg}`,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// Debug: log what the agent did
|
|
307
|
+
const msgCount = agent.state.messages.length;
|
|
308
|
+
const toolCalls = agent.state.messages.filter(m => m.role === "toolResult").length;
|
|
309
|
+
const lastMsg = agent.state.messages[msgCount - 1];
|
|
310
|
+
let lastContent = "";
|
|
311
|
+
if (lastMsg && "content" in lastMsg) {
|
|
312
|
+
const c = lastMsg.content;
|
|
313
|
+
if (typeof c === "string")
|
|
314
|
+
lastContent = c.slice(0, 200);
|
|
315
|
+
else if (Array.isArray(c)) {
|
|
316
|
+
const tb = c.find((b) => b.type === "text");
|
|
317
|
+
if (tb)
|
|
318
|
+
lastContent = tb.text.slice(0, 200);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
console.log(`[processor] Agent finished: ${msgCount} messages, ${toolCalls} tool results. Last: ${lastContent}`);
|
|
322
|
+
// 6. Extract what was written from agent's messages
|
|
323
|
+
const pagesCreated = [];
|
|
324
|
+
const pagesUpdated = [];
|
|
325
|
+
for (const msg of agent.state.messages) {
|
|
326
|
+
if (msg.role !== "toolResult")
|
|
327
|
+
continue;
|
|
328
|
+
const content = msg.content;
|
|
329
|
+
if (!Array.isArray(content))
|
|
330
|
+
continue;
|
|
331
|
+
for (const block of content) {
|
|
332
|
+
if (typeof block !== "object" || block === null)
|
|
333
|
+
continue;
|
|
334
|
+
const b = block;
|
|
335
|
+
if (b.type === "text" && typeof b.text === "string" && b.text.startsWith("Wrote ")) {
|
|
336
|
+
const path = b.text.replace("Wrote ", "").trim();
|
|
337
|
+
// Check details to see if it was a create or update
|
|
338
|
+
pagesCreated.push(path);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (pagesCreated.length === 0 && pagesUpdated.length === 0) {
|
|
343
|
+
return { pagesCreated: [], pagesUpdated: [], skipped: true, reason: "no pages written" };
|
|
344
|
+
}
|
|
345
|
+
// 7. Append session digest
|
|
346
|
+
try {
|
|
347
|
+
await appendSessionDigest(wikiDir, {
|
|
348
|
+
date: new Date().toISOString().split("T")[0],
|
|
349
|
+
project: scope,
|
|
350
|
+
sessionFile: sessionPath,
|
|
351
|
+
scope,
|
|
352
|
+
capturedPages: pagesCreated,
|
|
353
|
+
summary: `Daemon captured ${pagesCreated.length} page(s) from session`,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
// Non-fatal
|
|
358
|
+
}
|
|
359
|
+
return { pagesCreated, pagesUpdated, skipped: false };
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CollectionConfig } from "qmd-engine";
|
|
2
|
+
import type { ParaUserConfig } from "./config.js";
|
|
3
|
+
export type QmdProvidersConfig = NonNullable<CollectionConfig["providers"]>;
|
|
4
|
+
export interface BuildQmdProvidersOptions {
|
|
5
|
+
secretsPath?: string;
|
|
6
|
+
authStorage?: {
|
|
7
|
+
getApiKey(provider: string): Promise<string | undefined>;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function buildQmdProvidersFromParaConfig(config: ParaUserConfig, opts?: BuildQmdProvidersOptions): Promise<QmdProvidersConfig | undefined>;
|
|
11
|
+
export declare function defaultBaseUrl(provider: string, role: "embed" | "rerank"): string | undefined;
|
|
12
|
+
//# sourceMappingURL=qmd-providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-providers.d.ts","sourceRoot":"","sources":["../src/qmd-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,aAAa,CAAC;AAGzE,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AAE5E,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE,CAAC;CAC5E;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAczC;AA0BD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAQ7F"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { resolveCredentialRef } from "./credentials.js";
|
|
2
|
+
export async function buildQmdProvidersFromParaConfig(config, opts = {}) {
|
|
3
|
+
if (config.qmd.providerConfig !== "pi-para-profiles")
|
|
4
|
+
return undefined;
|
|
5
|
+
const providers = {};
|
|
6
|
+
if (config.qmd.embedEnabled && config.qmd.embedding) {
|
|
7
|
+
providers.embed = await toQmdEndpoint(config.qmd.embedding, "embed", opts);
|
|
8
|
+
}
|
|
9
|
+
if (config.qmd.rerank) {
|
|
10
|
+
providers.rerank = await toQmdEndpoint(config.qmd.rerank, "rerank", opts);
|
|
11
|
+
}
|
|
12
|
+
return Object.keys(providers).length > 0 ? providers : undefined;
|
|
13
|
+
}
|
|
14
|
+
async function toQmdEndpoint(profile, role, opts) {
|
|
15
|
+
const resolved = await resolveCredentialRef(profile.credentialRef, opts);
|
|
16
|
+
const endpoint = {
|
|
17
|
+
url: profile.baseUrl || defaultBaseUrl(profile.provider, role),
|
|
18
|
+
model: profile.model,
|
|
19
|
+
};
|
|
20
|
+
if (profile.apiFormat === "openai" || profile.apiFormat === "anthropic") {
|
|
21
|
+
endpoint.api = profile.apiFormat;
|
|
22
|
+
}
|
|
23
|
+
if (resolved.ok && resolved.value) {
|
|
24
|
+
endpoint.key = resolved.value;
|
|
25
|
+
}
|
|
26
|
+
if (role === "embed" && profile.dims) {
|
|
27
|
+
endpoint.dims = profile.dims;
|
|
28
|
+
}
|
|
29
|
+
return endpoint;
|
|
30
|
+
}
|
|
31
|
+
export function defaultBaseUrl(provider, role) {
|
|
32
|
+
const normalized = provider.toLowerCase();
|
|
33
|
+
if (normalized === "openai")
|
|
34
|
+
return "https://api.openai.com/v1";
|
|
35
|
+
if (normalized === "openrouter")
|
|
36
|
+
return "https://openrouter.ai/api/v1";
|
|
37
|
+
if (normalized === "jina" && role === "rerank")
|
|
38
|
+
return "https://api.jina.ai/v1";
|
|
39
|
+
if (normalized === "voyage")
|
|
40
|
+
return "https://api.voyageai.com/v1";
|
|
41
|
+
if (normalized === "cohere")
|
|
42
|
+
return "https://api.cohere.com/v2";
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=qmd-providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qmd-providers.js","sourceRoot":"","sources":["../src/qmd-providers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAsB,MAAM,kBAAkB,CAAC;AAS5E,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,MAAsB,EACtB,OAAiC,EAAE;IAEnC,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,KAAK,kBAAkB;QAAE,OAAO,SAAS,CAAC;IAEvE,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACpD,SAAS,CAAC,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAA8B,EAC9B,IAAwB,EACxB,IAA8B;IAE9B,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,aAA8B,EAAE,IAAI,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAiD;QAC7D,GAAG,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;QAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC;IAEF,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;QACxE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;IACnC,CAAC;IACD,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,QAAqD,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAwB;IACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,2BAA2B,CAAC;IAChE,IAAI,UAAU,KAAK,YAAY;QAAE,OAAO,8BAA8B,CAAC;IACvE,IAAI,UAAU,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,wBAAwB,CAAC;IAChF,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,6BAA6B,CAAC;IAClE,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,2BAA2B,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query pipeline — searches the wiki and returns relevant results.
|
|
3
|
+
*
|
|
4
|
+
* Performs scoped search via qmd and returns results for the LLM
|
|
5
|
+
* to synthesize answers from. This is the reusable library function;
|
|
6
|
+
* the wiki_query tool wraps it with LLM prompt formatting.
|
|
7
|
+
*/
|
|
8
|
+
import type { QMDStore } from "qmd-engine";
|
|
9
|
+
import type { ParaCategory } from "./wiki.js";
|
|
10
|
+
import type { WikiSearchResult } from "./store.js";
|
|
11
|
+
import type { ProjectScope } from "./scope.js";
|
|
12
|
+
export interface QueryOptions {
|
|
13
|
+
/** Natural language search query */
|
|
14
|
+
query: string;
|
|
15
|
+
/** Override auto-detected scope tags */
|
|
16
|
+
scope?: string[];
|
|
17
|
+
/** Search all scopes (ignore project filter) */
|
|
18
|
+
global?: boolean;
|
|
19
|
+
/** Restrict to a PARA category */
|
|
20
|
+
category?: ParaCategory;
|
|
21
|
+
/** Maximum results (default 10) */
|
|
22
|
+
limit?: number;
|
|
23
|
+
/** Include archives in results (default false) */
|
|
24
|
+
includeArchives?: boolean;
|
|
25
|
+
/** Also search the raw/ collection (default false) */
|
|
26
|
+
includeRaw?: boolean;
|
|
27
|
+
/** Enable graph-boosted search via 1-hop wikilink expansion (default true) */
|
|
28
|
+
graphBoost?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface QueryResult {
|
|
31
|
+
/** Search results with page metadata and snippets */
|
|
32
|
+
results: WikiSearchResult[];
|
|
33
|
+
/** The scope that was used for filtering */
|
|
34
|
+
scopeUsed: ProjectScope;
|
|
35
|
+
/** Whether the search was global (no scope filtering) */
|
|
36
|
+
wasGlobal: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Search the wiki with scope and category filtering.
|
|
40
|
+
*
|
|
41
|
+
* This is the reusable library function. It:
|
|
42
|
+
* 1. Applies scope filtering (unless global flag is set)
|
|
43
|
+
* 2. Filters by PARA category if specified
|
|
44
|
+
* 3. Excludes archives unless explicitly requested
|
|
45
|
+
* 4. Returns results sorted by relevance score
|
|
46
|
+
*
|
|
47
|
+
* The caller (tool or standalone agent) can format the results
|
|
48
|
+
* into an LLM prompt or use them directly.
|
|
49
|
+
*/
|
|
50
|
+
export declare function queryWiki(store: QMDStore, options: QueryOptions, scope: ProjectScope): Promise<QueryResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Format query results as a readable text block.
|
|
53
|
+
* Useful for building LLM prompts or display.
|
|
54
|
+
*
|
|
55
|
+
* Includes freshness indicators so the LLM knows which pages to trust
|
|
56
|
+
* vs. which need verification against current code/state.
|
|
57
|
+
*/
|
|
58
|
+
export declare function formatQueryResults(results: WikiSearchResult[]): string;
|
|
59
|
+
/**
|
|
60
|
+
* Compute a human-readable freshness indicator from the page's `updated` date.
|
|
61
|
+
*
|
|
62
|
+
* - < 7 days → "✅ FRESH"
|
|
63
|
+
* - 7-14 days → "✅ Recent — N days old"
|
|
64
|
+
* - 14-30 days → "⚠️ AGING — N days old — verify claims about code/configs"
|
|
65
|
+
* - 30-90 days → "⚠️ STALE — N days old — verify before trusting"
|
|
66
|
+
* - > 90 days → "🚨 VERY STALE — N days old — likely outdated, verify everything"
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatFreshness(updatedISO: string, nowMs: number): string;
|
|
69
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,4CAA4C;IAC5C,SAAS,EAAE,YAAY,CAAC;IACxB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;CACpB;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAmBtE;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYzE"}
|