@jayjiang/byoao 1.1.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/plugin-config.test.js +7 -10
- package/dist/__tests__/plugin-config.test.js.map +1 -1
- package/dist/assets/obsidian-skills/byoao-conventions.md +30 -54
- package/dist/assets/obsidian-skills/vault-thinking.md +6 -5
- package/dist/assets/presets/common/AGENTS.md.hbs +29 -46
- package/dist/assets/presets/common/SCHEMA.md.hbs +57 -0
- package/dist/assets/presets/common/Start Here.md.hbs +29 -40
- package/dist/assets/presets/minimal/preset.json +3 -3
- package/dist/assets/presets/pm-tpm/preset.json +2 -2
- package/dist/assets/skills/ask.md +28 -27
- package/dist/assets/skills/challenge.md +79 -121
- package/dist/assets/skills/connect.md +75 -163
- package/dist/assets/skills/cook.md +167 -0
- package/dist/assets/skills/diagnose.md +102 -43
- package/dist/assets/skills/drift.md +64 -165
- package/dist/assets/skills/health.md +63 -0
- package/dist/assets/skills/ideas.md +11 -10
- package/dist/assets/skills/organize.md +56 -155
- package/dist/assets/skills/prep.md +63 -0
- package/dist/assets/skills/trace.md +75 -90
- package/dist/assets/skills/wiki.md +77 -178
- package/dist/cli/cli-program.js +17 -14
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/installer.js +10 -4
- package/dist/cli/installer.js.map +1 -1
- package/dist/hooks/idle-suggestions.js +4 -4
- package/dist/hooks/idle-suggestions.js.map +1 -1
- package/dist/hooks/system-transform.js +35 -1
- package/dist/hooks/system-transform.js.map +1 -1
- package/dist/index.js +395 -623
- package/dist/index.js.map +1 -1
- package/dist/plugin-config.js +6 -32
- package/dist/plugin-config.js.map +1 -1
- package/dist/tools/init-vault.js +8 -38
- package/dist/tools/init-vault.js.map +1 -1
- package/dist/tools/vault-doctor.js +1 -1
- package/dist/tools/vault-doctor.js.map +1 -1
- package/dist/tools/vault-status.js +1 -1
- package/dist/tools/vault-status.js.map +1 -1
- package/dist/vault/__tests__/create.test.js +47 -115
- package/dist/vault/__tests__/create.test.js.map +1 -1
- package/dist/vault/__tests__/doctor.test.js +14 -2
- package/dist/vault/__tests__/doctor.test.js.map +1 -1
- package/dist/vault/__tests__/manifest.test.js +2 -2
- package/dist/vault/__tests__/manifest.test.js.map +1 -1
- package/dist/vault/__tests__/status.test.js +12 -0
- package/dist/vault/__tests__/status.test.js.map +1 -1
- package/dist/vault/__tests__/upgrade.test.js +3 -3
- package/dist/vault/__tests__/upgrade.test.js.map +1 -1
- package/dist/vault/create.js +75 -188
- package/dist/vault/create.js.map +1 -1
- package/dist/vault/doctor.js +49 -0
- package/dist/vault/doctor.js.map +1 -1
- package/dist/vault/manifest.js +1 -1
- package/dist/vault/preset.js +10 -4
- package/dist/vault/preset.js.map +1 -1
- package/dist/vault/self-update.js +1 -1
- package/dist/vault/status.js +24 -0
- package/dist/vault/status.js.map +1 -1
- package/dist/vault/upgrade.js +120 -16
- package/dist/vault/upgrade.js.map +1 -1
- package/package.json +1 -1
- package/src/assets/obsidian-skills/byoao-conventions.md +9 -6
- package/src/assets/obsidian-skills/vault-thinking.md +6 -5
- package/src/assets/presets/common/AGENTS.md.hbs +23 -19
- package/src/assets/presets/common/SCHEMA.md.hbs +57 -0
- package/src/assets/presets/common/Start Here.md.hbs +29 -40
- package/src/assets/presets/minimal/preset.json +3 -3
- package/src/assets/presets/pm-tpm/preset.json +2 -2
- package/src/skills/ask.md +28 -27
- package/src/skills/challenge.md +79 -121
- package/src/skills/connect.md +75 -163
- package/src/skills/cook.md +167 -0
- package/src/skills/diagnose.md +102 -43
- package/src/skills/drift.md +64 -165
- package/src/skills/health.md +63 -0
- package/src/skills/ideas.md +11 -10
- package/src/skills/organize.md +56 -155
- package/src/skills/prep.md +63 -0
- package/src/skills/trace.md +75 -90
- package/src/skills/wiki.md +77 -178
- package/dist/assets/presets/common/Glossary.md.hbs +0 -16
- package/dist/assets/presets/common/obsidian/daily-notes.json +0 -5
- package/dist/assets/presets/common/obsidian/templates.json +0 -3
- package/dist/assets/presets/common/templates/Daily Note.md +0 -19
- package/dist/assets/presets/common/templates/Decision Record.md +0 -32
- package/dist/assets/presets/common/templates/Investigation.md +0 -34
- package/dist/assets/presets/common/templates/Meeting Notes.md +0 -25
- package/dist/assets/skills/emerge.md +0 -168
- package/dist/assets/skills/weave.md +0 -287
- package/dist/tools/add-glossary-term.js +0 -21
- package/dist/tools/add-glossary-term.js.map +0 -1
- package/dist/tools/add-person.js +0 -21
- package/dist/tools/add-person.js.map +0 -1
- package/dist/tools/add-project.js +0 -24
- package/dist/tools/add-project.js.map +0 -1
- package/dist/tools/graph-health.js +0 -25
- package/dist/tools/graph-health.js.map +0 -1
- package/dist/tools/note-read.js +0 -19
- package/dist/tools/note-read.js.map +0 -1
- package/dist/tools/search-vault.js +0 -22
- package/dist/tools/search-vault.js.map +0 -1
- package/dist/vault/__tests__/glossary.test.js +0 -68
- package/dist/vault/__tests__/glossary.test.js.map +0 -1
- package/dist/vault/__tests__/graph-health.test.js +0 -102
- package/dist/vault/__tests__/graph-health.test.js.map +0 -1
- package/dist/vault/__tests__/member.test.js +0 -85
- package/dist/vault/__tests__/member.test.js.map +0 -1
- package/dist/vault/__tests__/note-read.test.js +0 -71
- package/dist/vault/__tests__/note-read.test.js.map +0 -1
- package/dist/vault/__tests__/obsidian-cli.test.js +0 -108
- package/dist/vault/__tests__/obsidian-cli.test.js.map +0 -1
- package/dist/vault/__tests__/search-vault.test.js +0 -93
- package/dist/vault/__tests__/search-vault.test.js.map +0 -1
- package/dist/vault/glossary.js +0 -27
- package/dist/vault/glossary.js.map +0 -1
- package/dist/vault/graph-health.js +0 -83
- package/dist/vault/graph-health.js.map +0 -1
- package/dist/vault/member.js +0 -67
- package/dist/vault/member.js.map +0 -1
- package/dist/vault/note-read.js +0 -70
- package/dist/vault/note-read.js.map +0 -1
- package/dist/vault/project.js +0 -68
- package/dist/vault/project.js.map +0 -1
- package/dist/vault/retrieval-types.js +0 -5
- package/dist/vault/retrieval-types.js.map +0 -1
- package/dist/vault/search-vault.js +0 -87
- package/dist/vault/search-vault.js.map +0 -1
- package/src/assets/presets/common/obsidian/daily-notes.json +0 -5
- package/src/assets/presets/common/obsidian/templates.json +0 -3
- package/src/assets/presets/common/templates/Daily Note.md +0 -19
- package/src/assets/presets/common/templates/Decision Record.md +0 -32
- package/src/assets/presets/common/templates/Investigation.md +0 -34
- package/src/assets/presets/common/templates/Meeting Notes.md +0 -25
- package/src/skills/emerge.md +0 -168
- package/src/skills/weave.md +0 -287
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import fs from "fs-extra";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import { addMember } from "../member.js";
|
|
6
|
-
let tmpDir;
|
|
7
|
-
beforeEach(async () => {
|
|
8
|
-
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "byoao-member-"));
|
|
9
|
-
await fs.ensureDir(path.join(tmpDir, "People"));
|
|
10
|
-
});
|
|
11
|
-
afterEach(async () => {
|
|
12
|
-
await fs.remove(tmpDir);
|
|
13
|
-
});
|
|
14
|
-
describe("addMember", () => {
|
|
15
|
-
it("creates person note with correct frontmatter", async () => {
|
|
16
|
-
const result = await addMember({
|
|
17
|
-
vaultPath: tmpDir,
|
|
18
|
-
name: "Alice",
|
|
19
|
-
role: "Engineer",
|
|
20
|
-
team: "Platform",
|
|
21
|
-
});
|
|
22
|
-
expect(result.filePath).toContain("People/Alice.md");
|
|
23
|
-
const content = await fs.readFile(path.join(tmpDir, "People/Alice.md"), "utf-8");
|
|
24
|
-
expect(content).toContain("type: person");
|
|
25
|
-
expect(content).toContain('team: "Platform"');
|
|
26
|
-
expect(content).toContain('role: "Engineer"');
|
|
27
|
-
expect(content).toContain("status: active");
|
|
28
|
-
});
|
|
29
|
-
it("updates team index table", async () => {
|
|
30
|
-
// Create a team index file
|
|
31
|
-
const teamIndexContent = `---
|
|
32
|
-
title: "Platform Team"
|
|
33
|
-
type: reference
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
# Platform Team
|
|
37
|
-
|
|
38
|
-
## Members
|
|
39
|
-
|
|
40
|
-
| Name | Role |
|
|
41
|
-
|------|------|
|
|
42
|
-
|
|
43
|
-
## Active Projects
|
|
44
|
-
`;
|
|
45
|
-
await fs.writeFile(path.join(tmpDir, "People/Platform Team.md"), teamIndexContent);
|
|
46
|
-
await addMember({
|
|
47
|
-
vaultPath: tmpDir,
|
|
48
|
-
name: "Bob",
|
|
49
|
-
role: "PM",
|
|
50
|
-
team: "Platform",
|
|
51
|
-
});
|
|
52
|
-
const updated = await fs.readFile(path.join(tmpDir, "People/Platform Team.md"), "utf-8");
|
|
53
|
-
expect(updated).toContain("[[Bob]]");
|
|
54
|
-
expect(updated).toContain("PM");
|
|
55
|
-
});
|
|
56
|
-
it("updates AGENT.md wikilinks", async () => {
|
|
57
|
-
const agentContent = `# Agent
|
|
58
|
-
|
|
59
|
-
## Team
|
|
60
|
-
|
|
61
|
-
(No members added yet — create notes in People/)
|
|
62
|
-
`;
|
|
63
|
-
await fs.writeFile(path.join(tmpDir, "AGENT.md"), agentContent);
|
|
64
|
-
const result = await addMember({
|
|
65
|
-
vaultPath: tmpDir,
|
|
66
|
-
name: "Carol",
|
|
67
|
-
role: "Designer",
|
|
68
|
-
team: "Platform",
|
|
69
|
-
});
|
|
70
|
-
expect(result.wikilinksAdded).toBeGreaterThanOrEqual(1);
|
|
71
|
-
const agent = await fs.readFile(path.join(tmpDir, "AGENT.md"), "utf-8");
|
|
72
|
-
expect(agent).toContain("[[Carol]]");
|
|
73
|
-
expect(agent).not.toContain("No members added yet");
|
|
74
|
-
});
|
|
75
|
-
it("throws when person already exists", async () => {
|
|
76
|
-
await fs.writeFile(path.join(tmpDir, "People/Alice.md"), "# Alice");
|
|
77
|
-
await expect(addMember({
|
|
78
|
-
vaultPath: tmpDir,
|
|
79
|
-
name: "Alice",
|
|
80
|
-
role: "Eng",
|
|
81
|
-
team: "T",
|
|
82
|
-
})).rejects.toThrow("already exists");
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
//# sourceMappingURL=member.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"member.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/member.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
vi.mock("../obsidian-cli.js", () => ({
|
|
3
|
-
isObsidianCliAvailable: vi.fn(),
|
|
4
|
-
execObsidianCmd: vi.fn(),
|
|
5
|
-
}));
|
|
6
|
-
import { readNote } from "../note-read.js";
|
|
7
|
-
import { isObsidianCliAvailable, execObsidianCmd } from "../obsidian-cli.js";
|
|
8
|
-
const mockIsAvailable = vi.mocked(isObsidianCliAvailable);
|
|
9
|
-
const mockExecCmd = vi.mocked(execObsidianCmd);
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
vi.resetAllMocks();
|
|
12
|
-
});
|
|
13
|
-
describe("readNote", () => {
|
|
14
|
-
it("returns runtime_unavailable when CLI is not available", async () => {
|
|
15
|
-
mockIsAvailable.mockReturnValue(false);
|
|
16
|
-
const result = await readNote({ vaultPath: "/vault", file: "MyNote" });
|
|
17
|
-
expect(result.status).toBe("runtime_unavailable");
|
|
18
|
-
expect(result.mode).toBe("read");
|
|
19
|
-
expect(result.diagnostics).toContain("Obsidian CLI not available");
|
|
20
|
-
});
|
|
21
|
-
it("returns runtime_unavailable when CLI command fails", async () => {
|
|
22
|
-
mockIsAvailable.mockReturnValue(true);
|
|
23
|
-
mockExecCmd.mockReturnValue({
|
|
24
|
-
success: false,
|
|
25
|
-
output: "",
|
|
26
|
-
error: "Note not found",
|
|
27
|
-
});
|
|
28
|
-
const result = await readNote({ vaultPath: "/vault", file: "Missing" });
|
|
29
|
-
expect(result.status).toBe("runtime_unavailable");
|
|
30
|
-
expect(result.diagnostics[0]).toContain("Note not found");
|
|
31
|
-
});
|
|
32
|
-
it("returns note content as a single result item", async () => {
|
|
33
|
-
mockIsAvailable.mockReturnValue(true);
|
|
34
|
-
mockExecCmd.mockReturnValue({
|
|
35
|
-
success: true,
|
|
36
|
-
output: "---\ntype: project\ntags: [active]\n---\n\n# Refund Automation\n\nProject details here.",
|
|
37
|
-
});
|
|
38
|
-
const result = await readNote({ vaultPath: "/vault", file: "Refund Automation" });
|
|
39
|
-
expect(result.status).toBe("ok");
|
|
40
|
-
expect(result.results).toHaveLength(1);
|
|
41
|
-
expect(result.results[0].title).toBe("Refund Automation");
|
|
42
|
-
expect(result.results[0].file).toBe("Refund Automation");
|
|
43
|
-
expect(result.results[0].snippet).toContain("Project details here");
|
|
44
|
-
});
|
|
45
|
-
it("returns no_results when CLI returns empty output", async () => {
|
|
46
|
-
mockIsAvailable.mockReturnValue(true);
|
|
47
|
-
mockExecCmd.mockReturnValue({ success: true, output: "" });
|
|
48
|
-
const result = await readNote({ vaultPath: "/vault", file: "Empty" });
|
|
49
|
-
expect(result.status).toBe("no_results");
|
|
50
|
-
expect(result.results).toHaveLength(0);
|
|
51
|
-
});
|
|
52
|
-
it("passes vault path and file to CLI correctly", async () => {
|
|
53
|
-
mockIsAvailable.mockReturnValue(true);
|
|
54
|
-
mockExecCmd.mockReturnValue({ success: true, output: "content" });
|
|
55
|
-
await readNote({ vaultPath: "/my/vault", file: "My Note" });
|
|
56
|
-
expect(mockExecCmd).toHaveBeenCalledWith([
|
|
57
|
-
"read",
|
|
58
|
-
"--vault",
|
|
59
|
-
"/my/vault",
|
|
60
|
-
"My Note",
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
it("truncates snippet for very long notes", async () => {
|
|
64
|
-
mockIsAvailable.mockReturnValue(true);
|
|
65
|
-
const longContent = "a".repeat(500);
|
|
66
|
-
mockExecCmd.mockReturnValue({ success: true, output: longContent });
|
|
67
|
-
const result = await readNote({ vaultPath: "/vault", file: "Long" });
|
|
68
|
-
expect(result.results[0].snippet.length).toBeLessThanOrEqual(240);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=note-read.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"note-read.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/note-read.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
// vi.mock factories are hoisted above variable declarations, so mocks must be
|
|
3
|
-
// created with vi.hoisted() to be accessible inside factory callbacks.
|
|
4
|
-
const { mockExecSync, mockSpawnSync, mockPlatform } = vi.hoisted(() => ({
|
|
5
|
-
mockExecSync: vi.fn(),
|
|
6
|
-
mockSpawnSync: vi.fn(),
|
|
7
|
-
mockPlatform: vi.fn().mockReturnValue("darwin"),
|
|
8
|
-
}));
|
|
9
|
-
vi.mock("node:child_process", () => ({
|
|
10
|
-
execSync: mockExecSync,
|
|
11
|
-
spawnSync: mockSpawnSync,
|
|
12
|
-
}));
|
|
13
|
-
vi.mock("node:os", () => ({
|
|
14
|
-
platform: mockPlatform,
|
|
15
|
-
}));
|
|
16
|
-
import { execObsidianCmd, isObsidianCliAvailable, } from "../obsidian-cli.js";
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
vi.resetAllMocks();
|
|
19
|
-
mockPlatform.mockReturnValue("darwin");
|
|
20
|
-
});
|
|
21
|
-
describe("isObsidianCliAvailable", () => {
|
|
22
|
-
it("uses `which` on macOS and returns true when the binary is found", () => {
|
|
23
|
-
mockPlatform.mockReturnValue("darwin");
|
|
24
|
-
mockExecSync.mockReturnValue("/Applications/Obsidian.app/Contents/MacOS/obsidian\n");
|
|
25
|
-
expect(isObsidianCliAvailable()).toBe(true);
|
|
26
|
-
expect(mockExecSync).toHaveBeenCalledWith("which obsidian", expect.objectContaining({ stdio: "pipe" }));
|
|
27
|
-
});
|
|
28
|
-
it("uses `which` on Linux and returns true when the binary is found", () => {
|
|
29
|
-
mockPlatform.mockReturnValue("linux");
|
|
30
|
-
mockExecSync.mockReturnValue("/usr/bin/obsidian\n");
|
|
31
|
-
expect(isObsidianCliAvailable()).toBe(true);
|
|
32
|
-
expect(mockExecSync).toHaveBeenCalledWith("which obsidian", expect.objectContaining({ stdio: "pipe" }));
|
|
33
|
-
});
|
|
34
|
-
it("uses `where` on Windows and returns true when the binary is found", () => {
|
|
35
|
-
mockPlatform.mockReturnValue("win32");
|
|
36
|
-
mockExecSync.mockReturnValue("C:\\Users\\dev\\AppData\\Local\\Obsidian\\obsidian.exe\n");
|
|
37
|
-
expect(isObsidianCliAvailable()).toBe(true);
|
|
38
|
-
expect(mockExecSync).toHaveBeenCalledWith("where obsidian", expect.objectContaining({ stdio: "pipe" }));
|
|
39
|
-
});
|
|
40
|
-
it("returns false when the binary is not found on any platform", () => {
|
|
41
|
-
mockExecSync.mockImplementation(() => {
|
|
42
|
-
throw new Error("not found");
|
|
43
|
-
});
|
|
44
|
-
expect(isObsidianCliAvailable()).toBe(false);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
describe("execObsidianCmd", () => {
|
|
48
|
-
it("returns success when Obsidian exits 0 even if installer warning is present", () => {
|
|
49
|
-
mockSpawnSync.mockReturnValue({
|
|
50
|
-
stdout: "2026-04-07 Loading updated app package /tmp/obsidian.asar\n" +
|
|
51
|
-
"Your Obsidian installer is out of date. Please download the latest installer which includes better CLI support: https://obsidian.md/download\n" +
|
|
52
|
-
"Actual result data\n",
|
|
53
|
-
stderr: "",
|
|
54
|
-
status: 0,
|
|
55
|
-
signal: null,
|
|
56
|
-
error: undefined,
|
|
57
|
-
});
|
|
58
|
-
const result = execObsidianCmd(["help"]);
|
|
59
|
-
expect(result.success).toBe(true);
|
|
60
|
-
expect(result.output).toContain("Actual result data");
|
|
61
|
-
});
|
|
62
|
-
it("classifies missing CLI registrations", () => {
|
|
63
|
-
const error = Object.assign(new Error("spawnSync obsidian ENOENT"), {
|
|
64
|
-
code: "ENOENT",
|
|
65
|
-
});
|
|
66
|
-
mockSpawnSync.mockReturnValue({
|
|
67
|
-
stdout: "",
|
|
68
|
-
stderr: "",
|
|
69
|
-
status: null,
|
|
70
|
-
signal: null,
|
|
71
|
-
error,
|
|
72
|
-
});
|
|
73
|
-
const result = execObsidianCmd(["read", "file=Test"]);
|
|
74
|
-
expect(result.success).toBe(false);
|
|
75
|
-
expect(result.reason).toBe("cli_not_registered");
|
|
76
|
-
expect(result.guidance).toContain("Enable Obsidian CLI in Settings -> General -> Command line interface.");
|
|
77
|
-
});
|
|
78
|
-
it("returns sanitized output on success", () => {
|
|
79
|
-
mockSpawnSync.mockReturnValue({
|
|
80
|
-
stdout: "2026-04-07 Loading updated app package /tmp/obsidian.asar\nHello\n",
|
|
81
|
-
stderr: "",
|
|
82
|
-
status: 0,
|
|
83
|
-
signal: null,
|
|
84
|
-
error: undefined,
|
|
85
|
-
});
|
|
86
|
-
const result = execObsidianCmd(["read", "file=Hello"]);
|
|
87
|
-
expect(result.success).toBe(true);
|
|
88
|
-
expect(result.output).toBe("Hello");
|
|
89
|
-
});
|
|
90
|
-
it("prefixes vault-scoped commands with vault=<basename>", () => {
|
|
91
|
-
mockSpawnSync.mockReturnValue({
|
|
92
|
-
stdout: "",
|
|
93
|
-
stderr: "",
|
|
94
|
-
status: 0,
|
|
95
|
-
signal: null,
|
|
96
|
-
error: undefined,
|
|
97
|
-
});
|
|
98
|
-
execObsidianCmd(["search:context", "query=test"], {
|
|
99
|
-
vaultPath: "/Users/dev/Documents/Tech & News",
|
|
100
|
-
});
|
|
101
|
-
expect(mockSpawnSync).toHaveBeenCalledWith("obsidian", ["vault=Tech & News", "search:context", "query=test"], expect.objectContaining({
|
|
102
|
-
stdio: "pipe",
|
|
103
|
-
encoding: "utf-8",
|
|
104
|
-
timeout: 10000,
|
|
105
|
-
}));
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
//# sourceMappingURL=obsidian-cli.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"obsidian-cli.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/obsidian-cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
// Mock obsidian-cli before importing the module under test
|
|
3
|
-
vi.mock("../obsidian-cli.js", () => ({
|
|
4
|
-
isObsidianCliAvailable: vi.fn(),
|
|
5
|
-
execObsidianCmd: vi.fn(),
|
|
6
|
-
}));
|
|
7
|
-
import { searchVault } from "../search-vault.js";
|
|
8
|
-
import { isObsidianCliAvailable, execObsidianCmd } from "../obsidian-cli.js";
|
|
9
|
-
const mockIsAvailable = vi.mocked(isObsidianCliAvailable);
|
|
10
|
-
const mockExecCmd = vi.mocked(execObsidianCmd);
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
vi.resetAllMocks();
|
|
13
|
-
});
|
|
14
|
-
describe("searchVault", () => {
|
|
15
|
-
it("returns runtime_unavailable when CLI is not available", async () => {
|
|
16
|
-
mockIsAvailable.mockReturnValue(false);
|
|
17
|
-
const result = await searchVault({ vaultPath: "/vault", query: "test" });
|
|
18
|
-
expect(result.status).toBe("runtime_unavailable");
|
|
19
|
-
expect(result.mode).toBe("search:context");
|
|
20
|
-
expect(result.fallback).toBe("none");
|
|
21
|
-
expect(result.diagnostics).toContain("Obsidian CLI not available");
|
|
22
|
-
});
|
|
23
|
-
it("returns runtime_unavailable when CLI command fails", async () => {
|
|
24
|
-
mockIsAvailable.mockReturnValue(true);
|
|
25
|
-
mockExecCmd.mockReturnValue({
|
|
26
|
-
success: false,
|
|
27
|
-
output: "",
|
|
28
|
-
error: "Vault not found",
|
|
29
|
-
});
|
|
30
|
-
const result = await searchVault({ vaultPath: "/vault", query: "test" });
|
|
31
|
-
expect(result.status).toBe("runtime_unavailable");
|
|
32
|
-
expect(result.diagnostics[0]).toContain("Vault not found");
|
|
33
|
-
});
|
|
34
|
-
it("returns no_results when CLI returns empty output", async () => {
|
|
35
|
-
mockIsAvailable.mockReturnValue(true);
|
|
36
|
-
mockExecCmd.mockReturnValue({ success: true, output: "" });
|
|
37
|
-
const result = await searchVault({ vaultPath: "/vault", query: "test" });
|
|
38
|
-
expect(result.status).toBe("no_results");
|
|
39
|
-
expect(result.results).toHaveLength(0);
|
|
40
|
-
});
|
|
41
|
-
it("parses CLI output into structured results", async () => {
|
|
42
|
-
mockIsAvailable.mockReturnValue(true);
|
|
43
|
-
mockExecCmd.mockReturnValue({
|
|
44
|
-
success: true,
|
|
45
|
-
output: [
|
|
46
|
-
"Projects/Refund Automation.md:Owner handoff for refund automation workflow",
|
|
47
|
-
"Daily/2026-03-20.md:Discussed refund automation timeline with team",
|
|
48
|
-
].join("\n"),
|
|
49
|
-
});
|
|
50
|
-
const result = await searchVault({ vaultPath: "/vault", query: "refund" });
|
|
51
|
-
expect(result.status).toBe("ok");
|
|
52
|
-
expect(result.results).toHaveLength(2);
|
|
53
|
-
expect(result.results[0].title).toBe("Refund Automation");
|
|
54
|
-
expect(result.results[0].path).toBe("Projects/Refund Automation.md");
|
|
55
|
-
expect(result.results[0].file).toBe("Refund Automation");
|
|
56
|
-
expect(result.results[0].snippet).toContain("refund automation");
|
|
57
|
-
});
|
|
58
|
-
it("respects the limit parameter", async () => {
|
|
59
|
-
mockIsAvailable.mockReturnValue(true);
|
|
60
|
-
const lines = Array.from({ length: 30 }, (_, i) => `Notes/note${i}.md:content line ${i}`);
|
|
61
|
-
mockExecCmd.mockReturnValue({ success: true, output: lines.join("\n") });
|
|
62
|
-
const result = await searchVault({
|
|
63
|
-
vaultPath: "/vault",
|
|
64
|
-
query: "content",
|
|
65
|
-
limit: 5,
|
|
66
|
-
});
|
|
67
|
-
expect(result.results).toHaveLength(5);
|
|
68
|
-
expect(result.truncated).toBe(true);
|
|
69
|
-
expect(result.totalMatches).toBe(30);
|
|
70
|
-
});
|
|
71
|
-
it("truncates snippets to MAX_SNIPPET_LENGTH", async () => {
|
|
72
|
-
mockIsAvailable.mockReturnValue(true);
|
|
73
|
-
const longLine = "a".repeat(500);
|
|
74
|
-
mockExecCmd.mockReturnValue({
|
|
75
|
-
success: true,
|
|
76
|
-
output: `Notes/long.md:${longLine}`,
|
|
77
|
-
});
|
|
78
|
-
const result = await searchVault({ vaultPath: "/vault", query: "a" });
|
|
79
|
-
expect(result.results[0].snippet.length).toBeLessThanOrEqual(240);
|
|
80
|
-
});
|
|
81
|
-
it("passes vault path and query to CLI correctly", async () => {
|
|
82
|
-
mockIsAvailable.mockReturnValue(true);
|
|
83
|
-
mockExecCmd.mockReturnValue({ success: true, output: "" });
|
|
84
|
-
await searchVault({ vaultPath: "/my/vault", query: "hello world" });
|
|
85
|
-
expect(mockExecCmd).toHaveBeenCalledWith([
|
|
86
|
-
"search:context",
|
|
87
|
-
"--vault",
|
|
88
|
-
"/my/vault",
|
|
89
|
-
"hello world",
|
|
90
|
-
]);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
//# sourceMappingURL=search-vault.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-vault.test.js","sourceRoot":"","sources":["../../../src/vault/__tests__/search-vault.test.ts"],"names":[],"mappings":"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"}
|
package/dist/vault/glossary.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { fs } from "../lib/cjs-modules.js";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export async function addGlossaryTerm(input) {
|
|
4
|
-
const { vaultPath, term, definition, domain } = input;
|
|
5
|
-
const glossaryPath = path.join(vaultPath, "Knowledge/Glossary.md");
|
|
6
|
-
if (!(await fs.pathExists(glossaryPath))) {
|
|
7
|
-
throw new Error(`Glossary not found at: ${glossaryPath}`);
|
|
8
|
-
}
|
|
9
|
-
let content = await fs.readFile(glossaryPath, "utf-8");
|
|
10
|
-
const newRow = `| **${term}** | ${definition} | ${domain ?? ""} |`;
|
|
11
|
-
// Find the glossary table (Term | Definition | Domain)
|
|
12
|
-
const tableMatch = content.match(/(\| Term \| Definition \| Domain \|\n\|------\|-----------|--------\|\n)([\s\S]*?)(\n*$)/);
|
|
13
|
-
if (tableMatch) {
|
|
14
|
-
const [fullMatch, tableHeader, existingRows, trailing] = tableMatch;
|
|
15
|
-
const updatedRows = existingRows.trim()
|
|
16
|
-
? `${existingRows.trim()}\n${newRow}`
|
|
17
|
-
: newRow;
|
|
18
|
-
content = content.replace(fullMatch, `${tableHeader}${updatedRows}\n`);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
// Fallback: append to end of file
|
|
22
|
-
content = content.trimEnd() + `\n${newRow}\n`;
|
|
23
|
-
}
|
|
24
|
-
await fs.writeFile(glossaryPath, content);
|
|
25
|
-
return { glossaryPath, termAdded: term };
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=glossary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glossary.js","sourceRoot":"","sources":["../../src/vault/glossary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEtD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,OAAO,IAAI,QAAQ,UAAU,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC;IAEnE,uDAAuD;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAC9B,0FAA0F,CAC3F,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC;QACpE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE;YACrC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;YACrC,CAAC,CAAC,MAAM,CAAC;QACX,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,SAAS,EACT,GAAG,WAAW,GAAG,WAAW,IAAI,CACjC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,MAAM,IAAI,CAAC;IAChD,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { isObsidianCliAvailable, execObsidianCmd } from "./obsidian-cli.js";
|
|
3
|
-
import { DEFAULT_RESULT_LIMIT } from "./retrieval-types.js";
|
|
4
|
-
const ALL_CHECKS = ["orphans", "unresolved", "deadends"];
|
|
5
|
-
/** Parse CLI output lines into result items for a given check type. */
|
|
6
|
-
function parseCheckOutput(check, output) {
|
|
7
|
-
const lines = output.split("\n").filter((l) => l.trim().length > 0);
|
|
8
|
-
return lines.map((line) => {
|
|
9
|
-
const trimmed = line.trim();
|
|
10
|
-
// For orphans/deadends: output is file paths
|
|
11
|
-
// For unresolved: output is link target names
|
|
12
|
-
const isPath = trimmed.includes("/") || trimmed.endsWith(".md");
|
|
13
|
-
const title = isPath ? path.basename(trimmed, ".md") : trimmed;
|
|
14
|
-
return {
|
|
15
|
-
title,
|
|
16
|
-
path: isPath ? trimmed : "",
|
|
17
|
-
file: title,
|
|
18
|
-
metadata: { check },
|
|
19
|
-
};
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Run graph health diagnostics using Obsidian CLI.
|
|
24
|
-
* Returns runtime_unavailable if CLI is not available — no internal fallback.
|
|
25
|
-
*/
|
|
26
|
-
export async function getGraphHealth(input) {
|
|
27
|
-
const { vaultPath, check = "all", limit = DEFAULT_RESULT_LIMIT } = input;
|
|
28
|
-
const mode = "graph-health";
|
|
29
|
-
const base = {
|
|
30
|
-
mode,
|
|
31
|
-
vault: vaultPath,
|
|
32
|
-
fallback: "none",
|
|
33
|
-
};
|
|
34
|
-
// 1. Check CLI availability
|
|
35
|
-
if (!isObsidianCliAvailable()) {
|
|
36
|
-
return {
|
|
37
|
-
...base,
|
|
38
|
-
status: "runtime_unavailable",
|
|
39
|
-
summary: "Obsidian CLI not available",
|
|
40
|
-
results: [],
|
|
41
|
-
truncated: false,
|
|
42
|
-
diagnostics: ["Obsidian CLI not available"],
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// 2. Determine which checks to run
|
|
46
|
-
const checks = check === "all" ? ALL_CHECKS : [check];
|
|
47
|
-
// 3. Run each check and collect results
|
|
48
|
-
const allItems = [];
|
|
49
|
-
const diagnostics = [];
|
|
50
|
-
for (const checkType of checks) {
|
|
51
|
-
const cliResult = execObsidianCmd([checkType, "--vault", vaultPath]);
|
|
52
|
-
if (!cliResult.success) {
|
|
53
|
-
diagnostics.push(`${checkType} check failed: ${cliResult.error ?? "unknown error"}`);
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (cliResult.output.trim().length > 0) {
|
|
57
|
-
allItems.push(...parseCheckOutput(checkType, cliResult.output));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// 4. Build response
|
|
61
|
-
if (allItems.length === 0 && diagnostics.length === 0) {
|
|
62
|
-
return {
|
|
63
|
-
...base,
|
|
64
|
-
status: "no_results",
|
|
65
|
-
summary: "No issues found — vault graph is healthy",
|
|
66
|
-
results: [],
|
|
67
|
-
truncated: false,
|
|
68
|
-
diagnostics,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
const truncated = allItems.length > limit;
|
|
72
|
-
const results = allItems.slice(0, limit);
|
|
73
|
-
return {
|
|
74
|
-
...base,
|
|
75
|
-
status: allItems.length > 0 ? "ok" : "no_results",
|
|
76
|
-
summary: `Found ${allItems.length} graph issues across ${checks.join(", ")} checks`,
|
|
77
|
-
results,
|
|
78
|
-
truncated,
|
|
79
|
-
totalMatches: allItems.length,
|
|
80
|
-
diagnostics,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=graph-health.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graph-health.js","sourceRoot":"","sources":["../../src/vault/graph-health.ts"],"names":[],"mappings":"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"}
|
package/dist/vault/member.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { fs } from "../lib/cjs-modules.js";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export async function addMember(input) {
|
|
4
|
-
const { vaultPath, name, role, team } = input;
|
|
5
|
-
let wikilinksAdded = 0;
|
|
6
|
-
// 1. Create person note
|
|
7
|
-
const personPath = path.join(vaultPath, `People/${name}.md`);
|
|
8
|
-
if (await fs.pathExists(personPath)) {
|
|
9
|
-
throw new Error(`Person note already exists: ${personPath}`);
|
|
10
|
-
}
|
|
11
|
-
const content = `---
|
|
12
|
-
title: "${name}"
|
|
13
|
-
type: person
|
|
14
|
-
team: "${team}"
|
|
15
|
-
role: "${role}"
|
|
16
|
-
status: active
|
|
17
|
-
tags: [person]
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
# ${name}
|
|
21
|
-
|
|
22
|
-
**Role**: ${role}
|
|
23
|
-
**Team**: ${team}
|
|
24
|
-
`;
|
|
25
|
-
await fs.writeFile(personPath, content);
|
|
26
|
-
// 2. Update team index if it exists
|
|
27
|
-
const teamFiles = await fs.readdir(path.join(vaultPath, "People"));
|
|
28
|
-
const teamIndexFile = teamFiles.find((f) => f.endsWith("Team.md"));
|
|
29
|
-
if (teamIndexFile) {
|
|
30
|
-
const teamIndexPath = path.join(vaultPath, "People", teamIndexFile);
|
|
31
|
-
let teamContent = await fs.readFile(teamIndexPath, "utf-8");
|
|
32
|
-
// Add to members table
|
|
33
|
-
const tableRow = `| [[${name}]] | ${role} |`;
|
|
34
|
-
if (teamContent.includes("|------|------|")) {
|
|
35
|
-
// Insert after the table header separator
|
|
36
|
-
teamContent = teamContent.replace(/(^\|------|------\|$)/m, `$1\n${tableRow}`);
|
|
37
|
-
wikilinksAdded++;
|
|
38
|
-
}
|
|
39
|
-
await fs.writeFile(teamIndexPath, teamContent);
|
|
40
|
-
}
|
|
41
|
-
// 3. Update AGENTS.md wikilinks (check AGENTS.md first, fallback to AGENT.md)
|
|
42
|
-
for (const agentFile of ["AGENTS.md", "AGENT.md"]) {
|
|
43
|
-
const agentPath = path.join(vaultPath, agentFile);
|
|
44
|
-
if (await fs.pathExists(agentPath)) {
|
|
45
|
-
let agentContent = await fs.readFile(agentPath, "utf-8");
|
|
46
|
-
// Replace placeholder if present
|
|
47
|
-
if (agentContent.includes("(No members added yet")) {
|
|
48
|
-
const table = `| Name | Role |\n|------|------|\n| [[${name}]] | ${role} |`;
|
|
49
|
-
agentContent = agentContent.replace(/\(No members added yet[^)]*\)/, table);
|
|
50
|
-
wikilinksAdded++;
|
|
51
|
-
}
|
|
52
|
-
else if (agentContent.includes("|------|------|")) {
|
|
53
|
-
// Find the team table section and add a row
|
|
54
|
-
const teamSectionMatch = agentContent.match(/## Team[^\n]*\n[\s\S]*?(\|------|------\|[^\n]*(?:\n\|[^\n]*)*)/);
|
|
55
|
-
if (teamSectionMatch) {
|
|
56
|
-
const existingTable = teamSectionMatch[1];
|
|
57
|
-
const newTable = existingTable + `\n| [[${name}]] | ${role} |`;
|
|
58
|
-
agentContent = agentContent.replace(existingTable, newTable);
|
|
59
|
-
wikilinksAdded++;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
await fs.writeFile(agentPath, agentContent);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return { filePath: personPath, wikilinksAdded };
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=member.js.map
|
package/dist/vault/member.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"member.js","sourceRoot":"","sources":["../../src/vault/member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB;IACnD,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAC9C,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC;IAC7D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG;UACR,IAAI;;SAEL,IAAI;SACJ,IAAI;;;;;IAKT,IAAI;;YAEI,IAAI;YACJ,IAAI;CACf,CAAC;IACA,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAExC,oCAAoC;IACpC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE5D,uBAAuB;QACvB,MAAM,QAAQ,GAAG,OAAO,IAAI,QAAQ,IAAI,IAAI,CAAC;QAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC5C,0CAA0C;YAC1C,WAAW,GAAG,WAAW,CAAC,OAAO,CAC/B,wBAAwB,EACxB,OAAO,QAAQ,EAAE,CAClB,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;IAED,8EAA8E;IAC9E,KAAK,MAAM,SAAS,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAEzD,iCAAiC;YACjC,IAAI,YAAY,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,yCAAyC,IAAI,QAAQ,IAAI,IAAI,CAAC;gBAC5E,YAAY,GAAG,YAAY,CAAC,OAAO,CACjC,+BAA+B,EAC/B,KAAK,CACN,CAAC;gBACF,cAAc,EAAE,CAAC;YACnB,CAAC;iBAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACpD,4CAA4C;gBAC5C,MAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,CACzC,iEAAiE,CAClE,CAAC;gBACF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,aAAa,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,QAAQ,GAAG,aAAa,GAAG,SAAS,IAAI,QAAQ,IAAI,IAAI,CAAC;oBAC/D,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;oBAC7D,cAAc,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;YAED,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAClD,CAAC"}
|