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,170 @@
1
+ /**
2
+ * YAML frontmatter parsing and serialization for wiki pages.
3
+ *
4
+ * Handles the `---\n...\n---` frontmatter block in markdown files.
5
+ * Uses the `yaml` package for robust parsing. Preserves unknown fields.
6
+ */
7
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
8
+ // -- Schema versioning -------------------------------------------------------
9
+ /** Current schema version. Bump when frontmatter/body format changes. */
10
+ export const CURRENT_SCHEMA_VERSION = 1;
11
+ /**
12
+ * Registry of all schema migrations, ordered by `from` version.
13
+ * Empty while CURRENT_SCHEMA_VERSION = 1 — add entries when bumping.
14
+ */
15
+ export const MIGRATIONS = [];
16
+ /**
17
+ * Apply all applicable migrations to bring a page up to CURRENT_SCHEMA_VERSION.
18
+ *
19
+ * Chains migrations sequentially: 1→2, 2→3, etc.
20
+ * If `schemaVersion` is already >= CURRENT_SCHEMA_VERSION, returns as-is (no downgrade).
21
+ * If `schemaVersion` is missing, defaults to 1.
22
+ */
23
+ export function migrateToLatest(fm, body) {
24
+ let version = typeof fm.schemaVersion === "number" ? fm.schemaVersion : 1;
25
+ // Don't downgrade pages ahead of current version
26
+ if (version >= CURRENT_SCHEMA_VERSION) {
27
+ return { fm: { ...fm, schemaVersion: version }, body };
28
+ }
29
+ let currentFm = { ...fm };
30
+ let currentBody = body;
31
+ while (version < CURRENT_SCHEMA_VERSION) {
32
+ const migration = MIGRATIONS.find((m) => m.from === version);
33
+ if (!migration) {
34
+ // No migration path — stop at current version
35
+ break;
36
+ }
37
+ const result = migration.migrate(currentFm, currentBody);
38
+ currentFm = result.fm;
39
+ currentBody = result.body;
40
+ version = migration.to;
41
+ }
42
+ currentFm.schemaVersion = version;
43
+ return { fm: currentFm, body: currentBody };
44
+ }
45
+ const VALID_PARA_CATEGORIES = new Set([
46
+ "projects",
47
+ "areas",
48
+ "resources",
49
+ "archives",
50
+ ]);
51
+ const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n?---\n?([\s\S]*)$/;
52
+ // -- Functions ---------------------------------------------------------------
53
+ /**
54
+ * Parse YAML frontmatter from markdown content.
55
+ *
56
+ * Expects content starting with `---\n...\n---`. If no frontmatter block
57
+ * is found, returns default frontmatter and the entire content as body.
58
+ * If the YAML is malformed, throws with a descriptive error.
59
+ */
60
+ export function parseFrontmatter(content) {
61
+ const match = content.match(FRONTMATTER_REGEX);
62
+ if (!match) {
63
+ return {
64
+ frontmatter: validateFrontmatter({}),
65
+ body: content,
66
+ };
67
+ }
68
+ const rawYaml = match[1];
69
+ const body = match[2];
70
+ let parsed;
71
+ try {
72
+ parsed = parseYaml(rawYaml);
73
+ }
74
+ catch (err) {
75
+ const msg = err instanceof Error ? err.message : String(err);
76
+ throw new Error(`Malformed YAML frontmatter: ${msg}`);
77
+ }
78
+ if (parsed == null || typeof parsed !== "object") {
79
+ return {
80
+ frontmatter: validateFrontmatter({}),
81
+ body,
82
+ };
83
+ }
84
+ return {
85
+ frontmatter: validateFrontmatter(parsed),
86
+ body,
87
+ };
88
+ }
89
+ /**
90
+ * Serialize frontmatter and body back to a markdown string with YAML
91
+ * frontmatter block.
92
+ */
93
+ export function serializeFrontmatter(frontmatter, body) {
94
+ // Always write the current schema version on serialize
95
+ const fmWithVersion = { ...frontmatter, schemaVersion: CURRENT_SCHEMA_VERSION };
96
+ const yaml = stringifyYaml(fmWithVersion, { lineWidth: 0 }).trimEnd();
97
+ return `---\n${yaml}\n---\n${body}`;
98
+ }
99
+ /**
100
+ * Validate and normalize a raw frontmatter object into a PageFrontmatter.
101
+ *
102
+ * Required field: `title` (defaults to "Untitled" if missing).
103
+ * All other fields get sensible defaults. Unknown fields are preserved.
104
+ */
105
+ export function validateFrontmatter(fm) {
106
+ const now = new Date().toISOString();
107
+ const title = typeof fm.title === "string" && fm.title.length > 0
108
+ ? fm.title
109
+ : "Untitled";
110
+ const para = validateParaCategory(fm.para);
111
+ const scope = toStringArray(fm.scope);
112
+ const tags = toStringArray(fm.tags);
113
+ const sources = toStringArray(fm.sources);
114
+ const links = toStringArray(fm.links);
115
+ const created = typeof fm.created === "string" && fm.created.length > 0
116
+ ? fm.created
117
+ : now;
118
+ const updated = typeof fm.updated === "string" && fm.updated.length > 0
119
+ ? fm.updated
120
+ : now;
121
+ const schemaVersion = typeof fm.schemaVersion === "number" ? fm.schemaVersion : 1;
122
+ // Build result with known fields first, then spread unknown fields underneath.
123
+ // Known fields override any unknown fields with the same name.
124
+ const knownKeys = new Set([
125
+ "title",
126
+ "para",
127
+ "scope",
128
+ "tags",
129
+ "sources",
130
+ "created",
131
+ "updated",
132
+ "links",
133
+ "schemaVersion",
134
+ ]);
135
+ const unknownFields = {};
136
+ for (const [key, value] of Object.entries(fm)) {
137
+ if (!knownKeys.has(key)) {
138
+ unknownFields[key] = value;
139
+ }
140
+ }
141
+ return {
142
+ ...unknownFields,
143
+ title,
144
+ para,
145
+ scope,
146
+ tags,
147
+ sources,
148
+ created,
149
+ updated,
150
+ links,
151
+ schemaVersion,
152
+ };
153
+ }
154
+ // -- Helpers -----------------------------------------------------------------
155
+ function validateParaCategory(value) {
156
+ if (typeof value === "string" && VALID_PARA_CATEGORIES.has(value)) {
157
+ return value;
158
+ }
159
+ return "resources";
160
+ }
161
+ function toStringArray(value) {
162
+ if (Array.isArray(value)) {
163
+ return value.filter((v) => typeof v === "string");
164
+ }
165
+ if (typeof value === "string") {
166
+ return [value];
167
+ }
168
+ return [];
169
+ }
170
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * pi-para — PARA Knowledge Base Extension for pi
3
+ *
4
+ * Main extension entry point. Wires together wiki filesystem, qmd store,
5
+ * scope detection, context injection, tools, and commands.
6
+ *
7
+ * Session capture and maintenance are coordinated by an in-process scheduler.
8
+ * Completed-session registry entries are kept as a durable catch-up queue.
9
+ */
10
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
11
+ export type { ParaCategory, WikiPage, PageFrontmatter, PageRef, LogEntry } from "./wiki.js";
12
+ export type { WikiSearchOptions, WikiSearchResult } from "./store.js";
13
+ export type { ProjectScope, ScopeConfig } from "./scope.js";
14
+ export type { IngestOptions, IngestReport, IngestResult } from "./ingest.js";
15
+ export type { QueryOptions, QueryResult } from "./query.js";
16
+ export type { LintOptions, LintReport, LintIssue, WikiStats } from "./lint.js";
17
+ export type { ContextOptions } from "./context.js";
18
+ export type { RawSource, SessionDigest } from "./raw.js";
19
+ export type { SummarizeOptions } from "./summarize.js";
20
+ export default function piPara(pi: ExtensionAPI): Promise<void>;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iCAAiC,CAAC;AAuBtF,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC5F,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA2HvD,wBAA8B,MAAM,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiRpE"}
package/dist/index.js ADDED
@@ -0,0 +1,357 @@
1
+ /**
2
+ * pi-para — PARA Knowledge Base Extension for pi
3
+ *
4
+ * Main extension entry point. Wires together wiki filesystem, qmd store,
5
+ * scope detection, context injection, tools, and commands.
6
+ *
7
+ * Session capture and maintenance are coordinated by an in-process scheduler.
8
+ * Completed-session registry entries are kept as a durable catch-up queue.
9
+ */
10
+ import { join } from "node:path";
11
+ import { homedir, networkInterfaces } from "node:os";
12
+ import { detectScope } from "./scope.js";
13
+ import { initWiki } from "./wiki.js";
14
+ import { openStore, closeStore } from "./store.js";
15
+ import { registerTools } from "./tools.js";
16
+ import { setupContextInjection, markContextDirty } from "./context.js";
17
+ import { registerCommands } from "./commands.js";
18
+ import { createServer } from "node:http";
19
+ import { startWikiScheduler, stopWikiScheduler } from "./scheduler/index.js";
20
+ import { appendCompletedSession, createCaptureSessionHandler, enqueueCompletedSessionsFromRegistry, } from "./scheduler/session-capture.js";
21
+ import { loadParaConfig, toLegacyRuntimeConfig } from "./config.js";
22
+ import { createModelApiKeyResolver, createPiModelRegistry, getCaptureSelection, resolveSelectedModel } from "./model-resolver.js";
23
+ import { StateDB } from "./state.js";
24
+ function getDefaultConfig() {
25
+ return {
26
+ wikiDir: join(homedir(), ".pi", "wiki"),
27
+ contextMaxTokens: 4000,
28
+ contextIncludeSchema: true,
29
+ contextIncludeIndex: true,
30
+ lintAutoFix: true,
31
+ lintStaleDays: 90,
32
+ searchLimit: 10,
33
+ searchIncludeArchives: false,
34
+ searchGraphBoost: true,
35
+ daemonModel: null,
36
+ webWiki: {
37
+ enabled: false,
38
+ host: "0.0.0.0",
39
+ port: 10973,
40
+ },
41
+ };
42
+ }
43
+ async function loadConfig() {
44
+ try {
45
+ const loaded = await loadParaConfig({ migrate: true });
46
+ const runtime = toLegacyRuntimeConfig(loaded.config);
47
+ return {
48
+ runtime,
49
+ userConfig: loaded.config,
50
+ secretsPath: loaded.paths.secretsPath,
51
+ };
52
+ }
53
+ catch {
54
+ return { runtime: getDefaultConfig(), userConfig: null, secretsPath: null };
55
+ }
56
+ }
57
+ // -- LAN IP detection --------------------------------------------------------
58
+ /** Check if the optional web wiki server is alive on the given port. */
59
+ function checkWebServerAlive(port) {
60
+ return new Promise((resolve) => {
61
+ const req = createServer().listen(port, "127.0.0.1");
62
+ req.on("error", (err) => {
63
+ req.close();
64
+ // EADDRINUSE means something is already listening — daemon is running
65
+ resolve(err.code === "EADDRINUSE");
66
+ });
67
+ req.on("listening", () => {
68
+ // Port is free — no daemon web server
69
+ req.close();
70
+ resolve(false);
71
+ });
72
+ });
73
+ }
74
+ function isPrintModeProcess(argv = process.argv) {
75
+ return argv.includes("-p") || argv.includes("--print") || argv.includes("--mode") && argv[argv.indexOf("--mode") + 1] === "json";
76
+ }
77
+ function getLanIp() {
78
+ const interfaces = networkInterfaces();
79
+ for (const name of Object.keys(interfaces)) {
80
+ const addrs = interfaces[name];
81
+ if (!addrs)
82
+ continue;
83
+ for (const addr of addrs) {
84
+ if (addr.family === "IPv4" && !addr.internal) {
85
+ return addr.address;
86
+ }
87
+ }
88
+ }
89
+ return null;
90
+ }
91
+ const ENTRY_TYPE = "pi-para-state";
92
+ function reconstructState(ctx) {
93
+ let latest = null;
94
+ for (const entry of ctx.sessionManager.getBranch()) {
95
+ if (entry.type === "custom" && entry.customType === ENTRY_TYPE) {
96
+ latest = entry.data;
97
+ }
98
+ }
99
+ return latest;
100
+ }
101
+ // -- Extension entry point ---------------------------------------------------
102
+ export default async function piPara(pi) {
103
+ const loadedConfig = await loadConfig();
104
+ const config = loadedConfig.runtime;
105
+ const wikiDir = config.wikiDir;
106
+ let store = null;
107
+ let currentScope = null;
108
+ let storeDisabled = false;
109
+ const getScope = () => {
110
+ if (!currentScope) {
111
+ return { name: "unknown", include: ["unknown"], exclude: [], source: "dirname" };
112
+ }
113
+ return currentScope;
114
+ };
115
+ const setScope = (scope) => {
116
+ currentScope = scope;
117
+ markContextDirty();
118
+ pi.appendEntry(ENTRY_TYPE, {
119
+ lastScope: scope,
120
+ sessionFile: null,
121
+ });
122
+ };
123
+ const getConfig = () => ({
124
+ contextMaxTokens: config.contextMaxTokens,
125
+ contextIncludeSchema: config.contextIncludeSchema,
126
+ contextIncludeIndex: config.contextIncludeIndex,
127
+ });
128
+ // Lazy retry: if the store failed at startup, try reopening on first tool use.
129
+ // This handles cases where the db was temporarily locked or had transient errors.
130
+ let storeRetrying = false;
131
+ async function retryStoreOpen() {
132
+ if (storeRetrying)
133
+ return false;
134
+ storeRetrying = true;
135
+ try {
136
+ store = await openStore(wikiDir, {
137
+ paraConfig: loadedConfig.userConfig ?? undefined,
138
+ secretsPath: loadedConfig.secretsPath ?? undefined,
139
+ backgroundEmbed: false,
140
+ });
141
+ storeDisabled = false;
142
+ markContextDirty(); // rebuild context now that store works
143
+ return true;
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ finally {
149
+ storeRetrying = false;
150
+ }
151
+ }
152
+ // Store proxy — delegates to real store once opened, with lazy retry on failure
153
+ const storeProxy = new Proxy({}, {
154
+ get(_target, prop) {
155
+ if (!store) {
156
+ if (storeDisabled) {
157
+ // Return an async function that retries opening the store first
158
+ return async (...args) => {
159
+ const reopened = await retryStoreOpen();
160
+ if (reopened && store) {
161
+ const method = store[prop];
162
+ if (typeof method === "function") {
163
+ return method.apply(store, args);
164
+ }
165
+ return method;
166
+ }
167
+ throw new Error("Wiki search is disabled: qmd store failed to open.");
168
+ };
169
+ }
170
+ return (..._args) => {
171
+ throw new Error("Wiki store not initialized yet.");
172
+ };
173
+ }
174
+ return store[prop];
175
+ },
176
+ });
177
+ // Register tools, context injection, commands
178
+ registerTools(pi, wikiDir, storeProxy, getScope, markContextDirty, () => config.searchGraphBoost);
179
+ setupContextInjection(pi, wikiDir, storeProxy, () => currentScope, getConfig);
180
+ registerCommands(pi, wikiDir, storeProxy, getScope, setScope);
181
+ // -- session_start ---------------------------------------------------------
182
+ pi.on("session_start", async (_event, ctx) => {
183
+ ctx.ui.setStatus("pi-para", "wiki: loading...");
184
+ try {
185
+ await initWiki(wikiDir);
186
+ }
187
+ catch (err) {
188
+ ctx.ui.notify(`Wiki init failed: ${err instanceof Error ? err.message : String(err)}`, "error");
189
+ }
190
+ ctx.ui.setStatus("pi-para", "wiki: indexing...");
191
+ storeDisabled = false;
192
+ try {
193
+ store = await openStore(wikiDir, {
194
+ paraConfig: loadedConfig.userConfig ?? undefined,
195
+ secretsPath: loadedConfig.secretsPath ?? undefined,
196
+ backgroundEmbed: false,
197
+ });
198
+ }
199
+ catch (err) {
200
+ store = null;
201
+ storeDisabled = true;
202
+ ctx.ui.notify(`Wiki search disabled: ${err instanceof Error ? err.message : String(err)}`, "warning");
203
+ }
204
+ currentScope = await detectScope(ctx.cwd);
205
+ const savedState = reconstructState(ctx);
206
+ if (savedState?.lastScope.source === "config") {
207
+ currentScope = savedState.lastScope;
208
+ }
209
+ pi.appendEntry(ENTRY_TYPE, {
210
+ lastScope: currentScope,
211
+ sessionFile: ctx.sessionManager.getSessionFile() ?? null,
212
+ });
213
+ const schedulerHandlers = {};
214
+ const schedulerConfig = loadedConfig.userConfig?.scheduler;
215
+ const wikiConfig = loadedConfig.userConfig?.wiki;
216
+ const autoCaptureEnabled = wikiConfig?.autoCapture !== false;
217
+ const startupCatchupEnabled = autoCaptureEnabled && wikiConfig?.captureOnStartup !== false && schedulerConfig?.startupCatchup !== false;
218
+ try {
219
+ const loadedParaConfig = await loadParaConfig({ migrate: true });
220
+ const registry = autoCaptureEnabled ? await createPiModelRegistry() : null;
221
+ if (registry) {
222
+ const captureSelection = getCaptureSelection(loadedParaConfig.config);
223
+ const captureModel = resolveSelectedModel(captureSelection, registry.modelRegistry, {
224
+ legacyModelSpec: config.daemonModel,
225
+ preferredModelSpec: "anthropic/claude-sonnet-4-20250514",
226
+ });
227
+ if (captureModel) {
228
+ schedulerHandlers["capture-session"] = createCaptureSessionHandler({
229
+ wikiDir,
230
+ storeProvider: () => store,
231
+ model: captureModel,
232
+ getApiKey: createModelApiKeyResolver(captureSelection, registry.modelRegistry, {
233
+ authStorage: registry.authStorage,
234
+ secretsPath: loadedParaConfig.paths.secretsPath,
235
+ }),
236
+ });
237
+ }
238
+ }
239
+ }
240
+ catch {
241
+ // Capture handler registration is best-effort; manual capture remains available.
242
+ }
243
+ const embedEnabled = loadedConfig.userConfig?.qmd.embedEnabled !== false;
244
+ const schedulerEnabled = !isPrintModeProcess() && schedulerConfig?.enabled !== false;
245
+ const scheduler = schedulerEnabled
246
+ ? startWikiScheduler({
247
+ wikiDir,
248
+ enabled: true,
249
+ intervalMs: (schedulerConfig?.intervalMinutes ?? 15) * 60_000,
250
+ storeProvider: () => store,
251
+ markDirty: () => markContextDirty(),
252
+ handlers: schedulerHandlers,
253
+ embedEnabled,
254
+ })
255
+ : null;
256
+ // Drain any pre-existing embedding backlog in the background. Startup
257
+ // opens the store with backgroundEmbed:false (fast print-mode exits), so
258
+ // without this new pages stayed BM25-only until an explicit embed pass.
259
+ if (scheduler && embedEnabled && store) {
260
+ try {
261
+ scheduler.embedEnabled = true;
262
+ scheduler.enqueue("qmd-embed", {}, { dedupeKey: "qmd-embed", priority: 5 });
263
+ void scheduler.tick();
264
+ }
265
+ catch {
266
+ // Background embedding is best-effort; BM25 search works regardless.
267
+ }
268
+ }
269
+ if (scheduler && startupCatchupEnabled) {
270
+ try {
271
+ const stateDb = new StateDB(wikiDir);
272
+ await enqueueCompletedSessionsFromRegistry(scheduler, wikiDir, { stateDb });
273
+ stateDb.close();
274
+ void scheduler.tick();
275
+ }
276
+ catch {
277
+ // Startup capture catch-up is best-effort.
278
+ }
279
+ }
280
+ // Check if web wiki server is running (don't start our own yet)
281
+ if (config.webWiki.enabled) {
282
+ const port = config.webWiki.port;
283
+ try {
284
+ const alive = await checkWebServerAlive(port);
285
+ if (alive) {
286
+ const lanIp = getLanIp();
287
+ const url = lanIp ? `http://${lanIp}:${port}` : `http://localhost:${port}`;
288
+ ctx.ui.setStatus("pi-para", `wiki: ${url}`);
289
+ }
290
+ else {
291
+ ctx.ui.setStatus("pi-para", "wiki: ready (web UI disabled)");
292
+ setTimeout(() => ctx.ui.setStatus("pi-para", undefined), 5000);
293
+ }
294
+ }
295
+ catch {
296
+ ctx.ui.setStatus("pi-para", "wiki: ready");
297
+ setTimeout(() => ctx.ui.setStatus("pi-para", undefined), 3000);
298
+ }
299
+ }
300
+ else {
301
+ ctx.ui.setStatus("pi-para", "wiki: ready");
302
+ setTimeout(() => ctx.ui.setStatus("pi-para", undefined), 3000);
303
+ }
304
+ });
305
+ // -- session_tree ----------------------------------------------------------
306
+ pi.on("session_tree", async (_event, ctx) => {
307
+ const savedState = reconstructState(ctx);
308
+ if (savedState?.lastScope.source === "config") {
309
+ currentScope = savedState.lastScope;
310
+ }
311
+ else {
312
+ currentScope = await detectScope(ctx.cwd);
313
+ }
314
+ markContextDirty();
315
+ });
316
+ // -- session_compact: register session for scheduler capture on compaction --
317
+ pi.on("session_compact", async (_event, ctx) => {
318
+ // Compaction means the session has accumulated enough content that details
319
+ // are about to be compressed/lost. Perfect time to capture knowledge.
320
+ const sessionFile = ctx.sessionManager.getSessionFile();
321
+ if (sessionFile) {
322
+ try {
323
+ await appendCompletedSession(wikiDir, sessionFile);
324
+ ctx.ui.setStatus("pi-para", "wiki: capture queued (compaction)");
325
+ setTimeout(() => ctx.ui.setStatus("pi-para", undefined), 5000);
326
+ }
327
+ catch {
328
+ // Non-fatal
329
+ }
330
+ }
331
+ });
332
+ // -- session_shutdown: register session for scheduler, close store ---------
333
+ pi.on("session_shutdown", async (_event, ctx) => {
334
+ // 1. Register session as completed (scheduler catch-up processes later)
335
+ const sessionFile = ctx.sessionManager.getSessionFile();
336
+ if (sessionFile) {
337
+ try {
338
+ await appendCompletedSession(wikiDir, sessionFile);
339
+ }
340
+ catch {
341
+ // Non-fatal — startup catch-up can also discover sessions via filesystem scan
342
+ }
343
+ }
344
+ // 2. Stop scheduler and close the store (instant)
345
+ stopWikiScheduler(wikiDir);
346
+ if (store) {
347
+ try {
348
+ await closeStore(store);
349
+ }
350
+ catch {
351
+ // Non-fatal
352
+ }
353
+ store = null;
354
+ }
355
+ });
356
+ }
357
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Ingest pipeline — processes sources and integrates knowledge into the wiki.
3
+ *
4
+ * Resolves source content (URL, file, text), saves raw copy to the vault,
5
+ * and returns structured data for the caller (tool or standalone agent)
6
+ * to pass to the LLM for synthesis into wiki pages.
7
+ */
8
+ import type { ParaCategory, PageRef, LogEntry } from "./wiki.js";
9
+ import type { ProjectScope } from "./scope.js";
10
+ export interface IngestOptions {
11
+ source: string;
12
+ sourceType?: "url" | "file" | "text";
13
+ scope?: string[];
14
+ category?: ParaCategory;
15
+ }
16
+ export interface IngestReport {
17
+ pagesCreated: PageRef[];
18
+ pagesUpdated: PageRef[];
19
+ logEntry: LogEntry;
20
+ }
21
+ /** Structure returned by LLM during ingest. */
22
+ export interface IngestResult {
23
+ newPages: Array<{
24
+ category: ParaCategory;
25
+ slug: string;
26
+ title: string;
27
+ scope: string[];
28
+ tags: string[];
29
+ body: string;
30
+ }>;
31
+ updatedPages: Array<{
32
+ category: ParaCategory;
33
+ slug: string;
34
+ appendOrReplace: "append" | "replace";
35
+ body: string;
36
+ }>;
37
+ indexUpdate: string;
38
+ logSummary: string;
39
+ }
40
+ /** Resolved source data from the ingest pipeline. */
41
+ export interface ResolvedSource {
42
+ /** Original source string (URL, path, or text) */
43
+ source: string;
44
+ /** Detected or explicit source type */
45
+ sourceType: "url" | "file" | "text";
46
+ /** Fetched/read source content */
47
+ content: string;
48
+ /** Path in raw/ vault (undefined for inline text) */
49
+ rawPath: string | undefined;
50
+ /** Schema.md content for LLM context */
51
+ schema: string;
52
+ /** Index.md content for LLM context */
53
+ index: string;
54
+ /** Scope tags to assign */
55
+ scopeTags: string[];
56
+ /** Scope name */
57
+ scopeName: string;
58
+ /** Category hint (if provided) */
59
+ categoryHint: ParaCategory | undefined;
60
+ }
61
+ /** Detect source type from the source string. */
62
+ export declare function detectSourceType(source: string): "url" | "file" | "text";
63
+ /** Fetch content from a URL. */
64
+ export declare function fetchUrl(url: string): Promise<string>;
65
+ /** Read content from a file path. */
66
+ export declare function readFileSource(filePath: string): Promise<string>;
67
+ /**
68
+ * Resolve a source and prepare it for LLM synthesis.
69
+ *
70
+ * This is the reusable library function. It:
71
+ * 1. Detects or uses the explicit source type
72
+ * 2. Fetches URL / reads file / uses text directly
73
+ * 3. Saves a raw copy to the vault (for non-text sources)
74
+ * 4. Reads schema.md and index.md for LLM context
75
+ * 5. Returns everything the caller needs to build an LLM prompt
76
+ *
77
+ * The caller (tool or standalone agent) assembles the prompt and
78
+ * passes it to the LLM, which calls wiki_write to create pages.
79
+ */
80
+ export declare function resolveSource(wikiDir: string, options: IngestOptions, scope: ProjectScope): Promise<ResolvedSource>;
81
+ /** Maximum source content length before truncation. */
82
+ export declare const MAX_SOURCE_LENGTH = 50000;
83
+ /**
84
+ * Truncate source content if it exceeds the limit.
85
+ * Returns the truncated content with a marker.
86
+ */
87
+ export declare function truncateSource(content: string, maxLength?: number): string;
88
+ //# sourceMappingURL=ingest.d.ts.map