@aitne/daemon 0.1.4 → 0.1.7

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 (272) hide show
  1. package/dist/adapters/notification-manager.d.ts +12 -0
  2. package/dist/adapters/notification-manager.d.ts.map +1 -1
  3. package/dist/adapters/notification-manager.js +39 -1
  4. package/dist/adapters/notification-manager.js.map +1 -1
  5. package/dist/api/routes/agent.d.ts.map +1 -1
  6. package/dist/api/routes/agent.js +7 -0
  7. package/dist/api/routes/agent.js.map +1 -1
  8. package/dist/api/routes/commands.d.ts.map +1 -1
  9. package/dist/api/routes/commands.js +16 -13
  10. package/dist/api/routes/commands.js.map +1 -1
  11. package/dist/api/routes/context.d.ts.map +1 -1
  12. package/dist/api/routes/context.js +13 -2
  13. package/dist/api/routes/context.js.map +1 -1
  14. package/dist/api/routes/dashboard.d.ts.map +1 -1
  15. package/dist/api/routes/dashboard.js +28 -0
  16. package/dist/api/routes/dashboard.js.map +1 -1
  17. package/dist/api/routes/fs.d.ts +23 -0
  18. package/dist/api/routes/fs.d.ts.map +1 -0
  19. package/dist/api/routes/fs.js +156 -0
  20. package/dist/api/routes/fs.js.map +1 -0
  21. package/dist/api/routes/fs.logic.d.ts +62 -0
  22. package/dist/api/routes/fs.logic.d.ts.map +1 -0
  23. package/dist/api/routes/fs.logic.js +137 -0
  24. package/dist/api/routes/fs.logic.js.map +1 -0
  25. package/dist/api/routes/health.d.ts.map +1 -1
  26. package/dist/api/routes/health.js +4 -2
  27. package/dist/api/routes/health.js.map +1 -1
  28. package/dist/api/routes/integrations.d.ts.map +1 -1
  29. package/dist/api/routes/integrations.js +8 -6
  30. package/dist/api/routes/integrations.js.map +1 -1
  31. package/dist/api/routes/metrics.d.ts +1 -0
  32. package/dist/api/routes/metrics.d.ts.map +1 -1
  33. package/dist/api/routes/metrics.js +24 -0
  34. package/dist/api/routes/metrics.js.map +1 -1
  35. package/dist/api/routes/observations.d.ts.map +1 -1
  36. package/dist/api/routes/observations.js +538 -25
  37. package/dist/api/routes/observations.js.map +1 -1
  38. package/dist/api/routes/skills.d.ts +9 -1
  39. package/dist/api/routes/skills.d.ts.map +1 -1
  40. package/dist/api/routes/skills.js +38 -16
  41. package/dist/api/routes/skills.js.map +1 -1
  42. package/dist/api/routes/wiki.d.ts +4 -0
  43. package/dist/api/routes/wiki.d.ts.map +1 -0
  44. package/dist/api/routes/wiki.js +1075 -0
  45. package/dist/api/routes/wiki.js.map +1 -0
  46. package/dist/api/server.d.ts +13 -0
  47. package/dist/api/server.d.ts.map +1 -1
  48. package/dist/api/server.js +27 -1
  49. package/dist/api/server.js.map +1 -1
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +26 -0
  52. package/dist/config.js.map +1 -1
  53. package/dist/core/agent-core.d.ts +25 -0
  54. package/dist/core/agent-core.d.ts.map +1 -1
  55. package/dist/core/agent-core.js.map +1 -1
  56. package/dist/core/backends/backend-router.d.ts +5 -1
  57. package/dist/core/backends/backend-router.d.ts.map +1 -1
  58. package/dist/core/backends/backend-router.js +10 -1
  59. package/dist/core/backends/backend-router.js.map +1 -1
  60. package/dist/core/backends/claude-code-core.d.ts.map +1 -1
  61. package/dist/core/backends/claude-code-core.js +62 -4
  62. package/dist/core/backends/claude-code-core.js.map +1 -1
  63. package/dist/core/backends/claude-tool-collection.d.ts +1 -1
  64. package/dist/core/backends/claude-tool-collection.d.ts.map +1 -1
  65. package/dist/core/backends/claude-tool-collection.js +327 -65
  66. package/dist/core/backends/claude-tool-collection.js.map +1 -1
  67. package/dist/core/backends/codex-core.d.ts.map +1 -1
  68. package/dist/core/backends/codex-core.js +36 -0
  69. package/dist/core/backends/codex-core.js.map +1 -1
  70. package/dist/core/backends/gemini-cli-core.d.ts +24 -5
  71. package/dist/core/backends/gemini-cli-core.d.ts.map +1 -1
  72. package/dist/core/backends/gemini-cli-core.js +62 -30
  73. package/dist/core/backends/gemini-cli-core.js.map +1 -1
  74. package/dist/core/backends/plan-presets.d.ts +3 -1
  75. package/dist/core/backends/plan-presets.d.ts.map +1 -1
  76. package/dist/core/backends/plan-presets.js +42 -2
  77. package/dist/core/backends/plan-presets.js.map +1 -1
  78. package/dist/core/bang-commands/commands-help.d.ts +5 -0
  79. package/dist/core/bang-commands/commands-help.d.ts.map +1 -0
  80. package/dist/core/bang-commands/commands-help.js +69 -0
  81. package/dist/core/bang-commands/commands-help.js.map +1 -0
  82. package/dist/core/bang-commands/commands-wiki.d.ts +75 -0
  83. package/dist/core/bang-commands/commands-wiki.d.ts.map +1 -0
  84. package/dist/core/bang-commands/commands-wiki.js +574 -0
  85. package/dist/core/bang-commands/commands-wiki.js.map +1 -0
  86. package/dist/core/bang-commands/index.d.ts +4 -2
  87. package/dist/core/bang-commands/index.d.ts.map +1 -1
  88. package/dist/core/bang-commands/index.js +15 -1
  89. package/dist/core/bang-commands/index.js.map +1 -1
  90. package/dist/core/bang-commands/registry.d.ts +47 -4
  91. package/dist/core/bang-commands/registry.d.ts.map +1 -1
  92. package/dist/core/bang-commands/registry.js +85 -15
  93. package/dist/core/bang-commands/registry.js.map +1 -1
  94. package/dist/core/context-builder.d.ts +17 -0
  95. package/dist/core/context-builder.d.ts.map +1 -1
  96. package/dist/core/context-builder.js +64 -6
  97. package/dist/core/context-builder.js.map +1 -1
  98. package/dist/core/daemon-api-cli.d.ts.map +1 -1
  99. package/dist/core/daemon-api-cli.js +50 -2
  100. package/dist/core/daemon-api-cli.js.map +1 -1
  101. package/dist/core/dispatcher-message-handler.d.ts.map +1 -1
  102. package/dist/core/dispatcher-message-handler.js +10 -0
  103. package/dist/core/dispatcher-message-handler.js.map +1 -1
  104. package/dist/core/dispatcher-morning-routine.d.ts.map +1 -1
  105. package/dist/core/dispatcher-morning-routine.js +17 -2
  106. package/dist/core/dispatcher-morning-routine.js.map +1 -1
  107. package/dist/core/dispatcher-result-processor.d.ts +23 -0
  108. package/dist/core/dispatcher-result-processor.d.ts.map +1 -1
  109. package/dist/core/dispatcher-result-processor.js +124 -5
  110. package/dist/core/dispatcher-result-processor.js.map +1 -1
  111. package/dist/core/dispatcher-scheduled-tasks.d.ts.map +1 -1
  112. package/dist/core/dispatcher-scheduled-tasks.js +114 -80
  113. package/dist/core/dispatcher-scheduled-tasks.js.map +1 -1
  114. package/dist/core/dispatcher-types.d.ts +116 -1
  115. package/dist/core/dispatcher-types.d.ts.map +1 -1
  116. package/dist/core/dispatcher-types.js.map +1 -1
  117. package/dist/core/dispatcher.d.ts +36 -0
  118. package/dist/core/dispatcher.d.ts.map +1 -1
  119. package/dist/core/dispatcher.js +94 -1
  120. package/dist/core/dispatcher.js.map +1 -1
  121. package/dist/core/integration-lifecycle.d.ts.map +1 -1
  122. package/dist/core/integration-lifecycle.js +6 -8
  123. package/dist/core/integration-lifecycle.js.map +1 -1
  124. package/dist/core/metrics.d.ts +127 -0
  125. package/dist/core/metrics.d.ts.map +1 -1
  126. package/dist/core/metrics.js +256 -1
  127. package/dist/core/metrics.js.map +1 -1
  128. package/dist/core/prompts.d.ts +2 -1
  129. package/dist/core/prompts.d.ts.map +1 -1
  130. package/dist/core/prompts.js +40 -0
  131. package/dist/core/prompts.js.map +1 -1
  132. package/dist/core/roadmap-validate.js +13 -1
  133. package/dist/core/roadmap-validate.js.map +1 -1
  134. package/dist/core/routine-acquisition-plan.d.ts +51 -0
  135. package/dist/core/routine-acquisition-plan.d.ts.map +1 -1
  136. package/dist/core/routine-acquisition-plan.js +111 -12
  137. package/dist/core/routine-acquisition-plan.js.map +1 -1
  138. package/dist/core/routine-fetch-window-retry.d.ts +109 -0
  139. package/dist/core/routine-fetch-window-retry.d.ts.map +1 -0
  140. package/dist/core/routine-fetch-window-retry.js +210 -0
  141. package/dist/core/routine-fetch-window-retry.js.map +1 -0
  142. package/dist/core/routine-fetch-window-runner.d.ts +258 -32
  143. package/dist/core/routine-fetch-window-runner.d.ts.map +1 -1
  144. package/dist/core/routine-fetch-window-runner.js +1115 -185
  145. package/dist/core/routine-fetch-window-runner.js.map +1 -1
  146. package/dist/core/routine-windows.d.ts +19 -4
  147. package/dist/core/routine-windows.d.ts.map +1 -1
  148. package/dist/core/routine-windows.js +47 -0
  149. package/dist/core/routine-windows.js.map +1 -1
  150. package/dist/core/scheduler.d.ts +50 -2
  151. package/dist/core/scheduler.d.ts.map +1 -1
  152. package/dist/core/scheduler.js +88 -7
  153. package/dist/core/scheduler.js.map +1 -1
  154. package/dist/core/skill-curation/declarations.d.ts.map +1 -1
  155. package/dist/core/skill-curation/declarations.js +11 -12
  156. package/dist/core/skill-curation/declarations.js.map +1 -1
  157. package/dist/core/skill-source-paths.d.ts +14 -0
  158. package/dist/core/skill-source-paths.d.ts.map +1 -0
  159. package/dist/core/skill-source-paths.js +82 -0
  160. package/dist/core/skill-source-paths.js.map +1 -0
  161. package/dist/core/skills-compiler.d.ts +18 -0
  162. package/dist/core/skills-compiler.d.ts.map +1 -1
  163. package/dist/core/skills-compiler.js +65 -18
  164. package/dist/core/skills-compiler.js.map +1 -1
  165. package/dist/core/skills-manifest.d.ts.map +1 -1
  166. package/dist/core/skills-manifest.js +46 -0
  167. package/dist/core/skills-manifest.js.map +1 -1
  168. package/dist/core/system-reset.d.ts +25 -0
  169. package/dist/core/system-reset.d.ts.map +1 -1
  170. package/dist/core/system-reset.js +47 -0
  171. package/dist/core/system-reset.js.map +1 -1
  172. package/dist/core/wiki/approval-queue.d.ts +31 -0
  173. package/dist/core/wiki/approval-queue.d.ts.map +1 -0
  174. package/dist/core/wiki/approval-queue.js +44 -0
  175. package/dist/core/wiki/approval-queue.js.map +1 -0
  176. package/dist/core/wiki/bridge.d.ts +74 -0
  177. package/dist/core/wiki/bridge.d.ts.map +1 -0
  178. package/dist/core/wiki/bridge.js +405 -0
  179. package/dist/core/wiki/bridge.js.map +1 -0
  180. package/dist/core/wiki/compile-lock.d.ts +42 -0
  181. package/dist/core/wiki/compile-lock.d.ts.map +1 -0
  182. package/dist/core/wiki/compile-lock.js +55 -0
  183. package/dist/core/wiki/compile-lock.js.map +1 -0
  184. package/dist/core/wiki/compile-preview.d.ts +8 -0
  185. package/dist/core/wiki/compile-preview.d.ts.map +1 -0
  186. package/dist/core/wiki/compile-preview.js +200 -0
  187. package/dist/core/wiki/compile-preview.js.map +1 -0
  188. package/dist/core/wiki/cost-estimate.d.ts +30 -0
  189. package/dist/core/wiki/cost-estimate.d.ts.map +1 -0
  190. package/dist/core/wiki/cost-estimate.js +243 -0
  191. package/dist/core/wiki/cost-estimate.js.map +1 -0
  192. package/dist/core/wiki/dispatcher.d.ts +48 -0
  193. package/dist/core/wiki/dispatcher.d.ts.map +1 -0
  194. package/dist/core/wiki/dispatcher.js +92 -0
  195. package/dist/core/wiki/dispatcher.js.map +1 -0
  196. package/dist/core/wiki/git-precompile.d.ts +86 -0
  197. package/dist/core/wiki/git-precompile.d.ts.map +1 -0
  198. package/dist/core/wiki/git-precompile.js +96 -0
  199. package/dist/core/wiki/git-precompile.js.map +1 -0
  200. package/dist/core/wiki/import-migrate.d.ts +38 -0
  201. package/dist/core/wiki/import-migrate.d.ts.map +1 -0
  202. package/dist/core/wiki/import-migrate.js +310 -0
  203. package/dist/core/wiki/import-migrate.js.map +1 -0
  204. package/dist/core/wiki/import-probe.d.ts +76 -0
  205. package/dist/core/wiki/import-probe.d.ts.map +1 -0
  206. package/dist/core/wiki/import-probe.js +245 -0
  207. package/dist/core/wiki/import-probe.js.map +1 -0
  208. package/dist/core/wiki/index-cache.d.ts +39 -0
  209. package/dist/core/wiki/index-cache.d.ts.map +1 -0
  210. package/dist/core/wiki/index-cache.js +152 -0
  211. package/dist/core/wiki/index-cache.js.map +1 -0
  212. package/dist/core/wiki/multi-url-dispatch.d.ts +52 -0
  213. package/dist/core/wiki/multi-url-dispatch.d.ts.map +1 -0
  214. package/dist/core/wiki/multi-url-dispatch.js +72 -0
  215. package/dist/core/wiki/multi-url-dispatch.js.map +1 -0
  216. package/dist/core/wiki/wiki-fts.d.ts +75 -0
  217. package/dist/core/wiki/wiki-fts.d.ts.map +1 -0
  218. package/dist/core/wiki/wiki-fts.js +265 -0
  219. package/dist/core/wiki/wiki-fts.js.map +1 -0
  220. package/dist/core/wiki/workspaces.d.ts +101 -0
  221. package/dist/core/wiki/workspaces.d.ts.map +1 -0
  222. package/dist/core/wiki/workspaces.js +352 -0
  223. package/dist/core/wiki/workspaces.js.map +1 -0
  224. package/dist/core/wiki/write-strategy.d.ts +70 -0
  225. package/dist/core/wiki/write-strategy.d.ts.map +1 -0
  226. package/dist/core/wiki/write-strategy.js +112 -0
  227. package/dist/core/wiki/write-strategy.js.map +1 -0
  228. package/dist/core/workdir.d.ts +8 -1
  229. package/dist/core/workdir.d.ts.map +1 -1
  230. package/dist/core/workdir.js +4 -1
  231. package/dist/core/workdir.js.map +1 -1
  232. package/dist/db/schema.d.ts.map +1 -1
  233. package/dist/db/schema.js +122 -0
  234. package/dist/db/schema.js.map +1 -1
  235. package/dist/db/wiki-store.d.ts +3 -0
  236. package/dist/db/wiki-store.d.ts.map +1 -0
  237. package/dist/db/wiki-store.js +7 -0
  238. package/dist/db/wiki-store.js.map +1 -0
  239. package/dist/index.js +87 -4
  240. package/dist/index.js.map +1 -1
  241. package/dist/messaging/setup-welcome-dm.d.ts +30 -0
  242. package/dist/messaging/setup-welcome-dm.d.ts.map +1 -0
  243. package/dist/messaging/setup-welcome-dm.js +86 -0
  244. package/dist/messaging/setup-welcome-dm.js.map +1 -0
  245. package/dist/messaging/url-extract.d.ts +8 -0
  246. package/dist/messaging/url-extract.d.ts.map +1 -0
  247. package/dist/messaging/url-extract.js +41 -0
  248. package/dist/messaging/url-extract.js.map +1 -0
  249. package/dist/observers/delegated-sync-worker.d.ts +33 -25
  250. package/dist/observers/delegated-sync-worker.d.ts.map +1 -1
  251. package/dist/observers/delegated-sync-worker.js +38 -31
  252. package/dist/observers/delegated-sync-worker.js.map +1 -1
  253. package/dist/observers/imminent-event-scheduler.d.ts +20 -7
  254. package/dist/observers/imminent-event-scheduler.d.ts.map +1 -1
  255. package/dist/observers/imminent-event-scheduler.js +134 -29
  256. package/dist/observers/imminent-event-scheduler.js.map +1 -1
  257. package/dist/safety/always-disallowed.d.ts +65 -0
  258. package/dist/safety/always-disallowed.d.ts.map +1 -1
  259. package/dist/safety/always-disallowed.js +106 -10
  260. package/dist/safety/always-disallowed.js.map +1 -1
  261. package/dist/safety/audit.d.ts +46 -1
  262. package/dist/safety/audit.d.ts.map +1 -1
  263. package/dist/safety/audit.js +79 -16
  264. package/dist/safety/audit.js.map +1 -1
  265. package/dist/safety/risk-classifier.d.ts.map +1 -1
  266. package/dist/safety/risk-classifier.js +29 -0
  267. package/dist/safety/risk-classifier.js.map +1 -1
  268. package/dist/settings/runtime-settings.d.ts +12 -1
  269. package/dist/settings/runtime-settings.d.ts.map +1 -1
  270. package/dist/settings/runtime-settings.js +59 -1
  271. package/dist/settings/runtime-settings.js.map +1 -1
  272. package/package.json +2 -2
@@ -0,0 +1,352 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { validatePrimaryVaultPath } from "../../config.js";
4
+ import { writeFileAtomically } from "../atomic-write.js";
5
+ export const DEFAULT_WIKI_WORKSPACE_NAME = "default";
6
+ export const DEFAULT_WIKI_SCHEMA_VERSION = 1;
7
+ // WIKI_BUILDER_DESIGN.md §14 Q2 — wiki has its own language; no cascade
8
+ // from `primaryLanguage`. NULL defaults to 'en' at the DB layer; the seed
9
+ // row must not inherit the user's primary language even when set.
10
+ export const DEFAULT_WIKI_LANGUAGE = "en";
11
+ // WIKI_BUILDER_DESIGN.md §6.0 / §11 — default $2.00 approval threshold
12
+ // for `!compile full`. Mirrors the dashboard default and schema CHECK.
13
+ export const DEFAULT_WIKI_FULL_COMPILE_APPROVAL_USD = 2.0;
14
+ const FALLBACK_SEEDS = {
15
+ "taxonomy.md": [
16
+ "# Wiki Taxonomy",
17
+ "",
18
+ "This file defines stable topic names, aliases, and merge rules for the personal wiki.",
19
+ "",
20
+ "## Topics",
21
+ "",
22
+ "- Add canonical topic names here as the wiki grows.",
23
+ "",
24
+ ].join("\n"),
25
+ "schemas/raw.md": [
26
+ "# Raw Note Schema",
27
+ "",
28
+ "Raw notes live under `10_raw/` and preserve source facts before synthesis.",
29
+ "",
30
+ "- Source URL",
31
+ "- Retrieved timestamp",
32
+ "- Extracted facts and quotations",
33
+ "- Open questions",
34
+ "",
35
+ ].join("\n"),
36
+ "schemas/wiki.md": [
37
+ "# Wiki Note Schema",
38
+ "",
39
+ "Wiki notes live under `20_wiki/` and should contain synthesized, cited knowledge.",
40
+ "",
41
+ "- Summary",
42
+ "- Key facts",
43
+ "- Source links",
44
+ "- Related notes",
45
+ "",
46
+ ].join("\n"),
47
+ "schemas/output.md": [
48
+ "# Output Schema",
49
+ "",
50
+ "Outputs live under `30_outputs/` and answer a specific user question from the wiki.",
51
+ "",
52
+ "- Question",
53
+ "- Answer",
54
+ "- Evidence",
55
+ "- Follow-up gaps",
56
+ "",
57
+ ].join("\n"),
58
+ };
59
+ export function defaultWikiRoot(dataDir) {
60
+ return resolve(dataDir, "wiki");
61
+ }
62
+ export function ensureDefaultWikiWorkspace(db, config) {
63
+ const rootPath = defaultWikiRoot(config.dataDir);
64
+ // §P5.C — multi-workspace: check the named default specifically
65
+ // rather than "first active workspace". With multiple active rows,
66
+ // `readDefaultWikiWorkspace` returns the oldest active row by id,
67
+ // which may not be the named default at all.
68
+ const existing = readWikiWorkspaceByName(db, DEFAULT_WIKI_WORKSPACE_NAME);
69
+ if (!existing) {
70
+ const existingNamed = readWikiWorkspaceByName(db, DEFAULT_WIKI_WORKSPACE_NAME);
71
+ if (existingNamed) {
72
+ db.prepare(`UPDATE wiki_workspaces
73
+ SET active = 1,
74
+ kind = 'internal',
75
+ root_path = ?,
76
+ updated_at = CURRENT_TIMESTAMP
77
+ WHERE name = ?`).run(rootPath, DEFAULT_WIKI_WORKSPACE_NAME);
78
+ }
79
+ else {
80
+ db.prepare(`INSERT INTO wiki_workspaces (
81
+ name,
82
+ kind,
83
+ root_path,
84
+ language,
85
+ dispatch_mode,
86
+ concurrency_cap,
87
+ dm_agent_write_enabled,
88
+ bridge_enabled,
89
+ full_compile_approval_threshold_usd,
90
+ schema_version,
91
+ active,
92
+ updated_at
93
+ ) VALUES (?, 'internal', ?, ?, 'parallel', 3, 0, 0, ?, ?, 1, CURRENT_TIMESTAMP)`).run(DEFAULT_WIKI_WORKSPACE_NAME, rootPath, DEFAULT_WIKI_LANGUAGE, DEFAULT_WIKI_FULL_COMPILE_APPROVAL_USD, DEFAULT_WIKI_SCHEMA_VERSION);
94
+ }
95
+ }
96
+ seedWikiWorkspaceFiles(rootPath, config.workspaceDir);
97
+ return readWikiWorkspaceByName(db, DEFAULT_WIKI_WORKSPACE_NAME) ?? {
98
+ id: 0,
99
+ name: DEFAULT_WIKI_WORKSPACE_NAME,
100
+ kind: "internal",
101
+ root_path: rootPath,
102
+ language: DEFAULT_WIKI_LANGUAGE,
103
+ dispatch_mode: "parallel",
104
+ concurrency_cap: 3,
105
+ dm_agent_write_enabled: 0,
106
+ bridge_enabled: 0,
107
+ bridge_measurement_only: 1,
108
+ bridge_min_confidence: 0.7,
109
+ full_compile_approval_threshold_usd: DEFAULT_WIKI_FULL_COMPILE_APPROVAL_USD,
110
+ write_strategy: "fs",
111
+ git_pre_compile_enabled: 1,
112
+ schema_version: DEFAULT_WIKI_SCHEMA_VERSION,
113
+ active: 1,
114
+ last_ingest_at: null,
115
+ last_compile_at: null,
116
+ created_at: new Date().toISOString(),
117
+ updated_at: new Date().toISOString(),
118
+ };
119
+ }
120
+ /**
121
+ * Create (or re-activate) an external-mode wiki workspace pointed at a
122
+ * caller-supplied path. WIKI_BUILDER_DESIGN.md §P2.A / §P2.C.
123
+ *
124
+ * Path-collision rules (§2.1.1) and writability are enforced by the
125
+ * caller (`validateWikiRootPath` + wizard probe) — this function trusts
126
+ * its inputs and is only responsible for the idempotent DB insert and
127
+ * vault skeleton seeding.
128
+ */
129
+ export function createExternalWikiWorkspace(db, config, options) {
130
+ const name = options.name ?? DEFAULT_WIKI_WORKSPACE_NAME;
131
+ const language = options.language ?? DEFAULT_WIKI_LANGUAGE;
132
+ const rootPath = resolve(options.rootPath);
133
+ const existing = readWikiWorkspaceByName(db, name);
134
+ if (existing) {
135
+ db.prepare(`UPDATE wiki_workspaces
136
+ SET active = 1,
137
+ kind = 'external',
138
+ root_path = ?,
139
+ language = ?,
140
+ write_strategy = 'auto',
141
+ updated_at = CURRENT_TIMESTAMP
142
+ WHERE name = ?`).run(rootPath, language, name);
143
+ }
144
+ else {
145
+ db.prepare(`INSERT INTO wiki_workspaces (
146
+ name,
147
+ kind,
148
+ root_path,
149
+ language,
150
+ dispatch_mode,
151
+ concurrency_cap,
152
+ dm_agent_write_enabled,
153
+ bridge_enabled,
154
+ full_compile_approval_threshold_usd,
155
+ write_strategy,
156
+ git_pre_compile_enabled,
157
+ schema_version,
158
+ active,
159
+ updated_at
160
+ ) VALUES (?, 'external', ?, ?, 'parallel', 3, 0, 0, ?, 'auto', 1, ?, 1, CURRENT_TIMESTAMP)`).run(name, rootPath, language, DEFAULT_WIKI_FULL_COMPILE_APPROVAL_USD, DEFAULT_WIKI_SCHEMA_VERSION);
161
+ }
162
+ seedWikiWorkspaceFiles(rootPath, config.workspaceDir);
163
+ const row = readWikiWorkspaceByName(db, name);
164
+ if (!row) {
165
+ throw new Error(`Failed to create external wiki workspace ${name}`);
166
+ }
167
+ return row;
168
+ }
169
+ export function readDefaultWikiWorkspace(db) {
170
+ return (db
171
+ .prepare(`SELECT * FROM wiki_workspaces WHERE active = 1 ORDER BY id ASC LIMIT 1`)
172
+ .get() ?? null);
173
+ }
174
+ export function readWikiWorkspaceByName(db, name) {
175
+ return (db
176
+ .prepare(`SELECT * FROM wiki_workspaces WHERE name = ? LIMIT 1`)
177
+ .get(name) ?? null);
178
+ }
179
+ export function listWikiWorkspaces(db) {
180
+ return db
181
+ .prepare(`SELECT * FROM wiki_workspaces ORDER BY active DESC, name ASC`)
182
+ .all();
183
+ }
184
+ /**
185
+ * WIKI_BUILDER_DESIGN.md §P5.C — active-only iteration helper.
186
+ *
187
+ * Multiple workspaces can be active at once in Phase 5; callers that
188
+ * need to enumerate dispatch targets (the workspace dropdown, the
189
+ * `@<workspace>` resolver, the boot-time FTS backfill) want the
190
+ * single-purpose query rather than filtering `listWikiWorkspaces`
191
+ * downstream and getting it wrong.
192
+ */
193
+ export function listActiveWikiWorkspaces(db) {
194
+ return db
195
+ .prepare(`SELECT * FROM wiki_workspaces WHERE active = 1 ORDER BY name ASC`)
196
+ .all();
197
+ }
198
+ /**
199
+ * WIKI_BUILDER_DESIGN.md §P5.C — resolve an `@<workspace>` token (or a
200
+ * bare workspace name) against the active set, with a fallback to the
201
+ * default workspace when the caller did not name one.
202
+ *
203
+ * Returns `null` when the named workspace does not exist or is
204
+ * archived — bang handlers turn that into a usage DM rather than
205
+ * silently dispatching to the default. Returning `null` also covers
206
+ * the "wiki not enabled" case (no rows at all) so callers do not have
207
+ * to double-check.
208
+ */
209
+ export function resolveWikiWorkspace(db, name) {
210
+ if (name) {
211
+ const row = readWikiWorkspaceByName(db, name);
212
+ return row && row.active === 1 ? row : null;
213
+ }
214
+ return readDefaultWikiWorkspace(db);
215
+ }
216
+ /**
217
+ * Validate a candidate external-mode wiki workspace `root_path`.
218
+ *
219
+ * Reuses `validatePrimaryVaultPath` for the writability + system-path
220
+ * + dataDir-overlap + path-traversal checks, then layers on the
221
+ * wiki-specific overlap rules from WIKI_BUILDER_DESIGN.md §2.1.1:
222
+ * - must not equal / overlap `primaryVaultPath`
223
+ * - must not equal / overlap `externalObsidianVaultPath`
224
+ * - must not equal / overlap any *other* wiki workspace `root_path`
225
+ *
226
+ * Equality-with-self is allowed so the validator is idempotent during
227
+ * an in-place PATCH of an existing row.
228
+ */
229
+ export function validateWikiRootPath(rawPath, db, config, options = {}) {
230
+ const base = validatePrimaryVaultPath(rawPath, config, {
231
+ autoCreate: false,
232
+ allowMissingLeaf: true,
233
+ collectFsInfo: false,
234
+ });
235
+ if (!base.ok) {
236
+ return { ok: false, error: base.error, message: base.message };
237
+ }
238
+ const real = realpathSafe(resolve(rawPath));
239
+ if (config.primaryVaultPath) {
240
+ const primaryReal = realpathSafe(config.primaryVaultPath);
241
+ if (overlaps(primaryReal, real)) {
242
+ return {
243
+ ok: false,
244
+ error: "overlaps_primary_vault",
245
+ message: "Wiki root must not overlap the primary vault.",
246
+ };
247
+ }
248
+ }
249
+ if (config.externalObsidianVaultPath) {
250
+ const extReal = realpathSafe(config.externalObsidianVaultPath);
251
+ if (overlaps(extReal, real)) {
252
+ return {
253
+ ok: false,
254
+ error: "overlaps_external_obsidian",
255
+ message: "Wiki root must not overlap the external Obsidian vault path.",
256
+ };
257
+ }
258
+ }
259
+ for (const other of listWikiWorkspaces(db)) {
260
+ if (other.name === options.selfWorkspaceName)
261
+ continue;
262
+ if (other.active !== 1)
263
+ continue;
264
+ const otherReal = realpathSafe(other.root_path);
265
+ if (overlaps(otherReal, real)) {
266
+ return {
267
+ ok: false,
268
+ error: "overlaps_other_wiki",
269
+ message: `Wiki root overlaps existing workspace \`${other.name}\` at ${other.root_path}.`,
270
+ };
271
+ }
272
+ }
273
+ return { ok: true, resolvedPath: real };
274
+ }
275
+ function realpathSafe(path) {
276
+ try {
277
+ return realpathSync(path);
278
+ }
279
+ catch {
280
+ return resolve(path);
281
+ }
282
+ }
283
+ function overlaps(a, b) {
284
+ return containsOrEquals(a, b) || containsOrEquals(b, a);
285
+ }
286
+ function containsOrEquals(outer, inner) {
287
+ if (outer === inner)
288
+ return true;
289
+ const prefix = outer.endsWith("/") ? outer : `${outer}/`;
290
+ return inner.startsWith(prefix);
291
+ }
292
+ export function seedWikiWorkspaceFiles(rootPath, workspaceDir) {
293
+ for (const rel of [
294
+ "00_inbox",
295
+ "10_raw/images",
296
+ "20_wiki",
297
+ "30_outputs",
298
+ "90_meta/schemas",
299
+ "90_meta/health",
300
+ ]) {
301
+ mkdirSync(join(rootPath, rel), { recursive: true });
302
+ }
303
+ writeIfMissing(join(rootPath, "20_wiki/_index.md"), [
304
+ "# Wiki Index",
305
+ "",
306
+ "This index is maintained by `wiki.compile`.",
307
+ "",
308
+ ].join("\n"));
309
+ writeIfMissing(join(rootPath, "log.md"), "# Wiki Log\n\n");
310
+ const seedsRoot = join(workspaceDir, "agent-assets", "wiki-seeds");
311
+ for (const [rel, fallback] of Object.entries(FALLBACK_SEEDS)) {
312
+ const sourcePath = join(seedsRoot, rel);
313
+ const targetPath = join(rootPath, "90_meta", rel);
314
+ const content = existsSync(sourcePath)
315
+ ? readFileSync(sourcePath, "utf-8")
316
+ : fallback;
317
+ writeIfMissing(targetPath, content);
318
+ }
319
+ }
320
+ export function buildWikiWorkspaceStats(row) {
321
+ return {
322
+ rawCount: countMarkdownFiles(join(row.root_path, "10_raw")),
323
+ wikiCount: countMarkdownFiles(join(row.root_path, "20_wiki")),
324
+ outputCount: countMarkdownFiles(join(row.root_path, "30_outputs")),
325
+ lastIngestAt: row.last_ingest_at,
326
+ lastCompileAt: row.last_compile_at,
327
+ };
328
+ }
329
+ function countMarkdownFiles(dir) {
330
+ if (!existsSync(dir))
331
+ return 0;
332
+ let count = 0;
333
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
334
+ const full = join(dir, entry.name);
335
+ if (entry.isDirectory()) {
336
+ count += countMarkdownFiles(full);
337
+ }
338
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
339
+ count += 1;
340
+ }
341
+ }
342
+ return count;
343
+ }
344
+ function writeIfMissing(path, content) {
345
+ if (existsSync(path)) {
346
+ const stat = statSync(path);
347
+ if (stat.isFile())
348
+ return;
349
+ }
350
+ writeFileAtomically(path, content.endsWith("\n") ? content : `${content}\n`);
351
+ }
352
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/core/wiki/workspaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type Database from "better-sqlite3";
2
+ import { ObsidianService } from "../../services/obsidian.js";
3
+ import type { WikiWorkspaceRow } from "./workspaces.js";
4
+ /**
5
+ * WikiWriteStrategy — encapsulates how the daemon persists a write into
6
+ * a wiki workspace.
7
+ *
8
+ * - `internal` workspaces always use the local-fs path (atomic write).
9
+ * - `external` workspaces start in `auto` and probe: try direct fs first,
10
+ * fall back to Obsidian-CLI on EPERM / EACCES / EROFS (typical for
11
+ * iCloud-sandboxed vaults). The resolved strategy is persisted to
12
+ * `wiki_workspaces.write_strategy` so subsequent writes skip the probe.
13
+ *
14
+ * WIKI_BUILDER_DESIGN.md §P2.B, §8 (external-mode iCloud fallback).
15
+ *
16
+ * The module owns ZERO state besides the per-workspace ObsidianService
17
+ * instance map; the resolved strategy lives in the DB row. This keeps
18
+ * the probe outcome durable across daemon restarts.
19
+ */
20
+ export type WikiResolvedStrategy = "fs" | "cli";
21
+ export interface WikiWriteStrategyResolverDeps {
22
+ db: Database.Database;
23
+ obsidian: ObsidianService;
24
+ }
25
+ export interface WriteWikiFileInput {
26
+ workspace: WikiWorkspaceRow;
27
+ relPath: string;
28
+ content: string;
29
+ }
30
+ export interface WriteWikiFileOutcome {
31
+ strategy: WikiResolvedStrategy;
32
+ durationMs: number;
33
+ }
34
+ export declare class WikiWriteStrategyResolver {
35
+ private readonly deps;
36
+ constructor(deps: WikiWriteStrategyResolverDeps);
37
+ /**
38
+ * Resolve the strategy a write should use for a workspace.
39
+ *
40
+ * Internal-mode rows are always `fs`. External-mode rows return their
41
+ * cached `write_strategy` when it is `fs` or `cli`; `auto` (the post-
42
+ * setup default) means "probe on the first write". The probe happens
43
+ * inside `writeFile()` rather than here, because we only know the
44
+ * outcome after attempting the write — surfacing it ahead of time
45
+ * would duplicate the failure path.
46
+ */
47
+ resolveStrategy(workspace: WikiWorkspaceRow): "fs" | "cli" | "auto";
48
+ writeFile(input: WriteWikiFileInput): Promise<WriteWikiFileOutcome>;
49
+ private writeViaCli;
50
+ private persistResolved;
51
+ }
52
+ /**
53
+ * Health surface for `/api/health.wiki` — reports the per-workspace
54
+ * resolved strategy plus a one-shot CLI reachability probe.
55
+ */
56
+ export interface WikiWriteStrategyHealth {
57
+ workspace: string;
58
+ kind: "internal" | "external";
59
+ strategy: "fs" | "cli" | "auto";
60
+ cliAvailable: boolean | null;
61
+ }
62
+ export declare function probeWikiWriteStrategyHealth(workspace: WikiWorkspaceRow, obsidian: ObsidianService): Promise<WikiWriteStrategyHealth>;
63
+ /**
64
+ * Resolve the workspace-relative directory of a vault-local file. Exposed
65
+ * so the chokidar-driven `_index.md` cache can register the watcher path
66
+ * without duplicating the join.
67
+ */
68
+ export declare function resolveWikiPath(workspace: WikiWorkspaceRow, relPath: string): string;
69
+ export declare function indexCachePathFor(workspace: WikiWorkspaceRow): string;
70
+ //# sourceMappingURL=write-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-strategy.d.ts","sourceRoot":"","sources":["../../../src/core/wiki/write-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,oBAAoB,GAAG,IAAI,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,6BAA6B;IAEhE;;;;;;;;;OASG;IACH,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM;IAK7D,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAmC3D,WAAW;IA0BzB,OAAO,CAAC,eAAe;CAcxB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAC9B,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAelC;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAErE"}
@@ -0,0 +1,112 @@
1
+ import { dirname, join, relative, resolve } from "node:path";
2
+ import { writeFileAtomically } from "../atomic-write.js";
3
+ const FALLBACK_ERROR_CODES = new Set(["EPERM", "EACCES", "EROFS", "EBUSY"]);
4
+ export class WikiWriteStrategyResolver {
5
+ deps;
6
+ constructor(deps) {
7
+ this.deps = deps;
8
+ }
9
+ /**
10
+ * Resolve the strategy a write should use for a workspace.
11
+ *
12
+ * Internal-mode rows are always `fs`. External-mode rows return their
13
+ * cached `write_strategy` when it is `fs` or `cli`; `auto` (the post-
14
+ * setup default) means "probe on the first write". The probe happens
15
+ * inside `writeFile()` rather than here, because we only know the
16
+ * outcome after attempting the write — surfacing it ahead of time
17
+ * would duplicate the failure path.
18
+ */
19
+ resolveStrategy(workspace) {
20
+ if (workspace.kind === "internal")
21
+ return "fs";
22
+ return workspace.write_strategy;
23
+ }
24
+ async writeFile(input) {
25
+ const start = Date.now();
26
+ const strategy = this.resolveStrategy(input.workspace);
27
+ const fullPath = resolve(input.workspace.root_path, input.relPath);
28
+ const safe = ensureWithinRoot(input.workspace.root_path, fullPath);
29
+ if (!safe) {
30
+ throw Object.assign(new Error(`wiki write: path escapes workspace root: ${input.relPath}`), { code: "EWIKIPATH" });
31
+ }
32
+ if (strategy === "fs") {
33
+ writeFileAtomically(fullPath, ensureTrailingNewline(input.content));
34
+ return { strategy: "fs", durationMs: Date.now() - start };
35
+ }
36
+ if (strategy === "cli") {
37
+ await this.writeViaCli(input);
38
+ return { strategy: "cli", durationMs: Date.now() - start };
39
+ }
40
+ // strategy === "auto" — external workspace, no probe outcome cached.
41
+ try {
42
+ writeFileAtomically(fullPath, ensureTrailingNewline(input.content));
43
+ this.persistResolved(input.workspace, "fs");
44
+ return { strategy: "fs", durationMs: Date.now() - start };
45
+ }
46
+ catch (err) {
47
+ const code = err.code ?? "";
48
+ if (!FALLBACK_ERROR_CODES.has(code))
49
+ throw err;
50
+ await this.writeViaCli(input);
51
+ this.persistResolved(input.workspace, "cli");
52
+ return { strategy: "cli", durationMs: Date.now() - start };
53
+ }
54
+ }
55
+ async writeViaCli(input) {
56
+ if (!this.deps.obsidian.available) {
57
+ throw Object.assign(new Error("wiki write: Obsidian CLI is required for external-mode fallback but the service is not configured."), { code: "EWIKI_CLI_UNAVAILABLE" });
58
+ }
59
+ if (!(await this.deps.obsidian.isRunning())) {
60
+ throw Object.assign(new Error("wiki write: Obsidian app is not running; the CLI fallback cannot reach the sandboxed vault."), { code: "EWIKI_CLI_NOT_RUNNING" });
61
+ }
62
+ // The Obsidian CLI's `create path=… overwrite` is idempotent and
63
+ // accepts relative vault paths. We use the workspace root_path as the
64
+ // vault root, so the rel path passed straight through is correct.
65
+ await this.deps.obsidian.updateNote(input.relPath, ensureTrailingNewline(input.content));
66
+ }
67
+ persistResolved(workspace, strategy) {
68
+ if (workspace.write_strategy === strategy)
69
+ return;
70
+ this.deps.db
71
+ .prepare(`UPDATE wiki_workspaces
72
+ SET write_strategy = ?, updated_at = CURRENT_TIMESTAMP
73
+ WHERE id = ?`)
74
+ .run(strategy, workspace.id);
75
+ workspace.write_strategy = strategy;
76
+ }
77
+ }
78
+ export async function probeWikiWriteStrategyHealth(workspace, obsidian) {
79
+ if (workspace.kind === "internal") {
80
+ return {
81
+ workspace: workspace.name,
82
+ kind: workspace.kind,
83
+ strategy: "fs",
84
+ cliAvailable: null,
85
+ };
86
+ }
87
+ return {
88
+ workspace: workspace.name,
89
+ kind: workspace.kind,
90
+ strategy: workspace.write_strategy,
91
+ cliAvailable: obsidian.available ? await obsidian.isRunning() : false,
92
+ };
93
+ }
94
+ function ensureTrailingNewline(content) {
95
+ return content.endsWith("\n") ? content : `${content}\n`;
96
+ }
97
+ function ensureWithinRoot(root, fullPath) {
98
+ const rel = relative(root, fullPath);
99
+ return !rel.startsWith("..") && !rel.startsWith("/");
100
+ }
101
+ /**
102
+ * Resolve the workspace-relative directory of a vault-local file. Exposed
103
+ * so the chokidar-driven `_index.md` cache can register the watcher path
104
+ * without duplicating the join.
105
+ */
106
+ export function resolveWikiPath(workspace, relPath) {
107
+ return join(workspace.root_path, relPath);
108
+ }
109
+ export function indexCachePathFor(workspace) {
110
+ return dirname(resolveWikiPath(workspace, "20_wiki/_index.md"));
111
+ }
112
+ //# sourceMappingURL=write-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-strategy.js","sourceRoot":"","sources":["../../../src/core/wiki/write-strategy.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,11 @@ export declare function createSessionWorkdir(projectRoot: string, eventType: str
75
75
  * during materialization so each skill's CURATION anchors resolve to
76
76
  * the active overlay (or seed) JSON. */
77
77
  skillCurationDataDir?: string;
78
+ /** WIKI_BUILDER_DESIGN.md §P5.C — per-event wiki workspace name for
79
+ * `{{vault_path}}` / `{{language}}` / `{{workspace_name}}` /
80
+ * `{{schema_version}}` token substitution in skill bodies and the
81
+ * wiki-agent profile. Undefined falls back to the default workspace. */
82
+ wikiWorkspaceName?: string;
78
83
  }): string;
79
84
  export declare function ensureSessionWorkdir(projectRoot: string, dataDir: string, dbSessionId: number, eventType: string, options?: {
80
85
  backendId?: BackendId;
@@ -104,6 +109,8 @@ export declare function ensureSessionWorkdir(projectRoot: string, dataDir: strin
104
109
  skillSlugs: readonly string[] | null;
105
110
  profileBody: string | null;
106
111
  };
112
+ /** WIKI_BUILDER_DESIGN.md §P5.C — see createSessionWorkdir options. */
113
+ wikiWorkspaceName?: string;
107
114
  }): string;
108
115
  /**
109
116
  * Get the deterministic path for a session workdir (without creating it).
@@ -131,7 +138,7 @@ export declare function cleanupStaleWorkdirs(dataDir: string, activeSessionIds:
131
138
  * Idempotent — if the files already exist for this backend, it overwrites
132
139
  * with the latest content (which is cheap since the source hasn't changed).
133
140
  */
134
- export declare function ensureBackendMaterialized(projectRoot: string, sessionDir: string, backendId: BackendId, eventType: string, processKey?: ProcessKey, configuredServices?: ReadonlySet<string>, mailAccounts?: readonly import("../services/mail/provider.js").MailAccount[], integrations?: Partial<Record<IntegrationKey, IntegrationState>>, character?: string): void;
141
+ export declare function ensureBackendMaterialized(projectRoot: string, sessionDir: string, backendId: BackendId, eventType: string, processKey?: ProcessKey, configuredServices?: ReadonlySet<string>, mailAccounts?: readonly import("../services/mail/provider.js").MailAccount[], integrations?: Partial<Record<IntegrationKey, IntegrationState>>, character?: string, wikiWorkspaceName?: string): void;
135
142
  /**
136
143
  * Validate that every delegated-mode skill AND task-flow variant required by
137
144
  * the currently-stored integration state exists on disk. Returns the missing
@@ -1 +1 @@
1
- {"version":3,"file":"workdir.d.ts","sourceRoot":"","sources":["../../src/core/workdir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workdir.d.ts","sourceRoot":"","sources":["../../src/core/workdir.ts"],"names":[],"mappings":"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"}
@@ -216,6 +216,7 @@ export function createSessionWorkdir(projectRoot, eventType, userSkillsDir, opti
216
216
  sessionDir,
217
217
  eventType,
218
218
  processKey: options?.processKey,
219
+ wikiWorkspaceName: options?.wikiWorkspaceName,
219
220
  });
220
221
  writeInstructionAssetStamp(sessionDir, computeInstructionAssetStatus(projectRoot));
221
222
  ensureDaemonApiCli(sessionDir);
@@ -293,6 +294,7 @@ export function ensureSessionWorkdir(projectRoot, dataDir, dbSessionId, eventTyp
293
294
  sessionDir,
294
295
  eventType,
295
296
  processKey: options?.processKey,
297
+ wikiWorkspaceName: options?.wikiWorkspaceName,
296
298
  ...(options?.override ? { override: options.override } : {}),
297
299
  });
298
300
  writeInstructionAssetStamp(sessionDir, computeInstructionAssetStatus(projectRoot));
@@ -444,13 +446,14 @@ export function cleanupStaleWorkdirs(dataDir, activeSessionIds) {
444
446
  * Idempotent — if the files already exist for this backend, it overwrites
445
447
  * with the latest content (which is cheap since the source hasn't changed).
446
448
  */
447
- export function ensureBackendMaterialized(projectRoot, sessionDir, backendId, eventType, processKey, configuredServices, mailAccounts, integrations, character) {
449
+ export function ensureBackendMaterialized(projectRoot, sessionDir, backendId, eventType, processKey, configuredServices, mailAccounts, integrations, character, wikiWorkspaceName) {
448
450
  const compiler = new SkillsCompiler(projectRoot, configuredServices, mailAccounts, integrations, character);
449
451
  const deployed = compiler.materializeSessionBundle({
450
452
  backendId,
451
453
  sessionDir,
452
454
  eventType,
453
455
  processKey,
456
+ wikiWorkspaceName,
454
457
  });
455
458
  writeInstructionAssetStamp(sessionDir, computeInstructionAssetStatus(projectRoot));
456
459
  ensureDaemonApiCli(sessionDir);