lifeos 1.0.0

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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +202 -0
  3. package/README.md +202 -0
  4. package/assets/lifeos-rules.en.md +162 -0
  5. package/assets/lifeos-rules.zh.md +162 -0
  6. package/assets/lifeos.yaml +56 -0
  7. package/assets/prompts/AI_LLMResearch_Prompt.en.md +120 -0
  8. package/assets/prompts/AI_LLMResearch_Prompt.zh.md +120 -0
  9. package/assets/prompts/Art_ChinesePainting_Prompt.en.md +147 -0
  10. package/assets/prompts/Art_ChinesePainting_Prompt.zh.md +148 -0
  11. package/assets/prompts/Cryptography_Prompt.en.md +148 -0
  12. package/assets/prompts/Cryptography_Prompt.zh.md +147 -0
  13. package/assets/prompts/History_ChineseCulture_Prompt.en.md +98 -0
  14. package/assets/prompts/History_ChineseCulture_Prompt.zh.md +98 -0
  15. package/assets/prompts/Math_HigherMathematics_Prompt.en.md +117 -0
  16. package/assets/prompts/Math_HigherMathematics_Prompt.zh.md +116 -0
  17. package/assets/schema/Frontmatter_Schema.md +139 -0
  18. package/assets/skills/_shared/completion-report.en.md +30 -0
  19. package/assets/skills/_shared/completion-report.zh.md +30 -0
  20. package/assets/skills/_shared/dual-agent-orchestrator.en.md +40 -0
  21. package/assets/skills/_shared/dual-agent-orchestrator.zh.md +40 -0
  22. package/assets/skills/_shared/learning-lifecycle.en.md +53 -0
  23. package/assets/skills/_shared/learning-lifecycle.zh.md +53 -0
  24. package/assets/skills/_shared/lifecycle.en.md +84 -0
  25. package/assets/skills/_shared/lifecycle.zh.md +84 -0
  26. package/assets/skills/_shared/memory-protocol.en.md +36 -0
  27. package/assets/skills/_shared/memory-protocol.zh.md +36 -0
  28. package/assets/skills/_shared/template-loading.en.md +26 -0
  29. package/assets/skills/_shared/template-loading.zh.md +26 -0
  30. package/assets/skills/archive/SKILL.en.md +300 -0
  31. package/assets/skills/archive/SKILL.zh.md +300 -0
  32. package/assets/skills/ask/SKILL.en.md +164 -0
  33. package/assets/skills/ask/SKILL.zh.md +164 -0
  34. package/assets/skills/brainstorm/SKILL.en.md +242 -0
  35. package/assets/skills/brainstorm/SKILL.zh.md +242 -0
  36. package/assets/skills/brainstorm/references/action-options.en.md +65 -0
  37. package/assets/skills/brainstorm/references/action-options.zh.md +65 -0
  38. package/assets/skills/knowledge/SKILL.en.md +202 -0
  39. package/assets/skills/knowledge/SKILL.zh.md +202 -0
  40. package/assets/skills/project/SKILL.en.md +133 -0
  41. package/assets/skills/project/SKILL.zh.md +133 -0
  42. package/assets/skills/project/references/execution-agent-prompt.en.md +148 -0
  43. package/assets/skills/project/references/execution-agent-prompt.zh.md +148 -0
  44. package/assets/skills/project/references/planning-agent-prompt.en.md +162 -0
  45. package/assets/skills/project/references/planning-agent-prompt.zh.md +162 -0
  46. package/assets/skills/read-pdf/SKILL.en.md +199 -0
  47. package/assets/skills/read-pdf/SKILL.zh.md +199 -0
  48. package/assets/skills/read-pdf/scripts/read_pdf.py +354 -0
  49. package/assets/skills/research/SKILL.en.md +107 -0
  50. package/assets/skills/research/SKILL.zh.md +107 -0
  51. package/assets/skills/research/references/execution-agent-prompt.en.md +166 -0
  52. package/assets/skills/research/references/execution-agent-prompt.zh.md +166 -0
  53. package/assets/skills/research/references/planning-agent-prompt.en.md +129 -0
  54. package/assets/skills/research/references/planning-agent-prompt.zh.md +129 -0
  55. package/assets/skills/revise/SKILL.en.md +258 -0
  56. package/assets/skills/revise/SKILL.zh.md +258 -0
  57. package/assets/skills/revise/references/grading-protocol.en.md +99 -0
  58. package/assets/skills/revise/references/grading-protocol.zh.md +99 -0
  59. package/assets/skills/today/SKILL.en.md +211 -0
  60. package/assets/skills/today/SKILL.zh.md +211 -0
  61. package/assets/templates/en/Daily_Template.md +25 -0
  62. package/assets/templates/en/Draft_Template.md +29 -0
  63. package/assets/templates/en/Knowledge_Template.md +86 -0
  64. package/assets/templates/en/Project_Template.md +110 -0
  65. package/assets/templates/en/Research_Template.md +46 -0
  66. package/assets/templates/en/Retrospective_Template.md +89 -0
  67. package/assets/templates/en/Revise_Template.md +24 -0
  68. package/assets/templates/en/Wiki_Template.md +35 -0
  69. package/assets/templates/zh/Daily_Template.md +26 -0
  70. package/assets/templates/zh/Draft_Template.md +29 -0
  71. package/assets/templates/zh/Knowledge_Template.md +86 -0
  72. package/assets/templates/zh/Project_Template.md +110 -0
  73. package/assets/templates/zh/Research_Template.md +46 -0
  74. package/assets/templates/zh/Retrospective_Template.md +89 -0
  75. package/assets/templates/zh/Revise_Template.md +24 -0
  76. package/assets/templates/zh/Wiki_Template.md +35 -0
  77. package/bin/lifeos.js +24 -0
  78. package/dist/active-docs/citations.d.ts +20 -0
  79. package/dist/active-docs/citations.js +74 -0
  80. package/dist/active-docs/citations.js.map +1 -0
  81. package/dist/active-docs/derived-memory.d.ts +57 -0
  82. package/dist/active-docs/derived-memory.js +161 -0
  83. package/dist/active-docs/derived-memory.js.map +1 -0
  84. package/dist/active-docs/index.d.ts +51 -0
  85. package/dist/active-docs/index.js +165 -0
  86. package/dist/active-docs/index.js.map +1 -0
  87. package/dist/active-docs/long-term-profile.d.ts +24 -0
  88. package/dist/active-docs/long-term-profile.js +75 -0
  89. package/dist/active-docs/long-term-profile.js.map +1 -0
  90. package/dist/active-docs/taskboard.d.ts +12 -0
  91. package/dist/active-docs/taskboard.js +146 -0
  92. package/dist/active-docs/taskboard.js.map +1 -0
  93. package/dist/active-docs/userprofile.d.ts +12 -0
  94. package/dist/active-docs/userprofile.js +169 -0
  95. package/dist/active-docs/userprofile.js.map +1 -0
  96. package/dist/cli/commands/doctor.d.ts +9 -0
  97. package/dist/cli/commands/doctor.js +125 -0
  98. package/dist/cli/commands/doctor.js.map +1 -0
  99. package/dist/cli/commands/init.d.ts +1 -0
  100. package/dist/cli/commands/init.js +129 -0
  101. package/dist/cli/commands/init.js.map +1 -0
  102. package/dist/cli/commands/rename.d.ts +7 -0
  103. package/dist/cli/commands/rename.js +188 -0
  104. package/dist/cli/commands/rename.js.map +1 -0
  105. package/dist/cli/commands/upgrade.d.ts +6 -0
  106. package/dist/cli/commands/upgrade.js +66 -0
  107. package/dist/cli/commands/upgrade.js.map +1 -0
  108. package/dist/cli/index.d.ts +1 -0
  109. package/dist/cli/index.js +52 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/utils/assets.d.ts +3 -0
  112. package/dist/cli/utils/assets.js +20 -0
  113. package/dist/cli/utils/assets.js.map +1 -0
  114. package/dist/cli/utils/install-assets.d.ts +39 -0
  115. package/dist/cli/utils/install-assets.js +141 -0
  116. package/dist/cli/utils/install-assets.js.map +1 -0
  117. package/dist/cli/utils/lang.d.ts +1 -0
  118. package/dist/cli/utils/lang.js +32 -0
  119. package/dist/cli/utils/lang.js.map +1 -0
  120. package/dist/cli/utils/managed-assets.d.ts +9 -0
  121. package/dist/cli/utils/managed-assets.js +20 -0
  122. package/dist/cli/utils/managed-assets.js.map +1 -0
  123. package/dist/cli/utils/mcp-register.d.ts +2 -0
  124. package/dist/cli/utils/mcp-register.js +132 -0
  125. package/dist/cli/utils/mcp-register.js.map +1 -0
  126. package/dist/cli/utils/sync-vault.d.ts +14 -0
  127. package/dist/cli/utils/sync-vault.js +132 -0
  128. package/dist/cli/utils/sync-vault.js.map +1 -0
  129. package/dist/cli/utils/ui.d.ts +14 -0
  130. package/dist/cli/utils/ui.js +78 -0
  131. package/dist/cli/utils/ui.js.map +1 -0
  132. package/dist/cli/utils/version.d.ts +1 -0
  133. package/dist/cli/utils/version.js +4 -0
  134. package/dist/cli/utils/version.js.map +1 -0
  135. package/dist/config.d.ts +127 -0
  136. package/dist/config.js +356 -0
  137. package/dist/config.js.map +1 -0
  138. package/dist/core.d.ts +106 -0
  139. package/dist/core.js +286 -0
  140. package/dist/core.js.map +1 -0
  141. package/dist/db/consolidation.d.ts +14 -0
  142. package/dist/db/consolidation.js +28 -0
  143. package/dist/db/consolidation.js.map +1 -0
  144. package/dist/db/index.d.ts +22 -0
  145. package/dist/db/index.js +39 -0
  146. package/dist/db/index.js.map +1 -0
  147. package/dist/db/schema.d.ts +7 -0
  148. package/dist/db/schema.js +175 -0
  149. package/dist/db/schema.js.map +1 -0
  150. package/dist/index.d.ts +3 -0
  151. package/dist/index.js +5 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/server.d.ts +6 -0
  154. package/dist/server.js +303 -0
  155. package/dist/server.js.map +1 -0
  156. package/dist/services/capture.d.ts +101 -0
  157. package/dist/services/capture.js +297 -0
  158. package/dist/services/capture.js.map +1 -0
  159. package/dist/services/enhance.d.ts +51 -0
  160. package/dist/services/enhance.js +184 -0
  161. package/dist/services/enhance.js.map +1 -0
  162. package/dist/services/layer0.d.ts +24 -0
  163. package/dist/services/layer0.js +90 -0
  164. package/dist/services/layer0.js.map +1 -0
  165. package/dist/services/maintenance.d.ts +27 -0
  166. package/dist/services/maintenance.js +73 -0
  167. package/dist/services/maintenance.js.map +1 -0
  168. package/dist/services/retrieval.d.ts +120 -0
  169. package/dist/services/retrieval.js +571 -0
  170. package/dist/services/retrieval.js.map +1 -0
  171. package/dist/services/startup.d.ts +28 -0
  172. package/dist/services/startup.js +112 -0
  173. package/dist/services/startup.js.map +1 -0
  174. package/dist/skill-context/ask-global.d.ts +8 -0
  175. package/dist/skill-context/ask-global.js +21 -0
  176. package/dist/skill-context/ask-global.js.map +1 -0
  177. package/dist/skill-context/base.d.ts +48 -0
  178. package/dist/skill-context/base.js +5 -0
  179. package/dist/skill-context/base.js.map +1 -0
  180. package/dist/skill-context/daily-global.d.ts +8 -0
  181. package/dist/skill-context/daily-global.js +25 -0
  182. package/dist/skill-context/daily-global.js.map +1 -0
  183. package/dist/skill-context/index.d.ts +32 -0
  184. package/dist/skill-context/index.js +171 -0
  185. package/dist/skill-context/index.js.map +1 -0
  186. package/dist/skill-context/knowledge-strict.d.ts +8 -0
  187. package/dist/skill-context/knowledge-strict.js +26 -0
  188. package/dist/skill-context/knowledge-strict.js.map +1 -0
  189. package/dist/skill-context/review-strict.d.ts +8 -0
  190. package/dist/skill-context/review-strict.js +26 -0
  191. package/dist/skill-context/review-strict.js.map +1 -0
  192. package/dist/skill-context/revise-strict.d.ts +8 -0
  193. package/dist/skill-context/revise-strict.js +26 -0
  194. package/dist/skill-context/revise-strict.js.map +1 -0
  195. package/dist/skill-context/seed-profiles.d.ts +21 -0
  196. package/dist/skill-context/seed-profiles.js +80 -0
  197. package/dist/skill-context/seed-profiles.js.map +1 -0
  198. package/dist/types.d.ts +165 -0
  199. package/dist/types.js +76 -0
  200. package/dist/types.js.map +1 -0
  201. package/dist/utils/context-policy.d.ts +57 -0
  202. package/dist/utils/context-policy.js +333 -0
  203. package/dist/utils/context-policy.js.map +1 -0
  204. package/dist/utils/scan-state.d.ts +41 -0
  205. package/dist/utils/scan-state.js +79 -0
  206. package/dist/utils/scan-state.js.map +1 -0
  207. package/dist/utils/segmenter.d.ts +19 -0
  208. package/dist/utils/segmenter.js +75 -0
  209. package/dist/utils/segmenter.js.map +1 -0
  210. package/dist/utils/shared.d.ts +103 -0
  211. package/dist/utils/shared.js +313 -0
  212. package/dist/utils/shared.js.map +1 -0
  213. package/dist/utils/vault-indexer.d.ts +53 -0
  214. package/dist/utils/vault-indexer.js +256 -0
  215. package/dist/utils/vault-indexer.js.map +1 -0
  216. package/package.json +59 -0
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: "{{TITLE}}"
3
+ type: revise-record
4
+ created: "{{DATE}}"
5
+ domain: "{{DOMAIN}}"
6
+ note: "[[知识笔记路径]]"
7
+ mode: quiz
8
+ score:
9
+ result:
10
+ tags: [revise-record]
11
+ aliases: []
12
+ id: Review_Template
13
+ ---
14
+ ## 复习题目
15
+
16
+ <!-- AI指令:由 /revise 技能自动生成,不手动创建。根据关联知识笔记出题。 -->
17
+
18
+ ## 作答区
19
+
20
+ <!-- 用户在此作答,支持数学公式、代码块、多步推导 -->
21
+
22
+ ## 批改结果
23
+
24
+ <!-- /revise 批改后填写 -->
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: "{{TITLE}}"
3
+ type: wiki
4
+ domain: "{{DOMAIN}}"
5
+ created: "{{DATE}}"
6
+ tags: [wiki]
7
+ aliases: []
8
+ id: Wiki_Template
9
+ ---
10
+ # {{TITLE}}
11
+
12
+ <!-- AI指令:为单个概念创建原子化条目。定义必须精确,示例必须具体。 -->
13
+
14
+ ## 定义
15
+
16
+ [概念的清晰、简洁定义]
17
+
18
+ ## 要点
19
+
20
+ - [主要特征或功能]
21
+ - [重要方面]
22
+ - [值得注意的细节]
23
+
24
+ ## 示例
25
+
26
+ [实际示例或用例]
27
+
28
+ ## 相关概念
29
+
30
+ - [[相关概念1]]
31
+ - [[相关概念2]]
32
+
33
+ ## 参考资料
34
+
35
+ - [来源或文档]
package/bin/lifeos.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ const cmd = process.argv[2];
4
+ const CLI_COMMANDS = ['init', 'upgrade', 'doctor', 'rename', 'help', '--help', '-h', '--version', '-V'];
5
+ const SERVER_FLAGS = ['--vault-root'];
6
+
7
+ if (!cmd || SERVER_FLAGS.includes(cmd)) {
8
+ // No subcommand or server flags → start MCP server
9
+ import('../dist/server.js');
10
+ } else if (CLI_COMMANDS.includes(cmd)) {
11
+ import('../dist/cli/index.js')
12
+ .then(m => m.run(process.argv.slice(2)))
13
+ .catch(handleError);
14
+ } else {
15
+ import('../dist/cli/index.js')
16
+ .then(m => m.run(process.argv.slice(2)))
17
+ .catch(handleError);
18
+ }
19
+
20
+ function handleError(err) {
21
+ const msg = err instanceof Error ? err.message : String(err);
22
+ console.error(`\x1b[31m✗\x1b[0m ${msg}`);
23
+ process.exit(1);
24
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * citations.ts — 来源引用链查询。
3
+ *
4
+ * Returns source event IDs and refs for memory_items matching
5
+ * a given target (TaskBoard / UserProfile) and optional section/keyword.
6
+ */
7
+ import type Database from 'better-sqlite3';
8
+ import type { CitationsResult } from '../types.js';
9
+ /**
10
+ * Retrieve citation metadata (source event IDs, source refs) for memory items
11
+ * matching the given target and optional section/keyword filter.
12
+ *
13
+ * Returns an object with:
14
+ * - items: array of { itemId, slotKey, sourceEventIds, sourceRefs, content }
15
+ * - total: total count of matched items
16
+ */
17
+ export declare function getCitations(db: Database.Database, target: string, opts?: {
18
+ section?: string;
19
+ keyword?: string;
20
+ }): CitationsResult;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * citations.ts — 来源引用链查询。
3
+ *
4
+ * Returns source event IDs and refs for memory_items matching
5
+ * a given target (TaskBoard / UserProfile) and optional section/keyword.
6
+ */
7
+ import { inClause } from '../db/index.js';
8
+ import { loadsJsonList } from '../utils/shared.js';
9
+ // ─── getCitations ─────────────────────────────────────────────────────────────
10
+ /**
11
+ * Retrieve citation metadata (source event IDs, source refs) for memory items
12
+ * matching the given target and optional section/keyword filter.
13
+ *
14
+ * Returns an object with:
15
+ * - items: array of { itemId, slotKey, sourceEventIds, sourceRefs, content }
16
+ * - total: total count of matched items
17
+ */
18
+ export function getCitations(db, target, opts) {
19
+ const { section, keyword } = opts ?? {};
20
+ const conditions = ['target = ?', `status = 'active'`];
21
+ const params = [target];
22
+ if (section) {
23
+ conditions.push('section = ?');
24
+ params.push(section);
25
+ }
26
+ if (keyword) {
27
+ conditions.push('(content LIKE ? OR slot_key LIKE ?)');
28
+ params.push(`%${keyword}%`, `%${keyword}%`);
29
+ }
30
+ const rows = db
31
+ .prepare(`SELECT item_id, section, slot_key, content, source_event_ids, source_refs, updated_at
32
+ FROM memory_items
33
+ WHERE ${conditions.join(' AND ')}
34
+ ORDER BY updated_at DESC
35
+ LIMIT 50`)
36
+ .all(params);
37
+ const items = rows.map((r) => ({
38
+ itemId: r.item_id,
39
+ section: r.section,
40
+ slotKey: r.slot_key,
41
+ content: r.content.slice(0, 120) + (r.content.length > 120 ? '...' : ''),
42
+ sourceEventIds: loadsJsonList(r.source_event_ids),
43
+ sourceRefs: loadsJsonList(r.source_refs),
44
+ updatedAt: r.updated_at,
45
+ }));
46
+ // Gather all unique source event details
47
+ const allEventIds = [...new Set(items.flatMap((i) => i.sourceEventIds))];
48
+ let sourceEvents = [];
49
+ if (allEventIds.length > 0) {
50
+ const { clause, params: inParams } = inClause('event_id', allEventIds);
51
+ const eventRows = db
52
+ .prepare(`SELECT event_id, entry_type, summary, timestamp, skill_name
53
+ FROM session_log
54
+ WHERE ${clause}
55
+ ORDER BY timestamp DESC`)
56
+ .all(inParams);
57
+ sourceEvents = eventRows.map((r) => ({
58
+ eventId: r.event_id,
59
+ entryType: r.entry_type,
60
+ summary: r.summary,
61
+ timestamp: r.timestamp,
62
+ skillName: r.skill_name,
63
+ }));
64
+ }
65
+ return {
66
+ target,
67
+ section: section ?? null,
68
+ keyword: keyword ?? null,
69
+ total: items.length,
70
+ items,
71
+ sourceEvents,
72
+ };
73
+ }
74
+ //# sourceMappingURL=citations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citations.js","sourceRoot":"","sources":["../../src/active-docs/citations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC3B,EAAqB,EACrB,MAAc,EACd,IAA6C;IAE7C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAExC,MAAM,UAAU,GAAa,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAc,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,OAAO,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACb,OAAO,CACP;;eAEY,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;;gBAEvB,CACb;SACA,GAAG,CAAC,MAAM,CAQV,CAAC;IAEH,MAAM,KAAK,GAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACjD,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,UAAU;KACvB,CAAC,CAAC,CAAC;IAEJ,yCAAyC;IACzC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,YAAY,GAA0B,EAAE,CAAC;IAE7C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,EAAE;aAClB,OAAO,CACP;;iBAEa,MAAM;iCACU,CAC7B;aACA,GAAG,CAAC,QAAQ,CAMZ,CAAC;QAEH,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,CAAC,UAAU;SACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACN,MAAM;QACN,OAAO,EAAE,OAAO,IAAI,IAAI;QACxB,OAAO,EAAE,OAAO,IAAI,IAAI;QACxB,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK;QACL,YAAY;KACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * derived-memory.ts — memory_items 表的 CRUD 操作。
3
+ *
4
+ * Provides upsert, cleanup, and build helpers for the memory_items table.
5
+ * Memory items are derived knowledge stored under targets like TaskBoard/UserProfile.
6
+ */
7
+ import type Database from 'better-sqlite3';
8
+ import type { MemoryItem } from '../services/retrieval.js';
9
+ export interface BuildMemoryItemOpts {
10
+ target: string;
11
+ section: string;
12
+ slotKey: string;
13
+ content: string;
14
+ confidence?: string | null;
15
+ sourceEventIds?: string[];
16
+ sourceRefs?: string[];
17
+ relatedFiles?: string[];
18
+ manualFlag?: boolean;
19
+ expiresAt?: string | null;
20
+ }
21
+ /**
22
+ * Upsert a memory item into the memory_items table.
23
+ * If an active item with the same target+section+slot_key exists, update it.
24
+ * Otherwise, insert a new row.
25
+ * Returns the item_id of the upserted row.
26
+ */
27
+ export declare function upsertMemoryItem(db: Database.Database, item: MemoryItem): string;
28
+ /**
29
+ * Mark expired memory items as 'expired'.
30
+ * Items with expires_at < now are marked inactive.
31
+ * Returns the count of affected items.
32
+ */
33
+ export declare function cleanupExpiredItems(db: Database.Database, opts?: {
34
+ dryRun?: boolean;
35
+ }): {
36
+ deleted: number;
37
+ };
38
+ /**
39
+ * General cleanup: remove superseded and expired items.
40
+ * Superseded items are those with a non-null superseded_by that points to an active item.
41
+ * Returns the total deleted count.
42
+ */
43
+ export declare function cleanupMemoryItems(db: Database.Database, opts?: {
44
+ now?: Date | string;
45
+ dryRun?: boolean;
46
+ }): {
47
+ deleted: number;
48
+ };
49
+ /**
50
+ * Construct a MemoryItem object from build options.
51
+ * Does NOT write to the database — call upsertMemoryItem to persist.
52
+ */
53
+ export declare function buildMemoryItem(opts: BuildMemoryItemOpts): MemoryItem;
54
+ /**
55
+ * Query active memory items for a given target and optional section.
56
+ */
57
+ export declare function getActiveMemoryItems(db: Database.Database, target: string, section?: string | null): MemoryItem[];
@@ -0,0 +1,161 @@
1
+ /**
2
+ * derived-memory.ts — memory_items 表的 CRUD 操作。
3
+ *
4
+ * Provides upsert, cleanup, and build helpers for the memory_items table.
5
+ * Memory items are derived knowledge stored under targets like TaskBoard/UserProfile.
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ import { inClause } from '../db/index.js';
9
+ import { loadsJsonList } from '../utils/shared.js';
10
+ // ─── upsertMemoryItem ─────────────────────────────────────────────────────────
11
+ /**
12
+ * Upsert a memory item into the memory_items table.
13
+ * If an active item with the same target+section+slot_key exists, update it.
14
+ * Otherwise, insert a new row.
15
+ * Returns the item_id of the upserted row.
16
+ */
17
+ export function upsertMemoryItem(db, item) {
18
+ const now = new Date().toISOString();
19
+ // Check if an active item already exists for this target+section+slot_key
20
+ const existing = db
21
+ .prepare(`SELECT item_id FROM memory_items
22
+ WHERE target = ? AND section = ? AND slot_key = ? AND status = 'active'
23
+ LIMIT 1`)
24
+ .get([item.target, item.section, item.slotKey]);
25
+ const sourceEventIdsJson = JSON.stringify(item.sourceEventIds ?? []);
26
+ const sourceRefsJson = JSON.stringify(item.sourceRefs ?? []);
27
+ const relatedFilesJson = JSON.stringify(item.relatedFiles ?? []);
28
+ if (existing) {
29
+ db.prepare(`UPDATE memory_items SET
30
+ content = ?,
31
+ confidence = ?,
32
+ source_event_ids = ?,
33
+ source_refs = ?,
34
+ related_files = ?,
35
+ manual_flag = ?,
36
+ updated_at = ?,
37
+ expires_at = ?
38
+ WHERE item_id = ?`).run(item.content, item.confidence ?? null, sourceEventIdsJson, sourceRefsJson, relatedFilesJson, item.manualFlag ? 1 : 0, now, item.expiresAt ?? null, existing.item_id);
39
+ return existing.item_id;
40
+ }
41
+ const itemId = item.itemId || randomUUID();
42
+ db.prepare(`INSERT INTO memory_items
43
+ (item_id, target, section, slot_key, content, confidence,
44
+ source_event_ids, source_refs, related_files,
45
+ manual_flag, status, superseded_by, last_confirmed_at, updated_at, expires_at)
46
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', NULL, NULL, ?, ?)`).run(itemId, item.target, item.section, item.slotKey, item.content, item.confidence ?? null, sourceEventIdsJson, sourceRefsJson, relatedFilesJson, item.manualFlag ? 1 : 0, now, item.expiresAt ?? null);
47
+ return itemId;
48
+ }
49
+ // ─── cleanupExpiredItems ──────────────────────────────────────────────────────
50
+ /**
51
+ * Mark expired memory items as 'expired'.
52
+ * Items with expires_at < now are marked inactive.
53
+ * Returns the count of affected items.
54
+ */
55
+ export function cleanupExpiredItems(db, opts) {
56
+ const { dryRun = false } = opts ?? {};
57
+ const now = new Date().toISOString();
58
+ const rows = db
59
+ .prepare(`SELECT item_id FROM memory_items
60
+ WHERE expires_at IS NOT NULL AND expires_at < ? AND status = 'active'`)
61
+ .all([now]);
62
+ if (dryRun) {
63
+ return { deleted: rows.length };
64
+ }
65
+ if (rows.length === 0)
66
+ return { deleted: 0 };
67
+ const ids = rows.map((r) => r.item_id);
68
+ const { clause, params } = inClause('item_id', ids);
69
+ db.prepare(`UPDATE memory_items SET status = 'expired' WHERE ${clause}`).run(params);
70
+ return { deleted: ids.length };
71
+ }
72
+ // ─── cleanupMemoryItems ───────────────────────────────────────────────────────
73
+ /**
74
+ * General cleanup: remove superseded and expired items.
75
+ * Superseded items are those with a non-null superseded_by that points to an active item.
76
+ * Returns the total deleted count.
77
+ */
78
+ export function cleanupMemoryItems(db, opts) {
79
+ const { dryRun = false } = opts ?? {};
80
+ // Cleanup expired items
81
+ const expiredResult = cleanupExpiredItems(db, { dryRun });
82
+ // Cleanup superseded items (status = 'active' but superseded_by is set and resolved target exists)
83
+ const supersededRows = db
84
+ .prepare(`SELECT item_id FROM memory_items
85
+ WHERE superseded_by IS NOT NULL AND status = 'active'`)
86
+ .all();
87
+ let supersededCount = 0;
88
+ if (!dryRun && supersededRows.length > 0) {
89
+ const ids = supersededRows.map((r) => r.item_id);
90
+ const { clause, params } = inClause('item_id', ids);
91
+ db.prepare(`UPDATE memory_items SET status = 'superseded' WHERE ${clause}`).run(params);
92
+ supersededCount = ids.length;
93
+ }
94
+ else {
95
+ supersededCount = supersededRows.length;
96
+ }
97
+ return { deleted: expiredResult.deleted + supersededCount };
98
+ }
99
+ // ─── buildMemoryItem ──────────────────────────────────────────────────────────
100
+ /**
101
+ * Construct a MemoryItem object from build options.
102
+ * Does NOT write to the database — call upsertMemoryItem to persist.
103
+ */
104
+ export function buildMemoryItem(opts) {
105
+ const now = new Date().toISOString();
106
+ return {
107
+ itemId: randomUUID(),
108
+ target: opts.target,
109
+ section: opts.section,
110
+ slotKey: opts.slotKey,
111
+ content: opts.content,
112
+ confidence: opts.confidence ?? null,
113
+ sourceEventIds: opts.sourceEventIds ?? [],
114
+ sourceRefs: opts.sourceRefs ?? [],
115
+ relatedFiles: opts.relatedFiles ?? [],
116
+ manualFlag: opts.manualFlag ?? false,
117
+ status: 'active',
118
+ supersededBy: null,
119
+ lastConfirmedAt: null,
120
+ updatedAt: now,
121
+ expiresAt: opts.expiresAt ?? null,
122
+ };
123
+ }
124
+ // ─── getActiveMemoryItems ─────────────────────────────────────────────────────
125
+ /**
126
+ * Query active memory items for a given target and optional section.
127
+ */
128
+ export function getActiveMemoryItems(db, target, section) {
129
+ const conditions = ['target = ?', `status = 'active'`];
130
+ const params = [target];
131
+ if (section) {
132
+ conditions.push('section = ?');
133
+ params.push(section);
134
+ }
135
+ const rows = db
136
+ .prepare(`SELECT item_id, target, section, slot_key, content, confidence,
137
+ source_event_ids, source_refs, related_files,
138
+ manual_flag, status, superseded_by, last_confirmed_at, updated_at, expires_at
139
+ FROM memory_items
140
+ WHERE ${conditions.join(' AND ')}
141
+ ORDER BY updated_at DESC`)
142
+ .all(params);
143
+ return rows.map((row) => ({
144
+ itemId: String(row.item_id),
145
+ target: String(row.target),
146
+ section: String(row.section),
147
+ slotKey: String(row.slot_key),
148
+ content: String(row.content),
149
+ confidence: row.confidence != null ? String(row.confidence) : null,
150
+ sourceEventIds: loadsJsonList(row.source_event_ids),
151
+ sourceRefs: loadsJsonList(row.source_refs),
152
+ relatedFiles: loadsJsonList(row.related_files),
153
+ manualFlag: Number(row.manual_flag) !== 0,
154
+ status: String(row.status),
155
+ supersededBy: row.superseded_by != null ? String(row.superseded_by) : null,
156
+ lastConfirmedAt: row.last_confirmed_at != null ? String(row.last_confirmed_at) : null,
157
+ updatedAt: String(row.updated_at),
158
+ expiresAt: row.expires_at != null ? String(row.expires_at) : null,
159
+ }));
160
+ }
161
+ //# sourceMappingURL=derived-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-memory.js","sourceRoot":"","sources":["../../src/active-docs/derived-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAiBnD,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAqB,EAAE,IAAgB;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,EAAE;SACjB,OAAO,CACP;;eAEY,CACZ;SACA,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAoC,CAAC;IAEpF,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAEjE,IAAI,QAAQ,EAAE,CAAC;QACd,EAAE,CAAC,OAAO,CACT;;;;;;;;;yBASsB,CACtB,CAAC,GAAG,CACJ,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,IAAI,IAAI,EACvB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,GAAG,EACH,IAAI,CAAC,SAAS,IAAI,IAAI,EACtB,QAAQ,CAAC,OAAO,CAChB,CAAC;QACF,OAAO,QAAQ,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;IAC3C,EAAE,CAAC,OAAO,CACT;;;;uEAIqE,CACrE,CAAC,GAAG,CACJ,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,IAAI,IAAI,EACvB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,GAAG,EACH,IAAI,CAAC,SAAS,IAAI,IAAI,CACtB,CAAC;IAEF,OAAO,MAAM,CAAC;AACf,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAClC,EAAqB,EACrB,IAA2B;IAE3B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,EAAE;SACb,OAAO,CACP;6EAC0E,CAC1E;SACA,GAAG,CAAC,CAAC,GAAG,CAAC,CAA0B,CAAC;IAEtC,IAAI,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpD,EAAE,CAAC,OAAO,CAAC,oDAAoD,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAErF,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CACjC,EAAqB,EACrB,IAAgD;IAEhD,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAEtC,wBAAwB;IACxB,MAAM,aAAa,GAAG,mBAAmB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1D,mGAAmG;IACnG,MAAM,cAAc,GAAG,EAAE;SACvB,OAAO,CACP;6DAC0D,CAC1D;SACA,GAAG,EAA2B,CAAC;IAEjC,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpD,EAAE,CAAC,OAAO,CAAC,uDAAuD,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxF,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC;IAC9B,CAAC;SAAM,CAAC;QACP,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,GAAG,eAAe,EAAE,CAAC;AAC7D,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAyB;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACN,MAAM,EAAE,UAAU,EAAE;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,EAAE;QACzC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;QACrC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK;QACpC,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;KACjC,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CACnC,EAAqB,EACrB,MAAc,EACd,OAAuB;IAEvB,MAAM,UAAU,GAAa,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAc,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,OAAO,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACb,OAAO,CACP;;;;eAIY,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gCACP,CAC7B;SACA,GAAG,CAAC,MAAM,CAAoB,CAAC;IAEjC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;QAClE,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACnD,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;QAC1C,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;QAC9C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1E,eAAe,EAAE,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI;QACrF,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;KACjE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * active-docs/index.ts — 活文档路由与刷新入口。
3
+ *
4
+ * Orchestrates reading existing markdown files, rebuilding AUTO sections
5
+ * from DB data, and writing back. Preserves manual content outside AUTO markers.
6
+ */
7
+ import type Database from 'better-sqlite3';
8
+ import type { CitationsResult, RefreshResult } from '../types.js';
9
+ /**
10
+ * Returns the vault-relative path for TaskBoard.md
11
+ */
12
+ export declare function taskboardRelativePath(): string;
13
+ /**
14
+ * Returns the vault-relative path for UserProfile.md
15
+ */
16
+ export declare function userprofileRelativePath(): string;
17
+ /**
18
+ * Ensure TaskBoard.md and UserProfile.md exist in the memory directory.
19
+ * Creates skeleton files with AUTO section markers if missing.
20
+ */
21
+ export declare function ensureActiveDocsExist(vaultRoot: string): void;
22
+ /**
23
+ * Rebuild TaskBoard AUTO sections from DB data and write the file.
24
+ * Returns the updated sections map.
25
+ */
26
+ export declare function refreshTaskboard(db: Database.Database, vaultRoot: string, opts?: {
27
+ section?: string;
28
+ preserveManual?: boolean;
29
+ }): RefreshResult;
30
+ /**
31
+ * Rebuild UserProfile AUTO sections from DB data and write the file.
32
+ * Returns the updated sections map.
33
+ */
34
+ export declare function refreshUserprofile(db: Database.Database, vaultRoot: string, opts?: {
35
+ section?: string;
36
+ preserveManual?: boolean;
37
+ }): RefreshResult;
38
+ /**
39
+ * Get citations for TaskBoard items.
40
+ */
41
+ export declare function taskboardCitations(db: Database.Database, opts?: {
42
+ section?: string;
43
+ keyword?: string;
44
+ }): CitationsResult;
45
+ /**
46
+ * Get citations for UserProfile items.
47
+ */
48
+ export declare function userprofileCitations(db: Database.Database, opts?: {
49
+ section?: string;
50
+ keyword?: string;
51
+ }): CitationsResult;
@@ -0,0 +1,165 @@
1
+ /**
2
+ * active-docs/index.ts — 活文档路由与刷新入口。
3
+ *
4
+ * Orchestrates reading existing markdown files, rebuilding AUTO sections
5
+ * from DB data, and writing back. Preserves manual content outside AUTO markers.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { getVaultConfig, resolveConfig } from '../config.js';
10
+ import { getCitations } from './citations.js';
11
+ import { buildTaskboardSections } from './taskboard.js';
12
+ import { buildUserprofileSections } from './userprofile.js';
13
+ // ─── Path helpers ─────────────────────────────────────────────────────────────
14
+ /**
15
+ * Returns the vault-relative path for TaskBoard.md
16
+ */
17
+ export function taskboardRelativePath() {
18
+ return 'TaskBoard.md'; // relative to memory dir
19
+ }
20
+ /**
21
+ * Returns the vault-relative path for UserProfile.md
22
+ */
23
+ export function userprofileRelativePath() {
24
+ return 'UserProfile.md'; // relative to memory dir
25
+ }
26
+ /**
27
+ * Get the absolute path to the memory directory for a vault root.
28
+ */
29
+ function getMemoryDir(vaultRoot) {
30
+ const vc = getVaultConfig();
31
+ if (vc !== null)
32
+ return vc.memoryDir();
33
+ return resolveConfig(vaultRoot).memoryDir();
34
+ }
35
+ /**
36
+ * Ensure TaskBoard.md and UserProfile.md exist in the memory directory.
37
+ * Creates skeleton files with AUTO section markers if missing.
38
+ */
39
+ export function ensureActiveDocsExist(vaultRoot) {
40
+ const memDir = getMemoryDir(vaultRoot);
41
+ mkdirSync(memDir, { recursive: true });
42
+ const tbPath = join(memDir, 'TaskBoard.md');
43
+ if (!existsSync(tbPath)) {
44
+ writeFileSync(tbPath, buildTaskboardSkeleton(), 'utf-8');
45
+ }
46
+ const upPath = join(memDir, 'UserProfile.md');
47
+ if (!existsSync(upPath)) {
48
+ writeFileSync(upPath, buildUserprofileSkeleton(), 'utf-8');
49
+ }
50
+ }
51
+ // ─── Skeleton generators ──────────────────────────────────────────────────────
52
+ function buildSkeleton(type, title, sections) {
53
+ const date = new Date().toISOString().slice(0, 10);
54
+ const sectionBlocks = sections
55
+ .map(({ heading, marker }) => `## ${heading}\n<!-- BEGIN AUTO:${marker} -->\n暂无数据\n<!-- END AUTO:${marker} -->`)
56
+ .join('\n\n');
57
+ return `---\ntype: ${type}\ncreated: "${date}"\n---\n\n# ${title}\n\n${sectionBlocks}\n`;
58
+ }
59
+ function buildTaskboardSkeleton() {
60
+ return buildSkeleton('taskboard', 'TaskBoard', [
61
+ { heading: '当前焦点', marker: 'focus' },
62
+ { heading: '活跃项目', marker: 'active-projects' },
63
+ { heading: '待复习', marker: 'revises' },
64
+ { heading: '近期决策', marker: 'decisions' },
65
+ { heading: '活动日志', marker: 'update-log' },
66
+ ]);
67
+ }
68
+ function buildUserprofileSkeleton() {
69
+ return buildSkeleton('userprofile', 'UserProfile', [
70
+ { heading: '用户摘要', marker: 'profile-summary' },
71
+ { heading: '偏好设置', marker: 'preferences' },
72
+ { heading: '纠错记录', marker: 'corrections' },
73
+ { heading: '近期决策', marker: 'decisions' },
74
+ { heading: '学习进度', marker: 'learning-progress' },
75
+ ]);
76
+ }
77
+ // ─── AUTO section replacement ─────────────────────────────────────────────────
78
+ /**
79
+ * Replace the content of a single AUTO section in markdown text.
80
+ * Preserves all content outside the BEGIN/END markers.
81
+ */
82
+ function replaceAutoSection(content, marker, newContent) {
83
+ const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
84
+ const pattern = new RegExp(`(<!-- BEGIN AUTO:${escaped} -->\\n).*?(\\n<!-- END AUTO:${escaped} -->)`, 's');
85
+ if (!pattern.test(content)) {
86
+ // Marker not found — append section at end
87
+ return `${content.trimEnd()}\n\n<!-- BEGIN AUTO:${marker} -->\n${newContent}\n<!-- END AUTO:${marker} -->\n`;
88
+ }
89
+ return content.replace(pattern, `$1${newContent}$2`);
90
+ }
91
+ /**
92
+ * Rebuild all AUTO sections in a markdown document.
93
+ * If opts.section is provided, only rebuild that section.
94
+ */
95
+ function rebuildAutoSections(existingContent, sections, opts) {
96
+ const { section: targetSection } = opts ?? {};
97
+ let result = existingContent;
98
+ for (const [marker, newContent] of Object.entries(sections)) {
99
+ if (targetSection && marker !== targetSection)
100
+ continue;
101
+ result = replaceAutoSection(result, marker, newContent);
102
+ }
103
+ return result;
104
+ }
105
+ // ─── Refresh operations ───────────────────────────────────────────────────────
106
+ /**
107
+ * Rebuild TaskBoard AUTO sections from DB data and write the file.
108
+ * Returns the updated sections map.
109
+ */
110
+ export function refreshTaskboard(db, vaultRoot, opts) {
111
+ const memDir = getMemoryDir(vaultRoot);
112
+ mkdirSync(memDir, { recursive: true });
113
+ const tbPath = join(memDir, 'TaskBoard.md');
114
+ // Read existing content or create skeleton
115
+ const existing = existsSync(tbPath) ? readFileSync(tbPath, 'utf-8') : buildTaskboardSkeleton();
116
+ // Build new sections from DB
117
+ const sections = buildTaskboardSections(db, vaultRoot);
118
+ // Rebuild content
119
+ const updated = rebuildAutoSections(existing, sections, opts);
120
+ // Write back
121
+ writeFileSync(tbPath, updated, 'utf-8');
122
+ return {
123
+ status: 'ok',
124
+ path: tbPath,
125
+ sections: Object.keys(sections),
126
+ updatedSection: opts?.section ?? 'all',
127
+ };
128
+ }
129
+ /**
130
+ * Rebuild UserProfile AUTO sections from DB data and write the file.
131
+ * Returns the updated sections map.
132
+ */
133
+ export function refreshUserprofile(db, vaultRoot, opts) {
134
+ const memDir = getMemoryDir(vaultRoot);
135
+ mkdirSync(memDir, { recursive: true });
136
+ const upPath = join(memDir, 'UserProfile.md');
137
+ // Read existing content or create skeleton
138
+ const existing = existsSync(upPath) ? readFileSync(upPath, 'utf-8') : buildUserprofileSkeleton();
139
+ // Build new sections from DB
140
+ const sections = buildUserprofileSections(db, vaultRoot);
141
+ // Rebuild content
142
+ const updated = rebuildAutoSections(existing, sections, opts);
143
+ // Write back
144
+ writeFileSync(upPath, updated, 'utf-8');
145
+ return {
146
+ status: 'ok',
147
+ path: upPath,
148
+ sections: Object.keys(sections),
149
+ updatedSection: opts?.section ?? 'all',
150
+ };
151
+ }
152
+ // ─── Citation proxies ─────────────────────────────────────────────────────────
153
+ /**
154
+ * Get citations for TaskBoard items.
155
+ */
156
+ export function taskboardCitations(db, opts) {
157
+ return getCitations(db, 'TaskBoard', opts);
158
+ }
159
+ /**
160
+ * Get citations for UserProfile items.
161
+ */
162
+ export function userprofileCitations(db, opts) {
163
+ return getCitations(db, 'UserProfile', opts);
164
+ }
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/active-docs/index.ts"],"names":[],"mappings":"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"}