agents-inc 0.175.0 → 0.176.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/{chunk-EGC7PNDI.js → chunk-3F5LT433.js} +138 -41
  3. package/dist/chunk-3F5LT433.js.map +1 -0
  4. package/dist/chunk-5CFHP6Z5.js +109 -0
  5. package/dist/chunk-5CFHP6Z5.js.map +1 -0
  6. package/dist/{chunk-MFCZARV2.js → chunk-B7AVWSK2.js} +18 -8
  7. package/dist/chunk-B7AVWSK2.js.map +1 -0
  8. package/dist/{chunk-6HJVH27C.js → chunk-C2BSCEDN.js} +2 -2
  9. package/dist/{chunk-SNXEYAFP.js → chunk-CKBWEWHZ.js} +60 -30
  10. package/dist/chunk-CKBWEWHZ.js.map +1 -0
  11. package/dist/{chunk-SI2LLEIR.js → chunk-EC3JXT23.js} +4 -4
  12. package/dist/{chunk-YM3VEDAP.js → chunk-ENET4IF6.js} +440 -192
  13. package/dist/chunk-ENET4IF6.js.map +1 -0
  14. package/dist/{chunk-ICHWAFAC.js → chunk-FACDJH6O.js} +11 -104
  15. package/dist/chunk-FACDJH6O.js.map +1 -0
  16. package/dist/{chunk-P5XEK7HC.js → chunk-H6WUOW5F.js} +2 -2
  17. package/dist/{chunk-DQB3E2SX.js → chunk-JNRACLNS.js} +3 -3
  18. package/dist/{chunk-37QFHJUW.js → chunk-JTMSFBCA.js} +106 -28
  19. package/dist/chunk-JTMSFBCA.js.map +1 -0
  20. package/dist/{chunk-GNMRXXRY.js → chunk-MQZNDK5F.js} +3 -3
  21. package/dist/chunk-MQZNDK5F.js.map +1 -0
  22. package/dist/{chunk-SRII2GMF.js → chunk-SN64WNWE.js} +2 -2
  23. package/dist/{chunk-EHEBN4NB.js → chunk-U672FZVC.js} +2 -2
  24. package/dist/{chunk-TG3SPPZY.js → chunk-UE4Z3YMB.js} +1 -1
  25. package/dist/chunk-UE4Z3YMB.js.map +1 -0
  26. package/dist/{chunk-Q4NWATGH.js → chunk-XMQIWPIR.js} +58 -10
  27. package/dist/chunk-XMQIWPIR.js.map +1 -0
  28. package/dist/{chunk-YLFKFVQP.js → chunk-ZBI6GFJD.js} +2 -2
  29. package/dist/commands/build/marketplace.js +4 -3
  30. package/dist/commands/build/marketplace.js.map +1 -1
  31. package/dist/commands/build/plugins.js +6 -5
  32. package/dist/commands/build/plugins.js.map +1 -1
  33. package/dist/commands/compile.js +15 -11
  34. package/dist/commands/compile.js.map +1 -1
  35. package/dist/commands/doctor.js +38 -14
  36. package/dist/commands/doctor.js.map +1 -1
  37. package/dist/commands/edit.js +46 -25
  38. package/dist/commands/edit.js.map +1 -1
  39. package/dist/commands/eject.js +12 -8
  40. package/dist/commands/eject.js.map +1 -1
  41. package/dist/commands/init.js +15 -14
  42. package/dist/commands/list.js +8 -6
  43. package/dist/commands/list.js.map +1 -1
  44. package/dist/commands/new/marketplace.js +4 -3
  45. package/dist/commands/new/marketplace.js.map +1 -1
  46. package/dist/commands/search.js +13 -8
  47. package/dist/commands/search.js.map +1 -1
  48. package/dist/commands/share.js +14 -16
  49. package/dist/commands/share.js.map +1 -1
  50. package/dist/commands/uninstall.js +18 -14
  51. package/dist/commands/uninstall.js.map +1 -1
  52. package/dist/commands/update.js +97 -17
  53. package/dist/commands/update.js.map +1 -1
  54. package/dist/components/common/skill-agent-summary.js +3 -2
  55. package/dist/components/common/summary-panel.js +4 -3
  56. package/dist/hooks/init.js +15 -14
  57. package/dist/hooks/init.js.map +1 -1
  58. package/dist/load-agent-defs-5BSECHE6.js +14 -0
  59. package/dist/{recompile-project-agents-2QTFMYDC.js → recompile-project-agents-U3UGHPWG.js} +7 -7
  60. package/dist/{source-loader-I6SWWDUF.js → source-loader-E2Y5MMN5.js} +3 -3
  61. package/package.json +1 -1
  62. package/dist/chunk-37QFHJUW.js.map +0 -1
  63. package/dist/chunk-EGC7PNDI.js.map +0 -1
  64. package/dist/chunk-GNMRXXRY.js.map +0 -1
  65. package/dist/chunk-ICHWAFAC.js.map +0 -1
  66. package/dist/chunk-MFCZARV2.js.map +0 -1
  67. package/dist/chunk-Q4NWATGH.js.map +0 -1
  68. package/dist/chunk-SNXEYAFP.js.map +0 -1
  69. package/dist/chunk-TG3SPPZY.js.map +0 -1
  70. package/dist/chunk-YM3VEDAP.js.map +0 -1
  71. package/dist/load-agent-defs-BJ4KBKBA.js +0 -14
  72. /package/dist/{chunk-6HJVH27C.js.map → chunk-C2BSCEDN.js.map} +0 -0
  73. /package/dist/{chunk-SI2LLEIR.js.map → chunk-EC3JXT23.js.map} +0 -0
  74. /package/dist/{chunk-P5XEK7HC.js.map → chunk-H6WUOW5F.js.map} +0 -0
  75. /package/dist/{chunk-DQB3E2SX.js.map → chunk-JNRACLNS.js.map} +0 -0
  76. /package/dist/{chunk-SRII2GMF.js.map → chunk-SN64WNWE.js.map} +0 -0
  77. /package/dist/{chunk-EHEBN4NB.js.map → chunk-U672FZVC.js.map} +0 -0
  78. /package/dist/{chunk-YLFKFVQP.js.map → chunk-ZBI6GFJD.js.map} +0 -0
  79. /package/dist/{load-agent-defs-BJ4KBKBA.js.map → load-agent-defs-5BSECHE6.js.map} +0 -0
  80. /package/dist/{recompile-project-agents-2QTFMYDC.js.map → recompile-project-agents-U3UGHPWG.js.map} +0 -0
  81. /package/dist/{source-loader-I6SWWDUF.js.map → source-loader-E2Y5MMN5.js.map} +0 -0
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ computeScopeDiff
4
+ } from "./chunk-FACDJH6O.js";
5
+ import {
6
+ getSkillEntryDisplayName
7
+ } from "./chunk-UE4Z3YMB.js";
8
+ import {
9
+ CLI_COLORS,
10
+ EJECT_SOURCE,
11
+ UI_SYMBOLS
12
+ } from "./chunk-U46LYYRA.js";
13
+
14
+ // src/cli/components/common/skill-agent-summary.tsx
15
+ import { Box, Text } from "ink";
16
+ import "react";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
18
+ var TableHeader = ({ children }) => /* @__PURE__ */ jsx(Text, { bold: true, color: CLI_COLORS.WARNING, children });
19
+ var ScopeLabel = ({ children }) => /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WHITE, backgroundColor: CLI_COLORS.LABEL_BG, children: ` ${children} ` });
20
+ var EjectIcon = () => /* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.WARNING, children: [
21
+ " ",
22
+ UI_SYMBOLS.EJECT
23
+ ] });
24
+ var DIFF_PREFIX = {
25
+ added: `${UI_SYMBOLS.ADDED} `,
26
+ "mode-changed": `${UI_SYMBOLS.CHANGED} `,
27
+ overwritten: `${UI_SYMBOLS.OVERWRITTEN} `,
28
+ changed: `${UI_SYMBOLS.CHANGED} `,
29
+ removed: `${UI_SYMBOLS.REMOVED} `,
30
+ unchanged: `${UI_SYMBOLS.BULLET} `
31
+ };
32
+ var DIFF_COLOR = {
33
+ added: CLI_COLORS.SUCCESS,
34
+ "mode-changed": CLI_COLORS.WARNING,
35
+ overwritten: CLI_COLORS.WARNING,
36
+ changed: CLI_COLORS.WARNING,
37
+ removed: CLI_COLORS.ERROR,
38
+ unchanged: CLI_COLORS.NEUTRAL
39
+ };
40
+ var NAME_GUTTER_COLUMNS = 3;
41
+ var SkillRow = ({ row }) => /* @__PURE__ */ jsxs(Box, { width: "50%", paddingRight: NAME_GUTTER_COLUMNS, children: [
42
+ /* @__PURE__ */ jsx(Box, { flexShrink: 0, children: /* @__PURE__ */ jsx(Text, { color: DIFF_COLOR[row.status], children: DIFF_PREFIX[row.status] }) }),
43
+ /* @__PURE__ */ jsxs(Text, { color: DIFF_COLOR[row.status], children: [
44
+ getSkillEntryDisplayName(row),
45
+ row.source === EJECT_SOURCE && /* @__PURE__ */ jsx(EjectIcon, {})
46
+ ] })
47
+ ] });
48
+ var AgentRow = ({ row }) => /* @__PURE__ */ jsxs(Text, { color: DIFF_COLOR[row.status], children: [
49
+ DIFF_PREFIX[row.status],
50
+ row.name
51
+ ] });
52
+ var skillRowKey = (row) => row.status === "removed" ? `removed-${row.id}` : row.id;
53
+ var agentRowKey = (row) => row.status === "removed" ? `removed-${row.name}` : row.name;
54
+ var SkillAgentSummary = ({
55
+ skillConfigs,
56
+ agentConfigs,
57
+ ...baseline
58
+ }) => {
59
+ const diff = computeScopeDiff({
60
+ currentSkills: skillConfigs,
61
+ currentAgents: agentConfigs,
62
+ ...baseline
63
+ });
64
+ if (!diff.hasContent) return null;
65
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "row", width: "100%", children: [
66
+ /* @__PURE__ */ jsxs(
67
+ Box,
68
+ {
69
+ flexDirection: "column",
70
+ borderStyle: "single",
71
+ flexGrow: 2,
72
+ flexBasis: 0,
73
+ borderRight: true,
74
+ borderTop: false,
75
+ borderBottom: false,
76
+ borderLeft: false,
77
+ borderColor: CLI_COLORS.NEUTRAL,
78
+ borderRightDimColor: true,
79
+ children: [
80
+ /* @__PURE__ */ jsx(TableHeader, { children: "Skills" }),
81
+ diff.projectSkillRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
82
+ /* @__PURE__ */ jsx(ScopeLabel, { children: "Project" }),
83
+ /* @__PURE__ */ jsx(Box, { flexWrap: "wrap", children: diff.projectSkillRows.map((row) => /* @__PURE__ */ jsx(SkillRow, { row }, skillRowKey(row))) })
84
+ ] }),
85
+ diff.globalSkillRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
86
+ /* @__PURE__ */ jsx(ScopeLabel, { children: "Global" }),
87
+ /* @__PURE__ */ jsx(Box, { flexWrap: "wrap", children: diff.globalSkillRows.map((row) => /* @__PURE__ */ jsx(SkillRow, { row }, skillRowKey(row))) })
88
+ ] })
89
+ ]
90
+ }
91
+ ),
92
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginLeft: 1, paddingLeft: 1, children: [
93
+ /* @__PURE__ */ jsx(TableHeader, { children: "Agents" }),
94
+ diff.projectAgentRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
95
+ /* @__PURE__ */ jsx(ScopeLabel, { children: "Project" }),
96
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: diff.projectAgentRows.map((row) => /* @__PURE__ */ jsx(AgentRow, { row }, agentRowKey(row))) })
97
+ ] }),
98
+ diff.globalAgentRows.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
99
+ /* @__PURE__ */ jsx(ScopeLabel, { children: "Global" }),
100
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: diff.globalAgentRows.map((row) => /* @__PURE__ */ jsx(AgentRow, { row }, agentRowKey(row))) })
101
+ ] })
102
+ ] })
103
+ ] });
104
+ };
105
+
106
+ export {
107
+ SkillAgentSummary
108
+ };
109
+ //# sourceMappingURL=chunk-5CFHP6Z5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/common/skill-agent-summary.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS, EJECT_SOURCE, UI_SYMBOLS } from \"../../consts.js\";\nimport { computeScopeDiff } from \"../../lib/configuration/scope-diff.js\";\nimport type {\n AgentDiffRow,\n DiffRowStatus,\n ScopeDiffInput,\n SkillDiffRow,\n} from \"../../lib/configuration/scope-diff.js\";\nimport { getSkillEntryDisplayName } from \"../../lib/matrix/matrix-provider.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\n\nexport type SkillAgentSummaryProps = Pick<\n ScopeDiffInput,\n | \"installedSkillConfigs\"\n | \"installedAgentConfigs\"\n | \"isInitMode\"\n | \"overwrittenSkillIds\"\n | \"changedAgentNames\"\n> & {\n skillConfigs: SkillConfig[];\n agentConfigs: AgentScopeConfig[];\n};\n\nconst TableHeader: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Text bold color={CLI_COLORS.WARNING}>\n {children}\n </Text>\n);\n\nconst ScopeLabel: React.FC<{ children: string }> = ({ children }) => (\n <Text color={CLI_COLORS.WHITE} backgroundColor={CLI_COLORS.LABEL_BG}>\n {` ${children} `}\n </Text>\n);\n\nconst EjectIcon: React.FC = () => <Text color={CLI_COLORS.WARNING}> {UI_SYMBOLS.EJECT}</Text>;\n\nconst DIFF_PREFIX: Record<DiffRowStatus, string> = {\n added: `${UI_SYMBOLS.ADDED} `,\n \"mode-changed\": `${UI_SYMBOLS.CHANGED} `,\n overwritten: `${UI_SYMBOLS.OVERWRITTEN} `,\n changed: `${UI_SYMBOLS.CHANGED} `,\n removed: `${UI_SYMBOLS.REMOVED} `,\n unchanged: `${UI_SYMBOLS.BULLET} `,\n};\n\nconst DIFF_COLOR: Record<DiffRowStatus, string> = {\n added: CLI_COLORS.SUCCESS,\n \"mode-changed\": CLI_COLORS.WARNING,\n overwritten: CLI_COLORS.WARNING,\n changed: CLI_COLORS.WARNING,\n removed: CLI_COLORS.ERROR,\n unchanged: CLI_COLORS.NEUTRAL,\n};\n\n/**\n * Yoga widens a text to whole columns on both sides and Ink draws it from its rounded left, so a\n * name in a half that starts or ends mid-column draws up to two columns past the half: over the\n * next name, or over the table's border. The third column stays blank.\n */\nconst NAME_GUTTER_COLUMNS = 3;\n\n/**\n * A long name wraps under itself, beside a prefix that never shrinks, and carries its mark in its\n * own text: drawn beside the name, the mark covered its last letters.\n */\nconst SkillRow: React.FC<{ row: SkillDiffRow }> = ({ row }) => (\n <Box width=\"50%\" paddingRight={NAME_GUTTER_COLUMNS}>\n <Box flexShrink={0}>\n <Text color={DIFF_COLOR[row.status]}>{DIFF_PREFIX[row.status]}</Text>\n </Box>\n <Text color={DIFF_COLOR[row.status]}>\n {getSkillEntryDisplayName(row)}\n {row.source === EJECT_SOURCE && <EjectIcon />}\n </Text>\n </Box>\n);\n\nconst AgentRow: React.FC<{ row: AgentDiffRow }> = ({ row }) => (\n <Text color={DIFF_COLOR[row.status]}>\n {DIFF_PREFIX[row.status]}\n {row.name}\n </Text>\n);\n\nconst skillRowKey = (row: SkillDiffRow): string =>\n row.status === \"removed\" ? `removed-${row.id}` : row.id;\n\nconst agentRowKey = (row: AgentDiffRow): string =>\n row.status === \"removed\" ? `removed-${row.name}` : row.name;\n\nexport const SkillAgentSummary: React.FC<SkillAgentSummaryProps> = ({\n skillConfigs,\n agentConfigs,\n ...baseline\n}) => {\n const diff = computeScopeDiff({\n currentSkills: skillConfigs,\n currentAgents: agentConfigs,\n ...baseline,\n });\n\n if (!diff.hasContent) return null;\n\n return (\n <Box flexDirection=\"row\" width=\"100%\">\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n flexGrow={2}\n flexBasis={0}\n borderRight={true}\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderRightDimColor\n >\n <TableHeader>Skills</TableHeader>\n {diff.projectSkillRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Project</ScopeLabel>\n <Box flexWrap=\"wrap\">\n {diff.projectSkillRows.map((row) => (\n <SkillRow key={skillRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n {diff.globalSkillRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Global</ScopeLabel>\n <Box flexWrap=\"wrap\">\n {diff.globalSkillRows.map((row) => (\n <SkillRow key={skillRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginLeft={1} paddingLeft={1}>\n <TableHeader>Agents</TableHeader>\n {diff.projectAgentRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Project</ScopeLabel>\n <Box flexDirection=\"column\">\n {diff.projectAgentRows.map((row) => (\n <AgentRow key={agentRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n {diff.globalAgentRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Global</ScopeLabel>\n <Box flexDirection=\"column\">\n {diff.globalAgentRows.map((row) => (\n <AgentRow key={agentRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,KAAK,YAAY;AAC1B,OAAkB;AAyBhB,cAWgC,YAXhC;AADF,IAAM,cAAuD,CAAC,EAAE,SAAS,MACvE,oBAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAC1B,UACH;AAGF,IAAM,aAA6C,CAAC,EAAE,SAAS,MAC7D,oBAAC,QAAK,OAAO,WAAW,OAAO,iBAAiB,WAAW,UACxD,cAAI,QAAQ,KACf;AAGF,IAAM,YAAsB,MAAM,qBAAC,QAAK,OAAO,WAAW,SAAS;AAAA;AAAA,EAAE,WAAW;AAAA,GAAM;AAEtF,IAAM,cAA6C;AAAA,EACjD,OAAO,GAAG,WAAW,KAAK;AAAA,EAC1B,gBAAgB,GAAG,WAAW,OAAO;AAAA,EACrC,aAAa,GAAG,WAAW,WAAW;AAAA,EACtC,SAAS,GAAG,WAAW,OAAO;AAAA,EAC9B,SAAS,GAAG,WAAW,OAAO;AAAA,EAC9B,WAAW,GAAG,WAAW,MAAM;AACjC;AAEA,IAAM,aAA4C;AAAA,EAChD,OAAO,WAAW;AAAA,EAClB,gBAAgB,WAAW;AAAA,EAC3B,aAAa,WAAW;AAAA,EACxB,SAAS,WAAW;AAAA,EACpB,SAAS,WAAW;AAAA,EACpB,WAAW,WAAW;AACxB;AAOA,IAAM,sBAAsB;AAM5B,IAAM,WAA4C,CAAC,EAAE,IAAI,MACvD,qBAAC,OAAI,OAAM,OAAM,cAAc,qBAC7B;AAAA,sBAAC,OAAI,YAAY,GACf,8BAAC,QAAK,OAAO,WAAW,IAAI,MAAM,GAAI,sBAAY,IAAI,MAAM,GAAE,GAChE;AAAA,EACA,qBAAC,QAAK,OAAO,WAAW,IAAI,MAAM,GAC/B;AAAA,6BAAyB,GAAG;AAAA,IAC5B,IAAI,WAAW,gBAAgB,oBAAC,aAAU;AAAA,KAC7C;AAAA,GACF;AAGF,IAAM,WAA4C,CAAC,EAAE,IAAI,MACvD,qBAAC,QAAK,OAAO,WAAW,IAAI,MAAM,GAC/B;AAAA,cAAY,IAAI,MAAM;AAAA,EACtB,IAAI;AAAA,GACP;AAGF,IAAM,cAAc,CAAC,QACnB,IAAI,WAAW,YAAY,WAAW,IAAI,EAAE,KAAK,IAAI;AAEvD,IAAM,cAAc,CAAC,QACnB,IAAI,WAAW,YAAY,WAAW,IAAI,IAAI,KAAK,IAAI;AAElD,IAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,OAAO,iBAAiB;AAAA,IAC5B,eAAe;AAAA,IACf,eAAe;AAAA,IACf,GAAG;AAAA,EACL,CAAC;AAED,MAAI,CAAC,KAAK,WAAY,QAAO;AAE7B,SACE,qBAAC,OAAI,eAAc,OAAM,OAAM,QAC7B;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,UAAU;AAAA,QACV,WAAW;AAAA,QACX,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,aAAa,WAAW;AAAA,QACxB,qBAAmB;AAAA,QAEnB;AAAA,8BAAC,eAAY,oBAAM;AAAA,UAClB,KAAK,iBAAiB,SAAS,KAC9B,qBAAC,OAAI,eAAc,UAAS,WAAW,GACrC;AAAA,gCAAC,cAAW,qBAAO;AAAA,YACnB,oBAAC,OAAI,UAAS,QACX,eAAK,iBAAiB,IAAI,CAAC,QAC1B,oBAAC,YAAgC,OAAlB,YAAY,GAAG,CAAa,CAC5C,GACH;AAAA,aACF;AAAA,UAED,KAAK,gBAAgB,SAAS,KAC7B,qBAAC,OAAI,eAAc,UAAS,WAAW,GACrC;AAAA,gCAAC,cAAW,oBAAM;AAAA,YAClB,oBAAC,OAAI,UAAS,QACX,eAAK,gBAAgB,IAAI,CAAC,QACzB,oBAAC,YAAgC,OAAlB,YAAY,GAAG,CAAa,CAC5C,GACH;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ;AAAA,IACA,qBAAC,OAAI,eAAc,UAAS,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GACjF;AAAA,0BAAC,eAAY,oBAAM;AAAA,MAClB,KAAK,iBAAiB,SAAS,KAC9B,qBAAC,OAAI,eAAc,UAAS,WAAW,GACrC;AAAA,4BAAC,cAAW,qBAAO;AAAA,QACnB,oBAAC,OAAI,eAAc,UAChB,eAAK,iBAAiB,IAAI,CAAC,QAC1B,oBAAC,YAAgC,OAAlB,YAAY,GAAG,CAAa,CAC5C,GACH;AAAA,SACF;AAAA,MAED,KAAK,gBAAgB,SAAS,KAC7B,qBAAC,OAAI,eAAc,UAAS,WAAW,GACrC;AAAA,4BAAC,cAAW,oBAAM;AAAA,QAClB,oBAAC,OAAI,eAAc,UAChB,eAAK,gBAAgB,IAAI,CAAC,QACzB,oBAAC,YAAgC,OAAlB,YAAY,GAAG,CAAa,CAC5C,GACH;AAAA,SACF;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -4,13 +4,16 @@ import {
4
4
  arrivedAsText,
5
5
  jsonBodyOrUndefined,
6
6
  retryAfterSeconds
7
- } from "./chunk-SRII2GMF.js";
7
+ } from "./chunk-SN64WNWE.js";
8
8
  import {
9
9
  withoutExcludedAssignments
10
- } from "./chunk-GNMRXXRY.js";
10
+ } from "./chunk-MQZNDK5F.js";
11
11
  import {
12
12
  readCarriedSkills
13
- } from "./chunk-37QFHJUW.js";
13
+ } from "./chunk-JTMSFBCA.js";
14
+ import {
15
+ namedByActiveEntries
16
+ } from "./chunk-FACDJH6O.js";
14
17
  import {
15
18
  ERROR_MESSAGES,
16
19
  directoryExists,
@@ -21,13 +24,13 @@ import {
21
24
  loadProjectConfigFromDir,
22
25
  readForkedFromMetadata,
23
26
  resolveInstallPaths
24
- } from "./chunk-YM3VEDAP.js";
27
+ } from "./chunk-ENET4IF6.js";
25
28
  import {
26
29
  plural,
27
30
  truncateText,
28
31
  typedEntries,
29
32
  typedValues
30
- } from "./chunk-TG3SPPZY.js";
33
+ } from "./chunk-UE4Z3YMB.js";
31
34
  import {
32
35
  CLI_INVOKE_COMMAND,
33
36
  DEFAULT_PUBLIC_SOURCE_NAME,
@@ -174,8 +177,15 @@ async function seedPayloadForInstallation(projectDir) {
174
177
  const skills = Object.keys(payload.skills).length;
175
178
  const agents = Object.keys(payload.agents).length;
176
179
  if (skills === 0 && agents === 0) return { ok: false, error: ERROR_MESSAGES.NO_INSTALLATION };
177
- const leftBehind = skillsItsMarketplaceLeavesBehind(roundTrip.config, payload);
178
- return { ok: true, payload, skills, agents, leftBehind, inProject: installed.inProject };
180
+ return {
181
+ ok: true,
182
+ payload,
183
+ skills,
184
+ agents,
185
+ leftBehind: skillsItsMarketplaceLeavesBehind(roundTrip.config, payload),
186
+ namedBy: namedByActiveEntries(roundTrip.config.skills),
187
+ inProject: installed.inProject
188
+ };
179
189
  }
180
190
  async function editorPayloadForInstallation(projectDir) {
181
191
  const prepared = await seedPayloadForInstallation(projectDir);
@@ -371,4 +381,4 @@ export {
371
381
  skillsAuthoredHere,
372
382
  publishSeedConfig
373
383
  };
374
- //# sourceMappingURL=chunk-MFCZARV2.js.map
384
+ //# sourceMappingURL=chunk-B7AVWSK2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/seed/installation-payload.ts","../src/cli/lib/seed/config-to-seed.ts","../src/cli/lib/seed/publish-seed.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\n\nimport {\n configToSeedPayload,\n isInstalled,\n skillsItsMarketplaceLeavesBehind,\n} from \"./config-to-seed.js\";\nimport { readCarriedSkills } from \"./external-skills.js\";\nimport { EJECT_SOURCE } from \"../../consts.js\";\nimport { withoutExcludedAssignments } from \"../agents/agent-recompiler.js\";\nimport { loadConfigInPlay, loadProjectConfigFromDir } from \"../configuration/project-config.js\";\nimport { activeAgentScopeMap, activeSkillScopeMap } from \"../configuration/scope-predicates.js\";\nimport { namedByActiveEntries, type NamedBy } from \"../configuration/scope-diff.js\";\nimport { getProjectConfigPath, resolveInstallPaths } from \"../installation/install-base-dir.js\";\nimport { readForkedFromMetadata } from \"../skills/skill-metadata.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { directoryExists } from \"../../utils/fs.js\";\nimport { ERROR_MESSAGES } from \"../../utils/messages.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\n\nimport type { ContentReading, OwnedSkillDir } from \"./external-skills.js\";\nimport type { LoadedProjectConfig } from \"../configuration/project-config.js\";\nimport type { AgentScopeConfig, ProjectConfig, SkillConfig, SkillId } from \"../../types/index.js\";\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\n/**\n * Counts come off the payload, not the config, so what is announced matches what is posted.\n * `leftBehind`: carried skills the payload's one marketplace does not serve. `namedBy`: the entries\n * the payload was drawn from, since a plugin's payload entry records no name. `inProject`: read\n * from a project's config rather than HOME's.\n */\nexport type InstallationPayload =\n | {\n ok: true;\n payload: SeedPayload;\n skills: number;\n agents: number;\n leftBehind: SkillId[];\n namedBy: NamedBy;\n inProject: boolean;\n }\n | { ok: false; error: string };\n\n/** `inheritedFrom` is absent when the config read is the global one already. */\ntype InstalledConfig =\n | {\n ok: true;\n config: ProjectConfig;\n inheritedFrom: ProjectConfig | undefined;\n inProject: boolean;\n }\n | { ok: false; error: string };\n\ntype MappedPayload = { ok: true; payload: SeedPayload } | { ok: false; error: string };\n\ntype RoundTrip = { config: ProjectConfig; content: ContentReading };\n\ntype SkillJudgement = { skill: SkillConfig; owned: boolean; carried: OwnedSkillDir | null };\n\n/** `share`'s, and what `edit --ui` marks; fails as a message, never a throw. */\nexport async function seedPayloadForInstallation(projectDir: string): Promise<InstallationPayload> {\n const installed = await readInstalledConfig(projectDir);\n if (!installed.ok) return installed;\n\n const roundTrip = await readRoundTrip(installed.config, projectDir);\n const mapped = mapOrRefuse(roundTrip, installed.inheritedFrom);\n if (!mapped.ok) return mapped;\n\n const { payload } = mapped;\n const skills = Object.keys(payload.skills).length;\n const agents = Object.keys(payload.agents).length;\n\n // A sub-agent is installable without skills, so only neither-skills-nor-agents is empty.\n if (skills === 0 && agents === 0) return { ok: false, error: ERROR_MESSAGES.NO_INSTALLATION };\n\n return {\n ok: true,\n payload,\n skills,\n agents,\n leftBehind: skillsItsMarketplaceLeavesBehind(roundTrip.config, payload),\n namedBy: namedByActiveEntries(roundTrip.config.skills),\n inProject: installed.inProject,\n };\n}\n\n/**\n * Made in a project, the link says so: the editor holds its global entries, which a run there\n * cannot change. A share's recipient has a global install of their own, so `share` never marks.\n */\nexport async function editorPayloadForInstallation(\n projectDir: string,\n): Promise<InstallationPayload> {\n const prepared = await seedPayloadForInstallation(projectDir);\n if (!prepared.ok || !prepared.inProject) return prepared;\n\n return { ...prepared, payload: { ...prepared.payload, fromProject: true } };\n}\n\n/** An unloadable config, HOME's included, is reported as its own error, not \"not installed\". */\nasync function readInstalledConfig(projectDir: string): Promise<InstalledConfig> {\n try {\n const loaded = await loadConfigInPlay(projectDir);\n if (!loaded) return { ok: false, error: ERROR_MESSAGES.NO_INSTALLATION };\n const inheritedFrom = await readInheritedConfig(loaded);\n return {\n ok: true,\n config: withInheritedCuration(loaded.config, inheritedFrom),\n inheritedFrom,\n inProject: !isGlobalConfig(loaded),\n };\n } catch (error) {\n return { ok: false, error: getErrorMessage(error) };\n }\n}\n\nasync function readInheritedConfig(\n loaded: LoadedProjectConfig,\n): Promise<ProjectConfig | undefined> {\n if (isGlobalConfig(loaded)) return undefined;\n\n // Aborts: a throw reaches readInstalledConfig and refuses the share.\n const home = await loadProjectConfigFromDir(os.homedir(), loaded.provider);\n return home?.config;\n}\n\nfunction isGlobalConfig(loaded: LoadedProjectConfig): boolean {\n return loaded.configPath === getProjectConfigPath(os.homedir(), loaded.provider);\n}\n\n/**\n * A project file keeps stack rows for its own sub-agents only, so inherited sub-agents take their\n * rows from the global config (which wins, since it compiles them).\n */\nfunction withInheritedCuration(\n config: ProjectConfig,\n inheritedFrom: ProjectConfig | undefined,\n): ProjectConfig {\n if (inheritedFrom?.stack === undefined) return config;\n\n return { ...config, stack: { ...config.stack, ...inheritedRows(config, inheritedFrom.stack) } };\n}\n\n/** Narrowed to inherited sub-agents and skills, so no global row lands on a project-scoped entry. */\nfunction inheritedRows(\n config: ProjectConfig,\n globalStack: NonNullable<ProjectConfig[\"stack\"]>,\n): NonNullable<ProjectConfig[\"stack\"]> {\n const agents = inheritedAgents(config.agents);\n const rows = Object.fromEntries(typedEntries(globalStack).filter(([agent]) => agents.has(agent)));\n return withoutExcludedAssignments(rows, skillsNotInherited(config.skills));\n}\n\nfunction inheritedAgents(agents: AgentScopeConfig[]): Set<string> {\n const scopes = activeAgentScopeMap(agents);\n return new Set(agents.map((agent) => agent.name).filter((name) => scopes.get(name) === \"global\"));\n}\n\nfunction skillsNotInherited(skills: SkillConfig[]): Set<SkillId> {\n const scopes = activeSkillScopeMap(skills);\n return new Set(skills.map((skill) => skill.id).filter((id) => scopes.get(id) !== \"global\"));\n}\n\n/**\n * Drops skills the CLI did not write (no `forkedFrom`): a user-authored skill is outside the round\n * trip, neither carried nor refused.\n */\nasync function readRoundTrip(config: ProjectConfig, projectDir: string): Promise<RoundTrip> {\n const owned = (await judgeSkills(config, projectDir)).filter((entry) => entry.owned);\n\n return {\n config: { ...config, skills: owned.map((entry) => entry.skill) },\n content: await readCarriedSkills(owned.flatMap((entry) => entry.carried ?? [])),\n };\n}\n\nfunction judgeSkills(config: ProjectConfig, projectDir: string): Promise<SkillJudgement[]> {\n return Promise.all(config.skills.map((skill) => judgeSkill(skill, projectDir)));\n}\n\n/** User-authored skills, which `edit --from` must not read a payload's silence as deleting. */\nexport async function skillsAuthoredHere(\n config: ProjectConfig,\n projectDir: string,\n): Promise<Set<SkillId>> {\n const judged = await judgeSkills(config, projectDir);\n return new Set(judged.filter((entry) => !entry.owned).map((entry) => entry.skill.id));\n}\n\nfunction travelsAsAnId(skill: SkillConfig): SkillJudgement {\n return { skill, owned: true, carried: null };\n}\n\n/** Only an existing directory with no provenance is the user's own work. */\nasync function judgeSkill(skill: SkillConfig, projectDir: string): Promise<SkillJudgement> {\n if (skill.origin !== EJECT_SOURCE) return travelsAsAnId(skill);\n if (!isInstalled(skill)) return travelsAsAnId(skill);\n\n const skillsDir = resolveInstallPaths(projectDir, skill.scope).skillsDir;\n const skillDir = path.join(skillsDir, skill.id);\n if (!(await directoryExists(skillDir))) return travelsAsAnId(skill);\n\n const provenance = await readForkedFromMetadata(skillDir);\n if (provenance === null) return { skill, owned: false, carried: null };\n\n return { skill, owned: true, carried: { id: skill.id, skillDir, provenance } };\n}\n\nfunction mapOrRefuse(\n { config, content }: RoundTrip,\n inheritedFrom: ProjectConfig | undefined,\n): MappedPayload {\n try {\n return { ok: true, payload: configToSeedPayload(config, content, inheritedFrom) };\n } catch (error) {\n return { ok: false, error: getErrorMessage(error) };\n }\n}\n","import { MATRIX_VERSION } from \"@workspace/matrix\";\nimport { SEED_VERSION, seedModelSchema } from \"@workspace/matrix/seed\";\n\nimport { DEFAULT_PUBLIC_SOURCE_NAME, EJECT_SOURCE } from \"../../consts.js\";\nimport { isScopePairCompatible } from \"../configuration/config-generator.js\";\nimport { typedEntries, typedValues } from \"../../utils/typed-object.js\";\n\nimport type { ContentReading } from \"./external-skills.js\";\nimport type {\n AgentScopeConfig,\n ProjectConfig,\n SkillConfig,\n SkillScope,\n} from \"../../types/config.js\";\nimport type { ModelName } from \"../../types/matrix.js\";\nimport type { SkillId } from \"../../types/skills.js\";\nimport type {\n SeedAgent,\n SeedLoadState,\n SeedModel,\n SeedPayload,\n SeedSkill,\n} from \"@workspace/matrix/seed\";\n\ntype SeedAssignments = Record<string, SeedLoadState>;\n\ntype StackReading = {\n assignments: Map<SkillId, SeedAssignments>;\n unwritable: string[];\n};\n\n/** A tombstone describes something not installed, so it has nothing to say on the wire. */\nexport function isInstalled(entry: { excluded?: boolean }): boolean {\n return !entry.excluded;\n}\n\n/** An ejected copy travels with the project, and the default catalogue is what no ref means. */\nfunction needsMarketplaceNamed(origin: string): boolean {\n return origin !== EJECT_SOURCE && origin !== DEFAULT_PUBLIC_SOURCE_NAME;\n}\n\n/** The contract's own enum, so widening `MODEL_NAMES` alone cannot silently drop a pin. */\nfunction isSeedModel(model: ModelName): model is SeedModel {\n return seedModelSchema.safeParse(model).success;\n}\n\nfunction seedLoadState(preloaded: boolean | undefined): SeedLoadState {\n return preloaded === true ? \"preloaded\" : \"lazy\";\n}\n\nfunction unnameableOriginMessage(skill: SkillConfig): string {\n return `${skill.id} comes from the marketplace '${skill.origin}', and this installation does not record where that marketplace is fetched from`;\n}\n\nfunction unnameableModelMessage(agent: AgentScopeConfig[\"name\"], model: ModelName): string {\n return `${agent} pins model '${model}', which this contract has no word for — leaving it out would say \"keep the sub-agent's own metadata\", which is a different instruction`;\n}\n\nfunction unwritablePairMessage(skillId: SkillId, agent: string): string {\n return `${skillId} -> ${agent}: a project-scoped skill never reaches a sub-agent that rests at global scope`;\n}\n\nfunction unshareableConfigError(unshareable: string[]): string {\n return [\n \"This installation cannot be shared as it stands — a shared configuration has no way to carry:\",\n ...unshareable.map((line) => ` ${line}`),\n \"Sharing it anyway would mint an id that installs something else.\",\n ].join(\"\\n\");\n}\n\ntype MarketplaceReading = {\n ref: string | undefined;\n unnameable: string[];\n};\n\ntype MarketplaceRecord = Pick<ProjectConfig, \"marketplace\" | \"marketplaceName\">;\n\n/** `origin` is a marketplace name, `marketplace` its ref, and `marketplaceName` joins them. */\nfunction isRecordedMarketplace(record: MarketplaceRecord | undefined, skill: SkillConfig): boolean {\n return record?.marketplace !== undefined && skill.origin === record.marketplaceName;\n}\n\n/** A payload names one marketplace; only a skill whose marketplace neither config records is refused. */\nfunction readMarketplace(\n config: ProjectConfig,\n skills: SkillConfig[],\n inheritedFrom: MarketplaceRecord | undefined,\n): MarketplaceReading {\n const served = skills.filter((skill) => needsMarketplaceNamed(skill.origin));\n const unaccounted = served.filter(\n (skill) =>\n !isRecordedMarketplace(config, skill) && !isRecordedMarketplace(inheritedFrom, skill),\n );\n if (unaccounted.length > 0) {\n return { ref: undefined, unnameable: unaccounted.map(unnameableOriginMessage) };\n }\n\n const servesItsOwn = served.some((skill) => isRecordedMarketplace(config, skill));\n return { ref: servesItsOwn ? config.marketplace : undefined, unnameable: [] };\n}\n\n/** Plugins from a marketplace other than the payload's one, which an install will skip. */\nexport function skillsItsMarketplaceLeavesBehind(\n config: ProjectConfig,\n payload: SeedPayload,\n): SkillId[] {\n const namedMarketplace =\n payload.marketplace === undefined ? DEFAULT_PUBLIC_SOURCE_NAME : config.marketplaceName;\n const isPluginFromElsewhere = (skill: SkillConfig): boolean =>\n skill.origin !== EJECT_SOURCE && skill.origin !== namedMarketplace;\n\n return config.skills\n .filter(isInstalled)\n .filter(isPluginFromElsewhere)\n .map((skill) => skill.id);\n}\n\nfunction unnameableModels(agents: AgentScopeConfig[]): string[] {\n return agents.flatMap((agent) =>\n agent.model !== undefined && !isSeedModel(agent.model)\n ? [unnameableModelMessage(agent.name, agent.model)]\n : [],\n );\n}\n\n/** Re-keys rows by skill; rows the decoder would refuse are collected for the refusal. */\nfunction readStack(\n stack: ProjectConfig[\"stack\"],\n skillScopes: Map<SkillId, SkillScope>,\n agentScopes: Map<string, SkillScope>,\n): StackReading {\n const assignments = new Map<SkillId, SeedAssignments>();\n const unwritable: string[] = [];\n\n for (const [agent, agentStack] of typedEntries(stack ?? {})) {\n const agentScope = agentScopes.get(agent);\n if (agentScope === undefined) continue;\n\n for (const { id, preloaded } of typedValues(agentStack).flat()) {\n const skillScope = skillScopes.get(id);\n if (skillScope === undefined) continue;\n\n if (!isScopePairCompatible(skillScope, agentScope)) {\n unwritable.push(unwritablePairMessage(id, agent));\n continue;\n }\n\n const forSkill = assignments.get(id) ?? {};\n forSkill[agent] = seedLoadState(preloaded);\n assignments.set(id, forSkill);\n }\n }\n\n return { assignments, unwritable };\n}\n\nfunction toSeedSkill(skill: SkillConfig, assignments: SeedAssignments | undefined): SeedSkill {\n return {\n // A plugin's marketplace has already been checked against the envelope's ref.\n install: skill.origin === EJECT_SOURCE ? \"eject\" : \"plugin\",\n scope: skill.scope,\n assignments: assignments ?? {},\n };\n}\n\n/** Always `on`: it carries a sub-agent that owns no skill, which assignments cannot. */\nfunction toSeedAgent(agent: AgentScopeConfig): SeedAgent {\n return {\n on: true,\n scope: agent.scope,\n ...(agent.model !== undefined && isSeedModel(agent.model) && { model: agent.model }),\n ...(agent.codexModel !== undefined && { codexModel: agent.codexModel }),\n ...(agent.effort !== undefined && { effort: agent.effort }),\n };\n}\n\n/** Inverse of `seedToInstallSelection`; anything the contract cannot state is refused by name. */\nexport function configToSeedPayload(\n config: ProjectConfig,\n carried: ContentReading,\n inheritedFrom?: MarketplaceRecord,\n): SeedPayload {\n const skills = config.skills.filter(isInstalled);\n const agents = config.agents.filter(isInstalled);\n const skillScopes = new Map(skills.map((skill) => [skill.id, skill.scope]));\n const agentScopes = new Map<string, SkillScope>(agents.map((agent) => [agent.name, agent.scope]));\n\n const { assignments, unwritable } = readStack(config.stack, skillScopes, agentScopes);\n const marketplace = readMarketplace(config, skills, inheritedFrom);\n\n const unshareable = [\n ...marketplace.unnameable,\n ...unnameableModels(agents),\n ...unwritable,\n ...carried.uncarryable,\n ];\n if (unshareable.length > 0) throw new Error(unshareableConfigError(unshareable));\n\n return {\n v: SEED_VERSION,\n matrixVersion: MATRIX_VERSION,\n stackId: null,\n // Absent rather than empty: an id is the hash of its body.\n ...(config.description !== undefined && { description: config.description }),\n ...(marketplace.ref !== undefined && { marketplace: marketplace.ref }),\n skills: Object.fromEntries(\n skills.map((skill) => [skill.id, toSeedSkill(skill, assignments.get(skill.id))]),\n ),\n ...(Object.keys(carried.external).length > 0 && { external: carried.external }),\n agents: Object.fromEntries(agents.map((agent) => [agent.name, toSeedAgent(agent)])),\n };\n}\n","import { STATUS_CODES } from \"node:http\";\n\nimport { retryAfterSeconds } from \"@workspace/api\";\nimport { z } from \"zod\";\n\nimport { SEED_API_URL } from \"../../consts.js\";\nimport { arrivedAsText, jsonBodyOrUndefined, SEED_USER_AGENT } from \"./fetch-seed.js\";\nimport { CLI_INVOKE_COMMAND } from \"../../consts.js\";\nimport { plural, truncateText } from \"../../utils/string.js\";\n\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\n/** Revalidated: the deployed worker may not match the one this CLI was built against. */\nconst mintedSchema = z.object({ id: z.string().min(1) });\n\n/** `@hono/zod-validator` sends the `safeParse` result; its error crosses as `{ name, message }`. */\nconst refusalSchema = z.object({ error: z.object({ message: z.string() }) });\n\n/** Zod renders its issues into `message` as JSON; the readable sentences are inside. */\nconst refusedIssuesSchema = z\n .array(\n z.object({\n path: z.array(z.union([z.string(), z.number()])),\n message: z.string().min(1),\n }),\n )\n .min(1);\n\n/** Holds about two of the store's refusal sentences; a longer body must not paint the terminal. */\nconst EXPLANATION_BUDGET = 300;\n\nconst CONTRACT_MISMATCH = 409;\n\nconst RATE_LIMITED = 429;\n\n/** The editor's `limitReachedNote` wording, so both front doors say it alike. */\nconst LIMIT_REACHED = \"rate limit reached — try again in\";\n\nconst SECONDS_PER_MINUTE = 60;\n\n/**\n * The store's 409 body says \"Reload the page\", which a terminal cannot do. The seed version is\n * bundled into the CLI, so only a newer CLI fixes it.\n */\nconst OUT_OF_DATE_AGAINST_STORE =\n `This CLI is out of date against the configuration store: it writes a version of the sharing ` +\n `contract the store does not serve, and that version travels inside the CLI rather than with ` +\n `the configuration. Re-run this command through '${CLI_INVOKE_COMMAND}@latest'.`;\n\nexport type PublishSeedResult = { ok: true; id: string } | { ok: false; error: string };\n\n/** Every failure is a message rather than a throw. */\nexport async function publishSeedConfig(payload: SeedPayload): Promise<PublishSeedResult> {\n const response = await postToStore(payload);\n if (response === null) {\n return { ok: false, error: `Could not reach ${SEED_API_URL} — check your connection.` };\n }\n\n if (!response.ok) return { ok: false, error: await refusalMessage(response) };\n\n return mintedIdIn(await jsonBodyOrUndefined(response));\n}\n\n/** Null where the store could not be reached at all. */\nasync function postToStore(payload: SeedPayload): Promise<Response | null> {\n try {\n return await fetch(`${SEED_API_URL}/configs`, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n // Tells the store the configuration came from the CLI rather than a browser.\n \"user-agent\": SEED_USER_AGENT,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n return null;\n }\n}\n\nfunction mintedIdIn(body: unknown): PublishSeedResult {\n if (body === undefined) {\n return { ok: false, error: \"The configuration store returned something that is not JSON.\" };\n }\n\n const minted = mintedSchema.safeParse(body);\n if (!minted.success) {\n return { ok: false, error: \"The configuration store did not return an id for this share.\" };\n }\n\n return { ok: true, id: minted.data.id };\n}\n\n/** Always names the status, and quotes the store's own explanation when it gives one. */\nasync function refusalMessage(response: Response): Promise<string> {\n const failed = `Sharing this configuration failed (HTTP ${response.status})`;\n const refused = `${failed}.`;\n\n if (response.status === CONTRACT_MISMATCH) return `${refused} ${OUT_OF_DATE_AGAINST_STORE}`;\n\n const window = rateLimitWindow(response);\n if (window !== null) return `${failed}: ${LIMIT_REACHED} ${waitOf(window)}.`;\n\n const explanation = explanationOf(response, await refusalBody(response));\n\n return explanation === undefined ? refused : `${refused} The store said: ${explanation}`;\n}\n\n/** Seconds to wait out, or `null` where this is no 429 or its window is unreadable. */\nfunction rateLimitWindow(response: Response): number | null {\n return response.status === RATE_LIMITED ? retryAfterSeconds(response) : null;\n}\n\n/** Minutes round up, so nobody is sent back early. */\nfunction waitOf(seconds: number): string {\n return seconds < SECONDS_PER_MINUTE\n ? plural(seconds, \"second\")\n : plural(Math.ceil(seconds / SECONDS_PER_MINUTE), \"minute\");\n}\n\n/** Not gated on content type: this route refuses as JSON and as plain text. */\nasync function refusalBody(response: Response): Promise<string | undefined> {\n try {\n return await response.text();\n } catch {\n return undefined;\n }\n}\n\nfunction jsonOf(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction explanationOf(response: Response, body: string | undefined): string | undefined {\n if (body === undefined) return undefined;\n\n const said = schemaIssuesIn(body) ?? quotableProseIn(response, body);\n\n return said === undefined ? undefined : truncateText(said, EXPLANATION_BUDGET);\n}\n\nfunction schemaIssuesIn(body: string): string | undefined {\n const refusal = refusalSchema.safeParse(jsonOf(body));\n if (!refusal.success) return undefined;\n\n const issues = refusedIssuesSchema.safeParse(jsonOf(refusal.data.error.message));\n if (!issues.success) return undefined;\n\n return issues.data.map(sentenceOf).join(\"; \");\n}\n\n/** Quoted only when it adds something to the status printed beside it. */\nfunction quotableProseIn(response: Response, body: string): string | undefined {\n if (!arrivedAsText(response)) return undefined;\n\n const said = body.trim();\n if (said === \"\") return undefined;\n if (restatesItsOwnStatus(said, response.status)) return undefined;\n\n return said;\n}\n\n/** Case-insensitive: the worker writes sentence case where the reason phrase is title case. */\nfunction restatesItsOwnStatus(said: string, status: number): boolean {\n const reason = STATUS_CODES[status];\n\n return reason !== undefined && said.toLowerCase() === reason.toLowerCase();\n}\n\ntype RefusedIssue = z.infer<typeof refusedIssuesSchema>[number];\n\n/** Renders like `formatZodIssue`, which cannot take a plain object read off the wire. */\nfunction sentenceOf(issue: RefusedIssue): string {\n const path = issue.path.join(\".\");\n return path === \"\" ? issue.message : `${path}: ${issue.message}`;\n}\n"],"mappings":"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","names":["path"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillAgentSummary
4
- } from "./chunk-ICHWAFAC.js";
4
+ } from "./chunk-5CFHP6Z5.js";
5
5
  import {
6
6
  ALL_SKILLS_EJECTED_LABEL,
7
7
  CLI_COLORS,
@@ -111,4 +111,4 @@ export {
111
111
  summaryPanelText,
112
112
  summaryPanelBlock
113
113
  };
114
- //# sourceMappingURL=chunk-6HJVH27C.js.map
114
+ //# sourceMappingURL=chunk-C2BSCEDN.js.map
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  compileAgents,
4
4
  withCatalogueSeatedFor
5
- } from "./chunk-Q4NWATGH.js";
5
+ } from "./chunk-XMQIWPIR.js";
6
6
  import {
7
7
  loadAgentDefs
8
- } from "./chunk-DQB3E2SX.js";
8
+ } from "./chunk-JNRACLNS.js";
9
9
  import {
10
10
  ConfigLoadError,
11
11
  EXTRACTED_FIELDS,
@@ -43,6 +43,7 @@ import {
43
43
  providerInUse,
44
44
  quoteText,
45
45
  readFile,
46
+ remove,
46
47
  renderKey,
47
48
  renderTypeImportLine,
48
49
  renderUnionBody,
@@ -57,12 +58,12 @@ import {
57
58
  warn,
58
59
  withGateToken,
59
60
  writeFile
60
- } from "./chunk-YM3VEDAP.js";
61
+ } from "./chunk-ENET4IF6.js";
61
62
  import {
62
63
  matrix,
63
64
  typedEntries,
64
65
  typedKeys
65
- } from "./chunk-TG3SPPZY.js";
66
+ } from "./chunk-UE4Z3YMB.js";
66
67
  import {
67
68
  CLI_INVOKE_COMMAND,
68
69
  CODEX_MODEL_NAMES,
@@ -675,8 +676,8 @@ function activeEntriesNotIn(incoming, existing, keyOf) {
675
676
  return incoming.filter((entry) => !entry.excluded && !held.has(keyOf(entry)));
676
677
  }
677
678
  function marketplaceIdentityFilledFrom(existing, arriving) {
678
- const marketplaceName = existing.marketplaceName ?? arriving?.marketplaceName;
679
- const marketplace = existing.marketplace ?? arriving?.marketplace;
679
+ const fillsFromArriving = arriving !== null && existing.marketplace === void 0;
680
+ const { marketplace, marketplaceName } = fillsFromArriving ? arriving : existing;
680
681
  return {
681
682
  ...marketplaceName !== void 0 && { marketplaceName },
682
683
  ...marketplace !== void 0 && { marketplace }
@@ -1238,7 +1239,7 @@ var NOTHING_RECOMPILED = {
1238
1239
  };
1239
1240
  async function recompilePropagated(projectDirs, pairsRewritten) {
1240
1241
  if (projectDirs.length === 0) return NOTHING_RECOMPILED;
1241
- const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-2QTFMYDC.js");
1242
+ const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-U3UGHPWG.js");
1242
1243
  return recompilePropagatedProjectAgents(projectDirs, pairsRewritten);
1243
1244
  }
1244
1245
  function pairRewriteSummary(projectDirs, pairsRewritten) {
@@ -1278,6 +1279,21 @@ async function pairsRewrittenSince(before, projectDirs, provider) {
1278
1279
  );
1279
1280
  return new Set(judged.filter(({ rewritten }) => rewritten).map(({ dir }) => dir));
1280
1281
  }
1282
+ async function restoreProjectPairs(before, provider) {
1283
+ await Promise.all([...before].map(([dir, pair]) => restorePair(dir, pair, provider)));
1284
+ }
1285
+ async function restorePair(dir, [config, types], provider) {
1286
+ const configPath = getProjectConfigPath(dir, provider);
1287
+ await Promise.all([
1288
+ restoreHalf(configPath, config),
1289
+ restoreHalf(typesPathFor(configPath), types)
1290
+ ]);
1291
+ }
1292
+ async function restoreHalf(filePath, before) {
1293
+ if (await readHalf(filePath) === before) return;
1294
+ if (before === null) return remove(filePath);
1295
+ if (typeof before === "string") return writeFile(filePath, before);
1296
+ }
1281
1297
  function snapshotOf(before, dir) {
1282
1298
  const pair = before.get(dir);
1283
1299
  if (pair === void 0) throw new Error(`No snapshot of ${dir} was taken before the fan-out`);
@@ -1334,7 +1350,7 @@ async function applyConsequences(globalConfig, changes, deps, provider, currentP
1334
1350
  function lazyGateDeps(projectDir) {
1335
1351
  return {
1336
1352
  loadMatrix: async () => {
1337
- const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-I6SWWDUF.js");
1353
+ const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-E2Y5MMN5.js");
1338
1354
  const { matrix: matrix2 } = await loadSkillsMatrixFromSource2({
1339
1355
  projectDir,
1340
1356
  skipExtraSources: true,
@@ -1343,7 +1359,7 @@ function lazyGateDeps(projectDir) {
1343
1359
  return matrix2;
1344
1360
  },
1345
1361
  loadAgents: async () => {
1346
- const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-BJ4KBKBA.js");
1362
+ const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-5BSECHE6.js");
1347
1363
  return (await loadAgentDefs2()).agents;
1348
1364
  }
1349
1365
  };
@@ -1361,11 +1377,10 @@ async function writeFromHome(args, homeDir, deps) {
1361
1377
  const provider = providerInUse(homeDir);
1362
1378
  const priorGlobal = await loadProjectConfigFromDir(homeDir, provider);
1363
1379
  const changes = classifyGlobalChange(priorGlobal?.config, finalConfig);
1364
- const globalWritten = await writeGlobalPair(
1365
- finalConfig,
1366
- projectConfigPath,
1367
- deps.matrix,
1368
- deps.agents
1380
+ const globalWritten = await restoringThePairsOnFailure(
1381
+ [homeDir],
1382
+ provider,
1383
+ () => writeGlobalPair(finalConfig, projectConfigPath, deps.matrix, deps.agents)
1369
1384
  );
1370
1385
  const { propagated, recompile } = await applyConsequences(finalConfig, changes, deps, provider);
1371
1386
  return report(globalWritten, changes, propagated, recompile);
@@ -1375,6 +1390,7 @@ async function writeFromProjectContext(args, homeDir, deps) {
1375
1390
  const { global: globalConfig, project: projectSplitConfig } = splitConfigByScope(finalConfig);
1376
1391
  const provider = providerInUse(projectDir);
1377
1392
  const globalConfigPath = getProjectConfigPath(homeDir, provider);
1393
+ await ensureBlankPair(provider);
1378
1394
  const existingGlobal = await loadProjectConfigFromDir(homeDir, provider);
1379
1395
  const effective = await resolveEffectiveGlobalConfig(
1380
1396
  globalConfig,
@@ -1384,28 +1400,45 @@ async function writeFromProjectContext(args, homeDir, deps) {
1384
1400
  );
1385
1401
  const effectiveGlobalConfig = effective.config;
1386
1402
  const changes = classifyGlobalChange(existingGlobal?.config, effectiveGlobalConfig);
1387
- const globalWritten = await writeGlobalPairWhenChanged(effective, globalConfigPath, deps);
1388
- const { propagated, recompile } = await applyConsequences(
1389
- effectiveGlobalConfig,
1390
- changes,
1391
- deps,
1392
- provider,
1393
- projectDir
1394
- );
1395
1403
  const reconciledProjectConfig = reconcileProjectSplitAgainstGlobal(
1396
1404
  projectSplitConfig,
1397
1405
  effectiveGlobalConfig,
1398
1406
  deps.matrix
1399
1407
  );
1400
- await writeProjectPairWhenOwed(
1401
- args,
1408
+ const globalWritten = await restoringThePairsOnFailure(
1409
+ [projectDir, homeDir],
1402
1410
  provider,
1403
- reconciledProjectConfig,
1411
+ async () => {
1412
+ await writeProjectPairWhenOwed(
1413
+ args,
1414
+ provider,
1415
+ reconciledProjectConfig,
1416
+ effectiveGlobalConfig,
1417
+ deps
1418
+ );
1419
+ return writeGlobalPairWhenChanged(effective, globalConfigPath, deps);
1420
+ }
1421
+ );
1422
+ const { propagated, recompile } = await applyConsequences(
1404
1423
  effectiveGlobalConfig,
1405
- deps
1424
+ changes,
1425
+ deps,
1426
+ provider,
1427
+ projectDir
1406
1428
  );
1407
1429
  return report(globalWritten, changes, propagated, recompile);
1408
1430
  }
1431
+ async function restoringThePairsOnFailure(dirs, provider, write) {
1432
+ const before = await snapshotProjectPairs(dirs, provider);
1433
+ try {
1434
+ return await write();
1435
+ } catch (error) {
1436
+ await restoreProjectPairs(before, provider).catch((restoreError) => {
1437
+ verbose(`Could not restore a config pair: ${getErrorMessage(restoreError)}`);
1438
+ });
1439
+ throw error;
1440
+ }
1441
+ }
1409
1442
  async function writeGlobalPairWhenChanged(effective, globalConfigPath, deps) {
1410
1443
  if (!effective.changed) {
1411
1444
  verbose("Global config unchanged, skipping write");
@@ -1587,9 +1620,6 @@ async function writeProjectConfig(options) {
1587
1620
  );
1588
1621
  const finalConfig = mergeResult.config;
1589
1622
  const isProjectContext = !isHomeDirectory(projectDir);
1590
- if (isProjectContext) {
1591
- await ensureBlankPair2(providerInUse(projectDir));
1592
- }
1593
1623
  const propagation = await writeConfigByScope({
1594
1624
  finalConfig,
1595
1625
  matrix: sourceResult.matrix,
@@ -1679,4 +1709,4 @@ export {
1679
1709
  compileAgentsAllScopes,
1680
1710
  compileProjectScope
1681
1711
  };
1682
- //# sourceMappingURL=chunk-SNXEYAFP.js.map
1712
+ //# sourceMappingURL=chunk-CKBWEWHZ.js.map