@rallycry/conveyor-agent 8.0.1 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-2L7ROQE6.js → chunk-VQSLHBTO.js} +294 -155
- package/dist/chunk-VQSLHBTO.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2L7ROQE6.js.map +0 -1
|
@@ -1233,8 +1233,8 @@ var PlanSync = class {
|
|
|
1233
1233
|
for (const file of readdirSync(plansDir).filter((f) => f.endsWith(".md"))) {
|
|
1234
1234
|
try {
|
|
1235
1235
|
const fullPath = join(plansDir, file);
|
|
1236
|
-
const
|
|
1237
|
-
this.planFileSnapshot.set(fullPath,
|
|
1236
|
+
const stat3 = statSync(fullPath);
|
|
1237
|
+
this.planFileSnapshot.set(fullPath, stat3.mtimeMs);
|
|
1238
1238
|
} catch {
|
|
1239
1239
|
continue;
|
|
1240
1240
|
}
|
|
@@ -1255,11 +1255,11 @@ var PlanSync = class {
|
|
|
1255
1255
|
for (const file of files) {
|
|
1256
1256
|
const fullPath = join(plansDir, file);
|
|
1257
1257
|
try {
|
|
1258
|
-
const
|
|
1258
|
+
const stat3 = statSync(fullPath);
|
|
1259
1259
|
const prevMtime = this.planFileSnapshot.get(fullPath);
|
|
1260
|
-
const isNew = prevMtime === void 0 ||
|
|
1261
|
-
if (isNew && (!newest ||
|
|
1262
|
-
newest = { path: fullPath, mtime:
|
|
1260
|
+
const isNew = prevMtime === void 0 || stat3.mtimeMs > prevMtime;
|
|
1261
|
+
if (isNew && (!newest || stat3.mtimeMs > newest.mtime)) {
|
|
1262
|
+
newest = { path: fullPath, mtime: stat3.mtimeMs };
|
|
1263
1263
|
}
|
|
1264
1264
|
} catch {
|
|
1265
1265
|
continue;
|
|
@@ -1304,7 +1304,7 @@ var PlanSync = class {
|
|
|
1304
1304
|
import { createHash } from "crypto";
|
|
1305
1305
|
import { existsSync } from "fs";
|
|
1306
1306
|
import { homedir } from "os";
|
|
1307
|
-
import { join as
|
|
1307
|
+
import { join as join3 } from "path";
|
|
1308
1308
|
|
|
1309
1309
|
// ../shared/dist/index.js
|
|
1310
1310
|
import { z } from "zod";
|
|
@@ -1365,7 +1365,21 @@ var GetSuggestionsRequestSchema = z.object({
|
|
|
1365
1365
|
status: z.string().optional(),
|
|
1366
1366
|
limit: z.number().int().min(1).max(100).optional()
|
|
1367
1367
|
});
|
|
1368
|
+
var ListManualTestsRequestSchema = z.object({
|
|
1369
|
+
sessionId: z.string()
|
|
1370
|
+
});
|
|
1368
1371
|
var CreatePullRequestRequestSchema = CreatePRInputSchema.extend({ sessionId: z.string() });
|
|
1372
|
+
var RequestFileUploadRequestSchema = z.object({
|
|
1373
|
+
sessionId: z.string(),
|
|
1374
|
+
fileName: z.string().min(1).max(255),
|
|
1375
|
+
mimeType: z.string().min(1).max(128),
|
|
1376
|
+
fileSize: z.number().int().positive().max(MAX_FILE_SIZE_BYTES)
|
|
1377
|
+
});
|
|
1378
|
+
var ConfirmFileUploadRequestSchema = z.object({
|
|
1379
|
+
sessionId: z.string(),
|
|
1380
|
+
fileId: z.string(),
|
|
1381
|
+
title: z.string().max(500).optional()
|
|
1382
|
+
});
|
|
1369
1383
|
var UpdateTaskStatusRequestSchema = z.object({
|
|
1370
1384
|
sessionId: z.string(),
|
|
1371
1385
|
status: z.string(),
|
|
@@ -1375,6 +1389,10 @@ var StoreSessionIdRequestSchema = z.object({
|
|
|
1375
1389
|
sessionId: z.string(),
|
|
1376
1390
|
sdkSessionId: z.string()
|
|
1377
1391
|
});
|
|
1392
|
+
var SetManualTestsRequestSchema = z.object({
|
|
1393
|
+
sessionId: z.string(),
|
|
1394
|
+
items: z.array(z.object({ title: z.string().min(1) })).min(1)
|
|
1395
|
+
});
|
|
1378
1396
|
var TrackSpendingRequestSchema = z.object({
|
|
1379
1397
|
sessionId: z.string(),
|
|
1380
1398
|
inputTokens: z.number().int().nonnegative(),
|
|
@@ -3845,26 +3863,150 @@ function buildMutationTools(connection, config) {
|
|
|
3845
3863
|
];
|
|
3846
3864
|
}
|
|
3847
3865
|
|
|
3866
|
+
// src/tools/attachment-tools.ts
|
|
3867
|
+
import { readFile as readFile2, stat as stat2 } from "fs/promises";
|
|
3868
|
+
import { basename, extname, isAbsolute, join as join2 } from "path";
|
|
3869
|
+
import { z as z7 } from "zod";
|
|
3870
|
+
var IMAGE_MIME_BY_EXT = {
|
|
3871
|
+
".png": "image/png",
|
|
3872
|
+
".jpg": "image/jpeg",
|
|
3873
|
+
".jpeg": "image/jpeg",
|
|
3874
|
+
".gif": "image/gif",
|
|
3875
|
+
".webp": "image/webp"
|
|
3876
|
+
};
|
|
3877
|
+
function buildUploadAttachmentTool(connection, config) {
|
|
3878
|
+
return defineTool(
|
|
3879
|
+
"upload_attachment",
|
|
3880
|
+
"Upload an image file (e.g. a Playwright screenshot) as a task attachment AND post it to the task chat in one step \u2014 no follow-up post_to_chat call needed. Supports png/jpg/gif/webp.",
|
|
3881
|
+
{
|
|
3882
|
+
path: z7.string().describe("Path to the image file \u2014 absolute, or relative to the workspace root"),
|
|
3883
|
+
title: z7.string().optional().describe("Short caption posted with the image (defaults to the file name)")
|
|
3884
|
+
},
|
|
3885
|
+
async ({ path: path2, title }) => {
|
|
3886
|
+
try {
|
|
3887
|
+
const filePath = isAbsolute(path2) ? path2 : join2(config.workspaceDir, path2);
|
|
3888
|
+
const mimeType = IMAGE_MIME_BY_EXT[extname(filePath).toLowerCase()];
|
|
3889
|
+
if (!mimeType) {
|
|
3890
|
+
return textResult(
|
|
3891
|
+
`Unsupported file type "${extname(filePath) || "(none)"}". Supported: ${Object.keys(IMAGE_MIME_BY_EXT).join(", ")}`
|
|
3892
|
+
);
|
|
3893
|
+
}
|
|
3894
|
+
const info = await stat2(filePath).catch(() => null);
|
|
3895
|
+
if (!info?.isFile()) {
|
|
3896
|
+
return textResult(`File not found: ${filePath}`);
|
|
3897
|
+
}
|
|
3898
|
+
if (info.size > MAX_FILE_SIZE_BYTES) {
|
|
3899
|
+
return textResult(
|
|
3900
|
+
`File is ${info.size} bytes \u2014 exceeds the ${MAX_FILE_SIZE_BYTES} byte upload limit. Resize or crop the image first.`
|
|
3901
|
+
);
|
|
3902
|
+
}
|
|
3903
|
+
const fileName = basename(filePath);
|
|
3904
|
+
const { fileId, uploadUrl } = await connection.call("requestFileUpload", {
|
|
3905
|
+
sessionId: connection.sessionId,
|
|
3906
|
+
fileName,
|
|
3907
|
+
mimeType,
|
|
3908
|
+
fileSize: info.size
|
|
3909
|
+
});
|
|
3910
|
+
const body = await readFile2(filePath);
|
|
3911
|
+
const res = await fetch(uploadUrl, {
|
|
3912
|
+
method: "PUT",
|
|
3913
|
+
headers: { "Content-Type": mimeType },
|
|
3914
|
+
body
|
|
3915
|
+
});
|
|
3916
|
+
if (!res.ok) {
|
|
3917
|
+
return textResult(
|
|
3918
|
+
`Upload to storage failed: HTTP ${res.status} ${await res.text().catch(() => "")}`
|
|
3919
|
+
);
|
|
3920
|
+
}
|
|
3921
|
+
const result = await connection.call("confirmFileUpload", {
|
|
3922
|
+
sessionId: connection.sessionId,
|
|
3923
|
+
fileId,
|
|
3924
|
+
title
|
|
3925
|
+
});
|
|
3926
|
+
return textResult(
|
|
3927
|
+
`Uploaded ${fileName} (${info.size} bytes) and posted it to the task chat${title ? ` with caption "${title}"` : ""}. File ID: ${result.fileId}`
|
|
3928
|
+
);
|
|
3929
|
+
} catch (error) {
|
|
3930
|
+
return textResult(
|
|
3931
|
+
`Failed to upload attachment: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
3932
|
+
);
|
|
3933
|
+
}
|
|
3934
|
+
}
|
|
3935
|
+
);
|
|
3936
|
+
}
|
|
3937
|
+
|
|
3938
|
+
// src/tools/checklist-tools.ts
|
|
3939
|
+
import { z as z8 } from "zod";
|
|
3940
|
+
function buildListManualTestsTool(connection) {
|
|
3941
|
+
return defineTool(
|
|
3942
|
+
"list_manual_tests",
|
|
3943
|
+
"List the manual test checklist items for the current task. Use to see what manual verification steps have already been recorded.",
|
|
3944
|
+
{},
|
|
3945
|
+
async () => {
|
|
3946
|
+
try {
|
|
3947
|
+
const items = await connection.call("listManualTests", {
|
|
3948
|
+
sessionId: connection.sessionId
|
|
3949
|
+
});
|
|
3950
|
+
if (items.length === 0) return textResult("No manual tests recorded for this task.");
|
|
3951
|
+
const lines = items.map((item, i) => {
|
|
3952
|
+
const checked = item.checked ? "[x]" : "[ ]";
|
|
3953
|
+
return `${i + 1}. ${checked} ${item.title}`;
|
|
3954
|
+
});
|
|
3955
|
+
return textResult(lines.join("\n"));
|
|
3956
|
+
} catch {
|
|
3957
|
+
return textResult("Failed to list manual tests.");
|
|
3958
|
+
}
|
|
3959
|
+
},
|
|
3960
|
+
{ annotations: { readOnlyHint: true } }
|
|
3961
|
+
);
|
|
3962
|
+
}
|
|
3963
|
+
function buildSetManualTestsTool(connection) {
|
|
3964
|
+
return defineTool(
|
|
3965
|
+
"set_manual_tests",
|
|
3966
|
+
"Add manual test steps to the task checklist. Existing items with the same title are automatically skipped (deduplication). Use to record specific manual verification steps that reviewers should follow when testing this PR.",
|
|
3967
|
+
{
|
|
3968
|
+
items: z8.array(z8.object({ title: z8.string().min(1).describe("A concise, actionable test step") })).min(1).describe("List of manual test steps to add")
|
|
3969
|
+
},
|
|
3970
|
+
async ({ items }) => {
|
|
3971
|
+
try {
|
|
3972
|
+
const result = await connection.call("setManualTests", {
|
|
3973
|
+
sessionId: connection.sessionId,
|
|
3974
|
+
items
|
|
3975
|
+
});
|
|
3976
|
+
const parts = [`Created ${result.created} manual test item(s).`];
|
|
3977
|
+
if (result.skipped > 0) parts.push(`Skipped ${result.skipped} duplicate(s).`);
|
|
3978
|
+
return textResult(parts.join(" "));
|
|
3979
|
+
} catch (error) {
|
|
3980
|
+
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
3981
|
+
return textResult(`Failed to set manual tests: ${msg}`);
|
|
3982
|
+
}
|
|
3983
|
+
}
|
|
3984
|
+
);
|
|
3985
|
+
}
|
|
3986
|
+
|
|
3848
3987
|
// src/tools/common-tools.ts
|
|
3849
3988
|
function buildCommonTools(connection, config) {
|
|
3850
3989
|
return [
|
|
3851
3990
|
...buildTaskContextTools(connection),
|
|
3852
3991
|
buildGetDependenciesTool(connection),
|
|
3853
3992
|
buildGetSuggestionsTool(connection),
|
|
3854
|
-
|
|
3993
|
+
buildListManualTestsTool(connection),
|
|
3994
|
+
buildSetManualTestsTool(connection),
|
|
3995
|
+
...buildMutationTools(connection, config),
|
|
3996
|
+
buildUploadAttachmentTool(connection, config)
|
|
3855
3997
|
];
|
|
3856
3998
|
}
|
|
3857
3999
|
|
|
3858
4000
|
// src/tools/pm-tools.ts
|
|
3859
|
-
import { z as
|
|
4001
|
+
import { z as z9 } from "zod";
|
|
3860
4002
|
var SP_DESCRIPTION = "Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)";
|
|
3861
4003
|
function buildUpdateTaskTool(connection) {
|
|
3862
4004
|
return defineTool(
|
|
3863
4005
|
"update_task_plan",
|
|
3864
4006
|
"Save the finalized plan and/or description to the current task. Use in Plan mode after alignment. For children use update_subtask; for title/tags/PR use update_task_properties.",
|
|
3865
4007
|
{
|
|
3866
|
-
plan:
|
|
3867
|
-
description:
|
|
4008
|
+
plan: z9.string().optional().describe("The task plan in markdown"),
|
|
4009
|
+
description: z9.string().optional().describe("Updated task description")
|
|
3868
4010
|
},
|
|
3869
4011
|
async ({ plan, description }) => {
|
|
3870
4012
|
try {
|
|
@@ -3885,11 +4027,11 @@ function buildCreateSubtaskTool(connection) {
|
|
|
3885
4027
|
"create_subtask",
|
|
3886
4028
|
"Create a subtask under the current parent task. Use when breaking a complex parent into smaller pieces during planning. For post-task follow-ups use create_follow_up_task.",
|
|
3887
4029
|
{
|
|
3888
|
-
title:
|
|
3889
|
-
description:
|
|
3890
|
-
plan:
|
|
3891
|
-
ordinal:
|
|
3892
|
-
storyPointValue:
|
|
4030
|
+
title: z9.string().describe("Subtask title"),
|
|
4031
|
+
description: z9.string().optional().describe("Brief description"),
|
|
4032
|
+
plan: z9.string().optional().describe("Implementation plan in markdown"),
|
|
4033
|
+
ordinal: z9.number().optional().describe("Step/order number (0-based)"),
|
|
4034
|
+
storyPointValue: z9.number().optional().describe(SP_DESCRIPTION)
|
|
3893
4035
|
},
|
|
3894
4036
|
async ({ title, description, plan, ordinal, storyPointValue }) => {
|
|
3895
4037
|
try {
|
|
@@ -3915,12 +4057,12 @@ function buildUpdateSubtaskTool(connection) {
|
|
|
3915
4057
|
"update_subtask",
|
|
3916
4058
|
"Update an existing subtask's fields (title, description, plan, ordinal, storyPointValue). Use when refining a child's plan or reordering. For the current task use update_task_plan.",
|
|
3917
4059
|
{
|
|
3918
|
-
subtaskId:
|
|
3919
|
-
title:
|
|
3920
|
-
description:
|
|
3921
|
-
plan:
|
|
3922
|
-
ordinal:
|
|
3923
|
-
storyPointValue:
|
|
4060
|
+
subtaskId: z9.string().describe("The subtask ID to update"),
|
|
4061
|
+
title: z9.string().optional(),
|
|
4062
|
+
description: z9.string().optional(),
|
|
4063
|
+
plan: z9.string().optional(),
|
|
4064
|
+
ordinal: z9.number().optional(),
|
|
4065
|
+
storyPointValue: z9.number().optional().describe(SP_DESCRIPTION)
|
|
3924
4066
|
},
|
|
3925
4067
|
async ({ subtaskId, title, description, plan, storyPointValue }) => {
|
|
3926
4068
|
try {
|
|
@@ -3943,7 +4085,7 @@ function buildDeleteSubtaskTool(connection) {
|
|
|
3943
4085
|
return defineTool(
|
|
3944
4086
|
"delete_subtask",
|
|
3945
4087
|
"Delete a subtask by id. When to use: a subtask was created in error or is no longer needed. Returns: confirmation string.",
|
|
3946
|
-
{ subtaskId:
|
|
4088
|
+
{ subtaskId: z9.string().describe("The subtask ID to delete") },
|
|
3947
4089
|
async ({ subtaskId }) => {
|
|
3948
4090
|
try {
|
|
3949
4091
|
await connection.call("deleteSubtask", {
|
|
@@ -3981,7 +4123,7 @@ function buildPackTools(connection) {
|
|
|
3981
4123
|
"start_child_cloud_build",
|
|
3982
4124
|
"Start a cloud build (codespace) for a child task. Preconditions: child is in Open status, has a story point value, and has an agent assigned.",
|
|
3983
4125
|
{
|
|
3984
|
-
childTaskId:
|
|
4126
|
+
childTaskId: z9.string().describe("The child task ID to start a cloud build for")
|
|
3985
4127
|
},
|
|
3986
4128
|
async ({ childTaskId }) => {
|
|
3987
4129
|
try {
|
|
@@ -4001,7 +4143,7 @@ function buildPackTools(connection) {
|
|
|
4001
4143
|
"stop_child_build",
|
|
4002
4144
|
"Send a graceful stop signal to a running child build's agent. Not a force-kill \u2014 the agent may take a moment to wind down.",
|
|
4003
4145
|
{
|
|
4004
|
-
childTaskId:
|
|
4146
|
+
childTaskId: z9.string().describe("The child task ID whose build should be stopped")
|
|
4005
4147
|
},
|
|
4006
4148
|
async ({ childTaskId }) => {
|
|
4007
4149
|
try {
|
|
@@ -4021,7 +4163,7 @@ function buildPackTools(connection) {
|
|
|
4021
4163
|
"approve_and_merge_pr",
|
|
4022
4164
|
"Approve and merge a child task's PR. Preconditions: child in ReviewPR. Returns { merged }: true = merged (status\u2192ReviewDev); false = automerge queued, wait for ReviewDev.",
|
|
4023
4165
|
{
|
|
4024
|
-
childTaskId:
|
|
4166
|
+
childTaskId: z9.string().describe("The child task ID whose PR should be approved and merged")
|
|
4025
4167
|
},
|
|
4026
4168
|
async ({ childTaskId }) => {
|
|
4027
4169
|
try {
|
|
@@ -4059,7 +4201,7 @@ function buildPmTools(connection, options) {
|
|
|
4059
4201
|
}
|
|
4060
4202
|
|
|
4061
4203
|
// src/tools/discovery-tools.ts
|
|
4062
|
-
import { z as
|
|
4204
|
+
import { z as z10 } from "zod";
|
|
4063
4205
|
var SP_DESCRIPTION2 = "Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)";
|
|
4064
4206
|
function buildDiscoveryTools(connection) {
|
|
4065
4207
|
return [
|
|
@@ -4067,11 +4209,11 @@ function buildDiscoveryTools(connection) {
|
|
|
4067
4209
|
"update_task_properties",
|
|
4068
4210
|
"Set one or more task properties in a single call. All fields are optional \u2014 only include the fields you want to update.",
|
|
4069
4211
|
{
|
|
4070
|
-
title:
|
|
4071
|
-
storyPointValue:
|
|
4072
|
-
tagNames:
|
|
4073
|
-
githubPRUrl:
|
|
4074
|
-
githubBranch:
|
|
4212
|
+
title: z10.string().optional().describe("The new task title"),
|
|
4213
|
+
storyPointValue: z10.number().optional().describe(SP_DESCRIPTION2),
|
|
4214
|
+
tagNames: z10.array(z10.string()).optional().describe("Array of tag names to assign"),
|
|
4215
|
+
githubPRUrl: z10.string().url().optional().describe("GitHub pull request URL to link to this task"),
|
|
4216
|
+
githubBranch: z10.string().optional().describe("Set the GitHub branch name for this task (e.g. 'conveyor/my-feature-abc123')")
|
|
4075
4217
|
},
|
|
4076
4218
|
async ({ title, storyPointValue, tagNames, githubPRUrl, githubBranch }) => {
|
|
4077
4219
|
try {
|
|
@@ -4102,14 +4244,14 @@ function buildDiscoveryTools(connection) {
|
|
|
4102
4244
|
}
|
|
4103
4245
|
|
|
4104
4246
|
// src/tools/code-review-tools.ts
|
|
4105
|
-
import { z as
|
|
4247
|
+
import { z as z11 } from "zod";
|
|
4106
4248
|
function buildCodeReviewTools(connection) {
|
|
4107
4249
|
return [
|
|
4108
4250
|
defineTool(
|
|
4109
4251
|
"approve_code_review",
|
|
4110
4252
|
"Approve the code review and exit. Use when the diff passes all review criteria. Takes only a summary \u2014 for changes, use request_code_changes with a structured issues[] list.",
|
|
4111
4253
|
{
|
|
4112
|
-
summary:
|
|
4254
|
+
summary: z11.string().describe("Brief summary of what was reviewed and why it looks good")
|
|
4113
4255
|
},
|
|
4114
4256
|
async ({ summary }) => {
|
|
4115
4257
|
const content = `**Code Review: Approved** :white_check_mark:
|
|
@@ -4132,15 +4274,15 @@ ${summary}`;
|
|
|
4132
4274
|
"request_code_changes",
|
|
4133
4275
|
"Request changes during code review and exit. Use when substantive issues must be fixed before merge. Each issue: { file, line?, severity: critical|major|minor, description }.",
|
|
4134
4276
|
{
|
|
4135
|
-
issues:
|
|
4136
|
-
|
|
4137
|
-
file:
|
|
4138
|
-
line:
|
|
4139
|
-
severity:
|
|
4140
|
-
description:
|
|
4277
|
+
issues: z11.array(
|
|
4278
|
+
z11.object({
|
|
4279
|
+
file: z11.string().describe("File path where the issue was found"),
|
|
4280
|
+
line: z11.number().optional().describe("Line number (if applicable)"),
|
|
4281
|
+
severity: z11.enum(["critical", "major", "minor"]).describe("Issue severity"),
|
|
4282
|
+
description: z11.string().describe("What is wrong and how to fix it")
|
|
4141
4283
|
})
|
|
4142
4284
|
).describe("List of issues found during review"),
|
|
4143
|
-
summary:
|
|
4285
|
+
summary: z11.string().describe("Brief overall summary of the review findings")
|
|
4144
4286
|
},
|
|
4145
4287
|
async ({ issues, summary }) => {
|
|
4146
4288
|
const issueLines = issues.map((issue) => {
|
|
@@ -4170,10 +4312,10 @@ ${issueLines}`;
|
|
|
4170
4312
|
}
|
|
4171
4313
|
|
|
4172
4314
|
// src/tools/debug-tools.ts
|
|
4173
|
-
import { z as
|
|
4315
|
+
import { z as z14 } from "zod";
|
|
4174
4316
|
|
|
4175
4317
|
// src/tools/telemetry-tools.ts
|
|
4176
|
-
import { z as
|
|
4318
|
+
import { z as z12 } from "zod";
|
|
4177
4319
|
|
|
4178
4320
|
// src/debug/telemetry-injector.ts
|
|
4179
4321
|
var BUFFER_SIZE = 200;
|
|
@@ -4568,12 +4710,12 @@ function buildGetTelemetryTool(manager) {
|
|
|
4568
4710
|
"debug_get_telemetry",
|
|
4569
4711
|
"Query structured telemetry events (HTTP, DB, Socket.IO, errors) captured from the dev server. Returns filtered structured data instead of raw logs.",
|
|
4570
4712
|
{
|
|
4571
|
-
type:
|
|
4572
|
-
urlPattern:
|
|
4573
|
-
minDuration:
|
|
4574
|
-
errorOnly:
|
|
4575
|
-
since:
|
|
4576
|
-
limit:
|
|
4713
|
+
type: z12.enum(["http", "db", "socket", "error"]).optional().describe("Filter by event type"),
|
|
4714
|
+
urlPattern: z12.string().optional().describe("Regex pattern to filter HTTP events by URL"),
|
|
4715
|
+
minDuration: z12.number().optional().describe("Minimum duration in ms \u2014 only return events slower than this"),
|
|
4716
|
+
errorOnly: z12.boolean().optional().describe("Only return error events and HTTP 4xx/5xx responses"),
|
|
4717
|
+
since: z12.number().optional().describe("Only return events after this timestamp (ms since epoch)"),
|
|
4718
|
+
limit: z12.number().optional().describe("Max events to return (default: 20, from most recent)")
|
|
4577
4719
|
},
|
|
4578
4720
|
async ({ type, urlPattern, minDuration, errorOnly, since, limit }) => {
|
|
4579
4721
|
const clientOrErr = requireDebugClient(manager);
|
|
@@ -4643,7 +4785,7 @@ function buildTelemetryTools(manager) {
|
|
|
4643
4785
|
}
|
|
4644
4786
|
|
|
4645
4787
|
// src/tools/client-debug-tools.ts
|
|
4646
|
-
import { z as
|
|
4788
|
+
import { z as z13 } from "zod";
|
|
4647
4789
|
function requirePlaywrightClient(manager) {
|
|
4648
4790
|
if (!manager.isClientDebugMode()) {
|
|
4649
4791
|
return "Client debug mode is not active. Use debug_enter_mode with clientSide: true first.";
|
|
@@ -4663,11 +4805,11 @@ function buildClientBreakpointTools(manager) {
|
|
|
4663
4805
|
"debug_set_client_breakpoint",
|
|
4664
4806
|
"Set a breakpoint in client-side code running in headless Chromium. V8 resolves source maps automatically \u2014 use original .tsx/.ts file paths.",
|
|
4665
4807
|
{
|
|
4666
|
-
file:
|
|
4808
|
+
file: z13.string().describe(
|
|
4667
4809
|
"Original source file path (e.g., src/components/App.tsx) \u2014 source maps resolve automatically"
|
|
4668
4810
|
),
|
|
4669
|
-
line:
|
|
4670
|
-
condition:
|
|
4811
|
+
line: z13.number().describe("Line number (1-based) in the original source file"),
|
|
4812
|
+
condition: z13.string().optional().describe("JavaScript condition expression \u2014 breakpoint only triggers when truthy")
|
|
4671
4813
|
},
|
|
4672
4814
|
async ({ file, line, condition }) => {
|
|
4673
4815
|
const clientOrErr = requirePlaywrightClient(manager);
|
|
@@ -4689,7 +4831,7 @@ Breakpoint ID: ${breakpointId}${sourceMapNote}`
|
|
|
4689
4831
|
"debug_remove_client_breakpoint",
|
|
4690
4832
|
"Remove a previously set client-side breakpoint by its ID.",
|
|
4691
4833
|
{
|
|
4692
|
-
breakpointId:
|
|
4834
|
+
breakpointId: z13.string().describe("The breakpoint ID returned by debug_set_client_breakpoint")
|
|
4693
4835
|
},
|
|
4694
4836
|
async ({ breakpointId }) => {
|
|
4695
4837
|
const clientOrErr = requirePlaywrightClient(manager);
|
|
@@ -4769,8 +4911,8 @@ ${JSON.stringify(queuedHits, null, 2)}`
|
|
|
4769
4911
|
"debug_evaluate_client",
|
|
4770
4912
|
"Evaluate a JavaScript expression in the browser context. When paused, runs in the paused frame's scope; otherwise the page's global scope. Side effects execute \u2014 prefer read-only.",
|
|
4771
4913
|
{
|
|
4772
|
-
expression:
|
|
4773
|
-
frameIndex:
|
|
4914
|
+
expression: z13.string().describe("JavaScript expression to evaluate in the browser context"),
|
|
4915
|
+
frameIndex: z13.number().optional().describe("Call stack frame index (0 = top frame). Defaults to the top frame.")
|
|
4774
4916
|
},
|
|
4775
4917
|
async ({ expression, frameIndex }) => {
|
|
4776
4918
|
const clientOrErr = requirePlaywrightClient(manager);
|
|
@@ -4843,7 +4985,7 @@ function buildClientInteractionTools(manager) {
|
|
|
4843
4985
|
"debug_navigate_client",
|
|
4844
4986
|
"Navigate the headless browser to a URL. Waits for domcontentloaded (Playwright's default ~30s timeout applies).",
|
|
4845
4987
|
{
|
|
4846
|
-
url:
|
|
4988
|
+
url: z13.string().describe("URL to navigate to (e.g., http://localhost:3000/dashboard)")
|
|
4847
4989
|
},
|
|
4848
4990
|
async ({ url }) => {
|
|
4849
4991
|
const clientOrErr = requirePlaywrightClient(manager);
|
|
@@ -4860,7 +5002,7 @@ function buildClientInteractionTools(manager) {
|
|
|
4860
5002
|
"debug_click_client",
|
|
4861
5003
|
"Click an element in the headless browser by CSS selector. Playwright auto-waits for visibility/stability/enabled up to 10s \u2014 a miss throws with a failure message.",
|
|
4862
5004
|
{
|
|
4863
|
-
selector:
|
|
5005
|
+
selector: z13.string().describe(
|
|
4864
5006
|
"CSS selector of the element to click (e.g., 'button.submit', '#login-form input[type=submit]')"
|
|
4865
5007
|
)
|
|
4866
5008
|
},
|
|
@@ -4882,8 +5024,8 @@ function buildClientConsoleTool(manager) {
|
|
|
4882
5024
|
"debug_get_client_console",
|
|
4883
5025
|
"Get console messages captured from the headless browser. Includes console.log, warn, error, etc.",
|
|
4884
5026
|
{
|
|
4885
|
-
level:
|
|
4886
|
-
limit:
|
|
5027
|
+
level: z13.string().optional().describe("Filter by console level: log, warn, error, info, debug"),
|
|
5028
|
+
limit: z13.number().optional().describe("Maximum number of recent messages to return (default: all)")
|
|
4887
5029
|
},
|
|
4888
5030
|
// oxlint-disable-next-line require-await
|
|
4889
5031
|
async ({ level, limit }) => {
|
|
@@ -4910,8 +5052,8 @@ function buildClientNetworkTool(manager) {
|
|
|
4910
5052
|
"debug_get_client_network",
|
|
4911
5053
|
"Get network requests captured from the headless browser. Shows URLs, methods, status codes, and timing.",
|
|
4912
5054
|
{
|
|
4913
|
-
filter:
|
|
4914
|
-
limit:
|
|
5055
|
+
filter: z13.string().optional().describe("Regex pattern to filter requests by URL"),
|
|
5056
|
+
limit: z13.number().optional().describe("Maximum number of recent requests to return (default: all)")
|
|
4915
5057
|
},
|
|
4916
5058
|
// oxlint-disable-next-line require-await
|
|
4917
5059
|
async ({ filter, limit }) => {
|
|
@@ -4939,7 +5081,7 @@ function buildClientErrorsTool(manager) {
|
|
|
4939
5081
|
"debug_get_client_errors",
|
|
4940
5082
|
"Get uncaught errors captured from the headless browser. Includes error messages and source-mapped stack traces.",
|
|
4941
5083
|
{
|
|
4942
|
-
limit:
|
|
5084
|
+
limit: z13.number().optional().describe("Maximum number of recent errors to return (default: all)")
|
|
4943
5085
|
},
|
|
4944
5086
|
// oxlint-disable-next-line require-await
|
|
4945
5087
|
async ({ limit }) => {
|
|
@@ -5033,12 +5175,12 @@ function buildDebugLifecycleTools(manager) {
|
|
|
5033
5175
|
"debug_enter_mode",
|
|
5034
5176
|
"Activate debug mode. Default: server-only (Node --inspect via CDP). Set clientSide=true (previewUrl required) or both flags for full-stack (adds headless Chromium via Playwright).",
|
|
5035
5177
|
{
|
|
5036
|
-
hypothesis:
|
|
5037
|
-
serverSide:
|
|
5178
|
+
hypothesis: z14.string().optional().describe("Your hypothesis about the bug \u2014 helps track debugging intent"),
|
|
5179
|
+
serverSide: z14.boolean().optional().describe(
|
|
5038
5180
|
"Enable server-side Node.js debugging (default: true if clientSide is not set)"
|
|
5039
5181
|
),
|
|
5040
|
-
clientSide:
|
|
5041
|
-
previewUrl:
|
|
5182
|
+
clientSide: z14.boolean().optional().describe("Enable client-side browser debugging via headless Chromium + Playwright"),
|
|
5183
|
+
previewUrl: z14.string().optional().describe(
|
|
5042
5184
|
"Preview URL for client-side debugging (e.g., http://localhost:3000). Required when clientSide is true."
|
|
5043
5185
|
)
|
|
5044
5186
|
},
|
|
@@ -5074,9 +5216,9 @@ function buildBreakpointTools(manager) {
|
|
|
5074
5216
|
"debug_set_breakpoint",
|
|
5075
5217
|
"Set a breakpoint at the specified file and line number. Optionally provide a condition expression that must evaluate to true for the breakpoint to pause execution.",
|
|
5076
5218
|
{
|
|
5077
|
-
file:
|
|
5078
|
-
line:
|
|
5079
|
-
condition:
|
|
5219
|
+
file: z14.string().describe("Absolute or relative file path to set the breakpoint in"),
|
|
5220
|
+
line: z14.number().describe("Line number (1-based) to set the breakpoint on"),
|
|
5221
|
+
condition: z14.string().optional().describe("JavaScript condition expression \u2014 breakpoint only triggers when truthy")
|
|
5080
5222
|
},
|
|
5081
5223
|
async ({ file, line, condition }) => {
|
|
5082
5224
|
const clientOrErr = requireDebugClient2(manager);
|
|
@@ -5098,7 +5240,7 @@ Breakpoint ID: ${breakpointId}`
|
|
|
5098
5240
|
"debug_remove_breakpoint",
|
|
5099
5241
|
"Remove a previously set breakpoint by its ID.",
|
|
5100
5242
|
{
|
|
5101
|
-
breakpointId:
|
|
5243
|
+
breakpointId: z14.string().describe("The breakpoint ID returned by debug_set_breakpoint")
|
|
5102
5244
|
},
|
|
5103
5245
|
async ({ breakpointId }) => {
|
|
5104
5246
|
const clientOrErr = requireDebugClient2(manager);
|
|
@@ -5179,8 +5321,8 @@ ${JSON.stringify(queuedHits, null, 2)}`
|
|
|
5179
5321
|
"debug_evaluate",
|
|
5180
5322
|
"Evaluate a JavaScript expression server-side in the Node process. When paused, runs in the frame's scope (frameIndex selects frame). Side effects execute \u2014 prefer read-only.",
|
|
5181
5323
|
{
|
|
5182
|
-
expression:
|
|
5183
|
-
frameIndex:
|
|
5324
|
+
expression: z14.string().describe("The JavaScript expression to evaluate"),
|
|
5325
|
+
frameIndex: z14.number().optional().describe("Call stack frame index (0 = top frame). Defaults to the top frame.")
|
|
5184
5326
|
},
|
|
5185
5327
|
async ({ expression, frameIndex }) => {
|
|
5186
5328
|
const clientOrErr = requireDebugClient2(manager);
|
|
@@ -5208,12 +5350,12 @@ function buildProbeManagementTools(manager) {
|
|
|
5208
5350
|
"debug_add_probe",
|
|
5209
5351
|
"Add a debug probe at a code location. Captures expression values each time the line executes, without pausing or modifying source. Auto-cleaned on debug exit.",
|
|
5210
5352
|
{
|
|
5211
|
-
file:
|
|
5212
|
-
line:
|
|
5213
|
-
expressions:
|
|
5353
|
+
file: z14.string().describe("File path to probe"),
|
|
5354
|
+
line: z14.number().describe("Line number (1-based) to probe"),
|
|
5355
|
+
expressions: z14.array(z14.string()).describe(
|
|
5214
5356
|
'JavaScript expressions to capture when the line executes (e.g., ["req.params.id", "user.role"])'
|
|
5215
5357
|
),
|
|
5216
|
-
label:
|
|
5358
|
+
label: z14.string().optional().describe("Optional label for this probe (defaults to file:line)")
|
|
5217
5359
|
},
|
|
5218
5360
|
async ({ file, line, expressions, label }) => {
|
|
5219
5361
|
const clientOrErr = requireDebugClient2(manager);
|
|
@@ -5238,7 +5380,7 @@ Trigger the code path, then use debug_get_probe_results to see captured values.`
|
|
|
5238
5380
|
"debug_remove_probe",
|
|
5239
5381
|
"Remove a previously set debug probe by its ID.",
|
|
5240
5382
|
{
|
|
5241
|
-
probeId:
|
|
5383
|
+
probeId: z14.string().describe("The probe ID returned by debug_add_probe")
|
|
5242
5384
|
},
|
|
5243
5385
|
async ({ probeId }) => {
|
|
5244
5386
|
const clientOrErr = requireDebugClient2(manager);
|
|
@@ -5278,9 +5420,9 @@ function buildProbeResultTools(manager) {
|
|
|
5278
5420
|
"debug_get_probe_results",
|
|
5279
5421
|
"Fetch captured probe hit data. Filter by label (wins) or probeId. Returns grouped text with per-probe hit count, timestamps, and captured expression values.",
|
|
5280
5422
|
{
|
|
5281
|
-
probeId:
|
|
5282
|
-
label:
|
|
5283
|
-
limit:
|
|
5423
|
+
probeId: z14.string().optional().describe("Filter results by probe ID (resolves to its label)"),
|
|
5424
|
+
label: z14.string().optional().describe("Filter results by probe label"),
|
|
5425
|
+
limit: z14.number().optional().describe("Maximum number of recent hits to return (default: all)")
|
|
5284
5426
|
},
|
|
5285
5427
|
async ({ probeId, label, limit }) => {
|
|
5286
5428
|
const clientOrErr = requireDebugClient2(manager);
|
|
@@ -5503,9 +5645,6 @@ async function processAssistantEvent(event, host, turnToolCalls) {
|
|
|
5503
5645
|
await host.callbacks.onEvent({ type: "tool_use", tool: block.name, input: inputStr });
|
|
5504
5646
|
}
|
|
5505
5647
|
}
|
|
5506
|
-
if (turnTextParts.length > 0) {
|
|
5507
|
-
host.connection.postChatMessage(turnTextParts.join("\n\n"));
|
|
5508
|
-
}
|
|
5509
5648
|
}
|
|
5510
5649
|
var API_ERROR_PATTERN = /API Error: (?:[45]\d\d|terminated)/;
|
|
5511
5650
|
var IMAGE_ERROR_PATTERN = /Could not process image/i;
|
|
@@ -6235,7 +6374,7 @@ function taskIdToSessionUuid(taskId) {
|
|
|
6235
6374
|
function sessionFileExists(sessionUuid, cwd) {
|
|
6236
6375
|
try {
|
|
6237
6376
|
const cwdSlug = cwd.replace(/\//g, "-");
|
|
6238
|
-
const sessionFile =
|
|
6377
|
+
const sessionFile = join3(homedir(), ".claude", "projects", cwdSlug, `${sessionUuid}.jsonl`);
|
|
6239
6378
|
return existsSync(sessionFile);
|
|
6240
6379
|
} catch {
|
|
6241
6380
|
return false;
|
|
@@ -6901,7 +7040,7 @@ var QueryBridge = class {
|
|
|
6901
7040
|
|
|
6902
7041
|
// src/runner/session-runner-helpers.ts
|
|
6903
7042
|
import { readFileSync as readFileSync2 } from "fs";
|
|
6904
|
-
import { dirname, join as
|
|
7043
|
+
import { dirname, join as join4 } from "path";
|
|
6905
7044
|
import { fileURLToPath } from "url";
|
|
6906
7045
|
function mapChatHistory(messages) {
|
|
6907
7046
|
if (!messages) return [];
|
|
@@ -6930,7 +7069,7 @@ function readAgentVersion() {
|
|
|
6930
7069
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
6931
7070
|
for (const rel of ["../package.json", "../../package.json"]) {
|
|
6932
7071
|
try {
|
|
6933
|
-
const pkg = JSON.parse(readFileSync2(
|
|
7072
|
+
const pkg = JSON.parse(readFileSync2(join4(here, rel), "utf-8"));
|
|
6934
7073
|
if (pkg.version) return pkg.version;
|
|
6935
7074
|
} catch {
|
|
6936
7075
|
}
|
|
@@ -7943,13 +8082,13 @@ var CommitWatcher = class {
|
|
|
7943
8082
|
// src/runner/worktree.ts
|
|
7944
8083
|
import { execSync as execSync4 } from "child_process";
|
|
7945
8084
|
import { existsSync as existsSync2 } from "fs";
|
|
7946
|
-
import { join as
|
|
8085
|
+
import { join as join5 } from "path";
|
|
7947
8086
|
var WORKTREE_DIR = ".worktrees";
|
|
7948
8087
|
function ensureWorktree(projectDir, taskId, branch) {
|
|
7949
8088
|
if (projectDir.includes(`/${WORKTREE_DIR}/`)) {
|
|
7950
8089
|
return projectDir;
|
|
7951
8090
|
}
|
|
7952
|
-
const worktreePath =
|
|
8091
|
+
const worktreePath = join5(projectDir, WORKTREE_DIR, taskId);
|
|
7953
8092
|
if (existsSync2(worktreePath)) {
|
|
7954
8093
|
if (branch) {
|
|
7955
8094
|
if (hasUncommittedChanges(worktreePath)) {
|
|
@@ -7995,7 +8134,7 @@ function detachWorktreeBranch(projectDir, branch) {
|
|
|
7995
8134
|
}
|
|
7996
8135
|
}
|
|
7997
8136
|
function removeWorktree(projectDir, taskId) {
|
|
7998
|
-
const worktreePath =
|
|
8137
|
+
const worktreePath = join5(projectDir, WORKTREE_DIR, taskId);
|
|
7999
8138
|
if (!existsSync2(worktreePath)) return;
|
|
8000
8139
|
try {
|
|
8001
8140
|
execSync4(`git worktree remove "${worktreePath}" --force`, {
|
|
@@ -8066,10 +8205,10 @@ function runStartCommand(cmd, cwd, onOutput) {
|
|
|
8066
8205
|
}
|
|
8067
8206
|
|
|
8068
8207
|
// src/tools/project-tools.ts
|
|
8069
|
-
import { z as
|
|
8208
|
+
import { z as z16 } from "zod";
|
|
8070
8209
|
|
|
8071
8210
|
// src/tools/project-action-tools.ts
|
|
8072
|
-
import { z as
|
|
8211
|
+
import { z as z15 } from "zod";
|
|
8073
8212
|
var SP_DESCRIPTION3 = "Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)";
|
|
8074
8213
|
function withRequestingUser(payload, getRequestingUserId) {
|
|
8075
8214
|
const requestingUserId = getRequestingUserId();
|
|
@@ -8081,10 +8220,10 @@ function buildCreateTaskTool(connection, getRequestingUserId) {
|
|
|
8081
8220
|
"create_task",
|
|
8082
8221
|
"Create a new task in the project.",
|
|
8083
8222
|
{
|
|
8084
|
-
title:
|
|
8085
|
-
description:
|
|
8086
|
-
plan:
|
|
8087
|
-
status:
|
|
8223
|
+
title: z15.string().describe("Task title"),
|
|
8224
|
+
description: z15.string().optional().describe("Task description"),
|
|
8225
|
+
plan: z15.string().optional().describe("Implementation plan in markdown"),
|
|
8226
|
+
status: z15.string().optional().describe("Initial status (default: Planning)")
|
|
8088
8227
|
},
|
|
8089
8228
|
async (params) => {
|
|
8090
8229
|
try {
|
|
@@ -8105,12 +8244,12 @@ function buildUpdateProjectTaskTool(connection, getRequestingUserId) {
|
|
|
8105
8244
|
"update_project_task",
|
|
8106
8245
|
"Update an existing task's title, description, plan, status, or assignee. Project-runner scope.",
|
|
8107
8246
|
{
|
|
8108
|
-
task_id:
|
|
8109
|
-
title:
|
|
8110
|
-
description:
|
|
8111
|
-
plan:
|
|
8112
|
-
status:
|
|
8113
|
-
assignedUserId:
|
|
8247
|
+
task_id: z15.string().describe("The task ID to update"),
|
|
8248
|
+
title: z15.string().optional().describe("New title"),
|
|
8249
|
+
description: z15.string().optional().describe("New description"),
|
|
8250
|
+
plan: z15.string().optional().describe("New plan in markdown"),
|
|
8251
|
+
status: z15.string().optional().describe("New status"),
|
|
8252
|
+
assignedUserId: z15.string().nullable().optional().describe("Assign to user ID, or null to unassign")
|
|
8114
8253
|
},
|
|
8115
8254
|
async ({ task_id, ...fields }) => {
|
|
8116
8255
|
try {
|
|
@@ -8131,9 +8270,9 @@ function buildUpdateTaskPlanTool(connection, getRequestingUserId) {
|
|
|
8131
8270
|
"update_task_plan",
|
|
8132
8271
|
"Save a plan or description to a task. Convenience wrapper around update_project_task for the common Plan-mode case.",
|
|
8133
8272
|
{
|
|
8134
|
-
task_id:
|
|
8135
|
-
plan:
|
|
8136
|
-
description:
|
|
8273
|
+
task_id: z15.string().describe("The task ID to update"),
|
|
8274
|
+
plan: z15.string().optional().describe("The task plan in markdown"),
|
|
8275
|
+
description: z15.string().optional().describe("Updated task description")
|
|
8137
8276
|
},
|
|
8138
8277
|
async ({ task_id, plan, description }) => {
|
|
8139
8278
|
try {
|
|
@@ -8162,8 +8301,8 @@ function buildForceUpdateStatusTool(connection, getRequestingUserId) {
|
|
|
8162
8301
|
"force_update_task_status",
|
|
8163
8302
|
"EMERGENCY ONLY: force-override a task's Kanban status. Use when an automatic transition failed and the task is wedged. Normal flow transitions status automatically.",
|
|
8164
8303
|
{
|
|
8165
|
-
task_id:
|
|
8166
|
-
status:
|
|
8304
|
+
task_id: z15.string().describe("The task ID to update"),
|
|
8305
|
+
status: z15.enum(["Planning", "Open", "InProgress", "ReviewPR", "ReviewDev", "ReviewLive", "Complete"]).describe("The new status for the task")
|
|
8167
8306
|
},
|
|
8168
8307
|
async ({ task_id, status }) => {
|
|
8169
8308
|
try {
|
|
@@ -8184,12 +8323,12 @@ function buildCreateSubtaskTool2(connection, getRequestingUserId) {
|
|
|
8184
8323
|
"create_subtask",
|
|
8185
8324
|
"Create a subtask under a parent task in this project. Use for breaking parent tasks into smaller pieces during planning.",
|
|
8186
8325
|
{
|
|
8187
|
-
parent_task_id:
|
|
8188
|
-
title:
|
|
8189
|
-
description:
|
|
8190
|
-
plan:
|
|
8191
|
-
ordinal:
|
|
8192
|
-
storyPointValue:
|
|
8326
|
+
parent_task_id: z15.string().describe("The parent task ID"),
|
|
8327
|
+
title: z15.string().describe("Subtask title"),
|
|
8328
|
+
description: z15.string().optional().describe("Brief description"),
|
|
8329
|
+
plan: z15.string().optional().describe("Implementation plan in markdown"),
|
|
8330
|
+
ordinal: z15.number().optional().describe("Step/order number (0-based)"),
|
|
8331
|
+
storyPointValue: z15.number().optional().describe(SP_DESCRIPTION3)
|
|
8193
8332
|
},
|
|
8194
8333
|
async ({ parent_task_id, title, description, plan, ordinal, storyPointValue }) => {
|
|
8195
8334
|
try {
|
|
@@ -8221,13 +8360,13 @@ function buildUpdateSubtaskTool2(connection, getRequestingUserId) {
|
|
|
8221
8360
|
"update_subtask",
|
|
8222
8361
|
"Update an existing subtask's fields (title, description, plan, status, ordinal, storyPointValue).",
|
|
8223
8362
|
{
|
|
8224
|
-
subtask_id:
|
|
8225
|
-
title:
|
|
8226
|
-
description:
|
|
8227
|
-
plan:
|
|
8228
|
-
status:
|
|
8229
|
-
ordinal:
|
|
8230
|
-
storyPointValue:
|
|
8363
|
+
subtask_id: z15.string().describe("The subtask ID to update"),
|
|
8364
|
+
title: z15.string().optional(),
|
|
8365
|
+
description: z15.string().optional(),
|
|
8366
|
+
plan: z15.string().optional(),
|
|
8367
|
+
status: z15.string().optional(),
|
|
8368
|
+
ordinal: z15.number().optional(),
|
|
8369
|
+
storyPointValue: z15.number().optional().describe(SP_DESCRIPTION3)
|
|
8231
8370
|
},
|
|
8232
8371
|
async ({ subtask_id, ...fields }) => {
|
|
8233
8372
|
try {
|
|
@@ -8247,7 +8386,7 @@ function buildDeleteSubtaskTool2(connection, getRequestingUserId) {
|
|
|
8247
8386
|
return defineTool(
|
|
8248
8387
|
"delete_subtask",
|
|
8249
8388
|
"Delete a subtask by id. Use when a subtask was created in error or is no longer needed.",
|
|
8250
|
-
{ subtask_id:
|
|
8389
|
+
{ subtask_id: z15.string().describe("The subtask ID to delete") },
|
|
8251
8390
|
async ({ subtask_id }) => {
|
|
8252
8391
|
try {
|
|
8253
8392
|
await connection.call(
|
|
@@ -8266,7 +8405,7 @@ function buildStartTaskTool(connection, getRequestingUserId) {
|
|
|
8266
8405
|
return defineTool(
|
|
8267
8406
|
"start_task",
|
|
8268
8407
|
"Start a cloud build (codespace) for a task. Preconditions: task has a story point value and an agent assigned.",
|
|
8269
|
-
{ task_id:
|
|
8408
|
+
{ task_id: z15.string().describe("The task ID to start a build for") },
|
|
8270
8409
|
async ({ task_id }) => {
|
|
8271
8410
|
try {
|
|
8272
8411
|
const result = await connection.call(
|
|
@@ -8287,7 +8426,7 @@ function buildStopTaskTool(connection, getRequestingUserId) {
|
|
|
8287
8426
|
return defineTool(
|
|
8288
8427
|
"stop_task",
|
|
8289
8428
|
"Send a stop signal to a running task's cloud build. Not a force-kill \u2014 the agent may take a moment to wind down.",
|
|
8290
|
-
{ task_id:
|
|
8429
|
+
{ task_id: z15.string().describe("The task ID whose build should be stopped") },
|
|
8291
8430
|
async ({ task_id }) => {
|
|
8292
8431
|
try {
|
|
8293
8432
|
await connection.call(
|
|
@@ -8306,7 +8445,7 @@ function buildMergePRTool(connection, getRequestingUserId) {
|
|
|
8306
8445
|
return defineTool(
|
|
8307
8446
|
"merge_pr",
|
|
8308
8447
|
"Approve and merge a task's PR. Preconditions: task in ReviewPR with an open PR. Returns { merged }: false means automerge queued \u2014 wait for status to flip to ReviewDev.",
|
|
8309
|
-
{ task_id:
|
|
8448
|
+
{ task_id: z15.string().describe("The task ID whose PR should be approved and merged") },
|
|
8310
8449
|
async ({ task_id }) => {
|
|
8311
8450
|
try {
|
|
8312
8451
|
const result = await connection.call(
|
|
@@ -8333,9 +8472,9 @@ function buildCreateSuggestionTool2(connection, getRequestingUserId) {
|
|
|
8333
8472
|
"create_suggestion",
|
|
8334
8473
|
"Suggest a feature, improvement, rule, or idea for the project. Duplicates are deduped and your upvote is recorded.",
|
|
8335
8474
|
{
|
|
8336
|
-
title:
|
|
8337
|
-
description:
|
|
8338
|
-
tag_names:
|
|
8475
|
+
title: z15.string().describe("Short title for the suggestion"),
|
|
8476
|
+
description: z15.string().optional().describe("1-2 sentence description of what should change and why."),
|
|
8477
|
+
tag_names: z15.array(z15.string()).optional().describe("Tag names to categorize the suggestion")
|
|
8339
8478
|
},
|
|
8340
8479
|
async ({ title, description, tag_names }) => {
|
|
8341
8480
|
try {
|
|
@@ -8369,8 +8508,8 @@ function buildVoteSuggestionTool2(connection, getRequestingUserId) {
|
|
|
8369
8508
|
"vote_suggestion",
|
|
8370
8509
|
"Vote +1 or -1 on a project suggestion.",
|
|
8371
8510
|
{
|
|
8372
|
-
suggestion_id:
|
|
8373
|
-
value:
|
|
8511
|
+
suggestion_id: z15.string().describe("The suggestion ID to vote on"),
|
|
8512
|
+
value: z15.number().refine((v) => v === 1 || v === -1, { message: "Value must be 1 or -1" }).describe("+1 to upvote, -1 to downvote")
|
|
8374
8513
|
},
|
|
8375
8514
|
async ({ suggestion_id, value }) => {
|
|
8376
8515
|
try {
|
|
@@ -8398,8 +8537,8 @@ function buildAddDependencyTool2(connection, getRequestingUserId) {
|
|
|
8398
8537
|
"add_dependency",
|
|
8399
8538
|
"Add a blocking dependency \u2014 a task cannot start until the named task is merged to dev.",
|
|
8400
8539
|
{
|
|
8401
|
-
task_id:
|
|
8402
|
-
depends_on_slug_or_id:
|
|
8540
|
+
task_id: z15.string().describe("The task that should be blocked"),
|
|
8541
|
+
depends_on_slug_or_id: z15.string().describe("Slug or ID of the task this task depends on")
|
|
8403
8542
|
},
|
|
8404
8543
|
async ({ task_id, depends_on_slug_or_id }) => {
|
|
8405
8544
|
try {
|
|
@@ -8429,8 +8568,8 @@ function buildRemoveDependencyTool2(connection, getRequestingUserId) {
|
|
|
8429
8568
|
"remove_dependency",
|
|
8430
8569
|
"Remove a previously added dependency from a task.",
|
|
8431
8570
|
{
|
|
8432
|
-
task_id:
|
|
8433
|
-
depends_on_slug_or_id:
|
|
8571
|
+
task_id: z15.string().describe("The task to update"),
|
|
8572
|
+
depends_on_slug_or_id: z15.string().describe("Slug or ID of the task to remove as dependency")
|
|
8434
8573
|
},
|
|
8435
8574
|
async ({ task_id, depends_on_slug_or_id }) => {
|
|
8436
8575
|
try {
|
|
@@ -8481,9 +8620,9 @@ function buildListTasksTool(connection) {
|
|
|
8481
8620
|
"list_tasks",
|
|
8482
8621
|
"List tasks in the project. Optionally filter by status or assignee.",
|
|
8483
8622
|
{
|
|
8484
|
-
status:
|
|
8485
|
-
assigneeId:
|
|
8486
|
-
limit:
|
|
8623
|
+
status: z16.string().optional().describe("Filter by task status"),
|
|
8624
|
+
assigneeId: z16.string().optional().describe("Filter by assigned user ID"),
|
|
8625
|
+
limit: z16.number().optional().describe("Max number of tasks to return (default 50)")
|
|
8487
8626
|
},
|
|
8488
8627
|
async (params) => {
|
|
8489
8628
|
try {
|
|
@@ -8501,7 +8640,7 @@ function buildGetProjectTaskTool(connection) {
|
|
|
8501
8640
|
return defineTool(
|
|
8502
8641
|
"get_project_task",
|
|
8503
8642
|
"Get detailed information about a task in this project (chat messages, child tasks, session). Project-runner scope.",
|
|
8504
|
-
{ task_id:
|
|
8643
|
+
{ task_id: z16.string().describe("The task ID to look up") },
|
|
8505
8644
|
async ({ task_id }) => {
|
|
8506
8645
|
try {
|
|
8507
8646
|
const task = await connection.call("getProjectTask", { projectId, taskId: task_id });
|
|
@@ -8519,10 +8658,10 @@ function buildSearchTasksTool(connection) {
|
|
|
8519
8658
|
"search_tasks",
|
|
8520
8659
|
"Search tasks by tags, text query, or status filters.",
|
|
8521
8660
|
{
|
|
8522
|
-
tagNames:
|
|
8523
|
-
searchQuery:
|
|
8524
|
-
statusFilters:
|
|
8525
|
-
limit:
|
|
8661
|
+
tagNames: z16.array(z16.string()).optional().describe("Filter by tag names"),
|
|
8662
|
+
searchQuery: z16.string().optional().describe("Text search in title/description"),
|
|
8663
|
+
statusFilters: z16.array(z16.string()).optional().describe("Filter by statuses"),
|
|
8664
|
+
limit: z16.number().optional().describe("Max results (default 20)")
|
|
8526
8665
|
},
|
|
8527
8666
|
async (params) => {
|
|
8528
8667
|
try {
|
|
@@ -8540,7 +8679,7 @@ function buildListSubtasksTool2(connection) {
|
|
|
8540
8679
|
return defineTool(
|
|
8541
8680
|
"list_subtasks",
|
|
8542
8681
|
"List the immediate child tasks under a parent task. Use to coordinate subtask work \u2014 see status, ordering, and PR state.",
|
|
8543
|
-
{ task_id:
|
|
8682
|
+
{ task_id: z16.string().describe("Parent task ID") },
|
|
8544
8683
|
async ({ task_id }) => {
|
|
8545
8684
|
try {
|
|
8546
8685
|
const subtasks = await connection.call("listProjectSubtasks", {
|
|
@@ -8595,8 +8734,8 @@ function buildPostToChatTool2(connection, getRequestingUserId) {
|
|
|
8595
8734
|
"post_to_chat",
|
|
8596
8735
|
"Post an out-of-band message into a chat. Omit task_id to post into the project chat; pass task_id to post into a specific task's chat. Normal replies already appear in chat automatically.",
|
|
8597
8736
|
{
|
|
8598
|
-
message:
|
|
8599
|
-
task_id:
|
|
8737
|
+
message: z16.string().describe("The message content to post"),
|
|
8738
|
+
task_id: z16.string().optional().describe("Task ID to post into a specific task's chat. Omit for the project chat.")
|
|
8600
8739
|
},
|
|
8601
8740
|
async ({ message, task_id }) => {
|
|
8602
8741
|
try {
|
|
@@ -8624,8 +8763,8 @@ function buildReadChatHistoryTool(connection) {
|
|
|
8624
8763
|
"read_chat_history",
|
|
8625
8764
|
"Read recent messages from a chat. Omit chat_id to read the project chat; pass a chat_id to read a specific chat.",
|
|
8626
8765
|
{
|
|
8627
|
-
chat_id:
|
|
8628
|
-
limit:
|
|
8766
|
+
chat_id: z16.string().optional().describe("Chat ID to read. Omit for the project chat."),
|
|
8767
|
+
limit: z16.number().optional().describe("Number of recent messages to fetch (default 50)")
|
|
8629
8768
|
},
|
|
8630
8769
|
async ({ chat_id, limit }) => {
|
|
8631
8770
|
try {
|
|
@@ -8648,8 +8787,8 @@ function buildReadTaskChatTool2(connection) {
|
|
|
8648
8787
|
"read_task_chat",
|
|
8649
8788
|
"Read recent human/user chat messages for a specific task in this project. For agent execution logs use get_task_logs.",
|
|
8650
8789
|
{
|
|
8651
|
-
task_id:
|
|
8652
|
-
limit:
|
|
8790
|
+
task_id: z16.string().describe("The task ID whose chat to read"),
|
|
8791
|
+
limit: z16.number().optional().describe("Number of recent messages to fetch (default 20)")
|
|
8653
8792
|
},
|
|
8654
8793
|
async ({ task_id, limit }) => {
|
|
8655
8794
|
try {
|
|
@@ -8672,9 +8811,9 @@ function buildGetTaskLogsTool(connection) {
|
|
|
8672
8811
|
"get_task_logs",
|
|
8673
8812
|
"Read CLI execution logs for a task \u2014 agent reasoning, tool calls, and setup/dev-server output. For human chat use read_task_chat.",
|
|
8674
8813
|
{
|
|
8675
|
-
task_id:
|
|
8676
|
-
source:
|
|
8677
|
-
limit:
|
|
8814
|
+
task_id: z16.string().describe("Task ID to read logs from"),
|
|
8815
|
+
source: z16.enum(["agent", "application"]).optional().describe("Filter by log source. Omit for all logs."),
|
|
8816
|
+
limit: z16.number().optional().describe("Max number of log entries to return (default 50, max 500).")
|
|
8678
8817
|
},
|
|
8679
8818
|
async ({ task_id, source, limit }) => {
|
|
8680
8819
|
try {
|
|
@@ -9665,13 +9804,13 @@ var ProjectRunner = class {
|
|
|
9665
9804
|
};
|
|
9666
9805
|
|
|
9667
9806
|
// src/setup/config.ts
|
|
9668
|
-
import { readFile as
|
|
9669
|
-
import { join as
|
|
9807
|
+
import { readFile as readFile3 } from "fs/promises";
|
|
9808
|
+
import { join as join6 } from "path";
|
|
9670
9809
|
var DEVCONTAINER_PATH = ".devcontainer/conveyor/devcontainer.json";
|
|
9671
9810
|
var DEVCONTAINER_PORT_DENY_LIST = /* @__PURE__ */ new Set([5432, 6379, 9200]);
|
|
9672
9811
|
async function loadForwardPorts(workspaceDir) {
|
|
9673
9812
|
try {
|
|
9674
|
-
const raw = await
|
|
9813
|
+
const raw = await readFile3(join6(workspaceDir, DEVCONTAINER_PATH), "utf-8");
|
|
9675
9814
|
const parsed = JSON.parse(raw);
|
|
9676
9815
|
const ports = (parsed.forwardPorts ?? []).filter(
|
|
9677
9816
|
(p) => typeof p === "number" && !DEVCONTAINER_PORT_DENY_LIST.has(p)
|
|
@@ -9758,4 +9897,4 @@ export {
|
|
|
9758
9897
|
loadConveyorConfig,
|
|
9759
9898
|
unshallowRepo
|
|
9760
9899
|
};
|
|
9761
|
-
//# sourceMappingURL=chunk-
|
|
9900
|
+
//# sourceMappingURL=chunk-VQSLHBTO.js.map
|