@agents-inc/cli 0.74.3 → 0.74.5

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 (104) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{chunk-E74Q7GUE.js → chunk-4OBRPE6A.js} +18 -1
  3. package/dist/chunk-4OBRPE6A.js.map +1 -0
  4. package/dist/{chunk-ZWYCZ7BN.js → chunk-4OLQ4QPH.js} +2 -2
  5. package/dist/{chunk-XYXDEODG.js → chunk-AQBZJUAL.js} +6 -6
  6. package/dist/{chunk-23OJO4JS.js → chunk-CTKWL3GL.js} +4 -4
  7. package/dist/{chunk-KSMT5FVM.js → chunk-DBPC4V25.js} +2 -2
  8. package/dist/{chunk-V5HR77EY.js → chunk-FFNBQMMZ.js} +2 -2
  9. package/dist/{chunk-ZNXK2J6R.js → chunk-FOPJDYUF.js} +3 -3
  10. package/dist/{chunk-UVNIFNIN.js → chunk-HRJTZXRF.js} +8 -8
  11. package/dist/{chunk-DNPJ5GUK.js → chunk-IK6GTV3N.js} +3 -2
  12. package/dist/{chunk-DNPJ5GUK.js.map → chunk-IK6GTV3N.js.map} +1 -1
  13. package/dist/{chunk-ALCUVCY5.js → chunk-JAPYUFAM.js} +4 -4
  14. package/dist/{chunk-DUF4UVJB.js → chunk-JGSCFYCP.js} +2 -2
  15. package/dist/{chunk-SFZQL6DJ.js → chunk-JNMZVX5S.js} +3 -3
  16. package/dist/{chunk-GDUOOT3J.js → chunk-KDEOCJMS.js} +3 -3
  17. package/dist/{chunk-N2HO5IT2.js → chunk-KIY36DJU.js} +4 -4
  18. package/dist/{chunk-TNSVPZHP.js → chunk-NIA3NQBT.js} +2 -2
  19. package/dist/{chunk-ZD3U734W.js → chunk-P2BH6X2C.js} +17 -16
  20. package/dist/chunk-P2BH6X2C.js.map +1 -0
  21. package/dist/{chunk-OLS55LVJ.js → chunk-PPFXT5LC.js} +8 -8
  22. package/dist/{chunk-AV5KJHP2.js → chunk-QK4CJOLO.js} +2 -2
  23. package/dist/{chunk-NUJHWYCR.js → chunk-RINGLIE7.js} +2 -2
  24. package/dist/{chunk-BH4LN7XV.js → chunk-TW64EOM7.js} +3 -3
  25. package/dist/{chunk-2NWQS7N4.js → chunk-U3EDOGQG.js} +2 -2
  26. package/dist/{chunk-GJLM53PH.js → chunk-WMSV5AJT.js} +5 -7
  27. package/dist/{chunk-GJLM53PH.js.map → chunk-WMSV5AJT.js.map} +1 -1
  28. package/dist/{chunk-TUILIOBW.js → chunk-XV6A6PAW.js} +12 -12
  29. package/dist/{chunk-EMX7PA2I.js → chunk-XXK6MFOA.js} +1 -12
  30. package/dist/chunk-XXK6MFOA.js.map +1 -0
  31. package/dist/commands/build/plugins.js +4 -4
  32. package/dist/commands/build/stack.js +4 -4
  33. package/dist/commands/compile.js +4 -4
  34. package/dist/commands/config/index.js +4 -4
  35. package/dist/commands/config/path.js +3 -3
  36. package/dist/commands/config/show.js +4 -4
  37. package/dist/commands/diff.js +3 -3
  38. package/dist/commands/doctor.js +3 -3
  39. package/dist/commands/edit.js +18 -18
  40. package/dist/commands/eject.js +4 -5
  41. package/dist/commands/eject.js.map +1 -1
  42. package/dist/commands/import/skill.js +3 -3
  43. package/dist/commands/info.js +3 -3
  44. package/dist/commands/init.js +18 -18
  45. package/dist/commands/list.js +3 -3
  46. package/dist/commands/new/agent.js +4 -4
  47. package/dist/commands/new/marketplace.js +4 -4
  48. package/dist/commands/new/skill.js +4 -4
  49. package/dist/commands/outdated.js +3 -3
  50. package/dist/commands/search.js +3 -3
  51. package/dist/commands/uninstall.js +3 -3
  52. package/dist/commands/update.js +4 -4
  53. package/dist/commands/validate.js +3 -3
  54. package/dist/components/wizard/category-grid.js +2 -2
  55. package/dist/components/wizard/category-grid.test.js +8 -8
  56. package/dist/components/wizard/domain-selection.js +6 -6
  57. package/dist/components/wizard/source-grid.js +2 -2
  58. package/dist/components/wizard/source-grid.test.js +8 -8
  59. package/dist/components/wizard/stack-selection.js +5 -5
  60. package/dist/components/wizard/step-agents.js +6 -6
  61. package/dist/components/wizard/step-agents.test.js +9 -9
  62. package/dist/components/wizard/step-build.js +7 -7
  63. package/dist/components/wizard/step-build.test.js +9 -9
  64. package/dist/components/wizard/step-confirm.js +4 -4
  65. package/dist/components/wizard/step-confirm.test.js +7 -7
  66. package/dist/components/wizard/step-settings.js +4 -4
  67. package/dist/components/wizard/step-settings.test.js +7 -7
  68. package/dist/components/wizard/step-sources.js +6 -6
  69. package/dist/components/wizard/step-sources.test.js +9 -9
  70. package/dist/components/wizard/step-stack.js +8 -8
  71. package/dist/components/wizard/step-stack.test.js +9 -9
  72. package/dist/components/wizard/wizard-layout.js +5 -5
  73. package/dist/components/wizard/wizard.js +17 -17
  74. package/dist/hooks/init.js +18 -18
  75. package/dist/{source-loader-VTNIFSL6.js → source-loader-IV6MOOPQ.js} +4 -4
  76. package/dist/{source-manager-FWAJVMYS.js → source-manager-FVOH3VXK.js} +4 -4
  77. package/dist/stores/wizard-store.js +4 -4
  78. package/dist/stores/wizard-store.test.js +8 -9
  79. package/dist/stores/wizard-store.test.js.map +1 -1
  80. package/package.json +1 -1
  81. package/dist/chunk-E74Q7GUE.js.map +0 -1
  82. package/dist/chunk-EMX7PA2I.js.map +0 -1
  83. package/dist/chunk-ZD3U734W.js.map +0 -1
  84. /package/dist/{chunk-ZWYCZ7BN.js.map → chunk-4OLQ4QPH.js.map} +0 -0
  85. /package/dist/{chunk-XYXDEODG.js.map → chunk-AQBZJUAL.js.map} +0 -0
  86. /package/dist/{chunk-23OJO4JS.js.map → chunk-CTKWL3GL.js.map} +0 -0
  87. /package/dist/{chunk-KSMT5FVM.js.map → chunk-DBPC4V25.js.map} +0 -0
  88. /package/dist/{chunk-V5HR77EY.js.map → chunk-FFNBQMMZ.js.map} +0 -0
  89. /package/dist/{chunk-ZNXK2J6R.js.map → chunk-FOPJDYUF.js.map} +0 -0
  90. /package/dist/{chunk-UVNIFNIN.js.map → chunk-HRJTZXRF.js.map} +0 -0
  91. /package/dist/{chunk-ALCUVCY5.js.map → chunk-JAPYUFAM.js.map} +0 -0
  92. /package/dist/{chunk-DUF4UVJB.js.map → chunk-JGSCFYCP.js.map} +0 -0
  93. /package/dist/{chunk-SFZQL6DJ.js.map → chunk-JNMZVX5S.js.map} +0 -0
  94. /package/dist/{chunk-GDUOOT3J.js.map → chunk-KDEOCJMS.js.map} +0 -0
  95. /package/dist/{chunk-N2HO5IT2.js.map → chunk-KIY36DJU.js.map} +0 -0
  96. /package/dist/{chunk-TNSVPZHP.js.map → chunk-NIA3NQBT.js.map} +0 -0
  97. /package/dist/{chunk-OLS55LVJ.js.map → chunk-PPFXT5LC.js.map} +0 -0
  98. /package/dist/{chunk-AV5KJHP2.js.map → chunk-QK4CJOLO.js.map} +0 -0
  99. /package/dist/{chunk-NUJHWYCR.js.map → chunk-RINGLIE7.js.map} +0 -0
  100. /package/dist/{chunk-BH4LN7XV.js.map → chunk-TW64EOM7.js.map} +0 -0
  101. /package/dist/{chunk-2NWQS7N4.js.map → chunk-U3EDOGQG.js.map} +0 -0
  102. /package/dist/{chunk-TUILIOBW.js.map → chunk-XV6A6PAW.js.map} +0 -0
  103. /package/dist/{source-loader-VTNIFSL6.js.map → source-loader-IV6MOOPQ.js.map} +0 -0
  104. /package/dist/{source-manager-FWAJVMYS.js.map → source-manager-FVOH3VXK.js.map} +0 -0
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-KYULKBFC.js";
12
12
  import {
13
13
  useWizardStore
14
- } from "./chunk-OLS55LVJ.js";
14
+ } from "./chunk-PPFXT5LC.js";
15
15
  import {
16
16
  HOTKEY_ACCEPT_DEFAULTS,
17
17
  HOTKEY_HELP,
@@ -203,4 +203,4 @@ var WizardLayout = ({
203
203
  export {
204
204
  WizardLayout
205
205
  };
206
- //# sourceMappingURL=chunk-ZWYCZ7BN.js.map
206
+ //# sourceMappingURL=chunk-4OLQ4QPH.js.map
@@ -4,17 +4,17 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  CategoryGrid
7
- } from "./chunk-KSMT5FVM.js";
7
+ } from "./chunk-DBPC4V25.js";
8
8
  import {
9
9
  getDomainDisplayName,
10
10
  orderDomains
11
- } from "./chunk-BH4LN7XV.js";
11
+ } from "./chunk-TW64EOM7.js";
12
12
  import {
13
13
  ViewTitle
14
14
  } from "./chunk-AQYAVLZK.js";
15
15
  import {
16
16
  useWizardStore
17
- } from "./chunk-OLS55LVJ.js";
17
+ } from "./chunk-PPFXT5LC.js";
18
18
  import {
19
19
  KEY_LABEL_ENTER,
20
20
  KEY_LABEL_ESC
@@ -22,11 +22,11 @@ import {
22
22
  import {
23
23
  getAvailableSkills,
24
24
  resolveAlias
25
- } from "./chunk-ZD3U734W.js";
25
+ } from "./chunk-P2BH6X2C.js";
26
26
  import {
27
27
  getSkillById,
28
28
  matrix
29
- } from "./chunk-E74Q7GUE.js";
29
+ } from "./chunk-4OBRPE6A.js";
30
30
  import {
31
31
  CLI_COLORS
32
32
  } from "./chunk-EGMQ3SXN.js";
@@ -243,4 +243,4 @@ export {
243
243
  validateBuildStep,
244
244
  StepBuild
245
245
  };
246
- //# sourceMappingURL=chunk-XYXDEODG.js.map
246
+ //# sourceMappingURL=chunk-AQBZJUAL.js.map
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-SFZQL6DJ.js";
4
+ } from "./chunk-JNMZVX5S.js";
5
5
  import {
6
6
  useMeasuredHeight
7
7
  } from "./chunk-K77I4XGL.js";
8
8
  import {
9
9
  DomainSelection
10
- } from "./chunk-GJLM53PH.js";
10
+ } from "./chunk-WMSV5AJT.js";
11
11
  import {
12
12
  ViewTitle
13
13
  } from "./chunk-AQYAVLZK.js";
14
14
  import {
15
15
  useWizardStore
16
- } from "./chunk-OLS55LVJ.js";
16
+ } from "./chunk-PPFXT5LC.js";
17
17
  import {
18
18
  init_esm_shims
19
19
  } from "./chunk-DHET7RCE.js";
@@ -37,4 +37,4 @@ var StepStack = ({ onCancel }) => {
37
37
  export {
38
38
  StepStack
39
39
  };
40
- //# sourceMappingURL=chunk-23OJO4JS.js.map
40
+ //# sourceMappingURL=chunk-CTKWL3GL.js.map
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-6VIOO74O.js";
12
12
  import {
13
13
  getSkillById
14
- } from "./chunk-E74Q7GUE.js";
14
+ } from "./chunk-4OBRPE6A.js";
15
15
  import {
16
16
  CLI_COLORS
17
17
  } from "./chunk-EGMQ3SXN.js";
@@ -341,4 +341,4 @@ var CategoryGrid = ({
341
341
  export {
342
342
  CategoryGrid
343
343
  };
344
- //# sourceMappingURL=chunk-KSMT5FVM.js.map
344
+ //# sourceMappingURL=chunk-DBPC4V25.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  typedEntries
4
- } from "./chunk-EMX7PA2I.js";
4
+ } from "./chunk-4OBRPE6A.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -363,4 +363,4 @@ export {
363
363
  createMockCompileConfig,
364
364
  testSkillToResolvedSkill
365
365
  };
366
- //# sourceMappingURL=chunk-V5HR77EY.js.map
366
+ //# sourceMappingURL=chunk-FFNBQMMZ.js.map
@@ -17,7 +17,7 @@ import {
17
17
  resolveAgents,
18
18
  writeContentHash,
19
19
  writePluginManifest
20
- } from "./chunk-ZD3U734W.js";
20
+ } from "./chunk-P2BH6X2C.js";
21
21
  import {
22
22
  loadAllAgents,
23
23
  loadProjectAgents
@@ -25,7 +25,7 @@ import {
25
25
  import {
26
26
  typedEntries,
27
27
  typedKeys
28
- } from "./chunk-EMX7PA2I.js";
28
+ } from "./chunk-4OBRPE6A.js";
29
29
  import {
30
30
  agentFrontmatterValidationSchema,
31
31
  copy,
@@ -327,4 +327,4 @@ export {
327
327
  compileAllAgentPlugins,
328
328
  printAgentCompilationSummary
329
329
  };
330
- //# sourceMappingURL=chunk-ZNXK2J6R.js.map
330
+ //# sourceMappingURL=chunk-FOPJDYUF.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  getDomainDisplayName
7
- } from "./chunk-BH4LN7XV.js";
7
+ } from "./chunk-TW64EOM7.js";
8
8
  import {
9
9
  useRowScroll
10
10
  } from "./chunk-XMLCXRTS.js";
@@ -13,14 +13,14 @@ import {
13
13
  } from "./chunk-AQYAVLZK.js";
14
14
  import {
15
15
  useWizardStore
16
- } from "./chunk-OLS55LVJ.js";
16
+ } from "./chunk-PPFXT5LC.js";
17
17
  import {
18
- isAgentName,
19
- typedKeys
20
- } from "./chunk-EMX7PA2I.js";
18
+ isAgentName
19
+ } from "./chunk-XXK6MFOA.js";
21
20
  import {
22
- matrix
23
- } from "./chunk-E74Q7GUE.js";
21
+ matrix,
22
+ typedKeys
23
+ } from "./chunk-4OBRPE6A.js";
24
24
  import {
25
25
  CLI_COLORS,
26
26
  UI_SYMBOLS
@@ -268,4 +268,4 @@ var StepAgents = () => {
268
268
  export {
269
269
  StepAgents
270
270
  };
271
- //# sourceMappingURL=chunk-UVNIFNIN.js.map
271
+ //# sourceMappingURL=chunk-HRJTZXRF.js.map
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  getSkillById,
16
16
  matrix
17
- } from "./chunk-E74Q7GUE.js";
17
+ } from "./chunk-4OBRPE6A.js";
18
18
  import {
19
19
  CLI_COLORS,
20
20
  SOURCE_DISPLAY_NAMES
@@ -51,6 +51,7 @@ function useSourceGridSearchModal({
51
51
  const row = rows[rowIndex];
52
52
  if (!row || !onSearch) return;
53
53
  const alias = matrix.slugMap.idToSlug[row.skillId];
54
+ if (!alias) return;
54
55
  setSearchAlias(alias);
55
56
  searchModal.open(rowIndex);
56
57
  onSearchStateChange?.(true);
@@ -259,4 +260,4 @@ var SourceGrid = ({
259
260
  export {
260
261
  SourceGrid
261
262
  };
262
- //# sourceMappingURL=chunk-DNPJ5GUK.js.map
263
+ //# sourceMappingURL=chunk-IK6GTV3N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/source-grid.tsx","../src/cli/components/hooks/use-source-grid-search-modal.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { BoundSkillCandidate, SkillAlias, SkillId } from \"../../types/index.js\";\nimport { CLI_COLORS, SOURCE_DISPLAY_NAMES } from \"../../consts.js\";\nimport { getSkillById } from \"../../lib/matrix/matrix-provider.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\nimport { useSourceGridSearchModal } from \"../hooks/use-source-grid-search-modal.js\";\nimport { SearchModal } from \"./search-modal.js\";\n\nconst SEARCH_PILL_LABEL = \"\\u2315 Search\";\n\nexport type SourceOption = {\n id: string;\n selected: boolean;\n installed: boolean;\n};\n\nexport type SourceRow = {\n skillId: SkillId;\n options: SourceOption[];\n};\n\nexport type SourceGridProps = {\n rows: SourceRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onSelect: (skillId: SkillId, sourceId: string) => void;\n onSearch?: (alias: SkillAlias) => Promise<BoundSkillCandidate[]>;\n onBind?: (candidate: BoundSkillCandidate) => void;\n onSearchStateChange?: (active: boolean) => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n};\n\ntype SearchPillProps = {\n isFocused: boolean;\n};\n\nconst SearchPill: React.FC<SearchPillProps> = ({ isFocused }) => {\n const borderColor = isFocused ? CLI_COLORS.UNFOCUSED : CLI_COLORS.NEUTRAL;\n\n return (\n <Box marginRight={1} borderColor={borderColor} borderStyle=\"single\" borderDimColor={!isFocused}>\n <Text dimColor={!isFocused} bold={isFocused}>\n {\" \"}\n {SEARCH_PILL_LABEL}{\" \"}\n </Text>\n </Box>\n );\n};\n\ntype SourceSectionProps = {\n row: SourceRow;\n isFocused: boolean;\n focusedOptionIndex: number;\n showSearchPill: boolean;\n};\n\nfunction formatSourceLabel(option: SourceOption): string {\n const displayName = SOURCE_DISPLAY_NAMES[option.id] ?? option.id;\n const prefix = option.installed ? \"\\u2713 \" : \"\";\n return `${prefix}${displayName}`;\n}\n\nconst SourceTag: React.FC<{ option: SourceOption; isFocused: boolean }> = ({\n option,\n isFocused,\n}) => {\n const getBorderColor = (): string => {\n if (isFocused) {\n return option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED;\n }\n return option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL;\n };\n\n const textColor = option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL;\n const isBold = isFocused || option.selected;\n\n return (\n <Box\n marginRight={1}\n borderColor={getBorderColor()}\n borderStyle=\"single\"\n borderDimColor={!isFocused && !option.selected}\n >\n <Text color={textColor} bold={isBold} dimColor={false}>\n {\" \"}\n {formatSourceLabel(option)}{\" \"}\n </Text>\n </Box>\n );\n};\n\nconst SourceSection: React.FC<SourceSectionProps> = ({\n row,\n isFocused,\n focusedOptionIndex,\n showSearchPill,\n}) => {\n const searchPillIndex = row.options.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\">\n <Text>{getSkillById(row.skillId).displayName}</Text>\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {row.options.map((option, index) => (\n <SourceTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex}\n />\n ))}\n {showSearchPill && (\n <SearchPill isFocused={isFocused && focusedOptionIndex === searchPillIndex} />\n )}\n </Box>\n </Box>\n );\n};\n\n/** Total navigable columns for a row (options + search pill if applicable) */\nconst getNavigableCount = (row: SourceRow, showSearchPill: boolean): number => {\n return row.options.length + (showSearchPill ? 1 : 0);\n};\n\nexport const SourceGrid: React.FC<SourceGridProps> = ({\n rows,\n availableHeight = 0,\n onSelect,\n onSearch,\n onBind,\n onSearchStateChange,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n}) => {\n const {\n searchModal,\n searchResults,\n searchAlias,\n handleSearchTrigger,\n handleBind,\n handleCloseSearch,\n } = useSourceGridSearchModal({ rows, onSearch, onBind, onSearchStateChange });\n\n const showSearchPill = !!onSearch;\n\n const getColCount = useCallback(\n (row: number): number => {\n const rowData = rows[row];\n return rowData ? getNavigableCount(rowData, showSearchPill) : 0;\n },\n [rows, showSearchPill],\n );\n\n const { focusedRow, focusedCol, moveFocus } = useFocusedListItem(rows.length, getColCount, {\n wrap: true,\n onChange: onFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n });\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: rows.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n useInput(\n useCallback(\n (\n input: string,\n key: {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n return: boolean;\n },\n ) => {\n if (input === \" \") {\n const currentRow = rows[focusedRow];\n if (!currentRow) return;\n if (showSearchPill && focusedCol === currentRow.options.length) {\n void handleSearchTrigger(focusedRow);\n return;\n }\n if (focusedCol < currentRow.options.length) {\n const currentOption = currentRow.options[focusedCol];\n if (currentOption) {\n onSelect(currentRow.skillId, currentOption.id);\n }\n }\n return;\n }\n\n const isLeft = key.leftArrow;\n const isRight = key.rightArrow;\n const isUp = key.upArrow;\n const isDown = key.downArrow;\n\n if (isLeft) {\n moveFocus(\"left\");\n } else if (isRight) {\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n },\n [rows, focusedRow, focusedCol, onSelect, showSearchPill, handleSearchTrigger, moveFocus],\n ),\n { isActive: !searchModal.isOpen },\n );\n\n if (rows.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No skills to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = rows.map((row, rowIndex) => (\n <Box key={row.skillId} ref={(el) => setSectionRef(rowIndex, el)} {...noShrink}>\n <SourceSection\n row={row}\n isFocused={rowIndex === focusedRow}\n focusedOptionIndex={focusedCol}\n showSearchPill={showSearchPill}\n />\n </Box>\n ));\n\n const searchModalElement = searchModal.isOpen && (\n <SearchModal\n results={searchResults}\n alias={searchAlias}\n onBind={handleBind}\n onClose={handleCloseSearch}\n />\n );\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled ? { height: availableHeight } : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" overflow=\"hidden\" flexGrow={1}>\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n {searchModalElement}\n </Box>\n );\n};\n","import { useCallback, useState } from \"react\";\nimport type { BoundSkillCandidate, SkillAlias } from \"../../types/index.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useModalState } from \"./use-modal-state.js\";\nimport type { SourceRow } from \"../wizard/source-grid.js\";\n\ntype UseSourceGridSearchModalOptions = {\n rows: SourceRow[];\n onSearch?: (alias: SkillAlias) => Promise<BoundSkillCandidate[]>;\n onBind?: (candidate: BoundSkillCandidate) => void;\n onSearchStateChange?: (active: boolean) => void;\n};\n\ntype UseSourceGridSearchModalResult = {\n searchModal: { isOpen: boolean };\n searchResults: BoundSkillCandidate[];\n searchAlias: string;\n handleSearchTrigger: (rowIndex: number) => Promise<void>;\n handleBind: (candidate: BoundSkillCandidate) => void;\n handleCloseSearch: () => void;\n};\n\nexport function useSourceGridSearchModal({\n rows,\n onSearch,\n onBind,\n onSearchStateChange,\n}: UseSourceGridSearchModalOptions): UseSourceGridSearchModalResult {\n const searchModal = useModalState<number>();\n const [searchResults, setSearchResults] = useState<BoundSkillCandidate[]>([]);\n const [searchAlias, setSearchAlias] = useState(\"\");\n\n const resetSearch = useCallback(() => {\n searchModal.close();\n setSearchResults([]);\n setSearchAlias(\"\");\n onSearchStateChange?.(false);\n }, [onSearchStateChange, searchModal]);\n\n const handleSearchTrigger = useCallback(\n async (rowIndex: number) => {\n const row = rows[rowIndex];\n if (!row || !onSearch) return;\n\n const alias = matrix.slugMap.idToSlug[row.skillId];\n setSearchAlias(alias);\n searchModal.open(rowIndex);\n onSearchStateChange?.(true);\n\n const results = await onSearch(alias);\n setSearchResults(results);\n },\n [rows, onSearch, onSearchStateChange, searchModal],\n );\n\n const handleBind = useCallback(\n (candidate: BoundSkillCandidate) => {\n onBind?.(candidate);\n resetSearch();\n },\n [onBind, resetSearch],\n );\n\n const handleCloseSearch = useCallback(() => {\n resetSearch();\n }, [resetSearch]);\n\n return {\n searchModal: { isOpen: searchModal.isOpen },\n searchResults,\n searchAlias,\n handleSearchTrigger,\n handleBind,\n handleCloseSearch,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
1
+ {"version":3,"sources":["../src/cli/components/wizard/source-grid.tsx","../src/cli/components/hooks/use-source-grid-search-modal.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { BoundSkillCandidate, SkillAlias, SkillId } from \"../../types/index.js\";\nimport { CLI_COLORS, SOURCE_DISPLAY_NAMES } from \"../../consts.js\";\nimport { getSkillById } from \"../../lib/matrix/matrix-provider.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\nimport { useSourceGridSearchModal } from \"../hooks/use-source-grid-search-modal.js\";\nimport { SearchModal } from \"./search-modal.js\";\n\nconst SEARCH_PILL_LABEL = \"\\u2315 Search\";\n\nexport type SourceOption = {\n id: string;\n selected: boolean;\n installed: boolean;\n};\n\nexport type SourceRow = {\n skillId: SkillId;\n options: SourceOption[];\n};\n\nexport type SourceGridProps = {\n rows: SourceRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onSelect: (skillId: SkillId, sourceId: string) => void;\n onSearch?: (alias: SkillAlias) => Promise<BoundSkillCandidate[]>;\n onBind?: (candidate: BoundSkillCandidate) => void;\n onSearchStateChange?: (active: boolean) => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n};\n\ntype SearchPillProps = {\n isFocused: boolean;\n};\n\nconst SearchPill: React.FC<SearchPillProps> = ({ isFocused }) => {\n const borderColor = isFocused ? CLI_COLORS.UNFOCUSED : CLI_COLORS.NEUTRAL;\n\n return (\n <Box marginRight={1} borderColor={borderColor} borderStyle=\"single\" borderDimColor={!isFocused}>\n <Text dimColor={!isFocused} bold={isFocused}>\n {\" \"}\n {SEARCH_PILL_LABEL}{\" \"}\n </Text>\n </Box>\n );\n};\n\ntype SourceSectionProps = {\n row: SourceRow;\n isFocused: boolean;\n focusedOptionIndex: number;\n showSearchPill: boolean;\n};\n\nfunction formatSourceLabel(option: SourceOption): string {\n const displayName = SOURCE_DISPLAY_NAMES[option.id] ?? option.id;\n const prefix = option.installed ? \"\\u2713 \" : \"\";\n return `${prefix}${displayName}`;\n}\n\nconst SourceTag: React.FC<{ option: SourceOption; isFocused: boolean }> = ({\n option,\n isFocused,\n}) => {\n const getBorderColor = (): string => {\n if (isFocused) {\n return option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED;\n }\n return option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL;\n };\n\n const textColor = option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL;\n const isBold = isFocused || option.selected;\n\n return (\n <Box\n marginRight={1}\n borderColor={getBorderColor()}\n borderStyle=\"single\"\n borderDimColor={!isFocused && !option.selected}\n >\n <Text color={textColor} bold={isBold} dimColor={false}>\n {\" \"}\n {formatSourceLabel(option)}{\" \"}\n </Text>\n </Box>\n );\n};\n\nconst SourceSection: React.FC<SourceSectionProps> = ({\n row,\n isFocused,\n focusedOptionIndex,\n showSearchPill,\n}) => {\n const searchPillIndex = row.options.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\">\n <Text>{getSkillById(row.skillId).displayName}</Text>\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {row.options.map((option, index) => (\n <SourceTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex}\n />\n ))}\n {showSearchPill && (\n <SearchPill isFocused={isFocused && focusedOptionIndex === searchPillIndex} />\n )}\n </Box>\n </Box>\n );\n};\n\n/** Total navigable columns for a row (options + search pill if applicable) */\nconst getNavigableCount = (row: SourceRow, showSearchPill: boolean): number => {\n return row.options.length + (showSearchPill ? 1 : 0);\n};\n\nexport const SourceGrid: React.FC<SourceGridProps> = ({\n rows,\n availableHeight = 0,\n onSelect,\n onSearch,\n onBind,\n onSearchStateChange,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n}) => {\n const {\n searchModal,\n searchResults,\n searchAlias,\n handleSearchTrigger,\n handleBind,\n handleCloseSearch,\n } = useSourceGridSearchModal({ rows, onSearch, onBind, onSearchStateChange });\n\n const showSearchPill = !!onSearch;\n\n const getColCount = useCallback(\n (row: number): number => {\n const rowData = rows[row];\n return rowData ? getNavigableCount(rowData, showSearchPill) : 0;\n },\n [rows, showSearchPill],\n );\n\n const { focusedRow, focusedCol, moveFocus } = useFocusedListItem(rows.length, getColCount, {\n wrap: true,\n onChange: onFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n });\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: rows.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n useInput(\n useCallback(\n (\n input: string,\n key: {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n return: boolean;\n },\n ) => {\n if (input === \" \") {\n const currentRow = rows[focusedRow];\n if (!currentRow) return;\n if (showSearchPill && focusedCol === currentRow.options.length) {\n void handleSearchTrigger(focusedRow);\n return;\n }\n if (focusedCol < currentRow.options.length) {\n const currentOption = currentRow.options[focusedCol];\n if (currentOption) {\n onSelect(currentRow.skillId, currentOption.id);\n }\n }\n return;\n }\n\n const isLeft = key.leftArrow;\n const isRight = key.rightArrow;\n const isUp = key.upArrow;\n const isDown = key.downArrow;\n\n if (isLeft) {\n moveFocus(\"left\");\n } else if (isRight) {\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n },\n [rows, focusedRow, focusedCol, onSelect, showSearchPill, handleSearchTrigger, moveFocus],\n ),\n { isActive: !searchModal.isOpen },\n );\n\n if (rows.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No skills to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = rows.map((row, rowIndex) => (\n <Box key={row.skillId} ref={(el) => setSectionRef(rowIndex, el)} {...noShrink}>\n <SourceSection\n row={row}\n isFocused={rowIndex === focusedRow}\n focusedOptionIndex={focusedCol}\n showSearchPill={showSearchPill}\n />\n </Box>\n ));\n\n const searchModalElement = searchModal.isOpen && (\n <SearchModal\n results={searchResults}\n alias={searchAlias}\n onBind={handleBind}\n onClose={handleCloseSearch}\n />\n );\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled ? { height: availableHeight } : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" overflow=\"hidden\" flexGrow={1}>\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n {searchModalElement}\n </Box>\n );\n};\n","import { useCallback, useState } from \"react\";\nimport type { BoundSkillCandidate, SkillAlias } from \"../../types/index.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useModalState } from \"./use-modal-state.js\";\nimport type { SourceRow } from \"../wizard/source-grid.js\";\n\ntype UseSourceGridSearchModalOptions = {\n rows: SourceRow[];\n onSearch?: (alias: SkillAlias) => Promise<BoundSkillCandidate[]>;\n onBind?: (candidate: BoundSkillCandidate) => void;\n onSearchStateChange?: (active: boolean) => void;\n};\n\ntype UseSourceGridSearchModalResult = {\n searchModal: { isOpen: boolean };\n searchResults: BoundSkillCandidate[];\n searchAlias: string;\n handleSearchTrigger: (rowIndex: number) => Promise<void>;\n handleBind: (candidate: BoundSkillCandidate) => void;\n handleCloseSearch: () => void;\n};\n\nexport function useSourceGridSearchModal({\n rows,\n onSearch,\n onBind,\n onSearchStateChange,\n}: UseSourceGridSearchModalOptions): UseSourceGridSearchModalResult {\n const searchModal = useModalState<number>();\n const [searchResults, setSearchResults] = useState<BoundSkillCandidate[]>([]);\n const [searchAlias, setSearchAlias] = useState(\"\");\n\n const resetSearch = useCallback(() => {\n searchModal.close();\n setSearchResults([]);\n setSearchAlias(\"\");\n onSearchStateChange?.(false);\n }, [onSearchStateChange, searchModal]);\n\n const handleSearchTrigger = useCallback(\n async (rowIndex: number) => {\n const row = rows[rowIndex];\n if (!row || !onSearch) return;\n\n const alias = matrix.slugMap.idToSlug[row.skillId];\n if (!alias) return;\n setSearchAlias(alias);\n searchModal.open(rowIndex);\n onSearchStateChange?.(true);\n\n const results = await onSearch(alias);\n setSearchResults(results);\n },\n [rows, onSearch, onSearchStateChange, searchModal],\n );\n\n const handleBind = useCallback(\n (candidate: BoundSkillCandidate) => {\n onBind?.(candidate);\n resetSearch();\n },\n [onBind, resetSearch],\n );\n\n const handleCloseSearch = useCallback(() => {\n resetSearch();\n }, [resetSearch]);\n\n return {\n searchModal: { isOpen: searchModal.isOpen },\n searchResults,\n searchAlias,\n handleSearchTrigger,\n handleBind,\n handleCloseSearch,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -10,13 +10,13 @@ import {
10
10
  } from "./chunk-MWGDG4QN.js";
11
11
  import {
12
12
  SourceGrid
13
- } from "./chunk-DNPJ5GUK.js";
13
+ } from "./chunk-IK6GTV3N.js";
14
14
  import {
15
15
  ViewTitle
16
16
  } from "./chunk-AQYAVLZK.js";
17
17
  import {
18
18
  useWizardStore
19
- } from "./chunk-OLS55LVJ.js";
19
+ } from "./chunk-PPFXT5LC.js";
20
20
  import {
21
21
  HOTKEY_SET_ALL_LOCAL,
22
22
  HOTKEY_SET_ALL_PLUGIN,
@@ -27,7 +27,7 @@ import {
27
27
  import {
28
28
  resolveAllSources,
29
29
  searchExtraSources
30
- } from "./chunk-ZD3U734W.js";
30
+ } from "./chunk-P2BH6X2C.js";
31
31
  import {
32
32
  CLI_COLORS,
33
33
  DEFAULT_BRANDING
@@ -181,4 +181,4 @@ var StepSources = ({ projectDir, onContinue, onBack }) => {
181
181
  export {
182
182
  StepSources
183
183
  };
184
- //# sourceMappingURL=chunk-ALCUVCY5.js.map
184
+ //# sourceMappingURL=chunk-JAPYUFAM.js.map
@@ -27,7 +27,7 @@ import {
27
27
  addSource,
28
28
  getSourceSummary,
29
29
  removeSource
30
- } from "./chunk-ZD3U734W.js";
30
+ } from "./chunk-P2BH6X2C.js";
31
31
  import {
32
32
  getErrorMessage,
33
33
  verbose
@@ -270,4 +270,4 @@ var StepSettings = ({
270
270
  export {
271
271
  StepSettings
272
272
  };
273
- //# sourceMappingURL=chunk-DUF4UVJB.js.map
273
+ //# sourceMappingURL=chunk-JGSCFYCP.js.map
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-AUNBGZS4.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-OLS55LVJ.js";
10
+ } from "./chunk-PPFXT5LC.js";
11
11
  import {
12
12
  matrix
13
- } from "./chunk-E74Q7GUE.js";
13
+ } from "./chunk-4OBRPE6A.js";
14
14
  import {
15
15
  DEFAULT_SCRATCH_DOMAINS
16
16
  } from "./chunk-EGMQ3SXN.js";
@@ -110,4 +110,4 @@ var StackSelection = ({
110
110
  export {
111
111
  StackSelection
112
112
  };
113
- //# sourceMappingURL=chunk-SFZQL6DJ.js.map
113
+ //# sourceMappingURL=chunk-JNMZVX5S.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  FRAMEWORK_CATEGORY
4
- } from "./chunk-TNSVPZHP.js";
4
+ } from "./chunk-NIA3NQBT.js";
5
5
  import {
6
6
  SKILLS,
7
7
  TEST_CATEGORIES,
@@ -15,7 +15,7 @@ import {
15
15
  createTestSkill,
16
16
  renderSkillMd,
17
17
  testSkillToResolvedSkill
18
- } from "./chunk-V5HR77EY.js";
18
+ } from "./chunk-FFNBQMMZ.js";
19
19
  import {
20
20
  init_esm_shims
21
21
  } from "./chunk-DHET7RCE.js";
@@ -686,4 +686,4 @@ export {
686
686
  ALL_SKILLS_MULTI_DOMAIN_MATRIX,
687
687
  REACT_HONO_FRAMEWORK_API_MATRIX
688
688
  };
689
- //# sourceMappingURL=chunk-GDUOOT3J.js.map
689
+ //# sourceMappingURL=chunk-KDEOCJMS.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "./chunk-TUILIOBW.js";
4
+ } from "./chunk-XV6A6PAW.js";
5
5
  import {
6
6
  SelectList
7
7
  } from "./chunk-WF5PMBIR.js";
@@ -30,10 +30,10 @@ import {
30
30
  installPluginConfig,
31
31
  loadProjectConfig,
32
32
  loadSkillsMatrixFromSource
33
- } from "./chunk-ZD3U734W.js";
33
+ } from "./chunk-P2BH6X2C.js";
34
34
  import {
35
35
  getSkillById
36
- } from "./chunk-E74Q7GUE.js";
36
+ } from "./chunk-4OBRPE6A.js";
37
37
  import {
38
38
  BaseCommand,
39
39
  EXIT_CODES
@@ -562,4 +562,4 @@ export {
562
562
  showDashboard,
563
563
  Init
564
564
  };
565
- //# sourceMappingURL=chunk-N2HO5IT2.js.map
565
+ //# sourceMappingURL=chunk-KIY36DJU.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  TEST_CATEGORIES
4
- } from "./chunk-V5HR77EY.js";
4
+ } from "./chunk-FFNBQMMZ.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -73,4 +73,4 @@ export {
73
73
  CLI_FRAMEWORK_CATEGORY,
74
74
  FRAMEWORK_CATEGORY
75
75
  };
76
- //# sourceMappingURL=chunk-TNSVPZHP.js.map
76
+ //# sourceMappingURL=chunk-NIA3NQBT.js.map
@@ -6,16 +6,17 @@ import {
6
6
  parseFrontmatter
7
7
  } from "./chunk-RRBWNEG3.js";
8
8
  import {
9
- isCategory,
10
- typedEntries,
11
- typedKeys
12
- } from "./chunk-EMX7PA2I.js";
9
+ isCategory
10
+ } from "./chunk-XXK6MFOA.js";
13
11
  import {
14
12
  BUILT_IN_MATRIX,
13
+ getCustomSkillIds,
15
14
  getSkillById,
16
15
  initializeMatrix,
17
- matrix
18
- } from "./chunk-E74Q7GUE.js";
16
+ matrix,
17
+ typedEntries,
18
+ typedKeys
19
+ } from "./chunk-4OBRPE6A.js";
19
20
  import {
20
21
  SKILL_ID_PATTERN,
21
22
  agentFrontmatterValidationSchema,
@@ -695,13 +696,12 @@ async function loadStackById(stackId, configDir) {
695
696
  function resolveAgentConfigToSkills(agentConfig) {
696
697
  return typedEntries(agentConfig).flatMap(
697
698
  ([category, assignments]) => (assignments ?? []).filter((assignment) => {
698
- if (!SKILL_ID_PATTERN.test(assignment.id)) {
699
- warn(
700
- `Invalid skill ID '${assignment.id}' for category '${category}' in stack config. Skipping.`
701
- );
702
- return false;
703
- }
704
- return true;
699
+ if (SKILL_ID_PATTERN.test(assignment.id)) return true;
700
+ if (getCustomSkillIds().has(assignment.id)) return true;
701
+ warn(
702
+ `Invalid skill ID '${assignment.id}' for category '${category}' in stack config. Skipping.`
703
+ );
704
+ return false;
705
705
  }).map(
706
706
  (assignment) => ({
707
707
  id: assignment.id,
@@ -982,7 +982,7 @@ function loadConfigTypesDataInBackground(sourceFlag, projectDir) {
982
982
  if (!await directoryExists(claudeSrcDir)) {
983
983
  throw new Error(`${CLAUDE_SRC_DIR}/ not found \u2014 run '${CLI_BIN_NAME} init' first`);
984
984
  }
985
- const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-VTNIFSL6.js");
985
+ const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-IV6MOOPQ.js");
986
986
  const { loadAllAgents: loadAllAgents2 } = await import("./loader-NHUCFMFQ.js");
987
987
  const sourceResult = await loadSkillsMatrixFromSource2({
988
988
  sourceFlag,
@@ -1686,7 +1686,7 @@ function synthesizeCategory(category, domain) {
1686
1686
  displayName,
1687
1687
  description: `Auto-generated category for ${category}`,
1688
1688
  domain,
1689
- exclusive: true,
1689
+ exclusive: false,
1690
1690
  required: false,
1691
1691
  order: AUTO_SYNTH_ORDER
1692
1692
  };
@@ -5295,6 +5295,7 @@ async function loadAndMergeFromBasePath(basePath) {
5295
5295
  verbose(`Skills from source: ${skillsDir}`);
5296
5296
  const skills = await extractAllSkills(skillsDir);
5297
5297
  const mergedMatrix = mergeMatrixWithSkills(categories, relationships, skills);
5298
+ initializeMatrix(mergedMatrix);
5298
5299
  const sourceStacks = await loadStacks(basePath, stacksRelFile);
5299
5300
  const stacks = sourceStacks.length > 0 ? sourceStacks : defaultStacks;
5300
5301
  if (stacks.length > 0) {
@@ -5503,4 +5504,4 @@ export {
5503
5504
  validateAllPlugins,
5504
5505
  printPluginValidationResult
5505
5506
  };
5506
- //# sourceMappingURL=chunk-ZD3U734W.js.map
5507
+ //# sourceMappingURL=chunk-P2BH6X2C.js.map