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.
Files changed (208) hide show
  1. package/ARCHITECTURE.md +0 -9
  2. package/CHANGELOG.md +13 -0
  3. package/CONFIGURATION.md +0 -23
  4. package/README.md +1 -29
  5. package/SETUP.md +1 -1
  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 +719 -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 +176 -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 +342 -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 +48 -0
  112. package/dist/scheduler/index.d.ts.map +1 -0
  113. package/dist/scheduler/index.js +193 -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 +19 -0
  140. package/dist/settings.d.ts.map +1 -0
  141. package/dist/settings.js +106 -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/config.ts +0 -25
  197. package/src/index.ts +1 -38
  198. package/src/templates/prompts.ts +0 -56
  199. package/scripts/gepa/dataset.py +0 -192
  200. package/scripts/gepa/lm_providers.py +0 -472
  201. package/scripts/gepa/metric.py +0 -279
  202. package/scripts/gepa/optimize.py +0 -367
  203. package/scripts/gepa/program.py +0 -99
  204. package/scripts/gepa/pyproject.toml +0 -19
  205. package/scripts/gepa/run-all.sh +0 -53
  206. package/scripts/gepa/wiki_reader.py +0 -113
  207. package/src/gepa/index.ts +0 -287
  208. package/src/gepa/optimized/capture-prompt.txt +0 -65
@@ -0,0 +1,35 @@
1
+ import { type QueueItem, type QueueStatus, type SchedulerHistoryItem } from "./state.js";
2
+ export interface QueueCaptureRecentOptions {
3
+ wikiDir: string;
4
+ dbPath?: string;
5
+ hours?: number;
6
+ now?: Date;
7
+ }
8
+ export interface QueueCaptureRecentResult {
9
+ scanned: number;
10
+ eligible: number;
11
+ queuedIds: number[];
12
+ }
13
+ export declare function queueCaptureRecent(options: QueueCaptureRecentOptions): Promise<QueueCaptureRecentResult>;
14
+ export declare function listSchedulerTasks(wikiDir: string, opts?: {
15
+ dbPath?: string;
16
+ status?: QueueStatus;
17
+ }): QueueItem[];
18
+ export declare function retryFailedSchedulerTasks(wikiDir: string, opts?: {
19
+ dbPath?: string;
20
+ taskName?: string;
21
+ now?: Date;
22
+ }): number;
23
+ export declare function getSchedulerTask(wikiDir: string, id: number, opts?: {
24
+ dbPath?: string;
25
+ }): QueueItem | null;
26
+ export declare function listSchedulerHistory(wikiDir: string, opts?: {
27
+ dbPath?: string;
28
+ taskName?: string;
29
+ limit?: number;
30
+ }): SchedulerHistoryItem[];
31
+ export declare function formatQueueItems(items: QueueItem[]): string;
32
+ export declare function formatQueueCaptureRecentResult(result: QueueCaptureRecentResult): string;
33
+ export declare function formatQueueItem(item: QueueItem | null): string;
34
+ export declare function formatSchedulerHistory(items: SchedulerHistoryItem[]): string;
35
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/scheduler/controls.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAG3G,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAoB9G;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACnD,SAAS,EAAE,CAOb;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC5D,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7B,SAAS,GAAG,IAAI,CAOlB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,oBAAoB,EAAE,CAOxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAK3D;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAMvF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAU9D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAO5E"}
@@ -0,0 +1,98 @@
1
+ import { getParaPaths } from "../paths.js";
2
+ import { StateDB } from "../state.js";
3
+ import { WikiScheduler } from "./index.js";
4
+ import { SchedulerStateDB } from "./state.js";
5
+ import { enqueueCompletedSessions, readCompletedSessionRegistry } from "./session-capture.js";
6
+ export async function queueCaptureRecent(options) {
7
+ const now = options.now ?? new Date();
8
+ const hours = options.hours ?? 24;
9
+ const cutoff = now.getTime() - hours * 60 * 60 * 1000;
10
+ const entries = await readCompletedSessionRegistry(options.wikiDir);
11
+ const eligible = entries.filter((entry) => {
12
+ const ts = Date.parse(entry.timestamp);
13
+ return Number.isFinite(ts) && ts >= cutoff;
14
+ });
15
+ const dbPath = options.dbPath ?? getParaPaths({ wikiDir: options.wikiDir }).schedulerDbPath;
16
+ const scheduler = new WikiScheduler({ wikiDir: options.wikiDir, dbPath, enabled: true });
17
+ const stateDb = new StateDB(options.wikiDir);
18
+ try {
19
+ const queuedIds = enqueueCompletedSessions(scheduler, eligible, { stateDb });
20
+ return { scanned: entries.length, eligible: eligible.length, queuedIds };
21
+ }
22
+ finally {
23
+ stateDb.close();
24
+ scheduler.stop();
25
+ }
26
+ }
27
+ export function listSchedulerTasks(wikiDir, opts = {}) {
28
+ const db = new SchedulerStateDB(opts.dbPath ?? getParaPaths({ wikiDir }).schedulerDbPath);
29
+ try {
30
+ return db.list(opts.status);
31
+ }
32
+ finally {
33
+ db.close();
34
+ }
35
+ }
36
+ export function retryFailedSchedulerTasks(wikiDir, opts = {}) {
37
+ const db = new SchedulerStateDB(opts.dbPath ?? getParaPaths({ wikiDir }).schedulerDbPath);
38
+ try {
39
+ return db.retryFailed(opts.taskName, opts.now);
40
+ }
41
+ finally {
42
+ db.close();
43
+ }
44
+ }
45
+ export function getSchedulerTask(wikiDir, id, opts = {}) {
46
+ const db = new SchedulerStateDB(opts.dbPath ?? getParaPaths({ wikiDir }).schedulerDbPath);
47
+ try {
48
+ return db.get(id);
49
+ }
50
+ finally {
51
+ db.close();
52
+ }
53
+ }
54
+ export function listSchedulerHistory(wikiDir, opts = {}) {
55
+ const db = new SchedulerStateDB(opts.dbPath ?? getParaPaths({ wikiDir }).schedulerDbPath);
56
+ try {
57
+ return db.listHistory({ taskName: opts.taskName, limit: opts.limit });
58
+ }
59
+ finally {
60
+ db.close();
61
+ }
62
+ }
63
+ export function formatQueueItems(items) {
64
+ if (items.length === 0)
65
+ return "No scheduler tasks queued.";
66
+ return items
67
+ .map((item) => `${item.id} ${item.status} ${item.taskName} attempts=${item.attempts} dedupe=${item.dedupeKey ?? "-"}`)
68
+ .join("\n");
69
+ }
70
+ export function formatQueueCaptureRecentResult(result) {
71
+ return [
72
+ `Scanned ${result.scanned} completed-session entr${result.scanned === 1 ? "y" : "ies"}.`,
73
+ `Eligible within window: ${result.eligible}.`,
74
+ `Queued ${result.queuedIds.length} capture task${result.queuedIds.length === 1 ? "" : "s"}.`,
75
+ ].join("\n");
76
+ }
77
+ export function formatQueueItem(item) {
78
+ if (!item)
79
+ return "Scheduler task not found.";
80
+ return [
81
+ `Task ${item.id}: ${item.taskName}`,
82
+ `Status: ${item.status}`,
83
+ `Attempts: ${item.attempts}`,
84
+ `Available: ${item.availableAt}`,
85
+ `Dedupe: ${item.dedupeKey ?? "-"}`,
86
+ `Payload: ${JSON.stringify(item.payload, null, 2)}`,
87
+ ].join("\n");
88
+ }
89
+ export function formatSchedulerHistory(items) {
90
+ if (items.length === 0)
91
+ return "No scheduler history.";
92
+ return items.map((item) => {
93
+ const duration = item.durationMs === null ? "-" : `${item.durationMs}ms`;
94
+ const error = item.error ? ` error=${item.error.slice(0, 80)}` : "";
95
+ return `${item.id} ${item.status} ${item.taskName} duration=${duration}${error}`;
96
+ }).join("\n");
97
+ }
98
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/scheduler/controls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { QMDStore } from "qmd-engine";
2
+ import { SchedulerStateDB, type QueueItem } from "./state.js";
3
+ export type SchedulerTaskHandler = (item: QueueItem, scheduler: WikiScheduler) => Promise<void>;
4
+ export interface WikiSchedulerOptions {
5
+ wikiDir: string;
6
+ dbPath?: string;
7
+ intervalMs?: number;
8
+ enabled?: boolean;
9
+ storeProvider?: () => QMDStore | null;
10
+ markDirty?: () => void;
11
+ handlers?: Record<string, SchedulerTaskHandler>;
12
+ }
13
+ export declare class WikiScheduler {
14
+ readonly wikiDir: string;
15
+ readonly holderId: string;
16
+ readonly state: SchedulerStateDB;
17
+ private timer;
18
+ private running;
19
+ private stopped;
20
+ private closed;
21
+ private readonly intervalMs;
22
+ private readonly enabled;
23
+ private readonly storeProvider;
24
+ private readonly markDirty;
25
+ private handlers;
26
+ constructor(opts: WikiSchedulerOptions);
27
+ start(): void;
28
+ stop(): void;
29
+ private closeState;
30
+ enqueue(taskName: string, payload?: unknown, opts?: {
31
+ priority?: number;
32
+ dedupeKey?: string;
33
+ availableAt?: Date;
34
+ }): number;
35
+ registerHandlers(handlers: Record<string, SchedulerTaskHandler>): void;
36
+ tick(): Promise<number>;
37
+ private runItem;
38
+ private runWikiMaintenance;
39
+ }
40
+ export declare function getWikiScheduler(opts: WikiSchedulerOptions): WikiScheduler;
41
+ export declare function startWikiScheduler(opts: WikiSchedulerOptions): WikiScheduler;
42
+ export declare function stopWikiScheduler(wikiDir: string, dbPath?: string): void;
43
+ export declare function enqueueWikiMaintenance(wikiDir: string, store: QMDStore, markDirty: () => void, opts?: {
44
+ delayMs?: number;
45
+ dbPath?: string;
46
+ }): number | null;
47
+ export declare function resetSchedulersForTests(): void;
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhG,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACjD;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAuC;gBAE3C,IAAI,EAAE,oBAAoB;IActC,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAOZ,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,IAAI,CAAA;KAAO,GAAG,MAAM;IAKlI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAIhE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;YAmBf,OAAO;YAqBP,kBAAkB;CAajC;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAU1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAI5E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAWxE;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,IAAI,EACrB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,MAAM,GAAG,IAAI,CA2Bf;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAO9C"}
@@ -0,0 +1,193 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { gitCommit, rebuildIndex } from "../wiki.js";
3
+ import { reindex } from "../store.js";
4
+ import { getParaPaths } from "../paths.js";
5
+ import { acquireLease, releaseLease } from "./leases.js";
6
+ import { SchedulerStateDB } from "./state.js";
7
+ export class WikiScheduler {
8
+ wikiDir;
9
+ holderId;
10
+ state;
11
+ timer = null;
12
+ running = false;
13
+ stopped = false;
14
+ closed = false;
15
+ intervalMs;
16
+ enabled;
17
+ storeProvider;
18
+ markDirty;
19
+ handlers;
20
+ constructor(opts) {
21
+ this.wikiDir = opts.wikiDir;
22
+ this.holderId = `scheduler:${process.pid}:${randomUUID()}`;
23
+ this.state = new SchedulerStateDB(opts.dbPath ?? getParaPaths({ wikiDir: opts.wikiDir }).schedulerDbPath);
24
+ this.intervalMs = opts.intervalMs ?? 15 * 60_000;
25
+ this.enabled = opts.enabled ?? true;
26
+ this.storeProvider = opts.storeProvider ?? (() => null);
27
+ this.markDirty = opts.markDirty ?? (() => { });
28
+ this.handlers = {
29
+ "wiki-maintenance": async () => this.runWikiMaintenance(),
30
+ ...(opts.handlers ?? {}),
31
+ };
32
+ }
33
+ start() {
34
+ if (!this.enabled || this.timer || this.closed)
35
+ return;
36
+ this.stopped = false;
37
+ this.state.requeueRunning();
38
+ void this.tick();
39
+ this.timer = setInterval(() => void this.tick(), this.intervalMs);
40
+ this.timer.unref?.();
41
+ }
42
+ stop() {
43
+ this.stopped = true;
44
+ if (this.timer)
45
+ clearInterval(this.timer);
46
+ this.timer = null;
47
+ if (!this.running)
48
+ this.closeState();
49
+ }
50
+ closeState() {
51
+ if (this.closed)
52
+ return;
53
+ this.closed = true;
54
+ this.state.close();
55
+ }
56
+ enqueue(taskName, payload = {}, opts = {}) {
57
+ if (this.closed)
58
+ throw new Error("Wiki scheduler is stopped.");
59
+ return this.state.enqueue(taskName, payload, opts);
60
+ }
61
+ registerHandlers(handlers) {
62
+ this.handlers = { ...this.handlers, ...handlers };
63
+ }
64
+ async tick() {
65
+ if (!this.enabled || this.running || this.stopped || this.closed)
66
+ return 0;
67
+ this.running = true;
68
+ let processed = 0;
69
+ try {
70
+ for (;;) {
71
+ if (this.stopped)
72
+ break;
73
+ const item = this.state.claimNext();
74
+ if (!item)
75
+ break;
76
+ await this.runItem(item);
77
+ processed++;
78
+ }
79
+ }
80
+ finally {
81
+ this.running = false;
82
+ if (this.stopped)
83
+ this.closeState();
84
+ }
85
+ return processed;
86
+ }
87
+ async runItem(item) {
88
+ const handler = this.handlers[item.taskName];
89
+ const started = new Date();
90
+ if (!handler) {
91
+ this.state.fail(item.id, `Unknown scheduler task: ${item.taskName}`, { now: started, maxAttempts: 1 });
92
+ return;
93
+ }
94
+ try {
95
+ await handler(item, this);
96
+ if (this.stopped || this.closed)
97
+ return;
98
+ const finished = new Date();
99
+ this.state.complete(item.id, finished);
100
+ this.state.recordHistory(item.taskName, item.payload, "done", started, finished, finished.getTime() - started.getTime(), null);
101
+ }
102
+ catch (err) {
103
+ if (this.stopped || this.closed)
104
+ return;
105
+ const retryAt = new Date(Date.now() + Math.min(60_000, 1_000 * 2 ** item.attempts));
106
+ this.state.fail(item.id, err instanceof Error ? err.message : String(err), { retryAt, now: new Date() });
107
+ }
108
+ }
109
+ async runWikiMaintenance() {
110
+ const leaseKey = `wiki-maintenance:${this.wikiDir}`;
111
+ if (!acquireLease(this.state.db, leaseKey, this.holderId, { ttlMs: 5 * 60_000 }))
112
+ return;
113
+ try {
114
+ await rebuildIndex(this.wikiDir);
115
+ const store = this.storeProvider();
116
+ if (store)
117
+ await reindex(store);
118
+ this.markDirty();
119
+ await gitCommit(this.wikiDir, "wiki: rebuild index and refresh search");
120
+ }
121
+ finally {
122
+ releaseLease(this.state.db, leaseKey, this.holderId);
123
+ }
124
+ }
125
+ }
126
+ const schedulers = new Map();
127
+ const debounceTimers = new Map();
128
+ export function getWikiScheduler(opts) {
129
+ const key = opts.dbPath ?? getParaPaths({ wikiDir: opts.wikiDir }).schedulerDbPath;
130
+ const existing = schedulers.get(key);
131
+ if (existing) {
132
+ if (opts.handlers)
133
+ existing.registerHandlers(opts.handlers);
134
+ return existing;
135
+ }
136
+ const scheduler = new WikiScheduler(opts);
137
+ schedulers.set(key, scheduler);
138
+ return scheduler;
139
+ }
140
+ export function startWikiScheduler(opts) {
141
+ const scheduler = getWikiScheduler(opts);
142
+ scheduler.start();
143
+ return scheduler;
144
+ }
145
+ export function stopWikiScheduler(wikiDir, dbPath) {
146
+ const key = dbPath ?? getParaPaths({ wikiDir }).schedulerDbPath;
147
+ const timer = debounceTimers.get(key);
148
+ if (timer) {
149
+ clearTimeout(timer);
150
+ debounceTimers.delete(key);
151
+ }
152
+ const scheduler = schedulers.get(key);
153
+ if (!scheduler)
154
+ return;
155
+ scheduler.stop();
156
+ schedulers.delete(key);
157
+ }
158
+ export function enqueueWikiMaintenance(wikiDir, store, markDirty, opts = {}) {
159
+ const key = opts.dbPath ?? getParaPaths({ wikiDir }).schedulerDbPath;
160
+ const existingTimer = debounceTimers.get(key);
161
+ if (existingTimer)
162
+ clearTimeout(existingTimer);
163
+ const scheduler = getWikiScheduler({
164
+ wikiDir,
165
+ dbPath: opts.dbPath,
166
+ storeProvider: () => store,
167
+ markDirty,
168
+ });
169
+ const delayMs = opts.delayMs ?? 2_000;
170
+ if (delayMs <= 0) {
171
+ const id = scheduler.enqueue("wiki-maintenance", {}, { dedupeKey: "wiki-maintenance", priority: 10 });
172
+ void scheduler.tick();
173
+ return id;
174
+ }
175
+ const timer = setTimeout(() => {
176
+ debounceTimers.delete(key);
177
+ scheduler.enqueue("wiki-maintenance", {}, { dedupeKey: "wiki-maintenance", priority: 10 });
178
+ void scheduler.tick();
179
+ }, delayMs);
180
+ timer.unref?.();
181
+ debounceTimers.set(key, timer);
182
+ return null;
183
+ }
184
+ export function resetSchedulersForTests() {
185
+ for (const timer of debounceTimers.values())
186
+ clearTimeout(timer);
187
+ debounceTimers.clear();
188
+ for (const [key, scheduler] of schedulers) {
189
+ scheduler.stop();
190
+ schedulers.delete(key);
191
+ }
192
+ }
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;AAc9D,MAAM,OAAO,aAAa;IACf,OAAO,CAAS;IAChB,QAAQ,CAAS;IACjB,KAAK,CAAmB;IACzB,KAAK,GAA0C,IAAI,CAAC;IACpD,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,KAAK,CAAC;IACN,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,aAAa,CAAwB;IACrC,SAAS,CAAa;IAC/B,QAAQ,CAAuC;IAEvD,YAAY,IAA0B;QACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,aAAa,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAC1G,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,GAAG,MAAM,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG;YACd,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACzD,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,KAAgC,CAAC,KAAK,EAAE,EAAE,CAAC;IACnD,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACvC,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,UAAmB,EAAE,EAAE,OAAsE,EAAE;QACvH,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,gBAAgB,CAAC,QAA8C;QAC7D,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,IAAI,IAAI,CAAC,OAAO;oBAAE,MAAM;gBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI;oBAAE,MAAM;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzB,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAe;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,2BAA2B,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxC,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACjI,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;YAAE,OAAO;QACzF,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,KAAK;gBAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,wCAAwC,CAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;AACpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyC,CAAC;AAExE,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC;IACnF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,QAAQ;YAAE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAA0B;IAC3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAe;IAChE,MAAM,GAAG,GAAG,MAAM,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC;IAChE,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,SAAS,CAAC,IAAI,EAAE,CAAC;IACjB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,KAAe,EACf,SAAqB,EACrB,OAA8C,EAAE;IAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC;IACrE,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,aAAa;QAAE,YAAY,CAAC,aAAa,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,gBAAgB,CAAC;QACjC,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;QAC1B,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACtG,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3F,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC,EAAE,OAAO,CAAC,CAAC;IACX,KAAgC,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5C,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE;QAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjE,cAAc,CAAC,KAAK,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,SAAS,CAAC,IAAI,EAAE,CAAC;QACjB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import Database from "better-sqlite3";
2
+ export interface LeaseRecord {
3
+ leaseKey: string;
4
+ holderId: string;
5
+ expiresAt: string;
6
+ heartbeatAt: string;
7
+ metadataJson: string | null;
8
+ }
9
+ export declare function ensureLeaseSchema(db: Database.Database): void;
10
+ export declare function createLeaseHolder(prefix?: string): string;
11
+ export declare function acquireLease(db: Database.Database, leaseKey: string, holderId: string, opts?: {
12
+ ttlMs?: number;
13
+ now?: Date;
14
+ metadata?: unknown;
15
+ }): boolean;
16
+ export declare function renewLease(db: Database.Database, leaseKey: string, holderId: string, opts?: {
17
+ ttlMs?: number;
18
+ now?: Date;
19
+ }): boolean;
20
+ export declare function releaseLease(db: Database.Database, leaseKey: string, holderId: string): boolean;
21
+ export declare function getLease(db: Database.Database, leaseKey: string): LeaseRecord | null;
22
+ //# sourceMappingURL=leases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leases.d.ts","sourceRoot":"","sources":["../../src/scheduler/leases.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAU7D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,SAAY,GAAG,MAAM,CAE5D;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5D,OAAO,CAgCT;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GACxC,OAAO,CAUT;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI/F;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQpF"}
@@ -0,0 +1,74 @@
1
+ import Database from "better-sqlite3";
2
+ import { randomUUID } from "node:crypto";
3
+ export function ensureLeaseSchema(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS scheduler_leases (
6
+ lease_key TEXT PRIMARY KEY,
7
+ holder_id TEXT NOT NULL,
8
+ expires_at TEXT NOT NULL,
9
+ heartbeat_at TEXT NOT NULL,
10
+ metadata_json TEXT
11
+ );
12
+ `);
13
+ }
14
+ export function createLeaseHolder(prefix = "pi-para") {
15
+ return `${prefix}:${process.pid}:${randomUUID()}`;
16
+ }
17
+ export function acquireLease(db, leaseKey, holderId, opts = {}) {
18
+ ensureLeaseSchema(db);
19
+ const now = opts.now ?? new Date();
20
+ const ttlMs = opts.ttlMs ?? 2 * 60_000;
21
+ const expiresAt = new Date(now.getTime() + ttlMs).toISOString();
22
+ const nowIso = now.toISOString();
23
+ const metadataJson = opts.metadata === undefined ? null : JSON.stringify(opts.metadata);
24
+ db.exec("BEGIN IMMEDIATE");
25
+ try {
26
+ const current = db.prepare("SELECT holder_id, expires_at FROM scheduler_leases WHERE lease_key = ?").get(leaseKey);
27
+ const expired = !current || Date.parse(current.expires_at) <= now.getTime();
28
+ const sameHolder = current?.holder_id === holderId;
29
+ if (!expired && !sameHolder) {
30
+ db.exec("ROLLBACK");
31
+ return false;
32
+ }
33
+ db.prepare(`
34
+ INSERT OR REPLACE INTO scheduler_leases
35
+ (lease_key, holder_id, expires_at, heartbeat_at, metadata_json)
36
+ VALUES (?, ?, ?, ?, ?)
37
+ `).run(leaseKey, holderId, expiresAt, nowIso, metadataJson);
38
+ db.exec("COMMIT");
39
+ return true;
40
+ }
41
+ catch (err) {
42
+ try {
43
+ db.exec("ROLLBACK");
44
+ }
45
+ catch { }
46
+ throw err;
47
+ }
48
+ }
49
+ export function renewLease(db, leaseKey, holderId, opts = {}) {
50
+ ensureLeaseSchema(db);
51
+ const now = opts.now ?? new Date();
52
+ const expiresAt = new Date(now.getTime() + (opts.ttlMs ?? 2 * 60_000)).toISOString();
53
+ const result = db.prepare(`
54
+ UPDATE scheduler_leases
55
+ SET expires_at = ?, heartbeat_at = ?
56
+ WHERE lease_key = ? AND holder_id = ?
57
+ `).run(expiresAt, now.toISOString(), leaseKey, holderId);
58
+ return result.changes === 1;
59
+ }
60
+ export function releaseLease(db, leaseKey, holderId) {
61
+ ensureLeaseSchema(db);
62
+ const result = db.prepare("DELETE FROM scheduler_leases WHERE lease_key = ? AND holder_id = ?").run(leaseKey, holderId);
63
+ return result.changes === 1;
64
+ }
65
+ export function getLease(db, leaseKey) {
66
+ ensureLeaseSchema(db);
67
+ const row = db.prepare(`
68
+ SELECT lease_key as leaseKey, holder_id as holderId, expires_at as expiresAt,
69
+ heartbeat_at as heartbeatAt, metadata_json as metadataJson
70
+ FROM scheduler_leases WHERE lease_key = ?
71
+ `).get(leaseKey);
72
+ return row ?? null;
73
+ }
74
+ //# sourceMappingURL=leases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leases.js","sourceRoot":"","sources":["../../src/scheduler/leases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Model } from "@earendil-works/pi-ai";
2
+ import type { QMDStore } from "qmd-engine";
3
+ import { StateDB } from "../state.js";
4
+ import { type ProcessResult } from "../processor.js";
5
+ import type { WikiScheduler, SchedulerTaskHandler } from "./index.js";
6
+ export interface CompletedSessionEntry {
7
+ timestamp: string;
8
+ sessionPath: string;
9
+ }
10
+ export interface CaptureSessionPayload {
11
+ sessionPath: string;
12
+ scope?: string;
13
+ }
14
+ export interface CaptureSessionDeps {
15
+ wikiDir: string;
16
+ storeProvider: () => QMDStore | null;
17
+ model?: Model<any>;
18
+ getApiKey?: (provider: string) => Promise<string | undefined>;
19
+ stateDb?: StateDB;
20
+ processor?: (sessionPath: string, wikiDir: string, store: QMDStore, scope: string, model: Model<any>, getApiKey: (provider: string) => Promise<string | undefined>) => Promise<ProcessResult>;
21
+ }
22
+ export declare function parseCompletedSessionLine(line: string): CompletedSessionEntry | null;
23
+ export declare function readCompletedSessionRegistry(wikiDir: string): Promise<CompletedSessionEntry[]>;
24
+ export declare function appendCompletedSession(wikiDir: string, sessionPath: string, timestamp?: string): Promise<CompletedSessionEntry>;
25
+ export declare function enqueueCompletedSessionsFromRegistry(scheduler: WikiScheduler, wikiDir: string, opts?: {
26
+ stateDb?: StateDB;
27
+ }): Promise<number[]>;
28
+ export declare function enqueueCompletedSessions(scheduler: WikiScheduler, entries: CompletedSessionEntry[], opts?: {
29
+ stateDb?: StateDB;
30
+ }): number[];
31
+ export declare function createCaptureSessionHandler(deps: CaptureSessionDeps): SchedulerTaskHandler;
32
+ export declare function detectScopeFromSessionPath(sessionPath: string): string;
33
+ //# sourceMappingURL=session-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-capture.d.ts","sourceRoot":"","sources":["../../src/scheduler/session-capture.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CACV,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,KACzD,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAMpF;AAED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAQpG;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,SAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAIhC;AAED,wBAAsB,oCAAoC,CACxD,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,qBAAqB,EAAE,EAChC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,MAAM,EAAE,CAYV;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CA+B1F;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgBtE"}