crewly 1.20.20 → 1.20.22

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 (181) hide show
  1. package/config/roles/generalist/prompt.md +8 -2
  2. package/config/roles/team-leader/prompt.md +2 -1
  3. package/config/skills/agent/core/wiki-query/SKILL.md +11 -0
  4. package/config/skills/agent/core/wiki-query/execute.sh +22 -3
  5. package/config/skills/orchestrator/wiki-ingest/SKILL.md +19 -0
  6. package/config/skills/orchestrator/wiki-ingest/execute.sh +36 -1
  7. package/config/skills/team-leader/wiki-review-proposals/SKILL.md +35 -0
  8. package/config/skills/team-leader/wiki-review-proposals/execute.sh +40 -0
  9. package/config/skills/team-leader/wiki-supersede/SKILL.md +38 -0
  10. package/config/skills/team-leader/wiki-supersede/execute.sh +44 -0
  11. package/dist/backend/backend/src/constants.d.ts +39 -0
  12. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  13. package/dist/backend/backend/src/constants.js +37 -0
  14. package/dist/backend/backend/src/constants.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +29 -0
  16. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +196 -4
  18. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +9 -1
  21. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
  22. package/dist/backend/backend/src/index.d.ts.map +1 -1
  23. package/dist/backend/backend/src/index.js +3 -0
  24. package/dist/backend/backend/src/index.js.map +1 -1
  25. package/dist/backend/backend/src/services/memory/memory.service.d.ts +2 -0
  26. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/memory/memory.service.js +16 -4
  28. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  29. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +3 -1
  30. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  31. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +14 -3
  32. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  33. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +0 -10
  34. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  35. package/dist/backend/backend/src/services/slack/slack-initializer.js +21 -0
  36. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  37. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +3 -1
  38. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +26 -9
  40. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +22 -1
  42. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +69 -7
  44. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/wiki/schema-loader.service.d.ts +9 -0
  46. package/dist/backend/backend/src/services/wiki/schema-loader.service.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/wiki/schema-loader.service.js +40 -1
  48. package/dist/backend/backend/src/services/wiki/schema-loader.service.js.map +1 -1
  49. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +32 -0
  50. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +63 -1
  52. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts +2 -0
  54. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +9 -2
  56. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/wiki/wiki-curation.service.d.ts +106 -0
  58. package/dist/backend/backend/src/services/wiki/wiki-curation.service.d.ts.map +1 -0
  59. package/dist/backend/backend/src/services/wiki/wiki-curation.service.js +211 -0
  60. package/dist/backend/backend/src/services/wiki/wiki-curation.service.js.map +1 -0
  61. package/dist/backend/backend/src/services/wiki/wiki-history.service.d.ts +63 -0
  62. package/dist/backend/backend/src/services/wiki/wiki-history.service.d.ts.map +1 -0
  63. package/dist/backend/backend/src/services/wiki/wiki-history.service.js +124 -0
  64. package/dist/backend/backend/src/services/wiki/wiki-history.service.js.map +1 -0
  65. package/dist/backend/backend/src/services/wiki/wiki-index.service.d.ts +119 -0
  66. package/dist/backend/backend/src/services/wiki/wiki-index.service.d.ts.map +1 -0
  67. package/dist/backend/backend/src/services/wiki/wiki-index.service.js +263 -0
  68. package/dist/backend/backend/src/services/wiki/wiki-index.service.js.map +1 -0
  69. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +66 -11
  70. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +162 -44
  72. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts +31 -0
  74. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +69 -0
  76. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.d.ts +29 -0
  78. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.d.ts.map +1 -0
  79. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.js +55 -0
  80. package/dist/backend/backend/src/services/wiki/wiki-owner.resolver.js.map +1 -0
  81. package/dist/backend/backend/src/services/wiki/wiki-page.d.ts +101 -0
  82. package/dist/backend/backend/src/services/wiki/wiki-page.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/wiki/wiki-page.js +130 -0
  84. package/dist/backend/backend/src/services/wiki/wiki-page.js.map +1 -0
  85. package/dist/backend/backend/src/services/wiki/wiki-policy.d.ts +35 -0
  86. package/dist/backend/backend/src/services/wiki/wiki-policy.d.ts.map +1 -0
  87. package/dist/backend/backend/src/services/wiki/wiki-policy.js +44 -0
  88. package/dist/backend/backend/src/services/wiki/wiki-policy.js.map +1 -0
  89. package/dist/backend/backend/src/services/wiki/wiki-process.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/wiki/wiki-process.service.js +5 -2
  91. package/dist/backend/backend/src/services/wiki/wiki-process.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +57 -13
  93. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/wiki/wiki-query.service.js +91 -54
  95. package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/wiki/wiki-redaction.d.ts +74 -0
  97. package/dist/backend/backend/src/services/wiki/wiki-redaction.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/wiki/wiki-redaction.js +94 -0
  99. package/dist/backend/backend/src/services/wiki/wiki-redaction.js.map +1 -0
  100. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +12 -3
  101. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +19 -9
  103. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  104. package/dist/backend/backend/src/services/wiki/wiki-usage.service.d.ts +96 -0
  105. package/dist/backend/backend/src/services/wiki/wiki-usage.service.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/wiki/wiki-usage.service.js +147 -0
  107. package/dist/backend/backend/src/services/wiki/wiki-usage.service.js.map +1 -0
  108. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts +25 -0
  109. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js +52 -0
  111. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js.map +1 -0
  112. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +19 -1
  113. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  114. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +47 -6
  115. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  116. package/dist/backend/backend/src/services/wiki/wiki.types.d.ts +24 -0
  117. package/dist/backend/backend/src/services/wiki/wiki.types.d.ts.map +1 -1
  118. package/dist/backend/build-info.json +2 -2
  119. package/dist/cli/backend/src/constants.d.ts +39 -0
  120. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  121. package/dist/cli/backend/src/constants.js +37 -0
  122. package/dist/cli/backend/src/constants.js.map +1 -1
  123. package/dist/cli/backend/src/services/memory/memory.service.d.ts +2 -0
  124. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  125. package/dist/cli/backend/src/services/memory/memory.service.js +16 -4
  126. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  127. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +3 -1
  128. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  129. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +14 -3
  130. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  131. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +3 -1
  132. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  133. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +26 -9
  134. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  135. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +22 -1
  136. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  137. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +69 -7
  138. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  139. package/dist/cli/backend/src/services/wiki/schema-loader.service.d.ts +9 -0
  140. package/dist/cli/backend/src/services/wiki/schema-loader.service.d.ts.map +1 -1
  141. package/dist/cli/backend/src/services/wiki/schema-loader.service.js +40 -1
  142. package/dist/cli/backend/src/services/wiki/schema-loader.service.js.map +1 -1
  143. package/dist/cli/backend/src/services/wiki/wiki-history.service.d.ts +63 -0
  144. package/dist/cli/backend/src/services/wiki/wiki-history.service.d.ts.map +1 -0
  145. package/dist/cli/backend/src/services/wiki/wiki-history.service.js +124 -0
  146. package/dist/cli/backend/src/services/wiki/wiki-history.service.js.map +1 -0
  147. package/dist/cli/backend/src/services/wiki/wiki-index.service.d.ts +119 -0
  148. package/dist/cli/backend/src/services/wiki/wiki-index.service.d.ts.map +1 -0
  149. package/dist/cli/backend/src/services/wiki/wiki-index.service.js +263 -0
  150. package/dist/cli/backend/src/services/wiki/wiki-index.service.js.map +1 -0
  151. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +66 -11
  152. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  153. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js +162 -44
  154. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  155. package/dist/cli/backend/src/services/wiki/wiki-page.d.ts +101 -0
  156. package/dist/cli/backend/src/services/wiki/wiki-page.d.ts.map +1 -0
  157. package/dist/cli/backend/src/services/wiki/wiki-page.js +130 -0
  158. package/dist/cli/backend/src/services/wiki/wiki-page.js.map +1 -0
  159. package/dist/cli/backend/src/services/wiki/wiki-policy.d.ts +35 -0
  160. package/dist/cli/backend/src/services/wiki/wiki-policy.d.ts.map +1 -0
  161. package/dist/cli/backend/src/services/wiki/wiki-policy.js +44 -0
  162. package/dist/cli/backend/src/services/wiki/wiki-policy.js.map +1 -0
  163. package/dist/cli/backend/src/services/wiki/wiki-redaction.d.ts +74 -0
  164. package/dist/cli/backend/src/services/wiki/wiki-redaction.d.ts.map +1 -0
  165. package/dist/cli/backend/src/services/wiki/wiki-redaction.js +94 -0
  166. package/dist/cli/backend/src/services/wiki/wiki-redaction.js.map +1 -0
  167. package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts +12 -3
  168. package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  169. package/dist/cli/backend/src/services/wiki/wiki-search.service.js +19 -9
  170. package/dist/cli/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  171. package/dist/cli/backend/src/services/wiki/wiki-usage.service.d.ts +96 -0
  172. package/dist/cli/backend/src/services/wiki/wiki-usage.service.d.ts.map +1 -0
  173. package/dist/cli/backend/src/services/wiki/wiki-usage.service.js +147 -0
  174. package/dist/cli/backend/src/services/wiki/wiki-usage.service.js.map +1 -0
  175. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts +25 -0
  176. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -0
  177. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js +52 -0
  178. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js.map +1 -0
  179. package/dist/cli/backend/src/services/wiki/wiki.types.d.ts +24 -0
  180. package/dist/cli/backend/src/services/wiki/wiki.types.d.ts.map +1 -1
  181. package/package.json +1 -1
@@ -2,6 +2,14 @@
2
2
  * WikiQueryService — read a vault and build the `system-context` payload
3
3
  * that the caller's runtime feeds to its LLM for synthesis.
4
4
  *
5
+ * Retrieval is two-step: the payload leads with the vault's one-line
6
+ * index (`llm-curated/index.md`, trimmed to the query's neighbourhood
7
+ * when it would not fit), then BM25 candidate pages; the caller picks
8
+ * 3–5 paths and asks again with `pages` to get them in full. Superseded
9
+ * pages and pages the viewer's role may not see never appear. Every call
10
+ * is written to the vault's usage ledger (what was asked, what was read,
11
+ * whether it was a miss).
12
+ *
5
13
  * Per v2.1 spec §3 the skill is split into two halves:
6
14
  * - System-context (LLM-agnostic) → what this service produces
7
15
  * - Task-instruction (per-LLM) → lives on disk under
@@ -15,6 +23,9 @@
15
23
  */
16
24
  import { SchemaLoaderService } from './schema-loader.service.js';
17
25
  import { VaultSchema } from './wiki.types.js';
26
+ import { WikiIndexService } from './wiki-index.service.js';
27
+ import { WikiUsageService } from './wiki-usage.service.js';
28
+ import { type WikiPageFrontmatter } from './wiki-page.js';
18
29
  export interface WikiQueryInput {
19
30
  /** Absolute path to the vault root. */
20
31
  vaultPath: string;
@@ -24,6 +35,14 @@ export interface WikiQueryInput {
24
35
  topK?: number;
25
36
  /** How many tail log.md entries to include (default 20). */
26
37
  recentLogEntries?: number;
38
+ /** Step 2: vault-relative pages to return in full (max 8). */
39
+ pages?: string[];
40
+ /** Who is asking (session name) — for the usage ledger. */
41
+ agent?: string;
42
+ /** Reader's role — pages whose `visibility` excludes it are hidden. Undefined = owner. */
43
+ viewerRole?: string;
44
+ /** Include superseded pages (default false). */
45
+ includeSuperseded?: boolean;
27
46
  }
28
47
  export interface WikiLogEntry {
29
48
  timestamp: string;
@@ -40,12 +59,27 @@ export interface WikiCandidatePage {
40
59
  /** Simple keyword overlap score; higher = more relevant. */
41
60
  score: number;
42
61
  }
62
+ /** A page returned in full (step 2). */
63
+ export interface WikiFullPage {
64
+ path: string;
65
+ frontmatter: Partial<WikiPageFrontmatter>;
66
+ content: string;
67
+ truncated: boolean;
68
+ }
43
69
  export interface WikiQuerySystemContext {
44
70
  vault: {
45
71
  scope: VaultSchema['vault_scope'];
46
72
  id: string;
47
73
  path: string;
48
74
  };
75
+ /** Step 1: the one-line-per-page index (trimmed to the query when large). */
76
+ index: {
77
+ text: string;
78
+ truncated: boolean;
79
+ entries: number;
80
+ };
81
+ /** Step 2: pages the caller asked for in full. */
82
+ pages: WikiFullPage[];
49
83
  schemaSummary: {
50
84
  hardcoded: Array<{
51
85
  path: string;
@@ -81,7 +115,9 @@ export declare class WikiQueryService {
81
115
  private static instance;
82
116
  private readonly logger;
83
117
  private readonly schemaLoader;
84
- constructor(schemaLoader?: SchemaLoaderService);
118
+ private readonly index;
119
+ private readonly usage;
120
+ constructor(schemaLoader?: SchemaLoaderService, index?: WikiIndexService, usage?: WikiUsageService);
85
121
  static getInstance(): WikiQueryService;
86
122
  /** Test-only reset. */
87
123
  static _resetForTesting(): void;
@@ -103,23 +139,31 @@ export declare class WikiQueryService {
103
139
  */
104
140
  private readRecentLog;
105
141
  /**
106
- * Gather the vault's NON-frozen (`llm-curated/`) `.md` pages and rank them by
107
- * Okapi BM25 against the query, reusing {@link WikiSearchService.searchCorpus}
108
- * so the agent-facing `wiki-query` skill scores identically to the wiki UI
109
- * search. IDF is computed over exactly the gathered pages, preserving this
110
- * skill's scope: only curated pages are eligible, and `llm-curated/log.md`
111
- * is excluded (it is surfaced separately as `recentLog`).
142
+ * Rank the vault's `llm-curated/` pages by Okapi BM25 against the query,
143
+ * reusing {@link WikiSearchService.searchCorpus} so the agent-facing
144
+ * skill scores identically to the wiki UI search. Seed files (index,
145
+ * log) are excluded; superseded/invisible/proposed pages are dropped by
146
+ * the search filters.
147
+ *
148
+ * @param vaultPath - Vault root
149
+ * @param query - Query text
150
+ * @param topK - How many candidates
151
+ * @param filters - Viewer/superseded filters
152
+ * @returns Candidates with truncated excerpts
112
153
  */
113
154
  private findCandidatePages;
114
155
  /**
115
- * Collect candidate `.md` pages under the schema's `llm-curated/` roots,
116
- * skipping dotfile/`node_modules` dirs and `llm-curated/log.md`.
156
+ * Step 2: return the requested pages in full (frontmatter + content),
157
+ * honouring frozen paths, visibility and supersession. Unknown paths
158
+ * are skipped silently (the caller sees which ones came back).
117
159
  *
118
- * @param vaultPath - Absolute vault root.
119
- * @param schema - Loaded vault schema (defines the curated roots).
120
- * @returns Page refs as `{ relativePath (POSIX), absPath }`.
160
+ * @param vaultPath - Vault root
161
+ * @param schema - Vault schema (frozen folders are readable — SOPs/norms are knowledge too)
162
+ * @param requested - Vault-relative paths
163
+ * @param filters - Viewer/superseded filters
164
+ * @returns Pages in request order
121
165
  */
122
- private gatherCuratedPages;
166
+ private readFullPages;
123
167
  private readExcerpt;
124
168
  }
125
169
  //# sourceMappingURL=wiki-query.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-query.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO9C,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,aAAa,EAAE;QACb,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxD,UAAU,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;KAC1C,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,4DAA4D;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAA;CAAE,GAC7C,gBAAgB,CAAC;AAErB;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAEvC,YAAY,CAAC,EAAE,mBAAmB;IAK9C,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAqE5D,OAAO,CAAC,QAAQ;IAmChB;;;;;;;;;OASG;YACW,aAAa;IA8C3B;;;;;;;OAOG;YACW,kBAAkB;IAmBhC;;;;;;;OAOG;YACW,kBAAkB;YAyClB,WAAW;CAS1B"}
1
+ {"version":3,"file":"wiki-query.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,14 @@
2
2
  * WikiQueryService — read a vault and build the `system-context` payload
3
3
  * that the caller's runtime feeds to its LLM for synthesis.
4
4
  *
5
+ * Retrieval is two-step: the payload leads with the vault's one-line
6
+ * index (`llm-curated/index.md`, trimmed to the query's neighbourhood
7
+ * when it would not fit), then BM25 candidate pages; the caller picks
8
+ * 3–5 paths and asks again with `pages` to get them in full. Superseded
9
+ * pages and pages the viewer's role may not see never appear. Every call
10
+ * is written to the vault's usage ledger (what was asked, what was read,
11
+ * whether it was a miss).
12
+ *
5
13
  * Per v2.1 spec §3 the skill is split into two halves:
6
14
  * - System-context (LLM-agnostic) → what this service produces
7
15
  * - Task-instruction (per-LLM) → lives on disk under
@@ -17,11 +25,16 @@ import * as path from 'path';
17
25
  import * as fs from 'fs/promises';
18
26
  import { LoggerService } from '../core/logger.service.js';
19
27
  import { SchemaLoaderService } from './schema-loader.service.js';
20
- import { WikiSearchService } from './wiki-search.service.js';
28
+ import { WikiSearchService, tokenize } from './wiki-search.service.js';
29
+ import { WikiIndexService } from './wiki-index.service.js';
30
+ import { WikiUsageService } from './wiki-usage.service.js';
31
+ import { parsePage, isVisibleTo } from './wiki-page.js';
32
+ import { walkCuratedPages, isSeedFile } from './wiki-vault-walk.js';
21
33
  const DEFAULT_RECENT_LOG_ENTRIES = 20;
22
34
  const DEFAULT_TOP_K_PAGES = 5;
23
35
  const MAX_PAGE_BYTES = 8 * 1024; // truncate per-page excerpt
24
- const MAX_TOTAL_PAGES_SCANNED = 200; // safety cap on filesystem walk
36
+ const MAX_FULL_PAGE_BYTES = 64 * 1024; // cap for a page returned in full (step 2)
37
+ const MAX_FULL_PAGES = 8; // how many full pages one call may return
25
38
  /**
26
39
  * Reads a vault and builds the system-context payload the caller's LLM
27
40
  * synthesizes against. Stateless. No LLM calls inside this service.
@@ -30,9 +43,13 @@ export class WikiQueryService {
30
43
  static instance = null;
31
44
  logger;
32
45
  schemaLoader;
33
- constructor(schemaLoader) {
46
+ index;
47
+ usage;
48
+ constructor(schemaLoader, index, usage) {
34
49
  this.logger = LoggerService.getInstance().createComponentLogger('WikiQuery');
35
50
  this.schemaLoader = schemaLoader ?? new SchemaLoaderService();
51
+ this.index = index ?? WikiIndexService.getInstance();
52
+ this.usage = usage ?? WikiUsageService.getInstance();
36
53
  }
37
54
  static getInstance() {
38
55
  if (!this.instance) {
@@ -65,14 +82,29 @@ export class WikiQueryService {
65
82
  }
66
83
  const topK = input.topK ?? DEFAULT_TOP_K_PAGES;
67
84
  const recentN = input.recentLogEntries ?? DEFAULT_RECENT_LOG_ENTRIES;
85
+ const filters = { viewerRole: input.viewerRole, includeSuperseded: input.includeSuperseded === true };
86
+ const index = await this.index.readForQuery(input.vaultPath, tokenize(input.query));
68
87
  const recentLog = await this.readRecentLog(input.vaultPath, recentN);
69
- const candidatePages = await this.findCandidatePages(input.vaultPath, schema, input.query, topK);
88
+ const candidatePages = await this.findCandidatePages(input.vaultPath, input.query, topK, filters);
89
+ const pages = await this.readFullPages(input.vaultPath, schema, input.pages ?? [], filters);
90
+ // Usage ledger: what was read counts as a hit; a query that surfaced
91
+ // nothing (no full pages, no candidates) is a capture gap.
92
+ const hits = [...new Set([...pages.map((p) => p.path), ...candidatePages.map((c) => c.path)])];
93
+ await this.usage.record(input.vaultPath, {
94
+ via: 'wiki-query',
95
+ agent: input.agent ?? 'unknown',
96
+ query: input.query,
97
+ hits,
98
+ miss: hits.length === 0,
99
+ });
70
100
  const context = {
71
101
  vault: {
72
102
  scope: schema.vault_scope,
73
103
  id: schema.vault_id,
74
104
  path: input.vaultPath,
75
105
  },
106
+ index,
107
+ pages,
76
108
  schemaSummary: {
77
109
  hardcoded: schema.hardcoded.map((h) => ({
78
110
  path: h.path,
@@ -89,10 +121,13 @@ export class WikiQueryService {
89
121
  recentLog,
90
122
  candidatePages,
91
123
  callerNotes: [
124
+ 'Two-step retrieval: read `index` first, pick 3–5 relevant paths, then call wiki-query again with `pages` set to read them in full. Do not answer from index lines alone.',
92
125
  'Cite pages by their relative path inside the vault.',
93
126
  'Do not propose writes into any frozenPaths — refuse or redirect to llm-curated/.',
94
- 'Treat candidatePages.excerpt as truncated; ask wiki-query again with a refined query if you need full content.',
127
+ 'candidatePages.excerpt is truncated; `pages` returns full content.',
128
+ 'Pages marked superseded are hidden; ask with includeSuperseded when you need the history of a judgement.',
95
129
  'The recentLog is append-only audit; never propose rewrites to its content.',
130
+ 'If nothing here answers the question, say so — that miss is recorded as a capture gap.',
96
131
  ],
97
132
  };
98
133
  this.logger.debug('WikiQuery built system-context', {
@@ -192,18 +227,23 @@ export class WikiQueryService {
192
227
  return entries.slice(-limit).reverse();
193
228
  }
194
229
  /**
195
- * Gather the vault's NON-frozen (`llm-curated/`) `.md` pages and rank them by
196
- * Okapi BM25 against the query, reusing {@link WikiSearchService.searchCorpus}
197
- * so the agent-facing `wiki-query` skill scores identically to the wiki UI
198
- * search. IDF is computed over exactly the gathered pages, preserving this
199
- * skill's scope: only curated pages are eligible, and `llm-curated/log.md`
200
- * is excluded (it is surfaced separately as `recentLog`).
230
+ * Rank the vault's `llm-curated/` pages by Okapi BM25 against the query,
231
+ * reusing {@link WikiSearchService.searchCorpus} so the agent-facing
232
+ * skill scores identically to the wiki UI search. Seed files (index,
233
+ * log) are excluded; superseded/invisible/proposed pages are dropped by
234
+ * the search filters.
235
+ *
236
+ * @param vaultPath - Vault root
237
+ * @param query - Query text
238
+ * @param topK - How many candidates
239
+ * @param filters - Viewer/superseded filters
240
+ * @returns Candidates with truncated excerpts
201
241
  */
202
- async findCandidatePages(vaultPath, schema, query, topK) {
203
- const docs = await this.gatherCuratedPages(vaultPath, schema);
242
+ async findCandidatePages(vaultPath, query, topK, filters) {
243
+ const docs = (await walkCuratedPages(vaultPath)).filter((p) => !isSeedFile(p.relativePath));
204
244
  if (docs.length === 0)
205
245
  return [];
206
- const hits = await WikiSearchService.getInstance().searchCorpus(vaultPath, docs, query);
246
+ const hits = await WikiSearchService.getInstance().searchCorpus(vaultPath, docs, query, filters);
207
247
  const candidates = [];
208
248
  for (const hit of hits.slice(0, topK)) {
209
249
  const excerpt = await this.readExcerpt(path.join(vaultPath, hit.relativePath));
@@ -212,50 +252,47 @@ export class WikiQueryService {
212
252
  return candidates;
213
253
  }
214
254
  /**
215
- * Collect candidate `.md` pages under the schema's `llm-curated/` roots,
216
- * skipping dotfile/`node_modules` dirs and `llm-curated/log.md`.
255
+ * Step 2: return the requested pages in full (frontmatter + content),
256
+ * honouring frozen paths, visibility and supersession. Unknown paths
257
+ * are skipped silently (the caller sees which ones came back).
217
258
  *
218
- * @param vaultPath - Absolute vault root.
219
- * @param schema - Loaded vault schema (defines the curated roots).
220
- * @returns Page refs as `{ relativePath (POSIX), absPath }`.
259
+ * @param vaultPath - Vault root
260
+ * @param schema - Vault schema (frozen folders are readable — SOPs/norms are knowledge too)
261
+ * @param requested - Vault-relative paths
262
+ * @param filters - Viewer/superseded filters
263
+ * @returns Pages in request order
221
264
  */
222
- async gatherCuratedPages(vaultPath, schema) {
223
- const llmCuratedRoots = schema.llm_curated.map((l) => path.join(vaultPath, l.path.replace(/[/\\]+$/, '')));
224
- const docs = [];
225
- let scanned = 0;
226
- for (const root of llmCuratedRoots) {
227
- const stack = [root];
228
- while (stack.length > 0 && scanned < MAX_TOTAL_PAGES_SCANNED) {
229
- const current = stack.pop();
230
- let entries;
231
- try {
232
- entries = await fs.readdir(current, { withFileTypes: true });
233
- }
234
- catch {
235
- continue;
236
- }
237
- for (const entry of entries) {
238
- const full = path.join(current, entry.name);
239
- if (entry.isDirectory()) {
240
- if (entry.name.startsWith('.') || entry.name === 'node_modules')
241
- continue;
242
- stack.push(full);
243
- continue;
244
- }
245
- if (!entry.isFile())
246
- continue;
247
- if (!entry.name.endsWith('.md'))
248
- continue;
249
- const rel = path.relative(vaultPath, full).replace(/\\/g, '/');
250
- // Skip log.md — it's surfaced separately as recentLog.
251
- if (rel === 'llm-curated/log.md')
252
- continue;
253
- scanned++;
254
- docs.push({ relativePath: rel, absPath: full });
255
- }
265
+ async readFullPages(vaultPath, schema, requested, filters) {
266
+ void schema;
267
+ const out = [];
268
+ for (const raw of requested.slice(0, MAX_FULL_PAGES)) {
269
+ const rel = String(raw).replace(/\\/g, '/').replace(/^\/+/, '');
270
+ if (!rel.endsWith('.md') || rel.includes('..'))
271
+ continue;
272
+ const abs = path.resolve(vaultPath, rel);
273
+ if (!abs.startsWith(path.resolve(vaultPath) + path.sep))
274
+ continue;
275
+ let content;
276
+ try {
277
+ content = await fs.readFile(abs, 'utf8');
278
+ }
279
+ catch {
280
+ continue;
256
281
  }
282
+ const page = parsePage(content);
283
+ if (page.frontmatter.superseded_by && !filters.includeSuperseded)
284
+ continue;
285
+ if (!isVisibleTo(page.frontmatter, filters.viewerRole))
286
+ continue;
287
+ const truncated = Buffer.byteLength(content, 'utf8') > MAX_FULL_PAGE_BYTES;
288
+ out.push({
289
+ path: rel,
290
+ frontmatter: page.frontmatter,
291
+ content: truncated ? content.slice(0, MAX_FULL_PAGE_BYTES) + '\n\n…[truncated]' : content,
292
+ truncated,
293
+ });
257
294
  }
258
- return docs;
295
+ return out;
259
296
  }
260
297
  async readExcerpt(absolutePath) {
261
298
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-query.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wiki-query.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Confidentiality gate for vault writes.
3
+ *
4
+ * Secrets (tokens, keys, passwords) are never allowed into a vault: the
5
+ * write is refused and the pattern that matched is named — never the
6
+ * value. PII (emails, phone numbers) is governed per vault by the
7
+ * `privacy:` block in SCHEMA.md: a personal vault refuses or masks
8
+ * inbound customer detail, an enterprise vault holds customer data by
9
+ * design and the rule flips to "mask on the way out" (visibility).
10
+ *
11
+ * @module services/wiki/wiki-redaction
12
+ */
13
+ /** A detector: name + regex; `mask` is what replaces a match when masking. */
14
+ export interface RedactionPattern {
15
+ name: string;
16
+ regex: RegExp;
17
+ mask: string;
18
+ }
19
+ /** Secret detectors — always enforced, never configurable off. */
20
+ export declare const SECRET_PATTERNS: readonly RedactionPattern[];
21
+ /** PII detectors — enforced per the vault's `privacy:` policy. */
22
+ export declare const PII_PATTERNS: readonly RedactionPattern[];
23
+ /** What the vault wants done with PII on the way in. */
24
+ export type PiiMode = 'allow' | 'mask' | 'refuse';
25
+ /** Privacy policy of a vault (SCHEMA.md `privacy:` block; defaults shown). */
26
+ export interface VaultPrivacyPolicy {
27
+ /** `allow` (enterprise KB: customer data is the content), `mask`, or `refuse` (personal KB). Default `allow`. */
28
+ pii: PiiMode;
29
+ }
30
+ /** Outcome of scanning a body. */
31
+ export interface RedactionScan {
32
+ /** Names of secret patterns that matched (values are never returned). */
33
+ secrets: string[];
34
+ /** Names of PII patterns that matched. */
35
+ pii: string[];
36
+ }
37
+ /**
38
+ * Scan text for secrets and PII without altering it.
39
+ *
40
+ * @param text - Body to scan
41
+ * @returns Which pattern names matched
42
+ */
43
+ export declare function scanForSensitive(text: string): RedactionScan;
44
+ /**
45
+ * Replace every secret match with its mask (and PII when asked). Used for
46
+ * archives and outbound copies where the text must survive but the values
47
+ * must not.
48
+ *
49
+ * @param text - Body
50
+ * @param includePii - Also mask PII
51
+ * @returns Masked text
52
+ */
53
+ export declare function redactSensitive(text: string, includePii?: boolean): string;
54
+ /** Result of applying a vault's policy to an inbound body. */
55
+ export type PrivacyGateResult = {
56
+ ok: true;
57
+ body: string;
58
+ masked: string[];
59
+ } | {
60
+ ok: false;
61
+ reason: 'secret_detected' | 'pii_refused';
62
+ patterns: string[];
63
+ message: string;
64
+ };
65
+ /**
66
+ * Apply the confidentiality gate to a body about to be written.
67
+ * Secrets always refuse; PII follows `policy.pii`.
68
+ *
69
+ * @param body - Text to write
70
+ * @param policy - The vault's privacy policy
71
+ * @returns The (possibly masked) body, or a refusal naming the patterns
72
+ */
73
+ export declare function applyPrivacyGate(body: string, policy: VaultPrivacyPolicy): PrivacyGateResult;
74
+ //# sourceMappingURL=wiki-redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-redaction.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-redaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kEAAkE;AAClE,eAAO,MAAM,eAAe,EAAE,SAAS,gBAAgB,EAYtD,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,YAAY,EAAE,SAAS,gBAAgB,EAInD,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElD,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,iHAAiH;IACjH,GAAG,EAAE,OAAO,CAAC;CACd;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAI5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM,CAKxE;AAED,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAwB5F"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Confidentiality gate for vault writes.
3
+ *
4
+ * Secrets (tokens, keys, passwords) are never allowed into a vault: the
5
+ * write is refused and the pattern that matched is named — never the
6
+ * value. PII (emails, phone numbers) is governed per vault by the
7
+ * `privacy:` block in SCHEMA.md: a personal vault refuses or masks
8
+ * inbound customer detail, an enterprise vault holds customer data by
9
+ * design and the rule flips to "mask on the way out" (visibility).
10
+ *
11
+ * @module services/wiki/wiki-redaction
12
+ */
13
+ /** Secret detectors — always enforced, never configurable off. */
14
+ export const SECRET_PATTERNS = [
15
+ { name: 'slack_token', regex: /\bxox[abprse]-\d{6,}-[A-Za-z0-9-]{8,}/g, mask: '[REDACTED slack_token]' },
16
+ { name: 'slack_config_token', regex: /\bxoxe(?:\.xoxp)?-\d-[A-Za-z0-9-]{20,}/g, mask: '[REDACTED slack_config_token]' },
17
+ { name: 'openai_key', regex: /\bsk-(?:proj-|ant-)?[A-Za-z0-9_-]{20,}/g, mask: '[REDACTED api_key]' },
18
+ { name: 'aws_access_key', regex: /\bAKIA[0-9A-Z]{16}\b/g, mask: '[REDACTED aws_key]' },
19
+ { name: 'github_token', regex: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}/g, mask: '[REDACTED github_token]' },
20
+ { name: 'google_api_key', regex: /\bAIza[0-9A-Za-z_-]{30,}/g, mask: '[REDACTED google_key]' },
21
+ { name: 'private_key_block', regex: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, mask: '[REDACTED private_key]' },
22
+ { name: 'jwt', regex: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, mask: '[REDACTED jwt]' },
23
+ { name: 'bearer_header', regex: /\bBearer\s+[A-Za-z0-9._~+/=-]{20,}/g, mask: 'Bearer [REDACTED]' },
24
+ { name: 'password_assignment', regex: /\b(?:password|passwd|pwd|secret)\s*[:=]\s*["']?(?!\s)[^\s"',;]{6,}/gi, mask: 'password=[REDACTED]' },
25
+ { name: 'connection_string', regex: /\b(?:mongodb(?:\+srv)?|postgres(?:ql)?|mysql|redis):\/\/[^\s:@/]+:[^\s@/]+@/g, mask: '[REDACTED connection_string]' },
26
+ ];
27
+ /** PII detectors — enforced per the vault's `privacy:` policy. */
28
+ export const PII_PATTERNS = [
29
+ { name: 'email', regex: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, mask: '[email]' },
30
+ { name: 'phone', regex: /(?<![\d-])(?:\+?\d{1,3}[\s-]?)?(?:\(?\d{3}\)?[\s-]?)\d{3}[\s-]?\d{4}(?![\d-])/g, mask: '[phone]' },
31
+ { name: 'cn_id_number', regex: /\b\d{17}[\dXx]\b/g, mask: '[id-number]' },
32
+ ];
33
+ /**
34
+ * Scan text for secrets and PII without altering it.
35
+ *
36
+ * @param text - Body to scan
37
+ * @returns Which pattern names matched
38
+ */
39
+ export function scanForSensitive(text) {
40
+ const hit = (patterns) => patterns.filter((p) => { p.regex.lastIndex = 0; return p.regex.test(text); }).map((p) => p.name);
41
+ return { secrets: hit(SECRET_PATTERNS), pii: hit(PII_PATTERNS) };
42
+ }
43
+ /**
44
+ * Replace every secret match with its mask (and PII when asked). Used for
45
+ * archives and outbound copies where the text must survive but the values
46
+ * must not.
47
+ *
48
+ * @param text - Body
49
+ * @param includePii - Also mask PII
50
+ * @returns Masked text
51
+ */
52
+ export function redactSensitive(text, includePii = false) {
53
+ let out = text;
54
+ for (const p of SECRET_PATTERNS)
55
+ out = out.replace(p.regex, p.mask);
56
+ if (includePii)
57
+ for (const p of PII_PATTERNS)
58
+ out = out.replace(p.regex, p.mask);
59
+ return out;
60
+ }
61
+ /**
62
+ * Apply the confidentiality gate to a body about to be written.
63
+ * Secrets always refuse; PII follows `policy.pii`.
64
+ *
65
+ * @param body - Text to write
66
+ * @param policy - The vault's privacy policy
67
+ * @returns The (possibly masked) body, or a refusal naming the patterns
68
+ */
69
+ export function applyPrivacyGate(body, policy) {
70
+ const scan = scanForSensitive(body);
71
+ if (scan.secrets.length > 0) {
72
+ return {
73
+ ok: false,
74
+ reason: 'secret_detected',
75
+ patterns: scan.secrets,
76
+ message: `Refused: the body contains what looks like a credential (${scan.secrets.join(', ')}). Remove it — a vault never stores secrets.`,
77
+ };
78
+ }
79
+ if (scan.pii.length > 0) {
80
+ if (policy.pii === 'refuse') {
81
+ return {
82
+ ok: false,
83
+ reason: 'pii_refused',
84
+ patterns: scan.pii,
85
+ message: `Refused: this vault does not accept personal data (${scan.pii.join(', ')}). Describe the fact without the identifying detail.`,
86
+ };
87
+ }
88
+ if (policy.pii === 'mask') {
89
+ return { ok: true, body: redactSensitive(body, true), masked: scan.pii };
90
+ }
91
+ }
92
+ return { ok: true, body, masked: [] };
93
+ }
94
+ //# sourceMappingURL=wiki-redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-redaction.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-redaction.ts"],"names":[],"mappings":"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"}
@@ -64,7 +64,16 @@ export interface WikiSearchFailure {
64
64
  reason: 'vault_missing' | 'invalid_input' | 'invalid_query';
65
65
  message: string;
66
66
  }
67
- export interface WikiSearchInput {
67
+ /** Eligibility filters applied per page (frontmatter-driven). */
68
+ export interface WikiSearchFilters {
69
+ /** Include pages marked `superseded_by` (default false). */
70
+ includeSuperseded?: boolean;
71
+ /** Role of the reader; pages whose `visibility` excludes it are dropped. Undefined = owner (sees all). */
72
+ viewerRole?: string;
73
+ /** Include `_proposed/` pages (default false). */
74
+ includeProposed?: boolean;
75
+ }
76
+ export interface WikiSearchInput extends WikiSearchFilters {
68
77
  vaultPath: string;
69
78
  query: string;
70
79
  }
@@ -73,7 +82,7 @@ export interface VaultRef {
73
82
  vaultPath: string;
74
83
  label?: string;
75
84
  }
76
- export interface WikiMultiSearchInput {
85
+ export interface WikiMultiSearchInput extends WikiSearchFilters {
77
86
  vaults: VaultRef[];
78
87
  query: string;
79
88
  }
@@ -125,7 +134,7 @@ export declare class WikiSearchService {
125
134
  searchCorpus(vaultPath: string, docs: Array<{
126
135
  relativePath: string;
127
136
  absPath: string;
128
- }>, query: string): Promise<WikiSearchHit[]>;
137
+ }>, query: string, filters?: WikiSearchFilters): Promise<WikiSearchHit[]>;
129
138
  /**
130
139
  * Core BM25 search over an arbitrary corpus of doc refs (one or many vaults).
131
140
  * Builds the combined corpus statistics, scores, ranks, and attaches snippets
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-search.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-search.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wiki-search.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-search.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,2DAA2D;AAC3D,eAAO,MAAM,iCAAiC,IAAI,CAAC;AACnD,gEAAgE;AAChE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,QAAa,CAAC;AASrD,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,kFAAkF;IAClF,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iDAAiD;AACjD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAqBD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAoBD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkC;IAEzD,0BAA0B;IAC1B,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAKvC,uBAAuB;IACvB,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,oEAAoE;IACpE,OAAO,CAAC,aAAa;IAWrB;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;IAgBnF;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;IAuBjG;;;;;;;;;;;OAWG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EACtD,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ3B;;;;OAIG;YACW,aAAa;IA+D3B;;;;;;;OAOG;YACW,WAAW;IA2BzB;;;OAGG;YACW,MAAM;IAyBpB;;;;OAIG;YACW,OAAO;IA2CrB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;;;OAIG;YACW,aAAa;CA2B5B"}