@iinm/plain-agent 1.10.12 → 1.10.14
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 +3 -3
- package/config/config.predefined.json +20 -20
- package/package.json +1 -1
- package/sandbox/bin/plain-sandbox +2 -1
- package/src/cli/formatter.mjs +1 -1
- package/src/cli/interactive.mjs +2 -1
- package/src/providers/gemini.mjs +4 -4
- package/src/tools/execCommand.mjs +29 -7
- package/src/tools/tmuxCommand.mjs +1 -1
- package/src/tools/webFetch.mjs +1 -1
- package/src/tools/webSearch.mjs +1 -1
package/README.md
CHANGED
|
@@ -68,12 +68,12 @@ Create the configuration.
|
|
|
68
68
|
"webSearch": {
|
|
69
69
|
"provider": "gemini",
|
|
70
70
|
"apiKey": "<GEMINI_API_KEY>",
|
|
71
|
-
"model": "gemini-3-flash
|
|
71
|
+
"model": "gemini-3.5-flash"
|
|
72
72
|
|
|
73
73
|
// Or use Vertex AI (Requires gcloud CLI to get authentication token)
|
|
74
74
|
// "provider": "gemini-vertex-ai",
|
|
75
75
|
// "baseURL": "https://aiplatform.googleapis.com/v1beta1/projects/<project_id>/locations/<location>",
|
|
76
|
-
// "model": "gemini-3-flash
|
|
76
|
+
// "model": "gemini-3.5-flash"
|
|
77
77
|
|
|
78
78
|
// Or use a custom command
|
|
79
79
|
// "provider": "command",
|
|
@@ -84,7 +84,7 @@ Create the configuration.
|
|
|
84
84
|
"webFetch": {
|
|
85
85
|
"provider": "gemini",
|
|
86
86
|
"apiKey": "<GEMINI_API_KEY>",
|
|
87
|
-
"model": "gemini-3-flash
|
|
87
|
+
"model": "gemini-3.5-flash"
|
|
88
88
|
|
|
89
89
|
// Or use Vertex AI (Requires gcloud CLI to get authentication token)
|
|
90
90
|
|
|
@@ -475,7 +475,7 @@
|
|
|
475
475
|
},
|
|
476
476
|
|
|
477
477
|
{
|
|
478
|
-
"name": "gemini-3-flash
|
|
478
|
+
"name": "gemini-3.5-flash",
|
|
479
479
|
"variant": "thinking-medium",
|
|
480
480
|
"platform": {
|
|
481
481
|
"name": "gemini",
|
|
@@ -485,7 +485,7 @@
|
|
|
485
485
|
"model": {
|
|
486
486
|
"format": "gemini",
|
|
487
487
|
"config": {
|
|
488
|
-
"model": "gemini-3-flash
|
|
488
|
+
"model": "gemini-3.5-flash",
|
|
489
489
|
"config": {
|
|
490
490
|
"requestConfig": {
|
|
491
491
|
"generationConfig": {
|
|
@@ -503,14 +503,14 @@
|
|
|
503
503
|
"currency": "USD",
|
|
504
504
|
"unit": "1M",
|
|
505
505
|
"costs": {
|
|
506
|
-
"promptTokenCount":
|
|
507
|
-
"cachedContentTokenCount": -
|
|
508
|
-
"candidatesTokenCount":
|
|
506
|
+
"promptTokenCount": 1.5,
|
|
507
|
+
"cachedContentTokenCount": -1.35,
|
|
508
|
+
"candidatesTokenCount": 9
|
|
509
509
|
}
|
|
510
510
|
}
|
|
511
511
|
},
|
|
512
512
|
{
|
|
513
|
-
"name": "gemini-3-flash
|
|
513
|
+
"name": "gemini-3.5-flash",
|
|
514
514
|
"variant": "thinking-high",
|
|
515
515
|
"platform": {
|
|
516
516
|
"name": "gemini",
|
|
@@ -520,7 +520,7 @@
|
|
|
520
520
|
"model": {
|
|
521
521
|
"format": "gemini",
|
|
522
522
|
"config": {
|
|
523
|
-
"model": "gemini-3-flash
|
|
523
|
+
"model": "gemini-3.5-flash",
|
|
524
524
|
"config": {
|
|
525
525
|
"requestConfig": {
|
|
526
526
|
"generationConfig": {
|
|
@@ -538,9 +538,9 @@
|
|
|
538
538
|
"currency": "USD",
|
|
539
539
|
"unit": "1M",
|
|
540
540
|
"costs": {
|
|
541
|
-
"promptTokenCount":
|
|
542
|
-
"cachedContentTokenCount": -
|
|
543
|
-
"candidatesTokenCount":
|
|
541
|
+
"promptTokenCount": 1.5,
|
|
542
|
+
"cachedContentTokenCount": -1.35,
|
|
543
|
+
"candidatesTokenCount": 9
|
|
544
544
|
}
|
|
545
545
|
}
|
|
546
546
|
},
|
|
@@ -616,7 +616,7 @@
|
|
|
616
616
|
},
|
|
617
617
|
|
|
618
618
|
{
|
|
619
|
-
"name": "gemini-3-flash
|
|
619
|
+
"name": "gemini-3.5-flash",
|
|
620
620
|
"variant": "thinking-medium-vertex-ai",
|
|
621
621
|
"platform": {
|
|
622
622
|
"name": "vertex-ai",
|
|
@@ -625,7 +625,7 @@
|
|
|
625
625
|
"model": {
|
|
626
626
|
"format": "gemini",
|
|
627
627
|
"config": {
|
|
628
|
-
"model": "gemini-3-flash
|
|
628
|
+
"model": "gemini-3.5-flash",
|
|
629
629
|
"config": {
|
|
630
630
|
"requestConfig": {
|
|
631
631
|
"generationConfig": {
|
|
@@ -643,14 +643,14 @@
|
|
|
643
643
|
"currency": "USD",
|
|
644
644
|
"unit": "1M",
|
|
645
645
|
"costs": {
|
|
646
|
-
"promptTokenCount":
|
|
647
|
-
"cachedContentTokenCount": -
|
|
648
|
-
"candidatesTokenCount":
|
|
646
|
+
"promptTokenCount": 1.5,
|
|
647
|
+
"cachedContentTokenCount": -1.35,
|
|
648
|
+
"candidatesTokenCount": 9
|
|
649
649
|
}
|
|
650
650
|
}
|
|
651
651
|
},
|
|
652
652
|
{
|
|
653
|
-
"name": "gemini-3-flash
|
|
653
|
+
"name": "gemini-3.5-flash",
|
|
654
654
|
"variant": "thinking-high-vertex-ai",
|
|
655
655
|
"platform": {
|
|
656
656
|
"name": "vertex-ai",
|
|
@@ -659,7 +659,7 @@
|
|
|
659
659
|
"model": {
|
|
660
660
|
"format": "gemini",
|
|
661
661
|
"config": {
|
|
662
|
-
"model": "gemini-3-flash
|
|
662
|
+
"model": "gemini-3.5-flash",
|
|
663
663
|
"config": {
|
|
664
664
|
"requestConfig": {
|
|
665
665
|
"generationConfig": {
|
|
@@ -677,9 +677,9 @@
|
|
|
677
677
|
"currency": "USD",
|
|
678
678
|
"unit": "1M",
|
|
679
679
|
"costs": {
|
|
680
|
-
"promptTokenCount":
|
|
681
|
-
"cachedContentTokenCount": -
|
|
682
|
-
"candidatesTokenCount":
|
|
680
|
+
"promptTokenCount": 1.5,
|
|
681
|
+
"cachedContentTokenCount": -1.35,
|
|
682
|
+
"candidatesTokenCount": 9
|
|
683
683
|
}
|
|
684
684
|
}
|
|
685
685
|
},
|
package/package.json
CHANGED
|
@@ -7,6 +7,7 @@ SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")
|
|
|
7
7
|
|
|
8
8
|
MOUNTABLE_SCRIPT_PATH="$HOME/.cache/$SCRIPT_NAME/$SCRIPT_NAME"
|
|
9
9
|
CONTAINER_SCRIPT_PATH="/sandbox/bin/$SCRIPT_NAME"
|
|
10
|
+
PRESET_BASE_IMAGE="public.ecr.aws/docker/library/debian:stable-20260505-slim"
|
|
10
11
|
|
|
11
12
|
help() {
|
|
12
13
|
cat << HELP
|
|
@@ -851,8 +852,8 @@ setup_container_user() {
|
|
|
851
852
|
}
|
|
852
853
|
|
|
853
854
|
print_preset_dockerfile() {
|
|
855
|
+
echo "FROM $PRESET_BASE_IMAGE"
|
|
854
856
|
cat << 'EOF'
|
|
855
|
-
FROM public.ecr.aws/docker/library/debian:stable-slim
|
|
856
857
|
|
|
857
858
|
RUN apt update \
|
|
858
859
|
&& apt install -y \
|
package/src/cli/formatter.mjs
CHANGED
|
@@ -221,7 +221,7 @@ export function formatToolResult(toolResult) {
|
|
|
221
221
|
styleText("yellow", "$1"),
|
|
222
222
|
)
|
|
223
223
|
.replace(/(^<stderr>|<\/stderr>$)/gm, styleText("magenta", "$1"))
|
|
224
|
-
.replace(/(^<error
|
|
224
|
+
.replace(/(^<error code=.+?>|<\/error>$)/gm, styleText("magenta", "$1"));
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
if (toolResult.toolName === "read_file") {
|
package/src/cli/interactive.mjs
CHANGED
|
@@ -501,7 +501,8 @@ export function startInteractiveSession({
|
|
|
501
501
|
}
|
|
502
502
|
if (partialContent.position === "stop") {
|
|
503
503
|
if (partialContent.type === "tool_use") {
|
|
504
|
-
|
|
504
|
+
// Clear current line, move up one line, and clear that line too
|
|
505
|
+
process.stdout.write("\x1b[2K\x1b[1F\x1b[2K");
|
|
505
506
|
} else {
|
|
506
507
|
// Flush any buffered text before printing the closing tag
|
|
507
508
|
streamBuffer.forceFlush();
|
package/src/providers/gemini.mjs
CHANGED
|
@@ -34,8 +34,8 @@ export function createCacheEnabledGeminiModelCaller(
|
|
|
34
34
|
|
|
35
35
|
const props = {
|
|
36
36
|
cacheTTL: 2 * 60, // seconds
|
|
37
|
-
// https://ai.google.dev/gemini-api/docs/caching
|
|
38
|
-
minCacheableTokenCount:
|
|
37
|
+
// https://ai.google.dev/gemini-api/docs/caching
|
|
38
|
+
minCacheableTokenCount: 4096,
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
/**
|
|
@@ -60,7 +60,7 @@ export function createCacheEnabledGeminiModelCaller(
|
|
|
60
60
|
/** @type {GeminiToolConfig} */
|
|
61
61
|
const toolConfig = {
|
|
62
62
|
functionCallingConfig: {
|
|
63
|
-
// Workaround to prevent MALFORMED_FUNCTION_CALL issues with gemini
|
|
63
|
+
// Workaround to prevent MALFORMED_FUNCTION_CALL issues with gemini 3 flash
|
|
64
64
|
mode: "VALIDATED",
|
|
65
65
|
},
|
|
66
66
|
};
|
|
@@ -132,7 +132,7 @@ export function createCacheEnabledGeminiModelCaller(
|
|
|
132
132
|
...baseRequest,
|
|
133
133
|
system_instruction: systemInstruction,
|
|
134
134
|
contents: contentsWithoutSystem,
|
|
135
|
-
tools: tools
|
|
135
|
+
tools: input.tools?.length ? tools : [],
|
|
136
136
|
toolConfig,
|
|
137
137
|
};
|
|
138
138
|
|
|
@@ -140,19 +140,41 @@ export function createExecCommandTool(config) {
|
|
|
140
140
|
: "<stderr></stderr>",
|
|
141
141
|
];
|
|
142
142
|
|
|
143
|
-
if (err) {
|
|
144
|
-
// rg:
|
|
145
|
-
const ignoreError = [
|
|
143
|
+
if (!stderr && err) {
|
|
144
|
+
// rg: exit status != 0 when no matches are found.
|
|
145
|
+
const ignoreError = ["rg"].includes(input.command);
|
|
146
146
|
if (!ignoreError) {
|
|
147
|
-
//
|
|
148
|
-
const
|
|
147
|
+
// mask sandbox details
|
|
148
|
+
const originalCommand = [
|
|
149
|
+
input.command,
|
|
150
|
+
...(input.args ?? []),
|
|
151
|
+
];
|
|
152
|
+
const sandboxedCommand = [command, ...(args ?? [])];
|
|
153
|
+
const sandboxStr = [
|
|
154
|
+
...sandboxedCommand.slice(
|
|
155
|
+
0,
|
|
156
|
+
sandboxedCommand.length - originalCommand.length,
|
|
157
|
+
),
|
|
158
|
+
"",
|
|
159
|
+
].join(" ");
|
|
160
|
+
|
|
161
|
+
const errMessageMasked = sandboxStr
|
|
162
|
+
? err.message.replaceAll(sandboxStr, "")
|
|
163
|
+
: err.message;
|
|
164
|
+
|
|
165
|
+
const errMessageTruncated = errMessageMasked.slice(
|
|
149
166
|
0,
|
|
150
167
|
OUTPUT_TRUNCATED_LENGTH,
|
|
151
168
|
);
|
|
152
169
|
const isErrMessageTruncated =
|
|
153
|
-
|
|
170
|
+
errMessageMasked.length > OUTPUT_TRUNCATED_LENGTH;
|
|
171
|
+
|
|
154
172
|
result.push(
|
|
155
|
-
|
|
173
|
+
[
|
|
174
|
+
"",
|
|
175
|
+
`<error code="${err.code}" killed="${err.killed}" signal="${err.signal}">`,
|
|
176
|
+
`${err.name}: ${errMessageTruncated}${isErrMessageTruncated ? "... (Message truncated)" : ""}</error>`,
|
|
177
|
+
].join("\n"),
|
|
156
178
|
);
|
|
157
179
|
}
|
|
158
180
|
}
|
|
@@ -108,7 +108,7 @@ export function createTmuxCommandTool(config) {
|
|
|
108
108
|
? `<stderr>\n${isStderrTruncated ? "(Output truncated) ..." : ""}${stderrTruncated}\n</stderr>`
|
|
109
109
|
: "<stderr></stderr>",
|
|
110
110
|
];
|
|
111
|
-
if (err) {
|
|
111
|
+
if (!stderr && err) {
|
|
112
112
|
const errMessageTruncated = err.message.slice(
|
|
113
113
|
0,
|
|
114
114
|
OUTPUT_MAX_LENGTH,
|
package/src/tools/webFetch.mjs
CHANGED
|
@@ -264,7 +264,7 @@ async function webFetchViaCommand(config, input) {
|
|
|
264
264
|
* @returns {Promise<string | Error>}
|
|
265
265
|
*/
|
|
266
266
|
async function webFetchViaGemini(config, input, retryCount) {
|
|
267
|
-
const model = config.model ?? "gemini-3-flash
|
|
267
|
+
const model = config.model ?? "gemini-3.5-flash";
|
|
268
268
|
const url =
|
|
269
269
|
config.provider === "gemini-vertex-ai"
|
|
270
270
|
? `${config.baseURL}/publishers/google/models/${config.model}:generateContent`
|
package/src/tools/webSearch.mjs
CHANGED
|
@@ -330,7 +330,7 @@ async function webSearchViaCommand(config, input) {
|
|
|
330
330
|
* @returns {Promise<string | Error>}
|
|
331
331
|
*/
|
|
332
332
|
async function webSearchViaGemini(config, input, retryCount) {
|
|
333
|
-
const model = config.model ?? "gemini-3-flash
|
|
333
|
+
const model = config.model ?? "gemini-3.5-flash";
|
|
334
334
|
const url =
|
|
335
335
|
config.provider === "gemini-vertex-ai"
|
|
336
336
|
? `${config.baseURL}/publishers/google/models/${config.model}:generateContent`
|