pi-para 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/README.md +305 -0
  3. package/SETUP.md +171 -0
  4. package/dist/capture.d.ts +34 -0
  5. package/dist/capture.d.ts.map +1 -0
  6. package/dist/capture.js +461 -0
  7. package/dist/capture.js.map +1 -0
  8. package/dist/cli.d.ts +15 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +405 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands.d.ts +15 -0
  13. package/dist/commands.d.ts.map +1 -0
  14. package/dist/commands.js +786 -0
  15. package/dist/commands.js.map +1 -0
  16. package/dist/context.d.ts +61 -0
  17. package/dist/context.d.ts.map +1 -0
  18. package/dist/context.js +289 -0
  19. package/dist/context.js.map +1 -0
  20. package/dist/daemon.d.ts +49 -0
  21. package/dist/daemon.d.ts.map +1 -0
  22. package/dist/daemon.js +226 -0
  23. package/dist/daemon.js.map +1 -0
  24. package/dist/frontmatter.d.ts +59 -0
  25. package/dist/frontmatter.d.ts.map +1 -0
  26. package/dist/frontmatter.js +170 -0
  27. package/dist/frontmatter.js.map +1 -0
  28. package/dist/gepa/dataset.d.ts +36 -0
  29. package/dist/gepa/dataset.d.ts.map +1 -0
  30. package/dist/gepa/dataset.js +148 -0
  31. package/dist/gepa/dataset.js.map +1 -0
  32. package/dist/gepa/evaluator.d.ts +51 -0
  33. package/dist/gepa/evaluator.d.ts.map +1 -0
  34. package/dist/gepa/evaluator.js +317 -0
  35. package/dist/gepa/evaluator.js.map +1 -0
  36. package/dist/gepa/index.d.ts +66 -0
  37. package/dist/gepa/index.d.ts.map +1 -0
  38. package/dist/gepa/index.js +240 -0
  39. package/dist/gepa/index.js.map +1 -0
  40. package/dist/gepa/llm.d.ts +35 -0
  41. package/dist/gepa/llm.d.ts.map +1 -0
  42. package/dist/gepa/llm.js +268 -0
  43. package/dist/gepa/llm.js.map +1 -0
  44. package/dist/gepa/optimized/capture-prompt.txt +65 -0
  45. package/dist/gepa/optimizer.d.ts +29 -0
  46. package/dist/gepa/optimizer.d.ts.map +1 -0
  47. package/dist/gepa/optimizer.js +249 -0
  48. package/dist/gepa/optimizer.js.map +1 -0
  49. package/dist/gepa/targets.d.ts +39 -0
  50. package/dist/gepa/targets.d.ts.map +1 -0
  51. package/dist/gepa/targets.js +326 -0
  52. package/dist/gepa/targets.js.map +1 -0
  53. package/dist/gepa/types.d.ts +168 -0
  54. package/dist/gepa/types.d.ts.map +1 -0
  55. package/dist/gepa/types.js +124 -0
  56. package/dist/gepa/types.js.map +1 -0
  57. package/dist/index.d.ts +21 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +294 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/ingest.d.ts +88 -0
  62. package/dist/ingest.d.ts.map +1 -0
  63. package/dist/ingest.js +105 -0
  64. package/dist/ingest.js.map +1 -0
  65. package/dist/link-discovery.d.ts +40 -0
  66. package/dist/link-discovery.d.ts.map +1 -0
  67. package/dist/link-discovery.js +122 -0
  68. package/dist/link-discovery.js.map +1 -0
  69. package/dist/link-utils.d.ts +30 -0
  70. package/dist/link-utils.d.ts.map +1 -0
  71. package/dist/link-utils.js +145 -0
  72. package/dist/link-utils.js.map +1 -0
  73. package/dist/lint.d.ts +39 -0
  74. package/dist/lint.d.ts.map +1 -0
  75. package/dist/lint.js +827 -0
  76. package/dist/lint.js.map +1 -0
  77. package/dist/maintainer.d.ts +24 -0
  78. package/dist/maintainer.d.ts.map +1 -0
  79. package/dist/maintainer.js +358 -0
  80. package/dist/maintainer.js.map +1 -0
  81. package/dist/processor.d.ts +14 -0
  82. package/dist/processor.d.ts.map +1 -0
  83. package/dist/processor.js +361 -0
  84. package/dist/processor.js.map +1 -0
  85. package/dist/query.d.ts +69 -0
  86. package/dist/query.d.ts.map +1 -0
  87. package/dist/query.js +107 -0
  88. package/dist/query.js.map +1 -0
  89. package/dist/raw.d.ts +57 -0
  90. package/dist/raw.d.ts.map +1 -0
  91. package/dist/raw.js +219 -0
  92. package/dist/raw.js.map +1 -0
  93. package/dist/redact.d.ts +21 -0
  94. package/dist/redact.d.ts.map +1 -0
  95. package/dist/redact.js +143 -0
  96. package/dist/redact.js.map +1 -0
  97. package/dist/scope.d.ts +54 -0
  98. package/dist/scope.d.ts.map +1 -0
  99. package/dist/scope.js +161 -0
  100. package/dist/scope.js.map +1 -0
  101. package/dist/scripts/bulk-link-fix.d.ts +9 -0
  102. package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
  103. package/dist/scripts/bulk-link-fix.js +106 -0
  104. package/dist/scripts/bulk-link-fix.js.map +1 -0
  105. package/dist/session-tools.d.ts +33 -0
  106. package/dist/session-tools.d.ts.map +1 -0
  107. package/dist/session-tools.js +211 -0
  108. package/dist/session-tools.js.map +1 -0
  109. package/dist/state.d.ts +54 -0
  110. package/dist/state.d.ts.map +1 -0
  111. package/dist/state.js +176 -0
  112. package/dist/state.js.map +1 -0
  113. package/dist/store.d.ts +56 -0
  114. package/dist/store.d.ts.map +1 -0
  115. package/dist/store.js +227 -0
  116. package/dist/store.js.map +1 -0
  117. package/dist/summarize.d.ts +56 -0
  118. package/dist/summarize.d.ts.map +1 -0
  119. package/dist/summarize.js +231 -0
  120. package/dist/summarize.js.map +1 -0
  121. package/dist/tag-registry.d.ts +56 -0
  122. package/dist/tag-registry.d.ts.map +1 -0
  123. package/dist/tag-registry.js +146 -0
  124. package/dist/tag-registry.js.map +1 -0
  125. package/dist/templates/prompts.d.ts +63 -0
  126. package/dist/templates/prompts.d.ts.map +1 -0
  127. package/dist/templates/prompts.js +260 -0
  128. package/dist/templates/prompts.js.map +1 -0
  129. package/dist/tools.d.ts +26 -0
  130. package/dist/tools.d.ts.map +1 -0
  131. package/dist/tools.js +1033 -0
  132. package/dist/tools.js.map +1 -0
  133. package/dist/watcher.d.ts +25 -0
  134. package/dist/watcher.d.ts.map +1 -0
  135. package/dist/watcher.js +84 -0
  136. package/dist/watcher.js.map +1 -0
  137. package/dist/webui/client/dist/index.html +1885 -0
  138. package/dist/webui/server.d.ts +31 -0
  139. package/dist/webui/server.d.ts.map +1 -0
  140. package/dist/webui/server.js +566 -0
  141. package/dist/webui/server.js.map +1 -0
  142. package/dist/wiki.d.ts +103 -0
  143. package/dist/wiki.d.ts.map +1 -0
  144. package/dist/wiki.js +428 -0
  145. package/dist/wiki.js.map +1 -0
  146. package/package.json +142 -0
  147. package/scripts/gepa/__pycache__/dataset.cpython-313.pyc +0 -0
  148. package/scripts/gepa/__pycache__/lm_providers.cpython-313.pyc +0 -0
  149. package/scripts/gepa/__pycache__/metric.cpython-313.pyc +0 -0
  150. package/scripts/gepa/__pycache__/program.cpython-313.pyc +0 -0
  151. package/scripts/gepa/__pycache__/wiki_reader.cpython-313.pyc +0 -0
  152. package/scripts/gepa/dataset.py +192 -0
  153. package/scripts/gepa/lm_providers.py +472 -0
  154. package/scripts/gepa/metric.py +279 -0
  155. package/scripts/gepa/optimize.py +367 -0
  156. package/scripts/gepa/program.py +99 -0
  157. package/scripts/gepa/pyproject.toml +19 -0
  158. package/scripts/gepa/run-all.sh +53 -0
  159. package/scripts/gepa/uv.lock +2241 -0
  160. package/scripts/gepa/wiki_reader.py +113 -0
  161. package/skills/para/SKILL.md +77 -0
  162. package/skills/setup/SKILL.md +20 -0
  163. package/src/capture.ts +563 -0
  164. package/src/cli.ts +416 -0
  165. package/src/commands.ts +878 -0
  166. package/src/context.ts +390 -0
  167. package/src/daemon.ts +288 -0
  168. package/src/frontmatter.ts +219 -0
  169. package/src/gepa/index.ts +287 -0
  170. package/src/gepa/optimized/capture-prompt.txt +65 -0
  171. package/src/index.ts +384 -0
  172. package/src/ingest.ts +177 -0
  173. package/src/link-discovery.ts +170 -0
  174. package/src/link-utils.ts +169 -0
  175. package/src/lint.ts +1018 -0
  176. package/src/maintainer.ts +404 -0
  177. package/src/processor.ts +415 -0
  178. package/src/python/__pycache__/minimax_lm.cpython-312.pyc +0 -0
  179. package/src/python/minimax_lm.py +198 -0
  180. package/src/python/rlm_capture.py +215 -0
  181. package/src/query.ts +148 -0
  182. package/src/raw.ts +276 -0
  183. package/src/redact.ts +159 -0
  184. package/src/scope.ts +214 -0
  185. package/src/scripts/bulk-link-fix.ts +126 -0
  186. package/src/session-tools.ts +260 -0
  187. package/src/state.ts +271 -0
  188. package/src/store.ts +288 -0
  189. package/src/summarize.ts +273 -0
  190. package/src/tag-registry.ts +157 -0
  191. package/src/templates/index.md +17 -0
  192. package/src/templates/prompts.ts +274 -0
  193. package/src/templates/schema.md +116 -0
  194. package/src/tools.ts +1293 -0
  195. package/src/watcher.ts +101 -0
  196. package/src/webui/client/dist/index.html +1885 -0
  197. package/src/webui/server.ts +765 -0
  198. package/src/wiki.ts +550 -0
@@ -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 "@mariozechner/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 "@mariozechner/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,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 "@picassio/qmd";
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,eAAe,CAAC;AAC9C,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,CAgCtB;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"}
package/dist/query.js ADDED
@@ -0,0 +1,107 @@
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 { searchWiki } from "./store.js";
9
+ // -- Main pipeline -----------------------------------------------------------
10
+ /**
11
+ * Search the wiki with scope and category filtering.
12
+ *
13
+ * This is the reusable library function. It:
14
+ * 1. Applies scope filtering (unless global flag is set)
15
+ * 2. Filters by PARA category if specified
16
+ * 3. Excludes archives unless explicitly requested
17
+ * 4. Returns results sorted by relevance score
18
+ *
19
+ * The caller (tool or standalone agent) can format the results
20
+ * into an LLM prompt or use them directly.
21
+ */
22
+ export async function queryWiki(store, options, scope) {
23
+ const limit = options.limit ?? 10;
24
+ const isGlobal = options.global ?? false;
25
+ const includeArchives = options.includeArchives ?? (options.category === "archives");
26
+ // Build scope override if explicit scope tags provided
27
+ let effectiveScope;
28
+ if (isGlobal) {
29
+ effectiveScope = undefined; // no scope filtering
30
+ }
31
+ else if (options.scope && options.scope.length > 0) {
32
+ effectiveScope = {
33
+ ...scope,
34
+ name: scope.name,
35
+ include: options.scope,
36
+ };
37
+ }
38
+ else {
39
+ effectiveScope = scope;
40
+ }
41
+ const results = await searchWiki(store, options.query, {
42
+ scope: effectiveScope,
43
+ category: options.category,
44
+ limit,
45
+ includeArchives,
46
+ graphBoost: options.graphBoost,
47
+ });
48
+ return {
49
+ results,
50
+ scopeUsed: effectiveScope ?? scope,
51
+ wasGlobal: isGlobal,
52
+ };
53
+ }
54
+ /**
55
+ * Format query results as a readable text block.
56
+ * Useful for building LLM prompts or display.
57
+ *
58
+ * Includes freshness indicators so the LLM knows which pages to trust
59
+ * vs. which need verification against current code/state.
60
+ */
61
+ export function formatQueryResults(results) {
62
+ if (results.length === 0)
63
+ return "No results found.";
64
+ const now = Date.now();
65
+ return results
66
+ .map((r, i) => {
67
+ const fm = r.frontmatter;
68
+ const freshness = formatFreshness(fm.updated, now);
69
+ return [
70
+ `### Result ${i + 1}: ${fm.title} (${r.page.path})`,
71
+ `PARA: ${fm.para} | Scope: ${fm.scope.join(", ")} | Tags: ${fm.tags.join(", ")}`,
72
+ `Updated: ${fm.updated} | ${freshness}`,
73
+ `Score: ${r.score.toFixed(3)}`,
74
+ "",
75
+ r.snippet,
76
+ ].join("\n");
77
+ })
78
+ .join("\n\n");
79
+ }
80
+ // -- Freshness helpers -------------------------------------------------------
81
+ /**
82
+ * Compute a human-readable freshness indicator from the page's `updated` date.
83
+ *
84
+ * - < 7 days → "✅ FRESH"
85
+ * - 7-14 days → "✅ Recent — N days old"
86
+ * - 14-30 days → "⚠️ AGING — N days old — verify claims about code/configs"
87
+ * - 30-90 days → "⚠️ STALE — N days old — verify before trusting"
88
+ * - > 90 days → "🚨 VERY STALE — N days old — likely outdated, verify everything"
89
+ */
90
+ export function formatFreshness(updatedISO, nowMs) {
91
+ const updatedMs = Date.parse(updatedISO);
92
+ if (isNaN(updatedMs))
93
+ return "❓ Unknown freshness (no valid date)";
94
+ const ageDays = Math.floor((nowMs - updatedMs) / (1000 * 60 * 60 * 24));
95
+ if (ageDays < 0)
96
+ return "✅ FRESH";
97
+ if (ageDays < 7)
98
+ return "✅ FRESH";
99
+ if (ageDays < 14)
100
+ return `✅ Recent — ${ageDays} days old`;
101
+ if (ageDays < 30)
102
+ return `⚠️ AGING — ${ageDays} days old — verify claims about code/configs`;
103
+ if (ageDays < 90)
104
+ return `⚠️ STALE — ${ageDays} days old — verify before trusting`;
105
+ return `🚨 VERY STALE — ${ageDays} days old — likely outdated, verify everything`;
106
+ }
107
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
package/dist/raw.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Raw source vault and session digests.
3
+ *
4
+ * Manages immutable source material in ~/.pi/wiki/raw/ and
5
+ * session digest entries in sessions.md.
6
+ */
7
+ export interface RawSource {
8
+ type: "url" | "file" | "text";
9
+ originalPath: string;
10
+ savedPath: string;
11
+ ingestedAt: string;
12
+ wikiPages: string[];
13
+ }
14
+ export interface SessionDigest {
15
+ date: string;
16
+ project: string;
17
+ sessionFile: string;
18
+ scope: string;
19
+ capturedPages: string[];
20
+ summary: string;
21
+ }
22
+ /**
23
+ * Save a raw source to the vault. URL sources go to raw/articles/,
24
+ * file sources to raw/docs/, text sources to raw/notes/.
25
+ *
26
+ * The file is saved as markdown with a metadata header.
27
+ * Returns the path relative to wikiDir (e.g. "raw/articles/example-com-page.md").
28
+ */
29
+ export declare function saveRawSource(wikiDir: string, source: {
30
+ type: "url" | "file" | "text";
31
+ content: string;
32
+ originalPath: string;
33
+ }): Promise<string>;
34
+ /**
35
+ * Append a session digest entry to sessions.md in the documented format:
36
+ *
37
+ * ```
38
+ * ## [2026-04-27] pi-mono | SSL certificate debugging
39
+ * - **Session**: `~/.pi/agent/sessions/.../file.jsonl`
40
+ * - **Scope**: pi-mono
41
+ * - **Captured**: [[ssl-cert-gotchas]]
42
+ * - **Summary**: One-paragraph summary...
43
+ * ```
44
+ *
45
+ * Creates sessions.md if it does not exist.
46
+ */
47
+ export declare function appendSessionDigest(wikiDir: string, digest: SessionDigest): Promise<void>;
48
+ /**
49
+ * Parse sessions.md and return session digest entries.
50
+ * Optionally filter by scope and/or limit the number of results.
51
+ * Results are returned in file order (oldest first).
52
+ */
53
+ export declare function readSessionDigests(wikiDir: string, options?: {
54
+ limit?: number;
55
+ scope?: string;
56
+ }): Promise<SessionDigest[]>;
57
+ //# sourceMappingURL=raw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../src/raw.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAgFD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IACN,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,aAAa,EAAE,CAAC,CAiE1B"}