pi-para 0.6.6 → 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.
- package/ARCHITECTURE.md +4 -6
- package/CHANGELOG.md +22 -0
- package/CONFIGURATION.md +1 -16
- package/README.md +2 -13
- package/SETUP.md +1 -7
- package/STRUCTURE.md +7 -18
- package/dist/cli-legacy.d.ts +2 -1
- package/dist/cli-legacy.d.ts.map +1 -1
- package/dist/cli-legacy.js +13 -25
- package/dist/cli-legacy.js.map +1 -1
- package/dist/cli.d.ts +2 -24
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -271
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +1 -28
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +1 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -5
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2 -1
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -64
- package/dist/index.js.map +1 -1
- package/dist/link-utils.d.ts +1 -1
- package/dist/link-utils.js +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -3
- package/dist/scheduler/index.js.map +1 -1
- package/dist/settings.d.ts +0 -3
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +0 -11
- package/dist/settings.js.map +1 -1
- package/dist/store.d.ts +11 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +48 -16
- package/dist/store.js.map +1 -1
- package/dist/tools/edit-read.d.ts +18 -0
- package/dist/tools/edit-read.d.ts.map +1 -0
- package/dist/tools/edit-read.js +161 -0
- package/dist/tools/edit-read.js.map +1 -0
- package/dist/tools/ingest.d.ts +12 -0
- package/dist/tools/ingest.d.ts.map +1 -0
- package/dist/tools/ingest.js +48 -0
- package/dist/tools/ingest.js.map +1 -0
- package/dist/tools/lint.d.ts +10 -0
- package/dist/tools/lint.d.ts.map +1 -0
- package/dist/tools/lint.js +57 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/migrate.d.ts +6 -0
- package/dist/tools/migrate.d.ts.map +1 -0
- package/dist/tools/migrate.js +36 -0
- package/dist/tools/migrate.js.map +1 -0
- package/dist/tools/move.d.ts +9 -0
- package/dist/tools/move.d.ts.map +1 -0
- package/dist/tools/move.js +61 -0
- package/dist/tools/move.js.map +1 -0
- package/dist/tools/query.d.ts +12 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +47 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/schemas.d.ts +109 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +80 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/shared.d.ts +14 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +25 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/summarize.d.ts +8 -0
- package/dist/tools/summarize.d.ts.map +1 -0
- package/dist/tools/summarize.js +82 -0
- package/dist/tools/summarize.js.map +1 -0
- package/dist/tools/write.d.ts +23 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +215 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/tools.d.ts +1 -8
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +13 -795
- package/dist/tools.js.map +1 -1
- package/dist/wiki-tool-guidance.js +2 -2
- package/dist/wiki-tool-guidance.js.map +1 -1
- package/package.json +2 -6
- package/src/cli-legacy.ts +14 -26
- package/src/cli.ts +29 -293
- package/src/commands.ts +0 -21
- package/src/config.ts +1 -6
- package/src/context.ts +2 -1
- package/src/index.ts +5 -66
- package/src/link-utils.ts +1 -1
- package/src/scheduler/index.ts +9 -3
- package/src/settings.ts +0 -14
- package/src/store.ts +52 -15
- package/src/tools/edit-read.ts +193 -0
- package/src/tools/ingest.ts +63 -0
- package/src/tools/lint.ts +74 -0
- package/src/tools/migrate.ts +44 -0
- package/src/tools/move.ts +79 -0
- package/src/tools/query.ts +63 -0
- package/src/tools/schemas.ts +157 -0
- package/src/tools/shared.ts +35 -0
- package/src/tools/summarize.ts +89 -0
- package/src/tools/write.ts +252 -0
- package/src/tools.ts +18 -1046
- package/src/wiki-tool-guidance.ts +2 -2
- package/dist/daemon.d.ts +0 -49
- package/dist/daemon.d.ts.map +0 -1
- package/dist/daemon.js +0 -226
- package/dist/daemon.js.map +0 -1
- package/dist/link-discovery.d.ts +0 -40
- package/dist/link-discovery.d.ts.map +0 -1
- package/dist/link-discovery.js +0 -122
- package/dist/link-discovery.js.map +0 -1
- package/dist/maintainer.d.ts +0 -24
- package/dist/maintainer.d.ts.map +0 -1
- package/dist/maintainer.js +0 -358
- package/dist/maintainer.js.map +0 -1
- package/dist/watcher.d.ts +0 -25
- package/dist/watcher.d.ts.map +0 -1
- package/dist/watcher.js +0 -84
- package/dist/watcher.js.map +0 -1
- package/dist/webui/client/dist/index.html +0 -1885
- package/dist/webui/server.d.ts +0 -31
- package/dist/webui/server.d.ts.map +0 -1
- package/dist/webui/server.js +0 -566
- package/dist/webui/server.js.map +0 -1
- package/scripts/build-assets.mjs +0 -17
- package/src/daemon.ts +0 -288
- package/src/link-discovery.ts +0 -170
- package/src/maintainer.ts +0 -404
- package/src/python/__pycache__/minimax_lm.cpython-312.pyc +0 -0
- package/src/python/minimax_lm.py +0 -198
- package/src/python/rlm_capture.py +0 -215
- package/src/watcher.ts +0 -101
- package/src/webui/client/dist/index.html +0 -1885
- package/src/webui/server.ts +0 -765
package/dist/store.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Handles store creation/opening, search with scope filtering,
|
|
5
5
|
* re-indexing after wiki changes, and embedding lifecycle.
|
|
6
6
|
*/
|
|
7
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
8
|
import { readFileSync, existsSync } from "node:fs";
|
|
8
9
|
import { homedir } from "node:os";
|
|
9
10
|
import { join } from "node:path";
|
|
@@ -22,6 +23,48 @@ const PARA_CONTEXTS = {
|
|
|
22
23
|
const RAW_CONTEXT = "Immutable source material: articles, documents, notes. Not synthesized.";
|
|
23
24
|
// -- Pending embed tracking --------------------------------------------------
|
|
24
25
|
const pendingEmbeds = new WeakMap();
|
|
26
|
+
// qmd-engine's API adapter logs recoverable provider failures directly to
|
|
27
|
+
// console.error before returning null. Capture only those known messages so
|
|
28
|
+
// best-effort vector search and scheduler retries do not flash raw errors in
|
|
29
|
+
// the Pi UI. Other console errors continue to pass through unchanged.
|
|
30
|
+
const qmdEmbedDiagnosticContext = new AsyncLocalStorage();
|
|
31
|
+
let qmdEmbedCaptureCount = 0;
|
|
32
|
+
let qmdEmbedOriginalConsoleError = null;
|
|
33
|
+
const qmdEmbedConsoleInterceptor = (...args) => {
|
|
34
|
+
const sink = qmdEmbedDiagnosticContext.getStore();
|
|
35
|
+
const first = String(args[0] ?? "");
|
|
36
|
+
if (sink && /^embed(?:Batch)? error:/i.test(first)) {
|
|
37
|
+
sink.push(args.map((arg) => arg instanceof Error ? arg.message : String(arg)).join(" "));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
qmdEmbedOriginalConsoleError?.(...args);
|
|
41
|
+
};
|
|
42
|
+
/** Run a QMD embedding operation without leaking its recoverable raw stderr. */
|
|
43
|
+
export async function captureQmdEmbedErrors(operation) {
|
|
44
|
+
const diagnostics = [];
|
|
45
|
+
if (qmdEmbedCaptureCount++ === 0) {
|
|
46
|
+
qmdEmbedOriginalConsoleError = console.error;
|
|
47
|
+
console.error = qmdEmbedConsoleInterceptor;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
return await qmdEmbedDiagnosticContext.run(diagnostics, async () => {
|
|
51
|
+
try {
|
|
52
|
+
return { ok: true, value: await operation(), diagnostics };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return { ok: false, error, diagnostics };
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
qmdEmbedCaptureCount--;
|
|
61
|
+
if (qmdEmbedCaptureCount === 0) {
|
|
62
|
+
if (console.error === qmdEmbedConsoleInterceptor && qmdEmbedOriginalConsoleError)
|
|
63
|
+
console.error = qmdEmbedOriginalConsoleError;
|
|
64
|
+
qmdEmbedOriginalConsoleError = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
25
68
|
// -- Inert-provider tracking ---------------------------------------------------
|
|
26
69
|
/** Stores opened with the NO_LOCAL_PROVIDERS shim (no real API provider). */
|
|
27
70
|
const inertProviderStores = new WeakSet();
|
|
@@ -121,23 +164,10 @@ export async function openStore(wikiDir, opts = {}) {
|
|
|
121
164
|
if (opts.backgroundEmbed !== false && opts.paraConfig?.qmd.embedEnabled !== false) {
|
|
122
165
|
// Schedule embedding in background (non-blocking).
|
|
123
166
|
// BM25 search works immediately; hybrid search improves once embed completes.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const embedPromise = store.embed().then(() => {
|
|
127
|
-
pendingEmbeds.delete(store);
|
|
128
|
-
}).catch(() => {
|
|
129
|
-
// Embedding failures are non-fatal — hybrid search degrades to BM25
|
|
167
|
+
const embedPromise = captureQmdEmbedErrors(() => store.embed()).then(() => {
|
|
168
|
+
// Embedding failures are non-fatal — hybrid search degrades to BM25.
|
|
130
169
|
pendingEmbeds.delete(store);
|
|
131
|
-
}).finally(() => {
|
|
132
|
-
console.error = origError;
|
|
133
170
|
});
|
|
134
|
-
// Temporarily suppress embed error noise during background embed
|
|
135
|
-
console.error = (...args) => {
|
|
136
|
-
const msg = String(args[0] ?? "");
|
|
137
|
-
if (msg.includes("embed error") || msg.includes("fetch failed"))
|
|
138
|
-
return;
|
|
139
|
-
origError(...args);
|
|
140
|
-
};
|
|
141
171
|
pendingEmbeds.set(store, embedPromise);
|
|
142
172
|
}
|
|
143
173
|
return store;
|
|
@@ -231,7 +261,9 @@ async function mergeLexAndVectorResults(store, query, lexResults, limit) {
|
|
|
231
261
|
const llm = store.internal.llm;
|
|
232
262
|
const embedModel = llm?.embedModelName;
|
|
233
263
|
if (status.hasVectorIndex && llm && embedModel) {
|
|
234
|
-
|
|
264
|
+
const vectorAttempt = await captureQmdEmbedErrors(() => store.internal.searchVec(query, embedModel, limit, "wiki", llm));
|
|
265
|
+
if (vectorAttempt.ok)
|
|
266
|
+
vecResults = vectorAttempt.value;
|
|
235
267
|
}
|
|
236
268
|
}
|
|
237
269
|
catch {
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,+BAA+B,EAA2B,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4C1C,+EAA+E;AAE/E,MAAM,aAAa,GAA2B;IAC5C,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,wCAAwC;IAClD,YAAY,EAAE,sCAAsC;IACpD,WAAW,EAAE,+BAA+B;CAC7C,CAAC;AAEF,MAAM,WAAW,GAAG,yEAAyE,CAAC;AAE9F,+EAA+E;AAE/E,MAAM,aAAa,GAAG,IAAI,OAAO,EAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { QMDStore } from "qmd-engine";
|
|
3
|
+
import type { WikiReadDetails, WikiWriteDetails } from "./schemas.js";
|
|
4
|
+
export declare function createEditExecute(wikiDir: string, store: QMDStore, markDirty: () => void): (params: {
|
|
5
|
+
path: string;
|
|
6
|
+
edits: Array<{
|
|
7
|
+
oldText: string;
|
|
8
|
+
newText: string;
|
|
9
|
+
}>;
|
|
10
|
+
title?: string;
|
|
11
|
+
scope?: string[];
|
|
12
|
+
tags?: string[];
|
|
13
|
+
logSummary?: string;
|
|
14
|
+
}) => Promise<AgentToolResult<WikiWriteDetails>>;
|
|
15
|
+
export declare function createReadExecute(wikiDir: string): (params: {
|
|
16
|
+
path: string;
|
|
17
|
+
}) => Promise<AgentToolResult<WikiReadDetails>>;
|
|
18
|
+
//# sourceMappingURL=edit-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-read.d.ts","sourceRoot":"","sources":["../../src/tools/edit-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKtE,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,IAGnB,QAAQ;IACN,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KACA,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CA6F9C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,IAE7C,QAAQ;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KACvB,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAoE7C"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { formatFreshness } from "../query.js";
|
|
2
|
+
import { autoLinkSlugs, syncFrontmatterLinks } from "../link-utils.js";
|
|
3
|
+
import { normalizeTags, normalizeScopes } from "../tag-registry.js";
|
|
4
|
+
import { redactSecrets } from "../redact.js";
|
|
5
|
+
import { appendLog, gitCommit, listPages, readIndex, readPage, writePage } from "../wiki.js";
|
|
6
|
+
import { parsePagePath, scheduleWikiMaintenance } from "./shared.js";
|
|
7
|
+
// -- Factory: wiki_read execute ----------------------------------------------
|
|
8
|
+
export function createEditExecute(wikiDir, store, markDirty) {
|
|
9
|
+
return async (params) => {
|
|
10
|
+
const parsed = parsePagePath(params.path);
|
|
11
|
+
if (!parsed) {
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: "text", text: `Invalid page path: ${params.path}` }],
|
|
14
|
+
details: { pagesWritten: [], pagesSkipped: [params.path], indexUpdated: false, logAppended: false },
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const existing = await readPage(wikiDir, parsed.category, parsed.slug);
|
|
18
|
+
const pagePath = `${parsed.category}/${parsed.slug}`;
|
|
19
|
+
if (!existing) {
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: "text", text: `Page not found: ${pagePath}` }],
|
|
22
|
+
details: { pagesWritten: [], pagesSkipped: [pagePath], indexUpdated: false, logAppended: false },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (params.edits.length === 0) {
|
|
26
|
+
return {
|
|
27
|
+
content: [{ type: "text", text: "No edits supplied." }],
|
|
28
|
+
details: { pagesWritten: [], pagesSkipped: [pagePath], indexUpdated: false, logAppended: false },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Atomic validation: all oldText strings must exist exactly once before writing.
|
|
32
|
+
const errors = [];
|
|
33
|
+
for (const edit of params.edits) {
|
|
34
|
+
const first = existing.body.indexOf(edit.oldText);
|
|
35
|
+
const last = existing.body.lastIndexOf(edit.oldText);
|
|
36
|
+
if (first === -1) {
|
|
37
|
+
errors.push(`oldText not found: "${edit.oldText.slice(0, 60)}..."`);
|
|
38
|
+
}
|
|
39
|
+
else if (first !== last) {
|
|
40
|
+
errors.push(`oldText is not unique: "${edit.oldText.slice(0, 60)}..."`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (errors.length > 0) {
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: "text", text: `No changes written.\n${errors.join("\n")}` }],
|
|
46
|
+
details: { pagesWritten: [], pagesSkipped: [pagePath], indexUpdated: false, logAppended: false },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
let editedBody = existing.body;
|
|
50
|
+
for (const edit of params.edits) {
|
|
51
|
+
editedBody = editedBody.replace(edit.oldText, edit.newText);
|
|
52
|
+
}
|
|
53
|
+
// Surgical edit path: do not scan/autolink/rebuild/reindex the whole wiki.
|
|
54
|
+
// wiki_edit is often called mid-task and must stay fast; broader maintenance
|
|
55
|
+
// can run via wiki_lint/rebuildIndex or on startup.
|
|
56
|
+
const linkedBody = redactSecrets(editedBody).text;
|
|
57
|
+
const now = new Date().toISOString();
|
|
58
|
+
const rawScope = params.scope ?? existing.frontmatter.scope;
|
|
59
|
+
const newScope = normalizeScopes(rawScope);
|
|
60
|
+
const rawTags = params.tags ?? existing.frontmatter.tags;
|
|
61
|
+
const updatedPage = {
|
|
62
|
+
category: parsed.category,
|
|
63
|
+
slug: parsed.slug,
|
|
64
|
+
frontmatter: {
|
|
65
|
+
...existing.frontmatter,
|
|
66
|
+
title: params.title ?? existing.frontmatter.title,
|
|
67
|
+
scope: newScope,
|
|
68
|
+
tags: normalizeTags(rawTags, newScope),
|
|
69
|
+
updated: now,
|
|
70
|
+
links: syncFrontmatterLinks(linkedBody),
|
|
71
|
+
},
|
|
72
|
+
body: linkedBody,
|
|
73
|
+
};
|
|
74
|
+
await writePage(wikiDir, updatedPage);
|
|
75
|
+
if (params.logSummary) {
|
|
76
|
+
await appendLog(wikiDir, {
|
|
77
|
+
date: now.split("T")[0],
|
|
78
|
+
operation: "edit",
|
|
79
|
+
summary: params.logSummary,
|
|
80
|
+
pages: [pagePath],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
markDirty();
|
|
84
|
+
await gitCommit(wikiDir, params.logSummary ?? `wiki_edit: ${pagePath}`);
|
|
85
|
+
scheduleWikiMaintenance(wikiDir, store, markDirty);
|
|
86
|
+
return {
|
|
87
|
+
content: [{ type: "text", text: `Edited ${pagePath}. Scheduled background index/search refresh.` }],
|
|
88
|
+
details: {
|
|
89
|
+
pagesWritten: [pagePath],
|
|
90
|
+
pagesSkipped: [],
|
|
91
|
+
indexUpdated: false,
|
|
92
|
+
logAppended: !!params.logSummary,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function createReadExecute(wikiDir) {
|
|
98
|
+
return async (params) => {
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
const normalizedPath = params.path.trim().toLowerCase().replace(/^\/+/, "");
|
|
101
|
+
if (normalizedPath === "index" || normalizedPath === "index.md" || normalizedPath === "wiki-index") {
|
|
102
|
+
const index = await readIndex(wikiDir);
|
|
103
|
+
return {
|
|
104
|
+
content: [{ type: "text", text: index }],
|
|
105
|
+
details: { found: true, path: "index.md" },
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// Try parsing as category/slug path
|
|
109
|
+
const parsed = parsePagePath(params.path);
|
|
110
|
+
if (parsed) {
|
|
111
|
+
const page = await readPage(wikiDir, parsed.category, parsed.slug);
|
|
112
|
+
if (page) {
|
|
113
|
+
const fm = page.frontmatter;
|
|
114
|
+
const freshness = formatFreshness(fm.updated, now);
|
|
115
|
+
const header = [
|
|
116
|
+
`# ${fm.title}`,
|
|
117
|
+
`PARA: ${fm.para} | Scope: ${fm.scope.join(", ")} | Tags: ${fm.tags.join(", ")}`,
|
|
118
|
+
`Created: ${fm.created} | Updated: ${fm.updated} | ${freshness}`,
|
|
119
|
+
fm.sources.length > 0 ? `Sources: ${fm.sources.join(", ")}` : "",
|
|
120
|
+
fm.links.length > 0 ? `Links: ${fm.links.map((l) => `[[${l}]]`).join(", ")}` : "",
|
|
121
|
+
]
|
|
122
|
+
.filter(Boolean)
|
|
123
|
+
.join("\n");
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: "text", text: `${header}\n\n${page.body}` }],
|
|
126
|
+
details: { found: true, path: `${parsed.category}/${parsed.slug}` },
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Try finding by title (case-insensitive search across all pages)
|
|
131
|
+
const allPages = await listPages(wikiDir);
|
|
132
|
+
const titleLower = params.path.toLowerCase();
|
|
133
|
+
for (const ref of allPages) {
|
|
134
|
+
if (ref.title.toLowerCase() === titleLower || ref.slug === titleLower) {
|
|
135
|
+
const page = await readPage(wikiDir, ref.category, ref.slug);
|
|
136
|
+
if (page) {
|
|
137
|
+
const fm = page.frontmatter;
|
|
138
|
+
const freshness = formatFreshness(fm.updated, now);
|
|
139
|
+
const header = [
|
|
140
|
+
`# ${fm.title}`,
|
|
141
|
+
`PARA: ${fm.para} | Scope: ${fm.scope.join(", ")} | Tags: ${fm.tags.join(", ")}`,
|
|
142
|
+
`Created: ${fm.created} | Updated: ${fm.updated} | ${freshness}`,
|
|
143
|
+
fm.sources.length > 0 ? `Sources: ${fm.sources.join(", ")}` : "",
|
|
144
|
+
fm.links.length > 0 ? `Links: ${fm.links.map((l) => `[[${l}]]`).join(", ")}` : "",
|
|
145
|
+
]
|
|
146
|
+
.filter(Boolean)
|
|
147
|
+
.join("\n");
|
|
148
|
+
return {
|
|
149
|
+
content: [{ type: "text", text: `${header}\n\n${page.body}` }],
|
|
150
|
+
details: { found: true, path: `${ref.category}/${ref.slug}` },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
content: [{ type: "text", text: `Page not found: "${params.path}"` }],
|
|
157
|
+
details: { found: false },
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=edit-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-read.js","sourceRoot":"","sources":["../../src/tools/edit-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { QMDStore } from "qmd-engine";
|
|
3
|
+
import type { ProjectScope } from "../scope.js";
|
|
4
|
+
import type { ParaCategory } from "../wiki.js";
|
|
5
|
+
import type { WikiIngestDetails } from "./schemas.js";
|
|
6
|
+
export declare function createIngestExecute(wikiDir: string, _store: QMDStore, getScope: () => ProjectScope): (params: {
|
|
7
|
+
source: string;
|
|
8
|
+
sourceType?: "url" | "file" | "text";
|
|
9
|
+
category?: ParaCategory;
|
|
10
|
+
scope?: string[];
|
|
11
|
+
}) => Promise<AgentToolResult<WikiIngestDetails>>;
|
|
12
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/tools/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,EAChB,QAAQ,EAAE,MAAM,YAAY,IAG1B,QAAQ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,KAC1G,OAAO,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CA6C/C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { resolveSource, truncateSource } from "../ingest.js";
|
|
2
|
+
import { INGEST_PROMPT } from "../templates/prompts.js";
|
|
3
|
+
// -- Factory: wiki_ingest execute --------------------------------------------
|
|
4
|
+
export function createIngestExecute(wikiDir, _store, getScope) {
|
|
5
|
+
return async (params) => {
|
|
6
|
+
const scope = getScope();
|
|
7
|
+
const resolved = await resolveSource(wikiDir, {
|
|
8
|
+
source: params.source,
|
|
9
|
+
sourceType: params.sourceType,
|
|
10
|
+
scope: params.scope,
|
|
11
|
+
category: params.category,
|
|
12
|
+
}, scope);
|
|
13
|
+
const categoryHint = resolved.categoryHint
|
|
14
|
+
? `\nSuggested PARA category: ${resolved.categoryHint}`
|
|
15
|
+
: "";
|
|
16
|
+
// Assemble the tool result with instructions for the LLM
|
|
17
|
+
const toolResultText = [
|
|
18
|
+
INGEST_PROMPT,
|
|
19
|
+
"",
|
|
20
|
+
`Current scope: ${resolved.scopeName} (tags: ${resolved.scopeTags.join(", ")})`,
|
|
21
|
+
categoryHint,
|
|
22
|
+
resolved.rawPath ? `Raw source saved to: ${resolved.rawPath}` : "",
|
|
23
|
+
"",
|
|
24
|
+
"<wiki-schema>",
|
|
25
|
+
resolved.schema,
|
|
26
|
+
"</wiki-schema>",
|
|
27
|
+
"",
|
|
28
|
+
"<wiki-index>",
|
|
29
|
+
resolved.index,
|
|
30
|
+
"</wiki-index>",
|
|
31
|
+
"",
|
|
32
|
+
"<source-content>",
|
|
33
|
+
truncateSource(resolved.content),
|
|
34
|
+
"</source-content>",
|
|
35
|
+
"",
|
|
36
|
+
"Now analyze the source content and use wiki_write to create/update pages, update the index, and log the operation.",
|
|
37
|
+
].join("\n");
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: "text", text: toolResultText }],
|
|
40
|
+
details: {
|
|
41
|
+
sourceType: resolved.sourceType,
|
|
42
|
+
rawPath: resolved.rawPath,
|
|
43
|
+
sourceLength: resolved.content.length,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/tools/ingest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,+EAA+E;AAE/E,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,MAAgB,EAChB,QAA4B;IAE5B,OAAO,KAAK,EACV,MAA2G,EAC9D,EAAE;QAC/C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE;YAC5C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,EAAE,KAAK,CAAC,CAAC;QAEV,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY;YACxC,CAAC,CAAC,8BAA8B,QAAQ,CAAC,YAAY,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QAEP,yDAAyD;QACzD,MAAM,cAAc,GAAG;YACrB,aAAa;YACb,EAAE;YACF,kBAAkB,QAAQ,CAAC,SAAS,WAAW,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC/E,YAAY;YACZ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;YAClE,EAAE;YACF,eAAe;YACf,QAAQ,CAAC,MAAM;YACf,gBAAgB;YAChB,EAAE;YACF,cAAc;YACd,QAAQ,CAAC,KAAK;YACd,eAAe;YACf,EAAE;YACF,kBAAkB;YAClB,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC;YAChC,mBAAmB;YACnB,EAAE;YACF,oHAAoH;SACrH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;YACjD,OAAO,EAAE;gBACP,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;aACtC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { QMDStore } from "qmd-engine";
|
|
3
|
+
import type { WikiLintDetails } from "./schemas.js";
|
|
4
|
+
export declare function createLintExecute(wikiDir: string, store: QMDStore, markDirty: () => void, getLintConfig?: () => {
|
|
5
|
+
autoFix: boolean;
|
|
6
|
+
staleDays: number;
|
|
7
|
+
}): (params: {
|
|
8
|
+
autoFix?: boolean;
|
|
9
|
+
}) => Promise<AgentToolResult<WikiLintDetails>>;
|
|
10
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,EACrB,aAAa,CAAC,EAAE,MAAM;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,IAG3D,QAAQ;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KAC5B,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAuD7C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { lintWiki } from "../lint.js";
|
|
2
|
+
import { PARA_CATEGORIES } from "../wiki.js";
|
|
3
|
+
import { LINT_PROMPT } from "../templates/prompts.js";
|
|
4
|
+
import { scheduleWikiMaintenance } from "./shared.js";
|
|
5
|
+
// -- Factory: wiki_lint execute ----------------------------------------------
|
|
6
|
+
export function createLintExecute(wikiDir, store, markDirty, getLintConfig) {
|
|
7
|
+
return async (params) => {
|
|
8
|
+
const configured = getLintConfig?.();
|
|
9
|
+
const report = await lintWiki(wikiDir, {
|
|
10
|
+
autoFix: params.autoFix ?? configured?.autoFix ?? true,
|
|
11
|
+
staleDays: configured?.staleDays ?? 90,
|
|
12
|
+
});
|
|
13
|
+
if (report.fixed.length > 0) {
|
|
14
|
+
scheduleWikiMaintenance(wikiDir, store, markDirty);
|
|
15
|
+
}
|
|
16
|
+
const { issues, fixed, stats } = report;
|
|
17
|
+
// Format report for the LLM
|
|
18
|
+
const parts = [];
|
|
19
|
+
parts.push("## Wiki Lint Report\n");
|
|
20
|
+
parts.push(`Total pages: ${stats.totalPages}`);
|
|
21
|
+
parts.push(`By category: ${PARA_CATEGORIES.map((c) => `${c}: ${stats.byCategory[c]}`).join(", ")}`);
|
|
22
|
+
parts.push(`Total links: ${stats.totalLinks} (broken: ${stats.brokenLinks})`);
|
|
23
|
+
parts.push(`Orphan pages: ${stats.orphanPages}`);
|
|
24
|
+
if (stats.oldestPage)
|
|
25
|
+
parts.push(`Oldest page: ${stats.oldestPage}`);
|
|
26
|
+
if (stats.newestPage)
|
|
27
|
+
parts.push(`Newest page: ${stats.newestPage}`);
|
|
28
|
+
if (stats.lastIngest)
|
|
29
|
+
parts.push(`Last ingest: ${stats.lastIngest}`);
|
|
30
|
+
if (fixed.length > 0) {
|
|
31
|
+
parts.push(`\n## Auto-fixed (${fixed.length})\n`);
|
|
32
|
+
for (const f of fixed) {
|
|
33
|
+
parts.push(`- [${f.severity}] ${f.page ?? ""}: ${f.message}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (issues.length > 0) {
|
|
37
|
+
parts.push(`\n## Remaining Issues (${issues.length})\n`);
|
|
38
|
+
for (const issue of issues) {
|
|
39
|
+
parts.push(`- [${issue.severity}] ${issue.category}${issue.page ? ` (${issue.page})` : ""}: ${issue.message}`);
|
|
40
|
+
}
|
|
41
|
+
parts.push("");
|
|
42
|
+
parts.push(LINT_PROMPT);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
parts.push("\nNo remaining issues. Wiki is healthy.");
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: "text", text: parts.join("\n") }],
|
|
49
|
+
details: {
|
|
50
|
+
issueCount: issues.length,
|
|
51
|
+
fixedCount: fixed.length,
|
|
52
|
+
stats,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/tools/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,SAEE,OAAO,CAAC,eAAe,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAkCzF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CURRENT_SCHEMA_VERSION, migrateToLatest } from "../frontmatter.js";
|
|
2
|
+
import { listPages, readPage, writePage } from "../wiki.js";
|
|
3
|
+
// -- Factory: wiki_migrate execute -------------------------------------------
|
|
4
|
+
export function createMigrateExecute(wikiDir) {
|
|
5
|
+
return async () => {
|
|
6
|
+
const allRefs = await listPages(wikiDir);
|
|
7
|
+
let migratedCount = 0;
|
|
8
|
+
for (const ref of allRefs) {
|
|
9
|
+
const page = await readPage(wikiDir, ref.category, ref.slug);
|
|
10
|
+
if (!page)
|
|
11
|
+
continue;
|
|
12
|
+
const version = page.frontmatter.schemaVersion ?? 1;
|
|
13
|
+
if (version >= CURRENT_SCHEMA_VERSION)
|
|
14
|
+
continue;
|
|
15
|
+
const rawObj = page.frontmatter;
|
|
16
|
+
const result = migrateToLatest(rawObj, page.body);
|
|
17
|
+
const migratedFm = result.fm;
|
|
18
|
+
migratedFm.updated = new Date().toISOString();
|
|
19
|
+
await writePage(wikiDir, {
|
|
20
|
+
category: ref.category,
|
|
21
|
+
slug: ref.slug,
|
|
22
|
+
frontmatter: migratedFm,
|
|
23
|
+
body: result.body,
|
|
24
|
+
});
|
|
25
|
+
migratedCount++;
|
|
26
|
+
}
|
|
27
|
+
const summary = migratedCount > 0
|
|
28
|
+
? `Migrated ${migratedCount} page(s) to schema version ${CURRENT_SCHEMA_VERSION}.`
|
|
29
|
+
: `All ${allRefs.length} page(s) already at schema version ${CURRENT_SCHEMA_VERSION}.`;
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: "text", text: summary }],
|
|
32
|
+
details: { migratedCount, totalPages: allRefs.length },
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/tools/migrate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAwB,MAAM,YAAY,CAAC;AAElF,+EAA+E;AAE/E,MAAM,UAAU,oBAAoB,CAClC,OAAe;IAEf,OAAO,KAAK,IAA6E,EAAE;QACzF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,IAAI,CAAC,CAAC;YACpD,IAAI,OAAO,IAAI,sBAAsB;gBAAE,SAAS;YAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAiD,CAAC;YACtE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,MAAM,UAAU,GAAG,MAAM,CAAC,EAAgC,CAAC;YAC3D,UAAU,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,SAAS,CAAC,OAAO,EAAE;gBACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;YACH,aAAa,EAAE,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC;YAC/B,CAAC,CAAC,YAAY,aAAa,8BAA8B,sBAAsB,GAAG;YAClF,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,sCAAsC,sBAAsB,GAAG,CAAC;QAEzF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC1C,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE;SACvD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { QMDStore } from "qmd-engine";
|
|
3
|
+
import { type ParaCategory } from "../wiki.js";
|
|
4
|
+
import type { WikiMoveDetails } from "./schemas.js";
|
|
5
|
+
export declare function createMoveExecute(wikiDir: string, store: QMDStore, markDirty: () => void): (params: {
|
|
6
|
+
path: string;
|
|
7
|
+
to: ParaCategory;
|
|
8
|
+
}) => Promise<AgentToolResult<WikiMoveDetails>>;
|
|
9
|
+
//# sourceMappingURL=move.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/tools/move.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAwE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACrH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAKpD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,IAGnB,QAAQ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,YAAY,CAAA;CAAE,KACzC,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CA+D7C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { appendLog, gitCommit, movePage, readPage, rebuildIndex } from "../wiki.js";
|
|
2
|
+
import { parsePagePath, scheduleWikiMaintenance } from "./shared.js";
|
|
3
|
+
// -- Factory: wiki_move execute ----------------------------------------------
|
|
4
|
+
export function createMoveExecute(wikiDir, store, markDirty) {
|
|
5
|
+
return async (params) => {
|
|
6
|
+
const parsed = parsePagePath(params.path);
|
|
7
|
+
if (!parsed) {
|
|
8
|
+
throw new Error(`Invalid page path: "${params.path}". Expected format: category/slug`);
|
|
9
|
+
}
|
|
10
|
+
const page = await readPage(wikiDir, parsed.category, parsed.slug);
|
|
11
|
+
if (!page) {
|
|
12
|
+
throw new Error(`Page not found: "${params.path}"`);
|
|
13
|
+
}
|
|
14
|
+
if (parsed.category === params.to) {
|
|
15
|
+
return {
|
|
16
|
+
content: [
|
|
17
|
+
{
|
|
18
|
+
type: "text",
|
|
19
|
+
text: `Page "${params.path}" is already in ${params.to}. No move needed.`,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
details: { from: params.path, to: `${params.to}/${parsed.slug}` },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const ref = {
|
|
26
|
+
category: parsed.category,
|
|
27
|
+
slug: parsed.slug,
|
|
28
|
+
title: page.frontmatter.title,
|
|
29
|
+
path: `${parsed.category}/${parsed.slug}.md`,
|
|
30
|
+
};
|
|
31
|
+
await movePage(wikiDir, ref, params.to);
|
|
32
|
+
// Rebuild index.md inline (fast, single-pass); defer QMD reindex to the
|
|
33
|
+
// debounced background maintenance queue like wiki_write/wiki_edit.
|
|
34
|
+
await rebuildIndex(wikiDir);
|
|
35
|
+
scheduleWikiMaintenance(wikiDir, store, markDirty);
|
|
36
|
+
markDirty();
|
|
37
|
+
// Git commit
|
|
38
|
+
await gitCommit(wikiDir, `move: ${page.frontmatter.title} → ${params.to}`);
|
|
39
|
+
// Log the move
|
|
40
|
+
const now = new Date().toISOString();
|
|
41
|
+
await appendLog(wikiDir, {
|
|
42
|
+
date: now.split("T")[0],
|
|
43
|
+
operation: "move",
|
|
44
|
+
summary: `Moved ${page.frontmatter.title} from ${parsed.category} to ${params.to}`,
|
|
45
|
+
pages: [`${params.to}/${parsed.slug}`],
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
content: [
|
|
49
|
+
{
|
|
50
|
+
type: "text",
|
|
51
|
+
text: `Moved "${page.frontmatter.title}" from ${parsed.category}/ to ${params.to}/`,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
details: {
|
|
55
|
+
from: `${parsed.category}/${parsed.slug}`,
|
|
56
|
+
to: `${params.to}/${parsed.slug}`,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=move.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.js","sourceRoot":"","sources":["../../src/tools/move.ts"],"names":[],"mappings":"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"}
|