@rallycry/conveyor-agent 7.0.12 → 7.0.13
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-5CBPSIEV.js → chunk-3O4P2KST.js} +115 -160
- package/dist/chunk-3O4P2KST.js.map +1 -0
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/{tag-audit-handler-L7YPDXTA.js → tag-audit-handler-PACJJEDB.js} +2 -2
- package/dist/tag-audit-handler-PACJJEDB.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-5CBPSIEV.js.map +0 -1
- package/dist/tag-audit-handler-L7YPDXTA.js.map +0 -1
|
@@ -484,7 +484,7 @@ var ModeController = class {
|
|
|
484
484
|
}
|
|
485
485
|
get isReadOnly() {
|
|
486
486
|
const m = this.effectiveMode;
|
|
487
|
-
if (["discovery", "
|
|
487
|
+
if (["discovery", "help"].includes(m)) return true;
|
|
488
488
|
return m === "auto" && !this._hasExitedPlanMode;
|
|
489
489
|
}
|
|
490
490
|
get isAutoPlanning() {
|
|
@@ -492,13 +492,13 @@ var ModeController = class {
|
|
|
492
492
|
}
|
|
493
493
|
get isBuildCapable() {
|
|
494
494
|
const m = this.effectiveMode;
|
|
495
|
-
return m === "building" || m === "auto" && this._hasExitedPlanMode;
|
|
495
|
+
return m === "building" || m === "review" || m === "auto" && this._hasExitedPlanMode;
|
|
496
496
|
}
|
|
497
497
|
// ── Mode resolution ────────────────────────────────────────────────
|
|
498
498
|
/** Resolve the initial mode based on task context */
|
|
499
499
|
resolveInitialMode(context) {
|
|
500
500
|
if (this._runnerMode === "code-review") {
|
|
501
|
-
this._mode = "
|
|
501
|
+
this._mode = "review";
|
|
502
502
|
return this._mode;
|
|
503
503
|
}
|
|
504
504
|
if (this._mode === "auto" && this.canBypassPlanning(context)) {
|
|
@@ -517,8 +517,12 @@ var ModeController = class {
|
|
|
517
517
|
// ── Mode transitions ───────────────────────────────────────────────
|
|
518
518
|
/** Handle mode change from server */
|
|
519
519
|
handleModeChange(newMode) {
|
|
520
|
-
if (this._runnerMode !== "pm") return { type: "noop" };
|
|
521
520
|
if (newMode === this._mode) return { type: "noop" };
|
|
521
|
+
if (this._runnerMode === "task" && newMode === "review") {
|
|
522
|
+
this._mode = newMode;
|
|
523
|
+
return { type: "restart_query", newMode: "review" };
|
|
524
|
+
}
|
|
525
|
+
if (this._runnerMode !== "pm") return { type: "noop" };
|
|
522
526
|
this._mode = newMode;
|
|
523
527
|
this.updateExitedPlanModeFlag(newMode);
|
|
524
528
|
if (this.isBuildCapable) {
|
|
@@ -1367,7 +1371,7 @@ var RegisterProjectAgentResponseSchema = z.object({
|
|
|
1367
1371
|
agentSettings: z.record(z.string(), z.unknown()).nullable(),
|
|
1368
1372
|
branchSwitchCommand: z.string().nullable()
|
|
1369
1373
|
});
|
|
1370
|
-
var CRITICAL_AUTOMATED_SOURCES = /* @__PURE__ */ new Set(["ci_failure"]);
|
|
1374
|
+
var CRITICAL_AUTOMATED_SOURCES = /* @__PURE__ */ new Set(["ci_failure", "review_trigger"]);
|
|
1371
1375
|
|
|
1372
1376
|
// src/execution/pack-runner-prompt.ts
|
|
1373
1377
|
function findLastAgentMessageIndex(history) {
|
|
@@ -1859,8 +1863,6 @@ function buildModePrompt(agentMode, context) {
|
|
|
1859
1863
|
return buildReviewPrompt(context);
|
|
1860
1864
|
case "auto":
|
|
1861
1865
|
return buildAutoPrompt(context);
|
|
1862
|
-
case "code-review":
|
|
1863
|
-
return buildCodeReviewPrompt();
|
|
1864
1866
|
default:
|
|
1865
1867
|
return null;
|
|
1866
1868
|
}
|
|
@@ -1869,8 +1871,9 @@ function buildReviewPrompt(context) {
|
|
|
1869
1871
|
const parts = [
|
|
1870
1872
|
`
|
|
1871
1873
|
## Mode: Review`,
|
|
1872
|
-
`You are in Review mode \u2014
|
|
1873
|
-
`- You have
|
|
1874
|
+
`You are in Review mode \u2014 performing code review with fix capability.`,
|
|
1875
|
+
`- You have full write access \u2014 you can audit code, make fixes, push changes, and run tests`,
|
|
1876
|
+
`- Safety rules: no destructive operations, use --force-with-lease instead of --force`,
|
|
1874
1877
|
``
|
|
1875
1878
|
];
|
|
1876
1879
|
if (context?.isParentTask) {
|
|
@@ -1892,80 +1895,62 @@ function buildReviewPrompt(context) {
|
|
|
1892
1895
|
);
|
|
1893
1896
|
} else {
|
|
1894
1897
|
parts.push(
|
|
1895
|
-
`###
|
|
1896
|
-
`
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1898
|
+
`### Code Review Process`,
|
|
1899
|
+
`1. Run \`git diff <baseBranch>..HEAD\` to see all changes in this PR`,
|
|
1900
|
+
`2. Read the task plan to understand the intended changes`,
|
|
1901
|
+
`3. Explore the surrounding codebase to verify pattern consistency`,
|
|
1902
|
+
`4. Review against the criteria below`,
|
|
1903
|
+
``,
|
|
1904
|
+
`### Review Criteria`,
|
|
1905
|
+
`- **Correctness**: Does the code do what the plan says? Logic errors, off-by-one, race conditions?`,
|
|
1906
|
+
`- **Pattern Consistency**: Does the code follow existing patterns in the codebase? Check nearby files.`,
|
|
1907
|
+
`- **Security**: No hardcoded secrets, no injection vulnerabilities, proper input validation at boundaries.`,
|
|
1908
|
+
`- **Performance**: No unnecessary loops, no N+1 queries, no blocking in async contexts.`,
|
|
1909
|
+
`- **Error Handling**: Appropriate error handling at system boundaries. No swallowed errors.`,
|
|
1910
|
+
`- **Test Coverage**: Are new code paths tested? Edge cases covered?`,
|
|
1911
|
+
`- **TypeScript Best Practices**: Proper typing (no unnecessary \`any\`), correct React patterns, proper async/await.`,
|
|
1912
|
+
`- **Naming & Readability**: Clear names, no misleading comments, self-documenting code.`,
|
|
1913
|
+
``,
|
|
1914
|
+
`### Fix Capability`,
|
|
1915
|
+
`You have full write access. If you find issues:`,
|
|
1916
|
+
`- **Small fixes**: Make the fix directly, commit, and push. Then re-review.`,
|
|
1917
|
+
`- **Larger issues**: Use \`request_code_changes\` to flag them for the team.`,
|
|
1918
|
+
`- After pushing fixes, wait for CI to pass before approving.`,
|
|
1919
|
+
``,
|
|
1920
|
+
`### Output \u2014 You MUST do exactly ONE of:`,
|
|
1921
|
+
``,
|
|
1922
|
+
`#### If code passes review (or after you've fixed all issues):`,
|
|
1923
|
+
`Use the \`approve_code_review\` tool with a brief summary of what looks good.`,
|
|
1924
|
+
``,
|
|
1925
|
+
`#### If changes are needed that you cannot fix:`,
|
|
1926
|
+
`Use the \`request_code_changes\` tool with specific issues:`,
|
|
1927
|
+
`- Reference specific files and line numbers`,
|
|
1928
|
+
`- Explain what's wrong and suggest fixes`,
|
|
1929
|
+
`- Focus on substantive issues, not style nitpicks (linting handles that)`,
|
|
1930
|
+
``,
|
|
1931
|
+
`### Previous Review Feedback`,
|
|
1932
|
+
`If previous review feedback is present in the chat history, verify those specific issues were addressed before raising new concerns.`,
|
|
1933
|
+
``,
|
|
1934
|
+
`### Rules`,
|
|
1935
|
+
`- Do NOT re-review things CI already validates (formatting, lint rules).`,
|
|
1936
|
+
`- Be concise \u2014 actionable specifics over general observations.`,
|
|
1937
|
+
`- Max 5-7 issues per review. Prioritize the most important ones.`
|
|
1901
1938
|
);
|
|
1902
1939
|
}
|
|
1903
|
-
parts.push(
|
|
1904
|
-
``,
|
|
1905
|
-
`### General Review Guidelines`,
|
|
1906
|
-
`- For larger issues, create a follow-up task rather than fixing directly.`,
|
|
1907
|
-
`- Focus on correctness, pattern consistency, and test coverage.`,
|
|
1908
|
-
`- Be concise in feedback \u2014 actionable specifics over general observations.`,
|
|
1909
|
-
`- Goal: ensure quality, provide feedback, coordinate progression.`
|
|
1910
|
-
);
|
|
1911
1940
|
if (process.env.CLAUDESPACE_NAME) {
|
|
1912
1941
|
parts.push(
|
|
1913
1942
|
``,
|
|
1914
1943
|
`### Resource Management`,
|
|
1915
|
-
`Your pod starts with minimal resources
|
|
1916
|
-
`BEFORE running any
|
|
1917
|
-
`- **
|
|
1918
|
-
`- **
|
|
1919
|
-
`- **heavy** (4 CPU / 16 Gi) \u2014 E2E/browser automation, large parallel builds`,
|
|
1944
|
+
`Your pod starts with minimal resources. You MUST call \`scale_up_resources\``,
|
|
1945
|
+
`BEFORE running any resource-intensive operations \u2014 they WILL fail or OOM at baseline resources:`,
|
|
1946
|
+
`- **setup** \u2014 package installs, basic dev servers, light builds`,
|
|
1947
|
+
`- **build** \u2014 full dev servers, test suites, typecheck, lint, E2E tests`,
|
|
1920
1948
|
`Scaling is one-way (up only) and capped by project limits.`,
|
|
1921
|
-
`CRITICAL: Always scale to at least "
|
|
1949
|
+
`CRITICAL: Always scale to at least "setup" before running any package install command.`
|
|
1922
1950
|
);
|
|
1923
1951
|
}
|
|
1924
1952
|
return parts.join("\n");
|
|
1925
1953
|
}
|
|
1926
|
-
function buildCodeReviewPrompt() {
|
|
1927
|
-
return [
|
|
1928
|
-
`
|
|
1929
|
-
## Mode: Code Review`,
|
|
1930
|
-
`You are an automated code reviewer. A PR has passed all CI checks and you are performing a final code quality review before merge.`,
|
|
1931
|
-
``,
|
|
1932
|
-
`## Review Process`,
|
|
1933
|
-
`1. Run \`git diff <devBranch>..HEAD\` to see all changes in this PR`,
|
|
1934
|
-
`2. Read the task plan to understand the intended changes`,
|
|
1935
|
-
`3. Explore the surrounding codebase to verify pattern consistency`,
|
|
1936
|
-
`4. Review against the criteria below`,
|
|
1937
|
-
``,
|
|
1938
|
-
`### Review Criteria`,
|
|
1939
|
-
`- **Correctness**: Does the code do what the plan says? Logic errors, off-by-one, race conditions?`,
|
|
1940
|
-
`- **Pattern Consistency**: Does the code follow existing patterns in the codebase? Check nearby files.`,
|
|
1941
|
-
`- **Security**: No hardcoded secrets, no injection vulnerabilities, proper input validation at boundaries.`,
|
|
1942
|
-
`- **Performance**: No unnecessary loops, no N+1 queries, no blocking in async contexts.`,
|
|
1943
|
-
`- **Error Handling**: Appropriate error handling at system boundaries. No swallowed errors.`,
|
|
1944
|
-
`- **Test Coverage**: Are new code paths tested? Edge cases covered?`,
|
|
1945
|
-
`- **TypeScript Best Practices**: Proper typing (no unnecessary \`any\`), correct React patterns, proper async/await.`,
|
|
1946
|
-
`- **Naming & Readability**: Clear names, no misleading comments, self-documenting code.`,
|
|
1947
|
-
``,
|
|
1948
|
-
`## Output \u2014 You MUST do exactly ONE of:`,
|
|
1949
|
-
``,
|
|
1950
|
-
`### If code passes review:`,
|
|
1951
|
-
`Use the \`approve_code_review\` tool with a brief summary of what looks good.`,
|
|
1952
|
-
``,
|
|
1953
|
-
`### If changes are needed:`,
|
|
1954
|
-
`Use the \`request_code_changes\` tool with specific issues:`,
|
|
1955
|
-
`- Reference specific files and line numbers`,
|
|
1956
|
-
`- Explain what's wrong and suggest fixes`,
|
|
1957
|
-
`- Focus on substantive issues, not style nitpicks (linting handles that)`,
|
|
1958
|
-
``,
|
|
1959
|
-
`## Previous Review Feedback`,
|
|
1960
|
-
`If previous review feedback is present in the chat history, verify those specific issues were addressed before raising new concerns. Focus on whether the requested changes were implemented correctly.`,
|
|
1961
|
-
``,
|
|
1962
|
-
`## Rules`,
|
|
1963
|
-
`- You are READ-ONLY. Do NOT modify any files.`,
|
|
1964
|
-
`- Do NOT re-review things CI already validates (formatting, lint rules).`,
|
|
1965
|
-
`- Be concise \u2014 the task agent needs actionable feedback, not essays.`,
|
|
1966
|
-
`- Max 5-7 issues per review. Prioritize the most important ones.`
|
|
1967
|
-
].join("\n");
|
|
1968
|
-
}
|
|
1969
1954
|
|
|
1970
1955
|
// src/execution/system-prompt.ts
|
|
1971
1956
|
function formatProjectAgentLine(pa) {
|
|
@@ -2392,18 +2377,6 @@ ${context.plan}`);
|
|
|
2392
2377
|
}
|
|
2393
2378
|
return parts;
|
|
2394
2379
|
}
|
|
2395
|
-
function buildCodeReviewInstructions(context) {
|
|
2396
|
-
const parts = [
|
|
2397
|
-
`You are performing an automated code review for this task.`,
|
|
2398
|
-
`The PR branch is "${context.githubBranch}"${context.baseBranch ? ` based on "${context.baseBranch}"` : ""}.`,
|
|
2399
|
-
`Begin your code review by running \`git diff ${context.baseBranch ?? "dev"}..HEAD\` to see all changes.`,
|
|
2400
|
-
``,
|
|
2401
|
-
`CRITICAL: You are in Code Review mode. You are READ-ONLY \u2014 do NOT modify any files.`,
|
|
2402
|
-
`After reviewing, you MUST call exactly one of: \`approve_code_review\` or \`request_code_changes\`.`,
|
|
2403
|
-
`Do NOT go idle, ask for confirmation, or wait for instructions \u2014 complete the review and exit.`
|
|
2404
|
-
];
|
|
2405
|
-
return parts;
|
|
2406
|
-
}
|
|
2407
2380
|
function buildFreshInstructions(isPm, isAutoMode, context, agentMode) {
|
|
2408
2381
|
if (isPm && agentMode === "building") {
|
|
2409
2382
|
return [
|
|
@@ -2554,10 +2527,6 @@ function buildIdleRelaunchInstructions(context, isPm, agentMode, isAuto) {
|
|
|
2554
2527
|
function buildInstructions(mode, context, scenario, agentMode, isAuto) {
|
|
2555
2528
|
const parts = [`
|
|
2556
2529
|
## Instructions`];
|
|
2557
|
-
if (agentMode === "code-review") {
|
|
2558
|
-
parts.push(...buildCodeReviewInstructions(context));
|
|
2559
|
-
return parts;
|
|
2560
|
-
}
|
|
2561
2530
|
const isPm = mode === "pm";
|
|
2562
2531
|
if (scenario === "fresh") {
|
|
2563
2532
|
parts.push(...buildFreshInstructions(isPm, agentMode === "auto", context, agentMode));
|
|
@@ -2572,7 +2541,7 @@ function buildInstructions(mode, context, scenario, agentMode, isAuto) {
|
|
|
2572
2541
|
}
|
|
2573
2542
|
async function buildInitialPrompt(mode, context, isAuto, agentMode) {
|
|
2574
2543
|
const isPackRunner = mode === "pm" && !!isAuto && !!context.isParentTask;
|
|
2575
|
-
if (!isPackRunner
|
|
2544
|
+
if (!isPackRunner) {
|
|
2576
2545
|
const sessionRelaunch = buildRelaunchWithSession(mode, context, agentMode, isAuto);
|
|
2577
2546
|
if (sessionRelaunch) return sessionRelaunch;
|
|
2578
2547
|
}
|
|
@@ -4839,23 +4808,20 @@ function getModeTools(agentMode, connection, config, context) {
|
|
|
4839
4808
|
}
|
|
4840
4809
|
function buildConveyorTools(connection, config, context, agentMode, debugManager) {
|
|
4841
4810
|
const effectiveMode = agentMode ?? context?.agentMode ?? void 0;
|
|
4842
|
-
if (effectiveMode === "code-review") {
|
|
4843
|
-
return [
|
|
4844
|
-
buildReadTaskChatTool(connection),
|
|
4845
|
-
buildGetTaskPlanTool(connection),
|
|
4846
|
-
buildGetTaskTool(connection),
|
|
4847
|
-
buildGetTaskCliTool(connection),
|
|
4848
|
-
buildListTaskFilesTool(connection),
|
|
4849
|
-
buildGetTaskFileTool(connection),
|
|
4850
|
-
...buildCodeReviewTools(connection)
|
|
4851
|
-
];
|
|
4852
|
-
}
|
|
4853
4811
|
const commonTools = buildCommonTools(connection, config);
|
|
4854
4812
|
const modeTools = getModeTools(effectiveMode, connection, config, context);
|
|
4855
4813
|
const discoveryTools = effectiveMode === "discovery" || effectiveMode === "auto" ? buildDiscoveryTools(connection) : [];
|
|
4814
|
+
const codeReviewTools = effectiveMode === "review" ? buildCodeReviewTools(connection) : [];
|
|
4856
4815
|
const emergencyTools = [buildForceUpdateTaskStatusTool(connection)];
|
|
4857
4816
|
const debugTools = debugManager && effectiveMode === "building" ? buildDebugTools(debugManager) : [];
|
|
4858
|
-
return [
|
|
4817
|
+
return [
|
|
4818
|
+
...commonTools,
|
|
4819
|
+
...modeTools,
|
|
4820
|
+
...discoveryTools,
|
|
4821
|
+
...codeReviewTools,
|
|
4822
|
+
...emergencyTools,
|
|
4823
|
+
...debugTools
|
|
4824
|
+
];
|
|
4859
4825
|
}
|
|
4860
4826
|
function createConveyorMcpServer(harness, connection, config, context, agentMode, debugManager) {
|
|
4861
4827
|
return harness.createMcpServer({
|
|
@@ -5274,7 +5240,6 @@ function collectMissingProps(taskProps) {
|
|
|
5274
5240
|
// src/execution/tool-access.ts
|
|
5275
5241
|
var PM_PLAN_FILE_TOOLS = /* @__PURE__ */ new Set(["Write", "Edit", "MultiEdit"]);
|
|
5276
5242
|
var DESTRUCTIVE_CMD_PATTERN = /git\s+push\s+--force(?!\s*-with-lease)|git\s+reset\s+--hard|rm\s+-rf\s+\//;
|
|
5277
|
-
var CODE_REVIEW_WRITE_CMD_PATTERN = /git\s+push|git\s+commit|git\s+add|rm\s+|mv\s+|cp\s+|mkdir\s+|touch\s+|chmod\s+|chown\s+/;
|
|
5278
5243
|
var RESOURCE_HEAVY_PATTERNS = [
|
|
5279
5244
|
/\bbun\s+(install|i|add)\b/,
|
|
5280
5245
|
/\bnpm\s+(install|ci|i)\b/,
|
|
@@ -5311,48 +5276,12 @@ function handleBuildingToolAccess(toolName, input) {
|
|
|
5311
5276
|
}
|
|
5312
5277
|
return { behavior: "allow", updatedInput: input };
|
|
5313
5278
|
}
|
|
5314
|
-
function handleReviewToolAccess(toolName, input
|
|
5315
|
-
|
|
5316
|
-
return handleBuildingToolAccess(toolName, input);
|
|
5317
|
-
}
|
|
5318
|
-
if (PM_PLAN_FILE_TOOLS.has(toolName)) {
|
|
5319
|
-
if (isPlanFile(input)) {
|
|
5320
|
-
return { behavior: "allow", updatedInput: input };
|
|
5321
|
-
}
|
|
5322
|
-
return {
|
|
5323
|
-
behavior: "deny",
|
|
5324
|
-
message: "Review mode restricts file writes. Use bash to run tests and linting instead."
|
|
5325
|
-
};
|
|
5326
|
-
}
|
|
5327
|
-
if (toolName === "Bash") {
|
|
5328
|
-
const cmd = String(input.command ?? "");
|
|
5329
|
-
if (DESTRUCTIVE_CMD_PATTERN.test(cmd)) {
|
|
5330
|
-
return { behavior: "deny", message: "Destructive operation blocked in review mode." };
|
|
5331
|
-
}
|
|
5332
|
-
}
|
|
5333
|
-
return { behavior: "allow", updatedInput: input };
|
|
5334
|
-
}
|
|
5335
|
-
function handleCodeReviewToolAccess(toolName, input) {
|
|
5336
|
-
if (PM_PLAN_FILE_TOOLS.has(toolName)) {
|
|
5337
|
-
return {
|
|
5338
|
-
behavior: "deny",
|
|
5339
|
-
message: "Code review mode is fully read-only. File writes are not permitted."
|
|
5340
|
-
};
|
|
5341
|
-
}
|
|
5342
|
-
if (toolName === "Bash") {
|
|
5343
|
-
const cmd = String(input.command ?? "");
|
|
5344
|
-
if (DESTRUCTIVE_CMD_PATTERN.test(cmd) || CODE_REVIEW_WRITE_CMD_PATTERN.test(cmd)) {
|
|
5345
|
-
return {
|
|
5346
|
-
behavior: "deny",
|
|
5347
|
-
message: "Code review mode is read-only. Write operations and destructive commands are blocked."
|
|
5348
|
-
};
|
|
5349
|
-
}
|
|
5350
|
-
}
|
|
5351
|
-
return { behavior: "allow", updatedInput: input };
|
|
5279
|
+
function handleReviewToolAccess(toolName, input) {
|
|
5280
|
+
return handleBuildingToolAccess(toolName, input);
|
|
5352
5281
|
}
|
|
5353
5282
|
function handleAutoToolAccess(toolName, input, hasExitedPlanMode, isParentTask) {
|
|
5354
5283
|
if (hasExitedPlanMode) {
|
|
5355
|
-
return isParentTask ? handleReviewToolAccess(toolName, input
|
|
5284
|
+
return isParentTask ? handleReviewToolAccess(toolName, input) : handleBuildingToolAccess(toolName, input);
|
|
5356
5285
|
}
|
|
5357
5286
|
return { behavior: "allow", updatedInput: input };
|
|
5358
5287
|
}
|
|
@@ -5465,11 +5394,9 @@ function resolveToolAccess(host, toolName, input) {
|
|
|
5465
5394
|
case "building":
|
|
5466
5395
|
return handleBuildingToolAccess(toolName, input);
|
|
5467
5396
|
case "review":
|
|
5468
|
-
return handleReviewToolAccess(toolName, input
|
|
5397
|
+
return handleReviewToolAccess(toolName, input);
|
|
5469
5398
|
case "auto":
|
|
5470
5399
|
return handleAutoToolAccess(toolName, input, host.hasExitedPlanMode, host.isParentTask);
|
|
5471
|
-
case "code-review":
|
|
5472
|
-
return handleCodeReviewToolAccess(toolName, input);
|
|
5473
5400
|
default:
|
|
5474
5401
|
return { behavior: "allow", updatedInput: input };
|
|
5475
5402
|
}
|
|
@@ -5548,13 +5475,10 @@ function buildHooks(host) {
|
|
|
5548
5475
|
};
|
|
5549
5476
|
}
|
|
5550
5477
|
function isReadOnlyMode(mode, hasExitedPlanMode) {
|
|
5551
|
-
return mode === "discovery" || mode === "help" || mode === "
|
|
5478
|
+
return mode === "discovery" || mode === "help" || mode === "auto" && !hasExitedPlanMode;
|
|
5552
5479
|
}
|
|
5553
5480
|
function buildDisallowedTools(settings, mode, hasExitedPlanMode) {
|
|
5554
5481
|
const modeDisallowed = isReadOnlyMode(mode, hasExitedPlanMode) ? ["TodoWrite", "TodoRead", "NotebookEdit"] : [];
|
|
5555
|
-
if (mode === "code-review") {
|
|
5556
|
-
modeDisallowed.push("ExitPlanMode", "EnterPlanMode");
|
|
5557
|
-
}
|
|
5558
5482
|
const configured = settings.disallowedTools ?? [];
|
|
5559
5483
|
const combined = [...configured, ...modeDisallowed];
|
|
5560
5484
|
return combined.length > 0 ? combined : void 0;
|
|
@@ -5590,11 +5514,11 @@ function buildQueryOptions(host, context) {
|
|
|
5590
5514
|
},
|
|
5591
5515
|
sandbox: context.useSandbox ? { enabled: true } : { enabled: false },
|
|
5592
5516
|
hooks: buildHooks(host),
|
|
5593
|
-
maxTurns:
|
|
5517
|
+
maxTurns: settings.maxTurns,
|
|
5594
5518
|
effort: settings.effort,
|
|
5595
5519
|
thinking: settings.thinking,
|
|
5596
5520
|
betas: settings.betas,
|
|
5597
|
-
maxBudgetUsd:
|
|
5521
|
+
maxBudgetUsd: settings.maxBudgetUsd ?? 50,
|
|
5598
5522
|
abortController: host.abortController ?? void 0,
|
|
5599
5523
|
disallowedTools: buildDisallowedTools(settings, mode, host.hasExitedPlanMode),
|
|
5600
5524
|
enableFileCheckpointing: settings.enableFileCheckpointing,
|
|
@@ -6084,6 +6008,7 @@ var SessionRunner = class _SessionRunner {
|
|
|
6084
6008
|
stopped = false;
|
|
6085
6009
|
hasCompleted = false;
|
|
6086
6010
|
interrupted = false;
|
|
6011
|
+
_isReviewing = false;
|
|
6087
6012
|
taskContext = null;
|
|
6088
6013
|
fullContext = null;
|
|
6089
6014
|
queryBridge = null;
|
|
@@ -6200,6 +6125,9 @@ var SessionRunner = class _SessionRunner {
|
|
|
6200
6125
|
if (!this.stopped && this.pendingMessages.length === 0) {
|
|
6201
6126
|
await this.maybeSendPRNudge();
|
|
6202
6127
|
}
|
|
6128
|
+
if (!this.stopped && this.pendingMessages.length === 0) {
|
|
6129
|
+
await this.maybeTransitionToReview();
|
|
6130
|
+
}
|
|
6203
6131
|
if (!this.stopped) {
|
|
6204
6132
|
process.stderr.write(
|
|
6205
6133
|
`[conveyor-agent] Listening for messages (mode: ${this.mode.effectiveMode})
|
|
@@ -6290,14 +6218,7 @@ var SessionRunner = class _SessionRunner {
|
|
|
6290
6218
|
async executeInitialMode() {
|
|
6291
6219
|
if (!this.taskContext || !this.fullContext) return false;
|
|
6292
6220
|
const effectiveMode = this.mode.effectiveMode;
|
|
6293
|
-
|
|
6294
|
-
await this.setState("running");
|
|
6295
|
-
await this.callbacks.onEvent({ type: "execute_mode", mode: effectiveMode });
|
|
6296
|
-
await this.executeQuery();
|
|
6297
|
-
this.stopped = true;
|
|
6298
|
-
return true;
|
|
6299
|
-
}
|
|
6300
|
-
const shouldRun = effectiveMode === "building" || effectiveMode === "auto" || effectiveMode === "review" && this.mode.isPackRunner(this.taskContext);
|
|
6221
|
+
const shouldRun = effectiveMode === "building" || effectiveMode === "auto" || effectiveMode === "review";
|
|
6301
6222
|
if (shouldRun) {
|
|
6302
6223
|
await this.setState("running");
|
|
6303
6224
|
await this.callbacks.onEvent({ type: "execute_mode", mode: effectiveMode });
|
|
@@ -6421,6 +6342,37 @@ var SessionRunner = class _SessionRunner {
|
|
|
6421
6342
|
await this.refreshTaskContext();
|
|
6422
6343
|
}
|
|
6423
6344
|
}
|
|
6345
|
+
// ── Same-box review transition ─────────────────────────────────
|
|
6346
|
+
async maybeTransitionToReview() {
|
|
6347
|
+
if (!this.config.isAuto || this._isReviewing) return;
|
|
6348
|
+
await this.refreshTaskContext();
|
|
6349
|
+
if (!this.taskContext?.githubPRUrl || this.taskContext.status !== "ReviewPR") return;
|
|
6350
|
+
this._isReviewing = true;
|
|
6351
|
+
try {
|
|
6352
|
+
this.mode.handleModeChange("review");
|
|
6353
|
+
process.stderr.write(
|
|
6354
|
+
`[conveyor-agent] Auto-transitioning to review mode (same-box code review)
|
|
6355
|
+
`
|
|
6356
|
+
);
|
|
6357
|
+
this.connection.sendEvent({
|
|
6358
|
+
type: "mode_transition",
|
|
6359
|
+
from: "building",
|
|
6360
|
+
to: "review"
|
|
6361
|
+
});
|
|
6362
|
+
this.connection.emitModeChanged("review");
|
|
6363
|
+
const reviewPrompt = [
|
|
6364
|
+
`You have just created a PR for this task. Now perform a self-review of your changes.`,
|
|
6365
|
+
`Run \`git diff ${this.fullContext?.baseBranch ?? "dev"}..HEAD\` to see all changes.`,
|
|
6366
|
+
`Review the changes according to the review criteria in your instructions.`,
|
|
6367
|
+
`If you find issues, fix them directly, commit, and push. Then approve the review.`,
|
|
6368
|
+
`If everything looks good, approve the review using \`approve_code_review\`.`
|
|
6369
|
+
].join("\n");
|
|
6370
|
+
await this.setState("running");
|
|
6371
|
+
await this.executeQuery(reviewPrompt);
|
|
6372
|
+
} finally {
|
|
6373
|
+
this._isReviewing = false;
|
|
6374
|
+
}
|
|
6375
|
+
}
|
|
6424
6376
|
// ── Context & bridge construction ────────────────────────────────
|
|
6425
6377
|
buildFullContext(ctx) {
|
|
6426
6378
|
const chatHistory = mapChatHistory(ctx.chatHistory);
|
|
@@ -6498,6 +6450,9 @@ var SessionRunner = class _SessionRunner {
|
|
|
6498
6450
|
if (action.type === "start_auto") {
|
|
6499
6451
|
this.connection.emitModeChanged(this.mode.effectiveMode);
|
|
6500
6452
|
this.softStop();
|
|
6453
|
+
} else if (action.type === "restart_query") {
|
|
6454
|
+
this.connection.emitModeChanged(action.newMode);
|
|
6455
|
+
this.softStop();
|
|
6501
6456
|
}
|
|
6502
6457
|
});
|
|
6503
6458
|
this.connection.onWake(() => this.lifecycle.wake());
|
|
@@ -7535,7 +7490,7 @@ var ProjectRunner = class {
|
|
|
7535
7490
|
async handleAuditTags(request) {
|
|
7536
7491
|
this.connection.emitStatus("busy");
|
|
7537
7492
|
try {
|
|
7538
|
-
const { handleTagAudit } = await import("./tag-audit-handler-
|
|
7493
|
+
const { handleTagAudit } = await import("./tag-audit-handler-PACJJEDB.js");
|
|
7539
7494
|
await handleTagAudit(request, this.connection, this.projectDir);
|
|
7540
7495
|
} catch (error) {
|
|
7541
7496
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -7956,4 +7911,4 @@ export {
|
|
|
7956
7911
|
loadForwardPorts,
|
|
7957
7912
|
loadConveyorConfig
|
|
7958
7913
|
};
|
|
7959
|
-
//# sourceMappingURL=chunk-
|
|
7914
|
+
//# sourceMappingURL=chunk-3O4P2KST.js.map
|