@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.
@@ -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 stat2 = statSync(fullPath);
1237
- this.planFileSnapshot.set(fullPath, stat2.mtimeMs);
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 stat2 = statSync(fullPath);
1258
+ const stat3 = statSync(fullPath);
1259
1259
  const prevMtime = this.planFileSnapshot.get(fullPath);
1260
- const isNew = prevMtime === void 0 || stat2.mtimeMs > prevMtime;
1261
- if (isNew && (!newest || stat2.mtimeMs > newest.mtime)) {
1262
- newest = { path: fullPath, mtime: stat2.mtimeMs };
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 join2 } from "path";
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
- ...buildMutationTools(connection, config)
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 z7 } from "zod";
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: z7.string().optional().describe("The task plan in markdown"),
3867
- description: z7.string().optional().describe("Updated task 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: z7.string().describe("Subtask title"),
3889
- description: z7.string().optional().describe("Brief description"),
3890
- plan: z7.string().optional().describe("Implementation plan in markdown"),
3891
- ordinal: z7.number().optional().describe("Step/order number (0-based)"),
3892
- storyPointValue: z7.number().optional().describe(SP_DESCRIPTION)
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: z7.string().describe("The subtask ID to update"),
3919
- title: z7.string().optional(),
3920
- description: z7.string().optional(),
3921
- plan: z7.string().optional(),
3922
- ordinal: z7.number().optional(),
3923
- storyPointValue: z7.number().optional().describe(SP_DESCRIPTION)
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: z7.string().describe("The subtask ID to delete") },
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: z7.string().describe("The child task ID to start a cloud build for")
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: z7.string().describe("The child task ID whose build should be stopped")
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: z7.string().describe("The child task ID whose PR should be approved and merged")
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 z8 } from "zod";
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: z8.string().optional().describe("The new task title"),
4071
- storyPointValue: z8.number().optional().describe(SP_DESCRIPTION2),
4072
- tagNames: z8.array(z8.string()).optional().describe("Array of tag names to assign"),
4073
- githubPRUrl: z8.string().url().optional().describe("GitHub pull request URL to link to this task"),
4074
- githubBranch: z8.string().optional().describe("Set the GitHub branch name for this task (e.g. 'conveyor/my-feature-abc123')")
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 z9 } from "zod";
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: z9.string().describe("Brief summary of what was reviewed and why it looks good")
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: z9.array(
4136
- z9.object({
4137
- file: z9.string().describe("File path where the issue was found"),
4138
- line: z9.number().optional().describe("Line number (if applicable)"),
4139
- severity: z9.enum(["critical", "major", "minor"]).describe("Issue severity"),
4140
- description: z9.string().describe("What is wrong and how to fix it")
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: z9.string().describe("Brief overall summary of the review findings")
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 z12 } from "zod";
4315
+ import { z as z14 } from "zod";
4174
4316
 
4175
4317
  // src/tools/telemetry-tools.ts
4176
- import { z as z10 } from "zod";
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: z10.enum(["http", "db", "socket", "error"]).optional().describe("Filter by event type"),
4572
- urlPattern: z10.string().optional().describe("Regex pattern to filter HTTP events by URL"),
4573
- minDuration: z10.number().optional().describe("Minimum duration in ms \u2014 only return events slower than this"),
4574
- errorOnly: z10.boolean().optional().describe("Only return error events and HTTP 4xx/5xx responses"),
4575
- since: z10.number().optional().describe("Only return events after this timestamp (ms since epoch)"),
4576
- limit: z10.number().optional().describe("Max events to return (default: 20, from most recent)")
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 z11 } from "zod";
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: z11.string().describe(
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: z11.number().describe("Line number (1-based) in the original source file"),
4670
- condition: z11.string().optional().describe("JavaScript condition expression \u2014 breakpoint only triggers when truthy")
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: z11.string().describe("The breakpoint ID returned by debug_set_client_breakpoint")
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: z11.string().describe("JavaScript expression to evaluate in the browser context"),
4773
- frameIndex: z11.number().optional().describe("Call stack frame index (0 = top frame). Defaults to the top frame.")
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: z11.string().describe("URL to navigate to (e.g., http://localhost:3000/dashboard)")
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: z11.string().describe(
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: z11.string().optional().describe("Filter by console level: log, warn, error, info, debug"),
4886
- limit: z11.number().optional().describe("Maximum number of recent messages to return (default: all)")
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: z11.string().optional().describe("Regex pattern to filter requests by URL"),
4914
- limit: z11.number().optional().describe("Maximum number of recent requests to return (default: all)")
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: z11.number().optional().describe("Maximum number of recent errors to return (default: all)")
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: z12.string().optional().describe("Your hypothesis about the bug \u2014 helps track debugging intent"),
5037
- serverSide: z12.boolean().optional().describe(
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: z12.boolean().optional().describe("Enable client-side browser debugging via headless Chromium + Playwright"),
5041
- previewUrl: z12.string().optional().describe(
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: z12.string().describe("Absolute or relative file path to set the breakpoint in"),
5078
- line: z12.number().describe("Line number (1-based) to set the breakpoint on"),
5079
- condition: z12.string().optional().describe("JavaScript condition expression \u2014 breakpoint only triggers when truthy")
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: z12.string().describe("The breakpoint ID returned by debug_set_breakpoint")
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: z12.string().describe("The JavaScript expression to evaluate"),
5183
- frameIndex: z12.number().optional().describe("Call stack frame index (0 = top frame). Defaults to the top frame.")
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: z12.string().describe("File path to probe"),
5212
- line: z12.number().describe("Line number (1-based) to probe"),
5213
- expressions: z12.array(z12.string()).describe(
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: z12.string().optional().describe("Optional label for this probe (defaults to file:line)")
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: z12.string().describe("The probe ID returned by debug_add_probe")
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: z12.string().optional().describe("Filter results by probe ID (resolves to its label)"),
5282
- label: z12.string().optional().describe("Filter results by probe label"),
5283
- limit: z12.number().optional().describe("Maximum number of recent hits to return (default: all)")
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 = join2(homedir(), ".claude", "projects", cwdSlug, `${sessionUuid}.jsonl`);
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 join3 } from "path";
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(join3(here, rel), "utf-8"));
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 join4 } from "path";
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 = join4(projectDir, WORKTREE_DIR, taskId);
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 = join4(projectDir, WORKTREE_DIR, taskId);
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 z14 } from "zod";
8208
+ import { z as z16 } from "zod";
8070
8209
 
8071
8210
  // src/tools/project-action-tools.ts
8072
- import { z as z13 } from "zod";
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: z13.string().describe("Task title"),
8085
- description: z13.string().optional().describe("Task description"),
8086
- plan: z13.string().optional().describe("Implementation plan in markdown"),
8087
- status: z13.string().optional().describe("Initial status (default: Planning)")
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: z13.string().describe("The task ID to update"),
8109
- title: z13.string().optional().describe("New title"),
8110
- description: z13.string().optional().describe("New description"),
8111
- plan: z13.string().optional().describe("New plan in markdown"),
8112
- status: z13.string().optional().describe("New status"),
8113
- assignedUserId: z13.string().nullable().optional().describe("Assign to user ID, or null to unassign")
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: z13.string().describe("The task ID to update"),
8135
- plan: z13.string().optional().describe("The task plan in markdown"),
8136
- description: z13.string().optional().describe("Updated task 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: z13.string().describe("The task ID to update"),
8166
- status: z13.enum(["Planning", "Open", "InProgress", "ReviewPR", "ReviewDev", "ReviewLive", "Complete"]).describe("The new status for the task")
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: z13.string().describe("The parent task ID"),
8188
- title: z13.string().describe("Subtask title"),
8189
- description: z13.string().optional().describe("Brief description"),
8190
- plan: z13.string().optional().describe("Implementation plan in markdown"),
8191
- ordinal: z13.number().optional().describe("Step/order number (0-based)"),
8192
- storyPointValue: z13.number().optional().describe(SP_DESCRIPTION3)
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: z13.string().describe("The subtask ID to update"),
8225
- title: z13.string().optional(),
8226
- description: z13.string().optional(),
8227
- plan: z13.string().optional(),
8228
- status: z13.string().optional(),
8229
- ordinal: z13.number().optional(),
8230
- storyPointValue: z13.number().optional().describe(SP_DESCRIPTION3)
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: z13.string().describe("The subtask ID to delete") },
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: z13.string().describe("The task ID to start a build for") },
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: z13.string().describe("The task ID whose build should be stopped") },
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: z13.string().describe("The task ID whose PR should be approved and merged") },
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: z13.string().describe("Short title for the suggestion"),
8337
- description: z13.string().optional().describe("1-2 sentence description of what should change and why."),
8338
- tag_names: z13.array(z13.string()).optional().describe("Tag names to categorize the suggestion")
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: z13.string().describe("The suggestion ID to vote on"),
8373
- value: z13.number().refine((v) => v === 1 || v === -1, { message: "Value must be 1 or -1" }).describe("+1 to upvote, -1 to downvote")
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: z13.string().describe("The task that should be blocked"),
8402
- depends_on_slug_or_id: z13.string().describe("Slug or ID of the task this task depends on")
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: z13.string().describe("The task to update"),
8433
- depends_on_slug_or_id: z13.string().describe("Slug or ID of the task to remove as dependency")
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: z14.string().optional().describe("Filter by task status"),
8485
- assigneeId: z14.string().optional().describe("Filter by assigned user ID"),
8486
- limit: z14.number().optional().describe("Max number of tasks to return (default 50)")
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: z14.string().describe("The task ID to look up") },
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: z14.array(z14.string()).optional().describe("Filter by tag names"),
8523
- searchQuery: z14.string().optional().describe("Text search in title/description"),
8524
- statusFilters: z14.array(z14.string()).optional().describe("Filter by statuses"),
8525
- limit: z14.number().optional().describe("Max results (default 20)")
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: z14.string().describe("Parent 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: z14.string().describe("The message content to post"),
8599
- task_id: z14.string().optional().describe("Task ID to post into a specific task's chat. Omit for the project chat.")
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: z14.string().optional().describe("Chat ID to read. Omit for the project chat."),
8628
- limit: z14.number().optional().describe("Number of recent messages to fetch (default 50)")
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: z14.string().describe("The task ID whose chat to read"),
8652
- limit: z14.number().optional().describe("Number of recent messages to fetch (default 20)")
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: z14.string().describe("Task ID to read logs from"),
8676
- source: z14.enum(["agent", "application"]).optional().describe("Filter by log source. Omit for all logs."),
8677
- limit: z14.number().optional().describe("Max number of log entries to return (default 50, max 500).")
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 readFile2 } from "fs/promises";
9669
- import { join as join5 } from "path";
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 readFile2(join5(workspaceDir, DEVCONTAINER_PATH), "utf-8");
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-2L7ROQE6.js.map
9900
+ //# sourceMappingURL=chunk-VQSLHBTO.js.map