@aigne/cli 1.60.0-beta → 1.74.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -12
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/bunwrapper.cjs +22 -0
- package/dist/bunwrapper.d.cts +1 -0
- package/dist/bunwrapper.d.mts +1 -0
- package/dist/bunwrapper.mjs +23 -0
- package/dist/bunwrapper.mjs.map +1 -0
- package/dist/cli.cjs +42 -0
- package/dist/cli.d.cts +9 -0
- package/dist/cli.d.cts.map +1 -0
- package/dist/cli.d.mts +10 -0
- package/dist/cli.d.mts.map +1 -0
- package/dist/cli.mjs +41 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/commands/aigne.cjs +23 -0
- package/dist/commands/aigne.mjs +22 -0
- package/dist/commands/aigne.mjs.map +1 -0
- package/dist/commands/app/agent.cjs +117 -0
- package/dist/commands/app/agent.mjs +113 -0
- package/dist/commands/app/agent.mjs.map +1 -0
- package/dist/commands/app/app.cjs +92 -0
- package/dist/commands/app/app.mjs +90 -0
- package/dist/commands/app/app.mjs.map +1 -0
- package/dist/commands/app/cli.cjs +6 -0
- package/dist/commands/app/cli.d.cts +1 -0
- package/dist/commands/app/cli.d.mts +1 -0
- package/dist/commands/app/cli.mjs +8 -0
- package/dist/commands/app/cli.mjs.map +1 -0
- package/dist/commands/app/upgrade.cjs +243 -0
- package/dist/commands/app/upgrade.mjs +240 -0
- package/dist/commands/app/upgrade.mjs.map +1 -0
- package/dist/commands/app.cjs +53 -0
- package/dist/commands/app.mjs +53 -0
- package/dist/commands/app.mjs.map +1 -0
- package/dist/commands/create.cjs +66 -0
- package/dist/commands/create.mjs +65 -0
- package/dist/commands/create.mjs.map +1 -0
- package/dist/commands/deploy.cjs +237 -0
- package/dist/commands/deploy.mjs +237 -0
- package/dist/commands/deploy.mjs.map +1 -0
- package/dist/commands/eval.cjs +88 -0
- package/dist/commands/eval.mjs +88 -0
- package/dist/commands/eval.mjs.map +1 -0
- package/dist/commands/hub.cjs +297 -0
- package/dist/commands/hub.mjs +294 -0
- package/dist/commands/hub.mjs.map +1 -0
- package/dist/commands/observe.cjs +49 -0
- package/dist/commands/observe.mjs +46 -0
- package/dist/commands/observe.mjs.map +1 -0
- package/dist/commands/run-skill.cjs +84 -0
- package/dist/commands/run-skill.mjs +81 -0
- package/dist/commands/run-skill.mjs.map +1 -0
- package/dist/commands/run.cjs +172 -0
- package/dist/commands/run.mjs +171 -0
- package/dist/commands/run.mjs.map +1 -0
- package/dist/commands/serve-mcp.cjs +68 -0
- package/dist/commands/serve-mcp.mjs +67 -0
- package/dist/commands/serve-mcp.mjs.map +1 -0
- package/dist/commands/test.cjs +40 -0
- package/dist/commands/test.mjs +39 -0
- package/dist/commands/test.mjs.map +1 -0
- package/dist/constants.cjs +28 -0
- package/dist/constants.d.cts +9 -0
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.mts +9 -0
- package/dist/constants.d.mts.map +1 -0
- package/dist/constants.mjs +24 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/global.d.cjs +0 -0
- package/dist/global.d.cts +6 -0
- package/dist/global.d.cts.map +1 -0
- package/dist/global.d.mts +6 -0
- package/dist/global.d.mts.map +1 -0
- package/dist/index.cjs +0 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +1 -0
- package/dist/tracer/terminal.cjs +336 -0
- package/dist/tracer/terminal.mjs +332 -0
- package/dist/tracer/terminal.mjs.map +1 -0
- package/dist/type.cjs +0 -0
- package/dist/type.d.cts +10 -0
- package/dist/type.d.cts.map +1 -0
- package/dist/type.d.mts +10 -0
- package/dist/type.d.mts.map +1 -0
- package/dist/type.mjs +1 -0
- package/dist/ui/utils/terminal-input.cjs +145 -0
- package/dist/ui/utils/terminal-input.mjs +144 -0
- package/dist/ui/utils/terminal-input.mjs.map +1 -0
- package/dist/ui/utils/text-buffer.cjs +865 -0
- package/dist/ui/utils/text-buffer.mjs +865 -0
- package/dist/ui/utils/text-buffer.mjs.map +1 -0
- package/dist/ui/utils/text-utils.cjs +85 -0
- package/dist/ui/utils/text-utils.mjs +78 -0
- package/dist/ui/utils/text-utils.mjs.map +1 -0
- package/dist/utils/agent-v1.cjs +180 -0
- package/dist/utils/agent-v1.d.cts +138 -0
- package/dist/utils/agent-v1.d.cts.map +1 -0
- package/dist/utils/agent-v1.d.mts +138 -0
- package/dist/utils/agent-v1.d.mts.map +1 -0
- package/dist/utils/agent-v1.mjs +179 -0
- package/dist/utils/agent-v1.mjs.map +1 -0
- package/dist/utils/aigne-hub/constants.cjs +22 -0
- package/dist/utils/aigne-hub/constants.mjs +18 -0
- package/dist/utils/aigne-hub/constants.mjs.map +1 -0
- package/dist/utils/aigne-hub/credential.cjs +179 -0
- package/dist/utils/aigne-hub/credential.mjs +175 -0
- package/dist/utils/aigne-hub/credential.mjs.map +1 -0
- package/dist/utils/aigne-hub/crypto.cjs +41 -0
- package/dist/utils/aigne-hub/crypto.mjs +33 -0
- package/dist/utils/aigne-hub/crypto.mjs.map +1 -0
- package/dist/utils/aigne-hub/model.cjs +112 -0
- package/dist/utils/aigne-hub/model.d.cts +19 -0
- package/dist/utils/aigne-hub/model.d.cts.map +1 -0
- package/dist/utils/aigne-hub/model.d.mts +19 -0
- package/dist/utils/aigne-hub/model.d.mts.map +1 -0
- package/dist/utils/aigne-hub/model.mjs +106 -0
- package/dist/utils/aigne-hub/model.mjs.map +1 -0
- package/dist/utils/aigne-hub/store/file.cjs +64 -0
- package/dist/utils/aigne-hub/store/file.mjs +64 -0
- package/dist/utils/aigne-hub/store/file.mjs.map +1 -0
- package/dist/utils/aigne-hub/store/index.cjs +37 -0
- package/dist/utils/aigne-hub/store/index.mjs +37 -0
- package/dist/utils/aigne-hub/store/index.mjs.map +1 -0
- package/dist/utils/aigne-hub/store/keytar.cjs +61 -0
- package/dist/utils/aigne-hub/store/keytar.mjs +61 -0
- package/dist/utils/aigne-hub/store/keytar.mjs.map +1 -0
- package/dist/utils/aigne-hub/store/migrate.cjs +46 -0
- package/dist/utils/aigne-hub/store/migrate.mjs +45 -0
- package/dist/utils/aigne-hub/store/migrate.mjs.map +1 -0
- package/dist/utils/aigne-hub/type.d.cts +18 -0
- package/dist/utils/aigne-hub/type.d.cts.map +1 -0
- package/dist/utils/aigne-hub/type.d.mts +18 -0
- package/dist/utils/aigne-hub/type.d.mts.map +1 -0
- package/dist/utils/aigne-hub-user.cjs +11 -0
- package/dist/utils/aigne-hub-user.d.cts +23 -0
- package/dist/utils/aigne-hub-user.d.cts.map +1 -0
- package/dist/utils/aigne-hub-user.d.mts +23 -0
- package/dist/utils/aigne-hub-user.d.mts.map +1 -0
- package/dist/utils/aigne-hub-user.mjs +11 -0
- package/dist/utils/aigne-hub-user.mjs.map +1 -0
- package/dist/utils/ascii-logo.cjs +30 -0
- package/dist/utils/ascii-logo.d.cts +5 -0
- package/dist/utils/ascii-logo.d.cts.map +1 -0
- package/dist/utils/ascii-logo.d.mts +5 -0
- package/dist/utils/ascii-logo.d.mts.map +1 -0
- package/dist/utils/{ascii-logo.js → ascii-logo.mjs} +13 -3
- package/dist/utils/ascii-logo.mjs.map +1 -0
- package/dist/utils/download.cjs +25 -0
- package/dist/utils/download.d.cts +7 -0
- package/dist/utils/download.d.cts.map +1 -0
- package/dist/utils/download.d.mts +7 -0
- package/dist/utils/download.d.mts.map +1 -0
- package/dist/utils/download.mjs +25 -0
- package/dist/utils/download.mjs.map +1 -0
- package/dist/utils/evaluation/core.cjs +84 -0
- package/dist/utils/evaluation/core.mjs +84 -0
- package/dist/utils/evaluation/core.mjs.map +1 -0
- package/dist/utils/evaluation/dataset.cjs +47 -0
- package/dist/utils/evaluation/dataset.mjs +46 -0
- package/dist/utils/evaluation/dataset.mjs.map +1 -0
- package/dist/utils/evaluation/evaluator.cjs +109 -0
- package/dist/utils/evaluation/{evaluator.js → evaluator.mjs} +48 -45
- package/dist/utils/evaluation/evaluator.mjs.map +1 -0
- package/dist/utils/evaluation/reporter.cjs +225 -0
- package/dist/utils/evaluation/reporter.mjs +220 -0
- package/dist/utils/evaluation/reporter.mjs.map +1 -0
- package/dist/utils/evaluation/runner.cjs +85 -0
- package/dist/utils/evaluation/runner.mjs +85 -0
- package/dist/utils/evaluation/runner.mjs.map +1 -0
- package/dist/utils/get-url-origin.cjs +12 -0
- package/dist/utils/get-url-origin.d.cts +5 -0
- package/dist/utils/get-url-origin.d.cts.map +1 -0
- package/dist/utils/get-url-origin.d.mts +5 -0
- package/dist/utils/get-url-origin.d.mts.map +1 -0
- package/dist/utils/get-url-origin.mjs +12 -0
- package/dist/utils/get-url-origin.mjs.map +1 -0
- package/dist/utils/inquirer/checkbox.cjs +265 -0
- package/dist/utils/inquirer/checkbox.mjs +262 -0
- package/dist/utils/inquirer/checkbox.mjs.map +1 -0
- package/dist/utils/listr.cjs +226 -0
- package/dist/utils/listr.d.cts +71 -0
- package/dist/utils/listr.d.cts.map +1 -0
- package/dist/utils/listr.d.mts +71 -0
- package/dist/utils/listr.d.mts.map +1 -0
- package/dist/utils/listr.mjs +222 -0
- package/dist/utils/listr.mjs.map +1 -0
- package/dist/utils/load-aigne.cjs +77 -0
- package/dist/utils/load-aigne.d.cts +29 -0
- package/dist/utils/load-aigne.d.cts.map +1 -0
- package/dist/utils/load-aigne.d.mts +29 -0
- package/dist/utils/load-aigne.d.mts.map +1 -0
- package/dist/utils/load-aigne.mjs +74 -0
- package/dist/utils/load-aigne.mjs.map +1 -0
- package/dist/utils/run-chat-loop.cjs +90 -0
- package/dist/utils/run-chat-loop.d.cts +20 -0
- package/dist/utils/run-chat-loop.d.cts.map +1 -0
- package/dist/utils/run-chat-loop.d.mts +20 -0
- package/dist/utils/run-chat-loop.d.mts.map +1 -0
- package/dist/utils/run-chat-loop.mjs +89 -0
- package/dist/utils/run-chat-loop.mjs.map +1 -0
- package/dist/utils/run-with-aigne.cjs +131 -0
- package/dist/utils/run-with-aigne.d.cts +46 -0
- package/dist/utils/run-with-aigne.d.cts.map +1 -0
- package/dist/utils/run-with-aigne.d.mts +46 -0
- package/dist/utils/run-with-aigne.d.mts.map +1 -0
- package/dist/utils/run-with-aigne.mjs +126 -0
- package/dist/utils/run-with-aigne.mjs.map +1 -0
- package/dist/utils/serve-mcp.cjs +91 -0
- package/dist/utils/serve-mcp.d.cts +20 -0
- package/dist/utils/serve-mcp.d.cts.map +1 -0
- package/dist/utils/serve-mcp.d.mts +20 -0
- package/dist/utils/serve-mcp.d.mts.map +1 -0
- package/dist/utils/serve-mcp.mjs +89 -0
- package/dist/utils/serve-mcp.mjs.map +1 -0
- package/dist/utils/spinner.cjs +19 -0
- package/dist/utils/spinner.d.cts +5 -0
- package/dist/utils/spinner.d.cts.map +1 -0
- package/dist/utils/spinner.d.mts +5 -0
- package/dist/utils/spinner.d.mts.map +1 -0
- package/dist/utils/spinner.mjs +19 -0
- package/dist/utils/spinner.mjs.map +1 -0
- package/dist/utils/string-utils.cjs +11 -0
- package/dist/utils/string-utils.d.cts +5 -0
- package/dist/utils/string-utils.d.cts.map +1 -0
- package/dist/utils/string-utils.d.mts +5 -0
- package/dist/utils/string-utils.d.mts.map +1 -0
- package/dist/utils/string-utils.mjs +10 -0
- package/dist/utils/string-utils.mjs.map +1 -0
- package/dist/utils/time.cjs +14 -0
- package/dist/utils/time.d.cts +5 -0
- package/dist/utils/time.d.cts.map +1 -0
- package/dist/utils/time.d.mts +5 -0
- package/dist/utils/time.d.mts.map +1 -0
- package/dist/utils/time.mjs +14 -0
- package/dist/utils/time.mjs.map +1 -0
- package/dist/utils/url.cjs +8 -0
- package/dist/utils/url.d.cts +5 -0
- package/dist/utils/url.d.cts.map +1 -0
- package/dist/utils/url.d.mts +5 -0
- package/dist/utils/url.d.mts.map +1 -0
- package/dist/utils/url.mjs +8 -0
- package/dist/utils/url.mjs.map +1 -0
- package/dist/utils/yargs.cjs +191 -0
- package/dist/utils/yargs.d.cts +96 -0
- package/dist/utils/yargs.d.cts.map +1 -0
- package/dist/utils/yargs.d.mts +96 -0
- package/dist/utils/yargs.d.mts.map +1 -0
- package/dist/utils/yargs.mjs +186 -0
- package/dist/utils/yargs.mjs.map +1 -0
- package/package.json +122 -45
- package/CHANGELOG.md +0 -5019
- package/dist/bunwrapper.d.ts +0 -2
- package/dist/bunwrapper.js +0 -18
- package/dist/cli.d.ts +0 -7
- package/dist/cli.js +0 -42
- package/dist/commands/aigne.d.ts +0 -4
- package/dist/commands/aigne.js +0 -35
- package/dist/commands/app/agent.d.ts +0 -26
- package/dist/commands/app/agent.js +0 -122
- package/dist/commands/app/app.d.ts +0 -7
- package/dist/commands/app/app.js +0 -92
- package/dist/commands/app/cli.d.ts +0 -1
- package/dist/commands/app/cli.js +0 -2
- package/dist/commands/app/upgrade.d.ts +0 -54
- package/dist/commands/app/upgrade.js +0 -236
- package/dist/commands/app.d.ts +0 -4
- package/dist/commands/app.js +0 -54
- package/dist/commands/create.d.ts +0 -6
- package/dist/commands/create.js +0 -74
- package/dist/commands/deploy.d.ts +0 -11
- package/dist/commands/deploy.js +0 -255
- package/dist/commands/eval.d.ts +0 -11
- package/dist/commands/eval.js +0 -110
- package/dist/commands/hub.d.ts +0 -3
- package/dist/commands/hub.js +0 -323
- package/dist/commands/observe.d.ts +0 -7
- package/dist/commands/observe.js +0 -41
- package/dist/commands/run-skill.d.ts +0 -6
- package/dist/commands/run-skill.js +0 -102
- package/dist/commands/run.d.ts +0 -9
- package/dist/commands/run.js +0 -187
- package/dist/commands/serve-mcp.d.ts +0 -20
- package/dist/commands/serve-mcp.js +0 -67
- package/dist/commands/test.d.ts +0 -9
- package/dist/commands/test.js +0 -33
- package/dist/constants.d.ts +0 -7
- package/dist/constants.js +0 -21
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/tracer/terminal.d.ts +0 -62
- package/dist/tracer/terminal.js +0 -404
- package/dist/type.d.ts +0 -5
- package/dist/type.js +0 -1
- package/dist/ui/utils/terminal-input.d.ts +0 -19
- package/dist/ui/utils/terminal-input.js +0 -123
- package/dist/ui/utils/text-buffer.d.ts +0 -87
- package/dist/ui/utils/text-buffer.js +0 -1059
- package/dist/ui/utils/text-utils.d.ts +0 -37
- package/dist/ui/utils/text-utils.js +0 -185
- package/dist/utils/agent-v1.d.ts +0 -134
- package/dist/utils/agent-v1.js +0 -213
- package/dist/utils/aigne-hub/constants.d.ts +0 -6
- package/dist/utils/aigne-hub/constants.js +0 -12
- package/dist/utils/aigne-hub/credential.d.ts +0 -20
- package/dist/utils/aigne-hub/credential.js +0 -182
- package/dist/utils/aigne-hub/crypto.d.ts +0 -4
- package/dist/utils/aigne-hub/crypto.js +0 -30
- package/dist/utils/aigne-hub/model.d.ts +0 -13
- package/dist/utils/aigne-hub/model.js +0 -122
- package/dist/utils/aigne-hub/store/file.d.ts +0 -15
- package/dist/utils/aigne-hub/store/file.js +0 -69
- package/dist/utils/aigne-hub/store/index.d.ts +0 -5
- package/dist/utils/aigne-hub/store/index.js +0 -43
- package/dist/utils/aigne-hub/store/keytar.d.ts +0 -15
- package/dist/utils/aigne-hub/store/keytar.js +0 -67
- package/dist/utils/aigne-hub/store/migrate.d.ts +0 -2
- package/dist/utils/aigne-hub/store/migrate.js +0 -57
- package/dist/utils/aigne-hub/type.d.ts +0 -38
- package/dist/utils/aigne-hub/type.js +0 -1
- package/dist/utils/aigne-hub-user.d.ts +0 -16
- package/dist/utils/aigne-hub-user.js +0 -10
- package/dist/utils/ascii-logo.d.ts +0 -1
- package/dist/utils/download.d.ts +0 -3
- package/dist/utils/download.js +0 -19
- package/dist/utils/evaluation/core.d.ts +0 -8
- package/dist/utils/evaluation/core.js +0 -83
- package/dist/utils/evaluation/dataset.d.ts +0 -15
- package/dist/utils/evaluation/dataset.js +0 -61
- package/dist/utils/evaluation/evaluator.d.ts +0 -9
- package/dist/utils/evaluation/reporter.d.ts +0 -28
- package/dist/utils/evaluation/reporter.js +0 -221
- package/dist/utils/evaluation/runner.d.ts +0 -16
- package/dist/utils/evaluation/runner.js +0 -129
- package/dist/utils/evaluation/type.d.ts +0 -69
- package/dist/utils/evaluation/type.js +0 -1
- package/dist/utils/get-url-origin.d.ts +0 -1
- package/dist/utils/get-url-origin.js +0 -8
- package/dist/utils/inquirer/checkbox.d.ts +0 -55
- package/dist/utils/inquirer/checkbox.js +0 -319
- package/dist/utils/listr.d.ts +0 -64
- package/dist/utils/listr.js +0 -265
- package/dist/utils/load-aigne.d.ts +0 -18
- package/dist/utils/load-aigne.js +0 -80
- package/dist/utils/run-chat-loop.d.ts +0 -15
- package/dist/utils/run-chat-loop.js +0 -87
- package/dist/utils/run-with-aigne.d.ts +0 -27
- package/dist/utils/run-with-aigne.js +0 -157
- package/dist/utils/serve-mcp.d.ts +0 -9
- package/dist/utils/serve-mcp.js +0 -93
- package/dist/utils/spinner.d.ts +0 -1
- package/dist/utils/spinner.js +0 -14
- package/dist/utils/string-utils.d.ts +0 -1
- package/dist/utils/string-utils.js +0 -4
- package/dist/utils/time.d.ts +0 -1
- package/dist/utils/time.js +0 -12
- package/dist/utils/url.d.ts +0 -1
- package/dist/utils/url.js +0 -3
- package/dist/utils/yargs.d.ts +0 -94
- package/dist/utils/yargs.js +0 -210
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { CHAT_MODEL_OPTIONS } from "../../constants.mjs";
|
|
2
|
+
import { NeedReinstallBetaError, NeedReinstallError, loadApplication, upgradeCommandModule } from "./upgrade.mjs";
|
|
3
|
+
import { withRunAgentCommonOptions } from "../../utils/yargs.mjs";
|
|
4
|
+
import { highlightUrl } from "../../utils/string-utils.mjs";
|
|
5
|
+
import { agentCommandModule, cliAgentCommandModule, serveMcpCommandModule } from "./agent.mjs";
|
|
6
|
+
import { LogLevel, logger } from "@aigne/core/utils/logger";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import yargs from "yargs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { pick } from "@aigne/core/utils/type-utils";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { hideBin } from "yargs/helpers";
|
|
13
|
+
|
|
14
|
+
//#region src/commands/app/app.ts
|
|
15
|
+
async function runAppCLI({ appName = process.env.AIGNE_APP_NAME, appPackageName = process.env.AIGNE_APP_PACKAGE_NAME, appDescription = process.env.AIGNE_APP_DESCRIPTION, appUseBetaVersion = process.env.AIGNE_APP_USE_BETA_APPS === "1" ? true : void 0, ...options } = {}) {
|
|
16
|
+
const [scriptName, ...argv] = options.argv || hideBin(process.argv);
|
|
17
|
+
if (!appName || !appPackageName) throw new Error("AIGNE_APP_NAME or AIGNE_APP_PACKAGE_NAME is not defined");
|
|
18
|
+
try {
|
|
19
|
+
const options$1 = withRunAgentCommonOptions(yargs(argv).help(false).version(false).strict(false)).parseSync();
|
|
20
|
+
logger.level = options$1.logLevel;
|
|
21
|
+
const dir = join(homedir(), ".aigne", "registry.npmjs.org", appPackageName);
|
|
22
|
+
const y = yargs().scriptName(`aigne ${scriptName}`).usage(`aigne ${scriptName}\n\n${appDescription || ""}`).command(upgradeCommandModule({
|
|
23
|
+
packageName: appPackageName,
|
|
24
|
+
dir
|
|
25
|
+
}));
|
|
26
|
+
if (!isUpgradeCommand(argv)) {
|
|
27
|
+
const { aigne, version } = await loadApplication({
|
|
28
|
+
packageName: appPackageName,
|
|
29
|
+
beta: appUseBetaVersion,
|
|
30
|
+
dir,
|
|
31
|
+
install: true,
|
|
32
|
+
modelOptions: pick(options$1, CHAT_MODEL_OPTIONS),
|
|
33
|
+
imageModelOptions: { model: options$1.imageModel },
|
|
34
|
+
skipModelLoading: (options$1.help || options$1.h || options$1.version || options$1.v) === true
|
|
35
|
+
});
|
|
36
|
+
if (aigne.cli?.chat) y.command({
|
|
37
|
+
...agentCommandModule({
|
|
38
|
+
aigne,
|
|
39
|
+
agent: aigne.cli.chat,
|
|
40
|
+
interactive: true
|
|
41
|
+
}),
|
|
42
|
+
command: "$0"
|
|
43
|
+
});
|
|
44
|
+
for (const cliAgent of aigne.cli?.agents ?? []) y.command(cliAgentCommandModule({
|
|
45
|
+
aigne,
|
|
46
|
+
cliAgent
|
|
47
|
+
}));
|
|
48
|
+
y.option("model", {
|
|
49
|
+
type: "string",
|
|
50
|
+
description: "Model to use for the application, example: openai:gpt-4.1 or google:gemini-2.5-flash"
|
|
51
|
+
}).command(serveMcpCommandModule({
|
|
52
|
+
aigne,
|
|
53
|
+
name: appName
|
|
54
|
+
}));
|
|
55
|
+
y.version(`${appName} v${version}`);
|
|
56
|
+
}
|
|
57
|
+
await y.alias("v", "version").alias("h", "help").demandCommand().fail((message, error, yargs$1) => {
|
|
58
|
+
if (!error) {
|
|
59
|
+
yargs$1.showHelp();
|
|
60
|
+
console.error(`\n${message}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}).parseAsync(argv);
|
|
64
|
+
process.exit(0);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (error instanceof NeedReinstallError || error instanceof NeedReinstallBetaError) {
|
|
67
|
+
logger.warn(error.message);
|
|
68
|
+
process.exit(error instanceof NeedReinstallBetaError ? NeedReinstallBetaError.code : NeedReinstallError.code);
|
|
69
|
+
}
|
|
70
|
+
if (error.name !== "ExitPromptError") {
|
|
71
|
+
console.log("");
|
|
72
|
+
if (logger.enabled(LogLevel.ERROR)) console.error(chalk.red(error.stack));
|
|
73
|
+
else console.error(`${chalk.red("Error:")} ${highlightUrl(error.message)}`);
|
|
74
|
+
}
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function isUpgradeCommand(argv) {
|
|
79
|
+
const skipGlobalOptions = [
|
|
80
|
+
"-v",
|
|
81
|
+
"--version",
|
|
82
|
+
"-h",
|
|
83
|
+
"--help"
|
|
84
|
+
];
|
|
85
|
+
return argv[0] === "upgrade" && !argv.some((arg) => skipGlobalOptions.includes(arg));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
//#endregion
|
|
89
|
+
export { runAppCLI };
|
|
90
|
+
//# sourceMappingURL=app.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.mjs","names":["options"],"sources":["../../../src/commands/app/app.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { CHAT_MODEL_OPTIONS } from \"@aigne/cli/constants.js\";\nimport { LogLevel, logger } from \"@aigne/core/utils/logger\";\nimport { pick } from \"@aigne/core/utils/type-utils\";\nimport chalk from \"chalk\";\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { highlightUrl } from \"../../utils/string-utils.js\";\nimport { withRunAgentCommonOptions } from \"../../utils/yargs.js\";\nimport { agentCommandModule, cliAgentCommandModule, serveMcpCommandModule } from \"./agent.js\";\nimport {\n loadApplication,\n NeedReinstallBetaError,\n NeedReinstallError,\n upgradeCommandModule,\n} from \"./upgrade.js\";\n\nexport async function runAppCLI({\n appName = process.env.AIGNE_APP_NAME,\n appPackageName = process.env.AIGNE_APP_PACKAGE_NAME,\n appDescription = process.env.AIGNE_APP_DESCRIPTION,\n appUseBetaVersion = process.env.AIGNE_APP_USE_BETA_APPS === \"1\" ? true : undefined,\n ...options\n}: {\n argv?: string[];\n appName?: string;\n appPackageName?: string;\n appDescription?: string;\n appUseBetaVersion?: boolean;\n} = {}) {\n const [scriptName, ...argv] = options.argv || hideBin(process.argv);\n if (!appName || !appPackageName)\n throw new Error(\"AIGNE_APP_NAME or AIGNE_APP_PACKAGE_NAME is not defined\");\n\n try {\n // Parse model options for loading application\n const options = withRunAgentCommonOptions(\n yargs(argv).help(false).version(false).strict(false),\n ).parseSync();\n logger.level = options.logLevel;\n\n const dir = join(homedir(), \".aigne\", \"registry.npmjs.org\", appPackageName);\n\n const y = yargs()\n .scriptName(`aigne ${scriptName}`)\n .usage(`aigne ${scriptName}\\n\\n${appDescription || \"\"}`)\n .command(upgradeCommandModule({ packageName: appPackageName, dir }));\n\n if (!isUpgradeCommand(argv)) {\n const { aigne, version } = await loadApplication({\n packageName: appPackageName,\n beta: appUseBetaVersion,\n dir,\n install: true,\n modelOptions: pick(options, CHAT_MODEL_OPTIONS),\n imageModelOptions: { model: options.imageModel },\n skipModelLoading: (options.help || options.h || options.version || options.v) === true,\n });\n\n if (aigne.cli?.chat) {\n y.command({\n ...agentCommandModule({\n aigne,\n agent: aigne.cli.chat,\n interactive: true,\n }),\n command: \"$0\",\n });\n }\n\n for (const cliAgent of aigne.cli?.agents ?? []) {\n y.command(cliAgentCommandModule({ aigne, cliAgent }));\n }\n\n y.option(\"model\", {\n type: \"string\",\n description:\n \"Model to use for the application, example: openai:gpt-4.1 or google:gemini-2.5-flash\",\n }).command(serveMcpCommandModule({ aigne, name: appName }));\n\n y.version(`${appName} v${version}`);\n }\n\n await y\n .alias(\"v\", \"version\")\n .alias(\"h\", \"help\")\n .demandCommand()\n .fail((message, error, yargs) => {\n // We catch all errors below, here just print the help message non-error case like demandCommand\n if (!error) {\n yargs.showHelp();\n\n console.error(`\\n${message}`);\n process.exit(1);\n }\n })\n .parseAsync(argv);\n\n process.exit(0);\n } catch (error) {\n if (error instanceof NeedReinstallError || error instanceof NeedReinstallBetaError) {\n logger.warn(error.message);\n process.exit(\n error instanceof NeedReinstallBetaError\n ? NeedReinstallBetaError.code\n : NeedReinstallError.code,\n );\n }\n\n if (error.name !== \"ExitPromptError\") {\n console.log(\"\"); // Add an empty line for better readability\n\n if (logger.enabled(LogLevel.ERROR)) {\n console.error(chalk.red(error.stack));\n } else {\n console.error(`${chalk.red(\"Error:\")} ${highlightUrl(error.message)}`);\n }\n }\n\n process.exit(1);\n }\n}\n\nfunction isUpgradeCommand(argv: string[]): boolean {\n const skipGlobalOptions = [\"-v\", \"--version\", \"-h\", \"--help\"];\n return argv[0] === \"upgrade\" && !argv.some((arg) => skipGlobalOptions.includes(arg));\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,eAAsB,UAAU,EAC9B,UAAU,QAAQ,IAAI,gBACtB,iBAAiB,QAAQ,IAAI,wBAC7B,iBAAiB,QAAQ,IAAI,uBAC7B,oBAAoB,QAAQ,IAAI,4BAA4B,MAAM,OAAO,QACzE,GAAG,YAOD,EAAE,EAAE;CACN,MAAM,CAAC,YAAY,GAAG,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;AACnE,KAAI,CAAC,WAAW,CAAC,eACf,OAAM,IAAI,MAAM,0DAA0D;AAE5E,KAAI;EAEF,MAAMA,YAAU,0BACd,MAAM,KAAK,CAAC,KAAK,MAAM,CAAC,QAAQ,MAAM,CAAC,OAAO,MAAM,CACrD,CAAC,WAAW;AACb,SAAO,QAAQA,UAAQ;EAEvB,MAAM,MAAM,KAAK,SAAS,EAAE,UAAU,sBAAsB,eAAe;EAE3E,MAAM,IAAI,OAAO,CACd,WAAW,SAAS,aAAa,CACjC,MAAM,SAAS,WAAW,MAAM,kBAAkB,KAAK,CACvD,QAAQ,qBAAqB;GAAE,aAAa;GAAgB;GAAK,CAAC,CAAC;AAEtE,MAAI,CAAC,iBAAiB,KAAK,EAAE;GAC3B,MAAM,EAAE,OAAO,YAAY,MAAM,gBAAgB;IAC/C,aAAa;IACb,MAAM;IACN;IACA,SAAS;IACT,cAAc,KAAKA,WAAS,mBAAmB;IAC/C,mBAAmB,EAAE,OAAOA,UAAQ,YAAY;IAChD,mBAAmBA,UAAQ,QAAQA,UAAQ,KAAKA,UAAQ,WAAWA,UAAQ,OAAO;IACnF,CAAC;AAEF,OAAI,MAAM,KAAK,KACb,GAAE,QAAQ;IACR,GAAG,mBAAmB;KACpB;KACA,OAAO,MAAM,IAAI;KACjB,aAAa;KACd,CAAC;IACF,SAAS;IACV,CAAC;AAGJ,QAAK,MAAM,YAAY,MAAM,KAAK,UAAU,EAAE,CAC5C,GAAE,QAAQ,sBAAsB;IAAE;IAAO;IAAU,CAAC,CAAC;AAGvD,KAAE,OAAO,SAAS;IAChB,MAAM;IACN,aACE;IACH,CAAC,CAAC,QAAQ,sBAAsB;IAAE;IAAO,MAAM;IAAS,CAAC,CAAC;AAE3D,KAAE,QAAQ,GAAG,QAAQ,IAAI,UAAU;;AAGrC,QAAM,EACH,MAAM,KAAK,UAAU,CACrB,MAAM,KAAK,OAAO,CAClB,eAAe,CACf,MAAM,SAAS,OAAO,YAAU;AAE/B,OAAI,CAAC,OAAO;AACV,YAAM,UAAU;AAEhB,YAAQ,MAAM,KAAK,UAAU;AAC7B,YAAQ,KAAK,EAAE;;IAEjB,CACD,WAAW,KAAK;AAEnB,UAAQ,KAAK,EAAE;UACR,OAAO;AACd,MAAI,iBAAiB,sBAAsB,iBAAiB,wBAAwB;AAClF,UAAO,KAAK,MAAM,QAAQ;AAC1B,WAAQ,KACN,iBAAiB,yBACb,uBAAuB,OACvB,mBAAmB,KACxB;;AAGH,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAQ,IAAI,GAAG;AAEf,OAAI,OAAO,QAAQ,SAAS,MAAM,CAChC,SAAQ,MAAM,MAAM,IAAI,MAAM,MAAM,CAAC;OAErC,SAAQ,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,GAAG,aAAa,MAAM,QAAQ,GAAG;;AAI1E,UAAQ,KAAK,EAAE;;;AAInB,SAAS,iBAAiB,MAAyB;CACjD,MAAM,oBAAoB;EAAC;EAAM;EAAa;EAAM;EAAS;AAC7D,QAAO,KAAK,OAAO,aAAa,CAAC,KAAK,MAAM,QAAQ,kBAAkB,SAAS,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../../../src/commands/app/cli.ts"],"sourcesContent":["import { runAppCLI } from \"./app.js\";\n\nrunAppCLI();\n"],"mappings":";;;AAEA,WAAW"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_utils_download = require('../../utils/download.cjs');
|
|
3
|
+
const require_utils_load_aigne = require('../../utils/load-aigne.cjs');
|
|
4
|
+
const require_utils_spinner = require('../../utils/spinner.cjs');
|
|
5
|
+
let node_child_process = require("node:child_process");
|
|
6
|
+
let node_path = require("node:path");
|
|
7
|
+
let node_fs_promises = require("node:fs/promises");
|
|
8
|
+
let _aigne_core_loader_error = require("@aigne/core/loader/error");
|
|
9
|
+
let _aigne_core_utils_fetch = require("@aigne/core/utils/fetch");
|
|
10
|
+
let _aigne_listr2 = require("@aigne/listr2");
|
|
11
|
+
let ufo = require("ufo");
|
|
12
|
+
|
|
13
|
+
//#region src/commands/app/upgrade.ts
|
|
14
|
+
const NPM_PACKAGE_CACHE_TIME_MS = 1e3 * 60 * 60 * 24;
|
|
15
|
+
/**
|
|
16
|
+
* Check if beta applications should be used based on environment variables
|
|
17
|
+
*/
|
|
18
|
+
function shouldUseBetaApps() {
|
|
19
|
+
const envVar = process.env.AIGNE_USE_BETA_APPS;
|
|
20
|
+
return envVar === "true" || envVar === "1";
|
|
21
|
+
}
|
|
22
|
+
const upgradeCommandModule = ({ packageName, dir }) => ({
|
|
23
|
+
command: "upgrade",
|
|
24
|
+
describe: `Upgrade ${packageName} to the latest version`,
|
|
25
|
+
builder: (yargs) => {
|
|
26
|
+
return yargs.option("beta", {
|
|
27
|
+
type: "boolean",
|
|
28
|
+
describe: "Use beta versions if available"
|
|
29
|
+
}).option("target-version", {
|
|
30
|
+
type: "string",
|
|
31
|
+
describe: "Specify a version to upgrade to (default is latest)",
|
|
32
|
+
alias: ["to", "target"]
|
|
33
|
+
}).option("force", {
|
|
34
|
+
type: "boolean",
|
|
35
|
+
describe: "Force upgrade even if already at latest version",
|
|
36
|
+
default: false
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
handler: async ({ beta, targetVersion, force }) => {
|
|
40
|
+
beta ??= shouldUseBetaApps();
|
|
41
|
+
const npm = await require_utils_spinner.withSpinner("", async () => {
|
|
42
|
+
if (force) await (0, node_fs_promises.rm)(dir, {
|
|
43
|
+
force: true,
|
|
44
|
+
recursive: true
|
|
45
|
+
});
|
|
46
|
+
return await getNpmTgzInfo(packageName, {
|
|
47
|
+
beta,
|
|
48
|
+
version: targetVersion
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
const check = await checkInstallation(dir);
|
|
52
|
+
if (force || !check || npm.version !== check.version) await installApp({
|
|
53
|
+
packageName,
|
|
54
|
+
dir,
|
|
55
|
+
beta,
|
|
56
|
+
version: targetVersion
|
|
57
|
+
});
|
|
58
|
+
const app = await loadApplication({
|
|
59
|
+
dir,
|
|
60
|
+
packageName,
|
|
61
|
+
install: true,
|
|
62
|
+
skipModelLoading: true
|
|
63
|
+
});
|
|
64
|
+
if (force || check?.version !== app.version) console.log(`\n✅ Upgraded ${packageName} to version ${app.version}`);
|
|
65
|
+
else console.log(`\n✅ ${packageName} is already at the latest version (${app.version})`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
var NeedReinstallError = class extends Error {
|
|
69
|
+
static code = 244;
|
|
70
|
+
};
|
|
71
|
+
var NeedReinstallBetaError = class extends Error {
|
|
72
|
+
static code = 245;
|
|
73
|
+
};
|
|
74
|
+
async function loadApplication(options) {
|
|
75
|
+
const { dir, packageName } = options;
|
|
76
|
+
const check = await checkInstallation(dir);
|
|
77
|
+
const beta = options.beta ?? check?.version?.includes("beta");
|
|
78
|
+
if (check) {
|
|
79
|
+
let needUpdate = check.expired;
|
|
80
|
+
if (check.expired) await require_utils_spinner.withSpinner("Checking updates...", async () => {
|
|
81
|
+
if ((await getNpmTgzInfo(packageName, { beta })).version === check.version) {
|
|
82
|
+
await writeInstallationMetadata(dir, { installedAt: Date.now() });
|
|
83
|
+
needUpdate = false;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
if (!needUpdate) {
|
|
87
|
+
const aigne = await require_utils_load_aigne.loadAIGNE({
|
|
88
|
+
...options,
|
|
89
|
+
path: dir,
|
|
90
|
+
metadata: {
|
|
91
|
+
appName: packageName,
|
|
92
|
+
appVersion: check?.version
|
|
93
|
+
}
|
|
94
|
+
}).catch(async (error) => {
|
|
95
|
+
if (error instanceof _aigne_core_loader_error.LoadJsAgentError) {
|
|
96
|
+
await require_utils_spinner.withSpinner("", async () => {
|
|
97
|
+
await (0, node_fs_promises.rm)(options.dir, {
|
|
98
|
+
recursive: true,
|
|
99
|
+
force: true
|
|
100
|
+
});
|
|
101
|
+
await (0, node_fs_promises.mkdir)(options.dir, { recursive: true });
|
|
102
|
+
});
|
|
103
|
+
const message = `⚠️ Failed to load ${packageName}, trying to reinstall: ${error.message}`;
|
|
104
|
+
throw beta ? new NeedReinstallBetaError(message) : new NeedReinstallError(message);
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
});
|
|
108
|
+
if (aigne) return {
|
|
109
|
+
aigne,
|
|
110
|
+
version: check.version,
|
|
111
|
+
isCache: true
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!options.install) return null;
|
|
116
|
+
const result = await installApp({
|
|
117
|
+
dir,
|
|
118
|
+
packageName,
|
|
119
|
+
beta
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
aigne: await require_utils_load_aigne.loadAIGNE({
|
|
123
|
+
...options,
|
|
124
|
+
path: dir,
|
|
125
|
+
metadata: {
|
|
126
|
+
appName: packageName,
|
|
127
|
+
appVersion: result.version
|
|
128
|
+
}
|
|
129
|
+
}),
|
|
130
|
+
version: result.version
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async function getNpmTgzInfo(name, { version, beta } = {}) {
|
|
134
|
+
const data = await (await (0, _aigne_core_utils_fetch.fetch)((0, ufo.joinURL)("https://registry.npmjs.org", name))).json();
|
|
135
|
+
let targetVersion;
|
|
136
|
+
if (version) {
|
|
137
|
+
if (!data.versions[version]) throw new Error(`Version ${version} of package ${name} not found`);
|
|
138
|
+
targetVersion = version;
|
|
139
|
+
} else if (beta && data["dist-tags"].beta) targetVersion = data["dist-tags"].beta;
|
|
140
|
+
else targetVersion = data["dist-tags"].latest;
|
|
141
|
+
const url = data.versions[targetVersion].dist.tarball;
|
|
142
|
+
return {
|
|
143
|
+
version: targetVersion,
|
|
144
|
+
url
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
async function readInstallationMetadata(dir) {
|
|
148
|
+
return safeParseJSON(await (0, node_fs_promises.readFile)((0, node_path.join)(dir, ".aigne-cli.json"), "utf-8").catch(() => "{}"));
|
|
149
|
+
}
|
|
150
|
+
async function writeInstallationMetadata(dir, metadata) {
|
|
151
|
+
await (0, node_fs_promises.writeFile)((0, node_path.join)(dir, ".aigne-cli.json"), JSON.stringify(metadata, null, 2));
|
|
152
|
+
}
|
|
153
|
+
async function checkInstallation(dir, { cacheTimeMs = NPM_PACKAGE_CACHE_TIME_MS } = {}) {
|
|
154
|
+
if (!await (0, node_fs_promises.stat)((0, node_path.join)(dir, "package.json")).catch(() => null)) return null;
|
|
155
|
+
const version = safeParseJSON(await (0, node_fs_promises.readFile)((0, node_path.join)(dir, "package.json"), "utf-8"))?.version;
|
|
156
|
+
if (!version) return null;
|
|
157
|
+
const installedAt = (await readInstallationMetadata(dir))?.installedAt;
|
|
158
|
+
if (!installedAt) return null;
|
|
159
|
+
return {
|
|
160
|
+
version,
|
|
161
|
+
expired: Date.now() - installedAt > cacheTimeMs
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
async function installApp({ dir, packageName, beta, version }) {
|
|
165
|
+
return await new _aigne_listr2.Listr([
|
|
166
|
+
{
|
|
167
|
+
title: `Fetching ${packageName} metadata`,
|
|
168
|
+
task: async (ctx, task) => {
|
|
169
|
+
if (beta) task.title = `Fetching ${packageName} metadata (using beta version)`;
|
|
170
|
+
const info = await getNpmTgzInfo(packageName, {
|
|
171
|
+
beta,
|
|
172
|
+
version
|
|
173
|
+
});
|
|
174
|
+
Object.assign(ctx, info);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
title: `Downloading ${packageName}`,
|
|
179
|
+
task: async (ctx, task) => {
|
|
180
|
+
task.title = `Downloading ${packageName} (v${ctx.version})`;
|
|
181
|
+
await (0, node_fs_promises.mkdir)(dir, { recursive: true });
|
|
182
|
+
await require_utils_download.downloadAndExtract(ctx.url, dir, { strip: 1 });
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
title: "Installing dependencies",
|
|
187
|
+
task: async (_, task) => {
|
|
188
|
+
await installDependencies(dir, { log: (log) => {
|
|
189
|
+
const last = log.split("\n").findLast((i) => !!i);
|
|
190
|
+
if (last) task.output = last;
|
|
191
|
+
} });
|
|
192
|
+
await writeInstallationMetadata(dir, { installedAt: Date.now() });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
], { rendererOptions: {
|
|
196
|
+
collapseSubtasks: false,
|
|
197
|
+
showErrorMessage: false,
|
|
198
|
+
timer: _aigne_listr2.PRESET_TIMER
|
|
199
|
+
} }).run();
|
|
200
|
+
}
|
|
201
|
+
async function installDependencies(dir, { log } = {}) {
|
|
202
|
+
await new Promise((resolve, reject) => {
|
|
203
|
+
const child = (0, node_child_process.spawn)("npm", [
|
|
204
|
+
"install",
|
|
205
|
+
"--omit",
|
|
206
|
+
"dev",
|
|
207
|
+
"--verbose",
|
|
208
|
+
"--legacy-peer-deps"
|
|
209
|
+
], {
|
|
210
|
+
cwd: dir,
|
|
211
|
+
stdio: "pipe",
|
|
212
|
+
shell: process.platform === "win32"
|
|
213
|
+
});
|
|
214
|
+
child.stdout.on("data", (data) => {
|
|
215
|
+
log?.(data.toString());
|
|
216
|
+
});
|
|
217
|
+
let stderr = "";
|
|
218
|
+
child.stderr.on("data", (data) => {
|
|
219
|
+
const str = data.toString();
|
|
220
|
+
log?.(str);
|
|
221
|
+
stderr += str;
|
|
222
|
+
});
|
|
223
|
+
child.on("error", (error) => reject(error));
|
|
224
|
+
child.on("exit", (code) => {
|
|
225
|
+
if (code === 0) resolve();
|
|
226
|
+
else {
|
|
227
|
+
console.error(stderr);
|
|
228
|
+
reject(/* @__PURE__ */ new Error(`npm install failed with code ${code}`));
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
function safeParseJSON(raw) {
|
|
234
|
+
try {
|
|
235
|
+
return JSON.parse(raw);
|
|
236
|
+
} catch {}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
//#endregion
|
|
240
|
+
exports.NeedReinstallBetaError = NeedReinstallBetaError;
|
|
241
|
+
exports.NeedReinstallError = NeedReinstallError;
|
|
242
|
+
exports.loadApplication = loadApplication;
|
|
243
|
+
exports.upgradeCommandModule = upgradeCommandModule;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { downloadAndExtract } from "../../utils/download.mjs";
|
|
2
|
+
import { loadAIGNE } from "../../utils/load-aigne.mjs";
|
|
3
|
+
import { withSpinner } from "../../utils/spinner.mjs";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
7
|
+
import { LoadJsAgentError } from "@aigne/core/loader/error";
|
|
8
|
+
import { fetch } from "@aigne/core/utils/fetch";
|
|
9
|
+
import { Listr, PRESET_TIMER } from "@aigne/listr2";
|
|
10
|
+
import { joinURL } from "ufo";
|
|
11
|
+
|
|
12
|
+
//#region src/commands/app/upgrade.ts
|
|
13
|
+
const NPM_PACKAGE_CACHE_TIME_MS = 1e3 * 60 * 60 * 24;
|
|
14
|
+
/**
|
|
15
|
+
* Check if beta applications should be used based on environment variables
|
|
16
|
+
*/
|
|
17
|
+
function shouldUseBetaApps() {
|
|
18
|
+
const envVar = process.env.AIGNE_USE_BETA_APPS;
|
|
19
|
+
return envVar === "true" || envVar === "1";
|
|
20
|
+
}
|
|
21
|
+
const upgradeCommandModule = ({ packageName, dir }) => ({
|
|
22
|
+
command: "upgrade",
|
|
23
|
+
describe: `Upgrade ${packageName} to the latest version`,
|
|
24
|
+
builder: (yargs) => {
|
|
25
|
+
return yargs.option("beta", {
|
|
26
|
+
type: "boolean",
|
|
27
|
+
describe: "Use beta versions if available"
|
|
28
|
+
}).option("target-version", {
|
|
29
|
+
type: "string",
|
|
30
|
+
describe: "Specify a version to upgrade to (default is latest)",
|
|
31
|
+
alias: ["to", "target"]
|
|
32
|
+
}).option("force", {
|
|
33
|
+
type: "boolean",
|
|
34
|
+
describe: "Force upgrade even if already at latest version",
|
|
35
|
+
default: false
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
handler: async ({ beta, targetVersion, force }) => {
|
|
39
|
+
beta ??= shouldUseBetaApps();
|
|
40
|
+
const npm = await withSpinner("", async () => {
|
|
41
|
+
if (force) await rm(dir, {
|
|
42
|
+
force: true,
|
|
43
|
+
recursive: true
|
|
44
|
+
});
|
|
45
|
+
return await getNpmTgzInfo(packageName, {
|
|
46
|
+
beta,
|
|
47
|
+
version: targetVersion
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
const check = await checkInstallation(dir);
|
|
51
|
+
if (force || !check || npm.version !== check.version) await installApp({
|
|
52
|
+
packageName,
|
|
53
|
+
dir,
|
|
54
|
+
beta,
|
|
55
|
+
version: targetVersion
|
|
56
|
+
});
|
|
57
|
+
const app = await loadApplication({
|
|
58
|
+
dir,
|
|
59
|
+
packageName,
|
|
60
|
+
install: true,
|
|
61
|
+
skipModelLoading: true
|
|
62
|
+
});
|
|
63
|
+
if (force || check?.version !== app.version) console.log(`\n✅ Upgraded ${packageName} to version ${app.version}`);
|
|
64
|
+
else console.log(`\n✅ ${packageName} is already at the latest version (${app.version})`);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
var NeedReinstallError = class extends Error {
|
|
68
|
+
static code = 244;
|
|
69
|
+
};
|
|
70
|
+
var NeedReinstallBetaError = class extends Error {
|
|
71
|
+
static code = 245;
|
|
72
|
+
};
|
|
73
|
+
async function loadApplication(options) {
|
|
74
|
+
const { dir, packageName } = options;
|
|
75
|
+
const check = await checkInstallation(dir);
|
|
76
|
+
const beta = options.beta ?? check?.version?.includes("beta");
|
|
77
|
+
if (check) {
|
|
78
|
+
let needUpdate = check.expired;
|
|
79
|
+
if (check.expired) await withSpinner("Checking updates...", async () => {
|
|
80
|
+
if ((await getNpmTgzInfo(packageName, { beta })).version === check.version) {
|
|
81
|
+
await writeInstallationMetadata(dir, { installedAt: Date.now() });
|
|
82
|
+
needUpdate = false;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
if (!needUpdate) {
|
|
86
|
+
const aigne = await loadAIGNE({
|
|
87
|
+
...options,
|
|
88
|
+
path: dir,
|
|
89
|
+
metadata: {
|
|
90
|
+
appName: packageName,
|
|
91
|
+
appVersion: check?.version
|
|
92
|
+
}
|
|
93
|
+
}).catch(async (error) => {
|
|
94
|
+
if (error instanceof LoadJsAgentError) {
|
|
95
|
+
await withSpinner("", async () => {
|
|
96
|
+
await rm(options.dir, {
|
|
97
|
+
recursive: true,
|
|
98
|
+
force: true
|
|
99
|
+
});
|
|
100
|
+
await mkdir(options.dir, { recursive: true });
|
|
101
|
+
});
|
|
102
|
+
const message = `⚠️ Failed to load ${packageName}, trying to reinstall: ${error.message}`;
|
|
103
|
+
throw beta ? new NeedReinstallBetaError(message) : new NeedReinstallError(message);
|
|
104
|
+
}
|
|
105
|
+
throw error;
|
|
106
|
+
});
|
|
107
|
+
if (aigne) return {
|
|
108
|
+
aigne,
|
|
109
|
+
version: check.version,
|
|
110
|
+
isCache: true
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!options.install) return null;
|
|
115
|
+
const result = await installApp({
|
|
116
|
+
dir,
|
|
117
|
+
packageName,
|
|
118
|
+
beta
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
aigne: await loadAIGNE({
|
|
122
|
+
...options,
|
|
123
|
+
path: dir,
|
|
124
|
+
metadata: {
|
|
125
|
+
appName: packageName,
|
|
126
|
+
appVersion: result.version
|
|
127
|
+
}
|
|
128
|
+
}),
|
|
129
|
+
version: result.version
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async function getNpmTgzInfo(name, { version, beta } = {}) {
|
|
133
|
+
const data = await (await fetch(joinURL("https://registry.npmjs.org", name))).json();
|
|
134
|
+
let targetVersion;
|
|
135
|
+
if (version) {
|
|
136
|
+
if (!data.versions[version]) throw new Error(`Version ${version} of package ${name} not found`);
|
|
137
|
+
targetVersion = version;
|
|
138
|
+
} else if (beta && data["dist-tags"].beta) targetVersion = data["dist-tags"].beta;
|
|
139
|
+
else targetVersion = data["dist-tags"].latest;
|
|
140
|
+
const url = data.versions[targetVersion].dist.tarball;
|
|
141
|
+
return {
|
|
142
|
+
version: targetVersion,
|
|
143
|
+
url
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
async function readInstallationMetadata(dir) {
|
|
147
|
+
return safeParseJSON(await readFile(join(dir, ".aigne-cli.json"), "utf-8").catch(() => "{}"));
|
|
148
|
+
}
|
|
149
|
+
async function writeInstallationMetadata(dir, metadata) {
|
|
150
|
+
await writeFile(join(dir, ".aigne-cli.json"), JSON.stringify(metadata, null, 2));
|
|
151
|
+
}
|
|
152
|
+
async function checkInstallation(dir, { cacheTimeMs = NPM_PACKAGE_CACHE_TIME_MS } = {}) {
|
|
153
|
+
if (!await stat(join(dir, "package.json")).catch(() => null)) return null;
|
|
154
|
+
const version = safeParseJSON(await readFile(join(dir, "package.json"), "utf-8"))?.version;
|
|
155
|
+
if (!version) return null;
|
|
156
|
+
const installedAt = (await readInstallationMetadata(dir))?.installedAt;
|
|
157
|
+
if (!installedAt) return null;
|
|
158
|
+
return {
|
|
159
|
+
version,
|
|
160
|
+
expired: Date.now() - installedAt > cacheTimeMs
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async function installApp({ dir, packageName, beta, version }) {
|
|
164
|
+
return await new Listr([
|
|
165
|
+
{
|
|
166
|
+
title: `Fetching ${packageName} metadata`,
|
|
167
|
+
task: async (ctx, task) => {
|
|
168
|
+
if (beta) task.title = `Fetching ${packageName} metadata (using beta version)`;
|
|
169
|
+
const info = await getNpmTgzInfo(packageName, {
|
|
170
|
+
beta,
|
|
171
|
+
version
|
|
172
|
+
});
|
|
173
|
+
Object.assign(ctx, info);
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
title: `Downloading ${packageName}`,
|
|
178
|
+
task: async (ctx, task) => {
|
|
179
|
+
task.title = `Downloading ${packageName} (v${ctx.version})`;
|
|
180
|
+
await mkdir(dir, { recursive: true });
|
|
181
|
+
await downloadAndExtract(ctx.url, dir, { strip: 1 });
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
title: "Installing dependencies",
|
|
186
|
+
task: async (_, task) => {
|
|
187
|
+
await installDependencies(dir, { log: (log) => {
|
|
188
|
+
const last = log.split("\n").findLast((i) => !!i);
|
|
189
|
+
if (last) task.output = last;
|
|
190
|
+
} });
|
|
191
|
+
await writeInstallationMetadata(dir, { installedAt: Date.now() });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
], { rendererOptions: {
|
|
195
|
+
collapseSubtasks: false,
|
|
196
|
+
showErrorMessage: false,
|
|
197
|
+
timer: PRESET_TIMER
|
|
198
|
+
} }).run();
|
|
199
|
+
}
|
|
200
|
+
async function installDependencies(dir, { log } = {}) {
|
|
201
|
+
await new Promise((resolve$1, reject) => {
|
|
202
|
+
const child = spawn("npm", [
|
|
203
|
+
"install",
|
|
204
|
+
"--omit",
|
|
205
|
+
"dev",
|
|
206
|
+
"--verbose",
|
|
207
|
+
"--legacy-peer-deps"
|
|
208
|
+
], {
|
|
209
|
+
cwd: dir,
|
|
210
|
+
stdio: "pipe",
|
|
211
|
+
shell: process.platform === "win32"
|
|
212
|
+
});
|
|
213
|
+
child.stdout.on("data", (data) => {
|
|
214
|
+
log?.(data.toString());
|
|
215
|
+
});
|
|
216
|
+
let stderr = "";
|
|
217
|
+
child.stderr.on("data", (data) => {
|
|
218
|
+
const str = data.toString();
|
|
219
|
+
log?.(str);
|
|
220
|
+
stderr += str;
|
|
221
|
+
});
|
|
222
|
+
child.on("error", (error) => reject(error));
|
|
223
|
+
child.on("exit", (code) => {
|
|
224
|
+
if (code === 0) resolve$1();
|
|
225
|
+
else {
|
|
226
|
+
console.error(stderr);
|
|
227
|
+
reject(/* @__PURE__ */ new Error(`npm install failed with code ${code}`));
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
function safeParseJSON(raw) {
|
|
233
|
+
try {
|
|
234
|
+
return JSON.parse(raw);
|
|
235
|
+
} catch {}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
//#endregion
|
|
239
|
+
export { NeedReinstallBetaError, NeedReinstallError, loadApplication, upgradeCommandModule };
|
|
240
|
+
//# sourceMappingURL=upgrade.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.mjs","names":[],"sources":["../../../src/commands/app/upgrade.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { LoadCredentialOptions } from \"@aigne/cli/utils/aigne-hub/type.js\";\nimport type { AIGNE, ChatModelInputOptions, ImageModelInputOptions } from \"@aigne/core\";\nimport { LoadJsAgentError } from \"@aigne/core/loader/error\";\nimport { fetch } from \"@aigne/core/utils/fetch\";\nimport { Listr, PRESET_TIMER } from \"@aigne/listr2\";\nimport { joinURL } from \"ufo\";\nimport type { CommandModule } from \"yargs\";\nimport { downloadAndExtract } from \"../../utils/download.js\";\nimport { loadAIGNE } from \"../../utils/load-aigne.js\";\nimport { withSpinner } from \"../../utils/spinner.js\";\n\nconst NPM_PACKAGE_CACHE_TIME_MS = 1000 * 60 * 60 * 24; // 1 day\n\n/**\n * Check if beta applications should be used based on environment variables\n */\nfunction shouldUseBetaApps(): boolean {\n const envVar = process.env.AIGNE_USE_BETA_APPS;\n return envVar === \"true\" || envVar === \"1\";\n}\n\nexport const upgradeCommandModule = ({\n packageName,\n dir,\n}: {\n packageName: string;\n dir: string;\n}): CommandModule<\n unknown,\n {\n beta?: boolean;\n targetVersion?: string;\n force?: boolean;\n }\n> => ({\n command: \"upgrade\",\n describe: `Upgrade ${packageName} to the latest version`,\n builder: (yargs) => {\n return yargs\n .option(\"beta\", {\n type: \"boolean\",\n describe: \"Use beta versions if available\",\n })\n .option(\"target-version\", {\n type: \"string\",\n describe: \"Specify a version to upgrade to (default is latest)\",\n alias: [\"to\", \"target\"],\n })\n .option(\"force\", {\n type: \"boolean\",\n describe: \"Force upgrade even if already at latest version\",\n default: false,\n });\n },\n handler: async ({ beta, targetVersion, force }) => {\n beta ??= shouldUseBetaApps();\n\n const npm = await withSpinner(\"\", async () => {\n if (force) await rm(dir, { force: true, recursive: true });\n return await getNpmTgzInfo(packageName, { beta, version: targetVersion });\n });\n\n const check = await checkInstallation(dir);\n\n if (force || !check || npm.version !== check.version) {\n await installApp({ packageName, dir, beta, version: targetVersion });\n }\n\n const app = await loadApplication({ dir, packageName, install: true, skipModelLoading: true });\n\n if (force || check?.version !== app.version) {\n console.log(`\\n✅ Upgraded ${packageName} to version ${app.version}`);\n } else {\n console.log(`\\n✅ ${packageName} is already at the latest version (${app.version})`);\n }\n },\n});\n\ninterface LoadApplicationOptions {\n packageName: string;\n dir: string;\n install?: boolean;\n skipModelLoading?: boolean;\n modelOptions?: ChatModelInputOptions & LoadCredentialOptions;\n imageModelOptions?: ImageModelInputOptions & LoadCredentialOptions;\n beta?: boolean;\n}\n\ninterface LoadApplicationResult {\n aigne: AIGNE;\n version: string;\n isCache?: boolean;\n}\n\nexport class NeedReinstallError extends Error {\n static code = 244;\n}\n\nexport class NeedReinstallBetaError extends Error {\n static code = 245;\n}\n\nexport async function loadApplication(\n options: LoadApplicationOptions & { install: true },\n): Promise<LoadApplicationResult>;\nexport async function loadApplication(\n options: LoadApplicationOptions & { install?: false },\n): Promise<LoadApplicationResult | null>;\nexport async function loadApplication(\n options: LoadApplicationOptions,\n): Promise<LoadApplicationResult | null> {\n const { dir, packageName } = options;\n\n const check = await checkInstallation(dir);\n\n const beta = options.beta ?? check?.version?.includes(\"beta\");\n\n if (check) {\n let needUpdate = check.expired;\n\n if (check.expired) {\n await withSpinner(\"Checking updates...\", async () => {\n const tgz = await getNpmTgzInfo(packageName, { beta });\n if (tgz.version === check.version) {\n await writeInstallationMetadata(dir, { installedAt: Date.now() });\n needUpdate = false;\n }\n });\n }\n\n if (!needUpdate) {\n const aigne = await loadAIGNE({\n ...options,\n path: dir,\n metadata: {\n appName: packageName,\n appVersion: check?.version,\n },\n }).catch(async (error) => {\n if (error instanceof LoadJsAgentError) {\n await withSpinner(\"\", async () => {\n await rm(options.dir, { recursive: true, force: true });\n await mkdir(options.dir, { recursive: true });\n });\n\n const message = `⚠️ Failed to load ${packageName}, trying to reinstall: ${error.message}`;\n\n throw beta ? new NeedReinstallBetaError(message) : new NeedReinstallError(message);\n }\n\n throw error;\n });\n\n if (aigne) {\n return { aigne, version: check.version, isCache: true };\n }\n }\n }\n\n if (!options.install) return null;\n\n const result = await installApp({ dir, packageName, beta });\n\n return {\n aigne: await loadAIGNE({\n ...options,\n path: dir,\n metadata: {\n appName: packageName,\n appVersion: result.version,\n },\n }),\n version: result.version,\n };\n}\n\nexport async function getNpmTgzInfo(\n name: string,\n { version, beta }: { version?: string; beta?: boolean } = {},\n): Promise<{ version: string; url: string }> {\n const res = await fetch(joinURL(\"https://registry.npmjs.org\", name));\n const data = await res.json();\n\n let targetVersion: string;\n\n if (version) {\n if (!data.versions[version]) {\n throw new Error(`Version ${version} of package ${name} not found`);\n }\n targetVersion = version;\n } else if (beta && data[\"dist-tags\"].beta) {\n // Use beta version if available and beta flag is set\n targetVersion = data[\"dist-tags\"].beta;\n } else {\n // Fall back to latest version\n targetVersion = data[\"dist-tags\"].latest;\n }\n\n const url = data.versions[targetVersion].dist.tarball;\n\n return {\n version: targetVersion,\n url,\n };\n}\n\ninterface InstallationMetadata {\n installedAt?: number;\n}\n\nasync function readInstallationMetadata(dir: string): Promise<InstallationMetadata | undefined> {\n return safeParseJSON<InstallationMetadata>(\n await readFile(join(dir, \".aigne-cli.json\"), \"utf-8\").catch(() => \"{}\"),\n );\n}\n\nasync function writeInstallationMetadata(dir: string, metadata: InstallationMetadata) {\n await writeFile(join(dir, \".aigne-cli.json\"), JSON.stringify(metadata, null, 2));\n}\n\nasync function checkInstallation(\n dir: string,\n { cacheTimeMs = NPM_PACKAGE_CACHE_TIME_MS }: { cacheTimeMs?: number } = {},\n): Promise<{ version: string; expired: boolean } | null> {\n const s = await stat(join(dir, \"package.json\")).catch(() => null);\n\n if (!s) return null;\n\n const version = safeParseJSON<{ version: string }>(\n await readFile(join(dir, \"package.json\"), \"utf-8\"),\n )?.version;\n if (!version) return null;\n\n const installedAt = (await readInstallationMetadata(dir))?.installedAt;\n\n if (!installedAt) return null;\n\n const now = Date.now();\n const expired = now - installedAt > cacheTimeMs;\n\n return { version, expired };\n}\n\nexport async function installApp({\n dir,\n packageName,\n beta,\n version,\n}: {\n dir: string;\n packageName: string;\n beta?: boolean;\n version?: string;\n}) {\n return await new Listr<{ url: string; version: string }>(\n [\n {\n title: `Fetching ${packageName} metadata`,\n task: async (ctx, task) => {\n if (beta) {\n task.title = `Fetching ${packageName} metadata (using beta version)`;\n }\n\n const info = await getNpmTgzInfo(packageName, { beta, version });\n Object.assign(ctx, info);\n },\n },\n {\n title: `Downloading ${packageName}`,\n task: async (ctx, task) => {\n task.title = `Downloading ${packageName} (v${ctx.version})`;\n\n await mkdir(dir, { recursive: true });\n\n await downloadAndExtract(ctx.url, dir, { strip: 1 });\n },\n },\n {\n title: \"Installing dependencies\",\n task: async (_, task) => {\n await installDependencies(dir, {\n log: (log) => {\n const last = log.split(\"\\n\").findLast((i) => !!i);\n if (last) task.output = last;\n },\n });\n\n await writeInstallationMetadata(dir, { installedAt: Date.now() });\n },\n },\n ],\n {\n rendererOptions: {\n collapseSubtasks: false,\n showErrorMessage: false,\n timer: PRESET_TIMER,\n },\n },\n ).run();\n}\n\nasync function installDependencies(dir: string, { log }: { log?: (log: string) => void } = {}) {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"npm\", [\"install\", \"--omit\", \"dev\", \"--verbose\", \"--legacy-peer-deps\"], {\n cwd: dir,\n stdio: \"pipe\",\n shell: process.platform === \"win32\",\n });\n\n child.stdout.on(\"data\", (data) => {\n log?.(data.toString());\n });\n\n let stderr = \"\";\n child.stderr.on(\"data\", (data) => {\n const str = data.toString();\n log?.(str);\n stderr += str;\n });\n\n child.on(\"error\", (error) => reject(error));\n\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else {\n console.error(stderr);\n reject(new Error(`npm install failed with code ${code}`));\n }\n });\n });\n}\n\nfunction safeParseJSON<T>(raw: string): T | undefined {\n try {\n return JSON.parse(raw) as T;\n } catch {}\n}\n"],"mappings":"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"}
|