pi-para 0.6.7 → 0.7.0

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 (124) hide show
  1. package/ARCHITECTURE.md +4 -6
  2. package/CHANGELOG.md +14 -0
  3. package/CONFIGURATION.md +1 -16
  4. package/README.md +2 -13
  5. package/SETUP.md +1 -7
  6. package/STRUCTURE.md +7 -18
  7. package/dist/cli-legacy.d.ts +2 -1
  8. package/dist/cli-legacy.d.ts.map +1 -1
  9. package/dist/cli-legacy.js +13 -25
  10. package/dist/cli-legacy.js.map +1 -1
  11. package/dist/cli.d.ts +2 -24
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +29 -271
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands.d.ts.map +1 -1
  16. package/dist/commands.js +1 -28
  17. package/dist/commands.js.map +1 -1
  18. package/dist/config.d.ts +1 -5
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +0 -5
  21. package/dist/config.js.map +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +6 -64
  24. package/dist/index.js.map +1 -1
  25. package/dist/link-utils.d.ts +1 -1
  26. package/dist/link-utils.js +1 -1
  27. package/dist/settings.d.ts +0 -3
  28. package/dist/settings.d.ts.map +1 -1
  29. package/dist/settings.js +0 -11
  30. package/dist/settings.js.map +1 -1
  31. package/dist/tools/edit-read.d.ts +18 -0
  32. package/dist/tools/edit-read.d.ts.map +1 -0
  33. package/dist/tools/edit-read.js +161 -0
  34. package/dist/tools/edit-read.js.map +1 -0
  35. package/dist/tools/ingest.d.ts +12 -0
  36. package/dist/tools/ingest.d.ts.map +1 -0
  37. package/dist/tools/ingest.js +48 -0
  38. package/dist/tools/ingest.js.map +1 -0
  39. package/dist/tools/lint.d.ts +10 -0
  40. package/dist/tools/lint.d.ts.map +1 -0
  41. package/dist/tools/lint.js +57 -0
  42. package/dist/tools/lint.js.map +1 -0
  43. package/dist/tools/migrate.d.ts +6 -0
  44. package/dist/tools/migrate.d.ts.map +1 -0
  45. package/dist/tools/migrate.js +36 -0
  46. package/dist/tools/migrate.js.map +1 -0
  47. package/dist/tools/move.d.ts +9 -0
  48. package/dist/tools/move.d.ts.map +1 -0
  49. package/dist/tools/move.js +61 -0
  50. package/dist/tools/move.js.map +1 -0
  51. package/dist/tools/query.d.ts +12 -0
  52. package/dist/tools/query.d.ts.map +1 -0
  53. package/dist/tools/query.js +47 -0
  54. package/dist/tools/query.js.map +1 -0
  55. package/dist/tools/schemas.d.ts +109 -0
  56. package/dist/tools/schemas.d.ts.map +1 -0
  57. package/dist/tools/schemas.js +80 -0
  58. package/dist/tools/schemas.js.map +1 -0
  59. package/dist/tools/shared.d.ts +14 -0
  60. package/dist/tools/shared.d.ts.map +1 -0
  61. package/dist/tools/shared.js +25 -0
  62. package/dist/tools/shared.js.map +1 -0
  63. package/dist/tools/summarize.d.ts +8 -0
  64. package/dist/tools/summarize.d.ts.map +1 -0
  65. package/dist/tools/summarize.js +82 -0
  66. package/dist/tools/summarize.js.map +1 -0
  67. package/dist/tools/write.d.ts +23 -0
  68. package/dist/tools/write.d.ts.map +1 -0
  69. package/dist/tools/write.js +215 -0
  70. package/dist/tools/write.js.map +1 -0
  71. package/dist/tools.d.ts +1 -8
  72. package/dist/tools.d.ts.map +1 -1
  73. package/dist/tools.js +13 -795
  74. package/dist/tools.js.map +1 -1
  75. package/package.json +2 -6
  76. package/src/cli-legacy.ts +14 -26
  77. package/src/cli.ts +29 -293
  78. package/src/commands.ts +0 -21
  79. package/src/config.ts +1 -6
  80. package/src/index.ts +5 -66
  81. package/src/link-utils.ts +1 -1
  82. package/src/settings.ts +0 -14
  83. package/src/tools/edit-read.ts +193 -0
  84. package/src/tools/ingest.ts +63 -0
  85. package/src/tools/lint.ts +74 -0
  86. package/src/tools/migrate.ts +44 -0
  87. package/src/tools/move.ts +79 -0
  88. package/src/tools/query.ts +63 -0
  89. package/src/tools/schemas.ts +157 -0
  90. package/src/tools/shared.ts +35 -0
  91. package/src/tools/summarize.ts +89 -0
  92. package/src/tools/write.ts +252 -0
  93. package/src/tools.ts +18 -1046
  94. package/dist/daemon.d.ts +0 -49
  95. package/dist/daemon.d.ts.map +0 -1
  96. package/dist/daemon.js +0 -226
  97. package/dist/daemon.js.map +0 -1
  98. package/dist/link-discovery.d.ts +0 -40
  99. package/dist/link-discovery.d.ts.map +0 -1
  100. package/dist/link-discovery.js +0 -122
  101. package/dist/link-discovery.js.map +0 -1
  102. package/dist/maintainer.d.ts +0 -24
  103. package/dist/maintainer.d.ts.map +0 -1
  104. package/dist/maintainer.js +0 -358
  105. package/dist/maintainer.js.map +0 -1
  106. package/dist/watcher.d.ts +0 -25
  107. package/dist/watcher.d.ts.map +0 -1
  108. package/dist/watcher.js +0 -84
  109. package/dist/watcher.js.map +0 -1
  110. package/dist/webui/client/dist/index.html +0 -1885
  111. package/dist/webui/server.d.ts +0 -31
  112. package/dist/webui/server.d.ts.map +0 -1
  113. package/dist/webui/server.js +0 -566
  114. package/dist/webui/server.js.map +0 -1
  115. package/scripts/build-assets.mjs +0 -17
  116. package/src/daemon.ts +0 -288
  117. package/src/link-discovery.ts +0 -170
  118. package/src/maintainer.ts +0 -404
  119. package/src/python/__pycache__/minimax_lm.cpython-312.pyc +0 -0
  120. package/src/python/minimax_lm.py +0 -198
  121. package/src/python/rlm_capture.py +0 -215
  122. package/src/watcher.ts +0 -101
  123. package/src/webui/client/dist/index.html +0 -1885
  124. package/src/webui/server.ts +0 -765
package/dist/daemon.d.ts DELETED
@@ -1,49 +0,0 @@
1
- /**
2
- * Main daemon loop — watches for completed sessions and processes them.
3
- */
4
- import type { Model } from "@earendil-works/pi-ai";
5
- import type { WebWikiConfig } from "./webui/server.js";
6
- export interface DaemonConfig {
7
- wikiDir: string;
8
- model: Model<any>;
9
- getApiKey: (provider: string) => Promise<string | undefined>;
10
- pollIntervalMs?: number;
11
- /** How often to run link discovery + lint (ms). Default: 30 minutes */
12
- maintenanceIntervalMs?: number;
13
- /** Web wiki server config. If enabled, the daemon hosts the web UI. */
14
- webWiki?: WebWikiConfig;
15
- }
16
- export declare class Daemon {
17
- private config;
18
- private state;
19
- private watcher;
20
- private store;
21
- private queue;
22
- private processing;
23
- private running;
24
- private maintenanceTimer;
25
- private maintenanceRunning;
26
- private webServer;
27
- constructor(config: DaemonConfig);
28
- /** Start the daemon. */
29
- start(): Promise<void>;
30
- /** Stop the daemon. */
31
- stop(): Promise<void>;
32
- /** Get the web server URL (if running). */
33
- getWebUrl(): string | null;
34
- /** Process a single session file (for CLI `process` command). */
35
- processOne(sessionPath: string): Promise<void>;
36
- /** Handle new entries from the registry watcher. */
37
- private onNewEntries;
38
- /** Process queued sessions sequentially. */
39
- private processQueue;
40
- /** Run periodic maintenance via LLM agent. */
41
- private runMaintenancePass;
42
- /** Get processing history. */
43
- getHistory(scope?: string, limit?: number): import("./state.js").ProcessedSession[];
44
- /** Get failed sessions. */
45
- getFailed(): import("./state.js").ProcessedSession[];
46
- /** Retry all failed sessions. */
47
- retryFailed(): Promise<void>;
48
- }
49
- //# sourceMappingURL=daemon.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAUnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uEAAuE;IACvE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAA+C;IACvE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAA4D;gBAEjE,MAAM,EAAE,YAAY;IAUhC,wBAAwB;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C5B,uBAAuB;IACjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,2CAA2C;IAC3C,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,iEAAiE;IAC3D,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CpD,oDAAoD;IACpD,OAAO,CAAC,YAAY;IAapB,4CAA4C;YAC9B,YAAY;IAY1B,8CAA8C;YAChC,kBAAkB;IA4BhC,8BAA8B;IAC9B,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAIzC,2BAA2B;IAC3B,SAAS;IAIT,iCAAiC;IAC3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAWnC"}
package/dist/daemon.js DELETED
@@ -1,226 +0,0 @@
1
- /**
2
- * Main daemon loop — watches for completed sessions and processes them.
3
- */
4
- import { existsSync } from "node:fs";
5
- import { join } from "node:path";
6
- import { homedir } from "node:os";
7
- import { openStore, closeStore } from "./store.js";
8
- import { StateDB } from "./state.js";
9
- import { RegistryWatcher } from "./watcher.js";
10
- import { processSession } from "./processor.js";
11
- import { runMaintenance } from "./maintainer.js";
12
- import { startServer } from "./webui/server.js";
13
- export class Daemon {
14
- config;
15
- state;
16
- watcher;
17
- store = null;
18
- queue = [];
19
- processing = false;
20
- running = false;
21
- maintenanceTimer = null;
22
- maintenanceRunning = false;
23
- webServer = null;
24
- constructor(config) {
25
- this.config = config;
26
- this.state = new StateDB(config.wikiDir);
27
- this.watcher = new RegistryWatcher(config.wikiDir, (entries) => this.onNewEntries(entries), config.pollIntervalMs ?? 5000);
28
- }
29
- /** Start the daemon. */
30
- async start() {
31
- console.log(`[daemon] Starting — wiki: ${this.config.wikiDir}`);
32
- // Open qmd store
33
- try {
34
- this.store = await openStore(this.config.wikiDir);
35
- console.log("[daemon] qmd store opened");
36
- }
37
- catch (err) {
38
- console.error(`[daemon] Failed to open store: ${err instanceof Error ? err.message : err}`);
39
- this.store = null;
40
- }
41
- this.running = true;
42
- this.state.setState("daemon_started_at", new Date().toISOString());
43
- this.state.setState("daemon_pid", String(process.pid));
44
- // Start watching
45
- this.watcher.start();
46
- // Process any unprocessed sessions from registry
47
- const existing = this.watcher.getAllEntries();
48
- const unprocessed = existing.filter((e) => !this.state.isProcessed(e.sessionPath));
49
- if (unprocessed.length > 0) {
50
- console.log(`[daemon] Found ${unprocessed.length} unprocessed session(s)`);
51
- this.onNewEntries(unprocessed);
52
- }
53
- // Start periodic maintenance (link discovery + lint)
54
- const maintenanceMs = this.config.maintenanceIntervalMs ?? 30 * 60 * 1000;
55
- this.maintenanceTimer = setInterval(() => this.runMaintenancePass(), maintenanceMs);
56
- // Run first maintenance after a delay to let the store warm up
57
- setTimeout(() => this.runMaintenancePass(), 60_000);
58
- // Start web wiki server if enabled
59
- if (this.config.webWiki?.enabled) {
60
- try {
61
- this.webServer = startServer(this.config.wikiDir, this.store, this.config.webWiki);
62
- console.log(`[daemon] Web wiki: ${this.webServer.url}`);
63
- }
64
- catch (err) {
65
- console.error(`[daemon] Web wiki failed: ${err instanceof Error ? err.message : String(err)}`);
66
- }
67
- }
68
- console.log(`[daemon] Running (maintenance every ${Math.round(maintenanceMs / 60000)}m). Press Ctrl+C to stop.`);
69
- }
70
- /** Stop the daemon. */
71
- async stop() {
72
- console.log("[daemon] Stopping...");
73
- this.running = false;
74
- this.watcher.stop();
75
- if (this.maintenanceTimer) {
76
- clearInterval(this.maintenanceTimer);
77
- this.maintenanceTimer = null;
78
- }
79
- // Stop web wiki server
80
- if (this.webServer) {
81
- try {
82
- await this.webServer.close();
83
- console.log("[daemon] Web wiki stopped");
84
- }
85
- catch { }
86
- this.webServer = null;
87
- }
88
- if (this.store) {
89
- try {
90
- await closeStore(this.store);
91
- }
92
- catch { }
93
- this.store = null;
94
- }
95
- this.state.close();
96
- console.log("[daemon] Stopped.");
97
- }
98
- /** Get the web server URL (if running). */
99
- getWebUrl() {
100
- return this.webServer?.url ?? null;
101
- }
102
- /** Process a single session file (for CLI `process` command). */
103
- async processOne(sessionPath) {
104
- if (!existsSync(sessionPath)) {
105
- console.error(`[daemon] Session file not found: ${sessionPath}`);
106
- return;
107
- }
108
- if (!this.store) {
109
- try {
110
- this.store = await openStore(this.config.wikiDir);
111
- }
112
- catch (err) {
113
- console.error(`[daemon] Failed to open store: ${err instanceof Error ? err.message : err}`);
114
- return;
115
- }
116
- }
117
- const scope = detectScopeFromPath(sessionPath);
118
- console.log(`[daemon] Processing: ${sessionPath} (scope: ${scope})`);
119
- try {
120
- const result = await processSession(sessionPath, this.config.wikiDir, this.store, scope, this.config.model, this.config.getApiKey);
121
- if (result.skipped) {
122
- console.log(`[daemon] Skipped: ${result.reason}`);
123
- this.state.recordSuccess(sessionPath, scope, [], []);
124
- }
125
- else {
126
- console.log(`[daemon] Done: ${result.pagesCreated.length} created, ${result.pagesUpdated.length} updated`);
127
- this.state.recordSuccess(sessionPath, scope, result.pagesCreated, result.pagesUpdated);
128
- }
129
- }
130
- catch (err) {
131
- const msg = err instanceof Error ? err.message : String(err);
132
- console.error(`[daemon] Failed: ${msg}`);
133
- this.state.recordFailure(sessionPath, scope, msg);
134
- }
135
- }
136
- /** Handle new entries from the registry watcher. */
137
- onNewEntries(entries) {
138
- // Filter already-processed
139
- const newEntries = entries.filter((e) => existsSync(e.sessionPath) && !this.state.isProcessed(e.sessionPath));
140
- if (newEntries.length === 0)
141
- return;
142
- console.log(`[daemon] Queued ${newEntries.length} session(s) for processing`);
143
- this.queue.push(...newEntries);
144
- this.processQueue();
145
- }
146
- /** Process queued sessions sequentially. */
147
- async processQueue() {
148
- if (this.processing || !this.running)
149
- return;
150
- this.processing = true;
151
- while (this.queue.length > 0 && this.running) {
152
- const entry = this.queue.shift();
153
- await this.processOne(entry.sessionPath);
154
- }
155
- this.processing = false;
156
- }
157
- /** Run periodic maintenance via LLM agent. */
158
- async runMaintenancePass() {
159
- if (this.maintenanceRunning || !this.running || !this.store)
160
- return;
161
- this.maintenanceRunning = true;
162
- try {
163
- console.log("[daemon] Running maintenance agent...");
164
- const result = await runMaintenance(this.config.wikiDir, this.store, this.config.model, this.config.getApiKey);
165
- console.log(`[daemon] Maintenance done: ${result.pagesUpdated} updated, ${result.pagesMerged} merged`);
166
- if (result.summary) {
167
- // Log first 200 chars of summary
168
- console.log(`[daemon] Summary: ${result.summary.slice(0, 200)}`);
169
- }
170
- }
171
- catch (err) {
172
- console.error(`[daemon] Maintenance error: ${err instanceof Error ? err.message : String(err)}`);
173
- }
174
- this.maintenanceRunning = false;
175
- }
176
- /** Get processing history. */
177
- getHistory(scope, limit) {
178
- return this.state.getHistory(scope, limit);
179
- }
180
- /** Get failed sessions. */
181
- getFailed() {
182
- return this.state.getFailed();
183
- }
184
- /** Retry all failed sessions. */
185
- async retryFailed() {
186
- const failed = this.state.getFailed();
187
- if (failed.length === 0) {
188
- console.log("[daemon] No failed sessions to retry.");
189
- return;
190
- }
191
- console.log(`[daemon] Retrying ${failed.length} failed session(s)...`);
192
- for (const session of failed) {
193
- await this.processOne(session.sessionPath);
194
- }
195
- }
196
- }
197
- /** Extract project scope from session path or header. */
198
- function detectScopeFromPath(sessionPath) {
199
- // 1. Try reading the session header — most reliable, has the real cwd
200
- try {
201
- const { readFileSync } = require("node:fs");
202
- const firstLine = readFileSync(sessionPath, "utf-8").split("\n")[0];
203
- const header = JSON.parse(firstLine);
204
- if (header.cwd) {
205
- const parts = header.cwd.split("/");
206
- return parts[parts.length - 1] ?? "unknown";
207
- }
208
- }
209
- catch { }
210
- // 2. Fallback: decode from directory name
211
- // Path format: ~/.pi/agent/sessions/--home-ubuntu-projects-pi-mono--/file.jsonl
212
- // The dir name encodes the cwd path with / replaced by -
213
- // But project names can contain hyphens, so we can't just replace all - with /
214
- // Instead, find the last segment after "projects-" which is the project name
215
- const dirName = sessionPath.split("/").slice(-2, -1)[0] ?? "";
216
- if (dirName.startsWith("--") && dirName.endsWith("--")) {
217
- const inner = dirName.slice(2, -2); // e.g. "home-ubuntu-projects-agent-board"
218
- // Look for "projects-" marker — everything after it is the project name
219
- const projectsIdx = inner.indexOf("projects-");
220
- if (projectsIdx >= 0) {
221
- return inner.slice(projectsIdx + "projects-".length); // "agent-board"
222
- }
223
- }
224
- return "unknown";
225
- }
226
- //# sourceMappingURL=daemon.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- /**
2
- * Link discovery — finds related wiki pages and adds [[wikilinks]].
3
- *
4
- * Uses BM25 search to find pages that are semantically related but
5
- * not yet linked. Runs as a periodic daemon job or on-demand.
6
- *
7
- * Strategy:
8
- * 1. For each page, search the wiki using its title + key terms
9
- * 2. Filter results to pages not already linked
10
- * 3. If a related page scores above threshold, add it to ## Connections
11
- * 4. Sync frontmatter.links
12
- */
13
- import type { QMDStore } from "./store.js";
14
- export interface LinkDiscoveryResult {
15
- pagesUpdated: number;
16
- linksAdded: number;
17
- discoveries: Array<{
18
- page: string;
19
- newLinks: string[];
20
- }>;
21
- }
22
- export interface LinkDiscoveryOptions {
23
- /** Minimum BM25 score to consider a page related (0-1). Default 0.3 */
24
- minScore?: number;
25
- /** Max new links to add per page per run. Default 5 */
26
- maxLinksPerPage?: number;
27
- /** Dry run — report but don't write. Default false */
28
- dryRun?: boolean;
29
- }
30
- /**
31
- * Discover and add missing [[wikilinks]] between related pages.
32
- *
33
- * For each page:
34
- * 1. Search wiki using the page's title as query
35
- * 2. Find high-scoring pages not already linked
36
- * 3. Add them to ## Connections section
37
- * 4. Sync frontmatter.links
38
- */
39
- export declare function discoverLinks(wikiDir: string, store: QMDStore, options?: LinkDiscoveryOptions): Promise<LinkDiscoveryResult>;
40
- //# sourceMappingURL=link-discovery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-discovery.d.ts","sourceRoot":"","sources":["../src/link-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA+G9B"}
@@ -1,122 +0,0 @@
1
- /**
2
- * Link discovery — finds related wiki pages and adds [[wikilinks]].
3
- *
4
- * Uses BM25 search to find pages that are semantically related but
5
- * not yet linked. Runs as a periodic daemon job or on-demand.
6
- *
7
- * Strategy:
8
- * 1. For each page, search the wiki using its title + key terms
9
- * 2. Filter results to pages not already linked
10
- * 3. If a related page scores above threshold, add it to ## Connections
11
- * 4. Sync frontmatter.links
12
- */
13
- import { listPages, readPage, writePage, } from "./wiki.js";
14
- import { searchWiki } from "./store.js";
15
- import { extractWikilinks, syncFrontmatterLinks } from "./link-utils.js";
16
- // -- Discovery ---------------------------------------------------------------
17
- /**
18
- * Discover and add missing [[wikilinks]] between related pages.
19
- *
20
- * For each page:
21
- * 1. Search wiki using the page's title as query
22
- * 2. Find high-scoring pages not already linked
23
- * 3. Add them to ## Connections section
24
- * 4. Sync frontmatter.links
25
- */
26
- export async function discoverLinks(wikiDir, store, options) {
27
- const minScore = options?.minScore ?? 0.3;
28
- const maxLinksPerPage = options?.maxLinksPerPage ?? 5;
29
- const dryRun = options?.dryRun ?? false;
30
- const refs = await listPages(wikiDir);
31
- const pages = [];
32
- for (const ref of refs) {
33
- const page = await readPage(wikiDir, ref.category, ref.slug);
34
- if (page)
35
- pages.push(page);
36
- }
37
- const allSlugs = new Set(pages.map(p => p.slug));
38
- const result = {
39
- pagesUpdated: 0,
40
- linksAdded: 0,
41
- discoveries: [],
42
- };
43
- for (const page of pages) {
44
- // Get existing outgoing links
45
- const existingLinks = new Set(extractWikilinks(page.body));
46
- // Also include frontmatter links
47
- for (const l of page.frontmatter.links)
48
- existingLinks.add(l);
49
- // Search for related pages using title
50
- const query = page.frontmatter.title;
51
- let related;
52
- try {
53
- related = await searchWiki(store, query, { limit: 10 });
54
- }
55
- catch {
56
- continue; // search failure — skip this page
57
- }
58
- // Filter: not self, not already linked, above score threshold
59
- const candidates = related
60
- .filter(r => r.page.slug !== page.slug &&
61
- !existingLinks.has(r.page.slug) &&
62
- r.score >= minScore)
63
- .slice(0, maxLinksPerPage);
64
- if (candidates.length === 0)
65
- continue;
66
- const newLinks = candidates.map(c => c.page.slug);
67
- // Build ## Connections addition
68
- const connectionsLines = newLinks.map(slug => {
69
- const targetPage = pages.find(p => p.slug === slug);
70
- const title = targetPage?.frontmatter.title ?? slug;
71
- return `- [[${slug}]] — ${title}`;
72
- });
73
- // Update page body
74
- let newBody = page.body;
75
- const hasConnections = /^## Connections/m.test(newBody);
76
- if (hasConnections) {
77
- // Append to existing Connections section
78
- // Find the end of the Connections section (next ## heading or EOF)
79
- const connectionsIdx = newBody.indexOf("## Connections");
80
- const afterConnections = newBody.indexOf("\n## ", connectionsIdx + 1);
81
- const insertPos = afterConnections === -1 ? newBody.length : afterConnections;
82
- // Insert before the next section
83
- const insertion = "\n" + connectionsLines.join("\n");
84
- newBody = newBody.slice(0, insertPos) + insertion + newBody.slice(insertPos);
85
- }
86
- else {
87
- // Add new Connections section at the end (before ## Sources or ## Open Questions if they exist)
88
- const sourcesIdx = newBody.indexOf("\n## Sources");
89
- const questionsIdx = newBody.indexOf("\n## Open Questions");
90
- const insertBefore = Math.min(sourcesIdx === -1 ? Infinity : sourcesIdx, questionsIdx === -1 ? Infinity : questionsIdx);
91
- const section = "\n\n## Connections\n" + connectionsLines.join("\n");
92
- if (insertBefore === Infinity) {
93
- newBody = newBody.trimEnd() + section + "\n";
94
- }
95
- else {
96
- newBody = newBody.slice(0, insertBefore) + section + newBody.slice(insertBefore);
97
- }
98
- }
99
- // Sync frontmatter.links
100
- const updatedLinks = syncFrontmatterLinks(newBody);
101
- if (!dryRun) {
102
- const updatedPage = {
103
- ...page,
104
- body: newBody,
105
- frontmatter: {
106
- ...page.frontmatter,
107
- links: updatedLinks,
108
- updated: new Date().toISOString(),
109
- },
110
- };
111
- await writePage(wikiDir, updatedPage);
112
- }
113
- result.pagesUpdated++;
114
- result.linksAdded += newLinks.length;
115
- result.discoveries.push({
116
- page: `${page.category}/${page.slug}`,
117
- newLinks,
118
- });
119
- }
120
- return result;
121
- }
122
- //# sourceMappingURL=link-discovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-discovery.js","sourceRoot":"","sources":["../src/link-discovery.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Wiki maintenance agent - uses LLM to intelligently maintain the wiki.
3
- *
4
- * Replaces brittle code-based maintenance (link discovery, dedup detection,
5
- * tag canonicalization, category review) with an LLM agent that understands
6
- * content and can make smarter decisions.
7
- *
8
- * Deterministic operations (secret redaction, schema validation, index rebuild)
9
- * stay in code. This agent handles everything that needs intelligence.
10
- */
11
- import type { Model } from "@earendil-works/pi-ai";
12
- import type { QMDStore } from "qmd-engine";
13
- export interface MaintenanceResult {
14
- pagesUpdated: number;
15
- pagesMerged: number;
16
- linksAdded: number;
17
- issuesFixed: number;
18
- summary: string;
19
- }
20
- /**
21
- * Run the maintenance agent. Called periodically by the daemon.
22
- */
23
- export declare function runMaintenance(wikiDir: string, store: QMDStore, model: Model<any>, getApiKey: (provider: string) => Promise<string | undefined>): Promise<MaintenanceResult>;
24
- //# sourceMappingURL=maintainer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"maintainer.d.ts","sourceRoot":"","sources":["../src/maintainer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAsB3C,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAqRD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAC3D,OAAO,CAAC,iBAAiB,CAAC,CA4E5B"}