@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.
- package/dist/adapters/notification-manager.d.ts +12 -0
- package/dist/adapters/notification-manager.d.ts.map +1 -1
- package/dist/adapters/notification-manager.js +39 -1
- package/dist/adapters/notification-manager.js.map +1 -1
- package/dist/api/routes/agent.d.ts.map +1 -1
- package/dist/api/routes/agent.js +7 -0
- package/dist/api/routes/agent.js.map +1 -1
- package/dist/api/routes/commands.d.ts.map +1 -1
- package/dist/api/routes/commands.js +16 -13
- package/dist/api/routes/commands.js.map +1 -1
- package/dist/api/routes/context.d.ts.map +1 -1
- package/dist/api/routes/context.js +13 -2
- package/dist/api/routes/context.js.map +1 -1
- package/dist/api/routes/dashboard.d.ts.map +1 -1
- package/dist/api/routes/dashboard.js +28 -0
- package/dist/api/routes/dashboard.js.map +1 -1
- package/dist/api/routes/fs.d.ts +23 -0
- package/dist/api/routes/fs.d.ts.map +1 -0
- package/dist/api/routes/fs.js +156 -0
- package/dist/api/routes/fs.js.map +1 -0
- package/dist/api/routes/fs.logic.d.ts +62 -0
- package/dist/api/routes/fs.logic.d.ts.map +1 -0
- package/dist/api/routes/fs.logic.js +137 -0
- package/dist/api/routes/fs.logic.js.map +1 -0
- package/dist/api/routes/health.d.ts.map +1 -1
- package/dist/api/routes/health.js +4 -2
- package/dist/api/routes/health.js.map +1 -1
- package/dist/api/routes/integrations.d.ts.map +1 -1
- package/dist/api/routes/integrations.js +8 -6
- package/dist/api/routes/integrations.js.map +1 -1
- package/dist/api/routes/metrics.d.ts +1 -0
- package/dist/api/routes/metrics.d.ts.map +1 -1
- package/dist/api/routes/metrics.js +24 -0
- package/dist/api/routes/metrics.js.map +1 -1
- package/dist/api/routes/observations.d.ts.map +1 -1
- package/dist/api/routes/observations.js +538 -25
- package/dist/api/routes/observations.js.map +1 -1
- package/dist/api/routes/skills.d.ts +9 -1
- package/dist/api/routes/skills.d.ts.map +1 -1
- package/dist/api/routes/skills.js +38 -16
- package/dist/api/routes/skills.js.map +1 -1
- package/dist/api/routes/wiki.d.ts +4 -0
- package/dist/api/routes/wiki.d.ts.map +1 -0
- package/dist/api/routes/wiki.js +1075 -0
- package/dist/api/routes/wiki.js.map +1 -0
- package/dist/api/server.d.ts +13 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +27 -1
- package/dist/api/server.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-core.d.ts +25 -0
- package/dist/core/agent-core.d.ts.map +1 -1
- package/dist/core/agent-core.js.map +1 -1
- package/dist/core/backends/backend-router.d.ts +5 -1
- package/dist/core/backends/backend-router.d.ts.map +1 -1
- package/dist/core/backends/backend-router.js +10 -1
- package/dist/core/backends/backend-router.js.map +1 -1
- package/dist/core/backends/claude-code-core.d.ts.map +1 -1
- package/dist/core/backends/claude-code-core.js +62 -4
- package/dist/core/backends/claude-code-core.js.map +1 -1
- package/dist/core/backends/claude-tool-collection.d.ts +1 -1
- package/dist/core/backends/claude-tool-collection.d.ts.map +1 -1
- package/dist/core/backends/claude-tool-collection.js +327 -65
- package/dist/core/backends/claude-tool-collection.js.map +1 -1
- package/dist/core/backends/codex-core.d.ts.map +1 -1
- package/dist/core/backends/codex-core.js +36 -0
- package/dist/core/backends/codex-core.js.map +1 -1
- package/dist/core/backends/gemini-cli-core.d.ts +24 -5
- package/dist/core/backends/gemini-cli-core.d.ts.map +1 -1
- package/dist/core/backends/gemini-cli-core.js +62 -30
- package/dist/core/backends/gemini-cli-core.js.map +1 -1
- package/dist/core/backends/plan-presets.d.ts +3 -1
- package/dist/core/backends/plan-presets.d.ts.map +1 -1
- package/dist/core/backends/plan-presets.js +42 -2
- package/dist/core/backends/plan-presets.js.map +1 -1
- package/dist/core/bang-commands/commands-help.d.ts +5 -0
- package/dist/core/bang-commands/commands-help.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-help.js +69 -0
- package/dist/core/bang-commands/commands-help.js.map +1 -0
- package/dist/core/bang-commands/commands-wiki.d.ts +75 -0
- package/dist/core/bang-commands/commands-wiki.d.ts.map +1 -0
- package/dist/core/bang-commands/commands-wiki.js +574 -0
- package/dist/core/bang-commands/commands-wiki.js.map +1 -0
- package/dist/core/bang-commands/index.d.ts +4 -2
- package/dist/core/bang-commands/index.d.ts.map +1 -1
- package/dist/core/bang-commands/index.js +15 -1
- package/dist/core/bang-commands/index.js.map +1 -1
- package/dist/core/bang-commands/registry.d.ts +47 -4
- package/dist/core/bang-commands/registry.d.ts.map +1 -1
- package/dist/core/bang-commands/registry.js +85 -15
- package/dist/core/bang-commands/registry.js.map +1 -1
- package/dist/core/context-builder.d.ts +17 -0
- package/dist/core/context-builder.d.ts.map +1 -1
- package/dist/core/context-builder.js +64 -6
- package/dist/core/context-builder.js.map +1 -1
- package/dist/core/daemon-api-cli.d.ts.map +1 -1
- package/dist/core/daemon-api-cli.js +50 -2
- package/dist/core/daemon-api-cli.js.map +1 -1
- package/dist/core/dispatcher-message-handler.d.ts.map +1 -1
- package/dist/core/dispatcher-message-handler.js +10 -0
- package/dist/core/dispatcher-message-handler.js.map +1 -1
- package/dist/core/dispatcher-morning-routine.d.ts.map +1 -1
- package/dist/core/dispatcher-morning-routine.js +17 -2
- package/dist/core/dispatcher-morning-routine.js.map +1 -1
- package/dist/core/dispatcher-result-processor.d.ts +23 -0
- package/dist/core/dispatcher-result-processor.d.ts.map +1 -1
- package/dist/core/dispatcher-result-processor.js +124 -5
- package/dist/core/dispatcher-result-processor.js.map +1 -1
- package/dist/core/dispatcher-scheduled-tasks.d.ts.map +1 -1
- package/dist/core/dispatcher-scheduled-tasks.js +114 -80
- package/dist/core/dispatcher-scheduled-tasks.js.map +1 -1
- package/dist/core/dispatcher-types.d.ts +116 -1
- package/dist/core/dispatcher-types.d.ts.map +1 -1
- package/dist/core/dispatcher-types.js.map +1 -1
- package/dist/core/dispatcher.d.ts +36 -0
- package/dist/core/dispatcher.d.ts.map +1 -1
- package/dist/core/dispatcher.js +94 -1
- package/dist/core/dispatcher.js.map +1 -1
- package/dist/core/integration-lifecycle.d.ts.map +1 -1
- package/dist/core/integration-lifecycle.js +6 -8
- package/dist/core/integration-lifecycle.js.map +1 -1
- package/dist/core/metrics.d.ts +127 -0
- package/dist/core/metrics.d.ts.map +1 -1
- package/dist/core/metrics.js +256 -1
- package/dist/core/metrics.js.map +1 -1
- package/dist/core/prompts.d.ts +2 -1
- package/dist/core/prompts.d.ts.map +1 -1
- package/dist/core/prompts.js +40 -0
- package/dist/core/prompts.js.map +1 -1
- package/dist/core/roadmap-validate.js +13 -1
- package/dist/core/roadmap-validate.js.map +1 -1
- package/dist/core/routine-acquisition-plan.d.ts +51 -0
- package/dist/core/routine-acquisition-plan.d.ts.map +1 -1
- package/dist/core/routine-acquisition-plan.js +111 -12
- package/dist/core/routine-acquisition-plan.js.map +1 -1
- package/dist/core/routine-fetch-window-retry.d.ts +109 -0
- package/dist/core/routine-fetch-window-retry.d.ts.map +1 -0
- package/dist/core/routine-fetch-window-retry.js +210 -0
- package/dist/core/routine-fetch-window-retry.js.map +1 -0
- package/dist/core/routine-fetch-window-runner.d.ts +258 -32
- package/dist/core/routine-fetch-window-runner.d.ts.map +1 -1
- package/dist/core/routine-fetch-window-runner.js +1115 -185
- package/dist/core/routine-fetch-window-runner.js.map +1 -1
- package/dist/core/routine-windows.d.ts +19 -4
- package/dist/core/routine-windows.d.ts.map +1 -1
- package/dist/core/routine-windows.js +47 -0
- package/dist/core/routine-windows.js.map +1 -1
- package/dist/core/scheduler.d.ts +50 -2
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +88 -7
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/skill-curation/declarations.d.ts.map +1 -1
- package/dist/core/skill-curation/declarations.js +11 -12
- package/dist/core/skill-curation/declarations.js.map +1 -1
- package/dist/core/skill-source-paths.d.ts +14 -0
- package/dist/core/skill-source-paths.d.ts.map +1 -0
- package/dist/core/skill-source-paths.js +82 -0
- package/dist/core/skill-source-paths.js.map +1 -0
- package/dist/core/skills-compiler.d.ts +18 -0
- package/dist/core/skills-compiler.d.ts.map +1 -1
- package/dist/core/skills-compiler.js +65 -18
- package/dist/core/skills-compiler.js.map +1 -1
- package/dist/core/skills-manifest.d.ts.map +1 -1
- package/dist/core/skills-manifest.js +46 -0
- package/dist/core/skills-manifest.js.map +1 -1
- package/dist/core/system-reset.d.ts +25 -0
- package/dist/core/system-reset.d.ts.map +1 -1
- package/dist/core/system-reset.js +47 -0
- package/dist/core/system-reset.js.map +1 -1
- package/dist/core/wiki/approval-queue.d.ts +31 -0
- package/dist/core/wiki/approval-queue.d.ts.map +1 -0
- package/dist/core/wiki/approval-queue.js +44 -0
- package/dist/core/wiki/approval-queue.js.map +1 -0
- package/dist/core/wiki/bridge.d.ts +74 -0
- package/dist/core/wiki/bridge.d.ts.map +1 -0
- package/dist/core/wiki/bridge.js +405 -0
- package/dist/core/wiki/bridge.js.map +1 -0
- package/dist/core/wiki/compile-lock.d.ts +42 -0
- package/dist/core/wiki/compile-lock.d.ts.map +1 -0
- package/dist/core/wiki/compile-lock.js +55 -0
- package/dist/core/wiki/compile-lock.js.map +1 -0
- package/dist/core/wiki/compile-preview.d.ts +8 -0
- package/dist/core/wiki/compile-preview.d.ts.map +1 -0
- package/dist/core/wiki/compile-preview.js +200 -0
- package/dist/core/wiki/compile-preview.js.map +1 -0
- package/dist/core/wiki/cost-estimate.d.ts +30 -0
- package/dist/core/wiki/cost-estimate.d.ts.map +1 -0
- package/dist/core/wiki/cost-estimate.js +243 -0
- package/dist/core/wiki/cost-estimate.js.map +1 -0
- package/dist/core/wiki/dispatcher.d.ts +48 -0
- package/dist/core/wiki/dispatcher.d.ts.map +1 -0
- package/dist/core/wiki/dispatcher.js +92 -0
- package/dist/core/wiki/dispatcher.js.map +1 -0
- package/dist/core/wiki/git-precompile.d.ts +86 -0
- package/dist/core/wiki/git-precompile.d.ts.map +1 -0
- package/dist/core/wiki/git-precompile.js +96 -0
- package/dist/core/wiki/git-precompile.js.map +1 -0
- package/dist/core/wiki/import-migrate.d.ts +38 -0
- package/dist/core/wiki/import-migrate.d.ts.map +1 -0
- package/dist/core/wiki/import-migrate.js +310 -0
- package/dist/core/wiki/import-migrate.js.map +1 -0
- package/dist/core/wiki/import-probe.d.ts +76 -0
- package/dist/core/wiki/import-probe.d.ts.map +1 -0
- package/dist/core/wiki/import-probe.js +245 -0
- package/dist/core/wiki/import-probe.js.map +1 -0
- package/dist/core/wiki/index-cache.d.ts +39 -0
- package/dist/core/wiki/index-cache.d.ts.map +1 -0
- package/dist/core/wiki/index-cache.js +152 -0
- package/dist/core/wiki/index-cache.js.map +1 -0
- package/dist/core/wiki/multi-url-dispatch.d.ts +52 -0
- package/dist/core/wiki/multi-url-dispatch.d.ts.map +1 -0
- package/dist/core/wiki/multi-url-dispatch.js +72 -0
- package/dist/core/wiki/multi-url-dispatch.js.map +1 -0
- package/dist/core/wiki/wiki-fts.d.ts +75 -0
- package/dist/core/wiki/wiki-fts.d.ts.map +1 -0
- package/dist/core/wiki/wiki-fts.js +265 -0
- package/dist/core/wiki/wiki-fts.js.map +1 -0
- package/dist/core/wiki/workspaces.d.ts +101 -0
- package/dist/core/wiki/workspaces.d.ts.map +1 -0
- package/dist/core/wiki/workspaces.js +352 -0
- package/dist/core/wiki/workspaces.js.map +1 -0
- package/dist/core/wiki/write-strategy.d.ts +70 -0
- package/dist/core/wiki/write-strategy.d.ts.map +1 -0
- package/dist/core/wiki/write-strategy.js +112 -0
- package/dist/core/wiki/write-strategy.js.map +1 -0
- package/dist/core/workdir.d.ts +8 -1
- package/dist/core/workdir.d.ts.map +1 -1
- package/dist/core/workdir.js +4 -1
- package/dist/core/workdir.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +122 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/wiki-store.d.ts +3 -0
- package/dist/db/wiki-store.d.ts.map +1 -0
- package/dist/db/wiki-store.js +7 -0
- package/dist/db/wiki-store.js.map +1 -0
- package/dist/index.js +87 -4
- package/dist/index.js.map +1 -1
- package/dist/messaging/setup-welcome-dm.d.ts +30 -0
- package/dist/messaging/setup-welcome-dm.d.ts.map +1 -0
- package/dist/messaging/setup-welcome-dm.js +86 -0
- package/dist/messaging/setup-welcome-dm.js.map +1 -0
- package/dist/messaging/url-extract.d.ts +8 -0
- package/dist/messaging/url-extract.d.ts.map +1 -0
- package/dist/messaging/url-extract.js +41 -0
- package/dist/messaging/url-extract.js.map +1 -0
- package/dist/observers/delegated-sync-worker.d.ts +33 -25
- package/dist/observers/delegated-sync-worker.d.ts.map +1 -1
- package/dist/observers/delegated-sync-worker.js +38 -31
- package/dist/observers/delegated-sync-worker.js.map +1 -1
- package/dist/observers/imminent-event-scheduler.d.ts +20 -7
- package/dist/observers/imminent-event-scheduler.d.ts.map +1 -1
- package/dist/observers/imminent-event-scheduler.js +134 -29
- package/dist/observers/imminent-event-scheduler.js.map +1 -1
- package/dist/safety/always-disallowed.d.ts +65 -0
- package/dist/safety/always-disallowed.d.ts.map +1 -1
- package/dist/safety/always-disallowed.js +106 -10
- package/dist/safety/always-disallowed.js.map +1 -1
- package/dist/safety/audit.d.ts +46 -1
- package/dist/safety/audit.d.ts.map +1 -1
- package/dist/safety/audit.js +79 -16
- package/dist/safety/audit.js.map +1 -1
- package/dist/safety/risk-classifier.d.ts.map +1 -1
- package/dist/safety/risk-classifier.js +29 -0
- package/dist/safety/risk-classifier.js.map +1 -1
- package/dist/settings/runtime-settings.d.ts +12 -1
- package/dist/settings/runtime-settings.d.ts.map +1 -1
- package/dist/settings/runtime-settings.js +59 -1
- package/dist/settings/runtime-settings.js.map +1 -1
- 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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"}
|
package/dist/core/workdir.d.ts
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAeH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,UAAU,EACX,MAAM,eAAe,CAAC;AAqBvB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAgD7E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAErD;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAErD;AAED,KAAK,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AActE,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAoB5B;AA+ED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,SAAS,OAAO,8BAA8B,EAAE,WAAW,EAAE,CAAC;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACjE,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;6CAEyC;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"workdir.d.ts","sourceRoot":"","sources":["../../src/core/workdir.ts"],"names":[],"mappings":"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"}
|
package/dist/core/workdir.js
CHANGED
|
@@ -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);
|