agents-inc 0.170.0 → 0.170.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/{chunk-BMRUNMPV.js → chunk-2YA4DDRM.js} +35 -35
  3. package/dist/chunk-2YA4DDRM.js.map +1 -0
  4. package/dist/{chunk-44TE3RKH.js → chunk-3ED3KHHD.js} +5 -4
  5. package/dist/chunk-3ED3KHHD.js.map +1 -0
  6. package/dist/{chunk-3G7X2WKI.js → chunk-5BNX73OU.js} +18 -38
  7. package/dist/chunk-5BNX73OU.js.map +1 -0
  8. package/dist/{chunk-7RDMTR64.js → chunk-66AEVERM.js} +785 -256
  9. package/dist/chunk-66AEVERM.js.map +1 -0
  10. package/dist/{chunk-PJWGTNOX.js → chunk-7C3PFRBU.js} +144 -186
  11. package/dist/chunk-7C3PFRBU.js.map +1 -0
  12. package/dist/{chunk-52HDHJ7I.js → chunk-AUNRHWH4.js} +32 -21
  13. package/dist/chunk-AUNRHWH4.js.map +1 -0
  14. package/dist/{chunk-KOLDW6SF.js → chunk-BBDGYJHX.js} +2 -2
  15. package/dist/chunk-BBDGYJHX.js.map +1 -0
  16. package/dist/{chunk-SZYQISA2.js → chunk-ELV5WDS3.js} +43 -29
  17. package/dist/chunk-ELV5WDS3.js.map +1 -0
  18. package/dist/{chunk-MQ6CGZNJ.js → chunk-GAKVZNTX.js} +1879 -2019
  19. package/dist/chunk-GAKVZNTX.js.map +1 -0
  20. package/dist/chunk-GEMW5RQ2.js +1169 -0
  21. package/dist/chunk-GEMW5RQ2.js.map +1 -0
  22. package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
  23. package/dist/chunk-GHHJYNAN.js.map +1 -0
  24. package/dist/{chunk-WTWMGH2C.js → chunk-HACRR422.js} +2 -2
  25. package/dist/chunk-HACRR422.js.map +1 -0
  26. package/dist/{chunk-F2BHT5C4.js → chunk-IWY5IR4F.js} +129 -151
  27. package/dist/chunk-IWY5IR4F.js.map +1 -0
  28. package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
  29. package/dist/chunk-KIK5EZYD.js.map +1 -0
  30. package/dist/{chunk-USVBYQSQ.js → chunk-O4LN3HFI.js} +16 -6
  31. package/dist/chunk-O4LN3HFI.js.map +1 -0
  32. package/dist/{chunk-RIPSGNLU.js → chunk-OCAVW6N5.js} +3 -3
  33. package/dist/chunk-OCAVW6N5.js.map +1 -0
  34. package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
  35. package/dist/chunk-P6CYS4JK.js.map +1 -0
  36. package/dist/chunk-PLFANHRZ.js +35 -0
  37. package/dist/chunk-PLFANHRZ.js.map +1 -0
  38. package/dist/{chunk-6ZRH5RHC.js → chunk-PMUZR4XO.js} +4 -4
  39. package/dist/chunk-PMUZR4XO.js.map +1 -0
  40. package/dist/{chunk-F5EBEATU.js → chunk-PSUTNOQ2.js} +34 -46
  41. package/dist/chunk-PSUTNOQ2.js.map +1 -0
  42. package/dist/chunk-RIK45Q4I.js +103 -0
  43. package/dist/chunk-RIK45Q4I.js.map +1 -0
  44. package/dist/{chunk-HED2DAXZ.js → chunk-THO7LO5B.js} +5 -5
  45. package/dist/chunk-THO7LO5B.js.map +1 -0
  46. package/dist/{chunk-OYJQUA3D.js → chunk-YGDWHDOY.js} +31 -13
  47. package/dist/chunk-YGDWHDOY.js.map +1 -0
  48. package/dist/{chunk-NCWDK6L7.js → chunk-YXKTY5WM.js} +254 -379
  49. package/dist/chunk-YXKTY5WM.js.map +1 -0
  50. package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
  51. package/dist/chunk-ZEGM3MVR.js.map +1 -0
  52. package/dist/commands/build/marketplace.js +46 -46
  53. package/dist/commands/build/marketplace.js.map +1 -1
  54. package/dist/commands/build/plugins.js +25 -28
  55. package/dist/commands/build/plugins.js.map +1 -1
  56. package/dist/commands/compile.js +87 -178
  57. package/dist/commands/compile.js.map +1 -1
  58. package/dist/commands/doctor.js +510 -360
  59. package/dist/commands/doctor.js.map +1 -1
  60. package/dist/commands/edit.js +451 -357
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +144 -125
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/init.js +20 -27
  65. package/dist/commands/list.js +39 -55
  66. package/dist/commands/list.js.map +1 -1
  67. package/dist/commands/new/marketplace.js +6 -11
  68. package/dist/commands/new/marketplace.js.map +1 -1
  69. package/dist/commands/search.js +35 -32
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/commands/share.js +17 -77
  72. package/dist/commands/share.js.map +1 -1
  73. package/dist/commands/uninstall.js +159 -222
  74. package/dist/commands/uninstall.js.map +1 -1
  75. package/dist/commands/update.js +9 -32
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/components/common/prompt-confirm.js +2 -2
  78. package/dist/components/common/removal-plan-confirm.js +2 -2
  79. package/dist/components/common/scroll-affordance.js +2 -2
  80. package/dist/components/common/select-list.js +2 -2
  81. package/dist/components/common/skill-agent-summary.js +4 -4
  82. package/dist/components/common/spinner.js +2 -4
  83. package/dist/components/common/summary-panel.js +5 -5
  84. package/dist/components/common/summary-panel.js.map +1 -1
  85. package/dist/config-exports.js +7 -3
  86. package/dist/config-exports.js.map +1 -1
  87. package/dist/hooks/init.js +18 -19
  88. package/dist/hooks/init.js.map +1 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/load-agent-defs-6QUUMGHK.js +14 -0
  91. package/dist/recompile-project-agents-I33KQJFB.js +65 -0
  92. package/dist/recompile-project-agents-I33KQJFB.js.map +1 -0
  93. package/dist/{source-loader-C5SQXZXI.js → source-loader-TTJVW2ER.js} +5 -5
  94. package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
  95. package/dist/src/agents/developer/api-developer/playbook.md +2 -5
  96. package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
  97. package/dist/src/agents/developer/web-developer/playbook.md +2 -5
  98. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  99. package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
  100. package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  101. package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  102. package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  103. package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
  104. package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
  105. package/dist/src/agents/tester/api-tester/playbook.md +2 -0
  106. package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  107. package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
  108. package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
  109. package/dist/src/agents/tester/web-tester/playbook.md +2 -0
  110. package/package.json +9 -8
  111. package/src/agents/developer/ai-developer/playbook.md +2 -5
  112. package/src/agents/developer/api-developer/playbook.md +2 -5
  113. package/src/agents/developer/cli-developer/playbook.md +2 -5
  114. package/src/agents/developer/web-developer/playbook.md +2 -5
  115. package/src/agents/meta/agent-summoner/output.md +2 -2
  116. package/src/agents/meta/agent-summoner/playbook.md +1 -13
  117. package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  118. package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  119. package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  120. package/src/agents/tester/ai-tester/playbook.md +2 -0
  121. package/src/agents/tester/api-tester/critical-requirements.md +1 -2
  122. package/src/agents/tester/api-tester/playbook.md +2 -0
  123. package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  124. package/src/agents/tester/cli-tester/playbook.md +2 -0
  125. package/src/agents/tester/web-tester/critical-requirements.md +1 -2
  126. package/src/agents/tester/web-tester/playbook.md +2 -0
  127. package/src/schemas/project-config.schema.json +0 -3
  128. package/src/schemas/project-source-config.schema.json +0 -6
  129. package/dist/chunk-3G7X2WKI.js.map +0 -1
  130. package/dist/chunk-44TE3RKH.js.map +0 -1
  131. package/dist/chunk-4AAOOAIN.js.map +0 -1
  132. package/dist/chunk-52HDHJ7I.js.map +0 -1
  133. package/dist/chunk-6HNXYYVF.js +0 -373
  134. package/dist/chunk-6HNXYYVF.js.map +0 -1
  135. package/dist/chunk-6ZRH5RHC.js.map +0 -1
  136. package/dist/chunk-7RDMTR64.js.map +0 -1
  137. package/dist/chunk-BMRUNMPV.js.map +0 -1
  138. package/dist/chunk-CLPUWOSA.js +0 -46
  139. package/dist/chunk-CLPUWOSA.js.map +0 -1
  140. package/dist/chunk-F2BHT5C4.js.map +0 -1
  141. package/dist/chunk-F5EBEATU.js.map +0 -1
  142. package/dist/chunk-HED2DAXZ.js.map +0 -1
  143. package/dist/chunk-JFLVEFFP.js.map +0 -1
  144. package/dist/chunk-KOLDW6SF.js.map +0 -1
  145. package/dist/chunk-MQ6CGZNJ.js.map +0 -1
  146. package/dist/chunk-NCWDK6L7.js.map +0 -1
  147. package/dist/chunk-NEZ4OAOL.js.map +0 -1
  148. package/dist/chunk-NIHUOWE4.js +0 -106
  149. package/dist/chunk-NIHUOWE4.js.map +0 -1
  150. package/dist/chunk-NQW25DCF.js.map +0 -1
  151. package/dist/chunk-OYJQUA3D.js.map +0 -1
  152. package/dist/chunk-PJWGTNOX.js.map +0 -1
  153. package/dist/chunk-RIPSGNLU.js.map +0 -1
  154. package/dist/chunk-SZYQISA2.js.map +0 -1
  155. package/dist/chunk-USVBYQSQ.js.map +0 -1
  156. package/dist/chunk-V3KTSP3Q.js +0 -940
  157. package/dist/chunk-V3KTSP3Q.js.map +0 -1
  158. package/dist/chunk-WTWMGH2C.js.map +0 -1
  159. package/dist/load-agent-defs-YMDWBFDP.js +0 -14
  160. package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
  161. package/dist/source-loader-C5SQXZXI.js.map +0 -1
  162. /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-6QUUMGHK.js.map} +0 -0
  163. /package/dist/{recompile-project-agents-SZ76WNTW.js.map → source-loader-TTJVW2ER.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/utils/terminal.ts","../src/cli/lib/exit-codes.ts","../src/cli/lib/seed/external-skills.ts","../../compile/src/carried-skill.ts","../src/cli/lib/seed/seed-apply.ts","../src/cli/base-command.ts","../src/cli/lib/operations/source/ensure-marketplace.ts","../src/cli/lib/operations/source/require-marketplace.ts","../src/cli/lib/operations/skills/install-plugin-skills.ts"],"sourcesContent":["import { MIN_TERMINAL_SIZE } from \"../consts.js\";\n\n/** Clears screen and scrollback. */\nexport function clearTerminalScreen(): void {\n process.stdout.write(\"\\x1b[H\\x1b[2J\\x1b[3J\");\n}\n\nexport function isTerminalLargeEnough(columns: number, rows: number): boolean {\n return columns >= MIN_TERMINAL_SIZE.COLS && rows >= MIN_TERMINAL_SIZE.ROWS;\n}\n\n/**\n * E2E `STEP_TEXT.TOO_NARROW` / `TOO_SHORT` key off this text. Precondition: the terminal is too\n * small; width is reported first, so not-too-narrow means too-short.\n */\nexport function formatTerminalTooSmallMessage(columns: number): string {\n const issue =\n columns < MIN_TERMINAL_SIZE.COLS\n ? `too narrow (need ${MIN_TERMINAL_SIZE.COLS})`\n : `too short (need ${MIN_TERMINAL_SIZE.ROWS})`;\n return `Terminal ${issue}. Please resize.`;\n}\n","export const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n INVALID_ARGS: 2,\n NETWORK_ERROR: 3,\n CANCELLED: 4,\n /**\n * Ran to the end but part of the work failed. Unlike ERROR the work landed, so repeating the run\n * is wrong; the output names the remedy. Raised at the end of a command, never mid-flight.\n */\n COMPLETED_WITH_FAILURES: 5,\n} as const;\n","import os from \"os\";\nimport path from \"path\";\nimport { mkdtemp } from \"fs/promises\";\n\nimport { externalIdsNamingNoDirectory, seedExternalSkillSchema } from \"@workspace/matrix/seed\";\nimport { carriedSkillAuthor, installedSkillTree } from \"@workspace/compile/carried-skill\";\n\nimport { GITHUB_SOURCE, LOCAL_SKILLS_PATH, STANDARD_FILES } from \"../../consts.js\";\nimport { resolveInstallPaths } from \"../installation/install-base-dir.js\";\nimport { parseFrontmatter, readSkillMetadata } from \"../loading/loader.js\";\nimport { getCategoryDomain } from \"../matrix/matrix-provider.js\";\nimport { claimSlug } from \"../matrix/skill-resolution.js\";\nimport { validateSkillPath } from \"../skills/skill-copier.js\";\nimport { readForkedFromMetadata } from \"../skills/skill-metadata.js\";\nimport { defaultUsageGuidance } from \"../stacks/stacks-loader.js\";\nimport { BUILT_IN_MATRIX } from \"../../types/generated/matrix.js\";\nimport { getCurrentDate } from \"../versioning.js\";\nimport {\n copy,\n directoryExists,\n fileExists,\n glob,\n readFile,\n remove,\n writeFile,\n} from \"../../utils/fs.js\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object.js\";\n\nimport type { SkillScope } from \"../../types/config.js\";\nimport type { Domain, MergedSkillsMatrix, ResolvedSkill } from \"../../types/matrix.js\";\nimport type { CategoryPath, SkillId, SkillSlug } from \"../../types/skills.js\";\nimport type { ForkedFromMetadata } from \"../skills/skill-metadata.js\";\nimport type {\n SeedExternalSkill,\n SeedPayload,\n SeedSkill,\n SeedSkillTree,\n} from \"@workspace/matrix/seed\";\n\n/** One skill the payload carries rather than names, seated and ready to be written. */\nexport type ExternalSkillInstall = {\n id: SkillId;\n scope: SkillScope;\n skill: SeedExternalSkill;\n domain: Domain;\n skillDir: string;\n};\n\ntype SelectedExternal = { id: SkillId; skill: SeedExternalSkill; entry: SeedSkill };\n\n/** No marketplace serves a carried skill, and coercing it to eject would defy the payload. */\nfunction pluginInstallError(ids: SkillId[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it, so no marketplace \" +\n \"serves them and they cannot be installed as plugins:\",\n ...ids.map((id) => ` ${id}`),\n \"Re-share it with each skill above set to eject, which is the only way a carried skill installs.\",\n ].join(\"\\n\");\n}\n\n/** Presence in `skills` is selection; `external` content nobody picked installs nothing. */\nfunction selectedExternals(payload: SeedPayload): SelectedExternal[] {\n return typedEntries<SkillId, SeedExternalSkill>(payload.external ?? {}).flatMap(([id, skill]) => {\n const entry = payload.skills[id];\n return entry ? [{ id, skill, entry }] : [];\n });\n}\n\nfunction askedForAsPlugin(externals: SelectedExternal[]): SkillId[] {\n return externals.filter(({ entry }) => entry.install !== \"eject\").map(({ id }) => id);\n}\n\n/**\n * A carried skill on a catalogue id would overwrite that catalogue's copy. Checks the loaded matrix\n * and the shipped catalogue, since the payload chooses which marketplace gets loaded.\n */\nfunction claimingACatalogueId(\n externals: SelectedExternal[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n return externals.filter(({ id }) => heldByEitherCatalogue(id, matrix)).map(({ id }) => id);\n}\n\nconst CATALOGUE_SKILL_IDS: ReadonlySet<SkillId> = new Set(typedKeys(BUILT_IN_MATRIX.skills));\n\nfunction heldByEitherCatalogue(id: SkillId, matrix: MergedSkillsMatrix): boolean {\n return heldByLoadedCatalogue(matrix.skills[id]) || CATALOGUE_SKILL_IDS.has(id);\n}\n\n/**\n * A `local` incumbent is exempt so a re-apply works; whether its directory may be overwritten is\n * settled on disk by {@link refuseUncarriedDestinations}.\n */\nfunction heldByLoadedCatalogue(incumbent: ResolvedSkill | undefined): boolean {\n return incumbent !== undefined && incumbent.local !== true;\n}\n\nfunction catalogueIdCollisionError(ids: SkillId[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids a \" +\n \"catalogue already owns:\",\n ...ids.map((id) => ` ${id}`),\n \"A skill id is the directory the skill installs into, so each would be written over the \" +\n \"catalogue's own copy of that skill. Re-share it with each skill above added again, which \" +\n \"mints an id — 'external-<category>-<name>' — that no catalogue owns.\",\n ].join(\"\\n\");\n}\n\n/** Boundary cast: a carried skill's id is in no generated union, and is its own slug. */\nfunction externalSlug(id: SkillId): SkillSlug {\n return id as SkillSlug;\n}\n\nfunction externalSkillDir(id: SkillId, scope: SkillScope, projectDir: string): string {\n return path.join(resolveInstallPaths(projectDir, scope).skillsDir, id);\n}\n\nfunction externalCatalogueEntry(install: ExternalSkillInstall): ResolvedSkill {\n return {\n id: install.id,\n slug: externalSlug(install.id),\n displayName: install.skill.displayName,\n description: install.skill.description,\n // Boundary cast: seatExternalSkill has confirmed this catalogue declares the category.\n category: install.skill.categoryId as CategoryPath,\n author: carriedSkillAuthor(install.skill.repo),\n path: `${LOCAL_SKILLS_PATH}/${install.id}/`,\n conflictsWith: [],\n requires: [],\n alternatives: [],\n discourages: [],\n local: true,\n custom: true,\n localPath: install.skillDir,\n };\n}\n\n/** An unknown category leaves the skill unseated, so the decode skips and reports it. */\nfunction seatExternalSkill(\n { id, skill, entry }: SelectedExternal,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): ExternalSkillInstall[] {\n const domain = getCategoryDomain(skill.categoryId);\n if (domain === undefined) return [];\n\n const install: ExternalSkillInstall = {\n id,\n skill,\n domain,\n scope: entry.scope,\n skillDir: externalSkillDir(id, entry.scope, projectDir),\n };\n\n matrix.skills[id] = externalCatalogueEntry(install);\n claimSlug(matrix.slugMap, externalSlug(id), id);\n\n return [install];\n}\n\n/** Quoted, so an empty id prints as something and an escape is spelled out rather than sent. */\nfunction notADirectoryNameError(ids: string[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids that are \" +\n \"not a single directory name:\",\n ...ids.map((id) => ` ${JSON.stringify(id)}`),\n \"A skill id is the directory the skill is written into, so an id holding a path separator, \" +\n \"or naming '.' or '..', would be written somewhere other than a directory of its own, \" +\n \"and one holding a control character would hand it to the terminal wherever that \" +\n \"directory is named. Re-share it with each skill above added again, which mints an id — \" +\n \"'external-<category>-<name>' — that names one directory.\",\n ].join(\"\\n\");\n}\n\n/**\n * Writes carried skills into `matrix` in place so the decode can resolve them. Every refusal runs\n * before anything is seated, so a refused run leaves the matrix untouched. The id is checked first:\n * every path a carried skill is written to, scratch copies included, is joined from it.\n */\nexport function registerExternalSkills(\n payload: SeedPayload,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): ExternalSkillInstall[] {\n const notDirectoryNames = externalIdsNamingNoDirectory(payload);\n if (notDirectoryNames.length > 0) throw new Error(notADirectoryNameError(notDirectoryNames));\n\n const externals = selectedExternals(payload);\n const asPlugin = askedForAsPlugin(externals);\n const colliding = claimingACatalogueId(externals, matrix);\n\n if (asPlugin.length > 0) throw new Error(pluginInstallError(asPlugin));\n if (colliding.length > 0) throw new Error(catalogueIdCollisionError(colliding));\n\n return externals.flatMap((external) => seatExternalSkill(external, matrix, projectDir));\n}\n\n/**\n * Answers the ids whose directories changed. Refuses destinations again, since a directory may have\n * appeared while the user read the prompt.\n */\nexport async function writeExternalSkills(installs: ExternalSkillInstall[]): Promise<SkillId[]> {\n await refuseUncarriedDestinations(installs);\n\n const written = await Promise.all(installs.map(writeExternalSkill));\n return changedIds(written);\n}\n\nconst SCRATCH_DIR_PREFIX = \"agents-inc-carried-\";\n\n/** What {@link writeExternalSkills} would change, by running the write against scratch copies. */\nexport async function carriedSkillsThatDiffer(\n installs: ExternalSkillInstall[],\n): Promise<SkillId[]> {\n if (installs.length === 0) return [];\n\n const scratch = await mkdtemp(path.join(os.tmpdir(), SCRATCH_DIR_PREFIX));\n try {\n const written = await Promise.all(\n installs.map(async (install) => writeExternalSkill(await scratchCopyOf(install, scratch))),\n );\n return changedIds(written);\n } finally {\n await remove(scratch);\n }\n}\n\nasync function scratchCopyOf(\n install: ExternalSkillInstall,\n scratch: string,\n): Promise<ExternalSkillInstall> {\n const skillDir = path.join(scratch, install.id);\n if (await directoryExists(install.skillDir)) await copy(install.skillDir, skillDir);\n return { ...install, skillDir };\n}\n\ntype WrittenSkill = { id: SkillId; changed: boolean };\n\nfunction changedIds(written: WrittenSkill[]): SkillId[] {\n return written.filter(({ changed }) => changed).map(({ id }) => id);\n}\n\n/** Writes only the files whose bytes differ, so an unchanged skill keeps its mtimes. */\nasync function writeExternalSkill(install: ExternalSkillInstall): Promise<WrittenSkill> {\n const files = typedEntries<string, string>(await treeToWrite(install));\n refuseEscapingPaths(install.skillDir, files);\n\n const written = await Promise.all(\n files.map(([relativePath, contents]) =>\n writeIfChanged(path.join(install.skillDir, relativePath), contents),\n ),\n );\n return { id: install.id, changed: written.some(Boolean) };\n}\n\n/** The keys came off the wire, so every path is refused before any file is written. */\nfunction refuseEscapingPaths(skillDir: string, files: [string, string][]): void {\n for (const [relativePath] of files) {\n validateSkillPath(path.join(skillDir, relativePath), skillDir, relativePath);\n }\n}\n\n/** The bytes the editor previews, dated today unless nothing in them would change. */\nasync function treeToWrite(install: ExternalSkillInstall): Promise<SeedSkillTree> {\n const shipped = await withShippedMetadata(install);\n const unchanged = await treeAsInstalled(install, shipped);\n return unchanged ?? carriedTree(install, shipped, getCurrentDate());\n}\n\n/**\n * The tree dated as the stamp on disk is, where that makes its metadata the bytes already there:\n * a fresh date would otherwise make an unchanged skill look rewritten.\n */\nasync function treeAsInstalled(\n install: ExternalSkillInstall,\n shipped: SeedExternalSkill,\n): Promise<SeedSkillTree | null> {\n const recorded = (await readForkedFromMetadata(install.skillDir))?.date;\n if (recorded === undefined) return null;\n\n const tree = await carriedTree(install, shipped, recorded);\n const onDisk = await bytesOnDisk(path.join(install.skillDir, STANDARD_FILES.METADATA_YAML));\n return tree[STANDARD_FILES.METADATA_YAML] === onDisk ? tree : null;\n}\n\nfunction carriedTree(\n install: ExternalSkillInstall,\n skill: SeedExternalSkill,\n date: string,\n): Promise<SeedSkillTree> {\n return installedSkillTree({\n id: install.id,\n skill,\n domain: install.domain,\n usageGuidance: defaultUsageGuidance(install.skill.categoryId),\n date,\n });\n}\n\n/** Where the payload carries no metadata, the copy on disk stands for what was shipped. */\nasync function withShippedMetadata(install: ExternalSkillInstall): Promise<SeedExternalSkill> {\n if (Object.hasOwn(install.skill.files, STANDARD_FILES.METADATA_YAML)) return install.skill;\n\n const onDisk = await bytesOnDisk(path.join(install.skillDir, STANDARD_FILES.METADATA_YAML));\n if (onDisk === null) return install.skill;\n\n return {\n ...install.skill,\n files: { ...install.skill.files, [STANDARD_FILES.METADATA_YAML]: onDisk },\n };\n}\n\nasync function bytesOnDisk(filePath: string): Promise<string | null> {\n return (await fileExists(filePath)) ? readFile(filePath) : null;\n}\n\nasync function writeIfChanged(filePath: string, contents: string): Promise<boolean> {\n if ((await bytesOnDisk(filePath)) === contents) return false;\n await writeFile(filePath, contents);\n return true;\n}\n\ntype BlockedDestination = { id: SkillId; skillDir: string };\n\n/**\n * Refuses when a destination holds content no shared configuration carried. Only a carried skill's\n * install writes `forkedFrom.path`, so its presence marks a carried directory.\n */\nexport async function refuseUncarriedDestinations(installs: ExternalSkillInstall[]): Promise<void> {\n const judged = await Promise.all(installs.map(judgeDestination));\n const blocked = judged.filter((destination) => destination !== null);\n\n if (blocked.length > 0) throw new Error(uncarriedDestinationError(blocked));\n}\n\nasync function judgeDestination(install: ExternalSkillInstall): Promise<BlockedDestination | null> {\n const { id, skillDir } = install;\n if (!(await directoryExists(skillDir))) return null;\n if ((await readForkedFromMetadata(skillDir))?.path !== undefined) return null;\n return { id, skillDir };\n}\n\nfunction uncarriedDestinationError(blocked: BlockedDestination[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids this \" +\n \"installation already keeps a skill directory for, and no shared configuration put those \" +\n \"directories there:\",\n ...blocked.map(({ id, skillDir }) => ` ${id} -> ${skillDir}`),\n \"A skill id is the directory the skill installs into, so each would be written over a skill \" +\n \"written here by hand or ejected from a marketplace. Move or rename the directory above, \" +\n \"or re-share the configuration with each skill added again, which mints an id — \" +\n \"'external-<category>-<name>' — that nothing here holds.\",\n ].join(\"\\n\");\n}\n\nexport type OwnedSkillDir = { id: string; skillDir: string; provenance: ForkedFromMetadata };\n\nexport type ContentReading = {\n external: Record<string, SeedExternalSkill>;\n uncarryable: string[];\n};\n\ntype CarriedRead =\n | { carries: \"content\"; id: string; skill: SeedExternalSkill }\n | { carries: \"nothing\" }\n | { carries: \"unshareable\"; line: string };\n\nfunction unnameableRepoMessage(id: string): string {\n return `${id} travels inside a shared configuration, and this installation does not record the repository its content came from`;\n}\n\nfunction uncarryableContentMessage(id: string, reason: string): string {\n return `${id} travels inside a shared configuration, and ${reason}`;\n}\n\n/** The inverse of the stamp's `github:` source; any other ref answers nothing, to be refused. */\nfunction repoFromRef(ref: string | undefined): string | undefined {\n if (ref === undefined || !ref.startsWith(GITHUB_SOURCE.GITHUB_PREFIX)) return undefined;\n return ref.slice(GITHUB_SOURCE.GITHUB_PREFIX.length);\n}\n\nconst NO_MANIFEST_DESCRIPTION = `no description can be read from its ${STANDARD_FILES.SKILL_MD}`;\n\nfunction manifestDescription(files: SeedSkillTree, skillDir: string): string | null {\n const manifest = files[STANDARD_FILES.SKILL_MD];\n if (manifest === undefined) return null;\n\n const frontmatter = parseFrontmatter(manifest, path.join(skillDir, STANDARD_FILES.SKILL_MD));\n return frontmatter === null ? null : frontmatter.description;\n}\n\nasync function readSkillTree(skillDir: string): Promise<SeedSkillTree> {\n const files = await glob(\"**/*\", skillDir, { dot: true });\n const entries = await Promise.all(\n files.map(async (file) => [file, await readFile(path.join(skillDir, file))] as const),\n );\n return Object.fromEntries(entries);\n}\n\n/**\n * Rebuilds the carried entry from the bytes as installed. The description is the manifest's, not\n * the truncated `cliDescription`, which would shorten the skill on every round trip.\n */\nasync function readCarriedSkill({ id, skillDir, provenance }: OwnedSkillDir): Promise<CarriedRead> {\n // No path means a catalogue serves this id, so the bytes need not travel.\n if (provenance.path === undefined) return { carries: \"nothing\" };\n\n const repo = repoFromRef(provenance.source);\n if (repo === undefined) return { carries: \"unshareable\", line: unnameableRepoMessage(id) };\n\n const described = await readSkillMetadata(path.join(skillDir, STANDARD_FILES.METADATA_YAML));\n if (!described.usable) {\n return { carries: \"unshareable\", line: uncarryableContentMessage(id, described.reason) };\n }\n\n const files = await readSkillTree(skillDir);\n const description = manifestDescription(files, skillDir);\n if (description === null) {\n return { carries: \"unshareable\", line: uncarryableContentMessage(id, NO_MANIFEST_DESCRIPTION) };\n }\n\n const parsed = seedExternalSkillSchema.safeParse({\n displayName: described.metadata.displayName,\n description,\n categoryId: described.metadata.category,\n repo,\n path: provenance.path,\n files,\n });\n if (!parsed.success) {\n const reason = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n return { carries: \"unshareable\", line: uncarryableContentMessage(id, reason) };\n }\n\n return { carries: \"content\", id, skill: parsed.data };\n}\n\n/** The mirror of {@link registerExternalSkills}: reads installed bytes back into entries. */\nexport async function readCarriedSkills(owned: OwnedSkillDir[]): Promise<ContentReading> {\n const reads = await Promise.all(owned.map(readCarriedSkill));\n\n return {\n external: Object.fromEntries(\n reads.flatMap((read) => (read.carries === \"content\" ? [[read.id, read.skill]] : [])),\n ),\n uncarryable: reads.flatMap((read) => (read.carries === \"unshareable\" ? [read.line] : [])),\n };\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\"\n\nimport { GITHUB_PREFIX, STANDARD_FILES } from \"./paths.js\"\n\nimport type { SeedExternalSkill, SeedSkillTree } from \"@workspace/matrix\"\n\n// What an install does to a skill the configuration carries (its whole directory travels in the\n// payload). The CLI writes {@link installedSkillTree}'s bytes; the editor preview draws them.\n\nconst FRONTMATTER_BLOCK = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/\nconst NAME_FIELD = /^name:.*$/m\n\nexport type InstalledSkillIdentity = { id: string; description: string }\n\n/**\n * Names the skill by the id it installs under, which compiled sub-agents reference; the rest of\n * the frontmatter is the author's and travels untouched.\n */\nexport function withInstalledName(\n manifest: string,\n { id, description }: InstalledSkillIdentity\n): string {\n const named = `name: ${id}`\n const block = FRONTMATTER_BLOCK.exec(manifest)\n\n // No frontmatter describes no skill, so one is given from the payload.\n if (!block) {\n return `---\\n${named}\\ndescription: ${description}\\n---\\n\\n${manifest}`\n }\n\n const [whole, fields = \"\"] = block\n const renamed = NAME_FIELD.test(fields)\n ? fields.replace(NAME_FIELD, named)\n : `${named}\\n${fields}`\n\n return `---\\n${renamed}\\n---${manifest.slice(whole.length)}`\n}\n\nexport function carriedSkillAuthor(repo: string): string {\n const [owner = repo] = repo.split(\"/\")\n return `@${owner}`\n}\n\nexport type CarriedSkillPlacement = {\n id: string\n skill: Pick<\n SeedExternalSkill,\n \"displayName\" | \"description\" | \"categoryId\" | \"repo\"\n >\n domain: string\n /** The CLI's `defaultUsageGuidance`, passed in so it is spelled once. */\n usageGuidance: string\n shipped: Readonly<Record<string, unknown>> | null\n}\n\n/**\n * The payload's taxonomy wins over what the repository shipped, which wins over defaults. The\n * defaults keep `doctor` from flagging a file the user cannot fix.\n */\nexport function carriedSkillMetadata({\n id,\n skill,\n domain,\n usageGuidance,\n shipped,\n}: CarriedSkillPlacement): Record<string, unknown> {\n return {\n author: carriedSkillAuthor(skill.repo),\n usageGuidance,\n ...shipped,\n displayName: skill.displayName,\n slug: id,\n category: skill.categoryId,\n domain,\n cliDescription: shortLabel(skill.description),\n custom: true,\n }\n}\n\n// `CLI_DESCRIPTION_MAX_LENGTH` in the CLI's `schemas.ts`.\nconst CLI_DESCRIPTION_MAX_LENGTH = 60\n\nconst ELLIPSIS = \"…\"\n\n/** Cut at the last whole word that fits `doctor`'s limit; sub-agents read the full SKILL.md. */\nfunction shortLabel(description: string): string {\n if (description.length <= CLI_DESCRIPTION_MAX_LENGTH) return description\n\n const roomLength = CLI_DESCRIPTION_MAX_LENGTH - ELLIPSIS.length\n const room = description.slice(0, roomLength)\n // A break right after the room means its last word is whole and fits.\n const endsOnAWord = description[roomLength] === \" \"\n\n return `${endsOnAWord ? room.trimEnd() : toLastWholeWord(room)}${ELLIPSIS}`\n}\n\nfunction toLastWholeWord(text: string): string {\n const lastBreak = text.lastIndexOf(\" \")\n return (lastBreak > 0 ? text.slice(0, lastBreak) : text).trimEnd()\n}\n\nexport type CarriedSkillInstall = Omit<\n CarriedSkillPlacement,\n \"shipped\" | \"skill\"\n> & {\n skill: SeedExternalSkill\n date: string\n}\n\nexport async function installedSkillTree(\n install: CarriedSkillInstall\n): Promise<SeedSkillTree> {\n const manifest = withInstalledName(manifestOf(install.skill.files), {\n id: install.id,\n description: install.skill.description,\n })\n\n return {\n ...install.skill.files,\n [STANDARD_FILES.SKILL_MD]: manifest,\n [STANDARD_FILES.METADATA_YAML]: await metadataYaml(install, manifest),\n }\n}\n\n// `yamlSchemaComment(SCHEMA_PATHS.metadata)` in the CLI's `consts.ts`.\nconst METADATA_SCHEMA_COMMENT =\n \"# yaml-language-server: $schema=https://raw.githubusercontent.com/agents-inc/agents-inc/main/packages/cli/src/schemas/metadata.schema.json\"\n\n// `YAML_FORMATTING.LINE_WIDTH_NONE`.\nconst NO_LINE_FOLDING = 0\n\n/** The shared metadata, then the `forkedFrom` stamp. */\nasync function metadataYaml(\n install: CarriedSkillInstall,\n manifest: string\n): Promise<string> {\n const metadata = carriedSkillMetadata({\n ...install,\n shipped: shippedMetadata(install.skill.files),\n })\n const stamp = await provenanceStamp(install, manifest)\n\n return asMetadataFile(withForkedFrom(metadata, stamp))\n}\n\nasync function provenanceStamp(\n install: CarriedSkillInstall,\n manifest: string\n): Promise<Record<string, string>> {\n return {\n skillId: install.id,\n contentHash: await contentHashOf(manifest),\n date: install.date,\n source: `${GITHUB_PREFIX}${install.skill.repo}`,\n path: install.skill.path,\n }\n}\n\n/** The bytes `writeMetadataYaml` writes. */\nconst asMetadataFile = (metadata: Record<string, unknown>): string =>\n `${METADATA_SCHEMA_COMMENT}\\n${stringifyYaml(metadata, {\n lineWidth: NO_LINE_FOLDING,\n })}`\n\n/**\n * Always last, in place of any shipped stamp: a re-install reads its own earlier output as what\n * was shipped, so any other place would move the stamp on every write.\n */\nfunction withForkedFrom(\n metadata: Record<string, unknown>,\n forkedFrom: Record<string, string>\n): Record<string, unknown> {\n const { forkedFrom: _replaced, ...rest } = metadata\n return { ...rest, forkedFrom }\n}\n\n/** Read as `readLocalSkillMetadata` does: unparseable, non-mapping or bad `forkedFrom` is none. */\nfunction shippedMetadata(files: SeedSkillTree): Record<string, unknown> | null {\n const shipped = files[STANDARD_FILES.METADATA_YAML]\n if (shipped === undefined) return null\n\n const parsed = parsedYaml(shipped)\n return isMapping(parsed) && hasReadableProvenance(parsed) ? parsed : null\n}\n\nfunction parsedYaml(text: string): unknown {\n try {\n return parseYaml(text)\n } catch {\n // The CLI warns and reads no metadata; there is nobody here to warn.\n return undefined\n }\n}\n\nconst isMapping = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst PROVENANCE_REQUIRED = [\"skillId\", \"contentHash\", \"date\"] as const\nconst PROVENANCE_OPTIONAL = [\"source\", \"path\"] as const\n\nfunction hasReadableProvenance(metadata: Record<string, unknown>): boolean {\n if (!Object.hasOwn(metadata, \"forkedFrom\")) return true\n\n const provenance = metadata.forkedFrom\n return (\n isMapping(provenance) &&\n PROVENANCE_REQUIRED.every((key) => typeof provenance[key] === \"string\") &&\n PROVENANCE_OPTIONAL.every(\n (key) =>\n !Object.hasOwn(provenance, key) || typeof provenance[key] === \"string\"\n )\n )\n}\n\nfunction manifestOf(files: SeedSkillTree): string {\n const manifest = files[STANDARD_FILES.SKILL_MD]\n if (manifest === undefined) {\n throw new Error(\n `A carried skill's directory holds no ${STANDARD_FILES.SKILL_MD}, which seedSkillTreeSchema refuses`\n )\n }\n return manifest\n}\n\n// `HASH_PREFIX_LENGTH` in the CLI's `computeStringHash`.\nconst CONTENT_HASH_LENGTH = 7\n\n// The CLI's `computeStringHash`, via Web Crypto because this package runs in a browser.\nasync function contentHashOf(text: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(text)\n )\n return hexOf(new Uint8Array(digest)).slice(0, CONTENT_HASH_LENGTH)\n}\n\nconst hexOf = (bytes: Uint8Array): string =>\n Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n","import os from \"os\";\n\nimport { isDeepEqual, omit, partition, pick } from \"remeda\";\n\nimport { loadProjectConfigFromDir } from \"../configuration/project-config.js\";\nimport { isActiveAt } from \"../configuration/scope-predicates.js\";\nimport { providerInUse } from \"../installation/install-layout.js\";\nimport { getCategoryDomain, getSkillDisplayName, matrix } from \"../matrix/matrix-provider.js\";\nimport { orderDomains } from \"@workspace/compile\";\nimport {\n SHARED_CONFIG_APPLY,\n SHARED_CONFIG_ARRIVALS,\n addedToGlobalSubAgents,\n} from \"../../utils/messages.js\";\nimport { typedEntries, typedKeys, typedValues } from \"../../utils/typed-object.js\";\n\nimport type { InstallSelection, SkippedSkillAgents } from \"@workspace/compile/seed-to-config\";\nimport type { AgentName } from \"../../types/agents.js\";\nimport type {\n AgentScopeConfig,\n ProjectConfig,\n SkillConfig,\n SkillScope,\n} from \"../../types/config.js\";\nimport type { Category, Domain } from \"../../types/matrix.js\";\nimport type { SkillAssignment, SkillId } from \"../../types/skills.js\";\nimport type { StackAgentConfig } from \"../../types/stacks.js\";\nimport type { SeedPayload, SeedSkill } from \"@workspace/matrix/seed\";\n\n/** What applying a shared configuration may not take away, split by reason. */\nexport type KeptFromRoundTrip = {\n /** Written here, so no shared configuration ever carried them. */\n authoredSkillIds: SkillId[];\n /** Named by the configuration but unplaceable by this catalogue. */\n unplaceableSkillIds: SkillId[];\n};\n\n/**\n * A kept skill's row displaced by the payload's own skill in a one-skill category. The skill stays\n * installed; the row goes.\n */\nexport type UnassignedRow = { skillId: SkillId; agentName: AgentName; category: Category };\n\nexport type ReconciledSharedConfig = {\n result: InstallSelection;\n kept: KeptFromRoundTrip;\n unassigned: UnassignedRow[];\n};\n\nexport type ReconcileOptions = {\n decoded: InstallSelection;\n installed: ProjectConfig | null;\n authoredHere: ReadonlySet<SkillId>;\n /** `SeedMapping.skippedSkillIds` as the caller already reported them. */\n unplaceable: ReadonlySet<string>;\n};\n\nconst NOTHING_KEPT: KeptFromRoundTrip = {\n authoredSkillIds: [],\n unplaceableSkillIds: [],\n};\n\n/**\n * Puts back skills written here and ids this catalogue cannot place. Restored into the result,\n * not excused at the writer, because the removal diff drives deletion; rows and domain come too.\n */\nexport function reconcileSharedConfig(options: ReconcileOptions): ReconciledSharedConfig {\n const { decoded, installed } = options;\n if (!installed) return nothingToReconcile(decoded);\n\n const keptSkills = skillsToKeep(options, installed);\n if (keptSkills.length === 0) return nothingToReconcile(decoded);\n\n const { result, unassigned } = withKeptEntries(decoded, installed, keptSkills);\n return { result, kept: describeKept(options, keptSkills), unassigned };\n}\n\nfunction nothingToReconcile(decoded: InstallSelection): ReconciledSharedConfig {\n return { result: decoded, kept: NOTHING_KEPT, unassigned: [] };\n}\n\n/** A tombstone is neither: nothing is installed, so nothing needs protecting. */\nfunction skillsToKeep(options: ReconcileOptions, installed: ProjectConfig): SkillConfig[] {\n const named = new Set(options.decoded.skills.map((skill) => skill.id));\n\n return installed.skills.filter(\n (skill) => !skill.excluded && !named.has(skill.id) && mayNotRemove(skill, options),\n );\n}\n\nfunction mayNotRemove(skill: SkillConfig, options: ReconcileOptions): boolean {\n return options.authoredHere.has(skill.id) || options.unplaceable.has(skill.id);\n}\n\ntype KeptReason = \"authored\" | \"unplaceable\";\n\nfunction describeKept(options: ReconcileOptions, keptSkills: SkillConfig[]): KeptFromRoundTrip {\n const idsKeptFor = (reason: KeptReason): SkillId[] =>\n keptSkills.filter((skill) => reasonKept(skill, options) === reason).map((skill) => skill.id);\n\n return {\n authoredSkillIds: idsKeptFor(\"authored\"),\n unplaceableSkillIds: idsKeptFor(\"unplaceable\"),\n };\n}\n\n/** Where both apply, authorship wins: `update` can resolve an unplaceable id. */\nfunction reasonKept(skill: SkillConfig, options: ReconcileOptions): KeptReason {\n return options.authoredHere.has(skill.id) ? \"authored\" : \"unplaceable\";\n}\n\nfunction withKeptEntries(\n decoded: InstallSelection,\n installed: ProjectConfig,\n keptSkills: SkillConfig[],\n): Pick<ReconciledSharedConfig, \"result\" | \"unassigned\"> {\n const withSkills: InstallSelection = {\n ...decoded,\n skills: [...decoded.skills, ...keptSkills],\n selectedDomains: withKeptDomains(decoded.selectedDomains, keptSkills),\n };\n const { assignedStack, unassigned } = withKeptStackRows(decoded.assignedStack, installed.stack, {\n keptSkillIds: new Set(keptSkills.map((skill) => skill.id)),\n survivingAgents: new Set(decoded.selectedAgents),\n });\n return { result: { ...withSkills, assignedStack }, unassigned };\n}\n\nfunction withKeptDomains(selected: Domain[], keptSkills: SkillConfig[]): Domain[] {\n const keptDomains = keptSkills.flatMap((skill) => domainOfSkill(skill.id) ?? []);\n const missing = keptDomains.filter((domain) => !selected.includes(domain));\n if (missing.length === 0) return selected;\n\n return orderDomains([...selected, ...new Set(missing)]);\n}\n\n/** Undefined for an entry the loaded source cannot resolve; `edit` reports those itself. */\nfunction domainOfSkill(skillId: SkillId): Domain | undefined {\n const category = matrix.skills[skillId]?.category;\n return category === undefined ? undefined : getCategoryDomain(category);\n}\n\ntype KeptRowFilter = {\n keptSkillIds: ReadonlySet<SkillId>;\n survivingAgents: ReadonlySet<AgentName>;\n};\n\ntype KeptRows = {\n assignedStack: Partial<Record<AgentName, StackAgentConfig>>;\n unassigned: UnassignedRow[];\n};\n\n/**\n * A kept row joins the payload's under its category, except in a one-skill category the payload\n * fills, where it is returned as unassigned.\n */\nfunction withKeptStackRows(\n assigned: Partial<Record<AgentName, StackAgentConfig>>,\n installedStack: Partial<Record<AgentName, StackAgentConfig>> | undefined,\n filter: KeptRowFilter,\n): KeptRows {\n const isKept = (_category: Category, row: SkillAssignment): boolean =>\n filter.keptSkillIds.has(row.id);\n\n return typedEntries<AgentName, StackAgentConfig>(installedStack ?? {})\n .filter(([agent]) => filter.survivingAgents.has(agent))\n .reduce<KeptRows>(\n (carried, [agent, agentStack]) =>\n withAgentKeptRows(carried, agent, rowsWhere(agentStack, isKept), assigned[agent]),\n { assignedStack: assigned, unassigned: [] },\n );\n}\n\nfunction withAgentKeptRows(\n carried: KeptRows,\n agent: AgentName,\n keptRows: [Category, SkillAssignment][],\n payloadRows: StackAgentConfig | undefined,\n): KeptRows {\n const filled = filledExclusiveCategories(payloadRows);\n const [displaced, joining] = partition(keptRows, ([category]) => filled.has(category));\n\n return {\n assignedStack: withAppendedRows(carried.assignedStack, agent, joining),\n unassigned: [\n ...carried.unassigned,\n ...displaced.map(([category, row]) => ({ skillId: row.id, agentName: agent, category })),\n ],\n };\n}\n\n/** The decode carries sub-agents only through placed skills, so an unplaceable skill's assignees return. */\nexport function withUnplaceableAssignees(\n decoded: InstallSelection,\n installed: ProjectConfig | null,\n payload: SeedPayload,\n unplaceable: ReadonlySet<string>,\n): InstallSelection {\n if (!installed) return decoded;\n\n const assigned = assigneesOfHeld(payload, installed, unplaceable);\n const selected = new Set(decoded.selectedAgents);\n const leftOutThoughAssigned = (agent: AgentScopeConfig): boolean =>\n !agent.excluded && assigned.has(agent.name) && !selected.has(agent.name);\n\n const assignees = installed.agents.filter(leftOutThoughAssigned);\n if (assignees.length === 0) return decoded;\n\n return {\n ...decoded,\n selectedAgents: [...decoded.selectedAgents, ...assignees.map((agent) => agent.name)],\n agentConfigs: [...decoded.agentConfigs, ...assignees],\n };\n}\n\n/** Less any the payload switches off. */\nfunction assigneesOfHeld(\n payload: SeedPayload,\n installed: ProjectConfig,\n unplaceable: ReadonlySet<string>,\n): Set<string> {\n const held = new Set<string>(\n installed.skills.filter((skill) => !skill.excluded).map((skill) => skill.id),\n );\n const isHeldUnplaceable = ([id]: [string, SeedSkill]): boolean =>\n unplaceable.has(id) && held.has(id);\n const isNotSwitchedOff = (name: string): boolean => payload.agents[name]?.on !== false;\n\n return new Set(\n typedEntries<string, SeedSkill>(payload.skills)\n .filter(isHeldUnplaceable)\n .flatMap(([, skill]) => typedKeys<string>(skill.assignments))\n .filter(isNotSwitchedOff),\n );\n}\n\nexport type InstalledGlobal = Pick<ProjectConfig, \"skills\" | \"agents\" | \"stack\">;\n\n/** Read from the global config itself, not a project's possibly older inlined copy. */\nexport async function readInstalledGlobal(projectDir: string): Promise<InstalledGlobal | null> {\n const loaded = await loadProjectConfigFromDir(os.homedir(), providerInUse(projectDir));\n return loaded?.config ?? null;\n}\n\ntype Entries = { skillIds: SkillId[]; agentNames: AgentName[] };\n\n/** A held global sub-agent an arriving skill's row joins, and the skills those rows bring. */\nexport type JoinedAgent = { agentName: AgentName; skillIds: SkillId[] };\n\nexport type HeldGlobal = {\n result: InstallSelection;\n installed: Entries;\n keptAsInstalled: Entries;\n joined: JoinedAgent[];\n};\n\nconst NO_GLOBAL_ENTRIES: Entries = { skillIds: [], agentNames: [] };\n\n/** A project `--from` only adds to the global install: every global entry it holds stays as held. */\nexport function holdInstalledGlobal(\n decoded: InstallSelection,\n installed: InstalledGlobal | null,\n): HeldGlobal {\n if (!installed) {\n return {\n result: decoded,\n installed: NO_GLOBAL_ENTRIES,\n keptAsInstalled: NO_GLOBAL_ENTRIES,\n joined: [],\n };\n }\n\n const heldSkills = activeGlobalById(installed.skills, (skill) => skill.id);\n const heldAgents = activeGlobalById(installed.agents, (agent) => agent.name);\n const skills = pairWithHeld(decoded.skills, heldSkills, (skill) => skill.id);\n const agents = pairWithHeld(decoded.agentConfigs, heldAgents, (agent) => agent.name);\n const namedSkillIds = skills.map(({ named }) => named.id);\n const namedAgentNames = agents.map(({ named }) => named.name);\n const { assignedStack, joined } = withHeldRows(decoded.assignedStack, installed.stack, {\n agentNames: namedAgentNames,\n skippedSkillIds: new Set(namedSkillIds),\n });\n\n return {\n result: {\n ...decoded,\n skills: decoded.skills.map(asHeld(skills)),\n agentConfigs: decoded.agentConfigs.map(asHeld(agents)),\n assignedStack,\n },\n installed: { skillIds: namedSkillIds, agentNames: namedAgentNames },\n keptAsInstalled: {\n skillIds: skillsKeptAsInstalled(skills),\n agentNames: agentsKeptAsInstalled(agents, {\n stated: decoded.assignedStack,\n held: assignedStack,\n joined,\n }),\n },\n joined,\n };\n}\n\nfunction skillsKeptAsInstalled(pairs: Held<SkillConfig>[]): SkillId[] {\n return pairs.filter((pair) => !restatesSkill(pair)).map(({ named }) => named.id);\n}\n\nfunction restatesSkill({ named, held }: Held<SkillConfig>): boolean {\n return named.origin === held.origin;\n}\n\ntype HeldAgentRows = {\n stated: Partial<Record<AgentName, StackAgentConfig>>;\n held: Partial<Record<AgentName, StackAgentConfig>>;\n joined: JoinedAgent[];\n};\n\n/** A sub-agent a row joins is changed, so it is named as added to rather than as kept. */\nfunction agentsKeptAsInstalled(pairs: Held<AgentScopeConfig>[], rows: HeldAgentRows): AgentName[] {\n const joinedNames = new Set(rows.joined.map(({ agentName }) => agentName));\n const keptAsIs = (pair: Held<AgentScopeConfig>): boolean =>\n !restatesAgent(pair, rows) && !joinedNames.has(pair.named.name);\n\n return pairs.filter(keptAsIs).map(({ named }) => named.name);\n}\n\nfunction restatesAgent({ named, held }: Held<AgentScopeConfig>, rows: HeldAgentRows): boolean {\n return (\n named.model === held.model &&\n named.codexModel === held.codexModel &&\n named.effort === held.effort &&\n sameAssignments(rows.stated[named.name], rows.held[named.name])\n );\n}\n\n/** For the destructive `edit --from`: a project may not remove global entries. */\nexport function restoreInstalledGlobal(\n decoded: InstallSelection,\n installed: InstalledGlobal | null,\n): HeldGlobal {\n const held = holdInstalledGlobal(decoded, installed);\n if (!installed) return held;\n\n const omitted = omittedGlobal(held.result, installed);\n const { skillIds, agentNames } = held.keptAsInstalled;\n return {\n ...held,\n result: withOmittedGlobal(held.result, installed, omitted),\n keptAsInstalled: {\n skillIds: [...skillIds, ...omitted.skills.map((skill) => skill.id)],\n agentNames: [...agentNames, ...omitted.agents.map((agent) => agent.name)],\n },\n };\n}\n\nfunction activeGlobalById<Entry extends SkillConfig | AgentScopeConfig, Key extends string>(\n entries: Entry[],\n keyOf: (entry: Entry) => Key,\n): Map<Key, Entry> {\n return new Map(\n entries.filter((entry) => isActiveAt(entry, \"global\")).map((entry) => [keyOf(entry), entry]),\n );\n}\n\ntype Held<Entry> = { named: Entry; held: Entry };\n\nfunction asHeld<Entry>(pairs: Held<Entry>[]): (entry: Entry) => Entry {\n const heldFor = new Map(pairs.map(({ named, held }) => [named, held]));\n return (entry) => heldFor.get(entry) ?? entry;\n}\n\nfunction pairWithHeld<Entry extends SkillConfig | AgentScopeConfig, Key extends string>(\n decoded: Entry[],\n heldByKey: ReadonlyMap<Key, Entry>,\n keyOf: (entry: Entry) => Key,\n): Held<Entry>[] {\n return decoded.flatMap((named) => {\n const held = heldByKey.get(keyOf(named));\n return held !== undefined && isActiveAt(named, \"global\") ? [{ named, held }] : [];\n });\n}\n\n/** Row order is not part of what a sub-agent loads. */\nexport function sameAssignments(\n left: StackAgentConfig | undefined,\n right: StackAgentConfig | undefined,\n): boolean {\n return isDeepEqual(assignmentKeys(left), assignmentKeys(right));\n}\n\nfunction assignmentKeys(agentStack: StackAgentConfig | undefined): string[] {\n return typedEntries<Category, SkillAssignment[]>(agentStack ?? {})\n .flatMap(([category, assignments]) =>\n assignments.map((row) => `${category}/${row.id}/${row.preloaded === true}`),\n )\n .sort();\n}\n\nfunction withInstalledRows(\n assigned: Partial<Record<AgentName, StackAgentConfig>>,\n installedStack: InstalledGlobal[\"stack\"],\n agentNames: AgentName[],\n): Partial<Record<AgentName, StackAgentConfig>> {\n return { ...omit(assigned, agentNames), ...pick(installedStack ?? {}, agentNames) };\n}\n\ntype HeldAgents = { agentNames: AgentName[]; skippedSkillIds: ReadonlySet<SkillId> };\n\ntype HeldStack = Pick<HeldGlobal, \"joined\"> & {\n assignedStack: Partial<Record<AgentName, StackAgentConfig>>;\n};\n\ntype AgentArrival = { agentName: AgentName; rows: [Category, SkillAssignment][] };\n\n/** Existing rows stay first and unchanged; arriving skills bring their rows after them. */\nfunction withHeldRows(\n assigned: Partial<Record<AgentName, StackAgentConfig>>,\n installedStack: InstalledGlobal[\"stack\"],\n held: HeldAgents,\n): HeldStack {\n const asInstalled = withInstalledRows(assigned, installedStack, held.agentNames);\n const arrivals = held.agentNames.map((agentName): AgentArrival => ({\n agentName,\n rows: arrivingRows(assigned[agentName], asInstalled[agentName], held.skippedSkillIds),\n }));\n\n return {\n assignedStack: arrivals.reduce(\n (stack, { agentName, rows }) => withAppendedRows(stack, agentName, rows),\n asInstalled,\n ),\n joined: arrivals.filter(({ rows }) => rows.length > 0).map(asJoined),\n };\n}\n\nfunction asJoined({ agentName, rows }: AgentArrival): JoinedAgent {\n return { agentName, skillIds: rows.map(([, row]) => row.id) };\n}\n\nfunction arrivingRows(\n stated: StackAgentConfig | undefined,\n installed: StackAgentConfig | undefined,\n skippedSkillIds: ReadonlySet<SkillId>,\n): [Category, SkillAssignment][] {\n const alreadyLoaded = new Set(rowIds(installed));\n const filled = filledExclusiveCategories(installed);\n const arrives = (category: Category, row: SkillAssignment): boolean =>\n !skippedSkillIds.has(row.id) && !alreadyLoaded.has(row.id) && !filled.has(category);\n\n return rowsWhere(stated, arrives);\n}\n\nfunction rowIds(agentStack: StackAgentConfig | undefined): SkillId[] {\n return typedValues<Category, SkillAssignment[]>(agentStack ?? {}).flatMap((rows) =>\n rows.map((row) => row.id),\n );\n}\n\n/** An undeclared category is not exclusive (see `propagate.ts`). */\nfunction filledExclusiveCategories(agentStack: StackAgentConfig | undefined): Set<Category> {\n const isExclusive = (category: Category): boolean =>\n matrix.categories[category]?.exclusive === true;\n\n return new Set(\n typedEntries<Category, SkillAssignment[]>(agentStack ?? {})\n .filter(([category, rows]) => rows.length > 0 && isExclusive(category))\n .map(([category]) => category),\n );\n}\n\nfunction withAppendedRows(\n stack: Partial<Record<AgentName, StackAgentConfig>>,\n agentName: AgentName,\n added: [Category, SkillAssignment][],\n): Partial<Record<AgentName, StackAgentConfig>> {\n if (added.length === 0) return stack;\n return { ...stack, [agentName]: appendRows(stack[agentName] ?? {}, added) };\n}\n\nfunction rowsWhere(\n agentStack: StackAgentConfig | undefined,\n keep: (category: Category, row: SkillAssignment) => boolean,\n): [Category, SkillAssignment][] {\n return typedEntries<Category, SkillAssignment[]>(agentStack ?? {}).flatMap(([category, rows]) =>\n rows\n .filter((row) => keep(category, row))\n .map((row): [Category, SkillAssignment] => [category, row]),\n );\n}\n\nfunction appendRows(\n agentStack: StackAgentConfig,\n added: [Category, SkillAssignment][],\n): StackAgentConfig {\n return added.reduce<StackAgentConfig>(\n (rows, [category, row]) => ({ ...rows, [category]: [...(rows[category] ?? []), row] }),\n agentStack,\n );\n}\n\ntype OmittedGlobal = { skills: SkillConfig[]; agents: AgentScopeConfig[] };\n\nfunction omittedGlobal(result: InstallSelection, installed: InstalledGlobal): OmittedGlobal {\n const namedSkillIds = new Set(result.skills.map((skill) => skill.id));\n const namedAgentNames = new Set(result.agentConfigs.map((agent) => agent.name));\n\n return {\n skills: [...activeGlobalById(installed.skills, (skill) => skill.id).values()].filter(\n (skill) => !namedSkillIds.has(skill.id),\n ),\n agents: [...activeGlobalById(installed.agents, (agent) => agent.name).values()].filter(\n (agent) => !namedAgentNames.has(agent.name),\n ),\n };\n}\n\nfunction withOmittedGlobal(\n result: InstallSelection,\n installed: InstalledGlobal,\n omitted: OmittedGlobal,\n): InstallSelection {\n const omittedAgentNames = omitted.agents.map((agent) => agent.name);\n\n return {\n ...result,\n skills: [...result.skills, ...omitted.skills],\n agentConfigs: [...result.agentConfigs, ...omitted.agents],\n selectedAgents: [...new Set([...result.selectedAgents, ...omittedAgentNames])],\n selectedDomains: withKeptDomains(result.selectedDomains, omitted.skills),\n assignedStack: withInstalledRows(result.assignedStack, installed.stack, omittedAgentNames),\n };\n}\n\nexport function notInstalledGlobally<Entry extends { id: SkillId }>(\n entries: Entry[],\n held: HeldGlobal,\n): Entry[] {\n const installed = new Set(held.installed.skillIds);\n return entries.filter((entry) => !installed.has(entry.id));\n}\n\nexport type Arrivals = Record<SkillScope, Entries>;\n\nexport function arrivalsByScope(skills: SkillConfig[], agents: AgentScopeConfig[]): Arrivals {\n return {\n project: entriesActiveAt(skills, agents, \"project\"),\n global: entriesActiveAt(skills, agents, \"global\"),\n };\n}\n\nfunction entriesActiveAt(\n skills: SkillConfig[],\n agents: AgentScopeConfig[],\n scope: SkillScope,\n): Entries {\n return {\n skillIds: skills.filter((skill) => isActiveAt(skill, scope)).map((skill) => skill.id),\n agentNames: agents.filter((agent) => isActiveAt(agent, scope)).map((agent) => agent.name),\n };\n}\n\nfunction installArrivals(held: HeldGlobal): Arrivals {\n const installedSkillIds = new Set(held.installed.skillIds);\n const installedAgentNames = new Set(held.installed.agentNames);\n return arrivalsByScope(\n held.result.skills.filter((skill) => !installedSkillIds.has(skill.id)),\n held.result.agentConfigs.filter((agent) => !installedAgentNames.has(agent.name)),\n );\n}\n\nexport function installPlanLines(held: HeldGlobal): string[] {\n return [\n ...arrivalLines(installArrivals(held)),\n ...scopeLines(SHARED_CONFIG_ARRIVALS.SKIPPED_HEADING, skippedAsInstalled(held)),\n ...joinedStatement(held),\n ];\n}\n\n/** A sub-agent a row joins is changed, so it is named as added to rather than as skipped. */\nfunction skippedAsInstalled({ installed, joined }: HeldGlobal): Entries {\n const joinedNames = new Set(joined.map(({ agentName }) => agentName));\n return {\n skillIds: installed.skillIds,\n agentNames: installed.agentNames.filter((name) => !joinedNames.has(name)),\n };\n}\n\nexport function joinedStatement(held: HeldGlobal): string[] {\n return held.joined.length === 0 ? [] : [addedToGlobalSubAgents(held.joined)];\n}\n\nexport function skillLabel(skillId: SkillId): string {\n const displayName = getSkillDisplayName(skillId);\n return displayName === skillId ? skillId : `${displayName} (${skillId})`;\n}\n\nexport function arrivalLines(arrivals: Arrivals): string[] {\n return [\n ...scopeLines(SHARED_CONFIG_ARRIVALS.PROJECT_HEADING, arrivals.project),\n ...scopeLines(SHARED_CONFIG_ARRIVALS.GLOBAL_HEADING, arrivals.global),\n ];\n}\n\nfunction scopeLines(heading: string, entries: Entries): string[] {\n const groups = [\n { label: SHARED_CONFIG_APPLY.SKILLS_HEADING, items: entries.skillIds.map(skillLabel) },\n { label: SHARED_CONFIG_APPLY.AGENTS_HEADING, items: entries.agentNames },\n ].filter((group) => group.items.length > 0);\n if (groups.length === 0) return [];\n\n return [\n heading,\n ...groups.flatMap((group) => [` ${group.label}`, ...group.items.map((item) => ` ${item}`)]),\n ];\n}\n\n/** Split by kind: skill and sub-agent scopes are independent, so a refusal names each. */\nexport function projectScopedContent(result: InstallSelection): Entries {\n return entriesActiveAt(result.skills, result.agentConfigs, \"project\");\n}\n\n/** The home directory is the global scope, so it refuses anything project-scoped. */\nexport function installsAtHome(result: InstallSelection): boolean {\n const { skillIds, agentNames } = projectScopedContent(result);\n return skillIds.length === 0 && agentNames.length === 0;\n}\n\n/** Less any sub-agent the run installs after all, as `edit` keeps one already installed. */\nexport function skippedWithTheirSkills(\n skipped: readonly SkippedSkillAgents[],\n selectedAgents: readonly AgentName[],\n): SkippedSkillAgents[] {\n const selected = new Set(selectedAgents);\n return skipped.flatMap(({ skillId, agentNames }) => {\n const left = agentNames.filter((name) => !selected.has(name));\n return left.length === 0 ? [] : [{ skillId, agentNames: left }];\n });\n}\n","import { Command } from \"@oclif/core\";\n\nimport chalk from \"chalk\";\nimport { unique } from \"remeda\";\n\nimport { CLI_COLORS, DEFAULT_BRANDING, MIN_TERMINAL_SIZE } from \"./consts.js\";\nimport { getErrorMessage } from \"./utils/errors.js\";\nimport { stripTerminalControls } from \"./utils/string.js\";\nimport { verbose } from \"./utils/logger.js\";\nimport {\n completedWithFailures,\n installationConfigsUnreadable,\n type IncompleteWork,\n pluginsInstalled,\n propagatedRecompileSummary,\n registeredProjectConfigUnreadable,\n registeredProjectGone,\n registeredProjectOnAnotherProvider,\n savedSkillMetadataUnusableError,\n scopeBlockedStackAssignment,\n sharedConfigProjectScopeAtHome,\n skillAssignedToNoAgent,\n skillMetadataUnusableDetail,\n skippedUnknownAgents,\n skippedUnknownSkills,\n STATUS_MESSAGES,\n} from \"./utils/messages.js\";\nimport {\n clearTerminalScreen,\n formatTerminalTooSmallMessage,\n isTerminalLargeEnough,\n} from \"./utils/terminal.js\";\nimport { EXIT_CODES } from \"./lib/exit-codes.js\";\nimport { isActiveAt } from \"./lib/configuration/scope-predicates.js\";\nimport { resolveBranding } from \"./lib/configuration/config.js\";\nimport { isHomeDirectory, refuseUnofferedStack } from \"./lib/installation/index.js\";\nimport type { InstallSelection } from \"@workspace/compile/seed-to-config\";\nimport { getStackSkillIds } from \"./lib/stacks/index.js\";\nimport type {\n AgentName,\n MergedSkillsMatrix,\n ProjectConfig,\n SelectionValidation,\n SkillConfig,\n SkillId,\n} from \"./types/index.js\";\nimport { findConfigLoadFailures } from \"./lib/configuration/project-config.js\";\nimport { findUnusableSavedSkillMetadata } from \"./lib/skills/index.js\";\nimport type { PluginHost } from \"./lib/hosts/plugin-host.js\";\nimport { hostAt } from \"./lib/hosts/host-for.js\";\nimport { refuseUnofferedPlacements } from \"./lib/hosts/offered-placements.js\";\nimport {\n refuseUncarriedDestinations,\n type ExternalSkillInstall,\n} from \"./lib/seed/external-skills.js\";\nimport {\n installsAtHome,\n projectScopedContent,\n skippedWithTheirSkills,\n} from \"./lib/seed/seed-apply.js\";\nimport type { SeedMapping } from \"./lib/seed/seed-to-selection.js\";\nimport { refuseUnwritableStack } from \"@workspace/compile/config-source\";\nimport { requireMarketplace } from \"./lib/operations/source/require-marketplace.js\";\nimport {\n installPluginSkills,\n pluginInstallFailureError,\n unbackedPluginInstallError,\n unbackedPluginSkillIds,\n type PluginInstallResult,\n} from \"./lib/operations/skills/install-plugin-skills.js\";\nimport type { GateReport } from \"./lib/config-gate/index.js\";\nimport type { SourceLoadResult } from \"./lib/loading/source-loader.js\";\nimport type { UnusableSkillMetadata } from \"./lib/loading/index.js\";\n\n/** Polled because some terminals and multiplexers resize without emitting `resize`. */\nconst TERMINAL_RESIZE_POLL_MS = 500;\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- @types/node declares this as `number`; it is undefined whenever stdout is not a TTY\nconst terminalColumns = (): number => process.stdout.columns ?? MIN_TERMINAL_SIZE.COLS;\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- @types/node declares this as `number`; it is undefined whenever stdout is not a TTY\nconst terminalRows = (): number => process.stdout.rows ?? MIN_TERMINAL_SIZE.ROWS;\n\nfunction isTerminalBigEnough(): boolean {\n return isTerminalLargeEnough(terminalColumns(), terminalRows());\n}\n\nfunction waitForTerminal(isSatisfied: () => boolean): Promise<void> {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (!isSatisfied()) return;\n clearInterval(interval);\n process.stdout.off(\"resize\", check);\n resolve();\n };\n const interval = setInterval(check, TERMINAL_RESIZE_POLL_MS);\n process.stdout.on(\"resize\", check);\n });\n}\n\ntype UnassignedSkill = { skillId: SkillId; blockedBy: AgentName[] };\n\n/**\n * Only the selection is judged: inherited global skills are absent from this stack without being\n * unassigned. `blockedBy` is empty for a global-scoped skill, since the scope rule is not why.\n */\nfunction findUnassignedSkills(\n config: ProjectConfig,\n selected: readonly SkillConfig[],\n): UnassignedSkill[] {\n const assignedIds = new Set(config.stack ? getStackSkillIds(config.stack) : []);\n const selectedIds = new Set(selected.map((skill) => skill.id));\n const globalAgentNames = config.agents\n .filter((agent) => isActiveAt(agent, \"global\"))\n .map((agent) => agent.name);\n\n const unassignedIds = unique(\n config.skills\n .filter((skill) => !skill.excluded && selectedIds.has(skill.id))\n .map((skill) => skill.id)\n .filter((skillId) => !assignedIds.has(skillId)),\n );\n\n return unassignedIds.map((skillId) => ({\n skillId,\n blockedBy: hasActiveProjectEntry(config.skills, skillId) ? globalAgentNames : [],\n }));\n}\n\nfunction hasActiveProjectEntry(skills: readonly SkillConfig[], skillId: SkillId): boolean {\n return skills.some((skill) => skill.id === skillId && isActiveAt(skill, \"project\"));\n}\n\nexport abstract class BaseCommand extends Command {\n /** Non-empty decides the exit code; see {@link exitIfWorkIncomplete}. */\n private readonly incompleteWork: IncompleteWork[] = [];\n\n async init(): Promise<void> {\n await super.init();\n await this.ensureTerminalSize();\n }\n\n protected async ensureTerminalSize(): Promise<void> {\n if (isTerminalBigEnough()) return;\n\n clearTerminalScreen();\n this.log(chalk.hex(CLI_COLORS.WARNING)(formatTerminalTooSmallMessage(terminalColumns())));\n\n await waitForTerminal(isTerminalBigEnough);\n }\n\n protected handleError(error: unknown): never {\n const message = getErrorMessage(error);\n this.error(message, { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * Degrades on an unreadable config: `doctor` and `uninstall` must survive one, and a heading is\n * not worth refusing over. The command's own config reader reports the cause.\n */\n protected async resolveBrandingName(projectDir: string): Promise<string> {\n try {\n const branding = await resolveBranding(projectDir);\n return branding.name;\n } catch (error) {\n verbose(`Could not read branding from the config: ${getErrorMessage(error)}`);\n return DEFAULT_BRANDING.NAME;\n }\n }\n\n protected logSuccess(message: string): void {\n this.log(`✓ ${message}`);\n }\n\n /** `onRegistered` fires only when the marketplace had to be registered. */\n protected async requireMarketplaceOrExit(\n sourceResult: SourceLoadResult,\n purpose: string,\n host: PluginHost,\n onRegistered?: (marketplace: string) => void,\n ): Promise<string> {\n const required = await requireMarketplace(sourceResult, purpose, host);\n if (!required.ok) {\n this.error(required.error, { exit: EXIT_CODES.ERROR });\n }\n if (required.registered) {\n onRegistered?.(required.marketplace);\n }\n return required.marketplace;\n }\n\n /** Advisory: the selection installs either way. A message can quote a payload's own ids. */\n protected reportValidationErrors(validation: SelectionValidation): void {\n for (const error of validation.errors) {\n this.warn(stripTerminalControls(error.message));\n }\n }\n\n /** Refuses skills no marketplace carries before the host's CLI is asked. */\n protected async installPluginSkillsReported(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n matrix: MergedSkillsMatrix,\n ): Promise<PluginInstallResult> {\n const unbacked = unbackedPluginSkillIds(skills, matrix);\n if (unbacked.length > 0) {\n this.error(unbackedPluginInstallError(unbacked), { exit: EXIT_CODES.ERROR });\n }\n\n this.announcePluginInstall();\n const result = await installPluginSkills(skills, marketplace, projectDir);\n this.reportPluginInstalls(result);\n return result;\n }\n\n /** Split out for the eject-to-plugin migration, which runs its own installs. */\n protected announcePluginInstall(): void {\n this.log(STATUS_MESSAGES.INSTALLING_PLUGINS);\n }\n\n /** Hard-errors on any failure, before a config can record an origin for an uninstalled plugin. */\n protected reportPluginInstalls(result: PluginInstallResult): void {\n for (const item of result.installed) {\n this.log(` Installed ${item.ref}`);\n }\n for (const item of result.failed) {\n this.warn(`Failed to install plugin ${item.id}: ${item.error}`);\n }\n if (result.failed.length > 0) {\n this.error(pluginInstallFailureError(result.failed.length), { exit: EXIT_CODES.ERROR });\n }\n this.log(`${pluginsInstalled(result.installed.length)}\\n`);\n }\n\n protected reportFanOut(report: GateReport): void {\n for (const projectPath of report.propagated.unreadable) {\n this.warn(registeredProjectConfigUnreadable(projectPath));\n }\n this.reportPropagatedRecompile(report);\n }\n\n protected reportProjectsOutOfReach(propagated: GateReport[\"propagated\"]): void {\n for (const projectPath of propagated.gone) {\n this.warn(registeredProjectGone(projectPath));\n }\n for (const projectPath of propagated.notOurs) {\n this.warn(registeredProjectOnAnotherProvider(projectPath));\n }\n }\n\n protected reportPropagatedRecompile(report: GateReport): void {\n if (report.propagated.updated.length === 0) return;\n\n const { rewrittenCount, unchangedCount, failedCount, warnings } = report.recompile;\n for (const warning of warnings) {\n this.warn(warning);\n }\n this.log(propagatedRecompileSummary(rewrittenCount, unchangedCount, failedCount));\n }\n\n protected reportUnassignedSkills(config: ProjectConfig, selected: readonly SkillConfig[]): void {\n for (const { skillId, blockedBy } of findUnassignedSkills(config, selected)) {\n this.warn(skillAssignedToNoAgent(skillId));\n if (blockedBy.length > 0) {\n this.warn(scopeBlockedStackAssignment(blockedBy, skillId));\n }\n }\n }\n\n /**\n * Aborts up front when the project or global config exists but cannot be loaded, so nothing is\n * installed before the config write fails. A missing config passes.\n */\n protected async ensureConfigReadable(projectDir: string): Promise<void> {\n const failures = await findConfigLoadFailures(projectDir);\n if (failures.length > 0) {\n this.error(installationConfigsUnreadable(failures), { exit: EXIT_CODES.ERROR });\n }\n }\n\n /** Only entries the catalogue lacks are checked; one whose files are gone is not refused. */\n protected async ensureSavedSkillsReadable(\n savedSkills: readonly SkillConfig[],\n matrix: MergedSkillsMatrix,\n projectDir: string,\n ): Promise<void> {\n const unresolved = savedSkills.filter((saved) => !matrix.skills[saved.id]);\n await this.refuseUnusableSavedSkillMetadata(\n unresolved,\n projectDir,\n savedSkillMetadataUnusableError,\n );\n }\n\n protected async refuseUnusableSavedSkillMetadata(\n savedSkills: readonly SkillConfig[],\n projectDir: string,\n refusal: (unusable: UnusableSkillMetadata[]) => string,\n ): Promise<void> {\n const unusable = await findUnusableSavedSkillMetadata(savedSkills, projectDir);\n if (unusable.length === 0) return;\n\n // Logged, not raised: oclif hard-wraps error text, which breaks copyable paths.\n for (const entry of unusable) {\n this.log(skillMetadataUnusableDetail(entry));\n }\n this.error(refusal(unusable), { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * The home directory is the global scope, so project-scoped content there would land in the\n * global config mislabelled. Needs the decoded selection; callers run it before any write.\n */\n protected refuseProjectScopedContentAtHome(result: InstallSelection, projectDir: string): void {\n if (!isHomeDirectory(projectDir) || installsAtHome(result)) return;\n\n const { skillIds, agentNames } = projectScopedContent(result);\n this.error(sharedConfigProjectScopeAtHome(skillIds, agentNames), { exit: EXIT_CODES.ERROR });\n }\n\n /** Measured against the selection after its restores, so a sub-agent kept is not named skipped. */\n protected warnOfSkippedEntries(mapping: SeedMapping, selectedAgents: readonly AgentName[]): void {\n const { skippedSkillIds, skippedAgentNames, agentsOnlySkippedSkillsCarried } = mapping;\n const skippedWith = skippedWithTheirSkills(agentsOnlySkippedSkillsCarried, selectedAgents);\n\n if (skippedSkillIds.length > 0) this.warn(skippedUnknownSkills(skippedSkillIds, skippedWith));\n if (skippedAgentNames.length > 0) this.warn(skippedUnknownAgents(skippedAgentNames));\n }\n\n /** The `--from` refusals that need the decoded selection, asked before the confirm. */\n protected async refuseSharedConfigBeforeAsking(\n selection: InstallSelection,\n carried: ExternalSkillInstall[],\n root: string,\n sourceResult: SourceLoadResult,\n ): Promise<void> {\n this.refuseUnofferablePlacementsBeforeWriting(selection.skills, root);\n try {\n await refuseUnofferedStack(selection.selectedStackId, sourceResult);\n await refuseUncarriedDestinations(carried);\n refuseUnwritableStack(selection.assignedStack, sourceResult.matrix);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Pre-flight over every row, ejected included: the per-plugin guard in `installPlugin` fires\n * mid-loop, after earlier plugins are already installed.\n */\n protected refuseUnofferablePlacementsBeforeWriting(\n skills: readonly SkillConfig[],\n root: string,\n ): void {\n try {\n refuseUnofferedPlacements(skills, hostAt(root));\n } catch (error) {\n this.error(getErrorMessage(error), { exit: EXIT_CODES.ERROR });\n }\n }\n\n protected get hasIncompleteWork(): boolean {\n return this.incompleteWork.length > 0;\n }\n\n /** Never aborts: every caller is past a mutation that has already landed. */\n protected reportIncompleteWork(what: string, recovery: string): void {\n this.warn(what);\n this.recordIncompleteWork(what, recovery);\n }\n\n /** For a caller that has already warned. */\n protected recordIncompleteWork(what: string, recovery: string): void {\n this.incompleteWork.push({ what, recovery });\n }\n\n /** Every command that records must call this; `this.exit` skips the `Error:` framing. */\n protected exitIfWorkIncomplete(): void {\n if (!this.hasIncompleteWork) return;\n\n this.log(`\\n${chalk.hex(CLI_COLORS.WARNING)(completedWithFailures(this.incompleteWork))}\\n`);\n this.exit(EXIT_CODES.COMPLETED_WITH_FAILURES);\n }\n}\n","import type { PluginHost } from \"../../hosts/plugin-host.js\";\nimport { fetchMarketplace } from \"../../loading/index.js\";\nimport { warn } from \"../../../utils/logger.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type MarketplaceResult = {\n marketplace: string | null;\n registered: boolean;\n};\n\n/**\n * Registers the marketplace, or refreshes it when it exists. A resolution failure is warned here\n * because `requireMarketplace`'s error cannot tell its cause.\n */\nexport async function ensureMarketplace(\n sourceResult: SourceLoadResult,\n host: PluginHost,\n): Promise<MarketplaceResult> {\n const marketplace = await resolveMarketplaceName(sourceResult);\n if (marketplace === null) return { marketplace: null, registered: false };\n\n const exists = await host.marketplaceExists(marketplace);\n\n if (!exists) {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await host.addMarketplace(marketplaceSource);\n return { marketplace, registered: true };\n }\n\n try {\n await host.refreshMarketplace(marketplace);\n } catch {\n warn(\"Could not update marketplace — continuing with cached version\");\n }\n\n return { marketplace, registered: false };\n}\n\n/** Fetched, and recorded on `sourceResult`, when the load left it unresolved. */\nasync function resolveMarketplaceName(sourceResult: SourceLoadResult): Promise<string | null> {\n if (sourceResult.marketplace) return sourceResult.marketplace;\n\n const source = sourceResult.sourceConfig.source;\n try {\n const marketplaceResult = await fetchMarketplace(source);\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n return sourceResult.marketplace;\n } catch (error) {\n warn(`Could not resolve a marketplace from '${source}': ${getErrorMessage(error)}`);\n return null;\n }\n}\n","import { ensureMarketplace } from \"./ensure-marketplace.js\";\nimport type { PluginHost } from \"../../hosts/plugin-host.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type MarketplaceRequirement =\n { ok: true; marketplace: string; registered: boolean } | { ok: false; error: string };\n\n/** Callers must hard-error on `ok: false`, never fall back to eject, before touching disk. */\nexport async function requireMarketplace(\n sourceResult: SourceLoadResult,\n purpose: string,\n host: PluginHost,\n): Promise<MarketplaceRequirement> {\n const mpResult = await ensureMarketplace(sourceResult, host);\n if (!mpResult.marketplace) {\n return {\n ok: false,\n error:\n `Cannot ${purpose}: marketplace could not be resolved from '${sourceResult.sourceConfig.source}'. ` +\n `Plugin install mode requires a marketplace — fix the marketplace or switch the affected skills to eject mode.`,\n };\n }\n return { ok: true, marketplace: mpResult.marketplace, registered: mpResult.registered };\n}\n","import { hostAt } from \"../../hosts/host-for.js\";\nimport { isLocalOnlySkill } from \"../../loading/multi-source-loader.js\";\nimport { buildMarketplacePluginRef } from \"../../plugins/index.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { CLI_INVOKE_COMMAND, EJECT_SOURCE } from \"../../../consts.js\";\nimport type { MergedSkillsMatrix, SkillId } from \"../../../types/index.js\";\nimport type { SkillConfig } from \"../../../types/config.js\";\n\nexport type PluginInstallResult = {\n installed: Array<{ id: SkillId; ref: string }>;\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/** Callers must error with this BEFORE config is written, or config.ts gains orphan entries. */\nexport function pluginInstallFailureError(failedCount: number): string {\n return `Failed to install ${failedCount} plugin skill(s). Plugin install intent could not be honored. Verify the skill id matches the marketplace, run '${CLI_INVOKE_COMMAND} update' to refresh the marketplace, or switch affected skills to eject mode.`;\n}\n\n/** Plugin-mode skills no marketplace carries, refusable before any install is attempted. */\nexport function unbackedPluginSkillIds(\n skills: SkillConfig[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n return skills\n .filter((skill) => skill.origin !== EJECT_SOURCE)\n .filter((skill) => isLocalOnlySkill(matrix.skills[skill.id]))\n .map((skill) => skill.id);\n}\n\nexport function unbackedPluginInstallError(ids: SkillId[]): string {\n return `Cannot install ${ids.length} skill(s) as plugins — no marketplace carries them: ${ids.join(\", \")}. A skill that exists only in this project can only be installed as a local copy. Set its Install mode to eject in the editor, or publish it to a marketplace first.`;\n}\n\n/** The host is read off the folder under `projectDir`, so that folder must already exist. */\nexport async function installPluginSkills(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginInstallResult> {\n const host = hostAt(projectDir);\n const pluginSkills = skills.filter((s) => s.origin !== EJECT_SOURCE);\n const installed: PluginInstallResult[\"installed\"] = [];\n const failed: PluginInstallResult[\"failed\"] = [];\n\n for (const skill of pluginSkills) {\n const pluginRef = buildMarketplacePluginRef(skill.id, marketplace);\n try {\n await host.installPlugin(pluginRef, skill.scope, projectDir);\n installed.push({ id: skill.id, ref: pluginRef });\n } catch (error) {\n failed.push({ id: skill.id, error: getErrorMessage(error) });\n }\n }\n\n return { installed, failed };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,sBAA4B;AAC1C,UAAQ,OAAO,MAAM,sBAAsB;AAC7C;AAEO,SAAS,sBAAsB,SAAiB,MAAuB;AAC5E,SAAO,WAAW,kBAAkB,QAAQ,QAAQ,kBAAkB;AACxE;AAMO,SAAS,8BAA8B,SAAyB;AACrE,QAAM,QACJ,UAAU,kBAAkB,OACxB,oBAAoB,kBAAkB,IAAI,MAC1C,mBAAmB,kBAAkB,IAAI;AAC/C,SAAO,YAAY,KAAK;AAC1B;;;ACrBO,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKX,yBAAyB;AAC3B;;;ACXA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,eAAe;;;ACFxB,SAAS,SAAS,WAAW,aAAa,qBAAqB;AAS/D,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AAQZ,SAAS,kBACd,UACA,EAAE,IAAI,YAAY,GACV;AACR,QAAM,QAAQ,SAAS,EAAE;AACzB,QAAM,QAAQ,kBAAkB,KAAK,QAAQ;AAG7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EAAQ,KAAK;AAAA,eAAkB,WAAW;AAAA;AAAA;AAAA,EAAY,QAAQ;AAAA,EACvE;AAEA,QAAM,CAAC,OAAO,SAAS,EAAE,IAAI;AAC7B,QAAM,UAAU,WAAW,KAAK,MAAM,IAClC,OAAO,QAAQ,YAAY,KAAK,IAChC,GAAG,KAAK;AAAA,EAAK,MAAM;AAEvB,SAAO;AAAA,EAAQ,OAAO;AAAA,KAAQ,SAAS,MAAM,MAAM,MAAM,CAAC;AAC5D;AAEO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,MAAM,GAAG;AACrC,SAAO,IAAI,KAAK;AAClB;AAkBO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,SAAO;AAAA,IACL,QAAQ,mBAAmB,MAAM,IAAI;AAAA,IACrC;AAAA,IACA,GAAG;AAAA,IACH,aAAa,MAAM;AAAA,IACnB,MAAM;AAAA,IACN,UAAU,MAAM;AAAA,IAChB;AAAA,IACA,gBAAgB,WAAW,MAAM,WAAW;AAAA,IAC5C,QAAQ;AAAA,EACV;AACF;AAGA,IAAM,6BAA6B;AAEnC,IAAM,WAAW;AAGjB,SAAS,WAAW,aAA6B;AAC/C,MAAI,YAAY,UAAU,2BAA4B,QAAO;AAE7D,QAAM,aAAa,6BAA6B,SAAS;AACzD,QAAM,OAAO,YAAY,MAAM,GAAG,UAAU;AAE5C,QAAM,cAAc,YAAY,UAAU,MAAM;AAEhD,SAAO,GAAG,cAAc,KAAK,QAAQ,IAAI,gBAAgB,IAAI,CAAC,GAAG,QAAQ;AAC3E;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,QAAM,YAAY,KAAK,YAAY,GAAG;AACtC,UAAQ,YAAY,IAAI,KAAK,MAAM,GAAG,SAAS,IAAI,MAAM,QAAQ;AACnE;AAUA,eAAsB,mBACpB,SACwB;AACxB,QAAM,WAAW,kBAAkB,WAAW,QAAQ,MAAM,KAAK,GAAG;AAAA,IAClE,IAAI,QAAQ;AAAA,IACZ,aAAa,QAAQ,MAAM;AAAA,EAC7B,CAAC;AAED,SAAO;AAAA,IACL,GAAG,QAAQ,MAAM;AAAA,IACjB,CAAC,eAAe,QAAQ,GAAG;AAAA,IAC3B,CAAC,eAAe,aAAa,GAAG,MAAM,aAAa,SAAS,QAAQ;AAAA,EACtE;AACF;AAGA,IAAM,0BACJ;AAGF,IAAM,kBAAkB;AAGxB,eAAe,aACb,SACA,UACiB;AACjB,QAAM,WAAW,qBAAqB;AAAA,IACpC,GAAG;AAAA,IACH,SAAS,gBAAgB,QAAQ,MAAM,KAAK;AAAA,EAC9C,CAAC;AACD,QAAM,QAAQ,MAAM,gBAAgB,SAAS,QAAQ;AAErD,SAAO,eAAe,eAAe,UAAU,KAAK,CAAC;AACvD;AAEA,eAAe,gBACb,SACA,UACiC;AACjC,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,aAAa,MAAM,cAAc,QAAQ;AAAA,IACzC,MAAM,QAAQ;AAAA,IACd,QAAQ,GAAG,aAAa,GAAG,QAAQ,MAAM,IAAI;AAAA,IAC7C,MAAM,QAAQ,MAAM;AAAA,EACtB;AACF;AAGA,IAAM,iBAAiB,CAAC,aACtB,GAAG,uBAAuB;AAAA,EAAK,cAAc,UAAU;AAAA,EACrD,WAAW;AACb,CAAC,CAAC;AAMJ,SAAS,eACP,UACA,YACyB;AACzB,QAAM,EAAE,YAAY,WAAW,GAAG,KAAK,IAAI;AAC3C,SAAO,EAAE,GAAG,MAAM,WAAW;AAC/B;AAGA,SAAS,gBAAgB,OAAsD;AAC7E,QAAM,UAAU,MAAM,eAAe,aAAa;AAClD,MAAI,YAAY,OAAW,QAAO;AAElC,QAAM,SAAS,WAAW,OAAO;AACjC,SAAO,UAAU,MAAM,KAAK,sBAAsB,MAAM,IAAI,SAAS;AACvE;AAEA,SAAS,WAAW,MAAuB;AACzC,MAAI;AACF,WAAO,UAAU,IAAI;AAAA,EACvB,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,YAAY,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,sBAAsB,CAAC,WAAW,eAAe,MAAM;AAC7D,IAAM,sBAAsB,CAAC,UAAU,MAAM;AAE7C,SAAS,sBAAsB,UAA4C;AACzE,MAAI,CAAC,OAAO,OAAO,UAAU,YAAY,EAAG,QAAO;AAEnD,QAAM,aAAa,SAAS;AAC5B,SACE,UAAU,UAAU,KACpB,oBAAoB,MAAM,CAAC,QAAQ,OAAO,WAAW,GAAG,MAAM,QAAQ,KACtE,oBAAoB;AAAA,IAClB,CAAC,QACC,CAAC,OAAO,OAAO,YAAY,GAAG,KAAK,OAAO,WAAW,GAAG,MAAM;AAAA,EAClE;AAEJ;AAEA,SAAS,WAAW,OAA8B;AAChD,QAAM,WAAW,MAAM,eAAe,QAAQ;AAC9C,MAAI,aAAa,QAAW;AAC1B,UAAM,IAAI;AAAA,MACR,wCAAwC,eAAe,QAAQ;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAM,sBAAsB;AAG5B,eAAe,cAAc,MAA+B;AAC1D,QAAM,SAAS,MAAM,OAAO,OAAO;AAAA,IACjC;AAAA,IACA,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC/B;AACA,SAAO,MAAM,IAAI,WAAW,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB;AACnE;AAEA,IAAM,QAAQ,CAAC,UACb,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;;;AD1LzE,SAAS,mBAAmB,KAAwB;AAClD,SAAO;AAAA,IACL;AAAA,IAEA,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE;AAAA,IAC5B;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAGA,SAAS,kBAAkB,SAA0C;AACnE,SAAO,aAAyC,QAAQ,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM;AAC/F,UAAM,QAAQ,QAAQ,OAAO,EAAE;AAC/B,WAAO,QAAQ,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC;AAAA,EAC3C,CAAC;AACH;AAEA,SAAS,iBAAiB,WAA0C;AAClE,SAAO,UAAU,OAAO,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;AACtF;AAMA,SAAS,qBACP,WACAA,SACW;AACX,SAAO,UAAU,OAAO,CAAC,EAAE,GAAG,MAAM,sBAAsB,IAAIA,OAAM,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;AAC3F;AAEA,IAAM,sBAA4C,IAAI,IAAI,UAAU,gBAAgB,MAAM,CAAC;AAE3F,SAAS,sBAAsB,IAAaA,SAAqC;AAC/E,SAAO,sBAAsBA,QAAO,OAAO,EAAE,CAAC,KAAK,oBAAoB,IAAI,EAAE;AAC/E;AAMA,SAAS,sBAAsB,WAA+C;AAC5E,SAAO,cAAc,UAAa,UAAU,UAAU;AACxD;AAEA,SAAS,0BAA0B,KAAwB;AACzD,SAAO;AAAA,IACL;AAAA,IAEA,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE;AAAA,IAC5B;AAAA,EAGF,EAAE,KAAK,IAAI;AACb;AAGA,SAAS,aAAa,IAAwB;AAC5C,SAAO;AACT;AAEA,SAAS,iBAAiB,IAAa,OAAmB,YAA4B;AACpF,SAAO,KAAK,KAAK,oBAAoB,YAAY,KAAK,EAAE,WAAW,EAAE;AACvE;AAEA,SAAS,uBAAuB,SAA8C;AAC5E,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,MAAM,aAAa,QAAQ,EAAE;AAAA,IAC7B,aAAa,QAAQ,MAAM;AAAA,IAC3B,aAAa,QAAQ,MAAM;AAAA;AAAA,IAE3B,UAAU,QAAQ,MAAM;AAAA,IACxB,QAAQ,mBAAmB,QAAQ,MAAM,IAAI;AAAA,IAC7C,MAAM,GAAG,iBAAiB,IAAI,QAAQ,EAAE;AAAA,IACxC,eAAe,CAAC;AAAA,IAChB,UAAU,CAAC;AAAA,IACX,cAAc,CAAC;AAAA,IACf,aAAa,CAAC;AAAA,IACd,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW,QAAQ;AAAA,EACrB;AACF;AAGA,SAAS,kBACP,EAAE,IAAI,OAAO,MAAM,GACnBA,SACA,YACwB;AACxB,QAAM,SAAS,kBAAkB,MAAM,UAAU;AACjD,MAAI,WAAW,OAAW,QAAO,CAAC;AAElC,QAAM,UAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AAAA,IACb,UAAU,iBAAiB,IAAI,MAAM,OAAO,UAAU;AAAA,EACxD;AAEA,EAAAA,QAAO,OAAO,EAAE,IAAI,uBAAuB,OAAO;AAClD,YAAUA,QAAO,SAAS,aAAa,EAAE,GAAG,EAAE;AAE9C,SAAO,CAAC,OAAO;AACjB;AAGA,SAAS,uBAAuB,KAAuB;AACrD,SAAO;AAAA,IACL;AAAA,IAEA,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,IAC5C;AAAA,EAKF,EAAE,KAAK,IAAI;AACb;AAOO,SAAS,uBACd,SACAA,SACA,YACwB;AACxB,QAAM,oBAAoB,6BAA6B,OAAO;AAC9D,MAAI,kBAAkB,SAAS,EAAG,OAAM,IAAI,MAAM,uBAAuB,iBAAiB,CAAC;AAE3F,QAAM,YAAY,kBAAkB,OAAO;AAC3C,QAAM,WAAW,iBAAiB,SAAS;AAC3C,QAAM,YAAY,qBAAqB,WAAWA,OAAM;AAExD,MAAI,SAAS,SAAS,EAAG,OAAM,IAAI,MAAM,mBAAmB,QAAQ,CAAC;AACrE,MAAI,UAAU,SAAS,EAAG,OAAM,IAAI,MAAM,0BAA0B,SAAS,CAAC;AAE9E,SAAO,UAAU,QAAQ,CAAC,aAAa,kBAAkB,UAAUA,SAAQ,UAAU,CAAC;AACxF;AAMA,eAAsB,oBAAoB,UAAsD;AAC9F,QAAM,4BAA4B,QAAQ;AAE1C,QAAM,UAAU,MAAM,QAAQ,IAAI,SAAS,IAAI,kBAAkB,CAAC;AAClE,SAAO,WAAW,OAAO;AAC3B;AAEA,IAAM,qBAAqB;AAG3B,eAAsB,wBACpB,UACoB;AACpB,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,QAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,GAAG,OAAO,GAAG,kBAAkB,CAAC;AACxE,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,SAAS,IAAI,OAAO,YAAY,mBAAmB,MAAM,cAAc,SAAS,OAAO,CAAC,CAAC;AAAA,IAC3F;AACA,WAAO,WAAW,OAAO;AAAA,EAC3B,UAAE;AACA,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAEA,eAAe,cACb,SACA,SAC+B;AAC/B,QAAM,WAAW,KAAK,KAAK,SAAS,QAAQ,EAAE;AAC9C,MAAI,MAAM,gBAAgB,QAAQ,QAAQ,EAAG,OAAM,KAAK,QAAQ,UAAU,QAAQ;AAClF,SAAO,EAAE,GAAG,SAAS,SAAS;AAChC;AAIA,SAAS,WAAW,SAAoC;AACtD,SAAO,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;AACpE;AAGA,eAAe,mBAAmB,SAAsD;AACtF,QAAM,QAAQ,aAA6B,MAAM,YAAY,OAAO,CAAC;AACrE,sBAAoB,QAAQ,UAAU,KAAK;AAE3C,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,MAAM;AAAA,MAAI,CAAC,CAAC,cAAc,QAAQ,MAChC,eAAe,KAAK,KAAK,QAAQ,UAAU,YAAY,GAAG,QAAQ;AAAA,IACpE;AAAA,EACF;AACA,SAAO,EAAE,IAAI,QAAQ,IAAI,SAAS,QAAQ,KAAK,OAAO,EAAE;AAC1D;AAGA,SAAS,oBAAoB,UAAkB,OAAiC;AAC9E,aAAW,CAAC,YAAY,KAAK,OAAO;AAClC,sBAAkB,KAAK,KAAK,UAAU,YAAY,GAAG,UAAU,YAAY;AAAA,EAC7E;AACF;AAGA,eAAe,YAAY,SAAuD;AAChF,QAAM,UAAU,MAAM,oBAAoB,OAAO;AACjD,QAAM,YAAY,MAAM,gBAAgB,SAAS,OAAO;AACxD,SAAO,aAAa,YAAY,SAAS,SAAS,eAAe,CAAC;AACpE;AAMA,eAAe,gBACb,SACA,SAC+B;AAC/B,QAAM,YAAY,MAAM,uBAAuB,QAAQ,QAAQ,IAAI;AACnE,MAAI,aAAa,OAAW,QAAO;AAEnC,QAAM,OAAO,MAAM,YAAY,SAAS,SAAS,QAAQ;AACzD,QAAM,SAAS,MAAM,YAAY,KAAK,KAAK,QAAQ,UAAU,eAAe,aAAa,CAAC;AAC1F,SAAO,KAAK,eAAe,aAAa,MAAM,SAAS,OAAO;AAChE;AAEA,SAAS,YACP,SACA,OACA,MACwB;AACxB,SAAO,mBAAmB;AAAA,IACxB,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,eAAe,qBAAqB,QAAQ,MAAM,UAAU;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;AAGA,eAAe,oBAAoB,SAA2D;AAC5F,MAAI,OAAO,OAAO,QAAQ,MAAM,OAAO,eAAe,aAAa,EAAG,QAAO,QAAQ;AAErF,QAAM,SAAS,MAAM,YAAY,KAAK,KAAK,QAAQ,UAAU,eAAe,aAAa,CAAC;AAC1F,MAAI,WAAW,KAAM,QAAO,QAAQ;AAEpC,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,OAAO,EAAE,GAAG,QAAQ,MAAM,OAAO,CAAC,eAAe,aAAa,GAAG,OAAO;AAAA,EAC1E;AACF;AAEA,eAAe,YAAY,UAA0C;AACnE,SAAQ,MAAM,WAAW,QAAQ,IAAK,SAAS,QAAQ,IAAI;AAC7D;AAEA,eAAe,eAAe,UAAkB,UAAoC;AAClF,MAAK,MAAM,YAAY,QAAQ,MAAO,SAAU,QAAO;AACvD,QAAM,UAAU,UAAU,QAAQ;AAClC,SAAO;AACT;AAQA,eAAsB,4BAA4B,UAAiD;AACjG,QAAM,SAAS,MAAM,QAAQ,IAAI,SAAS,IAAI,gBAAgB,CAAC;AAC/D,QAAM,UAAU,OAAO,OAAO,CAAC,gBAAgB,gBAAgB,IAAI;AAEnE,MAAI,QAAQ,SAAS,EAAG,OAAM,IAAI,MAAM,0BAA0B,OAAO,CAAC;AAC5E;AAEA,eAAe,iBAAiB,SAAmE;AACjG,QAAM,EAAE,IAAI,SAAS,IAAI;AACzB,MAAI,CAAE,MAAM,gBAAgB,QAAQ,EAAI,QAAO;AAC/C,OAAK,MAAM,uBAAuB,QAAQ,IAAI,SAAS,OAAW,QAAO;AACzE,SAAO,EAAE,IAAI,SAAS;AACxB;AAEA,SAAS,0BAA0B,SAAuC;AACxE,SAAO;AAAA,IACL;AAAA,IAGA,GAAG,QAAQ,IAAI,CAAC,EAAE,IAAI,SAAS,MAAM,KAAK,EAAE,SAAS,QAAQ,EAAE;AAAA,IAC/D;AAAA,EAIF,EAAE,KAAK,IAAI;AACb;AAcA,SAAS,sBAAsB,IAAoB;AACjD,SAAO,GAAG,EAAE;AACd;AAEA,SAAS,0BAA0B,IAAY,QAAwB;AACrE,SAAO,GAAG,EAAE,+CAA+C,MAAM;AACnE;AAGA,SAAS,YAAY,KAA6C;AAChE,MAAI,QAAQ,UAAa,CAAC,IAAI,WAAW,cAAc,aAAa,EAAG,QAAO;AAC9E,SAAO,IAAI,MAAM,cAAc,cAAc,MAAM;AACrD;AAEA,IAAM,0BAA0B,uCAAuC,eAAe,QAAQ;AAE9F,SAAS,oBAAoB,OAAsB,UAAiC;AAClF,QAAM,WAAW,MAAM,eAAe,QAAQ;AAC9C,MAAI,aAAa,OAAW,QAAO;AAEnC,QAAM,cAAc,iBAAiB,UAAU,KAAK,KAAK,UAAU,eAAe,QAAQ,CAAC;AAC3F,SAAO,gBAAgB,OAAO,OAAO,YAAY;AACnD;AAEA,eAAe,cAAc,UAA0C;AACrE,QAAM,QAAQ,MAAM,KAAK,QAAQ,UAAU,EAAE,KAAK,KAAK,CAAC;AACxD,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,MAAM,IAAI,OAAO,SAAS,CAAC,MAAM,MAAM,SAAS,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,CAAU;AAAA,EACtF;AACA,SAAO,OAAO,YAAY,OAAO;AACnC;AAMA,eAAe,iBAAiB,EAAE,IAAI,UAAU,WAAW,GAAwC;AAEjG,MAAI,WAAW,SAAS,OAAW,QAAO,EAAE,SAAS,UAAU;AAE/D,QAAM,OAAO,YAAY,WAAW,MAAM;AAC1C,MAAI,SAAS,OAAW,QAAO,EAAE,SAAS,eAAe,MAAM,sBAAsB,EAAE,EAAE;AAEzF,QAAM,YAAY,MAAM,kBAAkB,KAAK,KAAK,UAAU,eAAe,aAAa,CAAC;AAC3F,MAAI,CAAC,UAAU,QAAQ;AACrB,WAAO,EAAE,SAAS,eAAe,MAAM,0BAA0B,IAAI,UAAU,MAAM,EAAE;AAAA,EACzF;AAEA,QAAM,QAAQ,MAAM,cAAc,QAAQ;AAC1C,QAAM,cAAc,oBAAoB,OAAO,QAAQ;AACvD,MAAI,gBAAgB,MAAM;AACxB,WAAO,EAAE,SAAS,eAAe,MAAM,0BAA0B,IAAI,uBAAuB,EAAE;AAAA,EAChG;AAEA,QAAM,SAAS,wBAAwB,UAAU;AAAA,IAC/C,aAAa,UAAU,SAAS;AAAA,IAChC;AAAA,IACA,YAAY,UAAU,SAAS;AAAA,IAC/B;AAAA,IACA,MAAM,WAAW;AAAA,IACjB;AAAA,EACF,CAAC;AACD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI;AAC1E,WAAO,EAAE,SAAS,eAAe,MAAM,0BAA0B,IAAI,MAAM,EAAE;AAAA,EAC/E;AAEA,SAAO,EAAE,SAAS,WAAW,IAAI,OAAO,OAAO,KAAK;AACtD;AAGA,eAAsB,kBAAkB,OAAiD;AACvF,QAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,IAAI,gBAAgB,CAAC;AAE3D,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,MACf,MAAM,QAAQ,CAAC,SAAU,KAAK,YAAY,YAAY,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAE;AAAA,IACrF;AAAA,IACA,aAAa,MAAM,QAAQ,CAAC,SAAU,KAAK,YAAY,gBAAgB,CAAC,KAAK,IAAI,IAAI,CAAC,CAAE;AAAA,EAC1F;AACF;;;AE/bA,OAAOC,SAAQ;AAEf,SAAS,aAAa,MAAM,WAAW,YAAY;AAuDnD,IAAM,eAAkC;AAAA,EACtC,kBAAkB,CAAC;AAAA,EACnB,qBAAqB,CAAC;AACxB;AAMO,SAAS,sBAAsB,SAAmD;AACvF,QAAM,EAAE,SAAS,UAAU,IAAI;AAC/B,MAAI,CAAC,UAAW,QAAO,mBAAmB,OAAO;AAEjD,QAAM,aAAa,aAAa,SAAS,SAAS;AAClD,MAAI,WAAW,WAAW,EAAG,QAAO,mBAAmB,OAAO;AAE9D,QAAM,EAAE,QAAQ,WAAW,IAAI,gBAAgB,SAAS,WAAW,UAAU;AAC7E,SAAO,EAAE,QAAQ,MAAM,aAAa,SAAS,UAAU,GAAG,WAAW;AACvE;AAEA,SAAS,mBAAmB,SAAmD;AAC7E,SAAO,EAAE,QAAQ,SAAS,MAAM,cAAc,YAAY,CAAC,EAAE;AAC/D;AAGA,SAAS,aAAa,SAA2B,WAAyC;AACxF,QAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAErE,SAAO,UAAU,OAAO;AAAA,IACtB,CAAC,UAAU,CAAC,MAAM,YAAY,CAAC,MAAM,IAAI,MAAM,EAAE,KAAK,aAAa,OAAO,OAAO;AAAA,EACnF;AACF;AAEA,SAAS,aAAa,OAAoB,SAAoC;AAC5E,SAAO,QAAQ,aAAa,IAAI,MAAM,EAAE,KAAK,QAAQ,YAAY,IAAI,MAAM,EAAE;AAC/E;AAIA,SAAS,aAAa,SAA2B,YAA8C;AAC7F,QAAM,aAAa,CAAC,WAClB,WAAW,OAAO,CAAC,UAAU,WAAW,OAAO,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,UAAU,MAAM,EAAE;AAE7F,SAAO;AAAA,IACL,kBAAkB,WAAW,UAAU;AAAA,IACvC,qBAAqB,WAAW,aAAa;AAAA,EAC/C;AACF;AAGA,SAAS,WAAW,OAAoB,SAAuC;AAC7E,SAAO,QAAQ,aAAa,IAAI,MAAM,EAAE,IAAI,aAAa;AAC3D;AAEA,SAAS,gBACP,SACA,WACA,YACuD;AACvD,QAAM,aAA+B;AAAA,IACnC,GAAG;AAAA,IACH,QAAQ,CAAC,GAAG,QAAQ,QAAQ,GAAG,UAAU;AAAA,IACzC,iBAAiB,gBAAgB,QAAQ,iBAAiB,UAAU;AAAA,EACtE;AACA,QAAM,EAAE,eAAe,WAAW,IAAI,kBAAkB,QAAQ,eAAe,UAAU,OAAO;AAAA,IAC9F,cAAc,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAAA,IACzD,iBAAiB,IAAI,IAAI,QAAQ,cAAc;AAAA,EACjD,CAAC;AACD,SAAO,EAAE,QAAQ,EAAE,GAAG,YAAY,cAAc,GAAG,WAAW;AAChE;AAEA,SAAS,gBAAgB,UAAoB,YAAqC;AAChF,QAAM,cAAc,WAAW,QAAQ,CAAC,UAAU,cAAc,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/E,QAAM,UAAU,YAAY,OAAO,CAAC,WAAW,CAAC,SAAS,SAAS,MAAM,CAAC;AACzE,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,SAAO,aAAa,CAAC,GAAG,UAAU,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC;AACxD;AAGA,SAAS,cAAc,SAAsC;AAC3D,QAAM,WAAW,OAAO,OAAO,OAAO,GAAG;AACzC,SAAO,aAAa,SAAY,SAAY,kBAAkB,QAAQ;AACxE;AAgBA,SAAS,kBACP,UACA,gBACA,QACU;AACV,QAAM,SAAS,CAAC,WAAqB,QACnC,OAAO,aAAa,IAAI,IAAI,EAAE;AAEhC,SAAO,aAA0C,kBAAkB,CAAC,CAAC,EAClE,OAAO,CAAC,CAAC,KAAK,MAAM,OAAO,gBAAgB,IAAI,KAAK,CAAC,EACrD;AAAA,IACC,CAAC,SAAS,CAAC,OAAO,UAAU,MAC1B,kBAAkB,SAAS,OAAO,UAAU,YAAY,MAAM,GAAG,SAAS,KAAK,CAAC;AAAA,IAClF,EAAE,eAAe,UAAU,YAAY,CAAC,EAAE;AAAA,EAC5C;AACJ;AAEA,SAAS,kBACP,SACA,OACA,UACA,aACU;AACV,QAAM,SAAS,0BAA0B,WAAW;AACpD,QAAM,CAAC,WAAW,OAAO,IAAI,UAAU,UAAU,CAAC,CAAC,QAAQ,MAAM,OAAO,IAAI,QAAQ,CAAC;AAErF,SAAO;AAAA,IACL,eAAe,iBAAiB,QAAQ,eAAe,OAAO,OAAO;AAAA,IACrE,YAAY;AAAA,MACV,GAAG,QAAQ;AAAA,MACX,GAAG,UAAU,IAAI,CAAC,CAAC,UAAU,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,WAAW,OAAO,SAAS,EAAE;AAAA,IACzF;AAAA,EACF;AACF;AAGO,SAAS,yBACd,SACA,WACA,SACA,aACkB;AAClB,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,WAAW,gBAAgB,SAAS,WAAW,WAAW;AAChE,QAAM,WAAW,IAAI,IAAI,QAAQ,cAAc;AAC/C,QAAM,wBAAwB,CAAC,UAC7B,CAAC,MAAM,YAAY,SAAS,IAAI,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,MAAM,IAAI;AAEzE,QAAM,YAAY,UAAU,OAAO,OAAO,qBAAqB;AAC/D,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,CAAC,GAAG,QAAQ,gBAAgB,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAAA,IACnF,cAAc,CAAC,GAAG,QAAQ,cAAc,GAAG,SAAS;AAAA,EACtD;AACF;AAGA,SAAS,gBACP,SACA,WACA,aACa;AACb,QAAM,OAAO,IAAI;AAAA,IACf,UAAU,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,EAC7E;AACA,QAAM,oBAAoB,CAAC,CAAC,EAAE,MAC5B,YAAY,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE;AACpC,QAAM,mBAAmB,CAAC,SAA0B,QAAQ,OAAO,IAAI,GAAG,OAAO;AAEjF,SAAO,IAAI;AAAA,IACT,aAAgC,QAAQ,MAAM,EAC3C,OAAO,iBAAiB,EACxB,QAAQ,CAAC,CAAC,EAAE,KAAK,MAAM,UAAkB,MAAM,WAAW,CAAC,EAC3D,OAAO,gBAAgB;AAAA,EAC5B;AACF;AAKA,eAAsB,oBAAoB,YAAqD;AAC7F,QAAM,SAAS,MAAM,yBAAyBC,IAAG,QAAQ,GAAG,cAAc,UAAU,CAAC;AACrF,SAAO,QAAQ,UAAU;AAC3B;AAcA,IAAM,oBAA6B,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE;AAG3D,SAAS,oBACd,SACA,WACY;AACZ,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAa,iBAAiB,UAAU,QAAQ,CAAC,UAAU,MAAM,EAAE;AACzE,QAAM,aAAa,iBAAiB,UAAU,QAAQ,CAAC,UAAU,MAAM,IAAI;AAC3E,QAAM,SAAS,aAAa,QAAQ,QAAQ,YAAY,CAAC,UAAU,MAAM,EAAE;AAC3E,QAAM,SAAS,aAAa,QAAQ,cAAc,YAAY,CAAC,UAAU,MAAM,IAAI;AACnF,QAAM,gBAAgB,OAAO,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,EAAE;AACxD,QAAM,kBAAkB,OAAO,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,IAAI;AAC5D,QAAM,EAAE,eAAe,OAAO,IAAI,aAAa,QAAQ,eAAe,UAAU,OAAO;AAAA,IACrF,YAAY;AAAA,IACZ,iBAAiB,IAAI,IAAI,aAAa;AAAA,EACxC,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,QAAQ,QAAQ,OAAO,IAAI,OAAO,MAAM,CAAC;AAAA,MACzC,cAAc,QAAQ,aAAa,IAAI,OAAO,MAAM,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,IACA,WAAW,EAAE,UAAU,eAAe,YAAY,gBAAgB;AAAA,IAClE,iBAAiB;AAAA,MACf,UAAU,sBAAsB,MAAM;AAAA,MACtC,YAAY,sBAAsB,QAAQ;AAAA,QACxC,QAAQ,QAAQ;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,OAAuC;AACpE,SAAO,MAAM,OAAO,CAAC,SAAS,CAAC,cAAc,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,EAAE;AACjF;AAEA,SAAS,cAAc,EAAE,OAAO,KAAK,GAA+B;AAClE,SAAO,MAAM,WAAW,KAAK;AAC/B;AASA,SAAS,sBAAsB,OAAiC,MAAkC;AAChG,QAAM,cAAc,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE,QAAM,WAAW,CAAC,SAChB,CAAC,cAAc,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,MAAM,IAAI;AAEhE,SAAO,MAAM,OAAO,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,IAAI;AAC7D;AAEA,SAAS,cAAc,EAAE,OAAO,KAAK,GAA2B,MAA8B;AAC5F,SACE,MAAM,UAAU,KAAK,SACrB,MAAM,eAAe,KAAK,cAC1B,MAAM,WAAW,KAAK,UACtB,gBAAgB,KAAK,OAAO,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC;AAElE;AAGO,SAAS,uBACd,SACA,WACY;AACZ,QAAM,OAAO,oBAAoB,SAAS,SAAS;AACnD,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,UAAU,cAAc,KAAK,QAAQ,SAAS;AACpD,QAAM,EAAE,UAAU,WAAW,IAAI,KAAK;AACtC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,kBAAkB,KAAK,QAAQ,WAAW,OAAO;AAAA,IACzD,iBAAiB;AAAA,MACf,UAAU,CAAC,GAAG,UAAU,GAAG,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAAA,MAClE,YAAY,CAAC,GAAG,YAAY,GAAG,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,SAAS,iBACP,SACA,OACiB;AACjB,SAAO,IAAI;AAAA,IACT,QAAQ,OAAO,CAAC,UAAU,WAAW,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC;AAAA,EAC7F;AACF;AAIA,SAAS,OAAc,OAA+C;AACpE,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;AACrE,SAAO,CAAC,UAAU,QAAQ,IAAI,KAAK,KAAK;AAC1C;AAEA,SAAS,aACP,SACA,WACA,OACe;AACf,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,UAAU,IAAI,MAAM,KAAK,CAAC;AACvC,WAAO,SAAS,UAAa,WAAW,OAAO,QAAQ,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA,EAClF,CAAC;AACH;AAGO,SAAS,gBACd,MACA,OACS;AACT,SAAO,YAAY,eAAe,IAAI,GAAG,eAAe,KAAK,CAAC;AAChE;AAEA,SAAS,eAAe,YAAoD;AAC1E,SAAO,aAA0C,cAAc,CAAC,CAAC,EAC9D;AAAA,IAAQ,CAAC,CAAC,UAAU,WAAW,MAC9B,YAAY,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,EAAE,IAAI,IAAI,cAAc,IAAI,EAAE;AAAA,EAC5E,EACC,KAAK;AACV;AAEA,SAAS,kBACP,UACA,gBACA,YAC8C;AAC9C,SAAO,EAAE,GAAG,KAAK,UAAU,UAAU,GAAG,GAAG,KAAK,kBAAkB,CAAC,GAAG,UAAU,EAAE;AACpF;AAWA,SAAS,aACP,UACA,gBACA,MACW;AACX,QAAM,cAAc,kBAAkB,UAAU,gBAAgB,KAAK,UAAU;AAC/E,QAAM,WAAW,KAAK,WAAW,IAAI,CAAC,eAA6B;AAAA,IACjE;AAAA,IACA,MAAM,aAAa,SAAS,SAAS,GAAG,YAAY,SAAS,GAAG,KAAK,eAAe;AAAA,EACtF,EAAE;AAEF,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,MACtB,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,iBAAiB,OAAO,WAAW,IAAI;AAAA,MACvE;AAAA,IACF;AAAA,IACA,QAAQ,SAAS,OAAO,CAAC,EAAE,KAAK,MAAM,KAAK,SAAS,CAAC,EAAE,IAAI,QAAQ;AAAA,EACrE;AACF;AAEA,SAAS,SAAS,EAAE,WAAW,KAAK,GAA8B;AAChE,SAAO,EAAE,WAAW,UAAU,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,EAAE,EAAE;AAC9D;AAEA,SAAS,aACP,QACA,WACA,iBAC+B;AAC/B,QAAM,gBAAgB,IAAI,IAAI,OAAO,SAAS,CAAC;AAC/C,QAAM,SAAS,0BAA0B,SAAS;AAClD,QAAM,UAAU,CAAC,UAAoB,QACnC,CAAC,gBAAgB,IAAI,IAAI,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ;AAEpF,SAAO,UAAU,QAAQ,OAAO;AAClC;AAEA,SAAS,OAAO,YAAqD;AACnE,SAAO,YAAyC,cAAc,CAAC,CAAC,EAAE;AAAA,IAAQ,CAAC,SACzE,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE;AAAA,EAC1B;AACF;AAGA,SAAS,0BAA0B,YAAyD;AAC1F,QAAM,cAAc,CAAC,aACnB,OAAO,WAAW,QAAQ,GAAG,cAAc;AAE7C,SAAO,IAAI;AAAA,IACT,aAA0C,cAAc,CAAC,CAAC,EACvD,OAAO,CAAC,CAAC,UAAU,IAAI,MAAM,KAAK,SAAS,KAAK,YAAY,QAAQ,CAAC,EACrE,IAAI,CAAC,CAAC,QAAQ,MAAM,QAAQ;AAAA,EACjC;AACF;AAEA,SAAS,iBACP,OACA,WACA,OAC8C;AAC9C,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,WAAW,MAAM,SAAS,KAAK,CAAC,GAAG,KAAK,EAAE;AAC5E;AAEA,SAAS,UACP,YACA,MAC+B;AAC/B,SAAO,aAA0C,cAAc,CAAC,CAAC,EAAE;AAAA,IAAQ,CAAC,CAAC,UAAU,IAAI,MACzF,KACG,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,EACnC,IAAI,CAAC,QAAqC,CAAC,UAAU,GAAG,CAAC;AAAA,EAC9D;AACF;AAEA,SAAS,WACP,YACA,OACkB;AAClB,SAAO,MAAM;AAAA,IACX,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAI,KAAK,QAAQ,KAAK,CAAC,GAAI,GAAG,EAAE;AAAA,IACpF;AAAA,EACF;AACF;AAIA,SAAS,cAAc,QAA0B,WAA2C;AAC1F,QAAM,gBAAgB,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AACpE,QAAM,kBAAkB,IAAI,IAAI,OAAO,aAAa,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAE9E,SAAO;AAAA,IACL,QAAQ,CAAC,GAAG,iBAAiB,UAAU,QAAQ,CAAC,UAAU,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;AAAA,MAC5E,CAAC,UAAU,CAAC,cAAc,IAAI,MAAM,EAAE;AAAA,IACxC;AAAA,IACA,QAAQ,CAAC,GAAG,iBAAiB,UAAU,QAAQ,CAAC,UAAU,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE;AAAA,MAC9E,CAAC,UAAU,CAAC,gBAAgB,IAAI,MAAM,IAAI;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,SAAS,kBACP,QACA,WACA,SACkB;AAClB,QAAM,oBAAoB,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAElE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,CAAC,GAAG,OAAO,QAAQ,GAAG,QAAQ,MAAM;AAAA,IAC5C,cAAc,CAAC,GAAG,OAAO,cAAc,GAAG,QAAQ,MAAM;AAAA,IACxD,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,gBAAgB,GAAG,iBAAiB,CAAC,CAAC;AAAA,IAC7E,iBAAiB,gBAAgB,OAAO,iBAAiB,QAAQ,MAAM;AAAA,IACvE,eAAe,kBAAkB,OAAO,eAAe,UAAU,OAAO,iBAAiB;AAAA,EAC3F;AACF;AAEO,SAAS,qBACd,SACA,MACS;AACT,QAAM,YAAY,IAAI,IAAI,KAAK,UAAU,QAAQ;AACjD,SAAO,QAAQ,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,MAAM,EAAE,CAAC;AAC3D;AAIO,SAAS,gBAAgB,QAAuB,QAAsC;AAC3F,SAAO;AAAA,IACL,SAAS,gBAAgB,QAAQ,QAAQ,SAAS;AAAA,IAClD,QAAQ,gBAAgB,QAAQ,QAAQ,QAAQ;AAAA,EAClD;AACF;AAEA,SAAS,gBACP,QACA,QACA,OACS;AACT,SAAO;AAAA,IACL,UAAU,OAAO,OAAO,CAAC,UAAU,WAAW,OAAO,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,IACpF,YAAY,OAAO,OAAO,CAAC,UAAU,WAAW,OAAO,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC1F;AACF;AAEA,SAAS,gBAAgB,MAA4B;AACnD,QAAM,oBAAoB,IAAI,IAAI,KAAK,UAAU,QAAQ;AACzD,QAAM,sBAAsB,IAAI,IAAI,KAAK,UAAU,UAAU;AAC7D,SAAO;AAAA,IACL,KAAK,OAAO,OAAO,OAAO,CAAC,UAAU,CAAC,kBAAkB,IAAI,MAAM,EAAE,CAAC;AAAA,IACrE,KAAK,OAAO,aAAa,OAAO,CAAC,UAAU,CAAC,oBAAoB,IAAI,MAAM,IAAI,CAAC;AAAA,EACjF;AACF;AAEO,SAAS,iBAAiB,MAA4B;AAC3D,SAAO;AAAA,IACL,GAAG,aAAa,gBAAgB,IAAI,CAAC;AAAA,IACrC,GAAG,WAAW,uBAAuB,iBAAiB,mBAAmB,IAAI,CAAC;AAAA,IAC9E,GAAG,gBAAgB,IAAI;AAAA,EACzB;AACF;AAGA,SAAS,mBAAmB,EAAE,WAAW,OAAO,GAAwB;AACtE,QAAM,cAAc,IAAI,IAAI,OAAO,IAAI,CAAC,EAAE,UAAU,MAAM,SAAS,CAAC;AACpE,SAAO;AAAA,IACL,UAAU,UAAU;AAAA,IACpB,YAAY,UAAU,WAAW,OAAO,CAAC,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,gBAAgB,MAA4B;AAC1D,SAAO,KAAK,OAAO,WAAW,IAAI,CAAC,IAAI,CAAC,uBAAuB,KAAK,MAAM,CAAC;AAC7E;AAEO,SAAS,WAAW,SAA0B;AACnD,QAAM,cAAc,oBAAoB,OAAO;AAC/C,SAAO,gBAAgB,UAAU,UAAU,GAAG,WAAW,KAAK,OAAO;AACvE;AAEO,SAAS,aAAa,UAA8B;AACzD,SAAO;AAAA,IACL,GAAG,WAAW,uBAAuB,iBAAiB,SAAS,OAAO;AAAA,IACtE,GAAG,WAAW,uBAAuB,gBAAgB,SAAS,MAAM;AAAA,EACtE;AACF;AAEA,SAAS,WAAW,SAAiB,SAA4B;AAC/D,QAAM,SAAS;AAAA,IACb,EAAE,OAAO,oBAAoB,gBAAgB,OAAO,QAAQ,SAAS,IAAI,UAAU,EAAE;AAAA,IACrF,EAAE,OAAO,oBAAoB,gBAAgB,OAAO,QAAQ,WAAW;AAAA,EACzE,EAAE,OAAO,CAAC,UAAU,MAAM,MAAM,SAAS,CAAC;AAC1C,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,GAAG,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,MAAM,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,EAAE,CAAC,CAAC;AAAA,EAChG;AACF;AAGO,SAAS,qBAAqB,QAAmC;AACtE,SAAO,gBAAgB,OAAO,QAAQ,OAAO,cAAc,SAAS;AACtE;AAGO,SAAS,eAAe,QAAmC;AAChE,QAAM,EAAE,UAAU,WAAW,IAAI,qBAAqB,MAAM;AAC5D,SAAO,SAAS,WAAW,KAAK,WAAW,WAAW;AACxD;AAGO,SAAS,uBACd,SACA,gBACsB;AACtB,QAAM,WAAW,IAAI,IAAI,cAAc;AACvC,SAAO,QAAQ,QAAQ,CAAC,EAAE,SAAS,WAAW,MAAM;AAClD,UAAM,OAAO,WAAW,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC;AAC5D,WAAO,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,YAAY,KAAK,CAAC;AAAA,EAChE,CAAC;AACH;;;AC7nBA,SAAS,eAAe;AAExB,OAAO,WAAW;AAClB,SAAS,cAAc;;;ACYvB,eAAsB,kBACpB,cACA,MAC4B;AAC5B,QAAM,cAAc,MAAM,uBAAuB,YAAY;AAC7D,MAAI,gBAAgB,KAAM,QAAO,EAAE,aAAa,MAAM,YAAY,MAAM;AAExE,QAAM,SAAS,MAAM,KAAK,kBAAkB,WAAW;AAEvD,MAAI,CAAC,QAAQ;AACX,UAAM,oBAAoB,aAAa,aAAa,OAAO,QAAQ,YAAY,EAAE;AACjF,UAAM,KAAK,eAAe,iBAAiB;AAC3C,WAAO,EAAE,aAAa,YAAY,KAAK;AAAA,EACzC;AAEA,MAAI;AACF,UAAM,KAAK,mBAAmB,WAAW;AAAA,EAC3C,QAAQ;AACN,SAAK,oEAA+D;AAAA,EACtE;AAEA,SAAO,EAAE,aAAa,YAAY,MAAM;AAC1C;AAGA,eAAe,uBAAuB,cAAwD;AAC5F,MAAI,aAAa,YAAa,QAAO,aAAa;AAElD,QAAM,SAAS,aAAa,aAAa;AACzC,MAAI;AACF,UAAM,oBAAoB,MAAM,iBAAiB,MAAM;AACvD,iBAAa,cAAc,kBAAkB,YAAY;AACzD,WAAO,aAAa;AAAA,EACtB,SAAS,OAAO;AACd,SAAK,yCAAyC,MAAM,MAAM,gBAAgB,KAAK,CAAC,EAAE;AAClF,WAAO;AAAA,EACT;AACF;;;AC5CA,eAAsB,mBACpB,cACA,SACA,MACiC;AACjC,QAAM,WAAW,MAAM,kBAAkB,cAAc,IAAI;AAC3D,MAAI,CAAC,SAAS,aAAa;AACzB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,UAAU,OAAO,6CAA6C,aAAa,aAAa,MAAM;AAAA,IAElG;AAAA,EACF;AACA,SAAO,EAAE,IAAI,MAAM,aAAa,SAAS,aAAa,YAAY,SAAS,WAAW;AACxF;;;ACTO,SAAS,0BAA0B,aAA6B;AACrE,SAAO,qBAAqB,WAAW,mHAAmH,kBAAkB;AAC9K;AAGO,SAAS,uBACd,QACAC,SACW;AACX,SAAO,OACJ,OAAO,CAAC,UAAU,MAAM,WAAW,YAAY,EAC/C,OAAO,CAAC,UAAU,iBAAiBA,QAAO,OAAO,MAAM,EAAE,CAAC,CAAC,EAC3D,IAAI,CAAC,UAAU,MAAM,EAAE;AAC5B;AAEO,SAAS,2BAA2B,KAAwB;AACjE,SAAO,kBAAkB,IAAI,MAAM,4DAAuD,IAAI,KAAK,IAAI,CAAC;AAC1G;AAGA,eAAsB,oBACpB,QACA,aACA,YAC8B;AAC9B,QAAM,OAAO,OAAO,UAAU;AAC9B,QAAM,eAAe,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AACnE,QAAM,YAA8C,CAAC;AACrD,QAAM,SAAwC,CAAC;AAE/C,aAAW,SAAS,cAAc;AAChC,UAAM,YAAY,0BAA0B,MAAM,IAAI,WAAW;AACjE,QAAI;AACF,YAAM,KAAK,cAAc,WAAW,MAAM,OAAO,UAAU;AAC3D,gBAAU,KAAK,EAAE,IAAI,MAAM,IAAI,KAAK,UAAU,CAAC;AAAA,IACjD,SAAS,OAAO;AACd,aAAO,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,gBAAgB,KAAK,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,OAAO;AAC7B;;;AHoBA,IAAM,0BAA0B;AAGhC,IAAM,kBAAkB,MAAc,QAAQ,OAAO,WAAW,kBAAkB;AAGlF,IAAM,eAAe,MAAc,QAAQ,OAAO,QAAQ,kBAAkB;AAE5E,SAAS,sBAA+B;AACtC,SAAO,sBAAsB,gBAAgB,GAAG,aAAa,CAAC;AAChE;AAEA,SAAS,gBAAgB,aAA2C;AAClE,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,UAAM,QAAQ,MAAM;AAClB,UAAI,CAAC,YAAY,EAAG;AACpB,oBAAc,QAAQ;AACtB,cAAQ,OAAO,IAAI,UAAU,KAAK;AAClC,cAAQ;AAAA,IACV;AACA,UAAM,WAAW,YAAY,OAAO,uBAAuB;AAC3D,YAAQ,OAAO,GAAG,UAAU,KAAK;AAAA,EACnC,CAAC;AACH;AAQA,SAAS,qBACP,QACA,UACmB;AACnB,QAAM,cAAc,IAAI,IAAI,OAAO,QAAQ,iBAAiB,OAAO,KAAK,IAAI,CAAC,CAAC;AAC9E,QAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAC7D,QAAM,mBAAmB,OAAO,OAC7B,OAAO,CAAC,UAAU,WAAW,OAAO,QAAQ,CAAC,EAC7C,IAAI,CAAC,UAAU,MAAM,IAAI;AAE5B,QAAM,gBAAgB;AAAA,IACpB,OAAO,OACJ,OAAO,CAAC,UAAU,CAAC,MAAM,YAAY,YAAY,IAAI,MAAM,EAAE,CAAC,EAC9D,IAAI,CAAC,UAAU,MAAM,EAAE,EACvB,OAAO,CAAC,YAAY,CAAC,YAAY,IAAI,OAAO,CAAC;AAAA,EAClD;AAEA,SAAO,cAAc,IAAI,CAAC,aAAa;AAAA,IACrC;AAAA,IACA,WAAW,sBAAsB,OAAO,QAAQ,OAAO,IAAI,mBAAmB,CAAC;AAAA,EACjF,EAAE;AACJ;AAEA,SAAS,sBAAsB,QAAgC,SAA2B;AACxF,SAAO,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,WAAW,WAAW,OAAO,SAAS,CAAC;AACpF;AAEO,IAAe,cAAf,cAAmC,QAAQ;AAAA;AAAA,EAE/B,iBAAmC,CAAC;AAAA,EAErD,MAAM,OAAsB;AAC1B,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,mBAAmB;AAAA,EAChC;AAAA,EAEA,MAAgB,qBAAoC;AAClD,QAAI,oBAAoB,EAAG;AAE3B,wBAAoB;AACpB,SAAK,IAAI,MAAM,IAAI,WAAW,OAAO,EAAE,8BAA8B,gBAAgB,CAAC,CAAC,CAAC;AAExF,UAAM,gBAAgB,mBAAmB;AAAA,EAC3C;AAAA,EAEU,YAAY,OAAuB;AAC3C,UAAM,UAAU,gBAAgB,KAAK;AACrC,SAAK,MAAM,SAAS,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,oBAAoB,YAAqC;AACvE,QAAI;AACF,YAAM,WAAW,MAAM,gBAAgB,UAAU;AACjD,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACd,cAAQ,4CAA4C,gBAAgB,KAAK,CAAC,EAAE;AAC5E,aAAO,iBAAiB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEU,WAAW,SAAuB;AAC1C,SAAK,IAAI,UAAK,OAAO,EAAE;AAAA,EACzB;AAAA;AAAA,EAGA,MAAgB,yBACd,cACA,SACA,MACA,cACiB;AACjB,UAAM,WAAW,MAAM,mBAAmB,cAAc,SAAS,IAAI;AACrE,QAAI,CAAC,SAAS,IAAI;AAChB,WAAK,MAAM,SAAS,OAAO,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACvD;AACA,QAAI,SAAS,YAAY;AACvB,qBAAe,SAAS,WAAW;AAAA,IACrC;AACA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA,EAGU,uBAAuB,YAAuC;AACtE,eAAW,SAAS,WAAW,QAAQ;AACrC,WAAK,KAAK,sBAAsB,MAAM,OAAO,CAAC;AAAA,IAChD;AAAA,EACF;AAAA;AAAA,EAGA,MAAgB,4BACd,QACA,aACA,YACAC,SAC8B;AAC9B,UAAM,WAAW,uBAAuB,QAAQA,OAAM;AACtD,QAAI,SAAS,SAAS,GAAG;AACvB,WAAK,MAAM,2BAA2B,QAAQ,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAC7E;AAEA,SAAK,sBAAsB;AAC3B,UAAM,SAAS,MAAM,oBAAoB,QAAQ,aAAa,UAAU;AACxE,SAAK,qBAAqB,MAAM;AAChC,WAAO;AAAA,EACT;AAAA;AAAA,EAGU,wBAA8B;AACtC,SAAK,IAAI,gBAAgB,kBAAkB;AAAA,EAC7C;AAAA;AAAA,EAGU,qBAAqB,QAAmC;AAChE,eAAW,QAAQ,OAAO,WAAW;AACnC,WAAK,IAAI,eAAe,KAAK,GAAG,EAAE;AAAA,IACpC;AACA,eAAW,QAAQ,OAAO,QAAQ;AAChC,WAAK,KAAK,4BAA4B,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAAA,IAChE;AACA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,WAAK,MAAM,0BAA0B,OAAO,OAAO,MAAM,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxF;AACA,SAAK,IAAI,GAAG,iBAAiB,OAAO,UAAU,MAAM,CAAC;AAAA,CAAI;AAAA,EAC3D;AAAA,EAEU,aAAa,QAA0B;AAC/C,eAAW,eAAe,OAAO,WAAW,YAAY;AACtD,WAAK,KAAK,kCAAkC,WAAW,CAAC;AAAA,IAC1D;AACA,SAAK,0BAA0B,MAAM;AAAA,EACvC;AAAA,EAEU,yBAAyB,YAA4C;AAC7E,eAAW,eAAe,WAAW,MAAM;AACzC,WAAK,KAAK,sBAAsB,WAAW,CAAC;AAAA,IAC9C;AACA,eAAW,eAAe,WAAW,SAAS;AAC5C,WAAK,KAAK,mCAAmC,WAAW,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EAEU,0BAA0B,QAA0B;AAC5D,QAAI,OAAO,WAAW,QAAQ,WAAW,EAAG;AAE5C,UAAM,EAAE,gBAAgB,gBAAgB,aAAa,SAAS,IAAI,OAAO;AACzE,eAAW,WAAW,UAAU;AAC9B,WAAK,KAAK,OAAO;AAAA,IACnB;AACA,SAAK,IAAI,2BAA2B,gBAAgB,gBAAgB,WAAW,CAAC;AAAA,EAClF;AAAA,EAEU,uBAAuB,QAAuB,UAAwC;AAC9F,eAAW,EAAE,SAAS,UAAU,KAAK,qBAAqB,QAAQ,QAAQ,GAAG;AAC3E,WAAK,KAAK,uBAAuB,OAAO,CAAC;AACzC,UAAI,UAAU,SAAS,GAAG;AACxB,aAAK,KAAK,4BAA4B,WAAW,OAAO,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,qBAAqB,YAAmC;AACtE,UAAM,WAAW,MAAM,uBAAuB,UAAU;AACxD,QAAI,SAAS,SAAS,GAAG;AACvB,WAAK,MAAM,8BAA8B,QAAQ,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAChF;AAAA,EACF;AAAA;AAAA,EAGA,MAAgB,0BACd,aACAA,SACA,YACe;AACf,UAAM,aAAa,YAAY,OAAO,CAAC,UAAU,CAACA,QAAO,OAAO,MAAM,EAAE,CAAC;AACzE,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAgB,iCACd,aACA,YACA,SACe;AACf,UAAM,WAAW,MAAM,+BAA+B,aAAa,UAAU;AAC7E,QAAI,SAAS,WAAW,EAAG;AAG3B,eAAW,SAAS,UAAU;AAC5B,WAAK,IAAI,4BAA4B,KAAK,CAAC;AAAA,IAC7C;AACA,SAAK,MAAM,QAAQ,QAAQ,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,iCAAiC,QAA0B,YAA0B;AAC7F,QAAI,CAAC,gBAAgB,UAAU,KAAK,eAAe,MAAM,EAAG;AAE5D,UAAM,EAAE,UAAU,WAAW,IAAI,qBAAqB,MAAM;AAC5D,SAAK,MAAM,+BAA+B,UAAU,UAAU,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,EAC7F;AAAA;AAAA,EAGU,qBAAqB,SAAsB,gBAA4C;AAC/F,UAAM,EAAE,iBAAiB,mBAAmB,+BAA+B,IAAI;AAC/E,UAAM,cAAc,uBAAuB,gCAAgC,cAAc;AAEzF,QAAI,gBAAgB,SAAS,EAAG,MAAK,KAAK,qBAAqB,iBAAiB,WAAW,CAAC;AAC5F,QAAI,kBAAkB,SAAS,EAAG,MAAK,KAAK,qBAAqB,iBAAiB,CAAC;AAAA,EACrF;AAAA;AAAA,EAGA,MAAgB,+BACd,WACA,SACA,MACA,cACe;AACf,SAAK,yCAAyC,UAAU,QAAQ,IAAI;AACpE,QAAI;AACF,YAAM,qBAAqB,UAAU,iBAAiB,YAAY;AAClE,YAAM,4BAA4B,OAAO;AACzC,4BAAsB,UAAU,eAAe,aAAa,MAAM;AAAA,IACpE,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,yCACR,QACA,MACM;AACN,QAAI;AACF,gCAA0B,QAAQ,OAAO,IAAI,CAAC;AAAA,IAChD,SAAS,OAAO;AACd,WAAK,MAAM,gBAAgB,KAAK,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,IAAc,oBAA6B;AACzC,WAAO,KAAK,eAAe,SAAS;AAAA,EACtC;AAAA;AAAA,EAGU,qBAAqB,MAAc,UAAwB;AACnE,SAAK,KAAK,IAAI;AACd,SAAK,qBAAqB,MAAM,QAAQ;AAAA,EAC1C;AAAA;AAAA,EAGU,qBAAqB,MAAc,UAAwB;AACnE,SAAK,eAAe,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,EAC7C;AAAA;AAAA,EAGU,uBAA6B;AACrC,QAAI,CAAC,KAAK,kBAAmB;AAE7B,SAAK,IAAI;AAAA,EAAK,MAAM,IAAI,WAAW,OAAO,EAAE,sBAAsB,KAAK,cAAc,CAAC,CAAC;AAAA,CAAI;AAC3F,SAAK,KAAK,WAAW,uBAAuB;AAAA,EAC9C;AACF;","names":["matrix","os","os","matrix","matrix"]}
@@ -1,10 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/cli/lib/configuration/define-config.ts
4
- function defineConfig(config) {
5
- return config;
6
- }
7
-
8
3
  // src/cli/lib/configuration/default-categories.ts
9
4
  var defaultCategories = {
10
5
  "web-framework": {
@@ -3584,9 +3579,8 @@ var defaultStacks = [
3584
3579
  ];
3585
3580
 
3586
3581
  export {
3587
- defineConfig,
3588
3582
  defaultCategories,
3589
3583
  defaultRules,
3590
3584
  defaultStacks
3591
3585
  };
3592
- //# sourceMappingURL=chunk-NQW25DCF.js.map
3586
+ //# sourceMappingURL=chunk-GHHJYNAN.js.map