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.
- package/ARCHITECTURE.md +0 -9
- package/CHANGELOG.md +22 -0
- package/CONFIGURATION.md +5 -23
- package/README.md +7 -31
- package/SETUP.md +5 -3
- package/STRUCTURE.md +0 -9
- package/dist/atomic-write.d.ts +2 -0
- package/dist/atomic-write.d.ts.map +1 -0
- package/dist/atomic-write.js +18 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/capture.d.ts +34 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +461 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli-legacy.d.ts +4 -0
- package/dist/cli-legacy.d.ts.map +1 -0
- package/dist/cli-legacy.js +41 -0
- package/dist/cli-legacy.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +15 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +791 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +94 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +228 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +63 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +311 -0
- package/dist/context.js.map +1 -0
- package/dist/credentials.d.ts +27 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +85 -0
- package/dist/credentials.js.map +1 -0
- package/dist/daemon.d.ts +49 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +226 -0
- package/dist/daemon.js.map +1 -0
- package/dist/doctor.d.ts +20 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +197 -0
- package/dist/doctor.js.map +1 -0
- package/dist/frontmatter.d.ts +59 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +170 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +357 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +88 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +105 -0
- package/dist/ingest.js.map +1 -0
- package/dist/link-discovery.d.ts +40 -0
- package/dist/link-discovery.d.ts.map +1 -0
- package/dist/link-discovery.js +122 -0
- package/dist/link-discovery.js.map +1 -0
- package/dist/link-utils.d.ts +30 -0
- package/dist/link-utils.d.ts.map +1 -0
- package/dist/link-utils.js +145 -0
- package/dist/link-utils.js.map +1 -0
- package/dist/lint.d.ts +39 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +827 -0
- package/dist/lint.js.map +1 -0
- package/dist/maintainer.d.ts +24 -0
- package/dist/maintainer.d.ts.map +1 -0
- package/dist/maintainer.js +358 -0
- package/dist/maintainer.js.map +1 -0
- package/dist/model-resolver.d.ts +30 -0
- package/dist/model-resolver.d.ts.map +1 -0
- package/dist/model-resolver.js +71 -0
- package/dist/model-resolver.js.map +1 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +33 -0
- package/dist/paths.js.map +1 -0
- package/dist/processor.d.ts +14 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +361 -0
- package/dist/processor.js.map +1 -0
- package/dist/qmd-providers.d.ts +12 -0
- package/dist/qmd-providers.d.ts.map +1 -0
- package/dist/qmd-providers.js +45 -0
- package/dist/qmd-providers.js.map +1 -0
- package/dist/query.d.ts +69 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +120 -0
- package/dist/query.js.map +1 -0
- package/dist/raw.d.ts +57 -0
- package/dist/raw.d.ts.map +1 -0
- package/dist/raw.js +219 -0
- package/dist/raw.js.map +1 -0
- package/dist/redact.d.ts +21 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +143 -0
- package/dist/redact.js.map +1 -0
- package/dist/repair.d.ts +11 -0
- package/dist/repair.d.ts.map +1 -0
- package/dist/repair.js +41 -0
- package/dist/repair.js.map +1 -0
- package/dist/scheduler/controls.d.ts +35 -0
- package/dist/scheduler/controls.d.ts.map +1 -0
- package/dist/scheduler/controls.js +98 -0
- package/dist/scheduler/controls.js.map +1 -0
- package/dist/scheduler/index.d.ts +70 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +245 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/leases.d.ts +22 -0
- package/dist/scheduler/leases.d.ts.map +1 -0
- package/dist/scheduler/leases.js +74 -0
- package/dist/scheduler/leases.js.map +1 -0
- package/dist/scheduler/session-capture.d.ts +33 -0
- package/dist/scheduler/session-capture.d.ts.map +1 -0
- package/dist/scheduler/session-capture.js +108 -0
- package/dist/scheduler/session-capture.js.map +1 -0
- package/dist/scheduler/state.d.ts +56 -0
- package/dist/scheduler/state.d.ts.map +1 -0
- package/dist/scheduler/state.js +210 -0
- package/dist/scheduler/state.js.map +1 -0
- package/dist/scope.d.ts +54 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +161 -0
- package/dist/scope.js.map +1 -0
- package/dist/scripts/bulk-link-fix.d.ts +9 -0
- package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
- package/dist/scripts/bulk-link-fix.js +106 -0
- package/dist/scripts/bulk-link-fix.js.map +1 -0
- package/dist/session-tools.d.ts +33 -0
- package/dist/session-tools.d.ts.map +1 -0
- package/dist/session-tools.js +211 -0
- package/dist/session-tools.js.map +1 -0
- package/dist/settings.d.ts +37 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +176 -0
- package/dist/settings.js.map +1 -0
- package/dist/setup.d.ts +29 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +90 -0
- package/dist/setup.js.map +1 -0
- package/dist/state.d.ts +54 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +176 -0
- package/dist/state.js.map +1 -0
- package/dist/status.d.ts +22 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +93 -0
- package/dist/status.js.map +1 -0
- package/dist/store.d.ts +71 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +282 -0
- package/dist/store.js.map +1 -0
- package/dist/summarize.d.ts +60 -0
- package/dist/summarize.d.ts.map +1 -0
- package/dist/summarize.js +266 -0
- package/dist/summarize.js.map +1 -0
- package/dist/tag-registry.d.ts +56 -0
- package/dist/tag-registry.d.ts.map +1 -0
- package/dist/tag-registry.js +146 -0
- package/dist/tag-registry.js.map +1 -0
- package/dist/templates/prompts.d.ts +51 -0
- package/dist/templates/prompts.d.ts.map +1 -0
- package/dist/templates/prompts.js +203 -0
- package/dist/templates/prompts.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1198 -0
- package/dist/tools.js.map +1 -0
- package/dist/watcher.d.ts +25 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +84 -0
- package/dist/watcher.js.map +1 -0
- package/dist/webui/client/dist/index.html +1885 -0
- package/dist/webui/server.d.ts +31 -0
- package/dist/webui/server.d.ts.map +1 -0
- package/dist/webui/server.js +566 -0
- package/dist/webui/server.js.map +1 -0
- package/dist/wiki-tool-guidance.d.ts +6 -0
- package/dist/wiki-tool-guidance.d.ts.map +1 -0
- package/dist/wiki-tool-guidance.js +70 -0
- package/dist/wiki-tool-guidance.js.map +1 -0
- package/dist/wiki.d.ts +108 -0
- package/dist/wiki.d.ts.map +1 -0
- package/dist/wiki.js +497 -0
- package/dist/wiki.js.map +1 -0
- package/package.json +2 -1
- package/scripts/build-assets.mjs +1 -13
- package/skills/setup/SKILL.md +1 -1
- package/src/cli.ts +0 -70
- package/src/commands.ts +78 -3
- package/src/config.ts +0 -25
- package/src/doctor.ts +21 -1
- package/src/index.ts +16 -38
- package/src/scheduler/index.ts +64 -0
- package/src/settings.ts +88 -0
- package/src/setup.ts +1 -1
- package/src/templates/prompts.ts +0 -56
- package/scripts/gepa/dataset.py +0 -192
- package/scripts/gepa/lm_providers.py +0 -472
- package/scripts/gepa/metric.py +0 -279
- package/scripts/gepa/optimize.py +0 -367
- package/scripts/gepa/program.py +0 -99
- package/scripts/gepa/pyproject.toml +0 -19
- package/scripts/gepa/run-all.sh +0 -53
- package/scripts/gepa/wiki_reader.py +0 -113
- package/src/gepa/index.ts +0 -287
- package/src/gepa/optimized/capture-prompt.txt +0 -65
package/dist/capture.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|