agemon 0.1.0 → 6.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/README.md +732 -28
- package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
- package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
- package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
- package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
- package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
- package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
- package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
- package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
- package/assets/skills/design/agemon-design/LICENSE +21 -0
- package/assets/skills/design/agemon-design/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design/SKILL.md +391 -0
- package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
- package/assets/skills/design/agemon-design/references/agents.md +63 -0
- package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
- package/assets/skills/design/agemon-design/references/brief.md +186 -0
- package/assets/skills/design/agemon-design/references/color.md +216 -0
- package/assets/skills/design/agemon-design/references/components.md +91 -0
- package/assets/skills/design/agemon-design/references/copy.md +300 -0
- package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
- package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
- package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
- package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
- package/assets/skills/design/agemon-design/references/forms.md +192 -0
- package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
- package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
- package/assets/skills/design/agemon-design/references/layout.md +236 -0
- package/assets/skills/design/agemon-design/references/loops.md +155 -0
- package/assets/skills/design/agemon-design/references/metadata.md +98 -0
- package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
- package/assets/skills/design/agemon-design/references/motion.md +434 -0
- package/assets/skills/design/agemon-design/references/personas.md +206 -0
- package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
- package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
- package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
- package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
- package/assets/skills/design/agemon-design/references/responsive.md +168 -0
- package/assets/skills/design/agemon-design/references/review.md +340 -0
- package/assets/skills/design/agemon-design/references/sound.md +150 -0
- package/assets/skills/design/agemon-design/references/spec.md +123 -0
- package/assets/skills/design/agemon-design/references/stack.md +522 -0
- package/assets/skills/design/agemon-design/references/state-design.md +188 -0
- package/assets/skills/design/agemon-design/references/themes.md +229 -0
- package/assets/skills/design/agemon-design/references/tokens.md +350 -0
- package/assets/skills/design/agemon-design/references/typography.md +246 -0
- package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
- package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
- package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
- package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
- package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
- package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
- package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
- package/assets/skills/geo-seo/geo/LICENSE +21 -0
- package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
- package/assets/skills/geo-seo/geo/SKILL.md +145 -0
- package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
- package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
- package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
- package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
- package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
- package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
- package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
- package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
- package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
- package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
- package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
- package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
- package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
- package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
- package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
- package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
- package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
- package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
- package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
- package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
- package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
- package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
- package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
- package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
- package/assets/skills/security/agemon-security/LICENSE +21 -0
- package/assets/skills/security/agemon-security/NOTICE.md +8 -0
- package/assets/skills/security/agemon-security/SKILL.md +356 -0
- package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
- package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
- package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
- package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
- package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
- package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
- package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
- package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
- package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
- package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
- package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
- package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
- package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
- package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
- package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
- package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
- package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
- package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
- package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
- package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
- package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
- package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
- package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
- package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
- package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
- package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
- package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
- package/assets/tools/code-review-graph-constraints.txt +1418 -0
- package/assets/tools/package-lock.json +111 -0
- package/assets/tools/package.json +6 -0
- package/dist/chunk-5LATHJYU.js +4026 -0
- package/dist/chunk-5LATHJYU.js.map +1 -0
- package/dist/fake-subprocess-2BETWZVZ.js +666 -0
- package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
- package/dist/index.js +21101 -1956
- package/dist/index.js.map +1 -1
- package/package.json +30 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/untrusted-text.ts","../src/core/repo-paths.ts","../src/core/files.ts","../src/platform/home.ts","../src/plugins/pins.ts","../src/core/fingerprint.ts","../src/core/state-root.ts","../src/core/file-lock.ts","../src/plugins/skills/pinned-source.ts","../src/core/subprocess-runner.ts","../src/inspect/redact.ts","../src/plugins/skills/catalog.ts","../src/core/package-assets.ts","../src/plugins/skills/skill-tree.ts","../src/plugins/skills/skills-cli.ts","../src/core/config.ts","../node_modules/smol-toml/dist/error.js","../node_modules/smol-toml/dist/primitive.js","../node_modules/smol-toml/dist/date.js","../node_modules/smol-toml/dist/extract.js","../node_modules/smol-toml/dist/util.js","../node_modules/smol-toml/dist/struct.js","../node_modules/smol-toml/dist/parse.js","../node_modules/smol-toml/dist/stringify.js","../src/core/backups.ts","../src/plugins/skills/skills-cli-targets.ts","../src/core/install-method.ts","../src/core/npm-global.ts","../src/core/dev-mode.ts","../src/core/fake-pinned-skills.ts"],"sourcesContent":["const TERMINAL_UNSAFE_CHARACTER_RANGES =\n \"\\\\u0000-\\\\u0008\\\\u000b-\\\\u001f\\\\u007f-\\\\u009f\\\\u061c\\\\u200b-\\\\u200f\\\\u2028\\\\u2029\\\\u202a-\\\\u202e\\\\u2060\\\\u2066-\\\\u2069\\\\ufeff\";\n\nconst TERMINAL_UNSAFE_CHARACTERS = new RegExp(\n `[${TERMINAL_UNSAFE_CHARACTER_RANGES}]`,\n \"gu\",\n);\nconst IDENTIFIER_UNSAFE_CHARACTERS = new RegExp(\n `[\\\\t\\\\n${TERMINAL_UNSAFE_CHARACTER_RANGES}]`,\n \"u\",\n);\n\nexport function printable(value: string): string {\n return value.replace(TERMINAL_UNSAFE_CHARACTERS, \"?\");\n}\n\nexport function isSafeIdentifier(value: string): boolean {\n return !IDENTIFIER_UNSAFE_CHARACTERS.test(value);\n}\n\nexport function quoteForShlex(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n","import { constants } from \"node:fs\";\nimport { lstat, mkdir, open, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { RefusedPathError } from \"./files.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nexport const AGEMON_STATE_DIRECTORY = \".agemon\";\nconst GIT_DIRECTORY = \".git\";\nconst IGNORABLE_CODE_POINTS = /\\p{Default_Ignorable_Code_Point}/gu;\nconst MAX_PATH_COMPONENT_BYTES = 255;\nconst GITDIR_FILE_PREFIX = \"gitdir:\";\nconst GITDIR_FILE_PROBE_BYTES = 4096;\n\nexport interface RepositoryRoot {\n root: string;\n notice: string | null;\n}\n\ntype GitEntryKind = \"none\" | \"repository\" | \"unacceptable\" | \"unreadable\";\n\ninterface GitEntry {\n kind: GitEntryKind;\n ownerUid: number | null;\n}\n\nexport function isMissingPathError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction refuseRepoPath(relativePath: string, reason: string): never {\n throw new RefusedPathError(\n `Refusing to use '${printable(relativePath)}': ${reason}. agemon only touches files inside the repository.`,\n );\n}\n\nasync function resolveRealDirectory(\n repoRoot: string,\n components: string[],\n options: { create: boolean },\n createdComponents: string[] = [],\n): Promise<string | null> {\n let current = repoRoot;\n for (const [index, component] of components.entries()) {\n current = join(current, component);\n let stats: Awaited<ReturnType<typeof lstat>>;\n try {\n stats = await lstat(current);\n } catch (error) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n if (!options.create) {\n return null;\n }\n await mkdir(current);\n createdComponents.push(components.slice(0, index + 1).join(\"/\"));\n continue;\n }\n if (!stats.isDirectory()) {\n throw new RefusedPathError(\n `Refusing to use ${printable(current)}: it is a symlink or not a directory. agemon only uses real directories here — replace it with a real directory.`,\n );\n }\n }\n return current;\n}\n\nfunction foldForCaseInsensitiveFilesystems(component: string): string {\n return component.replace(IGNORABLE_CODE_POINTS, \"\").toLowerCase();\n}\n\nexport async function resolveInsideRepo(\n repoRoot: string,\n relativePath: string,\n): Promise<string> {\n if (relativePath.length === 0 || relativePath.includes(\"\\0\")) {\n refuseRepoPath(relativePath, \"it is empty or contains a NUL byte\");\n }\n if (isAbsolute(relativePath)) {\n refuseRepoPath(relativePath, \"it is an absolute path\");\n }\n if (!isSafeIdentifier(relativePath)) {\n refuseRepoPath(relativePath, \"it contains control characters\");\n }\n\n const repoRelativePath = relative(repoRoot, resolve(repoRoot, relativePath));\n if (\n repoRelativePath === \"\" ||\n repoRelativePath === \"..\" ||\n repoRelativePath.startsWith(`..${sep}`)\n ) {\n refuseRepoPath(relativePath, \"it resolves outside the repository\");\n }\n\n const components = repoRelativePath.split(sep);\n if (\n components.some(\n (component) => Buffer.byteLength(component) > MAX_PATH_COMPONENT_BYTES,\n )\n ) {\n refuseRepoPath(relativePath, \"a path component is longer than 255 bytes\");\n }\n const foldedComponents = components.map(foldForCaseInsensitiveFilesystems);\n if (foldedComponents.includes(GIT_DIRECTORY)) {\n refuseRepoPath(relativePath, \"it is inside a .git directory\");\n }\n if (foldedComponents[0] === AGEMON_STATE_DIRECTORY) {\n refuseRepoPath(relativePath, \"it is inside agemon's own .agemon/ state\");\n }\n\n await resolveRealDirectory(repoRoot, components.slice(0, -1), {\n create: false,\n });\n return join(repoRoot, repoRelativePath);\n}\n\nexport function resolveStateDirectory(\n repoRoot: string,\n segments: string[],\n options: { create: true },\n): Promise<string>;\nexport function resolveStateDirectory(\n repoRoot: string,\n segments: string[],\n options: { create: boolean },\n): Promise<string | null>;\nexport async function resolveStateDirectory(\n repoRoot: string,\n segments: string[],\n options: { create: boolean },\n): Promise<string | null> {\n return resolveRealDirectory(\n repoRoot,\n [AGEMON_STATE_DIRECTORY, ...segments],\n options,\n );\n}\n\nexport async function resolveRepoDirectory(\n repoRoot: string,\n relativeDirectory: string,\n options: { create: boolean } = { create: false },\n): Promise<string | null> {\n return resolveRealDirectory(repoRoot, relativeDirectory.split(\"/\"), options);\n}\n\nexport async function ensureRepoDirectory(\n repoRoot: string,\n relativeDirectory: string,\n): Promise<string[]> {\n const createdDirectories: string[] = [];\n await resolveRealDirectory(\n repoRoot,\n relativeDirectory.split(\"/\"),\n { create: true },\n createdDirectories,\n );\n return createdDirectories;\n}\n\nexport async function readRegularFilePrefix(\n path: string,\n maxBytes: number,\n): Promise<string | null> {\n const handle = await open(\n path,\n constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK,\n );\n try {\n if (!(await handle.stat()).isFile()) {\n return null;\n }\n const buffer = Buffer.alloc(maxBytes);\n const { bytesRead } = await handle.read(buffer, 0, maxBytes, 0);\n return buffer.subarray(0, bytesRead).toString(\"utf8\");\n } finally {\n await handle.close();\n }\n}\n\nasync function classifyGitEntry(directory: string): Promise<GitEntry> {\n const gitPath = join(directory, GIT_DIRECTORY);\n try {\n const stats = await lstat(gitPath);\n const entry = (kind: GitEntryKind): GitEntry => ({\n kind,\n ownerUid: stats.uid,\n });\n if (stats.isDirectory()) {\n return entry(\"repository\");\n }\n if (!stats.isFile()) {\n return entry(\"unacceptable\");\n }\n const prefix = await readRegularFilePrefix(\n gitPath,\n GITDIR_FILE_PROBE_BYTES,\n );\n return entry(\n prefix?.startsWith(GITDIR_FILE_PREFIX) ? \"repository\" : \"unacceptable\",\n );\n } catch (error) {\n return {\n kind: isMissingPathError(error) ? \"none\" : \"unreadable\",\n ownerUid: null,\n };\n }\n}\n\nexport async function hasGitEntry(directory: string): Promise<boolean> {\n return (await classifyGitEntry(directory)).kind !== \"none\";\n}\n\nasync function isOwnedBy(\n directory: string,\n gitEntry: GitEntry,\n uid: number | undefined,\n): Promise<boolean> {\n if (uid === undefined) {\n return true;\n }\n return gitEntry.ownerUid === uid && (await lstat(directory)).uid === uid;\n}\n\nasync function realpathOrResolved(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n return resolve(path);\n }\n}\n\nexport function isSameOrInside(path: string, ancestor: string): boolean {\n const pathFromAncestor = relative(ancestor, path);\n return (\n pathFromAncestor === \"\" ||\n (pathFromAncestor !== \"..\" &&\n !pathFromAncestor.startsWith(`..${sep}`) &&\n !isAbsolute(pathFromAncestor))\n );\n}\n\nexport async function resolveRepositoryRoot(\n cwd: string,\n homeDirectory: string = homedir(),\n currentUid: number | undefined = process.getuid?.(),\n): Promise<RepositoryRoot> {\n const start = await realpath(cwd);\n const home = await realpathOrResolved(homeDirectory);\n const useStart = (notice: string | null): RepositoryRoot => ({\n root: start,\n notice,\n });\n const notUsing = (directory: string, reason: string): RepositoryRoot =>\n useStart(\n `Not using ${printable(directory)} as the repository root (${reason}).`,\n );\n\n for (let directory = start; ; directory = dirname(directory)) {\n const gitEntry = await classifyGitEntry(directory);\n if (gitEntry.kind === \"unreadable\") {\n return useStart(null);\n }\n if (gitEntry.kind !== \"none\" && directory === start) {\n return useStart(null);\n }\n if (gitEntry.kind === \"unacceptable\") {\n return notUsing(directory, \"its .git is not a directory or gitdir file\");\n }\n if (gitEntry.kind === \"repository\") {\n if (isSameOrInside(home, directory)) {\n return useStart(\n `Not using ${printable(directory)} as the repository root (it contains your home directory); run 'git init' here or run agemon from the repository root.`,\n );\n }\n if (!(await isOwnedBy(directory, gitEntry, currentUid))) {\n return notUsing(directory, \"it is owned by another user\");\n }\n return {\n root: directory,\n notice: `Using repository root ${printable(directory)} (not the current directory).`,\n };\n }\n if (dirname(directory) === directory) {\n return useStart(null);\n }\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n type FileHandle,\n lstat,\n open,\n rename,\n rm,\n} from \"node:fs/promises\";\n\nconst OWNER_ONLY_MODE = 0o600;\nconst DEFAULT_NEW_FILE_MODE = 0o666;\nconst PERMISSION_BITS = 0o777;\nconst READ_CHUNK_BYTES = 64 * 1024;\nconst PRESERVED_ORIGINAL_SUFFIX = \".agemon-original\";\n\nconst BYTES_PER_MEBIBYTE = 1024 * 1024;\n\nexport const MAX_READ_FILE_BYTES = 8 * BYTES_PER_MEBIBYTE;\nexport const MAX_READ_FILE_LABEL = `${MAX_READ_FILE_BYTES / BYTES_PER_MEBIBYTE} MiB`;\n\nfunction isMissingFileError(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nexport class RefusedFileError extends Error {}\n\nexport class NotARegularFileError extends RefusedFileError {\n constructor(action: \"read\" | \"write\", filePath: string) {\n super(\n `Refusing to ${action} ${filePath}: it is not a regular file (agemon does not ${action} through symlinks or special files).`,\n );\n this.name = \"NotARegularFileError\";\n }\n}\n\nexport class FileTooLargeError extends RefusedFileError {\n constructor(filePath: string) {\n super(\n `Refusing to read ${filePath}: it is larger than ${MAX_READ_FILE_LABEL}.`,\n );\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class RefusedPathError extends RefusedFileError {\n constructor(message: string) {\n super(message);\n this.name = \"RefusedPathError\";\n }\n}\n\nasync function readAtMostCap(\n handle: FileHandle,\n filePath: string,\n): Promise<string> {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n for (;;) {\n const { bytesRead, buffer } = await handle.read({\n buffer: Buffer.alloc(READ_CHUNK_BYTES),\n });\n if (bytesRead === 0) {\n return Buffer.concat(chunks, totalBytes).toString(\"utf8\");\n }\n totalBytes += bytesRead;\n if (totalBytes > MAX_READ_FILE_BYTES) {\n throw new FileTooLargeError(filePath);\n }\n chunks.push(buffer.subarray(0, bytesRead));\n }\n}\n\nexport async function readRegularFileIfExists(\n filePath: string,\n): Promise<string | null> {\n let handle: FileHandle;\n try {\n handle = await open(\n filePath,\n constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK,\n );\n } catch (error) {\n if (isMissingFileError(error)) {\n return null;\n }\n if ((error as NodeJS.ErrnoException).code === \"ELOOP\") {\n throw new NotARegularFileError(\"read\", filePath);\n }\n throw error;\n }\n\n try {\n if (!(await handle.stat()).isFile()) {\n throw new NotARegularFileError(\"read\", filePath);\n }\n return await readAtMostCap(handle, filePath);\n } finally {\n await handle.close();\n }\n}\n\nexport async function sha256OfRegularFile(\n filePath: string,\n maxBytes: number,\n): Promise<string> {\n let handle: FileHandle;\n try {\n handle = await open(\n filePath,\n constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK,\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ELOOP\") {\n throw new NotARegularFileError(\"read\", filePath);\n }\n throw error;\n }\n\n try {\n if (!(await handle.stat()).isFile()) {\n throw new NotARegularFileError(\"read\", filePath);\n }\n const hash = createHash(\"sha256\");\n let totalBytes = 0;\n const buffer = Buffer.alloc(READ_CHUNK_BYTES);\n for (;;) {\n const { bytesRead } = await handle.read({ buffer });\n if (bytesRead === 0) {\n return hash.digest(\"hex\");\n }\n totalBytes += bytesRead;\n if (totalBytes > maxBytes) {\n throw new Error(\n `Refusing to hash ${filePath}: it is larger than expected.`,\n );\n }\n hash.update(buffer.subarray(0, bytesRead));\n }\n } finally {\n await handle.close();\n }\n}\n\nasync function modeOfReplaceableFile(filePath: string): Promise<number | null> {\n let existing: Awaited<ReturnType<typeof lstat>>;\n try {\n existing = await lstat(filePath);\n } catch (error) {\n if (isMissingFileError(error)) {\n return null;\n }\n throw error;\n }\n\n if (!existing.isFile()) {\n throw new NotARegularFileError(\"write\", filePath);\n }\n try {\n await access(filePath, constants.W_OK);\n } catch {\n throw new Error(\n `Refusing to write ${filePath}: it is read-only for this user.`,\n );\n }\n return existing.mode & PERMISSION_BITS;\n}\n\nexport async function writeFileAtomic(\n filePath: string,\n contents: string,\n options: { newFileMode?: number } = {},\n): Promise<void> {\n const existingMode = await modeOfReplaceableFile(filePath);\n const tempPath = `${filePath}.tmp-${process.pid}-${randomUUID()}`;\n\n const handle = await open(\n tempPath,\n \"wx\",\n existingMode === null\n ? (options.newFileMode ?? DEFAULT_NEW_FILE_MODE)\n : OWNER_ONLY_MODE,\n );\n try {\n try {\n if (existingMode !== null) {\n await handle.chmod(existingMode);\n }\n await handle.writeFile(contents, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n await rename(tempPath, filePath);\n } catch (error) {\n await rm(tempPath, { force: true });\n throw error;\n }\n}\n\nasync function writeNewFile(filePath: string, contents: string): Promise<void> {\n const handle = await open(filePath, \"wx\", OWNER_ONLY_MODE);\n try {\n await handle.writeFile(contents, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n}\n\nexport async function writeNewFileWithFallback(\n preferredPath: string,\n fallbackPath: string,\n contents: string,\n): Promise<string> {\n try {\n await writeNewFile(preferredPath, contents);\n return preferredPath;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n await writeNewFile(fallbackPath, contents);\n return fallbackPath;\n}\n\nexport async function saveVerifiedCopyBeside(\n targetPath: string,\n contents: string,\n): Promise<string> {\n const preferredPath = `${targetPath}${PRESERVED_ORIGINAL_SUFFIX}`;\n const savedPath = await writeNewFileWithFallback(\n preferredPath,\n `${preferredPath}.${Date.now()}`,\n contents,\n );\n if ((await readRegularFileIfExists(savedPath)) !== contents) {\n throw new Error(`Could not verify the copy saved at ${savedPath}`);\n }\n return savedPath;\n}\n","import { realpath } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { isAbsolute } from \"node:path\";\nimport { isSameOrInside } from \"../core/repo-paths.js\";\nimport { isSafeIdentifier } from \"../core/untrusted-text.js\";\n\nexport function isUsableAbsolutePath(value: string): boolean {\n return isAbsolute(value) && value === value.trim() && isSafeIdentifier(value);\n}\n\nfunction accountHomeDirectory(): string | null {\n try {\n return userInfo().homedir;\n } catch {\n return null;\n }\n}\n\nexport function resolveHomeDirectory(): string {\n for (const candidate of [process.env.HOME, accountHomeDirectory()]) {\n if (candidate && isUsableAbsolutePath(candidate)) {\n return candidate;\n }\n }\n throw new Error(\n \"HOME is not an absolute path without control characters or surrounding spaces, and your account has no usable home directory. Set HOME to your home directory and run agemon again.\",\n );\n}\n\nasync function realpathOrNull(path: string): Promise<string | null> {\n try {\n return await realpath(path);\n } catch {\n return null;\n }\n}\n\nasync function homeDirectoryRealpaths(): Promise<string[]> {\n const realpaths: string[] = [];\n for (const candidate of [process.env.HOME, accountHomeDirectory()]) {\n const real =\n candidate && isAbsolute(candidate)\n ? await realpathOrNull(candidate)\n : null;\n if (real !== null) {\n realpaths.push(real);\n }\n }\n return realpaths;\n}\n\nexport async function isHomeDirectory(realDirectory: string): Promise<boolean> {\n return (await homeDirectoryRealpaths()).includes(realDirectory);\n}\n\nexport async function containsHomeDirectory(\n realDirectory: string,\n): Promise<boolean> {\n return (await homeDirectoryRealpaths()).some((home) =>\n isSameOrInside(home, realDirectory),\n );\n}\n","export const CODE_REVIEW_GRAPH_VERSION = \"2.3.9\";\nexport const CODE_REVIEW_GRAPH_PACKAGE_SPEC = `code-review-graph==${CODE_REVIEW_GRAPH_VERSION}`;\n\nexport const ESSENTIALS_SKILLS_REPOSITORY_URL =\n \"https://github.com/vercel-labs/agent-skills.git\";\nexport const ESSENTIALS_SKILLS_COMMIT =\n \"063bee94c3f4df8453406c830b0a7df0f2860278\";\n\nexport const AGNIX_VERSION = \"0.58.0\";\nexport const AGNIX_RELEASE_ARCHIVE_SHA256 = {\n \"agnix-x86_64-unknown-linux-gnu.tar.gz\":\n \"68cbf435c87e89319133cd4fd4b8b0c8b0763b17862f231bf495ccb9d8ee074b\",\n \"agnix-x86_64-unknown-linux-musl.tar.gz\":\n \"692d8e90017629e69d9256842ab010a6396affb1c482952f5988ade05fdbccd3\",\n \"agnix-aarch64-unknown-linux-gnu.tar.gz\":\n \"66b1ad951232b7f112e36b2fd8d7dae01ed3a89f84eee2152f5a2baf4dd8b0a7\",\n \"agnix-aarch64-apple-darwin.tar.gz\":\n \"a0585c5ad000d8c6861f545ff55d0a7b09460653cd29e56c15675bb9e6e62fe7\",\n} as const;\nexport const AGNIX_NPM_TARBALL = {\n url: `https://registry.npmjs.org/agnix/-/agnix-${AGNIX_VERSION}.tgz`,\n integrity:\n \"sha512-DpGdAmG66EmwNSlX+JXiEUbCL+dxbOiDAjzniHgafFbfDfQKYGHyEEVBT1JcKAMPVapM3U2jCU1U+4UCOnT/TA==\",\n} as const;\nexport const AGNIX_PACKAGE_FILE_SHA256 = {\n \"package.json\":\n \"c214b20e9ba469c9fb318937a5aa2efbddff057797fd77eda49eefcdb869dd8b\",\n \"bin/agnix\":\n \"34a7b789cea9872deb3c81fde838c003a3b4366f3924d06e9deb3cccc60228af\",\n} as const;\nexport const AGNIX_BINARY_SHA256 = [\n \"d220619c26e4b6f8448bad36816608dfeca0ae2b7c3153ea1d772d485eec6bc9\",\n \"b4a3c1c630e36dbc3227da82a14b5b055e3add70f5d8384675fbab8e4ae317e6\",\n \"fca697c810e5ea6598c48377171ad57fdae8b8b82ac9f33c6e6d1c7338ec2987\",\n \"d9dc2071417d9f5c288e87031f861eba8689586f8f6df9c30a2a21348ceba598\",\n] as const;\n","import { createHash } from \"node:crypto\";\n\nfunction canonicalizeJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => canonicalizeJsonValue(entry));\n }\n\n if (value && typeof value === \"object\") {\n const sortedEntries = Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n return Object.fromEntries(\n sortedEntries.map(([key, entryValue]) => [\n key,\n canonicalizeJsonValue(entryValue),\n ]),\n );\n }\n\n return value;\n}\n\nexport function sha256Hex(contents: string | Buffer): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n\nexport function fingerprintJson(value: unknown): string {\n return sha256Hex(JSON.stringify(canonicalizeJsonValue(value)));\n}\n\nexport function fingerprintContent(contents: string): string {\n return sha256Hex(contents);\n}\n","import { constants } from \"node:fs\";\nimport { mkdir, open, readFile, realpath, stat } from \"node:fs/promises\";\nimport { homedir, userInfo } from \"node:os\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport { type HeldFileLock, withFileLock } from \"./file-lock.js\";\nimport { sha256Hex } from \"./fingerprint.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst PERMISSION_BITS = 0o777;\nconst GROUP_AND_OTHER_BITS = 0o077;\nconst GROUP_WRITE = 0o020;\nconst OTHER_WRITE = 0o002;\nconst STICKY_BIT = 0o1000;\nconst ROOT_UID = 0;\nconst REPOSITORY_STATE_KEY_LENGTH = 16;\nconst RUN_LOCK_WAIT_MS = 0;\n\nexport type StateDirectoryMode = \"check\" | \"prepare\";\n\nexport interface AgemonStateDirectory {\n path: string;\n tightenedFromMode: number | null;\n}\n\nexport interface LocalAccounts {\n uid: number;\n username: string;\n groupFile: string;\n passwdFile: string;\n}\n\nfunction currentAccounts(): LocalAccounts {\n const user = userInfo();\n return {\n uid: user.uid,\n username: user.username,\n groupFile: \"/etc/group\",\n passwdFile: \"/etc/passwd\",\n };\n}\n\nexport function resolveStateRoot(\n hostPlatform: NodeJS.Platform = process.platform,\n): string {\n const xdgStateHome = process.env.XDG_STATE_HOME;\n if (xdgStateHome && isAbsolute(xdgStateHome)) {\n return xdgStateHome;\n }\n const homeDirectory = homedir();\n if (!isAbsolute(homeDirectory)) {\n throw new Error(\n \"Cannot locate agemon's state directory: set HOME (or XDG_STATE_HOME) to an absolute path.\",\n );\n }\n return hostPlatform === \"darwin\"\n ? join(homeDirectory, \"Library\", \"Application Support\")\n : join(homeDirectory, \".local\", \"state\");\n}\n\nasync function readColonSeparatedRows(path: string): Promise<string[][]> {\n return (await readFile(path, \"utf8\"))\n .split(\"\\n\")\n .filter((line) => line.length > 0)\n .map((line) => line.split(\":\"));\n}\n\nexport async function isUserPrivateGroup(\n gid: number,\n accounts: LocalAccounts,\n): Promise<boolean> {\n let groups: string[][];\n let users: string[][];\n try {\n groups = await readColonSeparatedRows(accounts.groupFile);\n users = await readColonSeparatedRows(accounts.passwdFile);\n } catch {\n return false;\n }\n const groupsWithGid = groups.filter((fields) => fields[2] === String(gid));\n const isPrivateGroupRow = (fields: string[]) =>\n fields[0] === accounts.username && (fields[3] ?? \"\").trim() === \"\";\n if (groupsWithGid.length === 0 || !groupsWithGid.every(isPrivateGroupRow)) {\n return false;\n }\n return !users.some(\n (fields) => fields[3] === String(gid) && fields[0] !== accounts.username,\n );\n}\n\nfunction refuseDirectory(directory: string, reason: string): never {\n throw new Error(\n `Refusing to use ${printable(directory)}: ${reason}. Fix it (for example 'chmod g-w,o-w ${printable(directory)}', or point XDG_STATE_HOME at a directory you own), then run agemon again. Groups served only by LDAP or NSS are not recognised as private.`,\n );\n}\n\nasync function assertNotWritableByOthers(\n directory: string,\n mode: number,\n gid: number,\n accounts: LocalAccounts,\n): Promise<void> {\n if (mode & OTHER_WRITE) {\n refuseDirectory(directory, \"other users can write to it\");\n }\n if (mode & GROUP_WRITE && !(await isUserPrivateGroup(gid, accounts))) {\n refuseDirectory(directory, \"its group can write to it\");\n }\n}\n\nasync function assertSafeStateRoot(\n stateRoot: string,\n accounts: LocalAccounts,\n): Promise<void> {\n let stats: Awaited<ReturnType<typeof stat>>;\n try {\n stats = await stat(stateRoot);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n if (!stats.isDirectory()) {\n refuseDirectory(stateRoot, \"it is not a directory\");\n }\n if (stats.uid !== accounts.uid && stats.uid !== ROOT_UID) {\n refuseDirectory(stateRoot, \"it is owned by another user\");\n }\n if (!(stats.mode & STICKY_BIT)) {\n await assertNotWritableByOthers(stateRoot, stats.mode, stats.gid, accounts);\n }\n}\n\nasync function openAgemonDirectory(\n directory: string,\n mode: StateDirectoryMode,\n): Promise<Awaited<ReturnType<typeof open>> | null> {\n const flags =\n constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW;\n try {\n return await open(directory, flags);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ELOOP\" || code === \"ENOTDIR\") {\n refuseDirectory(directory, \"it is not a real directory\");\n }\n if (code !== \"ENOENT\") {\n throw error;\n }\n }\n if (mode === \"check\") {\n return null;\n }\n try {\n await mkdir(directory, { mode: PRIVATE_DIRECTORY_MODE });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n return openAgemonDirectory(directory, \"check\");\n}\n\nexport async function resolveAgemonStateDirectory(\n mode: StateDirectoryMode,\n accounts: LocalAccounts = currentAccounts(),\n): Promise<AgemonStateDirectory> {\n const stateRoot = resolveStateRoot();\n const directory = join(stateRoot, \"agemon\");\n if (mode === \"prepare\") {\n await mkdir(stateRoot, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n }\n await assertSafeStateRoot(stateRoot, accounts);\n\n const handle = await openAgemonDirectory(directory, mode);\n if (handle === null) {\n return { path: directory, tightenedFromMode: null };\n }\n try {\n const stats = await handle.stat();\n if (stats.uid !== accounts.uid) {\n refuseDirectory(directory, \"it is owned by another user\");\n }\n await assertNotWritableByOthers(directory, stats.mode, stats.gid, accounts);\n if (mode === \"check\" || !(stats.mode & GROUP_AND_OTHER_BITS)) {\n return { path: directory, tightenedFromMode: null };\n }\n await handle.chmod(PRIVATE_DIRECTORY_MODE);\n return {\n path: directory,\n tightenedFromMode: stats.mode & PERMISSION_BITS,\n };\n } finally {\n await handle.close();\n }\n}\n\nexport async function checkAgemonStateDirectoryBeforeRun(\n dryRun: boolean,\n report: (line: string) => void,\n): Promise<void> {\n const directory = await resolveAgemonStateDirectory(\n dryRun ? \"check\" : \"prepare\",\n );\n if (directory.tightenedFromMode !== null) {\n report(\n `Restricted ${printable(directory.path)} to its owner (mode was ${directory.tightenedFromMode.toString(8)}).`,\n );\n }\n}\n\nexport async function preparePrivateStateDirectory(\n name: string,\n): Promise<string> {\n const directory = join(\n (await resolveAgemonStateDirectory(\"prepare\")).path,\n name,\n );\n await mkdir(directory, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n return directory;\n}\n\nexport function prepareToolsRoot(): Promise<string> {\n return preparePrivateStateDirectory(\"tools\");\n}\n\nexport async function repositoryStateKey(repoRoot: string): Promise<string> {\n return sha256Hex(await realpath(repoRoot)).slice(\n 0,\n REPOSITORY_STATE_KEY_LENGTH,\n );\n}\n\nexport async function withAgemonStateLock<Result>(\n lockRelativePath: string,\n work: (lock: HeldFileLock) => Promise<Result>,\n waitMs: number,\n): Promise<Result> {\n const lockPath = join(\n (await resolveAgemonStateDirectory(\"prepare\")).path,\n lockRelativePath,\n );\n await mkdir(dirname(lockPath), {\n recursive: true,\n mode: PRIVATE_DIRECTORY_MODE,\n });\n return withFileLock(lockPath, work, { waitMs });\n}\n\nexport async function withRepositoryRunLock<Result>(\n repoRoot: string,\n work: () => Promise<Result>,\n): Promise<Result> {\n return withAgemonStateLock(\n join(\"runs\", `${await repositoryStateKey(repoRoot)}.lock`),\n () => work(),\n RUN_LOCK_WAIT_MS,\n );\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { lstat, open, readFile, rm } from \"node:fs/promises\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { readRegularFileIfExists } from \"./files.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst LOCK_FILE_MODE = 0o600;\nconst DEFAULT_POLL_MS = 200;\nconst UNREADABLE_LOCK_GRACE_MS = 30_000;\nconst STALE_BREAKER_AGE_MS = 60_000;\nconst BREAKER_SUFFIX = \".break\";\nconst START_TIME_INDEX_AFTER_NAME = 19;\nconst SMALLEST_TRUSTED_PID = 2;\nconst SYSCTL_PATH = \"/usr/sbin/sysctl\";\nconst SYSCTL_TIMEOUT_MS = 5_000;\nconst SYSCTL_OUTPUT_LIMIT_BYTES = 1024;\nconst BOOT_SESSION_UUID_PATTERN =\n /^[0-9A-F]{8}(?:-[0-9A-F]{4}){3}-[0-9A-F]{12}$/iu;\n\nexport interface ProcessProbe {\n bootId(): Promise<string | null>;\n startTime(pid: number): Promise<string | null>;\n exists(pid: number): boolean;\n}\n\nexport interface FileLockOptions {\n waitMs: number;\n pollMs?: number;\n probe?: ProcessProbe;\n}\n\nexport interface HeldFileLock {\n assertStillHeld(): Promise<void>;\n}\n\ninterface LockOwner {\n token: string;\n pid: number;\n bootId: string | null;\n startTime: string | null;\n acquiredAt: string;\n}\n\nconst locksHeldByThisCallChain = new AsyncLocalStorage<ReadonlySet<string>>();\n\nexport function parseProcessStartTime(statContents: string): string | null {\n const endOfName = statContents.lastIndexOf(\")\");\n if (endOfName < 0) {\n return null;\n }\n const fieldsAfterName = statContents\n .slice(endOfName + 1)\n .trim()\n .split(/\\s+/u);\n return fieldsAfterName[START_TIME_INDEX_AFTER_NAME] ?? null;\n}\n\nasync function readTrimmedOrNull(path: string): Promise<string | null> {\n try {\n return (await readFile(path, \"utf8\")).trim() || null;\n } catch {\n return null;\n }\n}\n\nfunction processExists(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nconst linuxProcessProbe: ProcessProbe = {\n bootId: () => readTrimmedOrNull(\"/proc/sys/kernel/random/boot_id\"),\n async startTime(pid) {\n const stat = await readTrimmedOrNull(`/proc/${pid}/stat`);\n return stat === null ? null : parseProcessStartTime(stat);\n },\n exists: processExists,\n};\n\nfunction readBootSessionUuidWithSysctl(): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(\n SYSCTL_PATH,\n [\"-n\", \"kern.bootsessionuuid\"],\n { timeout: SYSCTL_TIMEOUT_MS, maxBuffer: SYSCTL_OUTPUT_LIMIT_BYTES },\n (error, stdout) => (error ? reject(error) : resolve(stdout)),\n );\n });\n}\n\nexport function createDarwinProcessProbe(\n readBootSessionUuid: () => Promise<string> = readBootSessionUuidWithSysctl,\n): ProcessProbe {\n let bootId: Promise<string | null> | undefined;\n return {\n bootId() {\n bootId ??= readBootSessionUuid().then(\n (output) =>\n BOOT_SESSION_UUID_PATTERN.test(output.trim()) ? output.trim() : null,\n () => null,\n );\n return bootId;\n },\n startTime: async () => null,\n exists: processExists,\n };\n}\n\nconst hostProcessProbe: ProcessProbe =\n process.platform === \"darwin\"\n ? createDarwinProcessProbe()\n : linuxProcessProbe;\n\nfunction parseLockOwner(contents: string): LockOwner | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch {\n return null;\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n return null;\n }\n const owner = parsed as Record<string, unknown>;\n const isNullableString = (value: unknown) =>\n value === null || typeof value === \"string\";\n const hasTrustedPid =\n Number.isSafeInteger(owner.pid) &&\n (owner.pid as number) >= SMALLEST_TRUSTED_PID;\n if (\n typeof owner.token !== \"string\" ||\n !hasTrustedPid ||\n !isNullableString(owner.bootId) ||\n !isNullableString(owner.startTime) ||\n typeof owner.acquiredAt !== \"string\"\n ) {\n return null;\n }\n return owner as unknown as LockOwner;\n}\n\nasync function isOwnerAlive(\n owner: LockOwner,\n probe: ProcessProbe,\n): Promise<boolean> {\n const currentBootId = await probe.bootId();\n if (currentBootId !== null && owner.bootId !== null) {\n if (owner.bootId !== currentBootId) {\n return false;\n }\n if (owner.startTime !== null) {\n return (await probe.startTime(owner.pid)) === owner.startTime;\n }\n }\n return probe.exists(owner.pid);\n}\n\nasync function isOlderThan(path: string, ageMs: number): Promise<boolean> {\n try {\n return Date.now() - (await lstat(path)).mtimeMs > ageMs;\n } catch {\n return false;\n }\n}\n\nasync function isStaleLock(\n lockPath: string,\n contents: string,\n probe: ProcessProbe,\n): Promise<boolean> {\n const owner = parseLockOwner(contents);\n if (owner === null) {\n return isOlderThan(lockPath, UNREADABLE_LOCK_GRACE_MS);\n }\n return !(await isOwnerAlive(owner, probe));\n}\n\nasync function createLockFile(\n lockPath: string,\n contents: string,\n): Promise<boolean> {\n let handle: Awaited<ReturnType<typeof open>>;\n try {\n handle = await open(lockPath, \"wx\", LOCK_FILE_MODE);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n try {\n await handle.writeFile(contents, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n return true;\n}\n\nasync function breakStaleLock(\n lockPath: string,\n staleContents: string,\n probe: ProcessProbe,\n): Promise<boolean> {\n const breakerPath = `${lockPath}${BREAKER_SUFFIX}`;\n if (!(await createLockFile(breakerPath, String(process.pid)))) {\n if (await isOlderThan(breakerPath, STALE_BREAKER_AGE_MS)) {\n await rm(breakerPath, { force: true });\n }\n return false;\n }\n try {\n if (\n (await readRegularFileIfExists(lockPath)) !== staleContents ||\n !(await isStaleLock(lockPath, staleContents, probe))\n ) {\n return false;\n }\n await rm(lockPath, { force: true });\n return true;\n } finally {\n await rm(breakerPath, { force: true });\n }\n}\n\nfunction describeHolder(contents: string | null): string {\n const owner = contents === null ? null : parseLockOwner(contents);\n return owner === null\n ? \"another agemon run\"\n : `another agemon run (pid ${owner.pid}, since ${printable(owner.acquiredAt)})`;\n}\n\nasync function acquireLock(\n lockPath: string,\n ownerContents: string,\n options: FileLockOptions,\n probe: ProcessProbe,\n): Promise<void> {\n const deadline = Date.now() + options.waitMs;\n for (;;) {\n if (await createLockFile(lockPath, ownerContents)) {\n return;\n }\n const existing = await readRegularFileIfExists(lockPath);\n if (existing === null) {\n continue;\n }\n if (\n (await isStaleLock(lockPath, existing, probe)) &&\n (await breakStaleLock(lockPath, existing, probe))\n ) {\n continue;\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `${describeHolder(existing)} holds ${printable(lockPath)}. Wait for it to finish; delete that file only if no agemon is running (an unreadable lock counts as stale after 30 s).`,\n );\n }\n await sleep(options.pollMs ?? DEFAULT_POLL_MS);\n }\n}\n\nasync function releaseLock(\n lockPath: string,\n ownerContents: string,\n): Promise<void> {\n if ((await readRegularFileIfExists(lockPath)) === ownerContents) {\n await rm(lockPath, { force: true });\n }\n}\n\nexport async function withFileLock<Result>(\n lockPath: string,\n work: (lock: HeldFileLock) => Promise<Result>,\n options: FileLockOptions,\n): Promise<Result> {\n const heldLocks = locksHeldByThisCallChain.getStore() ?? new Set<string>();\n if (heldLocks.has(lockPath)) {\n throw new Error(\n `agemon tried to take ${printable(lockPath)} while already holding it.`,\n );\n }\n\n const probe = options.probe ?? hostProcessProbe;\n const owner: LockOwner = {\n token: randomUUID(),\n pid: process.pid,\n bootId: await probe.bootId(),\n startTime: await probe.startTime(process.pid),\n acquiredAt: new Date().toISOString(),\n };\n const ownerContents = JSON.stringify(owner);\n await acquireLock(lockPath, ownerContents, options, probe);\n\n const held: HeldFileLock = {\n async assertStillHeld() {\n if ((await readRegularFileIfExists(lockPath)) !== ownerContents) {\n throw new Error(\n `agemon's lock ${printable(lockPath)} was removed or replaced by another run; nothing more was changed. Run agemon again.`,\n );\n }\n },\n };\n try {\n return await locksHeldByThisCallChain.run(\n new Set([...heldLocks, lockPath]),\n () => work(held),\n );\n } finally {\n await releaseLock(lockPath, ownerContents);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context, SubprocessResult } from \"../../core/context.js\";\nimport { resolveStateRoot } from \"../../core/state-root.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\n\nconst SOURCE_DIRECTORY_MODE = 0o700;\nconst GIT_STEP_TIMEOUT_MS = 120_000;\nconst GIT_SYMLINK_MODE = \"120000\";\nconst GIT_WITHOUT_HOOKS_ARGS = [\n \"-c\",\n \"core.hooksPath=/dev/null\",\n \"-c\",\n \"core.fsmonitor=false\",\n \"-c\",\n \"credential.helper=\",\n];\n\nexport interface PinnedSkillsRepository {\n url: string;\n commit: string;\n}\n\ntype PinnedSourceContext = Pick<Context, \"run\">;\n\nexport function resolvePinnedSkillsSourceDirectory(commit: string): string {\n return join(resolveStateRoot(), \"agemon\", \"skills-src\", commit);\n}\n\nasync function localGitOutput(\n ctx: PinnedSourceContext,\n sourceDirectory: string,\n subcommandArgs: string[],\n): Promise<string | null> {\n const result = await ctx.run(\n \"git\",\n [...GIT_WITHOUT_HOOKS_ARGS, ...subcommandArgs],\n {\n cwd: sourceDirectory,\n timeoutMs: GIT_STEP_TIMEOUT_MS,\n env: isolatedGitEnvironment(sourceDirectory),\n },\n );\n return result.code === 0 ? result.stdout : null;\n}\n\nexport async function isPristinePinnedCheckout(\n ctx: PinnedSourceContext,\n repository: PinnedSkillsRepository,\n): Promise<boolean> {\n const sourceDirectory = resolvePinnedSkillsSourceDirectory(repository.commit);\n if (!existsSync(join(sourceDirectory, \".git\"))) {\n return false;\n }\n try {\n const head = await localGitOutput(ctx, sourceDirectory, [\n \"rev-parse\",\n \"--verify\",\n \"--end-of-options\",\n \"HEAD^{commit}\",\n ]);\n if (head?.trim() !== repository.commit) {\n return false;\n }\n const status = await localGitOutput(ctx, sourceDirectory, [\n \"status\",\n \"--porcelain\",\n \"--ignored\",\n ]);\n return status !== null && status.trim() === \"\";\n } catch {\n return false;\n }\n}\n\nexport function skillPathInRepository(skillName: string): string {\n return `skills/${skillName}`;\n}\n\nexport function resolvePinnedSkillPath(\n repository: PinnedSkillsRepository,\n skillName: string,\n): string {\n return join(\n resolvePinnedSkillsSourceDirectory(repository.commit),\n skillPathInRepository(skillName),\n );\n}\n\nfunction isolatedGitEnvironment(\n sourceDirectory: string,\n): Record<string, string> {\n const gitDirectory = join(sourceDirectory, \".git\");\n return {\n GIT_TERMINAL_PROMPT: \"0\",\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_NOSYSTEM: \"1\",\n GIT_CONFIG_COUNT: \"0\",\n GIT_CONFIG_PARAMETERS: \"\",\n GIT_ASKPASS: \"\",\n SSH_ASKPASS: \"\",\n GIT_DIR: gitDirectory,\n GIT_WORK_TREE: sourceDirectory,\n GIT_COMMON_DIR: gitDirectory,\n GIT_INDEX_FILE: join(gitDirectory, \"index\"),\n GIT_OBJECT_DIRECTORY: join(gitDirectory, \"objects\"),\n GIT_ALTERNATE_OBJECT_DIRECTORIES: \"\",\n };\n}\n\nasync function runGitStep(\n ctx: PinnedSourceContext,\n sourceDirectory: string,\n subcommandArgs: string[],\n): Promise<SubprocessResult> {\n const result = await ctx.run(\n \"git\",\n [...GIT_WITHOUT_HOOKS_ARGS, ...subcommandArgs],\n {\n cwd: sourceDirectory,\n timeoutMs: GIT_STEP_TIMEOUT_MS,\n env: isolatedGitEnvironment(sourceDirectory),\n },\n );\n if (result.code !== 0) {\n throw new Error(\n `git ${subcommandArgs[0]} failed while fetching pinned skills: ${describeSubprocessFailure(result, \"git\")}`,\n );\n }\n return result;\n}\n\nfunction findSymlinkPaths(lsTreeOutput: string): string[] {\n return lsTreeOutput\n .split(\"\\n\")\n .filter((line) => line.startsWith(`${GIT_SYMLINK_MODE} `))\n .map((line) => line.slice(line.indexOf(\"\\t\") + 1));\n}\n\nasync function assertSkillIsPlainFiles(\n ctx: PinnedSourceContext,\n sourceDirectory: string,\n skillName: string,\n): Promise<void> {\n const skillPath = skillPathInRepository(skillName);\n const listing = await runGitStep(ctx, sourceDirectory, [\n \"ls-tree\",\n \"-r\",\n \"HEAD\",\n \"--\",\n skillPath,\n ]);\n if (listing.stdout.trim().length === 0) {\n throw new Error(`The pinned skills commit has no ${skillPath}.`);\n }\n const symlinkPaths = findSymlinkPaths(listing.stdout);\n if (symlinkPaths.length > 0) {\n throw new Error(\n `Refusing to install pinned skills: ${symlinkPaths.map(printable).join(\", \")} is a symlink.`,\n );\n }\n}\n\nexport async function fetchPinnedSkillsSource(\n ctx: PinnedSourceContext,\n repository: PinnedSkillsRepository,\n skillNames: string[],\n): Promise<void> {\n const sourceDirectory = resolvePinnedSkillsSourceDirectory(repository.commit);\n await rm(sourceDirectory, { recursive: true, force: true });\n await mkdir(sourceDirectory, {\n recursive: true,\n mode: SOURCE_DIRECTORY_MODE,\n });\n\n await runGitStep(ctx, sourceDirectory, [\"init\", \"-q\"]);\n await runGitStep(ctx, sourceDirectory, [\n \"fetch\",\n \"--depth\",\n \"1\",\n repository.url,\n repository.commit,\n ]);\n await runGitStep(ctx, sourceDirectory, [\"checkout\", \"-q\", \"FETCH_HEAD\"]);\n\n const head = (\n await runGitStep(ctx, sourceDirectory, [\"rev-parse\", \"HEAD\"])\n ).stdout.trim();\n if (head !== repository.commit) {\n throw new Error(\n `Pinned skills checkout mismatch: expected commit ${repository.commit}, got ${printable(head)}.`,\n );\n }\n\n for (const skillName of skillNames) {\n await assertSkillIsPlainFiles(ctx, sourceDirectory, skillName);\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { isAbsolute } from \"node:path\";\nimport {\n MAX_REDACTED_LINE_CHARACTERS,\n redactSecretsInText,\n} from \"../inspect/redact.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nexport interface SubprocessResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface RunSubprocessOptions {\n timeoutMs?: number;\n killSignal?: NodeJS.Signals;\n cwd?: string;\n env?: Record<string, string>;\n unsetEnv?: readonly string[];\n}\n\nexport const MAX_RAW_OUTPUT_LINE_CHARACTERS = MAX_REDACTED_LINE_CHARACTERS;\nconst MAX_SHOWN_OUTPUT_LINE_CHARACTERS = 300;\nconst FAILURE_OUTPUT_LINES = 10;\nconst CONTROL_SEQUENCE_INTRODUCER = `(?:${String.fromCharCode(27)}\\\\[|${String.fromCharCode(0x9b)})`;\nconst TERMINAL_ESCAPE_SEQUENCE = new RegExp(\n `${CONTROL_SEQUENCE_INTRODUCER}[0-9;?]*[ -/]*[@-~]`,\n \"g\",\n);\nconst SPAWN_ERROR_PREFIX = \"process spawn error: \";\n\nexport interface OutputTail {\n earlierLineCount: number;\n lines: string[];\n}\n\nexport function sanitizeOutput(text: string): string {\n return printable(\n redactSecretsInText(text.replace(TERMINAL_ESCAPE_SEQUENCE, \"\")),\n );\n}\n\nexport function capShownLine(line: string): string {\n return line.length > MAX_SHOWN_OUTPUT_LINE_CHARACTERS\n ? `${line.slice(0, MAX_SHOWN_OUTPUT_LINE_CHARACTERS)}…`\n : line;\n}\n\nexport function safeOutputTail(stream: string, maxLines: number): OutputTail {\n const rawLines = stream.split(\"\\n\");\n if (rawLines.at(-1) === \"\") {\n rawLines.pop();\n }\n const earlierLineCount = Math.max(rawLines.length - maxLines, 0);\n if (rawLines.length === 0) {\n return { earlierLineCount, lines: [] };\n }\n const keptRawText = rawLines\n .slice(earlierLineCount)\n .map((line) => line.slice(0, MAX_RAW_OUTPUT_LINE_CHARACTERS))\n .join(\"\\n\");\n return {\n earlierLineCount,\n lines: sanitizeOutput(keptRawText).split(\"\\n\").map(capShownLine),\n };\n}\n\nexport function describeSubprocessFailure(\n result: SubprocessResult,\n command: string,\n): string {\n const tail = safeOutputTail(result.stderr.trim(), FAILURE_OUTPUT_LINES);\n if (tail.lines.every((line) => line.trim() === \"\")) {\n return `${command} exited ${result.code}`;\n }\n return [\n ...(tail.earlierLineCount > 0\n ? [`… ${tail.earlierLineCount} earlier lines`]\n : []),\n ...tail.lines,\n ].join(\"\\n\");\n}\n\nexport function isSpawnFailure(result: SubprocessResult): boolean {\n return result.code === 1 && result.stderr.startsWith(SPAWN_ERROR_PREFIX);\n}\n\nconst NPM_LAUNCH_MARKERS = [\n \"npm_command\",\n \"npm_execpath\",\n \"npm_config_user_agent\",\n];\nconst NPM_INJECTED_VARIABLES = [\"init_cwd\", \"node\"];\nconst NPM_INJECTED_PATH_SUFFIXES = [\"/node_modules/.bin\", \"/node-gyp-bin\"];\n\nfunction wasLaunchedByNpm(names: string[]): boolean {\n return names.some((name) => NPM_LAUNCH_MARKERS.includes(name.toLowerCase()));\n}\n\nfunction isNpmInjectedVariable(name: string): boolean {\n const lowerCaseName = name.toLowerCase();\n return (\n lowerCaseName.startsWith(\"npm_\") ||\n NPM_INJECTED_VARIABLES.includes(lowerCaseName)\n );\n}\n\nfunction keepSearchPathEntries(\n searchPath: string,\n launchedByNpm: boolean,\n): string {\n return searchPath\n .split(\":\")\n .filter(\n (entry) =>\n isAbsolute(entry) &&\n !(\n launchedByNpm &&\n NPM_INJECTED_PATH_SUFFIXES.some((suffix) =>\n entry.replace(/\\/+$/, \"\").endsWith(suffix),\n )\n ),\n )\n .join(\":\");\n}\n\nexport function agemonSubprocessEnvironment(\n environment: NodeJS.ProcessEnv = process.env,\n): Record<string, string> {\n const names = Object.keys(environment);\n const launchedByNpm = wasLaunchedByNpm(names);\n const kept: Record<string, string> = {};\n for (const name of names) {\n const value = environment[name];\n if (value === undefined || (launchedByNpm && isNpmInjectedVariable(name))) {\n continue;\n }\n kept[name] =\n name === \"PATH\" ? keepSearchPathEntries(value, launchedByNpm) : value;\n }\n return kept;\n}\n\nexport const DEFAULT_SUBPROCESS_TIMEOUT_MS = 300_000;\nexport const MAX_CAPTURED_CHARACTERS_PER_STREAM = 10 * 1024 * 1024;\nexport const TRUNCATION_MARKER = \"\\n…[truncated]\";\nconst HARD_KILL_GRACE_MS = 2_000;\nconst STREAM_DRAIN_GRACE_MS = 2_000;\nconst TIMEOUT_EXIT_CODE = 124;\n\ninterface BoundedCapture {\n append(chunk: string): void;\n readonly text: string;\n}\n\nfunction sliceWithoutSplittingSurrogatePair(\n text: string,\n length: number,\n): string {\n const lastKeptCodeUnit = text.charCodeAt(length - 1);\n const endsWithHighSurrogate =\n lastKeptCodeUnit >= 0xd800 && lastKeptCodeUnit <= 0xdbff;\n return text.slice(0, endsWithHighSurrogate ? length - 1 : length);\n}\n\nfunction createBoundedCapture(): BoundedCapture {\n let text = \"\";\n let truncated = false;\n return {\n append(chunk) {\n if (truncated) {\n return;\n }\n const remainingCharacters =\n MAX_CAPTURED_CHARACTERS_PER_STREAM - text.length;\n if (chunk.length <= remainingCharacters) {\n text += chunk;\n return;\n }\n text += `${sliceWithoutSplittingSurrogatePair(chunk, remainingCharacters)}${TRUNCATION_MARKER}`;\n truncated = true;\n },\n get text() {\n return text;\n },\n };\n}\n\nexport async function runSubprocess(\n command: string,\n args: string[],\n options: RunSubprocessOptions = {},\n): Promise<SubprocessResult> {\n if (process.env.AGEMON_FAKE_SUBPROCESS === \"1\") {\n const { runFakeSubprocess } = await import(\"./fake-subprocess.js\");\n return runFakeSubprocess(command, args, options);\n }\n return runRealSubprocess(command, args, options);\n}\n\nexport async function runRealSubprocess(\n command: string,\n args: string[],\n options: RunSubprocessOptions = {},\n): Promise<SubprocessResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_SUBPROCESS_TIMEOUT_MS;\n\n return await new Promise<SubprocessResult>((resolve) => {\n let settled = false;\n let timedOut = false;\n let timeoutHandle: NodeJS.Timeout | undefined;\n let hardKillHandle: NodeJS.Timeout | undefined;\n let drainHandle: NodeJS.Timeout | undefined;\n const stdout = createBoundedCapture();\n const stderr = createBoundedCapture();\n\n const clearTimers = (): void => {\n clearTimeout(timeoutHandle);\n clearTimeout(hardKillHandle);\n clearTimeout(drainHandle);\n };\n\n const finalize = (result: SubprocessResult): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimers();\n resolve(result);\n };\n\n const resultForExit = (\n code: number | null,\n signal: NodeJS.Signals | null,\n ): SubprocessResult => {\n if (timedOut) {\n const timeoutMessage = `Command timed out after ${timeoutMs}ms.`;\n return {\n code: TIMEOUT_EXIT_CODE,\n stdout: stdout.text,\n stderr: stderr.text\n ? `${stderr.text}\\n${timeoutMessage}`\n : timeoutMessage,\n };\n }\n\n if (signal) {\n return {\n code: 1,\n stdout: stdout.text,\n stderr: `${stderr.text}Process terminated by signal: ${signal}`,\n };\n }\n\n return { code: code ?? 1, stdout: stdout.text, stderr: stderr.text };\n };\n\n const finalizeAfterDrainGrace = (\n code: number | null,\n signal: NodeJS.Signals | null,\n ): void => {\n clearTimeout(drainHandle);\n drainHandle = setTimeout(() => {\n childProcess.stdout.destroy();\n childProcess.stderr.destroy();\n finalize(resultForExit(code, signal));\n }, STREAM_DRAIN_GRACE_MS);\n };\n\n const environment: Record<string, string> = {\n ...agemonSubprocessEnvironment(),\n ...options.env,\n };\n for (const name of options.unsetEnv ?? []) {\n delete environment[name];\n }\n const childProcess = spawn(command, args, {\n cwd: options.cwd ?? process.cwd(),\n env: environment,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n if (timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n const signal = options.killSignal ?? \"SIGTERM\";\n const terminated = childProcess.kill(signal);\n if (!terminated) {\n finalize({\n code: TIMEOUT_EXIT_CODE,\n stdout: stdout.text,\n stderr: `${stderr.text}\\nCommand timed out after ${timeoutMs}ms and could not be signaled with ${signal}.`,\n });\n return;\n }\n\n hardKillHandle = setTimeout(() => {\n childProcess.kill(\"SIGKILL\");\n finalizeAfterDrainGrace(null, \"SIGKILL\");\n }, HARD_KILL_GRACE_MS);\n }, timeoutMs);\n }\n\n childProcess.stdout.setEncoding(\"utf8\");\n childProcess.stderr.setEncoding(\"utf8\");\n childProcess.stdout.on(\"data\", (chunk: string) => stdout.append(chunk));\n childProcess.stderr.on(\"data\", (chunk: string) => stderr.append(chunk));\n\n childProcess.on(\"error\", (error: Error) => {\n const errorMessage = stderr.text\n ? `${stderr.text}\\n${SPAWN_ERROR_PREFIX}${error.message}`\n : `${SPAWN_ERROR_PREFIX}${error.message}`;\n finalize({ code: 1, stdout: stdout.text, stderr: errorMessage });\n });\n\n childProcess.on(\n \"exit\",\n (code: number | null, signal: NodeJS.Signals | null) => {\n clearTimeout(timeoutHandle);\n clearTimeout(hardKillHandle);\n finalizeAfterDrainGrace(code, signal);\n },\n );\n\n childProcess.on(\n \"close\",\n (code: number | null, signal: NodeJS.Signals | null) => {\n finalize(resultForExit(code, signal));\n },\n );\n });\n}\n","const DENYLISTED_FILE_PATTERNS: RegExp[] = [\n /(^|\\/)\\.env(\\.[^/]*)?$/,\n /\\.pem$/i,\n /(^|\\/)id_(?:rsa|ed25519|ecdsa|dsa)/i,\n /\\.key$/i,\n /\\.p12$/i,\n /\\.pfx$/i,\n /(^|\\/)\\.pypirc$/,\n /(^|\\/)\\.aws\\/credentials$/,\n /(^|\\/)\\.docker\\/config\\.json$/,\n /(^|\\/)\\.npmrc$/,\n /(^|\\/)\\.netrc$/,\n /(^|\\/)\\.git-credentials$/,\n /\\.local\\.json$/,\n /(^|\\/)\\.kube\\/config$/,\n /(^|\\/)\\.pgpass$/,\n /\\.ppk$/i,\n /\\.jks$/i,\n /\\.keystore$/i,\n /(^|\\/)credentials\\.json$/,\n /(^|\\/)\\.config\\/gh\\/hosts\\.yml$/,\n /(^|\\/)\\.vault-token$/,\n /(^|\\/)credentials\\.tfrc\\.json$/,\n /(^|\\/)application_default_credentials\\.json$/,\n /(^|\\/)\\.azure\\/accessTokens\\.json$/,\n /\\.kdbx$/i,\n /(^|\\/)\\.config\\/gcloud\\/credentials\\.db$/,\n /(^|\\/)\\.gnupg\\//,\n /(^|\\/)\\.terraformrc$/,\n /(^|\\/)[^/]*service[-_]account[^/]*\\.json$/i,\n];\n\nconst CREDENTIAL_KEY_PATTERN =\n /(?:^|[._-])(?:tokens?|secret|password|passwd|pwd|api[._-]?key|access[._-]?key|client[._-]?secret|auth|authorization|credentials?|private[._-]?key)(?:$|[._-])|_key$|^key$/i;\nconst CAMEL_CASE_BOUNDARY = /([a-z0-9])([A-Z])/g;\nconst CONCATENATED_CREDENTIAL_SUFFIX =\n /(?:token|secret|password|passwd|apikey)$/i;\n\nconst PEM_DASHES = \"-{4,5}\";\nconst PEM_LABEL = \"[A-Z0-9 ]+\";\nconst PEM_BEGIN = `${PEM_DASHES} ?BEGIN ${PEM_LABEL}${PEM_DASHES}`;\nconst PEM_END = `${PEM_DASHES} ?END ${PEM_LABEL}${PEM_DASHES}`;\nconst PEM_PATTERN = new RegExp(PEM_BEGIN, \"i\");\nconst JWT_PATTERN =\n /^eyJ[A-Za-z0-9_-]+=*\\.eyJ[A-Za-z0-9_-]+=*\\.[A-Za-z0-9_-]+=*$/;\nconst URL_WITH_CREDENTIALS_PATTERN =\n /\\b[a-z][a-z0-9+.-]{0,31}:\\/\\/[^/\\s:@]+:[^/\\s:@]+@/i;\n\nexport const MAX_REDACTED_LINE_CHARACTERS = 4096;\n\nconst HIGH_ENTROPY_MIN_LENGTH = 32;\nconst HIGH_ENTROPY_MIN_BITS_PER_CHAR = 3.5;\nconst HIGH_ENTROPY_CHARSET = /^[A-Za-z0-9+/=_-]+$/;\n\nexport type RedactionReason =\n | \"credential-key\"\n | \"pem\"\n | \"jwt\"\n | \"url-credentials\"\n | \"high-entropy\";\n\nexport interface JsonRedactionResult {\n value: unknown;\n redactedPaths: string[];\n}\n\nexport function isDenylistedPath(relativePath: string): boolean {\n return DENYLISTED_FILE_PATTERNS.some((pattern) => pattern.test(relativePath));\n}\n\nfunction shannonEntropyBitsPerChar(value: string): number {\n const characterCounts = new Map<string, number>();\n for (const character of value) {\n characterCounts.set(character, (characterCounts.get(character) ?? 0) + 1);\n }\n\n let bitsPerChar = 0;\n for (const count of characterCounts.values()) {\n const probability = count / value.length;\n bitsPerChar -= probability * Math.log2(probability);\n }\n return bitsPerChar;\n}\n\nfunction looksHighEntropy(value: string): boolean {\n return (\n value.length >= HIGH_ENTROPY_MIN_LENGTH &&\n HIGH_ENTROPY_CHARSET.test(value) &&\n shannonEntropyBitsPerChar(value) >= HIGH_ENTROPY_MIN_BITS_PER_CHAR\n );\n}\n\nfunction stripKeyDecoration(rawKey: string): string {\n return rawKey.replace(/^[-\"']+/, \"\").replace(/[\"':]+$/, \"\");\n}\n\nfunction namesCredentialKey(rawKey: string): boolean {\n const key = stripKeyDecoration(rawKey);\n return (\n CREDENTIAL_KEY_PATTERN.test(key.replace(CAMEL_CASE_BOUNDARY, \"$1_$2\")) ||\n CONCATENATED_CREDENTIAL_SUFFIX.test(key)\n );\n}\n\nfunction classifyString(value: string): RedactionReason | null {\n if (PEM_PATTERN.test(value)) {\n return \"pem\";\n }\n if (JWT_PATTERN.test(value)) {\n return \"jwt\";\n }\n if (URL_WITH_CREDENTIALS_PATTERN.test(value)) {\n return \"url-credentials\";\n }\n if (looksHighEntropy(value)) {\n return \"high-entropy\";\n }\n return null;\n}\n\nexport function redactJsonValue(input: unknown): JsonRedactionResult {\n const redactedPaths: string[] = [];\n\n const walk = (\n value: unknown,\n path: string,\n insideCredentialKey: boolean,\n ): unknown => {\n if (typeof value === \"string\") {\n const reason = insideCredentialKey\n ? \"credential-key\"\n : classifyString(value.slice(0, MAX_REDACTED_LINE_CHARACTERS));\n if (reason === null) {\n return value;\n }\n redactedPaths.push(path);\n return redactedMarker(reason);\n }\n\n if (Array.isArray(value)) {\n return value.map((entry, index) =>\n walk(entry, `${path}[${index}]`, insideCredentialKey),\n );\n }\n\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(\n ([key, entryValue]) => [\n key,\n walk(\n entryValue,\n path === \"\" ? key : `${path}.${key}`,\n insideCredentialKey || namesCredentialKey(key),\n ),\n ],\n ),\n );\n }\n\n return value;\n };\n\n return { value: walk(input, \"\", false), redactedPaths };\n}\n\nconst PEM_BLOCK_PATTERN = new RegExp(\n `${PEM_BEGIN}[\\\\s\\\\S]*?(?:${PEM_END}|$)`,\n \"gi\",\n);\nconst PEM_TAIL_WITHOUT_BEGIN_PATTERN = new RegExp(\n `^(?:[A-Za-z0-9+/=]+\\\\r?\\\\n)*${PEM_END}`,\n \"gim\",\n);\nconst TOKEN_WRAPPER_PATTERN = /^([(\"'`[{<]*)(.*?)([)\"'`\\]}>,;.]*)$/s;\nconst KEY_SEPARATOR_PATTERN = /([A-Za-z0-9_.-]+)([\"']?[=:])/g;\nconst ASSIGNMENT_PATTERN = /^([A-Za-z0-9_.-]+=)(.+)$/s;\nconst KEY_PATH_SEPARATOR = /[/:?&]/;\nconst STANDALONE_SEPARATORS: ReadonlySet<string> = new Set([\"=\", \":\"]);\nconst AUTH_SCHEME_PATTERN = /^(?:bearer|basic)$/i;\nconst AUTHORIZATION_TOKEN_SCHEME = /^token$/i;\n\nfunction redactedMarker(reason: RedactionReason): string {\n return `<redacted:${reason}>`;\n}\n\nfunction announcesSecretInText(rawKey: string): boolean {\n return (\n namesCredentialKey(rawKey) ||\n AUTH_SCHEME_PATTERN.test(stripKeyDecoration(rawKey))\n );\n}\n\ninterface TokenRedaction {\n text: string;\n announcesSecret: boolean;\n}\n\nfunction redactKeyValue(token: string): TokenRedaction | null {\n for (const match of token.matchAll(KEY_SEPARATOR_PATTERN)) {\n if (!announcesSecretInText(match[1])) {\n continue;\n }\n const valueStart = (match.index ?? 0) + match[0].length;\n const upToValue = token.slice(0, valueStart);\n const [, valuePrefix, value, valueSuffix] = TOKEN_WRAPPER_PATTERN.exec(\n token.slice(valueStart),\n ) as RegExpExecArray;\n if (value.length === 0 || AUTH_SCHEME_PATTERN.test(value)) {\n return { text: token, announcesSecret: true };\n }\n return {\n text: `${upToValue}${valuePrefix}${redactedMarker(\"credential-key\")}${valueSuffix}`,\n announcesSecret: false,\n };\n }\n return null;\n}\n\nfunction redactAssignedValue(core: string): string | null {\n const assignment = ASSIGNMENT_PATTERN.exec(core);\n if (assignment === null) {\n return null;\n }\n const reason = classifyString(assignment[2]);\n return reason === null ? null : `${assignment[1]}${redactedMarker(reason)}`;\n}\n\nfunction redactToken(\n token: string,\n previousToken: string,\n secretWasAnnounced: boolean,\n): TokenRedaction {\n const [, prefix, core, suffix] = TOKEN_WRAPPER_PATTERN.exec(\n token,\n ) as RegExpExecArray;\n if (AUTH_SCHEME_PATTERN.test(core)) {\n return { text: token, announcesSecret: true };\n }\n if (secretWasAnnounced) {\n if (AUTHORIZATION_TOKEN_SCHEME.test(core)) {\n return { text: token, announcesSecret: true };\n }\n return {\n text: `${prefix}${redactedMarker(\"credential-key\")}${suffix}`,\n announcesSecret: false,\n };\n }\n if (STANDALONE_SEPARATORS.has(core)) {\n return {\n text: token,\n announcesSecret: announcesSecretInText(\n previousToken.split(KEY_PATH_SEPARATOR).at(-1) ?? \"\",\n ),\n };\n }\n const keyValue = redactKeyValue(token);\n if (keyValue !== null) {\n return keyValue;\n }\n if (core.startsWith(\"-\") && announcesSecretInText(core)) {\n return { text: token, announcesSecret: true };\n }\n const redactedAssignment = redactAssignedValue(core);\n if (redactedAssignment !== null) {\n return {\n text: `${prefix}${redactedAssignment}${suffix}`,\n announcesSecret: false,\n };\n }\n const reason = classifyString(core);\n return {\n text:\n reason === null ? token : `${prefix}${redactedMarker(reason)}${suffix}`,\n announcesSecret: false,\n };\n}\n\nexport function redactSecretsInText(text: string): string {\n let previousToken = \"\";\n let secretWasAnnounced = false;\n return text\n .split(\"\\n\")\n .map((line) => line.slice(0, MAX_REDACTED_LINE_CHARACTERS))\n .join(\"\\n\")\n .replace(PEM_BLOCK_PATTERN, redactedMarker(\"pem\"))\n .replace(PEM_TAIL_WITHOUT_BEGIN_PATTERN, redactedMarker(\"pem\"))\n .split(/(\\s+)/)\n .map((token) => {\n if (token.length === 0 || /^\\s+$/.test(token)) {\n return token;\n }\n const redaction = redactToken(token, previousToken, secretWasAnnounced);\n previousToken = token;\n secretWasAnnounced = redaction.announcesSecret;\n return redaction.text;\n })\n .join(\"\");\n}\n","import { join } from \"node:path\";\nimport type { CustomSkillGroupConfig } from \"../../core/config.js\";\nimport { resolveVendoredSkillPath } from \"../../core/package-assets.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport {\n ESSENTIALS_SKILLS_COMMIT,\n ESSENTIALS_SKILLS_REPOSITORY_URL,\n} from \"../pins.js\";\nimport {\n type PinnedSkillsRepository,\n resolvePinnedSkillPath,\n} from \"./pinned-source.js\";\n\nexport interface SkillBundleEntry {\n id: string;\n readonly source: string;\n skillName: string;\n agent: string;\n pinnedRepository?: PinnedSkillsRepository;\n localSourcePath?: string;\n}\n\nconst ESSENTIALS_REPOSITORY: PinnedSkillsRepository = {\n url: ESSENTIALS_SKILLS_REPOSITORY_URL,\n commit: ESSENTIALS_SKILLS_COMMIT,\n};\n\nexport interface AgentDefinition {\n name: string;\n description: string;\n tools: readonly string[];\n readonly briefPath: string;\n}\n\nexport interface SkillGroup {\n id: string;\n label: string;\n description: string;\n defaultSelected: boolean;\n definedByRepository?: boolean;\n skills: SkillBundleEntry[];\n agents?: AgentDefinition[];\n}\n\nconst GEO_AUDIT_AGENT_DESCRIPTION_SUFFIX =\n \"Used by the geo-audit skill; do not use it for other tasks.\";\n\nfunction vendoredSkill(groupId: string, skillId: string): SkillBundleEntry {\n return {\n id: skillId,\n get source() {\n return resolveVendoredSkillPath(groupId, skillId);\n },\n skillName: skillId,\n agent: \"claude-code\",\n };\n}\n\nfunction pinnedSkill(\n repository: PinnedSkillsRepository,\n skillId: string,\n): SkillBundleEntry {\n return {\n id: skillId,\n get source() {\n return resolvePinnedSkillPath(repository, skillId);\n },\n skillName: skillId,\n agent: \"claude-code\",\n pinnedRepository: repository,\n };\n}\n\nfunction geoAuditAgent(\n name: string,\n briefFileName: string,\n purpose: string,\n tools: readonly string[],\n): AgentDefinition {\n return {\n name,\n description: `${purpose} ${GEO_AUDIT_AGENT_DESCRIPTION_SUFFIX}`,\n tools,\n get briefPath() {\n return join(\n resolveVendoredSkillPath(\"geo-seo\", \"geo-audit\"),\n \"references\",\n briefFileName,\n );\n },\n };\n}\n\nexport const SKILL_GROUPS: SkillGroup[] = [\n {\n id: \"essentials\",\n label: \"Essentials\",\n description: \"Web design and writing guidelines from Vercel Labs.\",\n defaultSelected: true,\n skills: [\n pinnedSkill(ESSENTIALS_REPOSITORY, \"web-design-guidelines\"),\n pinnedSkill(ESSENTIALS_REPOSITORY, \"writing-guidelines\"),\n ],\n },\n {\n id: \"design\",\n label: \"Design & UI/UX\",\n description:\n \"agemon-design: design engineering with anti-slop rules, discovery, and outcome recipes for dashboards, landings, and auth screens.\",\n defaultSelected: false,\n skills: [\n vendoredSkill(\"design\", \"agemon-design\"),\n vendoredSkill(\"design\", \"agemon-design-minimal\"),\n vendoredSkill(\"design\", \"agemon-design-editorial\"),\n vendoredSkill(\"design\", \"agemon-design-dashboard\"),\n ],\n },\n {\n id: \"security\",\n label: \"Security\",\n description:\n \"Exploit-driven security review — no finding without a working proof-of-concept, CVSS-aligned severity.\",\n defaultSelected: false,\n skills: [vendoredSkill(\"security\", \"agemon-security\")],\n },\n {\n id: \"code-quality\",\n label: \"Code Quality\",\n description:\n \"Simplicity, DRY architecture, self-documenting naming, and surgical scope control for day-to-day edits.\",\n defaultSelected: false,\n skills: [\n vendoredSkill(\"code-quality\", \"agemon-clean-code\"),\n vendoredSkill(\"code-quality\", \"agemon-house-rules\"),\n ],\n },\n {\n id: \"architecture\",\n label: \"Code Architecture\",\n description:\n \"Clean Architecture review: dependency rule, layer separation, boundary crossing, SOLID.\",\n defaultSelected: false,\n skills: [vendoredSkill(\"architecture\", \"agemon-architecture\")],\n },\n {\n id: \"self-review\",\n label: \"Self-Review\",\n description:\n \"Verification before claiming completion, giving and receiving code review, and root-cause-first debugging.\",\n defaultSelected: false,\n skills: [\n vendoredSkill(\"self-review\", \"agemon-verify-before-done\"),\n vendoredSkill(\"self-review\", \"agemon-review-intake\"),\n vendoredSkill(\"self-review\", \"agemon-review-request\"),\n vendoredSkill(\"self-review\", \"agemon-root-cause\"),\n ],\n },\n {\n id: \"performance\",\n label: \"Performance\",\n description:\n \"Algorithmic-complexity-first discipline: N+1 detection, hot-loop hygiene, and when not to optimize.\",\n defaultSelected: false,\n skills: [vendoredSkill(\"performance\", \"agemon-performance\")],\n },\n {\n id: \"commit\",\n label: \"Commit Hygiene\",\n description:\n \"Staging review, commit message structure, and splitting unrelated changes into separate commits.\",\n defaultSelected: false,\n skills: [vendoredSkill(\"commit\", \"agemon-commit\")],\n },\n {\n id: \"teamlead\",\n label: \"Team Lead\",\n description:\n \"Team-lead workflows: structured RFC planning and PRD generation for major features or architectural changes.\",\n defaultSelected: false,\n skills: [\n vendoredSkill(\"team-lead\", \"agemon-plan-rfc\"),\n vendoredSkill(\"team-lead\", \"prd-generator\"),\n vendoredSkill(\"team-lead\", \"skill-headofit-audit\"),\n vendoredSkill(\"team-lead\", \"skill-incident-rca\"),\n vendoredSkill(\"team-lead\", \"skill-meeting-lifecycle\"),\n vendoredSkill(\"team-lead\", \"skill-obsidian-vault-sync\"),\n vendoredSkill(\"team-lead\", \"skill-prd-decomposer\"),\n vendoredSkill(\"team-lead\", \"skill-sec-check\"),\n vendoredSkill(\"team-lead\", \"skill-task-extractor\"),\n vendoredSkill(\"team-lead\", \"skill-techlead-reviewer\"),\n vendoredSkill(\"team-lead\", \"skill-tech-spike\"),\n ],\n },\n {\n id: \"geo-seo\",\n label: \"GEO / AI Search SEO\",\n description:\n \"Audit and optimize websites for AI search citation (ChatGPT, Perplexity, Google AI Overviews): citability, AI crawlers, llms.txt, schema, technical SEO, reports.\",\n defaultSelected: false,\n skills: [\n vendoredSkill(\"geo-seo\", \"geo\"),\n vendoredSkill(\"geo-seo\", \"geo-audit\"),\n vendoredSkill(\"geo-seo\", \"geo-citability\"),\n vendoredSkill(\"geo-seo\", \"geo-crawlers\"),\n vendoredSkill(\"geo-seo\", \"geo-llmstxt\"),\n vendoredSkill(\"geo-seo\", \"geo-brand-mentions\"),\n vendoredSkill(\"geo-seo\", \"geo-platform-optimizer\"),\n vendoredSkill(\"geo-seo\", \"geo-technical\"),\n vendoredSkill(\"geo-seo\", \"geo-content\"),\n vendoredSkill(\"geo-seo\", \"geo-report\"),\n vendoredSkill(\"geo-seo\", \"geo-schema\"),\n vendoredSkill(\"geo-seo\", \"geo-report-pdf\"),\n ],\n agents: [\n geoAuditAgent(\n \"geo-audit-ai-visibility\",\n \"ai-visibility.md\",\n \"Scores how quotable and visible a website is to AI search: citability, AI crawler access, llms.txt and brand presence.\",\n [\"WebFetch\"],\n ),\n geoAuditAgent(\n \"geo-audit-platform\",\n \"platform-analysis.md\",\n \"Scores a website's readiness for Google AI Overviews, ChatGPT, Perplexity, Gemini and Bing Copilot.\",\n [\"WebFetch\"],\n ),\n geoAuditAgent(\n \"geo-audit-technical\",\n \"technical.md\",\n \"Scores a website's technical health for AI crawlers: rendering, meta tags, headers, speed and security headers.\",\n [\"WebFetch\", \"Bash\"],\n ),\n geoAuditAgent(\n \"geo-audit-content\",\n \"content.md\",\n \"Scores a website's content quality and E-E-A-T signals: experience, expertise, authority and trust.\",\n [\"WebFetch\"],\n ),\n geoAuditAgent(\n \"geo-audit-schema\",\n \"schema.md\",\n \"Scores a website's schema.org structured data and finds missing GEO-relevant schema.\",\n [\"WebFetch\", \"Bash\"],\n ),\n ],\n },\n];\n\nexport const RETIRED_AGENT_NAMES: readonly string[] = [];\n\nexport function findSkillGroup(groupId: string): SkillGroup | undefined {\n return SKILL_GROUPS.find((group) => group.id === groupId);\n}\n\nconst CUSTOM_GROUP_DESCRIPTION =\n \"Defined in this repository's agemon.toml, not by agemon.\";\n\nfunction localSkill(path: string, skillName: string): SkillBundleEntry {\n return {\n id: skillName,\n source: path,\n skillName,\n agent: \"claude-code\",\n localSourcePath: path,\n };\n}\n\nfunction failCustomGroups(detail: string): never {\n throw new Error(`agemon.toml is invalid: ${printable(detail)}`);\n}\n\nexport function buildCustomSkillGroups(\n configs: CustomSkillGroupConfig[],\n): SkillGroup[] {\n const builtInSkillNames = new Set(\n SKILL_GROUPS.flatMap((group) =>\n group.skills.map((skill) => skill.skillName),\n ),\n );\n return configs.map((config) => {\n if (findSkillGroup(config.id) !== undefined) {\n failCustomGroups(\n `custom_skill_groups.${config.id} uses the id of a built-in skill group`,\n );\n }\n return {\n id: config.id,\n label: config.label,\n description: CUSTOM_GROUP_DESCRIPTION,\n defaultSelected: false,\n definedByRepository: true,\n skills: config.skills.map((skill) => {\n if (builtInSkillNames.has(skill.skillName)) {\n failCustomGroups(\n `custom_skill_groups.${config.id} names '${skill.skillName}', which is a built-in skill`,\n );\n }\n return skill.kind === \"local\"\n ? localSkill(skill.path, skill.skillName)\n : pinnedSkill(\n {\n url: `https://github.com/${skill.owner}/${skill.repository}`,\n commit: skill.ref,\n },\n skill.skillName,\n );\n }),\n };\n });\n}\n\nexport function assertCustomSkillGroupsAreValid(\n configs: CustomSkillGroupConfig[],\n): void {\n buildCustomSkillGroups(configs);\n}\n","import { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PACKAGE_NAME = \"agemon\";\nconst PACKAGE_MANIFEST = \"package.json\";\nconst MAX_PACKAGE_MANIFEST_BYTES = 1024 * 1024;\n\nlet cachedPackageRoot: string | undefined;\n\nfunction readPackageName(manifestPath: string): string | null {\n const stats = lstatSync(manifestPath);\n if (!stats.isFile() || stats.size > MAX_PACKAGE_MANIFEST_BYTES) {\n return null;\n }\n try {\n const manifest: unknown = JSON.parse(readFileSync(manifestPath, \"utf8\"));\n return typeof manifest === \"object\" &&\n manifest !== null &&\n \"name\" in manifest &&\n typeof manifest.name === \"string\"\n ? manifest.name\n : null;\n } catch {\n return null;\n }\n}\n\nfunction findNearestPackageDirectory(startDirectory: string): string | null {\n let currentDir = startDirectory;\n for (;;) {\n if (existsSync(join(currentDir, PACKAGE_MANIFEST))) {\n return currentDir;\n }\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n currentDir = parentDir;\n }\n}\n\nexport function resolvePackageRootFrom(startDirectory: string): string {\n const packageDirectory = findNearestPackageDirectory(startDirectory);\n if (\n packageDirectory === null ||\n readPackageName(join(packageDirectory, PACKAGE_MANIFEST)) !==\n PACKAGE_NAME ||\n !existsSync(join(packageDirectory, \"assets\", \"skills\"))\n ) {\n throw new Error(\n \"Unable to locate agemon's vendored assets/skills directory.\",\n );\n }\n return packageDirectory;\n}\n\nfunction resolvePackageRoot(): string {\n cachedPackageRoot ??= resolvePackageRootFrom(\n dirname(fileURLToPath(import.meta.url)),\n );\n return cachedPackageRoot;\n}\n\nexport function resolveVendoredSkillPath(\n groupId: string,\n skillId: string,\n): string {\n return join(resolvePackageRoot(), \"assets\", \"skills\", groupId, skillId);\n}\n\nexport function resolveToolsManifestDirectory(): string {\n return join(resolvePackageRoot(), \"assets\", \"tools\");\n}\n","import { constants, type Stats } from \"node:fs\";\nimport { lstat, open, opendir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { fingerprintJson, sha256Hex } from \"../../core/fingerprint.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\n\nconst MAX_SKILL_ENTRIES = 200;\nconst MAX_SKILL_DEPTH = 8;\nconst MAX_SKILL_BYTES = 8 * 1024 * 1024;\nconst FINDER_METADATA_FILE = \".DS_Store\";\n\nexport const SKILLS_CLI_COPY_EXCLUSIONS = {\n anyName: [\"metadata.json\"],\n directoryNames: [\".git\", \"__pycache__\", \"__pypackages__\"],\n} as const;\n\nexport class SkillTreeRefusal extends Error {}\n\nexport interface SkillTreeEntry {\n relativePath: string;\n contents: Buffer | null;\n}\n\ntype SkipEntry = (name: string, stats: Stats) => boolean;\n\nconst keepEveryEntry: SkipEntry = () => false;\n\nexport function isLeftOutBySkillsCli(name: string, stats: Stats): boolean {\n return (\n (SKILLS_CLI_COPY_EXCLUSIONS.anyName as readonly string[]).includes(name) ||\n (stats.isDirectory() &&\n (SKILLS_CLI_COPY_EXCLUSIONS.directoryNames as readonly string[]).includes(\n name,\n ))\n );\n}\n\nfunction isFinderMetadataFile(name: string, stats: Stats): boolean {\n return name === FINDER_METADATA_FILE && stats.isFile();\n}\n\nasync function readRegularFileWithoutFollowing(\n path: string,\n maxBytes: number,\n): Promise<Buffer | null> {\n const handle = await open(\n path,\n constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK,\n );\n try {\n const stats = await handle.stat();\n if (!stats.isFile()) {\n return null;\n }\n if (stats.size > maxBytes) {\n throw new SkillTreeRefusal(\"it is larger than 8 MiB\");\n }\n return await handle.readFile();\n } finally {\n await handle.close();\n }\n}\n\nasync function sortedNamesUpToCap(directory: string): Promise<string[]> {\n const names: string[] = [];\n for await (const entry of await opendir(directory)) {\n names.push(entry.name);\n if (names.length > MAX_SKILL_ENTRIES) {\n throw new SkillTreeRefusal(\n `it has more than ${MAX_SKILL_ENTRIES} entries`,\n );\n }\n }\n return names.sort();\n}\n\nexport async function readSkillTree(\n directory: string,\n skipEntry: SkipEntry = keepEveryEntry,\n): Promise<SkillTreeEntry[]> {\n const entries: SkillTreeEntry[] = [];\n let totalBytes = 0;\n\n const walk = async (relativeDirectory: string, depth: number) => {\n if (depth > MAX_SKILL_DEPTH) {\n throw new SkillTreeRefusal(\n `it is nested deeper than ${MAX_SKILL_DEPTH} levels`,\n );\n }\n for (const name of await sortedNamesUpToCap(\n join(directory, relativeDirectory),\n )) {\n const relativePath =\n relativeDirectory === \"\" ? name : `${relativeDirectory}/${name}`;\n const absolutePath = join(directory, relativePath);\n const stats = await lstat(absolutePath);\n if (skipEntry(name, stats)) {\n continue;\n }\n if (entries.length >= MAX_SKILL_ENTRIES) {\n throw new SkillTreeRefusal(\n `it has more than ${MAX_SKILL_ENTRIES} entries`,\n );\n }\n if (stats.isDirectory()) {\n entries.push({ relativePath, contents: null });\n await walk(relativePath, depth + 1);\n continue;\n }\n const contents = stats.isFile()\n ? await readRegularFileWithoutFollowing(\n absolutePath,\n MAX_SKILL_BYTES - totalBytes,\n )\n : null;\n if (contents === null) {\n throw new SkillTreeRefusal(\n `${printable(relativePath)} is a symlink or not a regular file`,\n );\n }\n totalBytes += contents.length;\n if (totalBytes > MAX_SKILL_BYTES) {\n throw new SkillTreeRefusal(\"it is larger than 8 MiB\");\n }\n entries.push({ relativePath, contents });\n }\n };\n\n await walk(\"\", 1);\n return entries;\n}\n\nexport function fingerprintSkillTree(entries: SkillTreeEntry[]): string {\n return fingerprintJson(\n entries.map((entry) => [\n entry.relativePath,\n entry.contents === null ? null : sha256Hex(entry.contents),\n ]),\n );\n}\n\nexport async function fingerprintSkillSource(\n directory: string,\n): Promise<string> {\n return fingerprintSkillTree(\n await readSkillTree(directory, isLeftOutBySkillsCli),\n );\n}\n\nexport async function fingerprintInstalledSkill(\n directory: string,\n): Promise<string> {\n return fingerprintSkillTree(\n await readSkillTree(directory, isFinderMetadataFile),\n );\n}\n","import { existsSync } from \"node:fs\";\nimport {\n copyFile,\n mkdtemp,\n readdir,\n readFile,\n rename,\n rm,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context, SubprocessResult } from \"../../core/context.js\";\nimport { sha256Hex } from \"../../core/fingerprint.js\";\nimport { resolveToolsManifestDirectory } from \"../../core/package-assets.js\";\nimport {\n prepareToolsRoot,\n withAgemonStateLock,\n} from \"../../core/state-root.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\n\nconst TOOLS_LOCK_HASH_LENGTH = 16;\nconst TOOLS_INSTALL_TIMEOUT_MS = 180_000;\nconst TOOLS_LOCK_WAIT_MS = 10 * 60_000;\nconst TOOLS_MANIFEST_FILES = [\"package.json\", \"package-lock.json\"];\nexport const SKILLS_CLI_PATH_IN_TOOLS_DIR = join(\n \"node_modules\",\n \"skills\",\n \"bin\",\n \"cli.mjs\",\n);\n\ntype SkillsCliContext = Pick<Context, \"run\">;\n\nfunction isLostInstallRace(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return code === \"EEXIST\" || code === \"ENOTEMPTY\";\n}\n\nasync function renameUnlessAnotherRunWon(\n stagingDirectory: string,\n toolsDirectory: string,\n): Promise<boolean> {\n try {\n await rename(stagingDirectory, toolsDirectory);\n return true;\n } catch (error) {\n if (isLostInstallRace(error)) {\n return false;\n }\n throw error;\n }\n}\nasync function promoteStagingDirectory(\n stagingDirectory: string,\n toolsDirectory: string,\n cliPath: string,\n): Promise<void> {\n if (await renameUnlessAnotherRunWon(stagingDirectory, toolsDirectory)) {\n return;\n }\n if (existsSync(cliPath)) {\n return;\n }\n const brokenDirectory = `${stagingDirectory}.broken`;\n await rename(toolsDirectory, brokenDirectory);\n await rm(brokenDirectory, { recursive: true, force: true });\n await renameUnlessAnotherRunWon(stagingDirectory, toolsDirectory);\n}\n\nconst ABANDONED_TOOLS_DIRECTORY_PATTERN = /^[0-9a-f]{16}\\.tmp-[^/]+$/;\n\nasync function removeAbandonedToolsDirectories(\n toolsRoot: string,\n): Promise<void> {\n for (const entry of await readdir(toolsRoot)) {\n if (ABANDONED_TOOLS_DIRECTORY_PATTERN.test(entry)) {\n await rm(join(toolsRoot, entry), { recursive: true, force: true });\n }\n }\n}\n\nasync function installToolsDirectory(\n ctx: SkillsCliContext,\n toolsRoot: string,\n manifestDirectory: string,\n toolsDirectory: string,\n cliPath: string,\n): Promise<void> {\n await removeAbandonedToolsDirectories(toolsRoot);\n const stagingDirectory = await mkdtemp(`${toolsDirectory}.tmp-`);\n try {\n for (const fileName of TOOLS_MANIFEST_FILES) {\n await copyFile(\n join(manifestDirectory, fileName),\n join(stagingDirectory, fileName),\n );\n }\n const installResult = await ctx.run(\n \"npm\",\n [\n \"ci\",\n \"--ignore-scripts\",\n \"--no-audit\",\n \"--no-fund\",\n \"--prefix\",\n stagingDirectory,\n ],\n { cwd: stagingDirectory, timeoutMs: TOOLS_INSTALL_TIMEOUT_MS },\n );\n if (installResult.code !== 0) {\n throw new Error(\n `Installing the pinned skills CLI into ${toolsRoot} failed: ${describeSubprocessFailure(installResult, \"npm ci\")}`,\n );\n }\n await promoteStagingDirectory(stagingDirectory, toolsDirectory, cliPath);\n } finally {\n await rm(stagingDirectory, { recursive: true, force: true });\n }\n}\n\nexport async function ensureSkillsCli(ctx: SkillsCliContext): Promise<string> {\n const manifestDirectory = resolveToolsManifestDirectory();\n const lockHash = sha256Hex(\n await readFile(join(manifestDirectory, \"package-lock.json\")),\n ).slice(0, TOOLS_LOCK_HASH_LENGTH);\n const toolsRoot = await prepareToolsRoot();\n const toolsDirectory = join(toolsRoot, lockHash);\n const cliPath = join(toolsDirectory, SKILLS_CLI_PATH_IN_TOOLS_DIR);\n\n if (existsSync(cliPath)) {\n return cliPath;\n }\n\n await withAgemonStateLock(\n \"tools.lock\",\n async () => {\n if (!existsSync(cliPath)) {\n await installToolsDirectory(\n ctx,\n toolsRoot,\n manifestDirectory,\n toolsDirectory,\n cliPath,\n );\n }\n },\n TOOLS_LOCK_WAIT_MS,\n );\n return cliPath;\n}\n\nexport async function runSkillsCli(\n ctx: Pick<Context, \"run\" | \"cwd\">,\n args: string[],\n timeoutMs: number,\n): Promise<SubprocessResult> {\n const cliPath = await ensureSkillsCli(ctx);\n return ctx.run(process.execPath, [cliPath, ...args], {\n cwd: ctx.cwd,\n timeoutMs,\n });\n}\n","import { join, relative } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { parse, stringify, TomlError } from \"smol-toml\";\nimport { BackupPathOccupiedError, writeBackupOnce } from \"./backups.js\";\nimport {\n RefusedFileError,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"./files.js\";\nimport { sha256Hex } from \"./fingerprint.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nconst CONFIG_FILE_NAME = \"agemon.toml\";\nconst CONFIG_BACKUP_RESOURCE_PREFIX = \"config:agemon.toml\";\nconst CONFIG_BACKUP_CONTENT_HASH_LENGTH = 16;\n\nconst MAX_CUSTOM_GROUP_ID_CHARACTERS = 40;\nconst CUSTOM_GROUP_ID_PATTERN = new RegExp(\n `^[a-z0-9][a-z0-9-]{0,${MAX_CUSTOM_GROUP_ID_CHARACTERS - 1}}$`,\n \"u\",\n);\nconst RESERVED_GROUP_IDS: readonly string[] = [\"all\", \"none\"];\nconst MAX_CUSTOM_GROUP_LABEL_CHARACTERS = 80;\nconst SKILL_NAME_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/u;\nconst LOCAL_SOURCE_PATTERN = /^\\.\\/(?:[A-Za-z0-9._-]+\\/)*([A-Za-z0-9._-]+)$/u;\nconst AGENT_DIRECTORIES: readonly string[] = [\".agents\", \".claude\"];\nconst GITHUB_SOURCE_PATTERN =\n /^github:([A-Za-z0-9][A-Za-z0-9_.-]{0,99})\\/([A-Za-z0-9][A-Za-z0-9_.-]{0,99})$/u;\nconst COMMIT_REF_PATTERN = /^[0-9a-f]{40}$/u;\nconst MAX_CUSTOM_GROUPS = 20;\nconst MAX_SKILLS_PER_CUSTOM_GROUP = 50;\nconst MAX_REMOTE_REPOSITORIES = 10;\n\nexport const CONFLICT_DECISIONS = [\"keep\", \"replace\", \"skip\"] as const;\nexport type ConflictDecision = (typeof CONFLICT_DECISIONS)[number];\n\nexport const SKILL_GROUPS_WHEN_ABSENT =\n \"interactive prompt per group, or essentials-only when non-interactive\";\n\nexport interface ConfigKey {\n name: string;\n type: string;\n whenAbsent: string | null;\n summary: string;\n githubSourceOnly?: true;\n}\n\ninterface ConfigTable {\n heading: string;\n keys: readonly ConfigKey[];\n}\n\nexport const AGEMON_TOML_TABLES: Readonly<{\n topLevel: ConfigTable;\n customSkillGroup: ConfigTable;\n customSkill: ConfigTable;\n}> = {\n topLevel: {\n heading: \"Top-level keys\",\n keys: [\n {\n name: \"capabilities\",\n type: \"array of capability ids\",\n whenAbsent: null,\n summary:\n \"The capabilities agemon reconciles in this repository. An empty list or an unknown id is an error.\",\n },\n {\n name: \"skill_groups\",\n type: \"string: comma-separated group ids, or all or none\",\n whenAbsent: SKILL_GROUPS_WHEN_ABSENT,\n summary:\n \"The skill groups to install, as with --skill-groups; the flag wins when both are given.\",\n },\n {\n name: \"custom_skill_groups\",\n type: \"table of group id to custom group table\",\n whenAbsent: \"no project-defined groups\",\n summary: `Project-defined skill groups. A group id is lower-case letters, digits and '-' (at most ${MAX_CUSTOM_GROUP_ID_CHARACTERS} characters), not all or none, and not a built-in group id.`,\n },\n {\n name: \"conflict_decisions\",\n type: \"table of resource id to decision\",\n whenAbsent: \"every conflict needs a decision in the run\",\n summary:\n \"What to do with a rule file that holds your own rules where agemon would write a pointer.\",\n },\n {\n name: \"known_capabilities\",\n type: \"array of capability ids\",\n whenAbsent: \"the capabilities agemon had before this key existed\",\n summary:\n \"The capabilities the agemon that wrote the file knew about, so a capability added in a later release is offered once.\",\n },\n ],\n },\n customSkillGroup: {\n heading: \"Custom skill group tables\",\n keys: [\n {\n name: \"label\",\n type: `string, one line, at most ${MAX_CUSTOM_GROUP_LABEL_CHARACTERS} characters`,\n whenAbsent: null,\n summary: \"The name shown when agemon asks which groups to install.\",\n },\n {\n name: \"skills\",\n type: `array of 1 to ${MAX_SKILLS_PER_CUSTOM_GROUP} skill entries`,\n whenAbsent: null,\n summary: \"The skills in the group, each a local or a GitHub source.\",\n },\n ],\n },\n customSkill: {\n heading: \"Custom skill entries\",\n keys: [\n {\n name: \"source\",\n type: 'string: \"./<path>\" or \"github:<owner>/<repository>\"',\n whenAbsent: null,\n summary:\n \"A directory in this repository (the skill's name is the directory name), or a GitHub repository.\",\n },\n {\n name: \"ref\",\n type: \"string: a full 40-character commit sha\",\n whenAbsent: null,\n summary:\n \"The commit to fetch; branches, tags and short shas are refused. Only for GitHub sources.\",\n githubSourceOnly: true,\n },\n {\n name: \"skill\",\n type: \"string: a skill name\",\n whenAbsent: null,\n summary:\n \"The skill to take from skills/<skill>/ in the repository. Only for GitHub sources.\",\n githubSourceOnly: true,\n },\n ],\n },\n};\n\nconst keyNames = (keys: readonly ConfigKey[]): readonly string[] =>\n keys.map((key) => key.name);\nconst TOP_LEVEL_KEYS = keyNames(AGEMON_TOML_TABLES.topLevel.keys);\nconst CUSTOM_GROUP_KEYS = keyNames(AGEMON_TOML_TABLES.customSkillGroup.keys);\nconst GITHUB_SKILL_KEYS = keyNames(AGEMON_TOML_TABLES.customSkill.keys);\nconst LOCAL_SKILL_KEYS = keyNames(\n AGEMON_TOML_TABLES.customSkill.keys.filter((key) => !key.githubSourceOnly),\n);\n\nexport type CustomSkillSource =\n | { kind: \"local\"; path: string; skillName: string }\n | {\n kind: \"github\";\n owner: string;\n repository: string;\n ref: string;\n skillName: string;\n };\n\nexport interface CustomSkillGroupConfig {\n id: string;\n label: string;\n skills: CustomSkillSource[];\n}\n\nexport interface AgemonConfig {\n capabilities: string[];\n skillGroups: string | null;\n customSkillGroups: CustomSkillGroupConfig[];\n conflictDecisions: ReadonlyMap<string, ConflictDecision>;\n knownCapabilities: string[] | null;\n sourceText: string;\n}\n\nexport type PersistedConfig = Omit<\n AgemonConfig,\n \"customSkillGroups\" | \"knownCapabilities\" | \"sourceText\"\n> & { knownCapabilities: string[] };\n\nexport function resolveConfigPath(cwd: string): string {\n return join(cwd, CONFIG_FILE_NAME);\n}\n\nfunction fail(detail: string): never {\n throw new Error(`${CONFIG_FILE_NAME} is invalid: ${printable(detail)}`);\n}\n\nfunction validateCapabilities(value: unknown): string[] {\n if (!Array.isArray(value)) {\n fail(\"'capabilities' must be an array of capability ids\");\n }\n if (value.length === 0) {\n fail(\"'capabilities' must list at least one capability id\");\n }\n return value.map((entry) => {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n fail(\"'capabilities' entries must be non-empty strings\");\n }\n return entry;\n });\n}\n\nfunction validateKnownCapabilities(value: unknown): string[] | null {\n if (value === undefined) {\n return null;\n }\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n fail(\"'known_capabilities' must be an array of non-empty strings\");\n }\n return value;\n}\n\nfunction validateKnownKeys(record: Record<string, unknown>): void {\n const unknownKey = Object.keys(record).find(\n (key) => !TOP_LEVEL_KEYS.includes(key),\n );\n if (unknownKey !== undefined) {\n fail(\n `unknown key '${unknownKey}'. Valid keys: ${TOP_LEVEL_KEYS.join(\", \")}.`,\n );\n }\n}\n\nfunction validateSkillGroups(value: unknown): string | null {\n if (value === undefined) {\n return null;\n }\n if (typeof value !== \"string\") {\n fail(\"'skill_groups' must be a string when present\");\n }\n return value;\n}\n\nfunction asTable(value: unknown, field: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n fail(`'${field}' must be a table`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction assertOnlyKeys(\n table: Record<string, unknown>,\n allowedKeys: readonly string[],\n field: string,\n): void {\n const unknownKey = Object.keys(table).find(\n (key) => !allowedKeys.includes(key),\n );\n if (unknownKey !== undefined) {\n fail(\n `'${field}' has unknown key '${unknownKey}'. Valid keys: ${allowedKeys.join(\", \")}.`,\n );\n }\n}\n\nexport function isPlainSkillName(value: string): boolean {\n return SKILL_NAME_PATTERN.test(value);\n}\n\nfunction validateSkillName(value: unknown, field: string): string {\n if (typeof value !== \"string\" || !isPlainSkillName(value)) {\n fail(\n `'${field}' must be a skill name of lower-case letters, digits, '.', '_' or '-' (at most 64 characters, not starting with '-' or '.')`,\n );\n }\n return value;\n}\n\nfunction validateLocalSource(path: string, field: string): CustomSkillSource {\n const match = LOCAL_SOURCE_PATTERN.exec(path);\n const components = path.split(\"/\").slice(1);\n if (\n match === null ||\n components.some((component) => component === \".\" || component === \"..\")\n ) {\n fail(\n `'${field}' must be a repository-relative path like \"./tools/skills/<name>\" without '.' or '..' components`,\n );\n }\n if (AGENT_DIRECTORIES.includes(components[0].toLowerCase())) {\n fail(\n `'${field}' must not point into ${AGENT_DIRECTORIES.join(\" or \")}, where installed skills live`,\n );\n }\n return {\n kind: \"local\",\n path,\n skillName: validateSkillName(match[1], `${field} (last path component)`),\n };\n}\n\nfunction validateCustomSkill(value: unknown, field: string): CustomSkillSource {\n const skill = asTable(value, field);\n if (typeof skill.source !== \"string\") {\n fail(`'${field}.source' must be a string`);\n }\n if (!skill.source.startsWith(\"github:\")) {\n assertOnlyKeys(skill, LOCAL_SKILL_KEYS, field);\n return validateLocalSource(skill.source, `${field}.source`);\n }\n\n assertOnlyKeys(skill, GITHUB_SKILL_KEYS, field);\n const match = GITHUB_SOURCE_PATTERN.exec(skill.source);\n if (match === null) {\n fail(`'${field}.source' must be \"github:<owner>/<repository>\"`);\n }\n if (typeof skill.ref !== \"string\" || !COMMIT_REF_PATTERN.test(skill.ref)) {\n fail(\n `'${field}.ref' must be a full 40-character commit sha; branches, tags and short shas are refused`,\n );\n }\n return {\n kind: \"github\",\n owner: match[1],\n repository: match[2],\n ref: skill.ref,\n skillName: validateSkillName(skill.skill, `${field}.skill`),\n };\n}\n\nfunction validateCustomSkillGroup(\n id: string,\n value: unknown,\n): CustomSkillGroupConfig {\n const field = `custom_skill_groups.${id}`;\n if (!CUSTOM_GROUP_ID_PATTERN.test(id) || RESERVED_GROUP_IDS.includes(id)) {\n fail(\n `'${field}': a group id is lower-case letters, digits and '-' (at most ${MAX_CUSTOM_GROUP_ID_CHARACTERS} characters), and not ${RESERVED_GROUP_IDS.join(\" or \")}`,\n );\n }\n const group = asTable(value, field);\n assertOnlyKeys(group, CUSTOM_GROUP_KEYS, field);\n if (\n typeof group.label !== \"string\" ||\n group.label.trim().length === 0 ||\n group.label.length > MAX_CUSTOM_GROUP_LABEL_CHARACTERS ||\n !isSafeIdentifier(group.label)\n ) {\n fail(\n `'${field}.label' must be a non-empty single-line string of at most ${MAX_CUSTOM_GROUP_LABEL_CHARACTERS} characters, without invisible or control characters`,\n );\n }\n if (\n !Array.isArray(group.skills) ||\n group.skills.length === 0 ||\n group.skills.length > MAX_SKILLS_PER_CUSTOM_GROUP\n ) {\n fail(\n `'${field}.skills' must list between 1 and ${MAX_SKILLS_PER_CUSTOM_GROUP} skills`,\n );\n }\n return {\n id,\n label: group.label,\n skills: group.skills.map((skill: unknown, index: number) =>\n validateCustomSkill(skill, `${field}.skills[${index}]`),\n ),\n };\n}\n\nfunction validateCustomSkillGroups(value: unknown): CustomSkillGroupConfig[] {\n if (value === undefined) {\n return [];\n }\n const groups = Object.entries(asTable(value, \"custom_skill_groups\")).map(\n ([id, group]) => validateCustomSkillGroup(id, group),\n );\n if (groups.length > MAX_CUSTOM_GROUPS) {\n fail(\n `'custom_skill_groups' may define at most ${MAX_CUSTOM_GROUPS} groups`,\n );\n }\n\n const skillNames = groups.flatMap((group) =>\n group.skills.map((skill) => skill.skillName),\n );\n const duplicateName = skillNames.find(\n (name, index) => skillNames.indexOf(name) !== index,\n );\n if (duplicateName !== undefined) {\n fail(\n `skill '${duplicateName}' appears more than once in 'custom_skill_groups'`,\n );\n }\n\n const remoteRepositories = new Set(\n groups.flatMap((group) =>\n group.skills.flatMap((skill) =>\n skill.kind === \"github\" ? [`${skill.owner}/${skill.repository}`] : [],\n ),\n ),\n );\n if (remoteRepositories.size > MAX_REMOTE_REPOSITORIES) {\n fail(\n `'custom_skill_groups' may use at most ${MAX_REMOTE_REPOSITORIES} GitHub repositories`,\n );\n }\n return groups;\n}\n\nconst quotedDecisions = CONFLICT_DECISIONS.map((decision) =>\n JSON.stringify(decision),\n);\nconst CONFLICT_DECISION_CHOICES = `${quotedDecisions.slice(0, -1).join(\", \")}, or ${quotedDecisions.at(-1)}`;\n\nfunction isConflictDecision(value: unknown): value is ConflictDecision {\n return CONFLICT_DECISIONS.some((decision) => decision === value);\n}\n\nfunction validateConflictDecisions(\n value: unknown,\n): Map<string, ConflictDecision> {\n const decisions = new Map<string, ConflictDecision>();\n if (value === undefined) {\n return decisions;\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n fail(\"'conflict_decisions' must be a table of resource id to decision\");\n }\n for (const [resourceId, decision] of Object.entries(\n value as Record<string, unknown>,\n )) {\n if (!isConflictDecision(decision)) {\n fail(\n `'conflict_decisions.${resourceId}' must be ${CONFLICT_DECISION_CHOICES}, got ${JSON.stringify(decision)}`,\n );\n }\n decisions.set(resourceId, decision);\n }\n return decisions;\n}\n\nexport async function loadConfig(cwd: string): Promise<AgemonConfig | null> {\n let rawContents: string | null;\n try {\n rawContents = await readRegularFileIfExists(resolveConfigPath(cwd));\n } catch (error) {\n if (error instanceof RefusedFileError) {\n fail(error.message);\n }\n throw new Error(`Unable to read ${CONFIG_FILE_NAME}: ${String(error)}`);\n }\n if (rawContents === null) {\n return null;\n }\n return validateConfigText(rawContents);\n}\n\nfunction parseConfigRecord(text: string): Record<string, unknown> {\n try {\n return parse(text) as Record<string, unknown>;\n } catch (error) {\n const detail = error instanceof TomlError ? error.message : String(error);\n fail(`not valid TOML — ${detail}`);\n }\n}\n\nexport function validateConfigText(text: string): AgemonConfig {\n const record = parseConfigRecord(text);\n validateKnownKeys(record);\n return {\n capabilities: validateCapabilities(record.capabilities),\n skillGroups: validateSkillGroups(record.skill_groups),\n customSkillGroups: validateCustomSkillGroups(record.custom_skill_groups),\n conflictDecisions: validateConflictDecisions(record.conflict_decisions),\n knownCapabilities: validateKnownCapabilities(record.known_capabilities),\n sourceText: text,\n };\n}\n\nexport type ConfigCapabilityUpdate =\n | { kind: \"written\"; backupPath: string | null }\n | { kind: \"not-written\"; reason: string };\n\nfunction serializeConfigRecord(record: Record<string, unknown>): string {\n return `${stringify(record)}\\n`;\n}\n\nfunction configBackupResourceId(\n addedCapabilityIds: string[],\n originalText: string,\n): string {\n const contentHash = sha256Hex(originalText).slice(\n 0,\n CONFIG_BACKUP_CONTENT_HASH_LENGTH,\n );\n return `${CONFIG_BACKUP_RESOURCE_PREFIX}:${addedCapabilityIds.join(\",\")}:${contentHash}`;\n}\n\nexport async function rewriteConfigCapabilities(\n cwd: string,\n config: AgemonConfig,\n update: { capabilities: string[]; knownCapabilities: string[] },\n): Promise<ConfigCapabilityUpdate> {\n const configPath = resolveConfigPath(cwd);\n const currentText = await readRegularFileIfExists(configPath);\n if (currentText !== config.sourceText) {\n return { kind: \"not-written\", reason: \"it changed during this run\" };\n }\n\n const currentRecord = parseConfigRecord(currentText);\n const nextRecord = {\n ...currentRecord,\n capabilities: update.capabilities,\n known_capabilities: [\n ...new Set([\n ...(config.knownCapabilities ?? []),\n ...update.knownCapabilities,\n ]),\n ],\n };\n const nextText = serializeConfigRecord(nextRecord);\n // smol-toml ≥1.9 parses tables into null-prototype objects; structuredClone\n // gives plain objects, so the comparison sees values only.\n if (\n !isDeepStrictEqual(\n structuredClone(parseConfigRecord(nextText)),\n structuredClone(nextRecord),\n )\n ) {\n return {\n kind: \"not-written\",\n reason: \"rewriting it would change values agemon did not mean to change\",\n };\n }\n validateConfigText(nextText);\n\n const losesCommentsOrLayout =\n serializeConfigRecord(currentRecord) !== currentText;\n let backup: { path: string } | null = null;\n if (losesCommentsOrLayout) {\n const addedIds = update.capabilities.filter(\n (id) => !config.capabilities.includes(id),\n );\n try {\n backup = await writeBackupOnce(\n cwd,\n configBackupResourceId(addedIds, currentText),\n currentText,\n );\n } catch (error) {\n if (!(error instanceof BackupPathOccupiedError)) {\n throw error;\n }\n return {\n kind: \"not-written\",\n reason: `agemon's backup path ${relative(cwd, error.backupPath)} holds something else; move it aside and run agemon again`,\n };\n }\n }\n await writeFileAtomic(configPath, nextText);\n return {\n kind: \"written\",\n backupPath: backup === null ? null : relative(cwd, backup.path),\n };\n}\n\nexport async function writeConfig(\n cwd: string,\n config: PersistedConfig,\n): Promise<string> {\n const configPath = resolveConfigPath(cwd);\n const payload: Record<string, unknown> = {\n capabilities: config.capabilities,\n };\n if (config.skillGroups !== null) {\n payload.skill_groups = config.skillGroups;\n }\n payload.conflict_decisions = Object.fromEntries(config.conflictDecisions);\n payload.known_capabilities = config.knownCapabilities;\n\n await writeFileAtomic(configPath, `${stringify(payload)}\\n`);\n return configPath;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r?\\n/);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r?\\n/);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n /** @internal */\n static x(message, ctx, ptr) {\n throw new TomlError(message, { toml: ctx.s, ptr: ptr ?? ctx.p });\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\n/** @internal */\nexport function parseString(ctx) {\n let startPtr = ctx.p;\n let c = ctx.s.charCodeAt(ctx.p++);\n let first = c;\n let isLiteral = c === 0x27; /* ' */\n let isMultiline = c === ctx.s.charCodeAt(ctx.p) && c === ctx.s.charCodeAt(ctx.p + 1);\n if (isMultiline) {\n // Trim initial newline\n if ((c = ctx.s.charCodeAt(ctx.p += 2)) === 0xa /* \\n */)\n ctx.p++;\n else if (c === 0xd /* \\r */ && ctx.s.charCodeAt(ctx.p + 1) === 0xa /* \\n */)\n ctx.p += 2;\n }\n // For the record: it is not worth it to use a fast-path for literal strings using `indexOf`.\n // Doing a char-by-char iteration ends up dispatching less instructions, for the same wall-clock runtime.\n let parsed = '';\n let sliceStart = ctx.p;\n // states:\n // 0 - decoding\n // 1 - decoding escape\n // 2 - whitespace escape (no newline encountered yet, must fail on non-whitespace)\n // 3 - whitespace escape (newline encountered, allowed to transition back to normal decode)\n let state = 0;\n for (; ctx.p < ctx.s.length; ctx.p++) {\n c = ctx.s.charCodeAt(ctx.p);\n // Deal with newlines first, since that simplifies control character checking and handling across all states\n if (isMultiline && (c === 0xa /* \\n */ || (c === 0xd /* \\r */ && ctx.s.charCodeAt(ctx.p + 1) === 0xa /* \\n */))) {\n state = state && 3;\n }\n // Control characters are banned in TOML, so we throw an error if we encounter them\n else if ((c < 0x20 && c !== 0x9 /* \\t */) || c === 0x7f) {\n TomlError.x('control characters are not allowed in strings', ctx);\n }\n // The string might terminate while we're parsing through a newline escape.\n // It must have encountered a newline; otherwise, it'll simply fail in another branch.\n else if ((!state || state === 3) && c === first && (!isMultiline || (ctx.s.charCodeAt(ctx.p + 1) === first && ctx.s.charCodeAt(ctx.p + 2) === first))) {\n if (isMultiline) {\n // If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n if (ctx.s.charCodeAt(ctx.p + 3) === first)\n ctx.p++;\n if (ctx.s.charCodeAt(ctx.p + 3) === first)\n ctx.p++;\n }\n // If we're in a newline escape still, then there's nothing to add.\n if (!state) {\n // Avoid a useless concat operation if the string can be used as-is.\n let s = ctx.s.slice(sliceStart, ctx.p);\n parsed = parsed ? parsed + s : s;\n }\n ctx.p += isMultiline ? 3 : 1;\n return parsed;\n }\n // Baseline state; keep moving forward unless an escape sequence starts\n else if (!state) {\n if (!isLiteral && c === 0x5c /* \\ */) {\n parsed += ctx.s.slice(sliceStart, (sliceStart = ctx.p));\n state = 1;\n }\n }\n else if (state === 1) {\n if (c === 0x78 /* x */ || c === 0x75 /* u */ || c === 0x55 /* U */) { // Unicode escape\n let errPtr = ctx.p++ - 1;\n let value = 0;\n let len = c === 0x78 /* x */ ? 2 : c === 0x75 /* u */ ? 4 : 8;\n for (let j = 0; j < len; j++, ctx.p++) {\n let hex = ctx.s.charCodeAt(ctx.p);\n let digit = \n /* 0-9 */ hex >= 0x30 && hex <= 0x39 ? hex - 0x30 :\n /* A-F */ hex >= 0x41 && hex <= 0x46 ? hex - 0x41 + 10 :\n /* a-f */ hex >= 0x61 && hex <= 0x66 ? hex - 0x61 + 10 : -1;\n if (digit < 0)\n TomlError.x('invalid non-hex character in unicode escape', ctx);\n value = (value << 4) | digit;\n }\n // Because JS does bitwise on signed 32bit integers, all 0xfzzzzzzz values are actually seen as negative\n if (value < 0 || value > 0x10ffff || (value >= 0xd800 && value <= 0xdfff)) {\n TomlError.x('invalid unicode escape', ctx, errPtr);\n }\n parsed += String.fromCodePoint(value);\n sliceStart = ctx.p--;\n state = 0;\n }\n // Newline escape sequence. We only need to care about spaces and tabs; newlines are dealt with earlier\n else if (isMultiline && (c === 0x20 || c === 0x9 /* \\t */)) {\n state = 2;\n }\n // Basic escape sequence\n else {\n if (c === 0x62 /* b */)\n parsed += '\\b';\n else if (c === 0x74 /* t */)\n parsed += '\\t';\n else if (c === 0x6e /* n */)\n parsed += '\\n';\n else if (c === 0x66 /* f */)\n parsed += '\\f';\n else if (c === 0x72 /* r */)\n parsed += '\\r';\n else if (c === 0x65 /* e */)\n parsed += '\\x1b';\n else if (c === 0x22 /* \" */)\n parsed += '\"';\n else if (c === 0x5c /* \\ */)\n parsed += '\\\\';\n else\n TomlError.x('unrecognised escape sequence', ctx);\n sliceStart = ctx.p + 1;\n state = 0;\n }\n }\n // Newline escape continuation: keep moving forward until the first non-whitespace char\n else if (c !== 0x20 && c !== 0x9 /* \\t */) {\n if (state === 2)\n TomlError.x('invalid escape: only line-ending whitespace may be escaped', ctx, sliceStart);\n // State cannot be zero, or we'd have branched earlier already.\n // If it's a backslash, immediately transition to the escape state so it can be processed.\n state = !isLiteral && c === 0x5c /* \\ */ ? 1 : 0;\n sliceStart = ctx.p;\n }\n }\n TomlError.x('unfinished string', ctx, startPtr);\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[Tt ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date, fasttype, unsafeDelim) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n let c;\n if (typeof date === 'string') {\n if (fasttype)\n prep: {\n // Date-time\n if (fasttype < 3) {\n if (+date.slice(11, 13) > 23) {\n date = '';\n break prep;\n }\n // Local\n if (fasttype === 2) {\n offset = null;\n date += 'Z';\n }\n // Offset; keep track of offset if not Z\n else if ((c = date.charCodeAt(date.length - 1)) !== 0x5a /* Z */ && c !== 0x7a /* z */) {\n offset = date.slice(date.length - 6);\n }\n if (unsafeDelim)\n date = date.slice(0, 10) + 'T' + date.slice(11);\n }\n // Time\n else if (fasttype === 4) {\n date = +date.slice(0, 2) > 23 ? '' : `0000-01-01T${date}Z`;\n }\n hasDate = fasttype !== 4;\n hasTime = fasttype !== 3;\n }\n else {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z' || this.#offset === 'z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { TomlError } from './error.js';\nimport { TomlDate } from './date.js';\nfunction isDigit(char, base = 10) {\n return base === 16\n ? (char > 0x2f && char < 0x3a) || (char > 0x40 && char < 0x47) || (char > 0x60 && char < 0x67)\n : (char > 0x2f && char < 0x30 + base);\n}\nfunction isEndOfValue(char, delim) {\n // Whitespace -- we're permissive on `\\r` for performance; it'll be dealt with later anyway\n return char === 0x20 || char === 0x9 /* \\t */ || char === 0xa /* \\n */ || char === 0xd /* \\r */ ||\n // Structure end or next value delimiter\n (delim && (char === delim || char === 0x2c /* , */)) ||\n // Comment\n char === 0x23; /* # */\n}\n/** @internal */\nexport function extractValue(ctx, end) {\n let errPtr = ctx.p;\n let c = ctx.s.charCodeAt(ctx.p);\n // Structs\n if (c === 0x5b /* [ */ || c === 0x7b /* { */) {\n ctx.d-- || TomlError.x('document contains excessively nested structures. aborting.', ctx);\n let value = c === 0x5b /* [ */\n ? parseArray(ctx)\n : parseInlineTable(ctx);\n ctx.d++;\n return value;\n }\n // Strings\n if (c === 0x22 /* \" */ || c === 0x27 /* ' */) {\n return parseString(ctx);\n }\n // Booleans\n // We can fast-path because the first character is enough to know the only possible value\n if (c === 0x74 /* t */) { // Only possible valid value is `true`\n if (ctx.s.charCodeAt(++ctx.p) !== 0x72 || ctx.s.charCodeAt(++ctx.p) !== 0x75 || ctx.s.charCodeAt(++ctx.p) !== 0x65)\n TomlError.x('invalid value', ctx, errPtr);\n return ctx.p++, true;\n }\n if (c === 0x66 /* f */) { // Only possible valid value is `false`\n if (ctx.s.charCodeAt(++ctx.p) !== 0x61 || ctx.s.charCodeAt(++ctx.p) !== 0x6c || ctx.s.charCodeAt(++ctx.p) !== 0x73 || ctx.s.charCodeAt(++ctx.p) !== 0x65)\n TomlError.x('invalid value', ctx, errPtr);\n return ctx.p++, false;\n }\n if (c === 0x2b /* + */ || c === 0x2d /* - */) {\n return parseNumber(ctx, ctx.p, ctx.s.charCodeAt(++ctx.p), 0x2c - c, end);\n }\n // Rough heuristic, but `parseDate` falls back to number parsing if it's a false positive.\n // e.g.: `a = 1\\n-------------- = 1` would match this heuristic, but gracefully fallback to numbers.\n if (ctx.s.charCodeAt(ctx.p + 4) === 0x2d /* - */ && ctx.s.charCodeAt(ctx.p + 7) === 0x2d /* - */) {\n return parseDate(ctx, c, end);\n }\n // Same logic as above; `parseTime` falls back to number parsing if it's a false positive.\n if (ctx.s.charCodeAt(ctx.p + 2) === 0x3a /* : */) {\n return parseTime(ctx, c, end);\n }\n return parseNumber(ctx, ctx.p, c, 0, end);\n}\n// State:\n// 0: init\n// 1: integer\n// 2: fractional dot\n// 3: fractional\n// 4: exponent letter\n// 5: exponent\n// 6: exponent sign\n// 7: exponent with sign\n// >9: underscore; see below\n// -> 12: was integer\n// -> 14: was fractional\n// -> 16: was exponent\n// states 2-5, 14, 16 are ONLY permitted iif base === 10\nfunction parseNumber(ctx, startPtr, startChr, sign, endChr) {\n let c = startChr;\n let state = 0;\n let hasUnderscores = false;\n // (+/-)inf\n if (c === 0x69 /* i */) {\n if (ctx.s.charCodeAt(++ctx.p) !== 0x6e || ctx.s.charCodeAt(++ctx.p) !== 0x66)\n TomlError.x('invalid value', ctx, startPtr);\n return ctx.p++, (sign || 1) / 0;\n }\n // (+/-)nan\n if (c === 0x6e /* n */) {\n if (ctx.s.charCodeAt(++ctx.p) !== 0x61 || ctx.s.charCodeAt(++ctx.p) !== 0x6e)\n TomlError.x('invalid value', ctx, startPtr);\n return ctx.p++, NaN;\n }\n // Leading zero\n // Only allowed cases: `0<EOV>`, `0.(...)`, `0e(...)`, `0x(...)`, `0b(...)`, `0o(...)`\n // FWIW, `0e(...)` is a stupid case, but it's not banned per-se so we have to parse it\n if (c === 0x30 /* 0 */) {\n if (++ctx.p >= ctx.s.length || isEndOfValue(c = ctx.s.charCodeAt(ctx.p), endChr))\n return ctx.bi === true ? 0n : 0; // note: conveniently deals with `-0`\n if (!sign) {\n if (c === 0x78 /* x */)\n return parseIntegerBaseN(ctx, startPtr, 16, endChr);\n else if (c === 0x62 /* b */)\n return parseIntegerBaseN(ctx, startPtr, 2, endChr);\n else if (c === 0x6f /* o */)\n return parseIntegerBaseN(ctx, startPtr, 8, endChr);\n }\n if (c === 0x2e /* . */)\n state = 2;\n else if (c === 0x65 /* e */ || c === 0x45 /* E */)\n state = 4;\n else\n TomlError.x('illegal leading zero', ctx, startPtr);\n }\n // If the 1st char is not a digit by now, then it's not a valid TOML value at all\n else if (!isDigit(c))\n TomlError.x('invalid value', ctx, startPtr);\n while (++ctx.p < ctx.s.length && (c = ctx.s.charCodeAt(ctx.p), !isEndOfValue(c, endChr))) {\n if (!state)\n state = 1; // Detects single-digit numbers we can use a fast parse path for\n // The way the states are numbered is not random: underscores are always permitted in odd-numbered states and\n // never permitted in even-numbered ones.\n if (c === 0x5f /* _ */) {\n if (!(state & 1))\n TomlError.x('illegal underscore', ctx);\n state += 11; // 11 is a marker that makes the state even and greater than 9; see the numbering + rationale above\n hasUnderscores = true;\n }\n // Transition to fractional part.\n else if (state === 1 && c === 0x2e /* . */)\n state = 2;\n // Transition to exponent part.\n else if ((state === 1 || state === 3) && (c === 0x65 /* e */ || c === 0x45 /* E */))\n state = 4;\n // + and - are permitted in state 4 only (handled before entering the function for state 0)\n else if (state === 4 && (c === 0x2b /* + */ || c === 0x2d /* - */)) {\n state = 6;\n }\n // All special cases have been handled; only digits are allowed here\n else if (!isDigit(c))\n TomlError.x(`illegal character in numeric literal`, ctx);\n // Clear state flags\n else if (state > 9)\n state -= 11;\n else if (!(state & 1))\n state++;\n }\n // Single-char number; we can fast-path these very easily.\n if (!state) {\n let val = (startChr - 0x30 /* 0 */) * (sign || 1);\n return ctx.bi === true ? BigInt(val) : val;\n }\n // Even-numbered states absolutely require a digit next; not even end of value is permitted\n if (!(state & 1))\n TomlError.x('unfinished numeric value', ctx, startPtr);\n let str = ctx.s.slice(startPtr, ctx.p);\n if (hasUnderscores)\n str = str.replaceAll('_', ''); // perf: replaceAll 1.25x faster than replace with a regex\n return state > 1\n ? parseFloat(str)\n : parseInteger(ctx, str, 10, startPtr);\n}\nfunction parseIntegerBaseN(ctx, startPtr, base, endChr) {\n let c, underscore = 1;\n while (++ctx.p < ctx.s.length && (c = ctx.s.charCodeAt(ctx.p), !isEndOfValue(c, endChr))) {\n if (c === 0x5f /* _ */) {\n if (underscore & 1)\n TomlError.x('illegal underscore', ctx);\n underscore = 3;\n }\n // We only need to check if the number is a valid digit, nothing else is permitted\n else if (!isDigit(c, base))\n TomlError.x(`illegal character in numeric literal`, ctx);\n // Clear underscore flag\n else if (underscore & 1)\n underscore--;\n }\n // Trailing underscore is not allowed\n if (underscore & 1)\n TomlError.x('unfinished numeric value', ctx);\n let str = ctx.s.slice(startPtr + 2, ctx.p);\n if (underscore)\n str = str.replaceAll('_', ''); // perf: replaceAll 1.25x faster than replace with a regex\n return parseInteger(ctx, str, base, startPtr);\n}\nfunction parseInteger(ctx, str, base, startPtr) {\n if (ctx.bi !== true)\n int: {\n let val = parseInt(str, base);\n if (!Number.isSafeInteger(val)) {\n if (ctx.bi)\n break int;\n TomlError.x('integer value cannot be represented losslessly', ctx, startPtr);\n }\n return val;\n }\n return base === 10 ? BigInt(str) : BigInt((base === 2 ? '0b' : base === 8 ? '0o' : '0x') + str);\n}\nfunction parseDate(ctx, c, endChr) {\n let startPtr = ctx.p++, unsafeSeparator;\n if (!isDigit(c) ||\n !isDigit(ctx.s.charCodeAt(ctx.p++)) ||\n !isDigit(ctx.s.charCodeAt(ctx.p++)) ||\n !isDigit(ctx.s.charCodeAt(ctx.p++))) {\n return parseNumber(ctx, ctx.p = startPtr, c, 0, endChr);\n }\n ctx.p += 5;\n if (!isDigit(ctx.s.charCodeAt(ctx.p++)))\n TomlError.x('invalid date-time: date part is malformed', ctx, startPtr);\n if (ctx.p >= ctx.s.length || (((c = ctx.s.charCodeAt(ctx.p)) !== 0x20 || (unsafeSeparator = true, !isDigit(ctx.s.charCodeAt(ctx.p + 1)))) && c !== 0x54 /* T */ && c !== 0x74 /* t */)) {\n let t = ctx.s.slice(startPtr, ctx.p);\n return readDate(ctx, t, 3, false, startPtr);\n }\n if (ctx.s.charCodeAt(ctx.p += 3) !== 0x3a /* : */)\n TomlError.x('invalid date-time: time part is malformed', ctx, startPtr);\n if (ctx.s.charCodeAt(ctx.p += 3) === 0x3a /* : */)\n ctx.p += 3;\n if (ctx.s.charCodeAt(ctx.p) === 0x2e /* . */)\n while (isDigit(ctx.s.charCodeAt(++ctx.p)))\n ;\n if (c = ctx.s.charCodeAt(ctx.p)) {\n if (c === 0x5a /* Z */ || c === 0x7a /* z */) {\n let t = ctx.s.slice(startPtr, ++ctx.p);\n return readDate(ctx, t, 1, unsafeSeparator, startPtr, '[+00:00]');\n }\n if (c === 0x2b /* + */ || c === 0x2d /* - */) {\n // Temporal's ZonedDateTime is weird asf when it comes to dealing with traditional offsets...\n // It's 1.2x faster to allocate a new string to pass to ZDT than use Instant.toZonedDateTimeISO\n let t = ctx.s.slice(startPtr, ctx.p += 6);\n return readDate(ctx, t, 1, unsafeSeparator, startPtr, !ctx.ld && ('[' + ctx.s.slice(ctx.p - 6, ctx.p) + ']'));\n }\n }\n let t = ctx.s.slice(startPtr, ctx.p);\n return readDate(ctx, t, 2, unsafeSeparator, startPtr);\n}\nfunction parseTime(ctx, c, endChr) {\n let start = ctx.p;\n if (!isDigit(c) || !isDigit(ctx.s.charCodeAt(++ctx.p))) {\n return parseNumber(ctx, --ctx.p, c, 0, endChr);\n }\n if (ctx.s.charCodeAt(ctx.p += 4) === 0x3a /* : */)\n ctx.p += 3;\n if (ctx.s.charCodeAt(ctx.p) === 0x2e /* . */)\n while (isDigit(ctx.s.charCodeAt(++ctx.p)))\n ;\n let t = ctx.s.slice(start, ctx.p);\n return readDate(ctx, t, 4, false, start);\n}\nfunction readDate(ctx, str, type, unsafeDelim, errPtr, temporalSuffix) {\n if (ctx.ld) {\n let date = new TomlDate(str, type, unsafeDelim);\n if (!date.isValid())\n TomlError.x('invalid date', ctx, errPtr);\n return date;\n }\n try {\n if (temporalSuffix)\n str += temporalSuffix;\n switch (type) {\n case 1: return Temporal.ZonedDateTime.from(str);\n case 2: return Temporal.PlainDateTime.from(str);\n case 3: return Temporal.PlainDate.from(str);\n case 4: return Temporal.PlainTime.from(str);\n }\n }\n catch (e) {\n TomlError.x(e instanceof Error ? e.message : '' + e, ctx, errPtr);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\n/** @internal */\nexport function skipComment(ctx) {\n for (; ctx.p < ctx.s.length; ctx.p++) {\n let c = ctx.s.charCodeAt(ctx.p);\n if (c === 0xa /* \\n */)\n break;\n if (c === 0xd /* \\r */ && ctx.s.charCodeAt(ctx.p + 1) === 0xa /* \\n */) {\n ctx.p++;\n break;\n }\n if ((c < 0x20 && c !== 0x9 /* \\t */) || c === 0x7f) {\n TomlError.x('control characters are not allowed in comments', ctx);\n }\n }\n}\n/** @internal */\nexport function skipVoid(ctx, banNewLines, banComments) {\n let c;\n while (ctx.p < ctx.s.length) {\n while (ctx.p < ctx.s.length && ((c = ctx.s.charCodeAt(ctx.p)) === 0x20 ||\n c === 0x9 /* \\t */ ||\n (!banNewLines &&\n (c === 0xa /* \\n */ || (c === 0xd /* \\r */ && ctx.s.charCodeAt(ctx.p + 1) === 0xa /* \\n */)))))\n ctx.p++;\n if (banComments || c !== 0x23 /* # */)\n break;\n skipComment(ctx);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\n/** @internal */\nexport function parseKey(ctx, end = 0x3d /* = */) {\n // States:\n // 0: before first char\n // 1: parsing bare key\n // 2: after key component\n let startPtr;\n let state = 0;\n let parsed = [];\n let sliceStart;\n let c = ctx.s.charCodeAt(startPtr = ctx.p);\n do {\n // End of key\n if (c === end) {\n if (!state)\n TomlError.x('unexpected end of key', ctx);\n if (state === 1)\n parsed.push(ctx.s.slice(sliceStart, ctx.p));\n return ctx.p++, parsed;\n }\n // Dotted key separator\n else if (c === 0x2e /* . */) {\n if (!state)\n TomlError.x('illegal empty bare key', ctx);\n if (state === 1)\n parsed.push(ctx.s.slice(sliceStart, ctx.p));\n state = 0;\n }\n // Quoted key\n else if (!state && (c === 0x22 /* \" */ || c === 0x27 /* ' */)) {\n if (c === ctx.s.charCodeAt(ctx.p + 1) && c === ctx.s.charCodeAt(ctx.p + 2))\n TomlError.x('illegal quoted key: multiline strings are not allowed', ctx);\n parsed.push(parseString(ctx));\n state = 2;\n ctx.p--;\n }\n // Whitespace; no-op in state 0 and 2, end of bare key in state 1\n else if (c === 0x20 || c === 0x9 /* \\t */) {\n if (state === 1) {\n parsed.push(ctx.s.slice(sliceStart, ctx.p));\n state = 2;\n }\n }\n // If state is post-key, no character is allowed; otherwise ensure it's a bare-key component\n else if (state === 2 || (c < 0x30 && c !== 0x2d /* - */) || (c > 0x39 && c < 0x41) || (c > 0x5a && c < 0x61 && c !== 0x5f /* _ */) || c > 0x7a) {\n TomlError.x('illegal character in key', ctx);\n }\n // Illegal character\n else if (!state) {\n state = 1;\n sliceStart = ctx.p;\n }\n } while (c = ctx.s.charCodeAt(++ctx.p));\n TomlError.x('incomplete key-value: cannot find end of key', ctx, startPtr);\n}\n/** @internal */\nexport function parseInlineTable(ctx) {\n let startPtr = ctx.p++;\n let res = Object.create(null);\n let seen = new Set();\n let c;\n while (ctx.p < ctx.s.length) {\n skipVoid(ctx);\n if ((c = ctx.s.charCodeAt(ctx.p)) === 0x7d /* } */) {\n ctx.p++;\n return res;\n }\n let k;\n let t = res;\n let hasOwn = false;\n let errPtr = ctx.p;\n let key = parseKey(ctx);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = Object.create(null));\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n TomlError.x('trying to redefine an already defined value', ctx, errPtr);\n }\n let unsafe = k === '__proto__';\n if (ctx.uk && (unsafe || k === 'constructor')) {\n t = ctx.uk !== 1 && TomlError.x('document contains an unsafe property', ctx, errPtr);\n break;\n }\n if (!hasOwn && unsafe) {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n TomlError.x('trying to redefine an already defined value', ctx, errPtr);\n }\n skipVoid(ctx, true, true);\n let value = extractValue(ctx, 0x7d /* } */);\n if (t && typeof (t[k] = value) === 'object')\n seen.add(value);\n skipVoid(ctx);\n if ((c = ctx.s.charCodeAt(ctx.p++)) === 0x7d /* } */) {\n return res;\n }\n if (c !== 0x2c /* , */)\n TomlError.x('expected comma or end of structure', ctx, ctx.p - 1);\n }\n TomlError.x('unfinished table', ctx, startPtr);\n}\n/** @internal */\nexport function parseArray(ctx) {\n let startPtr = ctx.p++;\n let res = [];\n let c;\n while (ctx.p < ctx.s.length) {\n skipVoid(ctx);\n if ((c = ctx.s.charCodeAt(ctx.p)) === 0x5d /* ] */) {\n ctx.p++;\n return res;\n }\n res.push(extractValue(ctx, 0x5d /* ] */));\n skipVoid(ctx);\n if ((c = ctx.s.charCodeAt(ctx.p++)) === 0x5d /* ] */) {\n return res;\n }\n if (c !== 0x2c /* , */)\n TomlError.x('expected comma or end of structure', ctx, ctx.p - 1);\n }\n TomlError.x('unfinished array', ctx, startPtr);\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(ctx, key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = Object.create(null));\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n let unsafe = k === '__proto__';\n if (ctx.uk && (unsafe || k === 'constructor'))\n return false;\n if (unsafe) {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */ : type,\n d: false,\n i: 0,\n c: Object.create(null),\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = Object.create(null));\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: Object.create(null) });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = Object.create(null));\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nfunction validateTablePeek(ctx, peek, ptr) {\n if (peek === null || ctx.uk === 2)\n TomlError.x(peek === null\n ? 'trying to redefine an already defined table or value'\n : 'document contains an unsafe property', ctx, ptr);\n}\nexport function parse(toml, options = {}) {\n let ctx = {\n s: toml,\n p: 0,\n d: options.maxDepth ?? 1000,\n bi: options.integersAsBigInt ?? false,\n ld: options.useLegacyDate ?? true,\n uk: options.unsafeKeyBehaviour === 'throw' ? 2 : options.unsafeKeyBehaviour === 'drop' ? 1 : 0,\n };\n let res = Object.create(null);\n let meta = Object.create(null);\n let tmp;\n let skipping = false;\n let tbl = res;\n let m = meta;\n // BOM is allowed, skip.\n // JS is UTF-16, so we have to check for the UTF-16 BOM instead of the UTF-8 BOM sequence!\n if (toml.charCodeAt(0) === 0xfeff)\n ctx.p++;\n skipVoid(ctx);\n while (ctx.p < toml.length) {\n if (toml.charCodeAt(ctx.p) === 0x5b /* [ */) {\n let isTableArray = toml.charCodeAt(++ctx.p) === 0x5b; /* [ */\n tmp = ctx.p += +isTableArray;\n skipping = false;\n let k = parseKey(ctx, 0x5d /* ] */);\n if (isTableArray) {\n if (toml.charCodeAt(ctx.p) !== 0x5d /* ] */) {\n TomlError.x('expected end of table array declaration', ctx);\n }\n ctx.p++;\n }\n let p = peekTable(ctx, k, res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n validateTablePeek(ctx, p, tmp);\n skipping = true;\n }\n else {\n m = p[2];\n tbl = p[1];\n }\n }\n else {\n tmp = ctx.p;\n let k = parseKey(ctx);\n let p = peekTable(ctx, k, tbl, m, 0 /* Type.DOTTED */);\n if (!p && !skipping)\n validateTablePeek(ctx, p, tmp);\n skipVoid(ctx, true, true);\n let v = extractValue(ctx, void 0);\n if (p && !skipping)\n p[1][p[0]] = v;\n }\n skipVoid(ctx, true);\n if (ctx.p < toml.length && (tmp = toml.charCodeAt(ctx.p)) !== 0xa /* \\n */ && (tmp !== 0xd /* \\r */ || toml.charCodeAt(ctx.p + 1) !== 0xa /* \\n */)) {\n TomlError.x('each key-value declaration must be followed by an end-of-line', ctx);\n }\n skipVoid(ctx);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nlet HAS_WELLFORMED = !!(''.isWellFormed);\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (typeof obj.getUTCDate === 'function' && obj instanceof Date)\n return 'date';\n if (globalThis.Temporal) {\n if (obj.until) {\n if (obj instanceof Temporal.ZonedDateTime)\n return 'temporal/tz+uc';\n if (obj instanceof Temporal.PlainDateTime || obj instanceof Temporal.PlainDate)\n return 'temporal/uc';\n if (obj instanceof Temporal.PlainTime || obj instanceof Temporal.Instant)\n return 'temporal';\n if (obj instanceof Temporal.PlainYearMonth)\n return 'temporal/x';\n }\n else if ((obj.toPlainDate && obj instanceof Temporal.PlainMonthDay) ||\n (obj.negated && obj instanceof Temporal.Duration)) {\n return 'temporal/x';\n }\n }\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatWellFormedStringUnchecked(s) {\n return JSON.stringify(s).replaceAll('\\x7f', '\\\\u007f');\n}\nfunction formatString(s) {\n return formatWellFormedStringUnchecked(HAS_WELLFORMED ? s.toWellFormed() : s);\n}\nfunction formatKey(s) {\n if (BARE_KEY.test(s))\n return s;\n if (HAS_WELLFORMED && !s.isWellFormed())\n throw new RangeError('key contains illegal lone surrogates');\n return formatWellFormedStringUnchecked(s);\n}\nfunction stringifyValue(val, type, depth, numberAsFloat, strictTemporal) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n switch (type) {\n // @ts-expect-error -- intentional fallthrough case\n case 'number':\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (Number.isInteger(val) && (numberAsFloat || !Number.isSafeInteger(val)))\n return val.toFixed(1);\n case 'bigint':\n case 'boolean':\n case 'temporal':\n return val.toString();\n case 'string':\n return formatString(val);\n case 'date':\n if (isNaN(val.getTime()))\n throw new TypeError('cannot serialize invalid date');\n return val.toISOString();\n case 'object':\n return stringifyInlineTable(val, depth, numberAsFloat, strictTemporal);\n case 'array':\n return stringifyArray(val, depth, numberAsFloat, strictTemporal);\n // @ts-expect-error -- intentional fallthrough case\n case 'temporal/tz+uc':\n if (strictTemporal) {\n let tz = val.timeZoneId;\n let tzc = tz.charCodeAt(0);\n if (\n // Classic offset\n tzc !== 0x2b /* + */ && tzc !== 0x2d /* - */ &&\n (\n // Fast pre-check pass; see below for the actually accepted values\n (tzc !== 0x55 /* U */ && tzc !== 0x47 /* G */ && tzc !== 0x5a /* Z */ && tzc !== 0x45 /* E */) ||\n (\n // UTC and its aliases; Temporal implementations don't all canonicalise unfortunately\n tz !== 'UTC' && tz !== 'UCT' && tz !== 'Universal' && tz !== 'Zulu' &&\n // GMT is a TZ but it's for all intents and purposes equivalent to UTC. Safe to downgrade.\n !tz.startsWith('GMT') && tz !== 'Greenwich' &&\n // Etc/* are all safe to downgrade to offset (either UTC, GMT, or offset)\n !tz.startsWith('Etc/')))) {\n throw new TypeError('Temporal objects with an IANA timezone are not allowed in Temporal strict mode');\n }\n }\n case 'temporal/uc':\n if (strictTemporal && val.calendarId !== 'iso8601')\n throw new TypeError('Temporal objects with a non-default calendar are not allowed in Temporal strict mode');\n return val.toString({\n calendarName: 'never',\n timeZoneName: 'never',\n });\n case 'temporal/x':\n throw new TypeError('Unsupported ' + val[Symbol.toStringTag]);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat, strictTemporal) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += formatKey(k) + ' = ' + stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat, strictTemporal);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat, strictTemporal) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat, strictTemporal);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat, strictTemporal) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat, strictTemporal);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat, strictTemporal) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = formatKey(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat, strictTemporal);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat, strictTemporal);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat, strictTemporal);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false, strictTemporal = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat, strictTemporal);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","import { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport {\n FileTooLargeError,\n NotARegularFileError,\n RefusedPathError,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"./files.js\";\nimport { sha256Hex } from \"./fingerprint.js\";\nimport { AGEMON_STATE_DIRECTORY, resolveStateDirectory } from \"./repo-paths.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst BACKUP_SEGMENTS = [\"backups\"];\nconst V1_BACKUP_SEGMENTS = [\"backups\", \"master-prompt\"];\nconst BACKUP_DIRECTORY = join(AGEMON_STATE_DIRECTORY, ...BACKUP_SEGMENTS);\nconst V1_BACKUP_DIRECTORY = join(AGEMON_STATE_DIRECTORY, ...V1_BACKUP_SEGMENTS);\nconst RESOURCE_ID_HASH_LENGTH = 12;\n\nexport interface WrittenBackup {\n path: string;\n checksum: string;\n}\n\nexport interface FoundBackup {\n path: string;\n contents: string;\n}\n\nfunction sanitizeForFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/gu, \"_\");\n}\n\nexport function resolveImmutableBackupPath(\n cwd: string,\n resourceId: string,\n): string {\n const resourceIdHash = sha256Hex(resourceId).slice(\n 0,\n RESOURCE_ID_HASH_LENGTH,\n );\n return join(\n cwd,\n BACKUP_DIRECTORY,\n `${sanitizeForFileName(resourceId)}-${resourceIdHash}.bak`,\n );\n}\n\nfunction resolveLegacyBackupPath(cwd: string, resourceId: string): string {\n return join(cwd, BACKUP_DIRECTORY, `${sanitizeForFileName(resourceId)}.bak`);\n}\n\nexport function resolveV1RuleFileBackupPath(\n cwd: string,\n target: string,\n): string {\n return join(cwd, V1_BACKUP_DIRECTORY, `${sanitizeForFileName(target)}.bak`);\n}\n\nfunction backupDirectorySegments(\n cwd: string,\n backupPath: string,\n): string[] | null {\n const directory = dirname(backupPath);\n if (directory === join(cwd, BACKUP_DIRECTORY)) {\n return BACKUP_SEGMENTS;\n }\n if (directory === join(cwd, V1_BACKUP_DIRECTORY)) {\n return V1_BACKUP_SEGMENTS;\n }\n return null;\n}\n\nasync function writeBackup(\n cwd: string,\n backupPath: string,\n contents: string,\n): Promise<WrittenBackup> {\n await resolveStateDirectory(cwd, BACKUP_SEGMENTS, { create: true });\n await writeFileAtomic(backupPath, contents);\n return { path: backupPath, checksum: sha256Hex(contents) };\n}\n\nexport async function writeImmutableBackup(\n cwd: string,\n resourceId: string,\n contents: string,\n): Promise<WrittenBackup> {\n const backupPath = resolveImmutableBackupPath(cwd, resourceId);\n const existingBackup = await readBackupFile(cwd, backupPath);\n if (existingBackup !== null) {\n return { path: backupPath, checksum: sha256Hex(existingBackup) };\n }\n return writeBackup(cwd, backupPath, contents);\n}\n\nexport class BackupPathOccupiedError extends Error {\n constructor(readonly backupPath: string) {\n super(`${backupPath} already holds a different file`);\n }\n}\n\nexport async function writeBackupOnce(\n cwd: string,\n resourceId: string,\n contents: string,\n): Promise<WrittenBackup> {\n const backupPath = resolveImmutableBackupPath(cwd, resourceId);\n let existingBackup: string | null;\n try {\n existingBackup = await readBackupFile(cwd, backupPath);\n } catch (error) {\n if (\n error instanceof NotARegularFileError ||\n error instanceof FileTooLargeError\n ) {\n throw new BackupPathOccupiedError(backupPath);\n }\n throw error;\n }\n if (existingBackup === null) {\n return writeBackup(cwd, backupPath, contents);\n }\n if (existingBackup !== contents) {\n throw new BackupPathOccupiedError(backupPath);\n }\n return { path: backupPath, checksum: sha256Hex(contents) };\n}\n\nexport async function replaceStaleBackup(\n cwd: string,\n resourceId: string,\n contents: string,\n): Promise<WrittenBackup> {\n const backupPath = resolveImmutableBackupPath(cwd, resourceId);\n if ((await readBackupFile(cwd, backupPath)) === contents) {\n return { path: backupPath, checksum: sha256Hex(contents) };\n }\n return writeBackup(cwd, backupPath, contents);\n}\n\nexport function immutableBackupCandidates(\n cwd: string,\n resourceId: string,\n recordedPath: string | null,\n): string[] {\n const ownBackupPaths = [\n resolveImmutableBackupPath(cwd, resourceId),\n resolveLegacyBackupPath(cwd, resourceId),\n ];\n const recordedOwnPath =\n recordedPath !== null && isAbsolute(recordedPath)\n ? ownBackupPaths.find((ownPath) => ownPath === resolve(recordedPath))\n : undefined;\n return recordedOwnPath === undefined\n ? ownBackupPaths\n : [\n recordedOwnPath,\n ...ownBackupPaths.filter((ownPath) => ownPath !== recordedOwnPath),\n ];\n}\n\nasync function readBackupFile(\n cwd: string,\n backupPath: string,\n): Promise<string | null> {\n const segments = backupDirectorySegments(cwd, backupPath);\n if (segments === null) {\n throw new RefusedPathError(\n `Refusing to use ${printable(backupPath)}: it is not in agemon's backup directory.`,\n );\n }\n const backupDirectory = await resolveStateDirectory(cwd, segments, {\n create: false,\n });\n return backupDirectory === null ? null : readRegularFileIfExists(backupPath);\n}\n\nexport async function readFirstExistingBackup(\n cwd: string,\n candidatePaths: string[],\n): Promise<FoundBackup | null> {\n for (const candidatePath of candidatePaths) {\n try {\n const contents = await readBackupFile(cwd, candidatePath);\n if (contents !== null) {\n return { path: candidatePath, contents };\n }\n } catch (error) {\n if (\n !(error instanceof NotARegularFileError) &&\n !(error instanceof FileTooLargeError)\n ) {\n throw error;\n }\n }\n }\n return null;\n}\n","import { lstat, rm, unlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { isPlainSkillName } from \"../../core/config.js\";\nimport { RefusedPathError } from \"../../core/files.js\";\nimport {\n ensureRepoDirectory,\n resolveRepoDirectory,\n} from \"../../core/repo-paths.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\n\nexport const CANONICAL_SKILLS_DIRECTORY = \".agents/skills\";\nexport const CLAUDE_SKILLS_DIRECTORY = \".claude/skills\";\nexport const SKILLS_LOCK_FILE = \"skills-lock.json\";\n\nasync function lstatIfPresent(\n path: string,\n): Promise<Awaited<ReturnType<typeof lstat>> | null> {\n try {\n return await lstat(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nfunction refuse(relativePath: string, reason: string): never {\n throw new RefusedPathError(\n `Refusing to run the skills CLI: ${printable(relativePath)} ${reason}. agemon only lets it write inside the repository — replace it with a real directory or file.`,\n );\n}\n\nfunction assertPlainSkillName(skillName: string): void {\n if (!isPlainSkillName(skillName)) {\n throw new RefusedPathError(\n `Refusing to run the skills CLI: the skill name '${printable(skillName)}' is not a plain skill name. The ledger in .agemon/state.json may have been edited; check it before running agemon again.`,\n );\n }\n}\n\nexport async function prepareSkillsCliTargets(\n repoRoot: string,\n skillNames: string[],\n): Promise<string[]> {\n skillNames.forEach(assertPlainSkillName);\n const canonicalDirectory = await resolveRepoDirectory(\n repoRoot,\n CANONICAL_SKILLS_DIRECTORY,\n { create: false },\n );\n if (canonicalDirectory !== null) {\n for (const skillName of skillNames) {\n const stats = await lstatIfPresent(join(canonicalDirectory, skillName));\n if (stats?.isSymbolicLink()) {\n refuse(`${CANONICAL_SKILLS_DIRECTORY}/${skillName}`, \"is a symlink\");\n }\n }\n }\n\n const lockStats = await lstatIfPresent(join(repoRoot, SKILLS_LOCK_FILE));\n if (lockStats !== null && !lockStats.isFile()) {\n refuse(SKILLS_LOCK_FILE, \"is a symlink or not a regular file\");\n }\n return ensureRepoDirectory(repoRoot, CLAUDE_SKILLS_DIRECTORY);\n}\n\nexport async function removeInstalledSkillCopy(\n repoRoot: string,\n skillName: string,\n): Promise<void> {\n assertPlainSkillName(skillName);\n const skillsDirectory = await resolveRepoDirectory(\n repoRoot,\n CLAUDE_SKILLS_DIRECTORY,\n );\n if (skillsDirectory === null) {\n return;\n }\n const copyPath = join(skillsDirectory, skillName);\n const stats = await lstatIfPresent(copyPath);\n if (stats?.isSymbolicLink()) {\n await unlink(copyPath);\n } else if (stats !== null) {\n await rm(copyPath, { recursive: true, force: true });\n }\n}\n","import { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { lstat, realpath } from \"node:fs/promises\";\nimport { basename, dirname, join, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveGlobalNpmRoot } from \"./npm-global.js\";\nimport { runSubprocess } from \"./subprocess-runner.js\";\nimport type { RunSubprocess } from \"./subprocess-trace.js\";\n\nconst PACKAGE_NAME = \"agemon\";\nconst PACKAGE_JSON_SEARCH_DEPTH = 5;\nexport const INSTALL_MARKER_FILE_NAME = \".agemon-install\";\nconst SOURCE_CHECKOUT_ENTRIES = [\".git\", \"src\"];\nconst NPX_CACHE_SEGMENT = \"_npx\";\n\nexport type InstallMethod =\n | { kind: \"install-script\"; installDir: string }\n | { kind: \"npm-global\"; packageRoot: string; prefix: string }\n | { kind: \"npx\" }\n | { kind: \"dev\" }\n | { kind: \"unknown\"; packageRoot: string };\n\nfunction readPackageName(directory: string): string | undefined {\n try {\n const manifest: unknown = JSON.parse(\n readFileSync(join(directory, \"package.json\"), \"utf8\"),\n );\n return (manifest as { name?: string }).name;\n } catch {\n return undefined;\n }\n}\n\nexport function resolvePackageRoot(\n fromDirectory = dirname(fileURLToPath(import.meta.url)),\n): string {\n let directory = fromDirectory;\n for (let depth = 0; depth < PACKAGE_JSON_SEARCH_DEPTH; depth += 1) {\n if (readPackageName(directory) === PACKAGE_NAME) {\n return realpathSync(directory);\n }\n directory = dirname(directory);\n }\n throw new Error(\"Unable to locate agemon's package.json.\");\n}\n\nexport function readPackageVersion(packageRoot = resolvePackageRoot()): string {\n const manifest = JSON.parse(\n readFileSync(join(packageRoot, \"package.json\"), \"utf8\"),\n ) as { version: string };\n return manifest.version;\n}\n\nexport function isSourceCheckout(packageRoot: string): boolean {\n return SOURCE_CHECKOUT_ENTRIES.some((entry) =>\n existsSync(join(packageRoot, entry)),\n );\n}\n\nasync function hasRegularInstallMarker(packageRoot: string): Promise<boolean> {\n try {\n return (await lstat(join(packageRoot, INSTALL_MARKER_FILE_NAME))).isFile();\n } catch {\n return false;\n }\n}\n\nfunction isInsideNodeModules(packageRoot: string): boolean {\n return basename(dirname(packageRoot)) === \"node_modules\";\n}\n\nasync function resolveGlobalNpmPrefix(\n packageRoot: string,\n run: RunSubprocess,\n): Promise<string | undefined> {\n try {\n const globalRoot = await realpath(await resolveGlobalNpmRoot(run));\n const globalRootHoldsThisCopy = globalRoot === dirname(packageRoot);\n const globalRootIsPrefixLib = basename(dirname(globalRoot)) === \"lib\";\n return globalRootHoldsThisCopy && globalRootIsPrefixLib\n ? dirname(dirname(globalRoot))\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function resolveInstallMethod(\n options: { packageRoot?: string; run?: RunSubprocess } = {},\n): Promise<InstallMethod> {\n const packageRoot = options.packageRoot ?? resolvePackageRoot();\n if (isSourceCheckout(packageRoot)) {\n return { kind: \"dev\" };\n }\n if (await hasRegularInstallMarker(packageRoot)) {\n return { kind: \"install-script\", installDir: packageRoot };\n }\n if (packageRoot.split(sep).includes(NPX_CACHE_SEGMENT)) {\n return { kind: \"npx\" };\n }\n if (isInsideNodeModules(packageRoot)) {\n const prefix = await resolveGlobalNpmPrefix(\n packageRoot,\n options.run ?? runSubprocess,\n );\n if (prefix !== undefined) {\n return { kind: \"npm-global\", packageRoot, prefix };\n }\n }\n return { kind: \"unknown\", packageRoot };\n}\n","import { lstat, stat } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { describeSubprocessFailure } from \"./subprocess-runner.js\";\nimport type { RunSubprocess } from \"./subprocess-trace.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nconst NPM_ROOT_TIMEOUT_MS = 20_000;\n\nasync function isDirectory(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function pathIsMissing(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return false;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n }\n}\n\nexport async function resolveGlobalNpmRoot(\n run: RunSubprocess,\n options: { cwd?: string; mayNotExistYet?: boolean } = {},\n): Promise<string> {\n const npmRootResult = await run(\"npm\", [\"root\", \"--global\"], {\n timeoutMs: NPM_ROOT_TIMEOUT_MS,\n cwd: options.cwd,\n });\n if (npmRootResult.code !== 0) {\n throw new Error(\n `npm root --global failed: ${describeSubprocessFailure(npmRootResult, \"npm\")}`,\n );\n }\n const npmRoot = npmRootResult.stdout.trim();\n if (!isAbsolute(npmRoot)) {\n throw new Error(\n `npm root --global returned ${printable(npmRoot)}, which is not an absolute path.`,\n );\n }\n if (resolve(npmRoot) !== npmRoot || !isSafeIdentifier(npmRoot)) {\n throw new Error(\n `npm root --global returned ${printable(npmRoot)}, which is not a single normalised path.`,\n );\n }\n if (options.mayNotExistYet && (await pathIsMissing(npmRoot))) {\n return npmRoot;\n }\n if (!(await isDirectory(npmRoot))) {\n throw new Error(\n `npm root --global returned ${printable(npmRoot)}, which is not a directory. npm masks UUID-like path segments as ***; use an npm prefix without one.`,\n );\n }\n return npmRoot;\n}\n","import { isSourceCheckout, resolvePackageRoot } from \"./install-method.js\";\n\nconst FAKE_BACKEND_ENV_VARS = [\n \"AGEMON_FAKE_SUBPROCESS\",\n \"AGEMON_FAKE_SERVICES\",\n] as const;\n\nexport function isDevMode(packageRoot?: string): boolean {\n return (\n process.env.AGEMON_DEV === \"1\" &&\n isSourceCheckout(packageRoot ?? resolvePackageRoot())\n );\n}\n\nexport function assertFakeBackendsAreDevOnly(packageRoot?: string): void {\n const activeFakeVars = FAKE_BACKEND_ENV_VARS.filter(\n (name) => process.env[name] === \"1\",\n );\n if (activeFakeVars.length > 0 && !isDevMode(packageRoot)) {\n throw new Error(\n `${activeFakeVars.join(\", \")} must never be set outside the sandbox harness — refusing to start.`,\n );\n }\n}\n","import { fingerprintSkillTree } from \"../plugins/skills/skill-tree.js\";\nimport { isDevMode } from \"./dev-mode.js\";\n\nexport const FAKE_PINNED_SKILL_MANIFEST_FILE = \"SKILL.md\";\n\nexport function fakePinnedSkillManifest(skillName: string): string {\n return `---\\nname: ${skillName}\\ndescription: Stand-in for the pinned ${skillName} skill, written by agemon's fake git backend.\\n---\\n\\nFake ${skillName}.\\n`;\n}\n\nexport function fakePinnedSkillFingerprint(skillName: string): string {\n return fingerprintSkillTree([\n {\n relativePath: FAKE_PINNED_SKILL_MANIFEST_FILE,\n contents: Buffer.from(fakePinnedSkillManifest(skillName)),\n },\n ]);\n}\n\nexport function fakeSubprocessesActive(): boolean {\n return process.env.AGEMON_FAKE_SUBPROCESS === \"1\" && isDevMode();\n}\n"],"mappings":"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","names":["constants","lstat","open","lstat","open","constants","realpath","isAbsolute","isAbsolute","realpath","createHash","constants","mkdir","open","readFile","realpath","homedir","userInfo","dirname","isAbsolute","join","randomUUID","lstat","open","rm","stat","resolve","lstat","open","rm","randomUUID","PERMISSION_BITS","userInfo","isAbsolute","homedir","join","readFile","constants","open","mkdir","realpath","dirname","mkdir","rm","join","isAbsolute","isAbsolute","resolve","join","rm","mkdir","join","existsSync","dirname","join","join","constants","lstat","open","join","open","constants","join","lstat","existsSync","readFile","rename","rm","join","join","rename","existsSync","rm","readFile","join","relative","t","dirname","isAbsolute","join","resolve","join","dirname","isAbsolute","resolve","join","relative","lstat","rm","join","lstat","join","rm","existsSync","readFileSync","lstat","realpath","dirname","join","sep","fileURLToPath","lstat","stat","isAbsolute","resolve","stat","lstat","isAbsolute","resolve","PACKAGE_NAME","readPackageName","readFileSync","join","resolvePackageRoot","dirname","fileURLToPath","existsSync","lstat","realpath","sep","resolvePackageRoot"]}
|