@nameczz/skill-sync 0.1.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/LICENSE +21 -0
- package/README.md +246 -0
- package/dist/src/autoSync.d.ts +36 -0
- package/dist/src/autoSync.js +235 -0
- package/dist/src/autoSync.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +211 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/codexArchive.d.ts +38 -0
- package/dist/src/codexArchive.js +340 -0
- package/dist/src/codexArchive.js.map +1 -0
- package/dist/src/config.d.ts +12 -0
- package/dist/src/config.js +78 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/copy.d.ts +1 -0
- package/dist/src/copy.js +42 -0
- package/dist/src/copy.js.map +1 -0
- package/dist/src/directoryPicker.d.ts +8 -0
- package/dist/src/directoryPicker.js +49 -0
- package/dist/src/directoryPicker.js.map +1 -0
- package/dist/src/format.d.ts +2 -0
- package/dist/src/format.js +27 -0
- package/dist/src/format.js.map +1 -0
- package/dist/src/frontmatter.d.ts +5 -0
- package/dist/src/frontmatter.js +36 -0
- package/dist/src/frontmatter.js.map +1 -0
- package/dist/src/git.d.ts +25 -0
- package/dist/src/git.js +227 -0
- package/dist/src/git.js.map +1 -0
- package/dist/src/hash.d.ts +1 -0
- package/dist/src/hash.js +34 -0
- package/dist/src/hash.js.map +1 -0
- package/dist/src/importSkill.d.ts +6 -0
- package/dist/src/importSkill.js +58 -0
- package/dist/src/importSkill.js.map +1 -0
- package/dist/src/init.d.ts +5 -0
- package/dist/src/init.js +13 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/installSkill.d.ts +6 -0
- package/dist/src/installSkill.js +62 -0
- package/dist/src/installSkill.js.map +1 -0
- package/dist/src/json.d.ts +2 -0
- package/dist/src/json.js +11 -0
- package/dist/src/json.js.map +1 -0
- package/dist/src/metadata.d.ts +11 -0
- package/dist/src/metadata.js +115 -0
- package/dist/src/metadata.js.map +1 -0
- package/dist/src/paths.d.ts +22 -0
- package/dist/src/paths.js +103 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/removeLocalSkill.d.ts +5 -0
- package/dist/src/removeLocalSkill.js +79 -0
- package/dist/src/removeLocalSkill.js.map +1 -0
- package/dist/src/resolveConflict.d.ts +10 -0
- package/dist/src/resolveConflict.js +146 -0
- package/dist/src/resolveConflict.js.map +1 -0
- package/dist/src/scanner.d.ts +5 -0
- package/dist/src/scanner.js +57 -0
- package/dist/src/scanner.js.map +1 -0
- package/dist/src/server.d.ts +10 -0
- package/dist/src/server.js +494 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/sessionUsage.d.ts +14 -0
- package/dist/src/sessionUsage.js +180 -0
- package/dist/src/sessionUsage.js.map +1 -0
- package/dist/src/skillDependencies.d.ts +2 -0
- package/dist/src/skillDependencies.js +56 -0
- package/dist/src/skillDependencies.js.map +1 -0
- package/dist/src/skillMentions.d.ts +3 -0
- package/dist/src/skillMentions.js +111 -0
- package/dist/src/skillMentions.js.map +1 -0
- package/dist/src/status.d.ts +3 -0
- package/dist/src/status.js +134 -0
- package/dist/src/status.js.map +1 -0
- package/dist/src/stopSyncingSkill.d.ts +2 -0
- package/dist/src/stopSyncingSkill.js +31 -0
- package/dist/src/stopSyncingSkill.js.map +1 -0
- package/dist/src/sync.d.ts +48 -0
- package/dist/src/sync.js +741 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/types.d.ts +84 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/updateLocalSkill.d.ts +6 -0
- package/dist/src/updateLocalSkill.js +19 -0
- package/dist/src/updateLocalSkill.js.map +1 -0
- package/dist/src/usage.d.ts +6 -0
- package/dist/src/usage.js +84 -0
- package/dist/src/usage.js.map +1 -0
- package/dist/src/usageMonitor.d.ts +17 -0
- package/dist/src/usageMonitor.js +90 -0
- package/dist/src/usageMonitor.js.map +1 -0
- package/dist/web/assets/index-CPJdd8n0.js +59 -0
- package/dist/web/assets/index-T4bm09OX.css +2 -0
- package/dist/web/index.html +13 -0
- package/dist/web/style-options/common.css +515 -0
- package/dist/web/style-options/console.html +143 -0
- package/dist/web/style-options/desktop.html +144 -0
- package/dist/web/style-options/index.html +36 -0
- package/dist/web/style-options/workbench.html +112 -0
- package/package.json +84 -0
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { loadLocalConfig } from "./config.js";
|
|
4
|
+
import { initialize } from "./init.js";
|
|
5
|
+
import { buildStatusReport } from "./status.js";
|
|
6
|
+
import { formatStatus } from "./format.js";
|
|
7
|
+
import { importLocalSkill } from "./importSkill.js";
|
|
8
|
+
import { installRepoSkill } from "./installSkill.js";
|
|
9
|
+
import { gitBranchSyncStatus, gitStatus } from "./git.js";
|
|
10
|
+
import { startServer } from "./server.js";
|
|
11
|
+
import { pullRepositoryChanges, syncRepositoryChanges, syncSelectedSkills } from "./sync.js";
|
|
12
|
+
import { recordUsageEvent } from "./usage.js";
|
|
13
|
+
import { removeLocalSkill } from "./removeLocalSkill.js";
|
|
14
|
+
import { stopSyncingSkill } from "./stopSyncingSkill.js";
|
|
15
|
+
import { updateLocalSkill } from "./updateLocalSkill.js";
|
|
16
|
+
const program = new Command();
|
|
17
|
+
program
|
|
18
|
+
.name("skill-sync")
|
|
19
|
+
.description("Sync local AI agent skills with a Git-backed repository.")
|
|
20
|
+
.version("0.1.0");
|
|
21
|
+
program
|
|
22
|
+
.command("init")
|
|
23
|
+
.description("Initialize local config and the Git-backed skill sync repository.")
|
|
24
|
+
.option("--sync-repo <path>", "Path to the sync repository")
|
|
25
|
+
.option("--skills-dir <path>", "Path to the Codex skills directory")
|
|
26
|
+
.option("--agents-skills-dir <path>", "Path to the Agents skills directory")
|
|
27
|
+
.option("--cache-dir <path>", "Path to local cache/config directory")
|
|
28
|
+
.option("--force", "Overwrite local config")
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
const result = await initialize({
|
|
31
|
+
syncRepo: options.syncRepo,
|
|
32
|
+
codexSkillsDir: options.skillsDir,
|
|
33
|
+
agentsSkillsDir: options.agentsSkillsDir,
|
|
34
|
+
cacheDir: options.cacheDir,
|
|
35
|
+
force: options.force
|
|
36
|
+
});
|
|
37
|
+
console.log(`Initialized Skill Sync`);
|
|
38
|
+
console.log(`Sync repo: ${result.config.syncRepo}`);
|
|
39
|
+
console.log(`Codex skills: ${result.config.codexSkillsDir}`);
|
|
40
|
+
console.log(`Agents skills: ${result.config.agentsSkillsDir}`);
|
|
41
|
+
console.log(`Git repository: ${result.gitInitialized ? "created" : "already present"}`);
|
|
42
|
+
});
|
|
43
|
+
program
|
|
44
|
+
.command("status")
|
|
45
|
+
.description("Show managed and unmanaged skill status.")
|
|
46
|
+
.option("--json", "Print JSON")
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
const config = await loadLocalConfig();
|
|
49
|
+
const report = await buildStatusReport(config);
|
|
50
|
+
if (options.json) {
|
|
51
|
+
console.log(JSON.stringify(report, null, 2));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
console.log(formatStatus(report));
|
|
55
|
+
const status = await gitStatus(config.syncRepo);
|
|
56
|
+
const branchStatus = await gitBranchSyncStatus(config.syncRepo);
|
|
57
|
+
const branchSummaryText = formatBranchSummary(branchStatus);
|
|
58
|
+
console.log("");
|
|
59
|
+
console.log(`Git status: ${status || "clean"}`);
|
|
60
|
+
console.log(`Git branch: ${branchSummaryText}`);
|
|
61
|
+
});
|
|
62
|
+
program
|
|
63
|
+
.command("import")
|
|
64
|
+
.argument("<skill-id>")
|
|
65
|
+
.description("Import a local Codex skill into the sync repository.")
|
|
66
|
+
.option("--force", "Overwrite an existing repo copy")
|
|
67
|
+
.action(async (skillId, options) => {
|
|
68
|
+
const config = await loadLocalConfig();
|
|
69
|
+
const record = await importLocalSkill(config, skillId, { force: options.force });
|
|
70
|
+
console.log(`Imported ${record.id}`);
|
|
71
|
+
});
|
|
72
|
+
program
|
|
73
|
+
.command("sync")
|
|
74
|
+
.argument("[skill-id...]")
|
|
75
|
+
.description("Commit and push selected skills or repository metadata changes.")
|
|
76
|
+
.action(async (skillIds = []) => {
|
|
77
|
+
const config = await loadLocalConfig();
|
|
78
|
+
const result = await syncSelectedSkills(config, skillIds.map((skillId) => ({ skillId })));
|
|
79
|
+
console.log(result.committed ? `Committed ${result.commitHash}` : "No new commit was needed.");
|
|
80
|
+
if (result.skillIds.length === 0) {
|
|
81
|
+
console.log("Pushed repository changes.");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.log(`Pushed ${result.skillIds.length} skill${result.skillIds.length === 1 ? "" : "s"}: ${result.skillIds.join(", ")}`);
|
|
85
|
+
});
|
|
86
|
+
program
|
|
87
|
+
.command("serve")
|
|
88
|
+
.description("Start the local Web UI.")
|
|
89
|
+
.option("--host <host>", "Host to bind", "127.0.0.1")
|
|
90
|
+
.option("--port <port>", "Port to bind", "3017")
|
|
91
|
+
.action(async (options) => {
|
|
92
|
+
const port = Number.parseInt(options.port, 10);
|
|
93
|
+
if (!Number.isFinite(port)) {
|
|
94
|
+
throw new Error(`Invalid port: ${options.port}`);
|
|
95
|
+
}
|
|
96
|
+
const server = await startServer({ host: options.host, port });
|
|
97
|
+
console.log(`Skill Sync is running at ${server.url}`);
|
|
98
|
+
console.log("Press Ctrl+C to stop.");
|
|
99
|
+
});
|
|
100
|
+
program
|
|
101
|
+
.command("record")
|
|
102
|
+
.argument("<skill-id>")
|
|
103
|
+
.description("Record a confirmed skill invocation.")
|
|
104
|
+
.option("--invoked-at <iso>", "Optional invocation time in ISO format")
|
|
105
|
+
.action(async (skillId, options) => {
|
|
106
|
+
const config = await loadLocalConfig();
|
|
107
|
+
const event = await recordUsageEvent(config, skillId, { invokedAt: options.invokedAt });
|
|
108
|
+
console.log(`Recorded usage for ${event.skillId} at ${event.invokedAt}`);
|
|
109
|
+
});
|
|
110
|
+
program
|
|
111
|
+
.command("pull")
|
|
112
|
+
.description("Pull latest changes from the sync repository (fast-forward only).")
|
|
113
|
+
.action(async () => {
|
|
114
|
+
const config = await loadLocalConfig();
|
|
115
|
+
const result = await pullRepositoryChanges(config);
|
|
116
|
+
if (result.preSync?.committed) {
|
|
117
|
+
console.log(`Committed local repository changes as ${result.preSync.commitHash}.`);
|
|
118
|
+
}
|
|
119
|
+
console.log("Pulled latest changes.");
|
|
120
|
+
});
|
|
121
|
+
program
|
|
122
|
+
.command("install")
|
|
123
|
+
.argument("<skill-id>")
|
|
124
|
+
.description("Install a managed skill from the sync repository.")
|
|
125
|
+
.option("--force", "Overwrite an existing local copy")
|
|
126
|
+
.option("--source <source>", "Which local root to install into: codex or agents")
|
|
127
|
+
.action(async (skillId, options) => {
|
|
128
|
+
const config = await loadLocalConfig();
|
|
129
|
+
const source = resolveSourceOption(options.source);
|
|
130
|
+
const { record } = await installRepoSkill(config, skillId, { force: options.force, source });
|
|
131
|
+
console.log(`Installed ${record.id}`);
|
|
132
|
+
});
|
|
133
|
+
program
|
|
134
|
+
.command("update-local")
|
|
135
|
+
.description("Install or overwrite a managed skill from the sync repo.")
|
|
136
|
+
.argument("<skill-id>")
|
|
137
|
+
.option("--source <source>", "Which local root to install into: codex or agents")
|
|
138
|
+
.action(async (skillId, options) => {
|
|
139
|
+
const config = await loadLocalConfig();
|
|
140
|
+
const source = resolveSourceOption(options.source);
|
|
141
|
+
await updateLocalSkill(config, skillId, { source });
|
|
142
|
+
console.log(`Updated local copy of ${skillId}`);
|
|
143
|
+
});
|
|
144
|
+
program
|
|
145
|
+
.command("remove-local")
|
|
146
|
+
.argument("<skill-id>")
|
|
147
|
+
.description("Remove a managed skill from this machine.")
|
|
148
|
+
.option("--source <source>", "Which local source to remove from: codex or agents")
|
|
149
|
+
.action(async (skillId, options) => {
|
|
150
|
+
const config = await loadLocalConfig();
|
|
151
|
+
const source = resolveSourceOption(options.source);
|
|
152
|
+
const record = await removeLocalSkill(config, skillId, { source });
|
|
153
|
+
console.log(`Removed local skill copy: ${record.id}`);
|
|
154
|
+
});
|
|
155
|
+
program
|
|
156
|
+
.command("stop-syncing")
|
|
157
|
+
.argument("<skill-id>")
|
|
158
|
+
.description("Stop syncing a managed skill from the sync repository.")
|
|
159
|
+
.action(async (skillId) => {
|
|
160
|
+
const config = await loadLocalConfig();
|
|
161
|
+
const record = await stopSyncingSkill(config, skillId);
|
|
162
|
+
const result = await syncRepositoryChanges(config);
|
|
163
|
+
console.log(`Stopped syncing ${record.id}`);
|
|
164
|
+
if (result.committed && result.commitHash) {
|
|
165
|
+
console.log(`Commit ${result.commitHash} pushed to sync repository.`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.log("No repository commit required.");
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
function resolveSourceOption(value) {
|
|
172
|
+
if (!value) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
if (value === "codex" || value === "agents") {
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
throw new Error(`Invalid source: ${value}. Use "codex" or "agents".`);
|
|
179
|
+
}
|
|
180
|
+
function formatBranchSummary(status) {
|
|
181
|
+
if (status.state === "up-to-date") {
|
|
182
|
+
return "up to date";
|
|
183
|
+
}
|
|
184
|
+
if (status.state === "ahead") {
|
|
185
|
+
return `${status.ahead} commit(s) ahead of ${status.upstream ?? "remote"}`;
|
|
186
|
+
}
|
|
187
|
+
if (status.state === "behind") {
|
|
188
|
+
return `${status.behind} commit(s) behind ${status.upstream ?? "remote"}`;
|
|
189
|
+
}
|
|
190
|
+
if (status.state === "diverged") {
|
|
191
|
+
return `diverged: +${status.ahead}/-${status.behind} from ${status.upstream ?? "remote"}`;
|
|
192
|
+
}
|
|
193
|
+
if (status.state === "no-upstream") {
|
|
194
|
+
return "no remote tracking branch";
|
|
195
|
+
}
|
|
196
|
+
return "unknown";
|
|
197
|
+
}
|
|
198
|
+
program.exitOverride();
|
|
199
|
+
try {
|
|
200
|
+
await program.parseAsync(process.argv);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (error instanceof Error) {
|
|
204
|
+
console.error(error.message);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
console.error(String(error));
|
|
208
|
+
}
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { PathOptions } from "./paths.js";
|
|
2
|
+
export type CodexArchiveState = "active" | "trash";
|
|
3
|
+
export type CodexArchiveSession = {
|
|
4
|
+
fileName: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
title: string;
|
|
7
|
+
archivedAt: string | null;
|
|
8
|
+
updatedAt: string | null;
|
|
9
|
+
cwd: string | null;
|
|
10
|
+
source: string | null;
|
|
11
|
+
fileSize: number;
|
|
12
|
+
};
|
|
13
|
+
export type CodexArchiveListResponse = {
|
|
14
|
+
state: CodexArchiveState;
|
|
15
|
+
items: CodexArchiveSession[];
|
|
16
|
+
};
|
|
17
|
+
export type CodexArchivePreviewResponse = {
|
|
18
|
+
state: CodexArchiveState;
|
|
19
|
+
item: CodexArchiveSession;
|
|
20
|
+
preview: string[];
|
|
21
|
+
truncated: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type CodexArchiveUnarchiveResponse = {
|
|
24
|
+
item: CodexArchiveSession;
|
|
25
|
+
targetPath: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function resolveCodexArchiveRoots(options?: PathOptions): {
|
|
28
|
+
active: string;
|
|
29
|
+
trash: string;
|
|
30
|
+
index: string;
|
|
31
|
+
sessions: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function listCodexArchiveSessions(state: CodexArchiveState, options?: PathOptions): Promise<CodexArchiveListResponse>;
|
|
34
|
+
export declare function previewCodexArchiveSession(state: CodexArchiveState, fileName: string, options?: PathOptions): Promise<CodexArchivePreviewResponse>;
|
|
35
|
+
export declare function moveCodexArchiveSessionToTrash(fileName: string, options?: PathOptions): Promise<CodexArchiveSession>;
|
|
36
|
+
export declare function restoreCodexArchiveSession(fileName: string, options?: PathOptions): Promise<CodexArchiveSession>;
|
|
37
|
+
export declare function unarchiveCodexArchiveSession(fileName: string, options?: PathOptions): Promise<CodexArchiveUnarchiveResponse>;
|
|
38
|
+
export declare function validateCodexArchiveFileName(fileName: string): string;
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, open, readFile, readdir, realpath, rename, stat } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { getDefaultCodexArchiveSessionsDir } from "./paths.js";
|
|
5
|
+
const PREVIEW_BYTES = 96 * 1024;
|
|
6
|
+
const METADATA_BYTES = 32 * 1024;
|
|
7
|
+
const PREVIEW_MAX_LINES = 120;
|
|
8
|
+
const JSONL_EXT = ".jsonl";
|
|
9
|
+
const MAX_SESSION_ENTRIES = 250;
|
|
10
|
+
export function resolveCodexArchiveRoots(options = {}) {
|
|
11
|
+
const archiveRoot = getDefaultCodexArchiveSessionsDir(options);
|
|
12
|
+
const codexHome = path.dirname(archiveRoot);
|
|
13
|
+
return {
|
|
14
|
+
active: archiveRoot,
|
|
15
|
+
trash: path.join(archiveRoot, ".trash"),
|
|
16
|
+
index: path.join(codexHome, "session_index.jsonl"),
|
|
17
|
+
sessions: path.join(codexHome, "sessions")
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export async function listCodexArchiveSessions(state, options = {}) {
|
|
21
|
+
const roots = resolveCodexArchiveRoots(options);
|
|
22
|
+
const target = state === "trash" ? roots.trash : roots.active;
|
|
23
|
+
const index = await readSessionIndex(roots.index);
|
|
24
|
+
const rows = await listSessionFiles(target);
|
|
25
|
+
const items = (await Promise.all(rows.map((fileName) => buildSessionMetadata(fileName, state, index, options)))).sort(compareMostRecentSessionDesc);
|
|
26
|
+
return {
|
|
27
|
+
state,
|
|
28
|
+
items: items.slice(0, MAX_SESSION_ENTRIES)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function previewCodexArchiveSession(state, fileName, options = {}) {
|
|
32
|
+
const roots = resolveCodexArchiveRoots(options);
|
|
33
|
+
const root = state === "trash" ? roots.trash : roots.active;
|
|
34
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
35
|
+
const target = await resolveSessionFilePath(root, safe, { mustExist: true });
|
|
36
|
+
const index = await readSessionIndex(roots.index);
|
|
37
|
+
const item = await buildSessionMetadata(safe, state, index, options);
|
|
38
|
+
const preview = await readSessionPreview(target);
|
|
39
|
+
return {
|
|
40
|
+
state,
|
|
41
|
+
item,
|
|
42
|
+
preview: preview.lines,
|
|
43
|
+
truncated: preview.truncated
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export async function moveCodexArchiveSessionToTrash(fileName, options = {}) {
|
|
47
|
+
const roots = resolveCodexArchiveRoots(options);
|
|
48
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
49
|
+
const sourcePath = await resolveSessionFilePath(roots.active, safe, { mustExist: true });
|
|
50
|
+
await mkdir(roots.trash, { recursive: true });
|
|
51
|
+
const targetPath = await resolveSessionFilePath(roots.trash, safe);
|
|
52
|
+
if (existsSync(targetPath)) {
|
|
53
|
+
throw new Error(`Archive file already exists in trash: ${safe}`);
|
|
54
|
+
}
|
|
55
|
+
await rename(sourcePath, targetPath);
|
|
56
|
+
return await buildSessionMetadata(safe, "trash", await readSessionIndex(roots.index), options);
|
|
57
|
+
}
|
|
58
|
+
export async function restoreCodexArchiveSession(fileName, options = {}) {
|
|
59
|
+
const roots = resolveCodexArchiveRoots(options);
|
|
60
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
61
|
+
const sourcePath = await resolveSessionFilePath(roots.trash, safe, { mustExist: true });
|
|
62
|
+
const targetPath = await resolveSessionFilePath(roots.active, safe);
|
|
63
|
+
if (existsSync(targetPath)) {
|
|
64
|
+
throw new Error(`Archive file already exists: ${safe}`);
|
|
65
|
+
}
|
|
66
|
+
await rename(sourcePath, targetPath);
|
|
67
|
+
return await buildSessionMetadata(safe, "active", await readSessionIndex(roots.index), options);
|
|
68
|
+
}
|
|
69
|
+
export async function unarchiveCodexArchiveSession(fileName, options = {}) {
|
|
70
|
+
const roots = resolveCodexArchiveRoots(options);
|
|
71
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
72
|
+
const sourcePath = await resolveSessionFilePath(roots.active, safe, { mustExist: true });
|
|
73
|
+
const item = await buildSessionMetadata(safe, "active", await readSessionIndex(roots.index), options);
|
|
74
|
+
const targetPath = await resolveUnarchivedSessionPath(roots.sessions, safe, item.updatedAt ?? item.archivedAt);
|
|
75
|
+
if (existsSync(targetPath)) {
|
|
76
|
+
throw new Error(`Session file already exists outside archive: ${safe}`);
|
|
77
|
+
}
|
|
78
|
+
await rename(sourcePath, targetPath);
|
|
79
|
+
return { item, targetPath };
|
|
80
|
+
}
|
|
81
|
+
export function validateCodexArchiveFileName(fileName) {
|
|
82
|
+
if (!fileName.endsWith(JSONL_EXT)) {
|
|
83
|
+
throw new Error("Session files must use .jsonl.");
|
|
84
|
+
}
|
|
85
|
+
const trimmed = path.basename(fileName);
|
|
86
|
+
if (trimmed !== fileName || trimmed.includes("..") || trimmed.includes("/") || trimmed.includes("\\")) {
|
|
87
|
+
throw new Error("Session file name must be a safe basename.");
|
|
88
|
+
}
|
|
89
|
+
return fileName;
|
|
90
|
+
}
|
|
91
|
+
async function listSessionFiles(root) {
|
|
92
|
+
const raw = await readdir(root).catch(() => []);
|
|
93
|
+
return raw.filter((file) => file.endsWith(JSONL_EXT) && file === path.basename(file));
|
|
94
|
+
}
|
|
95
|
+
async function buildSessionMetadata(fileName, state, index, options = {}) {
|
|
96
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
97
|
+
const roots = resolveCodexArchiveRoots(options);
|
|
98
|
+
const root = state === "trash" ? roots.trash : roots.active;
|
|
99
|
+
const sessionPath = await resolveSessionFilePath(root, safe, { mustExist: true });
|
|
100
|
+
const stats = await stat(sessionPath);
|
|
101
|
+
const sessionId = extractSessionId(safe);
|
|
102
|
+
const indexMetadata = index.get(sessionId);
|
|
103
|
+
const fileMetadata = await readSessionFileMetadata(sessionPath);
|
|
104
|
+
const titleFromIndex = toStringOrNull(indexMetadata?.thread_name) || safe;
|
|
105
|
+
const sourceFromIndex = toStringOrNull(indexMetadata?.originator) || toStringOrNull(indexMetadata?.source) || fileMetadata.source;
|
|
106
|
+
const cwdFromIndex = toStringOrNull(indexMetadata?.cwd) || fileMetadata.cwd;
|
|
107
|
+
const archivedAt = toIsoTimestamp(indexMetadata?.archivedAt ?? indexMetadata?.archived_at) ?? fileMetadata.timestamp ?? stats.birthtime.toISOString();
|
|
108
|
+
const updatedAt = toIsoTimestamp(indexMetadata?.updatedAt ?? indexMetadata?.updated_at) ?? stats.mtime.toISOString();
|
|
109
|
+
return {
|
|
110
|
+
fileName: safe,
|
|
111
|
+
sessionId,
|
|
112
|
+
title: titleFromIndex,
|
|
113
|
+
archivedAt,
|
|
114
|
+
updatedAt,
|
|
115
|
+
cwd: cwdFromIndex,
|
|
116
|
+
source: sourceFromIndex,
|
|
117
|
+
fileSize: Number.isFinite(stats.size) ? stats.size : 0
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function extractSessionId(fileName) {
|
|
121
|
+
const baseName = fileName.endsWith(JSONL_EXT) ? fileName.slice(0, -JSONL_EXT.length) : fileName;
|
|
122
|
+
const uuidMatch = baseName.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
|
|
123
|
+
return uuidMatch?.[0] ?? baseName;
|
|
124
|
+
}
|
|
125
|
+
async function readSessionIndex(indexPath) {
|
|
126
|
+
const raw = await readFile(indexPath, "utf8").catch(() => "");
|
|
127
|
+
if (!raw.trim()) {
|
|
128
|
+
return new Map();
|
|
129
|
+
}
|
|
130
|
+
const entries = new Map();
|
|
131
|
+
const lines = raw.split(/\r?\n/);
|
|
132
|
+
for (const line of lines) {
|
|
133
|
+
const trimmed = line.trim();
|
|
134
|
+
if (!trimmed) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
let parsed;
|
|
138
|
+
try {
|
|
139
|
+
parsed = JSON.parse(trimmed);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (!parsed || typeof parsed !== "object") {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const entry = parsed;
|
|
148
|
+
const threadId = toStringOrNull(entry.id) ?? toStringOrNull(entry.thread_id);
|
|
149
|
+
if (!threadId) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
entries.set(threadId, entry);
|
|
153
|
+
}
|
|
154
|
+
return entries;
|
|
155
|
+
}
|
|
156
|
+
async function resolveSessionFilePath(root, fileName, options = {}) {
|
|
157
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
158
|
+
const candidate = path.join(root, safe);
|
|
159
|
+
const resolvedCandidate = path.resolve(candidate);
|
|
160
|
+
const resolvedRoot = path.resolve(root);
|
|
161
|
+
const rootRelative = path.relative(resolvedRoot, resolvedCandidate);
|
|
162
|
+
if (rootRelative.startsWith("..") || path.isAbsolute(rootRelative)) {
|
|
163
|
+
throw new Error(`Session file must remain in archive root: ${safe}`);
|
|
164
|
+
}
|
|
165
|
+
const realRoot = await realpath(resolvedRoot).catch(() => resolvedRoot);
|
|
166
|
+
if (options.mustExist) {
|
|
167
|
+
const realCandidate = await realpath(resolvedCandidate).catch(() => null);
|
|
168
|
+
if (!realCandidate) {
|
|
169
|
+
throw new Error(`Session file not found: ${safe}`);
|
|
170
|
+
}
|
|
171
|
+
if (!isInDirectory(realRoot, realCandidate)) {
|
|
172
|
+
throw new Error(`Session file must remain in archive root: ${safe}`);
|
|
173
|
+
}
|
|
174
|
+
return realCandidate;
|
|
175
|
+
}
|
|
176
|
+
const realCandidate = path.join(realRoot, safe);
|
|
177
|
+
if (!isInDirectory(realRoot, realCandidate)) {
|
|
178
|
+
throw new Error(`Session file must remain in archive root: ${safe}`);
|
|
179
|
+
}
|
|
180
|
+
return realCandidate;
|
|
181
|
+
}
|
|
182
|
+
function isInDirectory(root, target) {
|
|
183
|
+
const relative = path.relative(root, target);
|
|
184
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
185
|
+
}
|
|
186
|
+
async function resolveUnarchivedSessionPath(sessionsRoot, fileName, fallbackTimestamp) {
|
|
187
|
+
const safe = validateCodexArchiveFileName(fileName);
|
|
188
|
+
const dateParts = sessionDateParts(safe, fallbackTimestamp);
|
|
189
|
+
const resolvedRoot = path.resolve(sessionsRoot);
|
|
190
|
+
const targetDir = path.join(resolvedRoot, dateParts.year, dateParts.month, dateParts.day);
|
|
191
|
+
const resolvedTargetDir = path.resolve(targetDir);
|
|
192
|
+
const relativeDir = path.relative(resolvedRoot, resolvedTargetDir);
|
|
193
|
+
if (relativeDir.startsWith("..") || path.isAbsolute(relativeDir)) {
|
|
194
|
+
throw new Error(`Unarchived session must remain in Codex sessions root: ${safe}`);
|
|
195
|
+
}
|
|
196
|
+
await mkdir(resolvedTargetDir, { recursive: true });
|
|
197
|
+
const realRoot = await realpath(resolvedRoot).catch(() => resolvedRoot);
|
|
198
|
+
const realTargetDir = await realpath(resolvedTargetDir);
|
|
199
|
+
if (!isInDirectory(realRoot, realTargetDir)) {
|
|
200
|
+
throw new Error(`Unarchived session must remain in Codex sessions root: ${safe}`);
|
|
201
|
+
}
|
|
202
|
+
const targetPath = path.join(realTargetDir, safe);
|
|
203
|
+
if (!isInDirectory(realRoot, targetPath)) {
|
|
204
|
+
throw new Error(`Unarchived session must remain in Codex sessions root: ${safe}`);
|
|
205
|
+
}
|
|
206
|
+
return targetPath;
|
|
207
|
+
}
|
|
208
|
+
function sessionDateParts(fileName, fallbackTimestamp) {
|
|
209
|
+
const fromFileName = fileName.match(/^rollout-(\d{4})-(\d{2})-(\d{2})T/);
|
|
210
|
+
if (fromFileName) {
|
|
211
|
+
return { year: fromFileName[1], month: fromFileName[2], day: fromFileName[3] };
|
|
212
|
+
}
|
|
213
|
+
const fallback = fallbackTimestamp ? new Date(fallbackTimestamp) : null;
|
|
214
|
+
const date = fallback && !Number.isNaN(fallback.getTime()) ? fallback : new Date();
|
|
215
|
+
const [year, month, day] = date.toISOString().slice(0, 10).split("-");
|
|
216
|
+
return { year, month, day };
|
|
217
|
+
}
|
|
218
|
+
function compareMostRecentSessionDesc(a, b) {
|
|
219
|
+
return sessionSortTimestamp(b) - sessionSortTimestamp(a) || a.title.localeCompare(b.title) || a.sessionId.localeCompare(b.sessionId);
|
|
220
|
+
}
|
|
221
|
+
function sessionSortTimestamp(item) {
|
|
222
|
+
return Date.parse(item.updatedAt ?? item.archivedAt ?? "") || 0;
|
|
223
|
+
}
|
|
224
|
+
async function readSessionPreview(filePath) {
|
|
225
|
+
const stats = await stat(filePath);
|
|
226
|
+
if (stats.size === 0) {
|
|
227
|
+
return { lines: ["<empty session file>"], truncated: false };
|
|
228
|
+
}
|
|
229
|
+
const handle = await open(filePath, "r");
|
|
230
|
+
try {
|
|
231
|
+
const byteCount = Math.min(PREVIEW_BYTES, stats.size);
|
|
232
|
+
const buffer = Buffer.alloc(byteCount);
|
|
233
|
+
const { bytesRead } = await handle.read(buffer, 0, byteCount, 0);
|
|
234
|
+
const content = buffer.subarray(0, bytesRead).toString("utf8");
|
|
235
|
+
const rawLines = content.split(/\r?\n/).filter((line) => line.trim()).slice(0, PREVIEW_MAX_LINES);
|
|
236
|
+
const lines = rawLines.map(formatPreviewLine);
|
|
237
|
+
return {
|
|
238
|
+
lines,
|
|
239
|
+
truncated: bytesRead < stats.size || lines.length === PREVIEW_MAX_LINES
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
await handle.close();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function readSessionFileMetadata(filePath) {
|
|
247
|
+
const stats = await stat(filePath).catch(() => null);
|
|
248
|
+
if (!stats || stats.size === 0) {
|
|
249
|
+
return { timestamp: null, cwd: null, source: null };
|
|
250
|
+
}
|
|
251
|
+
const handle = await open(filePath, "r");
|
|
252
|
+
let raw = "";
|
|
253
|
+
try {
|
|
254
|
+
const byteCount = Math.min(METADATA_BYTES, stats.size);
|
|
255
|
+
const buffer = Buffer.alloc(byteCount);
|
|
256
|
+
const { bytesRead } = await handle.read(buffer, 0, byteCount, 0);
|
|
257
|
+
raw = buffer.subarray(0, bytesRead).toString("utf8");
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
await handle.close();
|
|
261
|
+
}
|
|
262
|
+
const firstLine = raw.split(/\r?\n/, 1)[0]?.trim();
|
|
263
|
+
if (!firstLine) {
|
|
264
|
+
return { timestamp: null, cwd: null, source: null };
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
const parsed = JSON.parse(firstLine);
|
|
268
|
+
return {
|
|
269
|
+
timestamp: toIsoTimestamp(parsed.timestamp) ?? toIsoTimestamp(parsed.payload?.timestamp),
|
|
270
|
+
cwd: toStringOrNull(parsed.payload?.cwd),
|
|
271
|
+
source: toStringOrNull(parsed.payload?.originator) ?? toStringOrNull(parsed.payload?.source)
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return { timestamp: null, cwd: null, source: null };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function formatPreviewLine(line) {
|
|
279
|
+
try {
|
|
280
|
+
const parsed = JSON.parse(line);
|
|
281
|
+
const timestamp = toIsoTimestamp(parsed.timestamp);
|
|
282
|
+
const type = toStringOrNull(parsed.type) ?? "event";
|
|
283
|
+
const summary = type === "session_meta" ? summarizeSessionMeta(parsed.payload) : summarizePayload(parsed.payload);
|
|
284
|
+
return truncateText([timestamp, type, summary].filter(Boolean).join(" | "), 700);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return truncateText(line, 700);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
function summarizeSessionMeta(payload) {
|
|
291
|
+
if (!payload || typeof payload !== "object") {
|
|
292
|
+
return "";
|
|
293
|
+
}
|
|
294
|
+
const record = payload;
|
|
295
|
+
return [toStringOrNull(record.originator), toStringOrNull(record.cwd)].filter(Boolean).join(" ");
|
|
296
|
+
}
|
|
297
|
+
function summarizePayload(payload) {
|
|
298
|
+
if (!payload || typeof payload !== "object") {
|
|
299
|
+
return "";
|
|
300
|
+
}
|
|
301
|
+
const record = payload;
|
|
302
|
+
const type = toStringOrNull(record.type);
|
|
303
|
+
if (type === "session_meta") {
|
|
304
|
+
return [toStringOrNull(record.originator), toStringOrNull(record.cwd)].filter(Boolean).join(" ");
|
|
305
|
+
}
|
|
306
|
+
const content = record.content;
|
|
307
|
+
if (typeof content === "string") {
|
|
308
|
+
return content;
|
|
309
|
+
}
|
|
310
|
+
if (Array.isArray(content)) {
|
|
311
|
+
return content
|
|
312
|
+
.map((item) => {
|
|
313
|
+
if (!item || typeof item !== "object") {
|
|
314
|
+
return "";
|
|
315
|
+
}
|
|
316
|
+
const contentItem = item;
|
|
317
|
+
return toStringOrNull(contentItem.text) ?? toStringOrNull(contentItem.content) ?? "";
|
|
318
|
+
})
|
|
319
|
+
.filter(Boolean)
|
|
320
|
+
.join(" ");
|
|
321
|
+
}
|
|
322
|
+
return toStringOrNull(record.name) ?? type ?? "";
|
|
323
|
+
}
|
|
324
|
+
function truncateText(value, maxLength) {
|
|
325
|
+
return value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;
|
|
326
|
+
}
|
|
327
|
+
function toIsoTimestamp(raw) {
|
|
328
|
+
if (typeof raw !== "string") {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
const parsed = new Date(raw);
|
|
332
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
return parsed.toISOString();
|
|
336
|
+
}
|
|
337
|
+
function toStringOrNull(value) {
|
|
338
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=codexArchive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexArchive.js","sourceRoot":"","sources":["../../src/codexArchive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAoD/D,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC;AAChC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AACjC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,MAAM,UAAU,wBAAwB,CAAC,UAAuB,EAAE;IAChE,MAAM,WAAW,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;QACvC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC;QAClD,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAAwB,EAAE,UAAuB,EAAE;IAChG,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,CACZ,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CACjG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAErC,OAAO;QACL,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAwB,EACxB,QAAgB,EAChB,UAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC5D,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,QAAgB,EAAE,UAAuB,EAAE;IAC9F,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,QAAgB,EAAE,UAAuB,EAAE;IAC1F,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,MAAM,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,QAAgB,EAAE,UAAuB,EAAE;IAC5F,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACtG,MAAM,UAAU,GAAG,MAAM,4BAA4B,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAE/G,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAgB;IAC3D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,QAAgB,EAChB,KAAwB,EACxB,KAAsB,EACtB,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,cAAc,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC;IAC1E,MAAM,eAAe,GAAG,cAAc,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC;IAClI,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC;IAC5E,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE,UAAU,IAAI,aAAa,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACtJ,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,IAAI,aAAa,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAErH,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,SAAS;QACT,KAAK,EAAE,cAAc;QACrB,UAAU;QACV,SAAS;QACT,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChG,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACnG,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IAC/C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAoB,IAAI,GAAG,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,MAA2B,CAAC;QAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAAY,EACZ,QAAgB,EAChB,UAAmC,EAAE;IAErC,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACpE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,MAAc;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,YAAoB,EAAE,QAAgB,EAAE,iBAAgC;IAClH,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1F,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACnE,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,KAAK,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACxD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,iBAAgC;IAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACzE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACnF,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,4BAA4B,CAAC,CAAsB,EAAE,CAAsB;IAClF,OAAO,oBAAoB,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACvI,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAyB;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC9C,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB;SACxE,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACjE,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAQlC,CAAC;QACF,OAAO;YACL,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC;YACxF,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;YACxC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;SAC7F,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA+D,CAAC;QAC9F,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClH,OAAO,YAAY,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,OAAkC,CAAC;IAClD,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,OAAkC,CAAC;IAClD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,WAAW,GAAG,IAA+B,CAAC;YACpD,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvF,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,SAAiB;IACpD,OAAO,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LocalConfig } from "./types.js";
|
|
2
|
+
import { type PathOptions } from "./paths.js";
|
|
3
|
+
export type InitConfigOptions = PathOptions & {
|
|
4
|
+
syncRepo?: string;
|
|
5
|
+
codexSkillsDir?: string;
|
|
6
|
+
agentsSkillsDir?: string;
|
|
7
|
+
cacheDir?: string;
|
|
8
|
+
force?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function createLocalConfig(options?: InitConfigOptions): Promise<LocalConfig>;
|
|
11
|
+
export declare function loadLocalConfig(options?: PathOptions): Promise<LocalConfig>;
|
|
12
|
+
export declare function tryLoadLocalConfig(options?: PathOptions): Promise<LocalConfig | null>;
|