pi-para 0.6.0 → 0.6.1
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 +13 -0
- package/CONFIGURATION.md +0 -23
- package/README.md +1 -29
- package/SETUP.md +1 -1
- 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 +719 -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 +176 -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 +342 -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 +48 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +193 -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 +19 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +106 -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/config.ts +0 -25
- package/src/index.ts +1 -38
- 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/context.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session context injection — injects relevant wiki knowledge into every agent turn.
|
|
3
|
+
*
|
|
4
|
+
* Builds a context string from schema.md, index.md, and scope-filtered page
|
|
5
|
+
* summaries, injected via the before_agent_start hook.
|
|
6
|
+
*
|
|
7
|
+
* Uses a dirty-flag caching strategy: the context string is rebuilt only when
|
|
8
|
+
* wiki_write or wiki_move modifies the wiki (or on session start). Cached
|
|
9
|
+
* context is returned on subsequent before_agent_start calls, adding <5ms.
|
|
10
|
+
*/
|
|
11
|
+
import { readIndex, readSchema, listPages, readPage } from "./wiki.js";
|
|
12
|
+
import { matchesScope } from "./scope.js";
|
|
13
|
+
import { formatFreshness } from "./query.js";
|
|
14
|
+
import { buildWikiToolGuidanceSection } from "./wiki-tool-guidance.js";
|
|
15
|
+
// -- Constants ---------------------------------------------------------------
|
|
16
|
+
const DEFAULT_MAX_TOKENS = 4000;
|
|
17
|
+
const CHARS_PER_TOKEN = 4;
|
|
18
|
+
/** Maximum number of pages to include in context injection. */
|
|
19
|
+
export const MAX_CONTEXT_PAGES = 40;
|
|
20
|
+
// -- Schema summary ----------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* A compact conventions summary extracted from schema.md, much smaller than
|
|
23
|
+
* the full schema. Used to give the LLM essential rules without blowing the
|
|
24
|
+
* token budget.
|
|
25
|
+
*/
|
|
26
|
+
function buildSchemaSummary(fullSchema) {
|
|
27
|
+
// If the schema is small enough, include it verbatim
|
|
28
|
+
if (fullSchema.length / CHARS_PER_TOKEN < 500) {
|
|
29
|
+
return fullSchema;
|
|
30
|
+
}
|
|
31
|
+
// Otherwise return a compact summary of key conventions
|
|
32
|
+
return [
|
|
33
|
+
"## Wiki Conventions (summary)",
|
|
34
|
+
"",
|
|
35
|
+
"- Pages: markdown + YAML frontmatter (title, para, scope, tags, sources, created, updated, links)",
|
|
36
|
+
"- PARA categories: **resources/** for almost everything (architecture docs, how-tos, patterns, debugging). **areas/** for ongoing responsibilities. **projects/** ONLY for actual goals with end dates. **archives/** for completed items.",
|
|
37
|
+
"- Scope: must be a kebab-case project name (e.g. `pi-para`, `qmd`). NOT topic descriptions.",
|
|
38
|
+
"- Tags: kebab-case, no spaces. Don't duplicate scope values as tags.",
|
|
39
|
+
"- Slugs: lowercase, hyphens (e.g. ssl-cert-gotchas)",
|
|
40
|
+
"- Cross-references: use [[slug]] wikilinks. Add a ## Connections section linking related pages.",
|
|
41
|
+
"- Wiki summary format sections: Topic, Key Facts, Insights, Connections, Open Questions, Sources",
|
|
42
|
+
"- Update existing pages for same concept, create new pages for distinct concepts",
|
|
43
|
+
"- Tone: technical, concise, factual",
|
|
44
|
+
].join("\n");
|
|
45
|
+
}
|
|
46
|
+
// -- Public API --------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Build a context string from wiki state for injection into the system prompt.
|
|
49
|
+
*
|
|
50
|
+
* Strategy:
|
|
51
|
+
* 1. Always include schema conventions summary + index.md
|
|
52
|
+
* 2. Conditionally include first paragraph / summary of pages matching scope
|
|
53
|
+
* 3. If budget exceeded, fall back to index + page titles only
|
|
54
|
+
*/
|
|
55
|
+
export async function buildContext(wikiDir, _store, scope, options, stateDb) {
|
|
56
|
+
const maxTokens = options?.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
57
|
+
const includeSchema = options?.includeSchema ?? true;
|
|
58
|
+
const includeIndex = options?.includeIndex ?? true;
|
|
59
|
+
const includeSummaries = options?.includeSummaries ?? true;
|
|
60
|
+
const maxChars = maxTokens * CHARS_PER_TOKEN;
|
|
61
|
+
const parts = [];
|
|
62
|
+
let usedChars = 0;
|
|
63
|
+
// Header
|
|
64
|
+
const header = `<wiki-context scope="${scope.name}">`;
|
|
65
|
+
const footer = "</wiki-context>";
|
|
66
|
+
usedChars += header.length + footer.length + 2; // +2 for newlines
|
|
67
|
+
// 1. Schema conventions summary
|
|
68
|
+
if (includeSchema) {
|
|
69
|
+
let schemaContent;
|
|
70
|
+
try {
|
|
71
|
+
schemaContent = await readSchema(wikiDir);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
schemaContent = "";
|
|
75
|
+
}
|
|
76
|
+
if (schemaContent) {
|
|
77
|
+
const summary = buildSchemaSummary(schemaContent);
|
|
78
|
+
if (usedChars + summary.length + 2 <= maxChars) {
|
|
79
|
+
parts.push(summary);
|
|
80
|
+
usedChars += summary.length + 2;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// 2. Index.md
|
|
85
|
+
let indexContent = "";
|
|
86
|
+
if (includeIndex) {
|
|
87
|
+
try {
|
|
88
|
+
indexContent = await readIndex(wikiDir);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
indexContent = "";
|
|
92
|
+
}
|
|
93
|
+
if (indexContent) {
|
|
94
|
+
if (usedChars + indexContent.length + 2 <= maxChars) {
|
|
95
|
+
parts.push(indexContent);
|
|
96
|
+
usedChars += indexContent.length + 2;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Truncate index to fit
|
|
100
|
+
const available = maxChars - usedChars - 2;
|
|
101
|
+
if (available > 100) {
|
|
102
|
+
parts.push(indexContent.slice(0, available) + "\n...(truncated)");
|
|
103
|
+
usedChars = maxChars;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 3. Scope-filtered page summaries
|
|
109
|
+
if (includeSummaries && usedChars < maxChars) {
|
|
110
|
+
// Use stateDb cache if available, otherwise fall back to disk reads
|
|
111
|
+
const scopeEntries = stateDb
|
|
112
|
+
? await buildScopeEntriesFromCache(stateDb, scope)
|
|
113
|
+
: await buildScopeEntriesFromDisk(wikiDir, scope);
|
|
114
|
+
// Sort by updated date descending (most recent first)
|
|
115
|
+
scopeEntries.sort((a, b) => {
|
|
116
|
+
const dateA = new Date(a.updatedAt).getTime() || 0;
|
|
117
|
+
const dateB = new Date(b.updatedAt).getTime() || 0;
|
|
118
|
+
return dateB - dateA;
|
|
119
|
+
});
|
|
120
|
+
const totalScopePages = scopeEntries.length;
|
|
121
|
+
// Tier: only include top MAX_CONTEXT_PAGES
|
|
122
|
+
const tieredEntries = scopeEntries.slice(0, MAX_CONTEXT_PAGES);
|
|
123
|
+
const remaining = totalScopePages - tieredEntries.length;
|
|
124
|
+
const summaryParts = [];
|
|
125
|
+
const titleFallbacks = [];
|
|
126
|
+
for (const entry of tieredEntries) {
|
|
127
|
+
const summaryLine = `- **[[${entry.slug}]]** (${entry.category}): ${entry.firstParagraph}`;
|
|
128
|
+
const titleLine = `- [[${entry.slug}]] (${entry.category})`;
|
|
129
|
+
titleFallbacks.push(titleLine);
|
|
130
|
+
if (usedChars + summaryLine.length + 2 <= maxChars) {
|
|
131
|
+
summaryParts.push(summaryLine);
|
|
132
|
+
usedChars += summaryLine.length + 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (summaryParts.length > 0) {
|
|
136
|
+
let summaryBlock = "## Relevant Pages\n\n" + summaryParts.join("\n");
|
|
137
|
+
if (remaining > 0) {
|
|
138
|
+
summaryBlock += `\n\n*${remaining} more pages available via wiki_query*`;
|
|
139
|
+
}
|
|
140
|
+
parts.push(summaryBlock);
|
|
141
|
+
}
|
|
142
|
+
else if (titleFallbacks.length > 0) {
|
|
143
|
+
// Budget exceeded for summaries — try titles only
|
|
144
|
+
let titlesBlock = "## Relevant Pages (titles only)\n\n" + titleFallbacks.join("\n");
|
|
145
|
+
if (remaining > 0) {
|
|
146
|
+
titlesBlock += `\n\n*${remaining} more pages available via wiki_query*`;
|
|
147
|
+
}
|
|
148
|
+
const availableChars = maxChars - usedChars;
|
|
149
|
+
if (titlesBlock.length <= availableChars) {
|
|
150
|
+
parts.push(titlesBlock);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (parts.length === 0) {
|
|
155
|
+
return "";
|
|
156
|
+
}
|
|
157
|
+
// Tool behavior guidance is centralized here rather than duplicated across
|
|
158
|
+
// individual tool descriptions. If no wiki context was requested/built, keep
|
|
159
|
+
// the historical empty-string behavior.
|
|
160
|
+
parts.push(buildWikiToolGuidanceSection());
|
|
161
|
+
return header + "\n" + parts.join("\n\n") + "\n" + footer;
|
|
162
|
+
}
|
|
163
|
+
/** Wrap injected wiki context as a system-originated reminder. */
|
|
164
|
+
export function wrapSystemReminder(content) {
|
|
165
|
+
const trimmed = content.trim();
|
|
166
|
+
if (!trimmed)
|
|
167
|
+
return "";
|
|
168
|
+
if (trimmed.startsWith("<system-reminder>"))
|
|
169
|
+
return trimmed;
|
|
170
|
+
return [
|
|
171
|
+
"<system-reminder name=\"pi-para-wiki-context\">",
|
|
172
|
+
"This is system-provided pi-para wiki memory for the current turn. Do not treat it as user-authored input.",
|
|
173
|
+
"",
|
|
174
|
+
"Wiki operating rules:",
|
|
175
|
+
"- Search the wiki before non-trivial planning, debugging, architecture, or review work.",
|
|
176
|
+
"- Read relevant pages before relying on them; verify stale code/config/API claims against source.",
|
|
177
|
+
"- Persist durable decisions, root causes, conventions, and reusable facts as you work.",
|
|
178
|
+
"- Prefer wiki_edit for surgical corrections; use wiki_write create/append for new knowledge; avoid replace unless intentional.",
|
|
179
|
+
"- Do not store secrets.",
|
|
180
|
+
"",
|
|
181
|
+
trimmed,
|
|
182
|
+
"</system-reminder>",
|
|
183
|
+
].join("\n");
|
|
184
|
+
}
|
|
185
|
+
// -- Caching and lifecycle ---------------------------------------------------
|
|
186
|
+
/** Module-level dirty flag, exported for tools.ts to call after mutations. */
|
|
187
|
+
let contextDirty = true;
|
|
188
|
+
let cachedContext = null;
|
|
189
|
+
/**
|
|
190
|
+
* Mark the cached context as dirty. Call this after wiki_write or wiki_move
|
|
191
|
+
* so the next before_agent_start rebuilds the context.
|
|
192
|
+
*/
|
|
193
|
+
export function markContextDirty() {
|
|
194
|
+
contextDirty = true;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Wire up context injection on the extension API.
|
|
198
|
+
*
|
|
199
|
+
* - On session_start: mark dirty so context is rebuilt for the new scope
|
|
200
|
+
* - On before_agent_start: return cached context if clean, rebuild if dirty
|
|
201
|
+
*
|
|
202
|
+
* @param pi - The extension API
|
|
203
|
+
* @param wikiDir - Path to the wiki directory
|
|
204
|
+
* @param store - qmd store instance (or getter returning one)
|
|
205
|
+
* @param getScope - Returns the current ProjectScope
|
|
206
|
+
* @param getConfig - Returns the current config values for context
|
|
207
|
+
*/
|
|
208
|
+
export function setupContextInjection(pi, wikiDir, store, getScope, getConfig) {
|
|
209
|
+
// Reset cache state for a fresh setup
|
|
210
|
+
contextDirty = true;
|
|
211
|
+
cachedContext = null;
|
|
212
|
+
pi.on("session_start", async () => {
|
|
213
|
+
contextDirty = true;
|
|
214
|
+
cachedContext = null;
|
|
215
|
+
});
|
|
216
|
+
pi.on("before_agent_start", async (event, _ctx) => {
|
|
217
|
+
const scope = getScope();
|
|
218
|
+
if (!scope)
|
|
219
|
+
return;
|
|
220
|
+
if (!contextDirty && cachedContext !== null) {
|
|
221
|
+
// Return cached context
|
|
222
|
+
if (cachedContext) {
|
|
223
|
+
return {
|
|
224
|
+
systemPrompt: event.systemPrompt + "\n\n" + wrapSystemReminder(cachedContext),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// Rebuild context
|
|
230
|
+
const config = getConfig();
|
|
231
|
+
const options = {
|
|
232
|
+
maxTokens: config.contextMaxTokens ?? DEFAULT_MAX_TOKENS,
|
|
233
|
+
includeSchema: config.contextIncludeSchema ?? true,
|
|
234
|
+
includeIndex: true,
|
|
235
|
+
};
|
|
236
|
+
try {
|
|
237
|
+
cachedContext = await buildContext(wikiDir, store, scope, options);
|
|
238
|
+
contextDirty = false;
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// On error, clear cache and don't inject anything
|
|
242
|
+
cachedContext = null;
|
|
243
|
+
contextDirty = false;
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (cachedContext) {
|
|
247
|
+
return {
|
|
248
|
+
systemPrompt: event.systemPrompt + "\n\n" + wrapSystemReminder(cachedContext),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/** Build scope entries from the StateDB page summary cache. */
|
|
254
|
+
async function buildScopeEntriesFromCache(stateDb, scope) {
|
|
255
|
+
const summaries = stateDb.getPageSummaries(scope);
|
|
256
|
+
return summaries.map((s) => ({
|
|
257
|
+
slug: s.slug,
|
|
258
|
+
category: s.category,
|
|
259
|
+
firstParagraph: s.firstParagraph || "(no summary)",
|
|
260
|
+
updatedAt: s.updatedAt,
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
/** Build scope entries by reading all pages from disk. */
|
|
264
|
+
async function buildScopeEntriesFromDisk(wikiDir, scope) {
|
|
265
|
+
const pages = await listPages(wikiDir);
|
|
266
|
+
const entries = [];
|
|
267
|
+
for (const ref of pages) {
|
|
268
|
+
const page = await readPage(wikiDir, ref.category, ref.slug);
|
|
269
|
+
if (!page)
|
|
270
|
+
continue;
|
|
271
|
+
if (!matchesScope(page.frontmatter.scope, scope))
|
|
272
|
+
continue;
|
|
273
|
+
entries.push({
|
|
274
|
+
slug: ref.slug,
|
|
275
|
+
category: ref.category,
|
|
276
|
+
firstParagraph: extractFirstParagraph(page.body),
|
|
277
|
+
updatedAt: page.frontmatter.updated,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return entries;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Extract the first non-empty paragraph from a markdown body.
|
|
284
|
+
* Skips headings and blank lines. Returns a single line.
|
|
285
|
+
*/
|
|
286
|
+
export function extractFirstParagraph(body) {
|
|
287
|
+
const lines = body.split("\n");
|
|
288
|
+
const paragraphLines = [];
|
|
289
|
+
let inParagraph = false;
|
|
290
|
+
for (const line of lines) {
|
|
291
|
+
const trimmed = line.trim();
|
|
292
|
+
// Skip headings and empty lines before paragraph starts
|
|
293
|
+
if (!inParagraph) {
|
|
294
|
+
if (trimmed === "" || trimmed.startsWith("#"))
|
|
295
|
+
continue;
|
|
296
|
+
inParagraph = true;
|
|
297
|
+
}
|
|
298
|
+
// End paragraph on blank line or heading
|
|
299
|
+
if (inParagraph && (trimmed === "" || trimmed.startsWith("#"))) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
paragraphLines.push(trimmed);
|
|
303
|
+
}
|
|
304
|
+
const result = paragraphLines.join(" ");
|
|
305
|
+
// Truncate long paragraphs
|
|
306
|
+
if (result.length > 200) {
|
|
307
|
+
return result.slice(0, 197) + "...";
|
|
308
|
+
}
|
|
309
|
+
return result || "(no summary)";
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type CredentialRef = `pi-auth:${string}` | `secret:${string}` | "none";
|
|
2
|
+
export interface SecretStoreData {
|
|
3
|
+
version: 1;
|
|
4
|
+
secrets: Record<string, string>;
|
|
5
|
+
}
|
|
6
|
+
export interface CredentialResolution {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
source: "pi-auth" | "secret" | "none" | "missing";
|
|
9
|
+
value?: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseCredentialRef(ref: string): {
|
|
13
|
+
kind: "pi-auth" | "secret" | "none";
|
|
14
|
+
name: string | null;
|
|
15
|
+
};
|
|
16
|
+
export declare function readSecretStore(path?: string): Promise<SecretStoreData>;
|
|
17
|
+
export declare function writeSecretStore(data: SecretStoreData, path?: string): Promise<void>;
|
|
18
|
+
export declare function setSecret(name: string, value: string, path?: string): Promise<void>;
|
|
19
|
+
export declare function removeSecret(name: string, path?: string): Promise<void>;
|
|
20
|
+
export declare function resolveCredentialRef(ref: CredentialRef, opts?: {
|
|
21
|
+
secretsPath?: string;
|
|
22
|
+
authStorage?: {
|
|
23
|
+
getApiKey(provider: string): Promise<string | undefined>;
|
|
24
|
+
};
|
|
25
|
+
}): Promise<CredentialResolution>;
|
|
26
|
+
export declare function redactCredential(value: string | undefined): string;
|
|
27
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,WAAW,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAS5G;AAED,wBAAsB,eAAe,CAAC,IAAI,SAA6B,GAAG,OAAO,CAAC,eAAe,CAAC,CAKjG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,SAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9G;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7G;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,aAAa,EAClB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;KAAE,CAAA;CAAO,GAC9G,OAAO,CAAC,oBAAoB,CAAC,CAkB/B;AAYD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIlE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { existsSync, chmodSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { atomicWriteFile } from "./atomic-write.js";
|
|
5
|
+
import { getParaPaths } from "./paths.js";
|
|
6
|
+
export function parseCredentialRef(ref) {
|
|
7
|
+
if (ref === "none")
|
|
8
|
+
return { kind: "none", name: null };
|
|
9
|
+
if (ref.startsWith("pi-auth:") && ref.length > "pi-auth:".length) {
|
|
10
|
+
return { kind: "pi-auth", name: ref.slice("pi-auth:".length) };
|
|
11
|
+
}
|
|
12
|
+
if (ref.startsWith("secret:") && ref.length > "secret:".length) {
|
|
13
|
+
return { kind: "secret", name: ref.slice("secret:".length) };
|
|
14
|
+
}
|
|
15
|
+
throw new Error(`Unsupported credentialRef: ${ref}. Use pi-auth:<provider>, secret:<name>, or none.`);
|
|
16
|
+
}
|
|
17
|
+
export async function readSecretStore(path = getParaPaths().secretsPath) {
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
return { version: 1, secrets: {} };
|
|
20
|
+
const raw = await readFile(path, "utf-8");
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
return { version: 1, secrets: parsed.secrets ?? {} };
|
|
23
|
+
}
|
|
24
|
+
export async function writeSecretStore(data, path = getParaPaths().secretsPath) {
|
|
25
|
+
await mkdir(dirname(path), { recursive: true });
|
|
26
|
+
await atomicWriteFile(path, `${JSON.stringify({ version: 1, secrets: data.secrets }, null, 2)}\n`, 0o600);
|
|
27
|
+
try {
|
|
28
|
+
chmodSync(path, 0o600);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// chmod can fail on non-POSIX filesystems; doctor reports permission issues.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function setSecret(name, value, path = getParaPaths().secretsPath) {
|
|
35
|
+
if (!name.trim())
|
|
36
|
+
throw new Error("Secret name is required.");
|
|
37
|
+
if (!value)
|
|
38
|
+
throw new Error("Secret value is required.");
|
|
39
|
+
const data = await readSecretStore(path);
|
|
40
|
+
data.secrets[name] = value;
|
|
41
|
+
await writeSecretStore(data, path);
|
|
42
|
+
}
|
|
43
|
+
export async function removeSecret(name, path = getParaPaths().secretsPath) {
|
|
44
|
+
const data = await readSecretStore(path);
|
|
45
|
+
delete data.secrets[name];
|
|
46
|
+
await writeSecretStore(data, path);
|
|
47
|
+
}
|
|
48
|
+
export async function resolveCredentialRef(ref, opts = {}) {
|
|
49
|
+
const parsed = parseCredentialRef(ref);
|
|
50
|
+
if (parsed.kind === "none")
|
|
51
|
+
return { ok: true, source: "none" };
|
|
52
|
+
if (parsed.kind === "secret") {
|
|
53
|
+
const data = await readSecretStore(opts.secretsPath);
|
|
54
|
+
const value = data.secrets[parsed.name ?? ""];
|
|
55
|
+
if (!value)
|
|
56
|
+
return { ok: false, source: "missing", error: `Secret not found: ${parsed.name}` };
|
|
57
|
+
return { ok: true, source: "secret", value };
|
|
58
|
+
}
|
|
59
|
+
const authStorage = opts.authStorage ?? await createPiAuthStorage();
|
|
60
|
+
if (!authStorage) {
|
|
61
|
+
return { ok: false, source: "missing", error: "Pi AuthStorage is unavailable." };
|
|
62
|
+
}
|
|
63
|
+
const value = await authStorage.getApiKey(parsed.name ?? "");
|
|
64
|
+
if (!value)
|
|
65
|
+
return { ok: false, source: "missing", error: `Pi auth not configured for provider: ${parsed.name}` };
|
|
66
|
+
return { ok: true, source: "pi-auth", value };
|
|
67
|
+
}
|
|
68
|
+
async function createPiAuthStorage() {
|
|
69
|
+
try {
|
|
70
|
+
const mod = await import("@earendil-works/pi-coding-agent");
|
|
71
|
+
const AuthStorage = mod.AuthStorage;
|
|
72
|
+
return AuthStorage?.create() ?? null;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function redactCredential(value) {
|
|
79
|
+
if (!value)
|
|
80
|
+
return "not set";
|
|
81
|
+
if (value.length <= 8)
|
|
82
|
+
return "********";
|
|
83
|
+
return `${value.slice(0, 4)}…${value.slice(-4)}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main daemon loop — watches for completed sessions and processes them.
|
|
3
|
+
*/
|
|
4
|
+
import type { Model } from "@earendil-works/pi-ai";
|
|
5
|
+
import type { WebWikiConfig } from "./webui/server.js";
|
|
6
|
+
export interface DaemonConfig {
|
|
7
|
+
wikiDir: string;
|
|
8
|
+
model: Model<any>;
|
|
9
|
+
getApiKey: (provider: string) => Promise<string | undefined>;
|
|
10
|
+
pollIntervalMs?: number;
|
|
11
|
+
/** How often to run link discovery + lint (ms). Default: 30 minutes */
|
|
12
|
+
maintenanceIntervalMs?: number;
|
|
13
|
+
/** Web wiki server config. If enabled, the daemon hosts the web UI. */
|
|
14
|
+
webWiki?: WebWikiConfig;
|
|
15
|
+
}
|
|
16
|
+
export declare class Daemon {
|
|
17
|
+
private config;
|
|
18
|
+
private state;
|
|
19
|
+
private watcher;
|
|
20
|
+
private store;
|
|
21
|
+
private queue;
|
|
22
|
+
private processing;
|
|
23
|
+
private running;
|
|
24
|
+
private maintenanceTimer;
|
|
25
|
+
private maintenanceRunning;
|
|
26
|
+
private webServer;
|
|
27
|
+
constructor(config: DaemonConfig);
|
|
28
|
+
/** Start the daemon. */
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
/** Stop the daemon. */
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
/** Get the web server URL (if running). */
|
|
33
|
+
getWebUrl(): string | null;
|
|
34
|
+
/** Process a single session file (for CLI `process` command). */
|
|
35
|
+
processOne(sessionPath: string): Promise<void>;
|
|
36
|
+
/** Handle new entries from the registry watcher. */
|
|
37
|
+
private onNewEntries;
|
|
38
|
+
/** Process queued sessions sequentially. */
|
|
39
|
+
private processQueue;
|
|
40
|
+
/** Run periodic maintenance via LLM agent. */
|
|
41
|
+
private runMaintenancePass;
|
|
42
|
+
/** Get processing history. */
|
|
43
|
+
getHistory(scope?: string, limit?: number): import("./state.js").ProcessedSession[];
|
|
44
|
+
/** Get failed sessions. */
|
|
45
|
+
getFailed(): import("./state.js").ProcessedSession[];
|
|
46
|
+
/** Retry all failed sessions. */
|
|
47
|
+
retryFailed(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAUnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uEAAuE;IACvE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAA+C;IACvE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAA4D;gBAEjE,MAAM,EAAE,YAAY;IAUhC,wBAAwB;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C5B,uBAAuB;IACjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,2CAA2C;IAC3C,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,iEAAiE;IAC3D,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CpD,oDAAoD;IACpD,OAAO,CAAC,YAAY;IAapB,4CAA4C;YAC9B,YAAY;IAY1B,8CAA8C;YAChC,kBAAkB;IA4BhC,8BAA8B;IAC9B,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAIzC,2BAA2B;IAC3B,SAAS;IAIT,iCAAiC;IAC3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAWnC"}
|