agents-inc 0.174.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.
- package/CHANGELOG.md +115 -0
- package/dist/{chunk-APWMMZOK.js → chunk-3F5LT433.js} +157 -53
- package/dist/chunk-3F5LT433.js.map +1 -0
- package/dist/chunk-5CFHP6Z5.js +109 -0
- package/dist/chunk-5CFHP6Z5.js.map +1 -0
- package/dist/{chunk-3PJZ4QNJ.js → chunk-B7AVWSK2.js} +21 -11
- package/dist/chunk-B7AVWSK2.js.map +1 -0
- package/dist/{chunk-H5E6IO2L.js → chunk-C2BSCEDN.js} +9 -11
- package/dist/chunk-C2BSCEDN.js.map +1 -0
- package/dist/{chunk-R7GKQBZJ.js → chunk-CKBWEWHZ.js} +96 -52
- package/dist/chunk-CKBWEWHZ.js.map +1 -0
- package/dist/{chunk-IXVGBUWI.js → chunk-EC3JXT23.js} +5 -5
- package/dist/{chunk-E45IT3HC.js → chunk-ENET4IF6.js} +998 -472
- package/dist/chunk-ENET4IF6.js.map +1 -0
- package/dist/{chunk-FQF6VHO3.js → chunk-FACDJH6O.js} +12 -105
- package/dist/chunk-FACDJH6O.js.map +1 -0
- package/dist/{chunk-TVEDNGVP.js → chunk-H6WUOW5F.js} +2 -2
- package/dist/{chunk-7BHDKEGK.js → chunk-JNRACLNS.js} +3 -3
- package/dist/{chunk-IAQFZFWD.js → chunk-JTMSFBCA.js} +231 -24
- package/dist/chunk-JTMSFBCA.js.map +1 -0
- package/dist/{chunk-EFXVYQGT.js → chunk-MQZNDK5F.js} +39 -40
- package/dist/chunk-MQZNDK5F.js.map +1 -0
- package/dist/{chunk-QCX66KBM.js → chunk-SN64WNWE.js} +3 -3
- package/dist/{chunk-WUSEZFER.js → chunk-U46LYYRA.js} +3 -2
- package/dist/{chunk-WUSEZFER.js.map → chunk-U46LYYRA.js.map} +1 -1
- package/dist/{chunk-6PGXTLA4.js → chunk-U672FZVC.js} +2 -2
- package/dist/{chunk-AIBVAYHS.js → chunk-UE4Z3YMB.js} +2 -2
- package/dist/chunk-UE4Z3YMB.js.map +1 -0
- package/dist/{chunk-REHVGFJE.js → chunk-XMQIWPIR.js} +84 -32
- package/dist/chunk-XMQIWPIR.js.map +1 -0
- package/dist/{chunk-I3WF6L43.js → chunk-XYBHH3M5.js} +2 -2
- package/dist/{chunk-ECPFYHDX.js → chunk-ZBI6GFJD.js} +11 -11
- package/dist/chunk-ZBI6GFJD.js.map +1 -0
- package/dist/commands/build/marketplace.js +5 -4
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +7 -6
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +20 -16
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +106 -87
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +76 -48
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +31 -18
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +17 -17
- package/dist/commands/list.js +10 -9
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +5 -4
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +14 -9
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +20 -22
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +24 -19
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +110 -31
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/select-list.js +2 -2
- package/dist/components/common/skill-agent-summary.js +4 -3
- package/dist/components/common/summary-panel.js +5 -4
- package/dist/hooks/init.js +24 -25
- package/dist/hooks/init.js.map +1 -1
- package/dist/load-agent-defs-5BSECHE6.js +14 -0
- package/dist/{recompile-project-agents-KYK44C24.js → recompile-project-agents-U3UGHPWG.js} +8 -8
- package/dist/{source-loader-G5I4RNUP.js → source-loader-E2Y5MMN5.js} +4 -4
- package/package.json +1 -1
- package/dist/chunk-3PJZ4QNJ.js.map +0 -1
- package/dist/chunk-AIBVAYHS.js.map +0 -1
- package/dist/chunk-APWMMZOK.js.map +0 -1
- package/dist/chunk-E45IT3HC.js.map +0 -1
- package/dist/chunk-ECPFYHDX.js.map +0 -1
- package/dist/chunk-EFXVYQGT.js.map +0 -1
- package/dist/chunk-FQF6VHO3.js.map +0 -1
- package/dist/chunk-H5E6IO2L.js.map +0 -1
- package/dist/chunk-IAQFZFWD.js.map +0 -1
- package/dist/chunk-ORO2T4K2.js +0 -96
- package/dist/chunk-ORO2T4K2.js.map +0 -1
- package/dist/chunk-R7GKQBZJ.js.map +0 -1
- package/dist/chunk-REHVGFJE.js.map +0 -1
- package/dist/load-agent-defs-5U5KAURA.js +0 -14
- /package/dist/{chunk-IXVGBUWI.js.map → chunk-EC3JXT23.js.map} +0 -0
- /package/dist/{chunk-TVEDNGVP.js.map → chunk-H6WUOW5F.js.map} +0 -0
- /package/dist/{chunk-7BHDKEGK.js.map → chunk-JNRACLNS.js.map} +0 -0
- /package/dist/{chunk-QCX66KBM.js.map → chunk-SN64WNWE.js.map} +0 -0
- /package/dist/{chunk-6PGXTLA4.js.map → chunk-U672FZVC.js.map} +0 -0
- /package/dist/{chunk-I3WF6L43.js.map → chunk-XYBHH3M5.js.map} +0 -0
- /package/dist/{load-agent-defs-5U5KAURA.js.map → load-agent-defs-5BSECHE6.js.map} +0 -0
- /package/dist/{recompile-project-agents-KYK44C24.js.map → recompile-project-agents-U3UGHPWG.js.map} +0 -0
- /package/dist/{source-loader-G5I4RNUP.js.map → source-loader-E2Y5MMN5.js.map} +0 -0
package/dist/commands/update.js
CHANGED
|
@@ -1,31 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
unofferablePlacementsFound
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-ZBI6GFJD.js";
|
|
5
5
|
import {
|
|
6
|
+
BaseCommand,
|
|
7
|
+
EXIT_CODES,
|
|
6
8
|
providerFlag,
|
|
7
9
|
providerNamedBy,
|
|
8
10
|
refuseAnAmbiguousInstallation
|
|
9
|
-
} from "../chunk-
|
|
10
|
-
import
|
|
11
|
-
BaseCommand,
|
|
12
|
-
EXIT_CODES
|
|
13
|
-
} from "../chunk-IAQFZFWD.js";
|
|
11
|
+
} from "../chunk-JTMSFBCA.js";
|
|
12
|
+
import "../chunk-FACDJH6O.js";
|
|
14
13
|
import {
|
|
15
14
|
ERROR_MESSAGES,
|
|
15
|
+
FailedLeavingPluginsSwitchedOnError,
|
|
16
16
|
INFO_MESSAGES,
|
|
17
|
+
PluginsLeftSwitchedOnError,
|
|
18
|
+
buildMarketplacePluginRef,
|
|
19
|
+
codexPluginLeftSwitchedOn,
|
|
17
20
|
getErrorMessage,
|
|
18
|
-
hostAt,
|
|
19
21
|
hostCliNotFound,
|
|
20
|
-
|
|
22
|
+
hostFor,
|
|
23
|
+
loadConfigInPlay,
|
|
21
24
|
marketplaceRefreshFailed,
|
|
22
25
|
marketplacesRefreshFailed,
|
|
23
|
-
|
|
24
|
-
} from "../chunk-
|
|
25
|
-
import
|
|
26
|
+
pluginsLeftSwitchedOn
|
|
27
|
+
} from "../chunk-ENET4IF6.js";
|
|
28
|
+
import {
|
|
29
|
+
plural
|
|
30
|
+
} from "../chunk-UE4Z3YMB.js";
|
|
26
31
|
import {
|
|
27
32
|
EJECT_SOURCE
|
|
28
|
-
} from "../chunk-
|
|
33
|
+
} from "../chunk-U46LYYRA.js";
|
|
29
34
|
import "../chunk-GHHJYNAN.js";
|
|
30
35
|
|
|
31
36
|
// src/cli/commands/update.ts
|
|
@@ -36,8 +41,39 @@ function isEjected(skill) {
|
|
|
36
41
|
function activeSkills(skills) {
|
|
37
42
|
return skills.filter((skill) => !skill.excluded);
|
|
38
43
|
}
|
|
39
|
-
function
|
|
40
|
-
return
|
|
44
|
+
function pluginSkills(skills) {
|
|
45
|
+
return skills.filter((skill) => !isEjected(skill));
|
|
46
|
+
}
|
|
47
|
+
function marketplacesOf(plugins) {
|
|
48
|
+
return unique(plugins.map((skill) => skill.origin));
|
|
49
|
+
}
|
|
50
|
+
function installedPlugin(skill) {
|
|
51
|
+
return { ref: buildMarketplacePluginRef(skill.id, skill.origin), scope: skill.scope };
|
|
52
|
+
}
|
|
53
|
+
function pluginUpdateFailed(pluginRef, reason) {
|
|
54
|
+
return `Could not update plugin ${pluginRef}: ${reason}`;
|
|
55
|
+
}
|
|
56
|
+
function pluginsUpdateFailed(pluginRefs) {
|
|
57
|
+
return `${plural(pluginRefs.length, "plugin")} could not be updated: ${pluginRefs.join(", ")}`;
|
|
58
|
+
}
|
|
59
|
+
async function outcomeOf(step) {
|
|
60
|
+
try {
|
|
61
|
+
await step();
|
|
62
|
+
return { kind: "done", leftOn: [] };
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (error instanceof PluginsLeftSwitchedOnError) return { kind: "done", leftOn: error.leftOn };
|
|
65
|
+
if (error instanceof FailedLeavingPluginsSwitchedOnError) {
|
|
66
|
+
return { kind: "failed", reason: getErrorMessage(error.failure), leftOn: error.leftOn };
|
|
67
|
+
}
|
|
68
|
+
return { kind: "failed", reason: getErrorMessage(error), leftOn: [] };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function switchedOnAgain(leftOn) {
|
|
72
|
+
if (leftOn.length === 0) return [];
|
|
73
|
+
return [pluginsLeftSwitchedOn(leftOn.map(({ pluginKey }) => pluginKey))];
|
|
74
|
+
}
|
|
75
|
+
function refreshedAndUpdated(marketplaceCount, pluginCount) {
|
|
76
|
+
return `Refreshed ${plural(marketplaceCount, "marketplace listing")} and updated ${plural(pluginCount, "installed plugin")}.`;
|
|
41
77
|
}
|
|
42
78
|
var Update = class _Update extends BaseCommand {
|
|
43
79
|
static summary = "Refresh the marketplaces this installation uses";
|
|
@@ -46,29 +82,35 @@ var Update = class _Update extends BaseCommand {
|
|
|
46
82
|
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
47
83
|
async run() {
|
|
48
84
|
const { flags } = await this.parse(_Update);
|
|
85
|
+
const namedProvider = providerNamedBy(flags.provider);
|
|
86
|
+
await this.sayWhenTheGlobalInstallationStandsIn(namedProvider);
|
|
49
87
|
await refuseAnAmbiguousInstallation(
|
|
50
88
|
process.cwd(),
|
|
51
89
|
"update",
|
|
52
|
-
|
|
90
|
+
namedProvider,
|
|
53
91
|
(message) => this.error(message, { exit: EXIT_CODES.INVALID_ARGS })
|
|
54
92
|
);
|
|
55
93
|
await this.ensureConfigReadable(process.cwd());
|
|
56
94
|
await this.refuseUnofferablePlacements(process.cwd());
|
|
57
|
-
const
|
|
58
|
-
if (!
|
|
95
|
+
const installed = await this.loadInstalledConfig(process.cwd());
|
|
96
|
+
if (!installed) {
|
|
59
97
|
this.warn(ERROR_MESSAGES.NO_INSTALLATION);
|
|
60
98
|
return;
|
|
61
99
|
}
|
|
62
|
-
const skills = activeSkills(config.skills);
|
|
100
|
+
const skills = activeSkills(installed.config.skills);
|
|
63
101
|
this.reportEjectedSkills(skills);
|
|
64
|
-
const
|
|
102
|
+
const plugins = pluginSkills(skills);
|
|
103
|
+
const marketplaces = marketplacesOf(plugins);
|
|
65
104
|
if (marketplaces.length === 0) {
|
|
66
105
|
this.log(INFO_MESSAGES.NO_PLUGIN_MARKETPLACES);
|
|
67
106
|
return;
|
|
68
107
|
}
|
|
69
|
-
const host =
|
|
108
|
+
const host = hostFor(installed.provider);
|
|
70
109
|
await this.requireHost(host);
|
|
71
|
-
await this.refreshMarketplaces(marketplaces, host);
|
|
110
|
+
const leftOnByRefresh = await this.refreshMarketplaces(marketplaces, host);
|
|
111
|
+
const updated = await this.updatePlugins(plugins.map(installedPlugin), host);
|
|
112
|
+
this.failUnlessEveryPluginLanded(updated.failed, [...leftOnByRefresh, ...updated.leftOn]);
|
|
113
|
+
this.logSuccess(refreshedAndUpdated(marketplaces.length, plugins.length));
|
|
72
114
|
}
|
|
73
115
|
async refuseUnofferablePlacements(projectDir) {
|
|
74
116
|
const [finding] = await unofferablePlacementsFound(projectDir);
|
|
@@ -77,8 +119,7 @@ var Update = class _Update extends BaseCommand {
|
|
|
77
119
|
/** ABORT on an unreadable config: a fault, not "not installed". */
|
|
78
120
|
async loadInstalledConfig(projectDir) {
|
|
79
121
|
try {
|
|
80
|
-
|
|
81
|
-
return loaded?.config ?? null;
|
|
122
|
+
return await loadConfigInPlay(projectDir);
|
|
82
123
|
} catch (error) {
|
|
83
124
|
this.error(getErrorMessage(error), { exit: EXIT_CODES.ERROR });
|
|
84
125
|
}
|
|
@@ -91,23 +132,61 @@ var Update = class _Update extends BaseCommand {
|
|
|
91
132
|
if (await host.isAvailable()) return;
|
|
92
133
|
this.error(hostCliNotFound(host.provider), { exit: EXIT_CODES.ERROR });
|
|
93
134
|
}
|
|
94
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* Sequential, as they share one registry; failures are collected so one cannot hide the rest.
|
|
137
|
+
* Answers the plugins a refresh left switched on, which do not stop the updates.
|
|
138
|
+
*/
|
|
95
139
|
async refreshMarketplaces(marketplaces, host) {
|
|
96
140
|
const failed = [];
|
|
141
|
+
const leftOn = [];
|
|
97
142
|
for (const marketplace of marketplaces) {
|
|
98
143
|
this.log(`Refreshing marketplace ${marketplace}...`);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
this.log(` Updated marketplace ${marketplace}`);
|
|
102
|
-
} catch (error) {
|
|
144
|
+
const outcome = await outcomeOf(() => host.refreshMarketplace(marketplace));
|
|
145
|
+
if (outcome.kind === "failed") {
|
|
103
146
|
failed.push(marketplace);
|
|
104
|
-
this.warn(marketplaceRefreshFailed(marketplace,
|
|
147
|
+
this.warn(marketplaceRefreshFailed(marketplace, outcome.reason));
|
|
148
|
+
} else {
|
|
149
|
+
this.log(` Updated marketplace ${marketplace}`);
|
|
105
150
|
}
|
|
151
|
+
this.warnOfSwitchesLeftOn(outcome.leftOn);
|
|
152
|
+
leftOn.push(...outcome.leftOn);
|
|
106
153
|
}
|
|
107
154
|
if (failed.length > 0) {
|
|
108
|
-
this.error(marketplacesRefreshFailed(failed),
|
|
155
|
+
this.error([marketplacesRefreshFailed(failed), ...switchedOnAgain(leftOn)].join("\n"), {
|
|
156
|
+
exit: EXIT_CODES.ERROR
|
|
157
|
+
});
|
|
109
158
|
}
|
|
110
|
-
|
|
159
|
+
return leftOn;
|
|
160
|
+
}
|
|
161
|
+
/** Sequential and collecting, for the same reasons as the refresh. */
|
|
162
|
+
async updatePlugins(plugins, host) {
|
|
163
|
+
const failed = [];
|
|
164
|
+
const leftOn = [];
|
|
165
|
+
for (const { ref, scope } of plugins) {
|
|
166
|
+
this.log(`Updating plugin ${ref}...`);
|
|
167
|
+
const outcome = await outcomeOf(() => host.updatePlugin(ref, scope, process.cwd()));
|
|
168
|
+
if (outcome.kind === "failed") {
|
|
169
|
+
failed.push(ref);
|
|
170
|
+
this.warn(pluginUpdateFailed(ref, outcome.reason));
|
|
171
|
+
} else {
|
|
172
|
+
this.log(` Updated plugin ${ref}`);
|
|
173
|
+
}
|
|
174
|
+
this.warnOfSwitchesLeftOn(outcome.leftOn);
|
|
175
|
+
leftOn.push(...outcome.leftOn);
|
|
176
|
+
}
|
|
177
|
+
return { failed, leftOn };
|
|
178
|
+
}
|
|
179
|
+
warnOfSwitchesLeftOn(leftOn) {
|
|
180
|
+
for (const { pluginKey, configFile, reason } of leftOn) {
|
|
181
|
+
this.warn(codexPluginLeftSwitchedOn(pluginKey, configFile, reason));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
failUnlessEveryPluginLanded(failed, leftOn) {
|
|
185
|
+
const shortfalls = [
|
|
186
|
+
...failed.length > 0 ? [pluginsUpdateFailed(failed)] : [],
|
|
187
|
+
...switchedOnAgain(leftOn)
|
|
188
|
+
];
|
|
189
|
+
if (shortfalls.length > 0) this.error(shortfalls.join("\n"), { exit: EXIT_CODES.ERROR });
|
|
111
190
|
}
|
|
112
191
|
};
|
|
113
192
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/update.ts"],"sourcesContent":["import { unique } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { EJECT_SOURCE } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadProjectConfig } from \"../lib/configuration/index.js\";\nimport { hostAt } from \"../lib/hosts/host-for.js\";\nimport {\n providerFlag,\n providerNamedBy,\n refuseAnAmbiguousInstallation,\n} from \"../lib/installation/provider-flag.js\";\nimport { unofferablePlacementsFound } from \"../lib/hosts/configured-placements.js\";\nimport type { PluginHost } from \"../lib/hosts/plugin-host.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport {\n ERROR_MESSAGES,\n INFO_MESSAGES,\n hostCliNotFound,\n marketplaceRefreshFailed,\n marketplacesRefreshFailed,\n marketplacesRefreshed,\n} from \"../utils/messages.js\";\nimport type { ProjectConfig, SkillConfig } from \"../types/index.js\";\n\nfunction isEjected(skill: SkillConfig): boolean {\n return skill.origin === EJECT_SOURCE;\n}\n\n/** An excluded entry is a tombstone, not an install. */\nfunction activeSkills(skills: SkillConfig[]): SkillConfig[] {\n return skills.filter((skill) => !skill.excluded);\n}\n\nfunction configuredMarketplaces(skills: SkillConfig[]): string[] {\n return unique(skills.filter((skill) => !isEjected(skill)).map((skill) => skill.origin));\n}\n\nexport default class Update extends BaseCommand {\n static summary = \"Refresh the marketplaces this installation uses\";\n\n static description =\n \"Runs Claude's own marketplace update for every marketplace this installation's config names. Ejected skills are copies you own and are never touched.\";\n\n static flags = { provider: providerFlag() };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Update);\n\n // Before the config is loaded: loading it already picks a provider by roster order.\n await refuseAnAmbiguousInstallation(\n process.cwd(),\n \"update\",\n providerNamedBy(flags.provider),\n (message) => this.error(message, { exit: EXIT_CODES.INVALID_ARGS }),\n );\n await this.ensureConfigReadable(process.cwd());\n await this.refuseUnofferablePlacements(process.cwd());\n const config = await this.loadInstalledConfig(process.cwd());\n if (!config) {\n this.warn(ERROR_MESSAGES.NO_INSTALLATION);\n return;\n }\n\n const skills = activeSkills(config.skills);\n this.reportEjectedSkills(skills);\n\n const marketplaces = configuredMarketplaces(skills);\n if (marketplaces.length === 0) {\n this.log(INFO_MESSAGES.NO_PLUGIN_MARKETPLACES);\n return;\n }\n\n const host = hostAt(process.cwd());\n await this.requireHost(host);\n await this.refreshMarketplaces(marketplaces, host);\n }\n\n private async refuseUnofferablePlacements(projectDir: string): Promise<void> {\n const [finding] = await unofferablePlacementsFound(projectDir);\n if (finding !== undefined) this.error(finding, { exit: EXIT_CODES.ERROR });\n }\n\n /** ABORT on an unreadable config: a fault, not \"not installed\". */\n private async loadInstalledConfig(projectDir: string): Promise<ProjectConfig | null> {\n try {\n const loaded = await loadProjectConfig(projectDir);\n return loaded?.config ?? null;\n } catch (error) {\n this.error(getErrorMessage(error), { exit: EXIT_CODES.ERROR });\n }\n }\n\n private reportEjectedSkills(skills: SkillConfig[]): void {\n if (!skills.some(isEjected)) return;\n this.log(INFO_MESSAGES.EJECTED_SKILLS_USER_OWNED);\n }\n\n private async requireHost(host: PluginHost): Promise<void> {\n if (await host.isAvailable()) return;\n this.error(hostCliNotFound(host.provider), { exit: EXIT_CODES.ERROR });\n }\n\n /** Sequential, as they share one registry; failures are collected so one cannot hide the rest. */\n private async refreshMarketplaces(marketplaces: string[], host: PluginHost): Promise<void> {\n const failed: string[] = [];\n\n for (const marketplace of marketplaces) {\n this.log(`Refreshing marketplace ${marketplace}...`);\n try {\n await host.refreshMarketplace(marketplace);\n this.log(` Updated marketplace ${marketplace}`);\n } catch (error) {\n failed.push(marketplace);\n this.warn(marketplaceRefreshFailed(marketplace, getErrorMessage(error)));\n }\n }\n\n if (failed.length > 0) {\n this.error(marketplacesRefreshFailed(failed), { exit: EXIT_CODES.ERROR });\n }\n\n this.logSuccess(marketplacesRefreshed(marketplaces.length));\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/update.ts"],"sourcesContent":["import { unique } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { EJECT_SOURCE } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadConfigInPlay, type LoadedProjectConfig } from \"../lib/configuration/index.js\";\nimport { hostFor } from \"../lib/hosts/host-for.js\";\nimport {\n providerFlag,\n providerNamedBy,\n refuseAnAmbiguousInstallation,\n} from \"../lib/installation/provider-flag.js\";\nimport { unofferablePlacementsFound } from \"../lib/hosts/configured-placements.js\";\nimport type { PluginHost } from \"../lib/hosts/plugin-host.js\";\nimport {\n FailedLeavingPluginsSwitchedOnError,\n PluginsLeftSwitchedOnError,\n type PluginLeftSwitchedOn,\n} from \"../lib/hosts/codex-plugin-switch.js\";\nimport { buildMarketplacePluginRef } from \"../lib/plugins/plugin-ref.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport {\n ERROR_MESSAGES,\n INFO_MESSAGES,\n codexPluginLeftSwitchedOn,\n hostCliNotFound,\n marketplaceRefreshFailed,\n marketplacesRefreshFailed,\n pluginsLeftSwitchedOn,\n} from \"../utils/messages.js\";\nimport { plural } from \"../utils/string.js\";\nimport type { SkillConfig, SkillScope } from \"../types/index.js\";\n\ntype InstalledPlugin = { ref: string; scope: SkillScope };\n\nfunction isEjected(skill: SkillConfig): boolean {\n return skill.origin === EJECT_SOURCE;\n}\n\n/** An excluded entry is a tombstone, not an install. */\nfunction activeSkills(skills: SkillConfig[]): SkillConfig[] {\n return skills.filter((skill) => !skill.excluded);\n}\n\nfunction pluginSkills(skills: SkillConfig[]): SkillConfig[] {\n return skills.filter((skill) => !isEjected(skill));\n}\n\nfunction marketplacesOf(plugins: SkillConfig[]): string[] {\n return unique(plugins.map((skill) => skill.origin));\n}\n\nfunction installedPlugin(skill: SkillConfig): InstalledPlugin {\n return { ref: buildMarketplacePluginRef(skill.id, skill.origin), scope: skill.scope };\n}\n\nfunction pluginUpdateFailed(pluginRef: string, reason: string): string {\n return `Could not update plugin ${pluginRef}: ${reason}`;\n}\n\nfunction pluginsUpdateFailed(pluginRefs: string[]): string {\n return `${plural(pluginRefs.length, \"plugin\")} could not be updated: ${pluginRefs.join(\", \")}`;\n}\n\ntype StepOutcome = { readonly leftOn: readonly PluginLeftSwitchedOn[] } & (\n { readonly kind: \"done\" } | { readonly kind: \"failed\"; readonly reason: string }\n);\n\ntype PluginUpdates = { failed: string[]; leftOn: PluginLeftSwitchedOn[] };\n\n/** A step whose only shortfall is a switch Codex turned back on still did its work. */\nasync function outcomeOf(step: () => Promise<void>): Promise<StepOutcome> {\n try {\n await step();\n return { kind: \"done\", leftOn: [] };\n } catch (error) {\n if (error instanceof PluginsLeftSwitchedOnError) return { kind: \"done\", leftOn: error.leftOn };\n if (error instanceof FailedLeavingPluginsSwitchedOnError) {\n return { kind: \"failed\", reason: getErrorMessage(error.failure), leftOn: error.leftOn };\n }\n return { kind: \"failed\", reason: getErrorMessage(error), leftOn: [] };\n }\n}\n\nfunction switchedOnAgain(leftOn: readonly PluginLeftSwitchedOn[]): string[] {\n if (leftOn.length === 0) return [];\n return [pluginsLeftSwitchedOn(leftOn.map(({ pluginKey }) => pluginKey))];\n}\n\nfunction refreshedAndUpdated(marketplaceCount: number, pluginCount: number): string {\n return `Refreshed ${plural(marketplaceCount, \"marketplace listing\")} and updated ${plural(pluginCount, \"installed plugin\")}.`;\n}\n\nexport default class Update extends BaseCommand {\n static summary = \"Refresh the marketplaces this installation uses\";\n\n static description =\n \"Runs Claude's own marketplace update for every marketplace this installation's config names. Ejected skills are copies you own and are never touched.\";\n\n static flags = { provider: providerFlag() };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Update);\n const namedProvider = providerNamedBy(flags.provider);\n\n await this.sayWhenTheGlobalInstallationStandsIn(namedProvider);\n // Before the config is loaded: loading it already picks a provider by roster order.\n await refuseAnAmbiguousInstallation(process.cwd(), \"update\", namedProvider, (message) =>\n this.error(message, { exit: EXIT_CODES.INVALID_ARGS }),\n );\n await this.ensureConfigReadable(process.cwd());\n await this.refuseUnofferablePlacements(process.cwd());\n const installed = await this.loadInstalledConfig(process.cwd());\n if (!installed) {\n this.warn(ERROR_MESSAGES.NO_INSTALLATION);\n return;\n }\n\n const skills = activeSkills(installed.config.skills);\n this.reportEjectedSkills(skills);\n\n const plugins = pluginSkills(skills);\n const marketplaces = marketplacesOf(plugins);\n if (marketplaces.length === 0) {\n this.log(INFO_MESSAGES.NO_PLUGIN_MARKETPLACES);\n return;\n }\n\n // The read installation's tool, not the cwd's: a leftover folder there would name another.\n const host = hostFor(installed.provider);\n await this.requireHost(host);\n // Every listing first: a plugin updated against a stale listing stays where it is.\n const leftOnByRefresh = await this.refreshMarketplaces(marketplaces, host);\n const updated = await this.updatePlugins(plugins.map(installedPlugin), host);\n this.failUnlessEveryPluginLanded(updated.failed, [...leftOnByRefresh, ...updated.leftOn]);\n this.logSuccess(refreshedAndUpdated(marketplaces.length, plugins.length));\n }\n\n private async refuseUnofferablePlacements(projectDir: string): Promise<void> {\n const [finding] = await unofferablePlacementsFound(projectDir);\n if (finding !== undefined) this.error(finding, { exit: EXIT_CODES.ERROR });\n }\n\n /** ABORT on an unreadable config: a fault, not \"not installed\". */\n private async loadInstalledConfig(projectDir: string): Promise<LoadedProjectConfig | null> {\n try {\n return await loadConfigInPlay(projectDir);\n } catch (error) {\n this.error(getErrorMessage(error), { exit: EXIT_CODES.ERROR });\n }\n }\n\n private reportEjectedSkills(skills: SkillConfig[]): void {\n if (!skills.some(isEjected)) return;\n this.log(INFO_MESSAGES.EJECTED_SKILLS_USER_OWNED);\n }\n\n private async requireHost(host: PluginHost): Promise<void> {\n if (await host.isAvailable()) return;\n this.error(hostCliNotFound(host.provider), { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * Sequential, as they share one registry; failures are collected so one cannot hide the rest.\n * Answers the plugins a refresh left switched on, which do not stop the updates.\n */\n private async refreshMarketplaces(\n marketplaces: string[],\n host: PluginHost,\n ): Promise<PluginLeftSwitchedOn[]> {\n const failed: string[] = [];\n const leftOn: PluginLeftSwitchedOn[] = [];\n\n for (const marketplace of marketplaces) {\n this.log(`Refreshing marketplace ${marketplace}...`);\n const outcome = await outcomeOf(() => host.refreshMarketplace(marketplace));\n if (outcome.kind === \"failed\") {\n failed.push(marketplace);\n this.warn(marketplaceRefreshFailed(marketplace, outcome.reason));\n } else {\n this.log(` Updated marketplace ${marketplace}`);\n }\n this.warnOfSwitchesLeftOn(outcome.leftOn);\n leftOn.push(...outcome.leftOn);\n }\n\n if (failed.length > 0) {\n this.error([marketplacesRefreshFailed(failed), ...switchedOnAgain(leftOn)].join(\"\\n\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n return leftOn;\n }\n\n /** Sequential and collecting, for the same reasons as the refresh. */\n private async updatePlugins(\n plugins: InstalledPlugin[],\n host: PluginHost,\n ): Promise<PluginUpdates> {\n const failed: string[] = [];\n const leftOn: PluginLeftSwitchedOn[] = [];\n\n for (const { ref, scope } of plugins) {\n this.log(`Updating plugin ${ref}...`);\n const outcome = await outcomeOf(() => host.updatePlugin(ref, scope, process.cwd()));\n if (outcome.kind === \"failed\") {\n failed.push(ref);\n this.warn(pluginUpdateFailed(ref, outcome.reason));\n } else {\n this.log(` Updated plugin ${ref}`);\n }\n this.warnOfSwitchesLeftOn(outcome.leftOn);\n leftOn.push(...outcome.leftOn);\n }\n\n return { failed, leftOn };\n }\n\n private warnOfSwitchesLeftOn(leftOn: readonly PluginLeftSwitchedOn[]): void {\n for (const { pluginKey, configFile, reason } of leftOn) {\n this.warn(codexPluginLeftSwitchedOn(pluginKey, configFile, reason));\n }\n }\n\n private failUnlessEveryPluginLanded(failed: string[], leftOn: PluginLeftSwitchedOn[]): void {\n const shortfalls = [\n ...(failed.length > 0 ? [pluginsUpdateFailed(failed)] : []),\n ...switchedOnAgain(leftOn),\n ];\n if (shortfalls.length > 0) this.error(shortfalls.join(\"\\n\"), { exit: EXIT_CODES.ERROR });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SkillAgentSummary
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
6
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-5CFHP6Z5.js";
|
|
5
|
+
import "../../chunk-FACDJH6O.js";
|
|
6
|
+
import "../../chunk-UE4Z3YMB.js";
|
|
7
|
+
import "../../chunk-U46LYYRA.js";
|
|
7
8
|
export {
|
|
8
9
|
SkillAgentSummary
|
|
9
10
|
};
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
summaryPanelBlock,
|
|
4
4
|
summaryPanelText
|
|
5
|
-
} from "../../chunk-
|
|
6
|
-
import "../../chunk-
|
|
7
|
-
import "../../chunk-
|
|
8
|
-
import "../../chunk-
|
|
5
|
+
} from "../../chunk-C2BSCEDN.js";
|
|
6
|
+
import "../../chunk-5CFHP6Z5.js";
|
|
7
|
+
import "../../chunk-FACDJH6O.js";
|
|
8
|
+
import "../../chunk-UE4Z3YMB.js";
|
|
9
|
+
import "../../chunk-U46LYYRA.js";
|
|
9
10
|
export {
|
|
10
11
|
summaryPanelBlock,
|
|
11
12
|
summaryPanelText
|
package/dist/hooks/init.js
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runDashboardFlow
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-3F5LT433.js";
|
|
5
|
+
import "../chunk-XYBHH3M5.js";
|
|
6
|
+
import "../chunk-H6WUOW5F.js";
|
|
7
|
+
import "../chunk-SN64WNWE.js";
|
|
8
8
|
import "../chunk-OZXAJNLA.js";
|
|
9
9
|
import "../chunk-P6CYS4JK.js";
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-C2BSCEDN.js";
|
|
11
|
+
import "../chunk-U672FZVC.js";
|
|
12
|
+
import "../chunk-CKBWEWHZ.js";
|
|
13
|
+
import "../chunk-XMQIWPIR.js";
|
|
14
|
+
import "../chunk-JNRACLNS.js";
|
|
15
|
+
import "../chunk-EC3JXT23.js";
|
|
16
|
+
import "../chunk-MQZNDK5F.js";
|
|
17
17
|
import "../chunk-KIK5EZYD.js";
|
|
18
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-5CFHP6Z5.js";
|
|
19
19
|
import {
|
|
20
|
+
EXIT_CODES,
|
|
20
21
|
providerNamedIn
|
|
21
|
-
} from "../chunk-
|
|
22
|
-
import
|
|
23
|
-
EXIT_CODES
|
|
24
|
-
} from "../chunk-IAQFZFWD.js";
|
|
22
|
+
} from "../chunk-JTMSFBCA.js";
|
|
23
|
+
import "../chunk-FACDJH6O.js";
|
|
25
24
|
import {
|
|
26
25
|
detectInstallations,
|
|
27
26
|
findConfigLoadFailures,
|
|
@@ -31,16 +30,17 @@ import {
|
|
|
31
30
|
providerInUse,
|
|
32
31
|
retiredSourceFolderIgnored,
|
|
33
32
|
rootsHoldingTheRetiredSourceFolder
|
|
34
|
-
} from "../chunk-
|
|
35
|
-
import "../chunk-
|
|
36
|
-
import "../chunk-
|
|
33
|
+
} from "../chunk-ENET4IF6.js";
|
|
34
|
+
import "../chunk-UE4Z3YMB.js";
|
|
35
|
+
import "../chunk-U46LYYRA.js";
|
|
37
36
|
import "../chunk-GHHJYNAN.js";
|
|
38
37
|
|
|
39
38
|
// src/cli/hooks/init.ts
|
|
40
39
|
import { flush } from "@oclif/core";
|
|
41
40
|
var hook = async function(options) {
|
|
42
41
|
forgetTheProviderChosenForThisRun();
|
|
43
|
-
await
|
|
42
|
+
const projectHoldsOne = await projectHoldsAnInstallation(process.cwd());
|
|
43
|
+
sayTheRetiredSourceFolderIsIgnored(process.cwd(), providerNamedIn(options.argv), projectHoldsOne);
|
|
44
44
|
if (options.id !== void 0) return;
|
|
45
45
|
const projectDir = process.cwd();
|
|
46
46
|
const unreadable = await findConfigLoadFailures(projectDir);
|
|
@@ -61,17 +61,16 @@ var hook = async function(options) {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
|
-
|
|
64
|
+
function sayTheRetiredSourceFolderIsIgnored(cwd, named, projectHoldsOne) {
|
|
65
65
|
for (const root of rootsHoldingTheRetiredSourceFolder(cwd)) {
|
|
66
|
-
const provider = named ??
|
|
66
|
+
const provider = named ?? providerReadIn(root, cwd, projectHoldsOne);
|
|
67
67
|
process.stderr.write(`${retiredSourceFolderIgnored(root, provider)}
|
|
68
68
|
`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
function providerReadIn(root, cwd, projectHoldsOne) {
|
|
72
72
|
if (!isHomeDirectory(root)) return providerInUse(root);
|
|
73
|
-
|
|
74
|
-
return providerInUse(cwd);
|
|
73
|
+
return providerInUse(projectHoldsOne ? cwd : root);
|
|
75
74
|
}
|
|
76
75
|
async function projectHoldsAnInstallation(cwd) {
|
|
77
76
|
const found = await detectInstallations(cwd);
|
package/dist/hooks/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import { flush, type Hook } from \"@oclif/core\";\nimport { runDashboardFlow } from \"../commands/init.js\";\nimport type { Provider } from \"../consts.js\";\nimport { findConfigLoadFailures } from \"../lib/configuration/project-config.js\";\nimport { detectInstallations } from \"../lib/installation/detect-installations.js\";\nimport {\n forgetTheProviderChosenForThisRun,\n providerInUse,\n rootsHoldingTheRetiredSourceFolder,\n} from \"../lib/installation/install-layout.js\";\nimport { isHomeDirectory } from \"../lib/installation/is-home-directory.js\";\nimport { providerNamedIn } from \"../lib/installation/provider-flag.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { installationConfigsUnreadable, retiredSourceFolderIgnored } from \"../utils/messages.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n forgetTheProviderChosenForThisRun();\n await sayTheRetiredSourceFolderIsIgnored(process.cwd(), providerNamedIn(options.argv));\n\n // A named command runs as named; no command is the dashboard.\n if (options.id !== undefined) return;\n\n const projectDir = process.cwd();\n // Checked here: oclif's hook runner swallows a load error thrown inside the dashboard.\n const unreadable = await findConfigLoadFailures(projectDir);\n if (unreadable.length > 0) {\n this.error(installationConfigsUnreadable(unreadable), { exit: EXIT_CODES.ERROR });\n }\n\n const dashboard = await runDashboardFlow(projectDir, options.config);\n switch (dashboard) {\n case \"cancelled\":\n return this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n case \"shown\":\n return endRun(EXIT_CODES.SUCCESS);\n case \"not-installed\":\n // oclif goes on to print the root help.\n return;\n default: {\n const _exhaustive: never = dashboard;\n return _exhaustive;\n }\n }\n};\n\n/**\n * Before any command's output, on stderr so piped output is unchanged; nothing reads the folder.\n * Flags are not parsed yet, so the provider a run names is read off its arguments: that run reads\n * the named provider's folder in every root.\n */\
|
|
1
|
+
{"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import { flush, type Hook } from \"@oclif/core\";\nimport { runDashboardFlow } from \"../commands/init.js\";\nimport type { Provider } from \"../consts.js\";\nimport { findConfigLoadFailures } from \"../lib/configuration/project-config.js\";\nimport { detectInstallations } from \"../lib/installation/detect-installations.js\";\nimport {\n forgetTheProviderChosenForThisRun,\n providerInUse,\n rootsHoldingTheRetiredSourceFolder,\n} from \"../lib/installation/install-layout.js\";\nimport { isHomeDirectory } from \"../lib/installation/is-home-directory.js\";\nimport { providerNamedIn } from \"../lib/installation/provider-flag.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { installationConfigsUnreadable, retiredSourceFolderIgnored } from \"../utils/messages.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n forgetTheProviderChosenForThisRun();\n // Before any path is read: `providerInUse` cannot load a config, so the roster records which\n // of the project's declare nothing.\n const projectHoldsOne = await projectHoldsAnInstallation(process.cwd());\n sayTheRetiredSourceFolderIsIgnored(process.cwd(), providerNamedIn(options.argv), projectHoldsOne);\n\n // A named command runs as named; no command is the dashboard.\n if (options.id !== undefined) return;\n\n const projectDir = process.cwd();\n // Checked here: oclif's hook runner swallows a load error thrown inside the dashboard.\n const unreadable = await findConfigLoadFailures(projectDir);\n if (unreadable.length > 0) {\n this.error(installationConfigsUnreadable(unreadable), { exit: EXIT_CODES.ERROR });\n }\n\n const dashboard = await runDashboardFlow(projectDir, options.config);\n switch (dashboard) {\n case \"cancelled\":\n return this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n case \"shown\":\n return endRun(EXIT_CODES.SUCCESS);\n case \"not-installed\":\n // oclif goes on to print the root help.\n return;\n default: {\n const _exhaustive: never = dashboard;\n return _exhaustive;\n }\n }\n};\n\n/**\n * Before any command's output, on stderr so piped output is unchanged; nothing reads the folder.\n * Flags are not parsed yet, so the provider a run names is read off its arguments: that run reads\n * the named provider's folder in every root.\n */\nfunction sayTheRetiredSourceFolderIsIgnored(\n cwd: string,\n named: Provider | undefined,\n projectHoldsOne: boolean,\n): void {\n for (const root of rootsHoldingTheRetiredSourceFolder(cwd)) {\n const provider = named ?? providerReadIn(root, cwd, projectHoldsOne);\n process.stderr.write(`${retiredSourceFolderIgnored(root, provider)}\\n`);\n }\n}\n\n/**\n * A run naming no provider reads a project with its own tool, and HOME with the project's, as it\n * reads HOME's config; a project holding no installation leaves the run on HOME's own.\n */\nfunction providerReadIn(root: string, cwd: string, projectHoldsOne: boolean): Provider {\n if (!isHomeDirectory(root)) return providerInUse(root);\n return providerInUse(projectHoldsOne ? cwd : root);\n}\n\n/** A project config declaring nothing is not an installation, so it is not counted here. */\nasync function projectHoldsAnInstallation(cwd: string): Promise<boolean> {\n const found = await detectInstallations(cwd);\n return found.some((installation) => installation.scope === \"project\");\n}\n\n/** Not `this.exit(0)`: oclif swallows an exit 0 from a hook and goes on to print the root help. */\nasync function endRun(code: number): Promise<never> {\n await flush();\n process.exit(code);\n}\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAwB;AAejC,IAAM,OAAqB,eAAgB,SAAS;AAClD,oCAAkC;AAGlC,QAAM,kBAAkB,MAAM,2BAA2B,QAAQ,IAAI,CAAC;AACtE,qCAAmC,QAAQ,IAAI,GAAG,gBAAgB,QAAQ,IAAI,GAAG,eAAe;AAGhG,MAAI,QAAQ,OAAO,OAAW;AAE9B,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,aAAa,MAAM,uBAAuB,UAAU;AAC1D,MAAI,WAAW,SAAS,GAAG;AACzB,SAAK,MAAM,8BAA8B,UAAU,GAAG,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,EAClF;AAEA,QAAM,YAAY,MAAM,iBAAiB,YAAY,QAAQ,MAAM;AACnE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,KAAK,MAAM,aAAa,EAAE,MAAM,WAAW,UAAU,CAAC;AAAA,IAC/D,KAAK;AACH,aAAO,OAAO,WAAW,OAAO;AAAA,IAClC,KAAK;AAEH;AAAA,IACF,SAAS;AACP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAOA,SAAS,mCACP,KACA,OACA,iBACM;AACN,aAAW,QAAQ,mCAAmC,GAAG,GAAG;AAC1D,UAAM,WAAW,SAAS,eAAe,MAAM,KAAK,eAAe;AACnE,YAAQ,OAAO,MAAM,GAAG,2BAA2B,MAAM,QAAQ,CAAC;AAAA,CAAI;AAAA,EACxE;AACF;AAMA,SAAS,eAAe,MAAc,KAAa,iBAAoC;AACrF,MAAI,CAAC,gBAAgB,IAAI,EAAG,QAAO,cAAc,IAAI;AACrD,SAAO,cAAc,kBAAkB,MAAM,IAAI;AACnD;AAGA,eAAe,2BAA2B,KAA+B;AACvE,QAAM,QAAQ,MAAM,oBAAoB,GAAG;AAC3C,SAAO,MAAM,KAAK,CAAC,iBAAiB,aAAa,UAAU,SAAS;AACtE;AAGA,eAAe,OAAO,MAA8B;AAClD,QAAM,MAAM;AACZ,UAAQ,KAAK,IAAI;AACnB;AAEA,IAAO,eAAQ;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadAgentDefs
|
|
4
|
+
} from "./chunk-JNRACLNS.js";
|
|
5
|
+
import "./chunk-EC3JXT23.js";
|
|
6
|
+
import "./chunk-MQZNDK5F.js";
|
|
7
|
+
import "./chunk-ENET4IF6.js";
|
|
8
|
+
import "./chunk-UE4Z3YMB.js";
|
|
9
|
+
import "./chunk-U46LYYRA.js";
|
|
10
|
+
import "./chunk-GHHJYNAN.js";
|
|
11
|
+
export {
|
|
12
|
+
loadAgentDefs
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=load-agent-defs-5BSECHE6.js.map
|
|
@@ -3,18 +3,18 @@ import {
|
|
|
3
3
|
compileAgents,
|
|
4
4
|
discoverInstalledSkills,
|
|
5
5
|
withCatalogueSeatedFor
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XMQIWPIR.js";
|
|
7
7
|
import {
|
|
8
8
|
loadAgentDefs
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-JNRACLNS.js";
|
|
10
|
+
import "./chunk-EC3JXT23.js";
|
|
11
|
+
import "./chunk-MQZNDK5F.js";
|
|
12
12
|
import {
|
|
13
13
|
getErrorMessage,
|
|
14
14
|
resolveInstallPaths
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-ENET4IF6.js";
|
|
16
|
+
import "./chunk-UE4Z3YMB.js";
|
|
17
|
+
import "./chunk-U46LYYRA.js";
|
|
18
18
|
import "./chunk-GHHJYNAN.js";
|
|
19
19
|
|
|
20
20
|
// src/cli/lib/operations/project/recompile-project-agents.ts
|
|
@@ -62,4 +62,4 @@ function summarizeRecompiles(outcomes) {
|
|
|
62
62
|
export {
|
|
63
63
|
recompilePropagatedProjectAgents
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=recompile-project-agents-
|
|
65
|
+
//# sourceMappingURL=recompile-project-agents-U3UGHPWG.js.map
|
|
@@ -5,9 +5,9 @@ import {
|
|
|
5
5
|
loadMarketplaceMatrix,
|
|
6
6
|
loadSkillsMatrixFromSource,
|
|
7
7
|
mergeLocalSkillsIntoMatrix
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-ENET4IF6.js";
|
|
9
|
+
import "./chunk-UE4Z3YMB.js";
|
|
10
|
+
import "./chunk-U46LYYRA.js";
|
|
11
11
|
import "./chunk-GHHJYNAN.js";
|
|
12
12
|
export {
|
|
13
13
|
MarketplaceManifestRequiredError,
|
|
@@ -16,4 +16,4 @@ export {
|
|
|
16
16
|
loadSkillsMatrixFromSource,
|
|
17
17
|
mergeLocalSkillsIntoMatrix
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=source-loader-
|
|
19
|
+
//# sourceMappingURL=source-loader-E2Y5MMN5.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agents-inc",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.176.0",
|
|
4
4
|
"description": "CLI for managing Agents Inc. skills, stacks, and agents for Claude Code",
|
|
5
5
|
"//generate": "Runs all four generators in dependency order; the :check variants stay separate because CI runs different subsets.",
|
|
6
6
|
"//no-shared-vitest-config": "A three-project suite with globals on and its own setup and timeouts; the shared single-project, globals-off config would contradict it.",
|
|
@@ -1 +0,0 @@
|
|
|
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 { loadProjectConfig, loadProjectConfigFromDir } from \"../configuration/project-config.js\";\nimport { activeAgentScopeMap, activeSkillScopeMap } from \"../configuration/scope-predicates.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. `inProject`: read from\n * 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 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 const leftBehind = skillsItsMarketplaceLeavesBehind(roundTrip.config, payload);\n return { ok: true, payload, skills, agents, leftBehind, inProject: installed.inProject };\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 loadProjectConfig(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"]}
|