@elizaos/plugin-code 2.0.0-alpha.2 → 2.0.0-alpha.3
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/dist/index.js +454 -5
- package/dist/index.js.map +7 -6
- package/package.json +13 -4
- package/LICENSE +0 -21
- package/dist/actions/changeDirectory.d.ts +0 -2
- package/dist/actions/editFile.d.ts +0 -2
- package/dist/actions/executeShell.d.ts +0 -2
- package/dist/actions/git.d.ts +0 -2
- package/dist/actions/index.d.ts +0 -8
- package/dist/actions/listFiles.d.ts +0 -2
- package/dist/actions/readFile.d.ts +0 -2
- package/dist/actions/searchFiles.d.ts +0 -2
- package/dist/actions/writeFile.d.ts +0 -2
- package/dist/build.d.ts +0 -1
- package/dist/generated/specs/spec-helpers.d.ts +0 -48
- package/dist/generated/specs/specs.d.ts +0 -142
- package/dist/index.browser.d.ts +0 -9
- package/dist/index.d.ts +0 -8
- package/dist/providers/coderStatusProvider.d.ts +0 -2
- package/dist/providers/index.d.ts +0 -1
- package/dist/services/coderService.d.ts +0 -61
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types/index.d.ts +0 -28
- package/dist/utils/config.d.ts +0 -2
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/pathUtils.d.ts +0 -13
package/dist/index.js
CHANGED
|
@@ -157,6 +157,16 @@ function requireActionSpec(name) {
|
|
|
157
157
|
}
|
|
158
158
|
return spec;
|
|
159
159
|
}
|
|
160
|
+
function getProviderSpec(name) {
|
|
161
|
+
return coreProviderMap.get(name) ?? allProviderMap.get(name);
|
|
162
|
+
}
|
|
163
|
+
function requireProviderSpec(name) {
|
|
164
|
+
const spec = getProviderSpec(name);
|
|
165
|
+
if (!spec) {
|
|
166
|
+
throw new Error(`Provider spec not found: ${name}`);
|
|
167
|
+
}
|
|
168
|
+
return spec;
|
|
169
|
+
}
|
|
160
170
|
|
|
161
171
|
// actions/changeDirectory.ts
|
|
162
172
|
function getTarget(options) {
|
|
@@ -512,8 +522,9 @@ import {
|
|
|
512
522
|
} from "@elizaos/core";
|
|
513
523
|
var MAX_OUTPUT_LENGTH = 8000;
|
|
514
524
|
var TRUNCATE_SEGMENT_LENGTH = 4000;
|
|
525
|
+
var spec9 = requireProviderSpec("coderStatusProvider");
|
|
515
526
|
var coderStatusProvider = {
|
|
516
|
-
name:
|
|
527
|
+
name: spec9.name,
|
|
517
528
|
description: "Provides current working directory, allowed directory, and recent shell/file operations",
|
|
518
529
|
position: 99,
|
|
519
530
|
get: async (runtime, message, _state) => {
|
|
@@ -951,6 +962,37 @@ class CoderService extends Service {
|
|
|
951
962
|
executedIn: this.getCurrentDirectory(conversationId)
|
|
952
963
|
};
|
|
953
964
|
}
|
|
965
|
+
const cwd = this.getCurrentDirectory(conversationId);
|
|
966
|
+
const shellService = typeof this.runtime?.getService === "function" ? this.runtime.getService("shell") : null;
|
|
967
|
+
if (shellService) {
|
|
968
|
+
const execResult = await shellService.exec(trimmed, {
|
|
969
|
+
workdir: cwd,
|
|
970
|
+
timeout: Math.floor(this.coderConfig.timeoutMs / 1000),
|
|
971
|
+
conversationId
|
|
972
|
+
});
|
|
973
|
+
if (execResult.status === "running") {
|
|
974
|
+
const result2 = {
|
|
975
|
+
success: true,
|
|
976
|
+
stdout: `Command running in background (session: ${execResult.sessionId})`,
|
|
977
|
+
stderr: "",
|
|
978
|
+
exitCode: 0,
|
|
979
|
+
executedIn: cwd
|
|
980
|
+
};
|
|
981
|
+
this.addToHistory(conversationId, trimmed, result2);
|
|
982
|
+
return result2;
|
|
983
|
+
}
|
|
984
|
+
const success = execResult.status === "completed" && execResult.exitCode === 0;
|
|
985
|
+
const result = {
|
|
986
|
+
success,
|
|
987
|
+
stdout: execResult.aggregated ?? "",
|
|
988
|
+
stderr: execResult.reason ?? "",
|
|
989
|
+
exitCode: execResult.exitCode ?? (success ? 0 : 1),
|
|
990
|
+
error: success ? undefined : "Command failed",
|
|
991
|
+
executedIn: cwd
|
|
992
|
+
};
|
|
993
|
+
this.addToHistory(conversationId, trimmed, result);
|
|
994
|
+
return result;
|
|
995
|
+
}
|
|
954
996
|
if (!isSafeCommand(trimmed)) {
|
|
955
997
|
return {
|
|
956
998
|
success: false,
|
|
@@ -958,7 +1000,7 @@ class CoderService extends Service {
|
|
|
958
1000
|
stderr: "Command contains forbidden patterns",
|
|
959
1001
|
exitCode: 1,
|
|
960
1002
|
error: "Security policy violation",
|
|
961
|
-
executedIn:
|
|
1003
|
+
executedIn: cwd
|
|
962
1004
|
};
|
|
963
1005
|
}
|
|
964
1006
|
if (isForbiddenCommand(trimmed, this.coderConfig.forbiddenCommands)) {
|
|
@@ -968,10 +1010,9 @@ class CoderService extends Service {
|
|
|
968
1010
|
stderr: "Command is forbidden by security policy",
|
|
969
1011
|
exitCode: 1,
|
|
970
1012
|
error: "Forbidden command",
|
|
971
|
-
executedIn:
|
|
1013
|
+
executedIn: cwd
|
|
972
1014
|
};
|
|
973
1015
|
}
|
|
974
|
-
const cwd = this.getCurrentDirectory(conversationId);
|
|
975
1016
|
try {
|
|
976
1017
|
const stdout = execSync(trimmed, {
|
|
977
1018
|
cwd,
|
|
@@ -1010,6 +1051,413 @@ class CoderService extends Service {
|
|
|
1010
1051
|
return this.executeShell(`git ${args}`, conversationId);
|
|
1011
1052
|
}
|
|
1012
1053
|
}
|
|
1054
|
+
// configureCodingTools.ts
|
|
1055
|
+
function configureCodingTools(runtime, options) {
|
|
1056
|
+
const shellService = runtime.getService("shell");
|
|
1057
|
+
const coderService = runtime.getService("coder");
|
|
1058
|
+
const defaultCwd = options?.cwd ?? process.cwd();
|
|
1059
|
+
const scopeKey = options?.scopeKey;
|
|
1060
|
+
const sessionKey = options?.sessionKey;
|
|
1061
|
+
const notifyOnExit = options?.notifyOnExit ?? false;
|
|
1062
|
+
const defaultBackgroundMs = options?.backgroundMs ?? 1e4;
|
|
1063
|
+
const defaultTimeoutSec = options?.timeoutSec ?? 1800;
|
|
1064
|
+
const conversationId = options?.conversationId ?? "default";
|
|
1065
|
+
const actions = [];
|
|
1066
|
+
if (shellService) {
|
|
1067
|
+
const execAction = {
|
|
1068
|
+
name: "exec",
|
|
1069
|
+
label: "exec",
|
|
1070
|
+
description: "Execute a shell command. Returns output when complete or session info if backgrounded.",
|
|
1071
|
+
parameters: {
|
|
1072
|
+
type: "object",
|
|
1073
|
+
properties: {
|
|
1074
|
+
command: { type: "string", description: "Shell command to execute" },
|
|
1075
|
+
workdir: {
|
|
1076
|
+
type: "string",
|
|
1077
|
+
description: "Working directory (optional)"
|
|
1078
|
+
},
|
|
1079
|
+
env: {
|
|
1080
|
+
type: "object",
|
|
1081
|
+
additionalProperties: { type: "string" },
|
|
1082
|
+
description: "Environment variables (optional)"
|
|
1083
|
+
},
|
|
1084
|
+
yieldMs: {
|
|
1085
|
+
type: "number",
|
|
1086
|
+
description: "Milliseconds to wait before backgrounding (default 10000)"
|
|
1087
|
+
},
|
|
1088
|
+
background: {
|
|
1089
|
+
type: "boolean",
|
|
1090
|
+
description: "Run in background immediately"
|
|
1091
|
+
},
|
|
1092
|
+
timeout: { type: "number", description: "Timeout in seconds" },
|
|
1093
|
+
pty: {
|
|
1094
|
+
type: "boolean",
|
|
1095
|
+
description: "Use PTY for interactive commands"
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
required: ["command"]
|
|
1099
|
+
},
|
|
1100
|
+
execute: async (context) => {
|
|
1101
|
+
const params = context.args;
|
|
1102
|
+
if (!params.command) {
|
|
1103
|
+
throw new Error("Provide a command to execute.");
|
|
1104
|
+
}
|
|
1105
|
+
const result = await shellService.exec(params.command, {
|
|
1106
|
+
workdir: params.workdir?.trim() || defaultCwd,
|
|
1107
|
+
env: params.env,
|
|
1108
|
+
yieldMs: params.yieldMs ?? defaultBackgroundMs,
|
|
1109
|
+
background: params.background,
|
|
1110
|
+
timeout: params.timeout ?? defaultTimeoutSec,
|
|
1111
|
+
pty: params.pty,
|
|
1112
|
+
scopeKey,
|
|
1113
|
+
sessionKey,
|
|
1114
|
+
notifyOnExit,
|
|
1115
|
+
conversationId: context.conversationId ?? conversationId,
|
|
1116
|
+
onUpdate: context.onUpdate ? (session) => {
|
|
1117
|
+
context.onUpdate?.({
|
|
1118
|
+
content: [
|
|
1119
|
+
{
|
|
1120
|
+
type: "text",
|
|
1121
|
+
text: session.tail || session.aggregated || ""
|
|
1122
|
+
}
|
|
1123
|
+
],
|
|
1124
|
+
details: {
|
|
1125
|
+
status: "running",
|
|
1126
|
+
sessionId: session.id,
|
|
1127
|
+
pid: session.pid ?? undefined,
|
|
1128
|
+
startedAt: session.startedAt,
|
|
1129
|
+
cwd: session.cwd,
|
|
1130
|
+
tail: session.tail
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1133
|
+
} : undefined
|
|
1134
|
+
});
|
|
1135
|
+
if (result.status === "running") {
|
|
1136
|
+
return {
|
|
1137
|
+
content: [
|
|
1138
|
+
{
|
|
1139
|
+
type: "text",
|
|
1140
|
+
text: `Command still running (session ${result.sessionId}, pid ${result.pid ?? "n/a"}). Use process action (list/poll/log/write/kill) for follow-up.`
|
|
1141
|
+
}
|
|
1142
|
+
],
|
|
1143
|
+
details: {
|
|
1144
|
+
status: "running",
|
|
1145
|
+
sessionId: result.sessionId,
|
|
1146
|
+
pid: result.pid ?? undefined,
|
|
1147
|
+
startedAt: result.startedAt,
|
|
1148
|
+
cwd: result.cwd,
|
|
1149
|
+
tail: result.tail
|
|
1150
|
+
}
|
|
1151
|
+
};
|
|
1152
|
+
}
|
|
1153
|
+
if (result.status === "failed") {
|
|
1154
|
+
return {
|
|
1155
|
+
content: [
|
|
1156
|
+
{
|
|
1157
|
+
type: "text",
|
|
1158
|
+
text: result.aggregated || result.reason || "Command failed."
|
|
1159
|
+
}
|
|
1160
|
+
],
|
|
1161
|
+
details: {
|
|
1162
|
+
status: "failed",
|
|
1163
|
+
exitCode: result.exitCode ?? 1,
|
|
1164
|
+
durationMs: result.durationMs,
|
|
1165
|
+
reason: result.reason
|
|
1166
|
+
}
|
|
1167
|
+
};
|
|
1168
|
+
}
|
|
1169
|
+
return {
|
|
1170
|
+
content: [
|
|
1171
|
+
{
|
|
1172
|
+
type: "text",
|
|
1173
|
+
text: result.aggregated || "(no output)"
|
|
1174
|
+
}
|
|
1175
|
+
],
|
|
1176
|
+
details: {
|
|
1177
|
+
status: "completed",
|
|
1178
|
+
exitCode: result.exitCode ?? 0,
|
|
1179
|
+
durationMs: result.durationMs,
|
|
1180
|
+
aggregated: result.aggregated,
|
|
1181
|
+
cwd: result.cwd
|
|
1182
|
+
}
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
};
|
|
1186
|
+
actions.push(execAction);
|
|
1187
|
+
const processAction = {
|
|
1188
|
+
name: "process",
|
|
1189
|
+
label: "process",
|
|
1190
|
+
description: "Manage running exec sessions: list, poll, log, write, send-keys, submit, paste, kill.",
|
|
1191
|
+
parameters: {
|
|
1192
|
+
type: "object",
|
|
1193
|
+
properties: {
|
|
1194
|
+
action: {
|
|
1195
|
+
type: "string",
|
|
1196
|
+
description: "Process action (list, poll, log, write, send-keys, submit, paste, kill, clear, remove)"
|
|
1197
|
+
},
|
|
1198
|
+
sessionId: {
|
|
1199
|
+
type: "string",
|
|
1200
|
+
description: "Session id for actions other than list"
|
|
1201
|
+
},
|
|
1202
|
+
data: {
|
|
1203
|
+
type: "string",
|
|
1204
|
+
description: "Data to write for write action"
|
|
1205
|
+
},
|
|
1206
|
+
keys: {
|
|
1207
|
+
type: "array",
|
|
1208
|
+
items: { type: "string" },
|
|
1209
|
+
description: "Key tokens to send for send-keys"
|
|
1210
|
+
},
|
|
1211
|
+
hex: {
|
|
1212
|
+
type: "array",
|
|
1213
|
+
items: { type: "string" },
|
|
1214
|
+
description: "Hex bytes to send for send-keys"
|
|
1215
|
+
},
|
|
1216
|
+
literal: {
|
|
1217
|
+
type: "string",
|
|
1218
|
+
description: "Literal string for send-keys"
|
|
1219
|
+
},
|
|
1220
|
+
text: {
|
|
1221
|
+
type: "string",
|
|
1222
|
+
description: "Text to paste for paste action"
|
|
1223
|
+
},
|
|
1224
|
+
bracketed: {
|
|
1225
|
+
type: "boolean",
|
|
1226
|
+
description: "Wrap paste in bracketed mode"
|
|
1227
|
+
},
|
|
1228
|
+
eof: { type: "boolean", description: "Close stdin after write" },
|
|
1229
|
+
offset: { type: "number", description: "Log offset" },
|
|
1230
|
+
limit: { type: "number", description: "Log length" }
|
|
1231
|
+
},
|
|
1232
|
+
required: ["action"]
|
|
1233
|
+
},
|
|
1234
|
+
execute: async (context) => {
|
|
1235
|
+
const params = context.args;
|
|
1236
|
+
const result = await shellService.processAction({
|
|
1237
|
+
action: params.action,
|
|
1238
|
+
sessionId: params.sessionId,
|
|
1239
|
+
data: params.data,
|
|
1240
|
+
keys: params.keys,
|
|
1241
|
+
hex: params.hex,
|
|
1242
|
+
literal: params.literal,
|
|
1243
|
+
text: params.text,
|
|
1244
|
+
bracketed: params.bracketed,
|
|
1245
|
+
eof: params.eof,
|
|
1246
|
+
offset: params.offset,
|
|
1247
|
+
limit: params.limit
|
|
1248
|
+
});
|
|
1249
|
+
return {
|
|
1250
|
+
content: [
|
|
1251
|
+
{
|
|
1252
|
+
type: "text",
|
|
1253
|
+
text: result.message
|
|
1254
|
+
}
|
|
1255
|
+
],
|
|
1256
|
+
details: result.data
|
|
1257
|
+
};
|
|
1258
|
+
}
|
|
1259
|
+
};
|
|
1260
|
+
actions.push(processAction);
|
|
1261
|
+
}
|
|
1262
|
+
if (coderService) {
|
|
1263
|
+
const readFileAction = {
|
|
1264
|
+
name: "read_file",
|
|
1265
|
+
label: "read_file",
|
|
1266
|
+
description: "Read the contents of a file.",
|
|
1267
|
+
parameters: {
|
|
1268
|
+
type: "object",
|
|
1269
|
+
properties: {
|
|
1270
|
+
path: { type: "string", description: "Path to the file to read" }
|
|
1271
|
+
},
|
|
1272
|
+
required: ["path"]
|
|
1273
|
+
},
|
|
1274
|
+
execute: async (context) => {
|
|
1275
|
+
const params = context.args;
|
|
1276
|
+
const convId = context.conversationId ?? conversationId;
|
|
1277
|
+
const result = await coderService.readFile(convId, params.path);
|
|
1278
|
+
if (!result.ok) {
|
|
1279
|
+
return {
|
|
1280
|
+
content: [{ type: "text", text: `Error: ${result.error}` }],
|
|
1281
|
+
details: { success: false, error: result.error }
|
|
1282
|
+
};
|
|
1283
|
+
}
|
|
1284
|
+
return {
|
|
1285
|
+
content: [{ type: "text", text: result.content }],
|
|
1286
|
+
details: { success: true }
|
|
1287
|
+
};
|
|
1288
|
+
}
|
|
1289
|
+
};
|
|
1290
|
+
actions.push(readFileAction);
|
|
1291
|
+
const writeFileAction = {
|
|
1292
|
+
name: "write_file",
|
|
1293
|
+
label: "write_file",
|
|
1294
|
+
description: "Write content to a file. Creates the file if it doesn't exist.",
|
|
1295
|
+
parameters: {
|
|
1296
|
+
type: "object",
|
|
1297
|
+
properties: {
|
|
1298
|
+
path: { type: "string", description: "Path to the file to write" },
|
|
1299
|
+
content: {
|
|
1300
|
+
type: "string",
|
|
1301
|
+
description: "Content to write to the file"
|
|
1302
|
+
}
|
|
1303
|
+
},
|
|
1304
|
+
required: ["path", "content"]
|
|
1305
|
+
},
|
|
1306
|
+
execute: async (context) => {
|
|
1307
|
+
const params = context.args;
|
|
1308
|
+
const convId = context.conversationId ?? conversationId;
|
|
1309
|
+
const result = await coderService.writeFile(convId, params.path, params.content);
|
|
1310
|
+
if (!result.ok) {
|
|
1311
|
+
return {
|
|
1312
|
+
content: [{ type: "text", text: `Error: ${result.error}` }],
|
|
1313
|
+
details: { success: false, error: result.error }
|
|
1314
|
+
};
|
|
1315
|
+
}
|
|
1316
|
+
return {
|
|
1317
|
+
content: [{ type: "text", text: `File written: ${params.path}` }],
|
|
1318
|
+
details: { success: true }
|
|
1319
|
+
};
|
|
1320
|
+
}
|
|
1321
|
+
};
|
|
1322
|
+
actions.push(writeFileAction);
|
|
1323
|
+
const editFileAction = {
|
|
1324
|
+
name: "edit_file",
|
|
1325
|
+
label: "edit_file",
|
|
1326
|
+
description: "Edit a file by replacing text. Finds old_str and replaces with new_str.",
|
|
1327
|
+
parameters: {
|
|
1328
|
+
type: "object",
|
|
1329
|
+
properties: {
|
|
1330
|
+
path: { type: "string", description: "Path to the file to edit" },
|
|
1331
|
+
old_str: { type: "string", description: "Text to find and replace" },
|
|
1332
|
+
new_str: { type: "string", description: "Text to replace with" }
|
|
1333
|
+
},
|
|
1334
|
+
required: ["path", "old_str", "new_str"]
|
|
1335
|
+
},
|
|
1336
|
+
execute: async (context) => {
|
|
1337
|
+
const params = context.args;
|
|
1338
|
+
const convId = context.conversationId ?? conversationId;
|
|
1339
|
+
const result = await coderService.editFile(convId, params.path, params.old_str, params.new_str);
|
|
1340
|
+
if (!result.ok) {
|
|
1341
|
+
return {
|
|
1342
|
+
content: [{ type: "text", text: `Error: ${result.error}` }],
|
|
1343
|
+
details: { success: false, error: result.error }
|
|
1344
|
+
};
|
|
1345
|
+
}
|
|
1346
|
+
return {
|
|
1347
|
+
content: [{ type: "text", text: `File edited: ${params.path}` }],
|
|
1348
|
+
details: { success: true }
|
|
1349
|
+
};
|
|
1350
|
+
}
|
|
1351
|
+
};
|
|
1352
|
+
actions.push(editFileAction);
|
|
1353
|
+
const listFilesAction = {
|
|
1354
|
+
name: "list_files",
|
|
1355
|
+
label: "list_files",
|
|
1356
|
+
description: "List files and directories in a path.",
|
|
1357
|
+
parameters: {
|
|
1358
|
+
type: "object",
|
|
1359
|
+
properties: {
|
|
1360
|
+
path: {
|
|
1361
|
+
type: "string",
|
|
1362
|
+
description: "Directory path to list (defaults to current directory)"
|
|
1363
|
+
}
|
|
1364
|
+
},
|
|
1365
|
+
required: []
|
|
1366
|
+
},
|
|
1367
|
+
execute: async (context) => {
|
|
1368
|
+
const params = context.args;
|
|
1369
|
+
const convId = context.conversationId ?? conversationId;
|
|
1370
|
+
const result = await coderService.listFiles(convId, params.path ?? ".");
|
|
1371
|
+
if (!result.ok) {
|
|
1372
|
+
return {
|
|
1373
|
+
content: [{ type: "text", text: `Error: ${result.error}` }],
|
|
1374
|
+
details: { success: false, error: result.error }
|
|
1375
|
+
};
|
|
1376
|
+
}
|
|
1377
|
+
return {
|
|
1378
|
+
content: [{ type: "text", text: result.items.join(`
|
|
1379
|
+
`) }],
|
|
1380
|
+
details: { success: true, items: result.items }
|
|
1381
|
+
};
|
|
1382
|
+
}
|
|
1383
|
+
};
|
|
1384
|
+
actions.push(listFilesAction);
|
|
1385
|
+
const searchFilesAction = {
|
|
1386
|
+
name: "search_files",
|
|
1387
|
+
label: "search_files",
|
|
1388
|
+
description: "Search for a pattern in files within a directory.",
|
|
1389
|
+
parameters: {
|
|
1390
|
+
type: "object",
|
|
1391
|
+
properties: {
|
|
1392
|
+
pattern: { type: "string", description: "Pattern to search for" },
|
|
1393
|
+
path: {
|
|
1394
|
+
type: "string",
|
|
1395
|
+
description: "Directory path to search in (defaults to current directory)"
|
|
1396
|
+
},
|
|
1397
|
+
max_matches: {
|
|
1398
|
+
type: "number",
|
|
1399
|
+
description: "Maximum matches to return (default 50)"
|
|
1400
|
+
}
|
|
1401
|
+
},
|
|
1402
|
+
required: ["pattern"]
|
|
1403
|
+
},
|
|
1404
|
+
execute: async (context) => {
|
|
1405
|
+
const params = context.args;
|
|
1406
|
+
const convId = context.conversationId ?? conversationId;
|
|
1407
|
+
const result = await coderService.searchFiles(convId, params.pattern, params.path ?? ".", params.max_matches ?? 50);
|
|
1408
|
+
if (!result.ok) {
|
|
1409
|
+
return {
|
|
1410
|
+
content: [{ type: "text", text: `Error: ${result.error}` }],
|
|
1411
|
+
details: { success: false, error: result.error }
|
|
1412
|
+
};
|
|
1413
|
+
}
|
|
1414
|
+
const formatted = result.matches.map((m) => `${m.file}:${m.line}: ${m.content}`).join(`
|
|
1415
|
+
`);
|
|
1416
|
+
return {
|
|
1417
|
+
content: [{ type: "text", text: formatted || "No matches found" }],
|
|
1418
|
+
details: { success: true, matches: result.matches }
|
|
1419
|
+
};
|
|
1420
|
+
}
|
|
1421
|
+
};
|
|
1422
|
+
actions.push(searchFilesAction);
|
|
1423
|
+
const gitAction = {
|
|
1424
|
+
name: "git",
|
|
1425
|
+
label: "git",
|
|
1426
|
+
description: "Execute a git command.",
|
|
1427
|
+
parameters: {
|
|
1428
|
+
type: "object",
|
|
1429
|
+
properties: {
|
|
1430
|
+
args: {
|
|
1431
|
+
type: "string",
|
|
1432
|
+
description: "Git command arguments (e.g., 'status', 'diff', 'log --oneline -5')"
|
|
1433
|
+
}
|
|
1434
|
+
},
|
|
1435
|
+
required: ["args"]
|
|
1436
|
+
},
|
|
1437
|
+
execute: async (context) => {
|
|
1438
|
+
const params = context.args;
|
|
1439
|
+
const convId = context.conversationId ?? conversationId;
|
|
1440
|
+
const result = await coderService.git(params.args, convId);
|
|
1441
|
+
return {
|
|
1442
|
+
content: [
|
|
1443
|
+
{
|
|
1444
|
+
type: "text",
|
|
1445
|
+
text: result.success ? result.stdout : result.stderr
|
|
1446
|
+
}
|
|
1447
|
+
],
|
|
1448
|
+
details: {
|
|
1449
|
+
success: result.success,
|
|
1450
|
+
exitCode: result.exitCode,
|
|
1451
|
+
stdout: result.stdout,
|
|
1452
|
+
stderr: result.stderr
|
|
1453
|
+
}
|
|
1454
|
+
};
|
|
1455
|
+
}
|
|
1456
|
+
};
|
|
1457
|
+
actions.push(gitAction);
|
|
1458
|
+
}
|
|
1459
|
+
return actions;
|
|
1460
|
+
}
|
|
1013
1461
|
|
|
1014
1462
|
// index.ts
|
|
1015
1463
|
var coderPlugin = {
|
|
@@ -1043,6 +1491,7 @@ export {
|
|
|
1043
1491
|
executeShell,
|
|
1044
1492
|
editFile,
|
|
1045
1493
|
typescript_default as default,
|
|
1494
|
+
configureCodingTools,
|
|
1046
1495
|
coderStatusProvider,
|
|
1047
1496
|
coderPlugin,
|
|
1048
1497
|
changeDirectory,
|
|
@@ -1050,4 +1499,4 @@ export {
|
|
|
1050
1499
|
CoderService
|
|
1051
1500
|
};
|
|
1052
1501
|
|
|
1053
|
-
//# debugId=
|
|
1502
|
+
//# debugId=30DB4D8CA69EB24D64756E2164756E21
|