pi-para 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/ARCHITECTURE.md +0 -9
  2. package/CHANGELOG.md +22 -0
  3. package/CONFIGURATION.md +5 -23
  4. package/README.md +7 -31
  5. package/SETUP.md +5 -3
  6. package/STRUCTURE.md +0 -9
  7. package/dist/atomic-write.d.ts +2 -0
  8. package/dist/atomic-write.d.ts.map +1 -0
  9. package/dist/atomic-write.js +18 -0
  10. package/dist/atomic-write.js.map +1 -0
  11. package/dist/capture.d.ts +34 -0
  12. package/dist/capture.d.ts.map +1 -0
  13. package/dist/capture.js +461 -0
  14. package/dist/capture.js.map +1 -0
  15. package/dist/cli-legacy.d.ts +4 -0
  16. package/dist/cli-legacy.d.ts.map +1 -0
  17. package/dist/cli-legacy.js +41 -0
  18. package/dist/cli-legacy.js.map +1 -0
  19. package/dist/cli.d.ts +8 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +427 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands.d.ts +15 -0
  24. package/dist/commands.d.ts.map +1 -0
  25. package/dist/commands.js +791 -0
  26. package/dist/commands.js.map +1 -0
  27. package/dist/config.d.ts +94 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +228 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/context.d.ts +63 -0
  32. package/dist/context.d.ts.map +1 -0
  33. package/dist/context.js +311 -0
  34. package/dist/context.js.map +1 -0
  35. package/dist/credentials.d.ts +27 -0
  36. package/dist/credentials.d.ts.map +1 -0
  37. package/dist/credentials.js +85 -0
  38. package/dist/credentials.js.map +1 -0
  39. package/dist/daemon.d.ts +49 -0
  40. package/dist/daemon.d.ts.map +1 -0
  41. package/dist/daemon.js +226 -0
  42. package/dist/daemon.js.map +1 -0
  43. package/dist/doctor.d.ts +20 -0
  44. package/dist/doctor.d.ts.map +1 -0
  45. package/dist/doctor.js +197 -0
  46. package/dist/doctor.js.map +1 -0
  47. package/dist/frontmatter.d.ts +59 -0
  48. package/dist/frontmatter.d.ts.map +1 -0
  49. package/dist/frontmatter.js +170 -0
  50. package/dist/frontmatter.js.map +1 -0
  51. package/dist/index.d.ts +21 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +357 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/ingest.d.ts +88 -0
  56. package/dist/ingest.d.ts.map +1 -0
  57. package/dist/ingest.js +105 -0
  58. package/dist/ingest.js.map +1 -0
  59. package/dist/link-discovery.d.ts +40 -0
  60. package/dist/link-discovery.d.ts.map +1 -0
  61. package/dist/link-discovery.js +122 -0
  62. package/dist/link-discovery.js.map +1 -0
  63. package/dist/link-utils.d.ts +30 -0
  64. package/dist/link-utils.d.ts.map +1 -0
  65. package/dist/link-utils.js +145 -0
  66. package/dist/link-utils.js.map +1 -0
  67. package/dist/lint.d.ts +39 -0
  68. package/dist/lint.d.ts.map +1 -0
  69. package/dist/lint.js +827 -0
  70. package/dist/lint.js.map +1 -0
  71. package/dist/maintainer.d.ts +24 -0
  72. package/dist/maintainer.d.ts.map +1 -0
  73. package/dist/maintainer.js +358 -0
  74. package/dist/maintainer.js.map +1 -0
  75. package/dist/model-resolver.d.ts +30 -0
  76. package/dist/model-resolver.d.ts.map +1 -0
  77. package/dist/model-resolver.js +71 -0
  78. package/dist/model-resolver.js.map +1 -0
  79. package/dist/paths.d.ts +20 -0
  80. package/dist/paths.d.ts.map +1 -0
  81. package/dist/paths.js +33 -0
  82. package/dist/paths.js.map +1 -0
  83. package/dist/processor.d.ts +14 -0
  84. package/dist/processor.d.ts.map +1 -0
  85. package/dist/processor.js +361 -0
  86. package/dist/processor.js.map +1 -0
  87. package/dist/qmd-providers.d.ts +12 -0
  88. package/dist/qmd-providers.d.ts.map +1 -0
  89. package/dist/qmd-providers.js +45 -0
  90. package/dist/qmd-providers.js.map +1 -0
  91. package/dist/query.d.ts +69 -0
  92. package/dist/query.d.ts.map +1 -0
  93. package/dist/query.js +120 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/raw.d.ts +57 -0
  96. package/dist/raw.d.ts.map +1 -0
  97. package/dist/raw.js +219 -0
  98. package/dist/raw.js.map +1 -0
  99. package/dist/redact.d.ts +21 -0
  100. package/dist/redact.d.ts.map +1 -0
  101. package/dist/redact.js +143 -0
  102. package/dist/redact.js.map +1 -0
  103. package/dist/repair.d.ts +11 -0
  104. package/dist/repair.d.ts.map +1 -0
  105. package/dist/repair.js +41 -0
  106. package/dist/repair.js.map +1 -0
  107. package/dist/scheduler/controls.d.ts +35 -0
  108. package/dist/scheduler/controls.d.ts.map +1 -0
  109. package/dist/scheduler/controls.js +98 -0
  110. package/dist/scheduler/controls.js.map +1 -0
  111. package/dist/scheduler/index.d.ts +70 -0
  112. package/dist/scheduler/index.d.ts.map +1 -0
  113. package/dist/scheduler/index.js +245 -0
  114. package/dist/scheduler/index.js.map +1 -0
  115. package/dist/scheduler/leases.d.ts +22 -0
  116. package/dist/scheduler/leases.d.ts.map +1 -0
  117. package/dist/scheduler/leases.js +74 -0
  118. package/dist/scheduler/leases.js.map +1 -0
  119. package/dist/scheduler/session-capture.d.ts +33 -0
  120. package/dist/scheduler/session-capture.d.ts.map +1 -0
  121. package/dist/scheduler/session-capture.js +108 -0
  122. package/dist/scheduler/session-capture.js.map +1 -0
  123. package/dist/scheduler/state.d.ts +56 -0
  124. package/dist/scheduler/state.d.ts.map +1 -0
  125. package/dist/scheduler/state.js +210 -0
  126. package/dist/scheduler/state.js.map +1 -0
  127. package/dist/scope.d.ts +54 -0
  128. package/dist/scope.d.ts.map +1 -0
  129. package/dist/scope.js +161 -0
  130. package/dist/scope.js.map +1 -0
  131. package/dist/scripts/bulk-link-fix.d.ts +9 -0
  132. package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
  133. package/dist/scripts/bulk-link-fix.js +106 -0
  134. package/dist/scripts/bulk-link-fix.js.map +1 -0
  135. package/dist/session-tools.d.ts +33 -0
  136. package/dist/session-tools.d.ts.map +1 -0
  137. package/dist/session-tools.js +211 -0
  138. package/dist/session-tools.js.map +1 -0
  139. package/dist/settings.d.ts +37 -0
  140. package/dist/settings.d.ts.map +1 -0
  141. package/dist/settings.js +176 -0
  142. package/dist/settings.js.map +1 -0
  143. package/dist/setup.d.ts +29 -0
  144. package/dist/setup.d.ts.map +1 -0
  145. package/dist/setup.js +90 -0
  146. package/dist/setup.js.map +1 -0
  147. package/dist/state.d.ts +54 -0
  148. package/dist/state.d.ts.map +1 -0
  149. package/dist/state.js +176 -0
  150. package/dist/state.js.map +1 -0
  151. package/dist/status.d.ts +22 -0
  152. package/dist/status.d.ts.map +1 -0
  153. package/dist/status.js +93 -0
  154. package/dist/status.js.map +1 -0
  155. package/dist/store.d.ts +71 -0
  156. package/dist/store.d.ts.map +1 -0
  157. package/dist/store.js +282 -0
  158. package/dist/store.js.map +1 -0
  159. package/dist/summarize.d.ts +60 -0
  160. package/dist/summarize.d.ts.map +1 -0
  161. package/dist/summarize.js +266 -0
  162. package/dist/summarize.js.map +1 -0
  163. package/dist/tag-registry.d.ts +56 -0
  164. package/dist/tag-registry.d.ts.map +1 -0
  165. package/dist/tag-registry.js +146 -0
  166. package/dist/tag-registry.js.map +1 -0
  167. package/dist/templates/prompts.d.ts +51 -0
  168. package/dist/templates/prompts.d.ts.map +1 -0
  169. package/dist/templates/prompts.js +203 -0
  170. package/dist/templates/prompts.js.map +1 -0
  171. package/dist/tools.d.ts +26 -0
  172. package/dist/tools.d.ts.map +1 -0
  173. package/dist/tools.js +1198 -0
  174. package/dist/tools.js.map +1 -0
  175. package/dist/watcher.d.ts +25 -0
  176. package/dist/watcher.d.ts.map +1 -0
  177. package/dist/watcher.js +84 -0
  178. package/dist/watcher.js.map +1 -0
  179. package/dist/webui/client/dist/index.html +1885 -0
  180. package/dist/webui/server.d.ts +31 -0
  181. package/dist/webui/server.d.ts.map +1 -0
  182. package/dist/webui/server.js +566 -0
  183. package/dist/webui/server.js.map +1 -0
  184. package/dist/wiki-tool-guidance.d.ts +6 -0
  185. package/dist/wiki-tool-guidance.d.ts.map +1 -0
  186. package/dist/wiki-tool-guidance.js +70 -0
  187. package/dist/wiki-tool-guidance.js.map +1 -0
  188. package/dist/wiki.d.ts +108 -0
  189. package/dist/wiki.d.ts.map +1 -0
  190. package/dist/wiki.js +497 -0
  191. package/dist/wiki.js.map +1 -0
  192. package/package.json +2 -1
  193. package/scripts/build-assets.mjs +1 -13
  194. package/skills/setup/SKILL.md +1 -1
  195. package/src/cli.ts +0 -70
  196. package/src/commands.ts +78 -3
  197. package/src/config.ts +0 -25
  198. package/src/doctor.ts +21 -1
  199. package/src/index.ts +16 -38
  200. package/src/scheduler/index.ts +64 -0
  201. package/src/settings.ts +88 -0
  202. package/src/setup.ts +1 -1
  203. package/src/templates/prompts.ts +0 -56
  204. package/scripts/gepa/dataset.py +0 -192
  205. package/scripts/gepa/lm_providers.py +0 -472
  206. package/scripts/gepa/metric.py +0 -279
  207. package/scripts/gepa/optimize.py +0 -367
  208. package/scripts/gepa/program.py +0 -99
  209. package/scripts/gepa/pyproject.toml +0 -19
  210. package/scripts/gepa/run-all.sh +0 -53
  211. package/scripts/gepa/wiki_reader.py +0 -113
  212. package/src/gepa/index.ts +0 -287
  213. package/src/gepa/optimized/capture-prompt.txt +0 -65
@@ -0,0 +1,461 @@
1
+ /**
2
+ * Session knowledge capture — extracts insights from sessions into the wiki.
3
+ *
4
+ * Two modes:
5
+ * - Auto-capture on session_shutdown (standalone Agent with wiki tools)
6
+ * - Explicit capture via /wiki-capture command (standalone Agent)
7
+ *
8
+ * Both are fully automatic — no user confirmation prompts.
9
+ */
10
+ import { Agent } from "@earendil-works/pi-agent-core";
11
+ import { readPage, PARA_CATEGORIES } from "./wiki.js";
12
+ import { appendSessionDigest } from "./raw.js";
13
+ import { createStandaloneTools } from "./tools.js";
14
+ import { serializeSessionForWiki, generateSummary } from "./summarize.js";
15
+ import { CAPTURE_SYSTEM_PROMPT, EXPLICIT_CAPTURE_PROMPT } from "./templates/prompts.js";
16
+ // -- Constants ---------------------------------------------------------------
17
+ const DEFAULT_TIMEOUT_MS = 60_000;
18
+ const NOTHING_PATTERN = /nothing to capture/i;
19
+ // -- Helpers -----------------------------------------------------------------
20
+ /**
21
+ * Parse a page path like "projects/auth-refactor" into category + slug.
22
+ * Returns null for invalid paths.
23
+ */
24
+ function parsePagePath(pagePath) {
25
+ const parts = pagePath.split("/");
26
+ if (parts.length !== 2)
27
+ return null;
28
+ const [cat, slug] = parts;
29
+ if (!PARA_CATEGORIES.includes(cat))
30
+ return null;
31
+ if (!slug)
32
+ return null;
33
+ return { category: cat, slug };
34
+ }
35
+ /** Estimate total text chars in user + assistant messages. */
36
+ function estimateSessionChars(messages) {
37
+ let total = 0;
38
+ for (const m of messages) {
39
+ if (m.role !== "user" && m.role !== "assistant")
40
+ continue;
41
+ const content = "content" in m ? m.content : undefined;
42
+ if (typeof content === "string") {
43
+ total += content.length;
44
+ continue;
45
+ }
46
+ if (Array.isArray(content)) {
47
+ for (const block of content) {
48
+ if (typeof block === "object" && block !== null && "type" in block && block.type === "text" && "text" in block) {
49
+ total += block.text.length;
50
+ }
51
+ }
52
+ }
53
+ }
54
+ return total;
55
+ }
56
+ /**
57
+ * Extract pages written from agent messages by inspecting tool results.
58
+ *
59
+ * After the standalone agent finishes, its messages contain tool calls and
60
+ * tool results. We inspect wiki_write tool results to find pagesWritten.
61
+ */
62
+ function extractWrittenPages(messages) {
63
+ const pages = [];
64
+ for (const msg of messages) {
65
+ if (typeof msg !== "object" || msg === null || !("role" in msg))
66
+ continue;
67
+ const m = msg;
68
+ // Look for toolResult messages that contain pagesWritten info
69
+ if (m.role === "toolResult") {
70
+ // The content of a wiki_write tool result mentions "Wrote N page(s): path1, path2"
71
+ const content = m.content;
72
+ if (!Array.isArray(content))
73
+ continue;
74
+ for (const block of content) {
75
+ if (typeof block !== "object" || block === null)
76
+ continue;
77
+ const b = block;
78
+ if (b.type === "text" && typeof b.text === "string") {
79
+ const match = b.text.match(/Wrote \d+ page\(s\): (.+)/);
80
+ if (match) {
81
+ const paths = match[1].split(", ").map((p) => p.trim());
82
+ pages.push(...paths);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ return [...new Set(pages)];
89
+ }
90
+ /**
91
+ * Check if the agent's final assistant message indicates nothing was captured.
92
+ */
93
+ function isNothingCaptured(messages) {
94
+ // Walk messages backwards to find the last assistant message
95
+ for (let i = messages.length - 1; i >= 0; i--) {
96
+ const msg = messages[i];
97
+ if (typeof msg !== "object" || msg === null || !("role" in msg))
98
+ continue;
99
+ const m = msg;
100
+ if (m.role !== "assistant")
101
+ continue;
102
+ const content = m.content;
103
+ if (!Array.isArray(content))
104
+ continue;
105
+ for (const block of content) {
106
+ if (typeof block !== "object" || block === null)
107
+ continue;
108
+ const b = block;
109
+ if (b.type === "text" && typeof b.text === "string") {
110
+ if (NOTHING_PATTERN.test(b.text))
111
+ return true;
112
+ }
113
+ }
114
+ break; // only check the last assistant message
115
+ }
116
+ return false;
117
+ }
118
+ /**
119
+ * Build PageRef objects from page paths by reading actual pages from disk.
120
+ * Pages that don't exist on disk get a minimal PageRef.
121
+ */
122
+ async function buildPageRefs(wikiDir, pagePaths) {
123
+ const created = [];
124
+ const updated = [];
125
+ for (const pagePath of pagePaths) {
126
+ const parsed = parsePagePath(pagePath);
127
+ if (!parsed)
128
+ continue;
129
+ const page = await readPage(wikiDir, parsed.category, parsed.slug);
130
+ const ref = {
131
+ category: parsed.category,
132
+ slug: parsed.slug,
133
+ title: page?.frontmatter.title ?? parsed.slug,
134
+ path: `${parsed.category}/${parsed.slug}.md`,
135
+ };
136
+ // If created date == updated date, it's newly created; otherwise updated.
137
+ // In practice, all pages written in capture are "created" from capture's
138
+ // perspective — the wiki_write tool handles create vs update internally.
139
+ // We heuristically check: if the page was created within the last minute,
140
+ // treat it as newly created.
141
+ if (page) {
142
+ const createdTime = new Date(page.frontmatter.created).getTime();
143
+ const updatedTime = new Date(page.frontmatter.updated).getTime();
144
+ // If created and updated are within 2 seconds, it was just created
145
+ if (Math.abs(updatedTime - createdTime) < 2000) {
146
+ created.push(ref);
147
+ }
148
+ else {
149
+ updated.push(ref);
150
+ }
151
+ }
152
+ else {
153
+ // Page was written but we can't read it — treat as created
154
+ created.push(ref);
155
+ }
156
+ }
157
+ return { created, updated };
158
+ }
159
+ /**
160
+ * Run a standalone capture agent with the given prompt and tools.
161
+ * Returns the agent's final messages for analysis.
162
+ */
163
+ async function runCaptureAgent(wikiDir, store, scope, model, modelRegistry, userPrompt, timeoutMs) {
164
+ const tools = createStandaloneTools(wikiDir, store, () => scope);
165
+ const agent = new Agent({
166
+ initialState: {
167
+ systemPrompt: CAPTURE_SYSTEM_PROMPT,
168
+ model,
169
+ tools,
170
+ messages: [],
171
+ },
172
+ getApiKey: (provider) => modelRegistry.getApiKeyForProvider(provider),
173
+ });
174
+ const timeout = timeoutMs ?? DEFAULT_TIMEOUT_MS;
175
+ const abortController = new AbortController();
176
+ const timer = setTimeout(() => abortController.abort(), timeout);
177
+ // Wire abort into agent
178
+ const unsubscribe = agent.subscribe(async (_event, _signal) => {
179
+ if (abortController.signal.aborted) {
180
+ agent.abort();
181
+ }
182
+ });
183
+ try {
184
+ // Prompt the agent — this runs the full tool loop
185
+ await agent.prompt(userPrompt);
186
+ }
187
+ catch {
188
+ // Agent was aborted or encountered an error — non-fatal
189
+ }
190
+ finally {
191
+ clearTimeout(timer);
192
+ unsubscribe();
193
+ }
194
+ return agent.state.messages;
195
+ }
196
+ // -- Public API --------------------------------------------------------------
197
+ /**
198
+ * Called automatically on session_shutdown.
199
+ * Spins up a standalone Agent with wiki tools, aborts after timeoutMs.
200
+ */
201
+ export async function autoCapture(wikiDir, store, messages, scope, sessionFile, model, modelRegistry, timeoutMs, alreadyCaptured) {
202
+ // Short-circuit only truly empty sessions (greetings, single-word exchanges).
203
+ // Even short sessions can contain valuable operational knowledge (deploy keys,
204
+ // server configs, build commands, architecture decisions).
205
+ //
206
+ // We also check for tool usage — if the LLM read files, ran commands, or
207
+ // searched code, the session likely has project-specific knowledge.
208
+ const totalChars = estimateSessionChars(messages);
209
+ const hasToolCalls = messages.some(m => m.role === "assistant" && Array.isArray(m.content) &&
210
+ m.content.some((b) => typeof b === "object" && b !== null && "type" in b && b.type === "toolCall"));
211
+ // Skip only if: very short AND no tool usage
212
+ if (!hasToolCalls && (messages.length < 4 || totalChars < 200)) {
213
+ return {
214
+ pagesCreated: [],
215
+ pagesUpdated: [],
216
+ skipped: true,
217
+ reason: `trivial session (${messages.length} messages, ${totalChars} chars, no tools)`,
218
+ };
219
+ }
220
+ // Serialize recent messages only. For long sessions, the already-captured
221
+ // wiki pages serve as context for earlier work — no need to re-serialize
222
+ // old conversation. The wiki IS the summary.
223
+ const MAX_CAPTURE_CHARS = 60_000; // ~15k tokens for recent messages
224
+ let serialized = serializeSessionForWiki(messages);
225
+ if (!serialized.trim()) {
226
+ return {
227
+ pagesCreated: [],
228
+ pagesUpdated: [],
229
+ skipped: true,
230
+ reason: "empty session",
231
+ };
232
+ }
233
+ // If serialized is too long even after collecting only messages, the session
234
+ // is too massive for auto-capture to handle well. Skip it — rely on
235
+ // mid-session wiki_write and /wiki-capture for knowledge persistence.
236
+ if (serialized.length > MAX_CAPTURE_CHARS) {
237
+ return {
238
+ pagesCreated: [],
239
+ pagesUpdated: [],
240
+ skipped: true,
241
+ reason: `session too large for auto-capture (${Math.round(serialized.length / 1000)}K chars). Use /wiki-capture or wiki_write during the session instead.`,
242
+ };
243
+ }
244
+ // Build context from already-captured wiki pages — these ARE the
245
+ // distilled summary of earlier work, better than raw conversation.
246
+ let priorContext = "";
247
+ if (alreadyCaptured && alreadyCaptured.length > 0) {
248
+ const pageContents = [];
249
+ for (const slug of alreadyCaptured) {
250
+ // Try to find the page in any PARA category
251
+ for (const cat of ["projects", "areas", "resources", "archives"]) {
252
+ const page = await readPage(wikiDir, cat, slug);
253
+ if (page) {
254
+ pageContents.push(`### [[${slug}]] (${cat})\n${page.body.slice(0, 2000)}`);
255
+ break;
256
+ }
257
+ }
258
+ }
259
+ if (pageContents.length > 0) {
260
+ priorContext = [
261
+ "<already-captured-pages>",
262
+ "These wiki pages were already captured from earlier in this session.",
263
+ "Focus on NEW knowledge not yet in these pages. Update existing pages if there is significant new information.",
264
+ "",
265
+ ...pageContents,
266
+ "</already-captured-pages>",
267
+ ].join("\n");
268
+ }
269
+ }
270
+ // Build the capture prompt
271
+ const userPrompt = generateSummary(serialized, {
272
+ mode: "session",
273
+ scope,
274
+ });
275
+ const fullPrompt = [
276
+ userPrompt,
277
+ priorContext,
278
+ "",
279
+ `Session file: ${sessionFile}`,
280
+ `Project scope: ${scope.name}`,
281
+ ].join("\n");
282
+ const agentMessages = await runCaptureAgent(wikiDir, store, scope, model, modelRegistry, fullPrompt, timeoutMs);
283
+ // Analyze what the agent did
284
+ if (isNothingCaptured(agentMessages)) {
285
+ return {
286
+ pagesCreated: [],
287
+ pagesUpdated: [],
288
+ skipped: true,
289
+ reason: "trivial session",
290
+ };
291
+ }
292
+ const writtenPaths = extractWrittenPages(agentMessages);
293
+ if (writtenPaths.length === 0) {
294
+ return {
295
+ pagesCreated: [],
296
+ pagesUpdated: [],
297
+ skipped: true,
298
+ reason: "no pages written",
299
+ };
300
+ }
301
+ const { created, updated } = await buildPageRefs(wikiDir, writtenPaths);
302
+ const allPageSlugs = writtenPaths.map((p) => p.split("/").pop() ?? p);
303
+ // Build a summary from the last assistant message text
304
+ const summary = extractAssistantSummary(agentMessages);
305
+ // Append session digest
306
+ const digestEntry = {
307
+ date: new Date().toISOString().split("T")[0],
308
+ project: scope.name,
309
+ sessionFile,
310
+ scope: scope.name,
311
+ capturedPages: allPageSlugs,
312
+ summary: summary || `Captured ${writtenPaths.length} page(s) from session.`,
313
+ };
314
+ await appendSessionDigest(wikiDir, digestEntry);
315
+ return {
316
+ pagesCreated: created,
317
+ pagesUpdated: updated,
318
+ skipped: false,
319
+ digestEntry,
320
+ };
321
+ }
322
+ /**
323
+ * Called when user explicitly requests capture mid-session via /wiki-capture.
324
+ * Spins up a standalone Agent with wiki tools.
325
+ */
326
+ export async function explicitCapture(wikiDir, store, topic, messages, scope, sessionFile, model, modelRegistry, alreadyCaptured) {
327
+ const MAX_EXPLICIT_CHARS = 60_000;
328
+ let serialized = serializeSessionForWiki(messages);
329
+ if (!serialized.trim()) {
330
+ return {
331
+ pagesCreated: [],
332
+ pagesUpdated: [],
333
+ skipped: true,
334
+ reason: "empty session",
335
+ };
336
+ }
337
+ // For large sessions, keep only the recent tail
338
+ if (serialized.length > MAX_EXPLICIT_CHARS) {
339
+ serialized = "[... earlier conversation omitted ...]\n\n"
340
+ + serialized.slice(-MAX_EXPLICIT_CHARS);
341
+ }
342
+ // Build context from already-captured wiki pages
343
+ let priorContext = "";
344
+ if (alreadyCaptured && alreadyCaptured.length > 0) {
345
+ const pageContents = [];
346
+ for (const slug of alreadyCaptured) {
347
+ for (const cat of ["projects", "areas", "resources", "archives"]) {
348
+ const page = await readPage(wikiDir, cat, slug);
349
+ if (page) {
350
+ pageContents.push(`### [[${slug}]] (${cat})\n${page.body.slice(0, 2000)}`);
351
+ break;
352
+ }
353
+ }
354
+ }
355
+ if (pageContents.length > 0) {
356
+ priorContext = [
357
+ "<already-captured-pages>",
358
+ "These pages were already captured. Focus on NEW knowledge.",
359
+ "",
360
+ ...pageContents,
361
+ "</already-captured-pages>",
362
+ "",
363
+ ].join("\n");
364
+ }
365
+ }
366
+ // Build the explicit capture prompt
367
+ const topicInstruction = topic
368
+ ? `\n\nFocus on capturing knowledge about: ${topic}`
369
+ : "\n\nIdentify and capture any valuable knowledge from this session.";
370
+ const userPrompt = [
371
+ EXPLICIT_CAPTURE_PROMPT,
372
+ topicInstruction,
373
+ priorContext,
374
+ "",
375
+ `Session file: ${sessionFile}`,
376
+ `Project scope: ${scope.name}`,
377
+ "",
378
+ "<session-conversation>",
379
+ serialized,
380
+ "</session-conversation>",
381
+ ].join("\n");
382
+ const agentMessages = await runCaptureAgent(wikiDir, store, scope, model, modelRegistry, userPrompt,
383
+ // Explicit capture gets a generous timeout (60s)
384
+ 60_000);
385
+ // Analyze what the agent did
386
+ if (isNothingCaptured(agentMessages)) {
387
+ return {
388
+ pagesCreated: [],
389
+ pagesUpdated: [],
390
+ skipped: true,
391
+ reason: "trivial session",
392
+ };
393
+ }
394
+ const writtenPaths = extractWrittenPages(agentMessages);
395
+ if (writtenPaths.length === 0) {
396
+ return {
397
+ pagesCreated: [],
398
+ pagesUpdated: [],
399
+ skipped: true,
400
+ reason: "no pages written",
401
+ };
402
+ }
403
+ const { created, updated } = await buildPageRefs(wikiDir, writtenPaths);
404
+ const allPageSlugs = writtenPaths.map((p) => p.split("/").pop() ?? p);
405
+ const summary = extractAssistantSummary(agentMessages);
406
+ // Append session digest
407
+ const digestEntry = {
408
+ date: new Date().toISOString().split("T")[0],
409
+ project: scope.name,
410
+ sessionFile,
411
+ scope: scope.name,
412
+ capturedPages: allPageSlugs,
413
+ summary: summary || `Captured ${writtenPaths.length} page(s) from session.`,
414
+ };
415
+ await appendSessionDigest(wikiDir, digestEntry);
416
+ return {
417
+ pagesCreated: created,
418
+ pagesUpdated: updated,
419
+ skipped: false,
420
+ digestEntry,
421
+ };
422
+ }
423
+ // -- Internal helpers --------------------------------------------------------
424
+ /**
425
+ * Extract a summary string from the agent's last assistant message.
426
+ * Used for the session digest summary field.
427
+ */
428
+ function extractAssistantSummary(messages) {
429
+ // Walk backwards to find the last assistant text
430
+ for (let i = messages.length - 1; i >= 0; i--) {
431
+ const msg = messages[i];
432
+ if (typeof msg !== "object" || msg === null || !("role" in msg))
433
+ continue;
434
+ const m = msg;
435
+ if (m.role !== "assistant")
436
+ continue;
437
+ const content = m.content;
438
+ if (!Array.isArray(content))
439
+ continue;
440
+ const texts = [];
441
+ for (const block of content) {
442
+ if (typeof block !== "object" || block === null)
443
+ continue;
444
+ const b = block;
445
+ if (b.type === "text" && typeof b.text === "string") {
446
+ texts.push(b.text);
447
+ }
448
+ }
449
+ if (texts.length > 0) {
450
+ const full = texts.join(" ").trim();
451
+ // Truncate to a reasonable summary length
452
+ if (full.length > 300) {
453
+ return full.slice(0, 297) + "...";
454
+ }
455
+ return full;
456
+ }
457
+ break;
458
+ }
459
+ return "";
460
+ }
461
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const LEGACY_DAEMON_COMMANDS: Set<string>;
2
+ export declare function isLegacyDaemonCommand(command: string | undefined): boolean;
3
+ export declare function formatLegacyDaemonWarning(command: string): string;
4
+ //# sourceMappingURL=cli-legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-legacy.d.ts","sourceRoot":"","sources":["../src/cli-legacy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,aAQjC,CAAC;AAEH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOjE"}
@@ -0,0 +1,41 @@
1
+ export const LEGACY_DAEMON_COMMANDS = new Set([
2
+ "start",
3
+ "stop",
4
+ "legacy-status",
5
+ "process",
6
+ "process-recent",
7
+ "retry-failed",
8
+ "history",
9
+ ]);
10
+ export function isLegacyDaemonCommand(command) {
11
+ return command !== undefined && LEGACY_DAEMON_COMMANDS.has(command);
12
+ }
13
+ export function formatLegacyDaemonWarning(command) {
14
+ const replacement = replacementForLegacyCommand(command);
15
+ return [
16
+ `[pi-para] Warning: '${command}' is a deprecated legacy daemon command.`,
17
+ "pi-para now uses an in-process scheduler while Pi is open; no system daemon is required.",
18
+ replacement ? `Use ${replacement} for the current workflow.` : "Use 'pi-para tasks' or '/wiki-scheduler status' for the current workflow.",
19
+ ].join("\n");
20
+ }
21
+ function replacementForLegacyCommand(command) {
22
+ switch (command) {
23
+ case "start":
24
+ return "'pi-para setup' and restart Pi";
25
+ case "stop":
26
+ return "'/wiki-scheduler status' or close/restart Pi sessions";
27
+ case "legacy-status":
28
+ return "'pi-para tasks' or '/wiki-scheduler status'";
29
+ case "process":
30
+ return "'pi-para capture-recent --hours N' or '/wiki-capture'";
31
+ case "process-recent":
32
+ return "'pi-para capture-recent --hours N'";
33
+ case "retry-failed":
34
+ return "'pi-para tasks retry'";
35
+ case "history":
36
+ return "'pi-para tasks history'";
37
+ default:
38
+ return null;
39
+ }
40
+ }
41
+ //# sourceMappingURL=cli-legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-legacy.js","sourceRoot":"","sources":["../src/cli-legacy.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,OAAO;IACP,MAAM;IACN,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,cAAc;IACd,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,OAA2B;IAC/D,OAAO,OAAO,KAAK,SAAS,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,MAAM,WAAW,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO;QACL,uBAAuB,OAAO,0CAA0C;QACxE,0FAA0F;QAC1F,WAAW,CAAC,CAAC,CAAC,OAAO,WAAW,4BAA4B,CAAC,CAAC,CAAC,2EAA2E;KAC3I,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,gCAAgC,CAAC;QAC1C,KAAK,MAAM;YACT,OAAO,uDAAuD,CAAC;QACjE,KAAK,eAAe;YAClB,OAAO,6CAA6C,CAAC;QACvD,KAAK,SAAS;YACZ,OAAO,uDAAuD,CAAC;QACjE,KAAK,gBAAgB;YACnB,OAAO,oCAAoC,CAAC;QAC9C,KAAK,cAAc;YACjB,OAAO,uBAAuB,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,yBAAyB,CAAC;QACnC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for pi-para.
4
+ *
5
+ * The old pi-para-daemon commands remain as deprecated compatibility aliases.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG"}