@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,332 @@
|
|
|
1
|
+
import { AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE } from "../constants.mjs";
|
|
2
|
+
import { terminalInput } from "../ui/utils/terminal-input.mjs";
|
|
3
|
+
import checkbox_default from "../utils/inquirer/checkbox.mjs";
|
|
4
|
+
import { AIGNEListr, AIGNEListrRenderer } from "../utils/listr.mjs";
|
|
5
|
+
import { highlightUrl } from "../utils/string-utils.mjs";
|
|
6
|
+
import { parseDuration } from "../utils/time.mjs";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { figures } from "@aigne/listr2";
|
|
9
|
+
import { withProtocol } from "ufo";
|
|
10
|
+
import { AIAgent, ChatModel, DEFAULT_OUTPUT_FILE_KEY, DEFAULT_OUTPUT_KEY, UserAgent, mergeContextUsage, newEmptyContextUsage } from "@aigne/core";
|
|
11
|
+
import { flat, omit } from "@aigne/core/utils/type-utils";
|
|
12
|
+
import { EOL } from "node:os";
|
|
13
|
+
import * as prompts from "@inquirer/prompts";
|
|
14
|
+
import { inspect } from "node:util";
|
|
15
|
+
import { promiseWithResolvers } from "@aigne/core/utils/promise";
|
|
16
|
+
import { markedTerminal } from "@aigne/marked-terminal";
|
|
17
|
+
import { Marked } from "marked";
|
|
18
|
+
import terminalImage from "terminal-image";
|
|
19
|
+
import terminalLink from "terminal-link";
|
|
20
|
+
|
|
21
|
+
//#region src/tracer/terminal.ts
|
|
22
|
+
const CREDITS_ERROR_PROCESSED_FLAG = "$credits_error_processed";
|
|
23
|
+
var TerminalTracer = class {
|
|
24
|
+
constructor(context, options = {}) {
|
|
25
|
+
this.context = context;
|
|
26
|
+
this.options = options;
|
|
27
|
+
}
|
|
28
|
+
tasks = {};
|
|
29
|
+
async run(agent, input$1, options) {
|
|
30
|
+
await this.context.observer?.serve();
|
|
31
|
+
const context = this.context.newContext({ reset: true });
|
|
32
|
+
const listr = new AIGNEListr({
|
|
33
|
+
formatRequest: (options$1) => this.formatRequest(agent, context, input$1, options$1),
|
|
34
|
+
formatResult: (result, options$1) => this.formatResult(agent, context, result, options$1)
|
|
35
|
+
}, [], {
|
|
36
|
+
concurrent: true,
|
|
37
|
+
exitOnError: false,
|
|
38
|
+
registerSignalListeners: false
|
|
39
|
+
});
|
|
40
|
+
this.listr = listr;
|
|
41
|
+
const collapsedMap = /* @__PURE__ */ new Map();
|
|
42
|
+
const hideContextIds = /* @__PURE__ */ new Set();
|
|
43
|
+
const onStart = async ({ context: context$1, agent: agent$1, ...event }) => {
|
|
44
|
+
const result = { options: { prompts: this.proxiedPrompts } };
|
|
45
|
+
if (agent$1 instanceof UserAgent) return result;
|
|
46
|
+
if (agent$1.taskRenderMode === "hide") {
|
|
47
|
+
hideContextIds.add(context$1.id);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
if (agent$1.taskRenderMode === "collapse") collapsedMap.set(context$1.id, {
|
|
51
|
+
ancestor: { contextId: context$1.id },
|
|
52
|
+
usage: newEmptyContextUsage(),
|
|
53
|
+
models: /* @__PURE__ */ new Set()
|
|
54
|
+
});
|
|
55
|
+
if (context$1.parentId) {
|
|
56
|
+
if (hideContextIds.has(context$1.parentId)) {
|
|
57
|
+
hideContextIds.add(context$1.id);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
const collapsed = collapsedMap.get(context$1.parentId);
|
|
61
|
+
if (collapsed) {
|
|
62
|
+
collapsedMap.set(context$1.id, collapsed);
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const contextId = context$1.id;
|
|
67
|
+
const parentContextId = context$1.parentId;
|
|
68
|
+
const task = {
|
|
69
|
+
...promiseWithResolvers(),
|
|
70
|
+
agent: agent$1,
|
|
71
|
+
input: event.input,
|
|
72
|
+
listr: promiseWithResolvers(),
|
|
73
|
+
startTime: Date.now()
|
|
74
|
+
};
|
|
75
|
+
this.tasks[contextId] = task;
|
|
76
|
+
const listrTask = {
|
|
77
|
+
title: await this.formatTaskTitle(agent$1, { ...event }),
|
|
78
|
+
task: (ctx, taskWrapper) => {
|
|
79
|
+
const subtask = taskWrapper.newListr([{ task: () => task.promise }]);
|
|
80
|
+
task.listr.resolve({
|
|
81
|
+
subtask,
|
|
82
|
+
taskWrapper,
|
|
83
|
+
ctx
|
|
84
|
+
});
|
|
85
|
+
return subtask;
|
|
86
|
+
},
|
|
87
|
+
rendererOptions: {
|
|
88
|
+
persistentOutput: true,
|
|
89
|
+
outputBar: Number.POSITIVE_INFINITY,
|
|
90
|
+
bottomBar: Number.POSITIVE_INFINITY
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const parentTask = parentContextId ? this.tasks[parentContextId] : void 0;
|
|
94
|
+
if (parentTask) parentTask.listr.promise.then(({ subtask }) => {
|
|
95
|
+
subtask.add(listrTask);
|
|
96
|
+
});
|
|
97
|
+
else listr.add(listrTask);
|
|
98
|
+
return result;
|
|
99
|
+
};
|
|
100
|
+
const onSuccess = async ({ context: context$1, agent: agent$1, output, ...event }) => {
|
|
101
|
+
const contextId = context$1.id;
|
|
102
|
+
const parentContextId = context$1.parentId;
|
|
103
|
+
const collapsed = collapsedMap.get(contextId);
|
|
104
|
+
if (collapsed) {
|
|
105
|
+
if (agent$1 instanceof ChatModel) {
|
|
106
|
+
const { usage, model } = output;
|
|
107
|
+
if (usage) mergeContextUsage(collapsed.usage, usage);
|
|
108
|
+
if (model) collapsed.models.add(model);
|
|
109
|
+
}
|
|
110
|
+
const task$1 = this.tasks[collapsed.ancestor.contextId];
|
|
111
|
+
if (task$1) {
|
|
112
|
+
task$1.usage = collapsed.usage;
|
|
113
|
+
task$1.extraTitleMetadata ??= {};
|
|
114
|
+
if (collapsed.models.size) task$1.extraTitleMetadata.model = [...collapsed.models].join(",");
|
|
115
|
+
const { taskWrapper: taskWrapper$1 } = await task$1.listr.promise;
|
|
116
|
+
taskWrapper$1.title = await this.formatTaskTitle(task$1.agent, {
|
|
117
|
+
input: task$1.input,
|
|
118
|
+
task: task$1,
|
|
119
|
+
usage: Boolean(task$1.usage.inputTokens || task$1.usage.outputTokens || task$1.usage.aigneHubCredits || task$1.usage.cacheCreationInputTokens || task$1.usage.cacheReadInputTokens),
|
|
120
|
+
time: context$1.id === collapsed.ancestor.contextId
|
|
121
|
+
});
|
|
122
|
+
if (context$1.id === collapsed.ancestor.contextId) task$1?.resolve();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const task = this.tasks[contextId];
|
|
127
|
+
if (!task) return;
|
|
128
|
+
task.endTime = Date.now();
|
|
129
|
+
const { taskWrapper, ctx } = await task.listr.promise;
|
|
130
|
+
if (agent$1 instanceof ChatModel) {
|
|
131
|
+
const { usage, model } = output;
|
|
132
|
+
task.usage = usage;
|
|
133
|
+
task.extraTitleMetadata ??= {};
|
|
134
|
+
if (model) task.extraTitleMetadata.model = model;
|
|
135
|
+
}
|
|
136
|
+
taskWrapper.title = await this.formatTaskTitle(agent$1, {
|
|
137
|
+
...event,
|
|
138
|
+
task,
|
|
139
|
+
usage: true,
|
|
140
|
+
time: true
|
|
141
|
+
});
|
|
142
|
+
if (!parentContextId || !this.tasks[parentContextId]) Object.assign(ctx, output);
|
|
143
|
+
task.resolve();
|
|
144
|
+
};
|
|
145
|
+
let retryPromptPromise;
|
|
146
|
+
const onError = async ({ context: context$1, agent: agent$1, error, ...event }) => {
|
|
147
|
+
if ("type" in error && error.type === AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE) {
|
|
148
|
+
if (!Object.hasOwn(error, CREDITS_ERROR_PROCESSED_FLAG)) {
|
|
149
|
+
Object.defineProperty(error, CREDITS_ERROR_PROCESSED_FLAG, {
|
|
150
|
+
value: true,
|
|
151
|
+
enumerable: false
|
|
152
|
+
});
|
|
153
|
+
const retry = await this.promptBuyCredits(error);
|
|
154
|
+
console.log("");
|
|
155
|
+
if (retry === "retry") return { retry: true };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (agent$1 instanceof ChatModel) {
|
|
159
|
+
retryPromptPromise ??= this.proxiedPrompts.select({
|
|
160
|
+
message: chalk.red(`Error: ${error.message}`),
|
|
161
|
+
choices: [{
|
|
162
|
+
value: "retry",
|
|
163
|
+
name: "Retry"
|
|
164
|
+
}, {
|
|
165
|
+
value: "exit",
|
|
166
|
+
name: "Exit"
|
|
167
|
+
}]
|
|
168
|
+
}).then((result) => ({ retry: result === "retry" })).finally(() => {
|
|
169
|
+
retryPromptPromise = void 0;
|
|
170
|
+
});
|
|
171
|
+
const { retry } = await retryPromptPromise;
|
|
172
|
+
if (retry) return { retry: true };
|
|
173
|
+
}
|
|
174
|
+
const contextId = context$1.id;
|
|
175
|
+
const task = this.tasks[contextId];
|
|
176
|
+
if (!task) return;
|
|
177
|
+
task.endTime = Date.now();
|
|
178
|
+
const { taskWrapper } = await task.listr.promise;
|
|
179
|
+
taskWrapper.title = await this.formatTaskTitle(agent$1, {
|
|
180
|
+
...event,
|
|
181
|
+
task,
|
|
182
|
+
usage: true,
|
|
183
|
+
time: true
|
|
184
|
+
});
|
|
185
|
+
task.reject(error);
|
|
186
|
+
};
|
|
187
|
+
return {
|
|
188
|
+
result: await listr.run(() => context.invoke(agent, input$1, {
|
|
189
|
+
...options,
|
|
190
|
+
hooks: flat({
|
|
191
|
+
priority: "high",
|
|
192
|
+
onStart,
|
|
193
|
+
onSuccess,
|
|
194
|
+
onError
|
|
195
|
+
}, options?.hooks),
|
|
196
|
+
streaming: true,
|
|
197
|
+
newContext: false
|
|
198
|
+
})),
|
|
199
|
+
context
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
listr;
|
|
203
|
+
proxiedPrompts = new Proxy({}, { get: (_target, prop) => {
|
|
204
|
+
const method = prop === "checkbox" ? checkbox_default : prop === "input" ? terminalInput : prompts[prop];
|
|
205
|
+
if (typeof method !== "function") throw new Error(`Unsupported prompt method ${String(prop)}`);
|
|
206
|
+
return async (config) => {
|
|
207
|
+
const renderer = this.listr?.["renderer"] instanceof AIGNEListrRenderer ? this.listr["renderer"] : void 0;
|
|
208
|
+
await renderer?.pause();
|
|
209
|
+
try {
|
|
210
|
+
return await method({ ...config });
|
|
211
|
+
} finally {
|
|
212
|
+
await renderer?.resume();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
} });
|
|
216
|
+
buyCreditsPromptPromise;
|
|
217
|
+
async promptBuyCredits(error) {
|
|
218
|
+
this.buyCreditsPromptPromise ??= (async () => {
|
|
219
|
+
return await this.proxiedPrompts.select({
|
|
220
|
+
message: highlightUrl(error.message),
|
|
221
|
+
choices: [{
|
|
222
|
+
name: "I have bought some credits, try again",
|
|
223
|
+
value: "retry"
|
|
224
|
+
}, {
|
|
225
|
+
name: "Exit",
|
|
226
|
+
value: "exit"
|
|
227
|
+
}]
|
|
228
|
+
});
|
|
229
|
+
})();
|
|
230
|
+
return this.buyCreditsPromptPromise.catch(() => "exit").finally(() => {
|
|
231
|
+
this.buyCreditsPromptPromise = void 0;
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
formatAigneHubCredits(credits, creditPrefix) {
|
|
235
|
+
const formattedCredits = credits % 1 !== 0 ? parseFloat(credits.toFixed(6)).toString() : credits.toFixed();
|
|
236
|
+
if (creditPrefix) return [chalk.grey("cost:"), chalk.blue(`${creditPrefix}${formattedCredits}`)];
|
|
237
|
+
return [chalk.blue(formattedCredits), chalk.grey("AIGNE Hub credits")];
|
|
238
|
+
}
|
|
239
|
+
formatTokenUsage(usage, extra) {
|
|
240
|
+
const content = [
|
|
241
|
+
[chalk.yellow(usage.inputTokens), chalk.grey("input tokens")],
|
|
242
|
+
usage.cacheReadInputTokens ? [chalk.green(usage.cacheReadInputTokens), chalk.grey("cached")] : void 0,
|
|
243
|
+
usage.cacheCreationInputTokens ? [chalk.yellow(usage.cacheCreationInputTokens), chalk.grey("cache write")] : void 0,
|
|
244
|
+
[chalk.cyan(usage.outputTokens), chalk.grey("output tokens")],
|
|
245
|
+
usage.aigneHubCredits ? this.formatAigneHubCredits(usage.aigneHubCredits, usage.creditPrefix) : void 0,
|
|
246
|
+
usage.agentCalls ? [chalk.magenta(usage.agentCalls), chalk.grey("agent calls")] : void 0
|
|
247
|
+
].filter((i) => !!i).map((i) => i.join(" "));
|
|
248
|
+
if (extra) content.unshift(...Object.entries(extra).filter(([k, v]) => k && v).map(([k, v]) => `${chalk.grey(k)}: ${v}`));
|
|
249
|
+
return `${chalk.grey("(")}${content.join(chalk.green(", "))}${chalk.grey(")")}`;
|
|
250
|
+
}
|
|
251
|
+
formatTimeUsage(startTime, endTime) {
|
|
252
|
+
const duration = endTime - startTime;
|
|
253
|
+
return chalk.grey(`[${parseDuration(duration)}]`);
|
|
254
|
+
}
|
|
255
|
+
async formatTaskTitle(agent, { task, usage, time, input: input$1 }) {
|
|
256
|
+
let title = agent.name;
|
|
257
|
+
if (agent.taskTitle) title += ` ${chalk.cyan(await agent.renderTaskTitle(input$1))}`;
|
|
258
|
+
if (usage && task?.usage) title += ` ${this.formatTokenUsage(task.usage, task.extraTitleMetadata)}`;
|
|
259
|
+
if (time && task?.startTime && task.endTime) title += ` ${this.formatTimeUsage(task.startTime, task.endTime)}`;
|
|
260
|
+
return title;
|
|
261
|
+
}
|
|
262
|
+
marked = new Marked().use({ walkTokens: (token) => {
|
|
263
|
+
if (token.type === "code") {
|
|
264
|
+
if (typeof token.lang === "string") token.lang = token.lang.trim().split(/\s+/)[0];
|
|
265
|
+
}
|
|
266
|
+
} }, markedTerminal({ forceHyperLink: false }, { theme: { string: chalk.green } }));
|
|
267
|
+
get outputKey() {
|
|
268
|
+
return this.options.outputKey || DEFAULT_OUTPUT_KEY;
|
|
269
|
+
}
|
|
270
|
+
get outputFileKey() {
|
|
271
|
+
return this.options.outputFileKey || DEFAULT_OUTPUT_FILE_KEY;
|
|
272
|
+
}
|
|
273
|
+
formatRequest(agent, _context, m = {}, { running = false } = {}) {
|
|
274
|
+
const prefix = `${chalk.grey(figures.pointer)} 💬 `;
|
|
275
|
+
const inputKey = agent instanceof AIAgent ? agent.inputKey : void 0;
|
|
276
|
+
const msg = inputKey ? m[inputKey] : void 0;
|
|
277
|
+
const message = inputKey ? omit(m, inputKey) : m;
|
|
278
|
+
const r = [msg && typeof msg === "string" ? this.marked.parse(msg, { async: false }).trim() : void 0, Object.keys(message).length > 0 ? inspect(message, {
|
|
279
|
+
colors: true,
|
|
280
|
+
...running ? this.runningInspectOptions : void 0
|
|
281
|
+
}) : void 0].filter(Boolean).join(EOL).trim();
|
|
282
|
+
if (!r) return void 0;
|
|
283
|
+
return `${prefix}${r}`;
|
|
284
|
+
}
|
|
285
|
+
formatResult(agent, context, m = {}, { running = false, renderImage = false } = {}) {
|
|
286
|
+
const { isTTY } = process.stdout;
|
|
287
|
+
const outputKey = this.outputKey || (agent instanceof AIAgent ? agent.outputKey : void 0);
|
|
288
|
+
const prefix = `${chalk.grey(figures.tick)} 🤖 ${this.formatTokenUsage(context.usage)}`;
|
|
289
|
+
const msg = outputKey ? m[outputKey] : void 0;
|
|
290
|
+
const message = outputKey ? omit(m, outputKey, this.outputFileKey) : m;
|
|
291
|
+
const text = msg && typeof msg === "string" ? isTTY ? this.marked.parse(msg, { async: false }).trim() : msg : void 0;
|
|
292
|
+
const json = Object.keys(message).length > 0 ? inspect(message, {
|
|
293
|
+
colors: isTTY,
|
|
294
|
+
...running ? this.runningInspectOptions : void 0
|
|
295
|
+
}) : void 0;
|
|
296
|
+
if (renderImage) return this.formatResultData(m).then((images) => {
|
|
297
|
+
return [
|
|
298
|
+
prefix,
|
|
299
|
+
text,
|
|
300
|
+
images,
|
|
301
|
+
json
|
|
302
|
+
].filter(Boolean).join(EOL.repeat(2));
|
|
303
|
+
});
|
|
304
|
+
return [
|
|
305
|
+
prefix,
|
|
306
|
+
text,
|
|
307
|
+
json
|
|
308
|
+
].filter(Boolean).join(EOL.repeat(2));
|
|
309
|
+
}
|
|
310
|
+
async formatResultData(output) {
|
|
311
|
+
const files = output[this.outputFileKey];
|
|
312
|
+
if (!Array.isArray(files)) return;
|
|
313
|
+
const options = { height: 30 };
|
|
314
|
+
return (await Promise.all(files.map(async (item) => {
|
|
315
|
+
const image = item.type === "local" ? await terminalImage.file(item.path, options) : item.type === "file" ? await terminalImage.buffer(Buffer.from(item.data, "base64"), options) : void 0;
|
|
316
|
+
const link = item.type === "local" ? withProtocol(item.path, "file://") : item.type === "url" ? item.url : void 0;
|
|
317
|
+
return [image, [
|
|
318
|
+
link ? chalk.cyan(terminalLink(link, link)) : void 0,
|
|
319
|
+
item.filename,
|
|
320
|
+
item.mimeType ? chalk.gray(item.mimeType) : void 0
|
|
321
|
+
].filter(Boolean).join(" ")].filter(Boolean).join(EOL);
|
|
322
|
+
}))).filter(Boolean).join(EOL);
|
|
323
|
+
}
|
|
324
|
+
runningInspectOptions = {
|
|
325
|
+
maxArrayLength: 3,
|
|
326
|
+
maxStringLength: 200
|
|
327
|
+
};
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
//#endregion
|
|
331
|
+
export { TerminalTracer };
|
|
332
|
+
//# sourceMappingURL=terminal.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.mjs","names":["input","options","agent","context","task","checkbox"],"sources":["../../src/tracer/terminal.ts"],"sourcesContent":["import { EOL } from \"node:os\";\nimport { type InspectOptions, inspect } from \"node:util\";\nimport {\n type Agent,\n type AgentHooks,\n AIAgent,\n ChatModel,\n type ChatModelOutput,\n type Context,\n type ContextUsage,\n DEFAULT_OUTPUT_FILE_KEY,\n DEFAULT_OUTPUT_KEY,\n type FileUnionContent,\n type InvokeOptions,\n type Message,\n mergeContextUsage,\n newEmptyContextUsage,\n UserAgent,\n} from \"@aigne/core\";\nimport { promiseWithResolvers } from \"@aigne/core/utils/promise\";\nimport { flat, omit } from \"@aigne/core/utils/type-utils\";\nimport { figures, type Listr } from \"@aigne/listr2\";\nimport { markedTerminal } from \"@aigne/marked-terminal\";\nimport * as prompts from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { Marked } from \"marked\";\nimport terminalImage from \"terminal-image\";\nimport terminalLink from \"terminal-link\";\nimport { withProtocol } from \"ufo\";\nimport { AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE } from \"../constants.js\";\nimport { terminalInput } from \"../ui/utils/terminal-input.js\";\nimport checkbox from \"../utils/inquirer/checkbox.js\";\nimport { AIGNEListr, AIGNEListrRenderer, type AIGNEListrTaskWrapper } from \"../utils/listr.js\";\nimport { highlightUrl } from \"../utils/string-utils.js\";\nimport { parseDuration } from \"../utils/time.js\";\n\nconst CREDITS_ERROR_PROCESSED_FLAG = \"$credits_error_processed\";\n\nexport interface TerminalTracerOptions {\n outputKey?: string;\n outputFileKey?: string;\n}\n\nexport class TerminalTracer {\n constructor(\n public readonly context: Context,\n public readonly options: TerminalTracerOptions = {},\n ) {}\n\n private tasks: { [callId: string]: Task } = {};\n\n async run(agent: Agent, input: Message, options?: InvokeOptions) {\n await this.context.observer?.serve();\n\n const context = this.context.newContext({ reset: true });\n\n const listr = new AIGNEListr(\n {\n formatRequest: (options?: { running?: boolean }) =>\n this.formatRequest(agent, context, input, options),\n formatResult: (result, options?: { running?: boolean; renderImage?: boolean }) =>\n this.formatResult(agent, context, result, options),\n },\n [],\n { concurrent: true, exitOnError: false, registerSignalListeners: false },\n );\n this.listr = listr;\n\n const collapsedMap = new Map<\n string,\n { ancestor: { contextId: string }; usage: ContextUsage; models: Set<string> }\n >();\n const hideContextIds = new Set<string>();\n\n const onStart: AgentHooks[\"onStart\"] = async ({ context, agent, ...event }) => {\n const result = { options: { prompts: this.proxiedPrompts } };\n\n if (agent instanceof UserAgent) return result;\n\n if (agent.taskRenderMode === \"hide\") {\n hideContextIds.add(context.id);\n return result;\n }\n\n if (agent.taskRenderMode === \"collapse\") {\n collapsedMap.set(context.id, {\n ancestor: { contextId: context.id },\n usage: newEmptyContextUsage(),\n models: new Set(),\n });\n }\n\n if (context.parentId) {\n if (hideContextIds.has(context.parentId)) {\n hideContextIds.add(context.id);\n return result;\n }\n\n const collapsed = collapsedMap.get(context.parentId);\n if (collapsed) {\n collapsedMap.set(context.id, collapsed);\n return result;\n }\n }\n\n const contextId = context.id;\n const parentContextId = context.parentId;\n\n const task: Task = {\n ...promiseWithResolvers(),\n agent,\n input: event.input,\n listr: promiseWithResolvers(),\n startTime: Date.now(),\n };\n this.tasks[contextId] = task;\n\n const listrTask: Parameters<typeof listr.add>[0] = {\n title: await this.formatTaskTitle(agent, { ...event }),\n task: (ctx, taskWrapper) => {\n const subtask = taskWrapper.newListr([{ task: () => task.promise }]);\n task.listr.resolve({ subtask, taskWrapper, ctx });\n return subtask;\n },\n rendererOptions: {\n persistentOutput: true,\n outputBar: Number.POSITIVE_INFINITY,\n bottomBar: Number.POSITIVE_INFINITY,\n },\n };\n\n const parentTask = parentContextId ? this.tasks[parentContextId] : undefined;\n if (parentTask) {\n parentTask.listr.promise.then(({ subtask }) => {\n subtask.add(listrTask);\n });\n } else {\n listr.add(listrTask);\n }\n\n return result;\n };\n\n const onSuccess: AgentHooks[\"onSuccess\"] = async ({ context, agent, output, ...event }) => {\n const contextId = context.id;\n const parentContextId = context.parentId;\n\n const collapsed = collapsedMap.get(contextId);\n if (collapsed) {\n if (agent instanceof ChatModel) {\n const { usage, model } = output as ChatModelOutput;\n if (usage) mergeContextUsage(collapsed.usage, usage);\n if (model) collapsed.models.add(model);\n }\n\n const task = this.tasks[collapsed.ancestor.contextId];\n if (task) {\n task.usage = collapsed.usage;\n task.extraTitleMetadata ??= {};\n if (collapsed.models.size)\n task.extraTitleMetadata.model = [...collapsed.models].join(\",\");\n\n const { taskWrapper } = await task.listr.promise;\n\n taskWrapper.title = await this.formatTaskTitle(task.agent, {\n input: task.input,\n task,\n usage: Boolean(\n task.usage.inputTokens ||\n task.usage.outputTokens ||\n task.usage.aigneHubCredits ||\n task.usage.cacheCreationInputTokens ||\n task.usage.cacheReadInputTokens,\n ),\n time: context.id === collapsed.ancestor.contextId,\n });\n\n if (context.id === collapsed.ancestor.contextId) {\n task?.resolve();\n }\n return;\n }\n }\n\n const task = this.tasks[contextId];\n if (!task) return;\n\n task.endTime = Date.now();\n\n const { taskWrapper, ctx } = await task.listr.promise;\n\n if (agent instanceof ChatModel) {\n const { usage, model } = output as ChatModelOutput;\n task.usage = usage;\n task.extraTitleMetadata ??= {};\n if (model) task.extraTitleMetadata.model = model;\n }\n\n taskWrapper.title = await this.formatTaskTitle(agent, {\n ...event,\n task,\n usage: true,\n time: true,\n });\n\n if (!parentContextId || !this.tasks[parentContextId]) {\n Object.assign(ctx, output);\n }\n\n task.resolve();\n };\n\n let retryPromptPromise: Promise<{ retry?: boolean }> | undefined;\n\n const onError: AgentHooks[\"onError\"] = async ({ context, agent, error, ...event }) => {\n if (\"type\" in error && error.type === AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE) {\n if (!Object.hasOwn(error, CREDITS_ERROR_PROCESSED_FLAG)) {\n Object.defineProperty(error, CREDITS_ERROR_PROCESSED_FLAG, {\n value: true,\n enumerable: false,\n });\n\n const retry = await this.promptBuyCredits(error);\n\n console.log(\"\");\n\n if (retry === \"retry\") {\n return { retry: true };\n }\n }\n }\n\n if (agent instanceof ChatModel) {\n retryPromptPromise ??= this.proxiedPrompts\n .select({\n message: chalk.red(`Error: ${error.message}`),\n choices: [\n { value: \"retry\", name: \"Retry\" },\n { value: \"exit\", name: \"Exit\" },\n ],\n })\n .then((result) => ({ retry: result === \"retry\" }))\n .finally(() => {\n retryPromptPromise = undefined;\n });\n\n const { retry } = await retryPromptPromise;\n if (retry) return { retry: true };\n }\n\n const contextId = context.id;\n\n const task = this.tasks[contextId];\n if (!task) return;\n\n task.endTime = Date.now();\n\n const { taskWrapper } = await task.listr.promise;\n taskWrapper.title = await this.formatTaskTitle(agent, {\n ...event,\n task,\n usage: true,\n time: true,\n });\n\n task.reject(error);\n };\n\n const result = await listr.run(() =>\n context.invoke(agent, input, {\n ...options,\n hooks: flat(\n {\n priority: \"high\",\n onStart,\n onSuccess,\n onError,\n },\n options?.hooks,\n ),\n streaming: true,\n newContext: false,\n }),\n );\n\n return { result, context };\n }\n\n private listr?: AIGNEListr;\n\n private proxiedPrompts = new Proxy(\n {},\n {\n get: (_target, prop) => {\n const method =\n prop === \"checkbox\"\n ? checkbox\n : prop === \"input\"\n ? terminalInput\n : // biome-ignore lint/performance/noDynamicNamespaceImportAccess: we need to access prompts dynamically\n (prompts[prop as keyof typeof prompts] as (...args: any[]) => any);\n if (typeof method !== \"function\")\n throw new Error(`Unsupported prompt method ${String(prop)}`);\n\n return async (config: any) => {\n const renderer =\n this.listr?.[\"renderer\"] instanceof AIGNEListrRenderer\n ? this.listr[\"renderer\"]\n : undefined;\n await renderer?.pause();\n\n try {\n return await method({ ...config });\n } finally {\n await renderer?.resume();\n }\n };\n },\n },\n ) as typeof prompts;\n\n private buyCreditsPromptPromise: Promise<\"retry\" | \"exit\"> | undefined;\n\n private async promptBuyCredits(error: Error) {\n // Avoid multiple agents asking for credits, we will only show the prompt once\n this.buyCreditsPromptPromise ??= (async () => {\n const retry = await this.proxiedPrompts.select({\n message: highlightUrl(error.message),\n choices: [\n {\n name: \"I have bought some credits, try again\",\n value: \"retry\" as const,\n },\n {\n name: \"Exit\",\n value: \"exit\" as const,\n },\n ],\n });\n\n return retry;\n })();\n\n return this.buyCreditsPromptPromise\n .catch(() => \"exit\")\n .finally(() => {\n // Clear the promise so that we can show the prompt again if needed\n this.buyCreditsPromptPromise = undefined;\n });\n }\n\n formatAigneHubCredits(credits: number, creditPrefix?: string): [string, string] {\n const hasDecimal = credits % 1 !== 0;\n const formattedCredits = hasDecimal\n ? parseFloat(credits.toFixed(6)).toString()\n : credits.toFixed();\n\n if (creditPrefix) {\n return [chalk.grey(\"cost:\"), chalk.blue(`${creditPrefix}${formattedCredits}`)];\n }\n\n return [chalk.blue(formattedCredits), chalk.grey(\"AIGNE Hub credits\")];\n }\n\n formatTokenUsage(usage: Partial<ContextUsage>, extra?: { [key: string]: string }) {\n const items = [\n [chalk.yellow(usage.inputTokens), chalk.grey(\"input tokens\")],\n usage.cacheReadInputTokens\n ? [chalk.green(usage.cacheReadInputTokens), chalk.grey(\"cached\")]\n : undefined,\n usage.cacheCreationInputTokens\n ? [chalk.yellow(usage.cacheCreationInputTokens), chalk.grey(\"cache write\")]\n : undefined,\n [chalk.cyan(usage.outputTokens), chalk.grey(\"output tokens\")],\n usage.aigneHubCredits\n ? this.formatAigneHubCredits(usage.aigneHubCredits, usage.creditPrefix)\n : undefined,\n usage.agentCalls ? [chalk.magenta(usage.agentCalls), chalk.grey(\"agent calls\")] : undefined,\n ];\n\n const content = items.filter((i) => !!i).map((i) => i.join(\" \"));\n\n if (extra) {\n content.unshift(\n ...Object.entries(extra)\n .filter(([k, v]) => k && v)\n .map(([k, v]) => `${chalk.grey(k)}: ${v}`),\n );\n }\n\n return `${chalk.grey(\"(\")}${content.join(chalk.green(\", \"))}${chalk.grey(\")\")}`;\n }\n\n formatTimeUsage(startTime: number, endTime: number) {\n const duration = endTime - startTime;\n return chalk.grey(`[${parseDuration(duration)}]`);\n }\n\n async formatTaskTitle(\n agent: Agent,\n { task, usage, time, input }: { task?: Task; usage?: boolean; time?: boolean; input: Message },\n ) {\n let title = agent.name;\n\n if (agent.taskTitle) {\n title += ` ${chalk.cyan(await agent.renderTaskTitle(input))}`;\n }\n\n if (usage && task?.usage)\n title += ` ${this.formatTokenUsage(task.usage, task.extraTitleMetadata)}`;\n if (time && task?.startTime && task.endTime)\n title += ` ${this.formatTimeUsage(task.startTime, task.endTime)}`;\n\n return title;\n }\n\n private marked = new Marked().use(\n {\n // marked-terminal does not support code block meta, so we need to strip it\n walkTokens: (token) => {\n if (token.type === \"code\") {\n if (typeof token.lang === \"string\") {\n token.lang = token.lang.trim().split(/\\s+/)[0];\n }\n }\n },\n },\n markedTerminal(\n { forceHyperLink: false },\n {\n theme: {\n string: chalk.green,\n },\n },\n ),\n );\n\n get outputKey() {\n return this.options.outputKey || DEFAULT_OUTPUT_KEY;\n }\n\n get outputFileKey() {\n return this.options.outputFileKey || DEFAULT_OUTPUT_FILE_KEY;\n }\n\n formatRequest(agent: Agent, _context: Context, m: Message = {}, { running = false } = {}) {\n const prefix = `${chalk.grey(figures.pointer)} 💬 `;\n\n const inputKey = agent instanceof AIAgent ? agent.inputKey : undefined;\n\n const msg = inputKey ? m[inputKey] : undefined;\n const message = inputKey ? omit(m, inputKey) : m;\n\n const text =\n msg && typeof msg === \"string\" ? this.marked.parse(msg, { async: false }).trim() : undefined;\n\n const json =\n Object.keys(message).length > 0\n ? inspect(message, { colors: true, ...(running ? this.runningInspectOptions : undefined) })\n : undefined;\n\n const r = [text, json].filter(Boolean).join(EOL).trim();\n if (!r) return undefined;\n\n return `${prefix}${r}`;\n }\n\n formatResult(\n agent: Agent,\n context: Context,\n m: Message = {},\n { running = false, renderImage = false } = {},\n ): string | Promise<string> {\n const { isTTY } = process.stdout;\n const outputKey = this.outputKey || (agent instanceof AIAgent ? agent.outputKey : undefined);\n\n const prefix = `${chalk.grey(figures.tick)} 🤖 ${this.formatTokenUsage(context.usage)}`;\n\n const msg = outputKey ? m[outputKey] : undefined;\n const message = outputKey ? omit(m, outputKey, this.outputFileKey) : m;\n\n const text =\n msg && typeof msg === \"string\"\n ? isTTY\n ? this.marked.parse(msg, { async: false }).trim()\n : msg\n : undefined;\n\n const json =\n Object.keys(message).length > 0\n ? inspect(message, { colors: isTTY, ...(running ? this.runningInspectOptions : undefined) })\n : undefined;\n\n if (renderImage) {\n return this.formatResultData(m).then((images) => {\n return [prefix, text, images, json].filter(Boolean).join(EOL.repeat(2));\n });\n }\n\n return [prefix, text, json].filter(Boolean).join(EOL.repeat(2));\n }\n\n async formatResultData(output: Message): Promise<string | undefined> {\n const files = output[this.outputFileKey] as FileUnionContent[];\n if (!Array.isArray(files)) return;\n\n const options: Parameters<typeof terminalImage.file>[1] = {\n height: 30,\n };\n\n return (\n await Promise.all(\n files.map(async (item) => {\n const image =\n item.type === \"local\"\n ? await terminalImage.file(item.path, options)\n : item.type === \"file\"\n ? await terminalImage.buffer(Buffer.from(item.data, \"base64\"), options)\n : undefined;\n\n const link =\n item.type === \"local\"\n ? withProtocol(item.path, \"file://\")\n : item.type === \"url\"\n ? item.url\n : undefined;\n const text = [\n link ? chalk.cyan(terminalLink(link, link)) : undefined,\n item.filename,\n item.mimeType ? chalk.gray(item.mimeType) : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return [image, text].filter(Boolean).join(EOL);\n }),\n )\n )\n .filter(Boolean)\n .join(EOL);\n }\n\n protected runningInspectOptions: InspectOptions = {\n maxArrayLength: 3,\n maxStringLength: 200,\n };\n}\n\ntype Task = ReturnType<typeof promiseWithResolvers<void>> & {\n listr: ReturnType<\n typeof promiseWithResolvers<{\n ctx: object;\n subtask: Listr;\n taskWrapper: AIGNEListrTaskWrapper;\n }>\n >;\n agent: Agent;\n input: Message;\n startTime?: number;\n endTime?: number;\n usage?: Partial<ContextUsage>;\n extraTitleMetadata?: { [key: string]: string };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,+BAA+B;AAOrC,IAAa,iBAAb,MAA4B;CAC1B,YACE,AAAgB,SAChB,AAAgB,UAAiC,EAAE,EACnD;EAFgB;EACA;;CAGlB,AAAQ,QAAoC,EAAE;CAE9C,MAAM,IAAI,OAAc,SAAgB,SAAyB;AAC/D,QAAM,KAAK,QAAQ,UAAU,OAAO;EAEpC,MAAM,UAAU,KAAK,QAAQ,WAAW,EAAE,OAAO,MAAM,CAAC;EAExD,MAAM,QAAQ,IAAI,WAChB;GACE,gBAAgB,cACd,KAAK,cAAc,OAAO,SAASA,SAAOC,UAAQ;GACpD,eAAe,QAAQ,cACrB,KAAK,aAAa,OAAO,SAAS,QAAQA,UAAQ;GACrD,EACD,EAAE,EACF;GAAE,YAAY;GAAM,aAAa;GAAO,yBAAyB;GAAO,CACzE;AACD,OAAK,QAAQ;EAEb,MAAM,+BAAe,IAAI,KAGtB;EACH,MAAM,iCAAiB,IAAI,KAAa;EAExC,MAAM,UAAiC,OAAO,EAAE,oBAAS,gBAAO,GAAG,YAAY;GAC7E,MAAM,SAAS,EAAE,SAAS,EAAE,SAAS,KAAK,gBAAgB,EAAE;AAE5D,OAAIC,mBAAiB,UAAW,QAAO;AAEvC,OAAIA,QAAM,mBAAmB,QAAQ;AACnC,mBAAe,IAAIC,UAAQ,GAAG;AAC9B,WAAO;;AAGT,OAAID,QAAM,mBAAmB,WAC3B,cAAa,IAAIC,UAAQ,IAAI;IAC3B,UAAU,EAAE,WAAWA,UAAQ,IAAI;IACnC,OAAO,sBAAsB;IAC7B,wBAAQ,IAAI,KAAK;IAClB,CAAC;AAGJ,OAAIA,UAAQ,UAAU;AACpB,QAAI,eAAe,IAAIA,UAAQ,SAAS,EAAE;AACxC,oBAAe,IAAIA,UAAQ,GAAG;AAC9B,YAAO;;IAGT,MAAM,YAAY,aAAa,IAAIA,UAAQ,SAAS;AACpD,QAAI,WAAW;AACb,kBAAa,IAAIA,UAAQ,IAAI,UAAU;AACvC,YAAO;;;GAIX,MAAM,YAAYA,UAAQ;GAC1B,MAAM,kBAAkBA,UAAQ;GAEhC,MAAM,OAAa;IACjB,GAAG,sBAAsB;IACzB;IACA,OAAO,MAAM;IACb,OAAO,sBAAsB;IAC7B,WAAW,KAAK,KAAK;IACtB;AACD,QAAK,MAAM,aAAa;GAExB,MAAM,YAA6C;IACjD,OAAO,MAAM,KAAK,gBAAgBD,SAAO,EAAE,GAAG,OAAO,CAAC;IACtD,OAAO,KAAK,gBAAgB;KAC1B,MAAM,UAAU,YAAY,SAAS,CAAC,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC;AACpE,UAAK,MAAM,QAAQ;MAAE;MAAS;MAAa;MAAK,CAAC;AACjD,YAAO;;IAET,iBAAiB;KACf,kBAAkB;KAClB,WAAW,OAAO;KAClB,WAAW,OAAO;KACnB;IACF;GAED,MAAM,aAAa,kBAAkB,KAAK,MAAM,mBAAmB;AACnE,OAAI,WACF,YAAW,MAAM,QAAQ,MAAM,EAAE,cAAc;AAC7C,YAAQ,IAAI,UAAU;KACtB;OAEF,OAAM,IAAI,UAAU;AAGtB,UAAO;;EAGT,MAAM,YAAqC,OAAO,EAAE,oBAAS,gBAAO,QAAQ,GAAG,YAAY;GACzF,MAAM,YAAYC,UAAQ;GAC1B,MAAM,kBAAkBA,UAAQ;GAEhC,MAAM,YAAY,aAAa,IAAI,UAAU;AAC7C,OAAI,WAAW;AACb,QAAID,mBAAiB,WAAW;KAC9B,MAAM,EAAE,OAAO,UAAU;AACzB,SAAI,MAAO,mBAAkB,UAAU,OAAO,MAAM;AACpD,SAAI,MAAO,WAAU,OAAO,IAAI,MAAM;;IAGxC,MAAME,SAAO,KAAK,MAAM,UAAU,SAAS;AAC3C,QAAIA,QAAM;AACR,YAAK,QAAQ,UAAU;AACvB,YAAK,uBAAuB,EAAE;AAC9B,SAAI,UAAU,OAAO,KACnB,QAAK,mBAAmB,QAAQ,CAAC,GAAG,UAAU,OAAO,CAAC,KAAK,IAAI;KAEjE,MAAM,EAAE,+BAAgB,MAAMA,OAAK,MAAM;AAEzC,mBAAY,QAAQ,MAAM,KAAK,gBAAgBA,OAAK,OAAO;MACzD,OAAOA,OAAK;MACZ;MACA,OAAO,QACLA,OAAK,MAAM,eACTA,OAAK,MAAM,gBACXA,OAAK,MAAM,mBACXA,OAAK,MAAM,4BACXA,OAAK,MAAM,qBACd;MACD,MAAMD,UAAQ,OAAO,UAAU,SAAS;MACzC,CAAC;AAEF,SAAIA,UAAQ,OAAO,UAAU,SAAS,UACpC,SAAM,SAAS;AAEjB;;;GAIJ,MAAM,OAAO,KAAK,MAAM;AACxB,OAAI,CAAC,KAAM;AAEX,QAAK,UAAU,KAAK,KAAK;GAEzB,MAAM,EAAE,aAAa,QAAQ,MAAM,KAAK,MAAM;AAE9C,OAAID,mBAAiB,WAAW;IAC9B,MAAM,EAAE,OAAO,UAAU;AACzB,SAAK,QAAQ;AACb,SAAK,uBAAuB,EAAE;AAC9B,QAAI,MAAO,MAAK,mBAAmB,QAAQ;;AAG7C,eAAY,QAAQ,MAAM,KAAK,gBAAgBA,SAAO;IACpD,GAAG;IACH;IACA,OAAO;IACP,MAAM;IACP,CAAC;AAEF,OAAI,CAAC,mBAAmB,CAAC,KAAK,MAAM,iBAClC,QAAO,OAAO,KAAK,OAAO;AAG5B,QAAK,SAAS;;EAGhB,IAAI;EAEJ,MAAM,UAAiC,OAAO,EAAE,oBAAS,gBAAO,OAAO,GAAG,YAAY;AACpF,OAAI,UAAU,SAAS,MAAM,SAAS,yCACpC;QAAI,CAAC,OAAO,OAAO,OAAO,6BAA6B,EAAE;AACvD,YAAO,eAAe,OAAO,8BAA8B;MACzD,OAAO;MACP,YAAY;MACb,CAAC;KAEF,MAAM,QAAQ,MAAM,KAAK,iBAAiB,MAAM;AAEhD,aAAQ,IAAI,GAAG;AAEf,SAAI,UAAU,QACZ,QAAO,EAAE,OAAO,MAAM;;;AAK5B,OAAIA,mBAAiB,WAAW;AAC9B,2BAAuB,KAAK,eACzB,OAAO;KACN,SAAS,MAAM,IAAI,UAAU,MAAM,UAAU;KAC7C,SAAS,CACP;MAAE,OAAO;MAAS,MAAM;MAAS,EACjC;MAAE,OAAO;MAAQ,MAAM;MAAQ,CAChC;KACF,CAAC,CACD,MAAM,YAAY,EAAE,OAAO,WAAW,SAAS,EAAE,CACjD,cAAc;AACb,0BAAqB;MACrB;IAEJ,MAAM,EAAE,UAAU,MAAM;AACxB,QAAI,MAAO,QAAO,EAAE,OAAO,MAAM;;GAGnC,MAAM,YAAYC,UAAQ;GAE1B,MAAM,OAAO,KAAK,MAAM;AACxB,OAAI,CAAC,KAAM;AAEX,QAAK,UAAU,KAAK,KAAK;GAEzB,MAAM,EAAE,gBAAgB,MAAM,KAAK,MAAM;AACzC,eAAY,QAAQ,MAAM,KAAK,gBAAgBD,SAAO;IACpD,GAAG;IACH;IACA,OAAO;IACP,MAAM;IACP,CAAC;AAEF,QAAK,OAAO,MAAM;;AAoBpB,SAAO;GAAE,QAjBM,MAAM,MAAM,UACzB,QAAQ,OAAO,OAAOF,SAAO;IAC3B,GAAG;IACH,OAAO,KACL;KACE,UAAU;KACV;KACA;KACA;KACD,EACD,SAAS,MACV;IACD,WAAW;IACX,YAAY;IACb,CAAC,CACH;GAEgB;GAAS;;CAG5B,AAAQ;CAER,AAAQ,iBAAiB,IAAI,MAC3B,EAAE,EACF,EACE,MAAM,SAAS,SAAS;EACtB,MAAM,SACJ,SAAS,aACLK,mBACA,SAAS,UACP,gBAEC,QAAQ;AACjB,MAAI,OAAO,WAAW,WACpB,OAAM,IAAI,MAAM,6BAA6B,OAAO,KAAK,GAAG;AAE9D,SAAO,OAAO,WAAgB;GAC5B,MAAM,WACJ,KAAK,QAAQ,uBAAuB,qBAChC,KAAK,MAAM,cACX;AACN,SAAM,UAAU,OAAO;AAEvB,OAAI;AACF,WAAO,MAAM,OAAO,EAAE,GAAG,QAAQ,CAAC;aAC1B;AACR,UAAM,UAAU,QAAQ;;;IAI/B,CACF;CAED,AAAQ;CAER,MAAc,iBAAiB,OAAc;AAE3C,OAAK,6BAA6B,YAAY;AAe5C,UAdc,MAAM,KAAK,eAAe,OAAO;IAC7C,SAAS,aAAa,MAAM,QAAQ;IACpC,SAAS,CACP;KACE,MAAM;KACN,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACR,CACF;IACF,CAAC;MAGA;AAEJ,SAAO,KAAK,wBACT,YAAY,OAAO,CACnB,cAAc;AAEb,QAAK,0BAA0B;IAC/B;;CAGN,sBAAsB,SAAiB,cAAyC;EAE9E,MAAM,mBADa,UAAU,MAAM,IAE/B,WAAW,QAAQ,QAAQ,EAAE,CAAC,CAAC,UAAU,GACzC,QAAQ,SAAS;AAErB,MAAI,aACF,QAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,MAAM,KAAK,GAAG,eAAe,mBAAmB,CAAC;AAGhF,SAAO,CAAC,MAAM,KAAK,iBAAiB,EAAE,MAAM,KAAK,oBAAoB,CAAC;;CAGxE,iBAAiB,OAA8B,OAAmC;EAgBhF,MAAM,UAfQ;GACZ,CAAC,MAAM,OAAO,MAAM,YAAY,EAAE,MAAM,KAAK,eAAe,CAAC;GAC7D,MAAM,uBACF,CAAC,MAAM,MAAM,MAAM,qBAAqB,EAAE,MAAM,KAAK,SAAS,CAAC,GAC/D;GACJ,MAAM,2BACF,CAAC,MAAM,OAAO,MAAM,yBAAyB,EAAE,MAAM,KAAK,cAAc,CAAC,GACzE;GACJ,CAAC,MAAM,KAAK,MAAM,aAAa,EAAE,MAAM,KAAK,gBAAgB,CAAC;GAC7D,MAAM,kBACF,KAAK,sBAAsB,MAAM,iBAAiB,MAAM,aAAa,GACrE;GACJ,MAAM,aAAa,CAAC,MAAM,QAAQ,MAAM,WAAW,EAAE,MAAM,KAAK,cAAc,CAAC,GAAG;GACnF,CAEqB,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC;AAEhE,MAAI,MACF,SAAQ,QACN,GAAG,OAAO,QAAQ,MAAM,CACrB,QAAQ,CAAC,GAAG,OAAO,KAAK,EAAE,CAC1B,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,IAAI,IAAI,CAC7C;AAGH,SAAO,GAAG,MAAM,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM,MAAM,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI;;CAG/E,gBAAgB,WAAmB,SAAiB;EAClD,MAAM,WAAW,UAAU;AAC3B,SAAO,MAAM,KAAK,IAAI,cAAc,SAAS,CAAC,GAAG;;CAGnD,MAAM,gBACJ,OACA,EAAE,MAAM,OAAO,MAAM,kBACrB;EACA,IAAI,QAAQ,MAAM;AAElB,MAAI,MAAM,UACR,UAAS,IAAI,MAAM,KAAK,MAAM,MAAM,gBAAgBL,QAAM,CAAC;AAG7D,MAAI,SAAS,MAAM,MACjB,UAAS,IAAI,KAAK,iBAAiB,KAAK,OAAO,KAAK,mBAAmB;AACzE,MAAI,QAAQ,MAAM,aAAa,KAAK,QAClC,UAAS,IAAI,KAAK,gBAAgB,KAAK,WAAW,KAAK,QAAQ;AAEjE,SAAO;;CAGT,AAAQ,SAAS,IAAI,QAAQ,CAAC,IAC5B,EAEE,aAAa,UAAU;AACrB,MAAI,MAAM,SAAS,QACjB;OAAI,OAAO,MAAM,SAAS,SACxB,OAAM,OAAO,MAAM,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC;;IAInD,EACD,eACE,EAAE,gBAAgB,OAAO,EACzB,EACE,OAAO,EACL,QAAQ,MAAM,OACf,EACF,CACF,CACF;CAED,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ,aAAa;;CAGnC,IAAI,gBAAgB;AAClB,SAAO,KAAK,QAAQ,iBAAiB;;CAGvC,cAAc,OAAc,UAAmB,IAAa,EAAE,EAAE,EAAE,UAAU,UAAU,EAAE,EAAE;EACxF,MAAM,SAAS,GAAG,MAAM,KAAK,QAAQ,QAAQ,CAAC;EAE9C,MAAM,WAAW,iBAAiB,UAAU,MAAM,WAAW;EAE7D,MAAM,MAAM,WAAW,EAAE,YAAY;EACrC,MAAM,UAAU,WAAW,KAAK,GAAG,SAAS,GAAG;EAU/C,MAAM,IAAI,CAPR,OAAO,OAAO,QAAQ,WAAW,KAAK,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,CAAC,MAAM,GAAG,QAGnF,OAAO,KAAK,QAAQ,CAAC,SAAS,IAC1B,QAAQ,SAAS;GAAE,QAAQ;GAAM,GAAI,UAAU,KAAK,wBAAwB;GAAY,CAAC,GACzF,OAEgB,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM;AACvD,MAAI,CAAC,EAAG,QAAO;AAEf,SAAO,GAAG,SAAS;;CAGrB,aACE,OACA,SACA,IAAa,EAAE,EACf,EAAE,UAAU,OAAO,cAAc,UAAU,EAAE,EACnB;EAC1B,MAAM,EAAE,UAAU,QAAQ;EAC1B,MAAM,YAAY,KAAK,cAAc,iBAAiB,UAAU,MAAM,YAAY;EAElF,MAAM,SAAS,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,KAAK,iBAAiB,QAAQ,MAAM;EAErF,MAAM,MAAM,YAAY,EAAE,aAAa;EACvC,MAAM,UAAU,YAAY,KAAK,GAAG,WAAW,KAAK,cAAc,GAAG;EAErE,MAAM,OACJ,OAAO,OAAO,QAAQ,WAClB,QACE,KAAK,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,CAAC,MAAM,GAC/C,MACF;EAEN,MAAM,OACJ,OAAO,KAAK,QAAQ,CAAC,SAAS,IAC1B,QAAQ,SAAS;GAAE,QAAQ;GAAO,GAAI,UAAU,KAAK,wBAAwB;GAAY,CAAC,GAC1F;AAEN,MAAI,YACF,QAAO,KAAK,iBAAiB,EAAE,CAAC,MAAM,WAAW;AAC/C,UAAO;IAAC;IAAQ;IAAM;IAAQ;IAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;IACvE;AAGJ,SAAO;GAAC;GAAQ;GAAM;GAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;;CAGjE,MAAM,iBAAiB,QAA8C;EACnE,MAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,MAAM,QAAQ,MAAM,CAAE;EAE3B,MAAM,UAAoD,EACxD,QAAQ,IACT;AAED,UACE,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;GACxB,MAAM,QACJ,KAAK,SAAS,UACV,MAAM,cAAc,KAAK,KAAK,MAAM,QAAQ,GAC5C,KAAK,SAAS,SACZ,MAAM,cAAc,OAAO,OAAO,KAAK,KAAK,MAAM,SAAS,EAAE,QAAQ,GACrE;GAER,MAAM,OACJ,KAAK,SAAS,UACV,aAAa,KAAK,MAAM,UAAU,GAClC,KAAK,SAAS,QACZ,KAAK,MACL;AASR,UAAO,CAAC,OARK;IACX,OAAO,MAAM,KAAK,aAAa,MAAM,KAAK,CAAC,GAAG;IAC9C,KAAK;IACL,KAAK,WAAW,MAAM,KAAK,KAAK,SAAS,GAAG;IAC7C,CACE,OAAO,QAAQ,CACf,KAAK,IAAI,CAEQ,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;IAC9C,CACH,EAEA,OAAO,QAAQ,CACf,KAAK,IAAI;;CAGd,AAAU,wBAAwC;EAChD,gBAAgB;EAChB,iBAAiB;EAClB"}
|
package/dist/type.cjs
ADDED
|
File without changes
|
package/dist/type.d.cts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AgentInvokeOptions as AgentInvokeOptions$1, UserContext } from "@aigne/core";
|
|
2
|
+
import * as prompts from "@inquirer/prompts";
|
|
3
|
+
|
|
4
|
+
//#region src/type.d.ts
|
|
5
|
+
interface AgentInvokeOptions<U extends UserContext = UserContext> extends AgentInvokeOptions$1<U> {
|
|
6
|
+
prompts: typeof prompts;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { AgentInvokeOptions };
|
|
10
|
+
//# sourceMappingURL=type.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.cts","names":[],"sources":["../src/type.ts"],"mappings":";;;;UAGiB,kBAAA,WAA6B,WAAA,GAAc,WAAA,UAClD,oBAAA,CAAoB,CAAA;EAAA,OAAA,SACZ,OAAA;AAAA"}
|
package/dist/type.d.mts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AgentInvokeOptions as AgentInvokeOptions$1, UserContext } from "@aigne/core";
|
|
2
|
+
import * as prompts from "@inquirer/prompts";
|
|
3
|
+
|
|
4
|
+
//#region src/type.d.ts
|
|
5
|
+
interface AgentInvokeOptions<U extends UserContext = UserContext> extends AgentInvokeOptions$1<U> {
|
|
6
|
+
prompts: typeof prompts;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { AgentInvokeOptions };
|
|
10
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.mts","names":[],"sources":["../src/type.ts"],"mappings":";;;;UAGiB,kBAAA,WAA6B,WAAA,GAAc,WAAA,UAClD,oBAAA,CAAoB,CAAA;EAAA,OAAA,SACZ,OAAA;AAAA"}
|
package/dist/type.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_text_buffer = require('./text-buffer.cjs');
|
|
3
|
+
let chalk = require("chalk");
|
|
4
|
+
chalk = require_rolldown_runtime.__toESM(chalk);
|
|
5
|
+
let _inquirer_core = require("@inquirer/core");
|
|
6
|
+
let ink = require("ink");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
+
|
|
10
|
+
//#region src/ui/utils/terminal-input.tsx
|
|
11
|
+
async function terminalInput({ render: r = ink.render, ...options } = {}) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const handleSigInt = () => {
|
|
14
|
+
reject(/* @__PURE__ */ new Error("Input aborted"));
|
|
15
|
+
};
|
|
16
|
+
process.addListener("SIGINT", handleSigInt);
|
|
17
|
+
const clean = () => process.removeListener("SIGINT", handleSigInt);
|
|
18
|
+
const app = r(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TerminalInput, {
|
|
19
|
+
...options,
|
|
20
|
+
onSubmit: (value) => {
|
|
21
|
+
if (options.clear) app.clear();
|
|
22
|
+
app.unmount();
|
|
23
|
+
resolve(value);
|
|
24
|
+
clean();
|
|
25
|
+
},
|
|
26
|
+
onError: (error) => {
|
|
27
|
+
if (options.clear) app.clear();
|
|
28
|
+
app.unmount();
|
|
29
|
+
reject(error);
|
|
30
|
+
clean();
|
|
31
|
+
}
|
|
32
|
+
}), { exitOnCtrlC: false });
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function TerminalInput(props) {
|
|
36
|
+
const buffer = require_text_buffer.useTextBuffer({
|
|
37
|
+
initialText: props.default || "",
|
|
38
|
+
initialCursorOffset: props.default?.length || 0,
|
|
39
|
+
isValidPath: () => false,
|
|
40
|
+
viewport: {
|
|
41
|
+
width: 80,
|
|
42
|
+
height: 1
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
const textRef = (0, react.useRef)(buffer.text);
|
|
46
|
+
textRef.current = buffer.text;
|
|
47
|
+
const [status, setStatus] = (0, react.useState)("input");
|
|
48
|
+
const [errorMessage, setErrorMessage] = (0, react.useState)();
|
|
49
|
+
(0, ink.useInput)((character, key) => {
|
|
50
|
+
if (character === "c" && key.ctrl) {
|
|
51
|
+
setStatus("error");
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
props.onError(new _inquirer_core.ExitPromptError("Input aborted by user"));
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (key.return) {
|
|
58
|
+
const input = textRef.current || props.default || "";
|
|
59
|
+
setStatus("validating");
|
|
60
|
+
setErrorMessage(void 0);
|
|
61
|
+
const validateInput = async () => {
|
|
62
|
+
try {
|
|
63
|
+
if (props.required && !input.trim()) {
|
|
64
|
+
setErrorMessage("You must provide a value");
|
|
65
|
+
setStatus("input");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (props.validate) {
|
|
69
|
+
const result = await props.validate(input);
|
|
70
|
+
if (result !== true) {
|
|
71
|
+
setErrorMessage(typeof result === "string" ? result : "You must provide a valid value");
|
|
72
|
+
setStatus("input");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
setStatus("success");
|
|
77
|
+
setTimeout(() => {
|
|
78
|
+
props.onSubmit(input);
|
|
79
|
+
});
|
|
80
|
+
} catch (error) {
|
|
81
|
+
setErrorMessage(error instanceof Error ? error.message : "Validation error");
|
|
82
|
+
setStatus("input");
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
validateInput();
|
|
86
|
+
return;
|
|
87
|
+
} else if (key.backspace) buffer.backspace();
|
|
88
|
+
else if (key.delete) buffer.backspace();
|
|
89
|
+
else if (key.downArrow) buffer.move("down");
|
|
90
|
+
else if (key.upArrow) buffer.move("up");
|
|
91
|
+
else if (key.leftArrow) buffer.move("left");
|
|
92
|
+
else if (key.rightArrow) buffer.move("right");
|
|
93
|
+
else if (character === "a" && key.ctrl) buffer.move("home");
|
|
94
|
+
else if (character === "e" && key.ctrl) buffer.move("end");
|
|
95
|
+
else {
|
|
96
|
+
buffer.handleInput({
|
|
97
|
+
...key,
|
|
98
|
+
name: character,
|
|
99
|
+
sequence: character,
|
|
100
|
+
paste: false
|
|
101
|
+
});
|
|
102
|
+
setErrorMessage(void 0);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
const lines = [...buffer.lines];
|
|
106
|
+
if (status === "input") {
|
|
107
|
+
const [row, col] = buffer.cursor;
|
|
108
|
+
const currentLine = lines[row] || "";
|
|
109
|
+
lines[row] = currentLine.slice(0, col) + chalk.default.inverse(currentLine[col] || " ") + currentLine.slice(col + 1);
|
|
110
|
+
}
|
|
111
|
+
const label = props.message && chalk.default.bold(props.message);
|
|
112
|
+
const inline = props.inline !== false;
|
|
113
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Box, {
|
|
114
|
+
flexDirection: "column",
|
|
115
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Box, {
|
|
116
|
+
flexDirection: inline ? "row" : "column",
|
|
117
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Text, { children: [
|
|
118
|
+
PREFIX[status],
|
|
119
|
+
" ",
|
|
120
|
+
!inline && label
|
|
121
|
+
] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ink.Box, {
|
|
122
|
+
flexShrink: 1,
|
|
123
|
+
flexGrow: 1,
|
|
124
|
+
marginLeft: inline ? 0 : 2,
|
|
125
|
+
marginRight: 1,
|
|
126
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Text, { children: [!!label && inline && `${label} `, lines.join("\n")] })
|
|
127
|
+
})]
|
|
128
|
+
}), errorMessage && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ink.Box, {
|
|
129
|
+
marginLeft: 2,
|
|
130
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ink.Text, {
|
|
131
|
+
color: "red",
|
|
132
|
+
children: errorMessage
|
|
133
|
+
})
|
|
134
|
+
})]
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
const PREFIX = {
|
|
138
|
+
input: chalk.default.blue("?"),
|
|
139
|
+
validating: chalk.default.yellow("⋯"),
|
|
140
|
+
success: chalk.default.green("✔"),
|
|
141
|
+
error: chalk.default.red("✘")
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
//#endregion
|
|
145
|
+
exports.terminalInput = terminalInput;
|