@pentoshi/clai 3.7.3 → 3.7.5

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.
Files changed (58) hide show
  1. package/dist/agent/confirm-port.js +3 -2
  2. package/dist/agent/confirm-port.js.map +1 -1
  3. package/dist/agent/runner.js +22 -44
  4. package/dist/agent/runner.js.map +1 -1
  5. package/dist/agent/task-evidence.js +2 -3
  6. package/dist/agent/task-evidence.js.map +1 -1
  7. package/dist/app/controllers/session-controller.d.ts +9 -0
  8. package/dist/app/controllers/session-controller.js +35 -1
  9. package/dist/app/controllers/session-controller.js.map +1 -1
  10. package/dist/commands/update.js +1 -1
  11. package/dist/llm/agentrouter.js +3 -4
  12. package/dist/llm/agentrouter.js.map +1 -1
  13. package/dist/llm/bynara.js +3 -0
  14. package/dist/llm/bynara.js.map +1 -1
  15. package/dist/llm/http.d.ts +15 -2
  16. package/dist/llm/http.js +28 -5
  17. package/dist/llm/http.js.map +1 -1
  18. package/dist/llm/nvidia.js +3 -5
  19. package/dist/llm/nvidia.js.map +1 -1
  20. package/dist/llm/router.js +4 -1
  21. package/dist/llm/router.js.map +1 -1
  22. package/dist/prompts/embedded.js +1 -1
  23. package/dist/prompts/embedded.js.map +1 -1
  24. package/dist/prompts/system.agent.md +2 -2
  25. package/dist/safety/classifier.js +54 -143
  26. package/dist/safety/classifier.js.map +1 -1
  27. package/dist/safety/patterns.d.ts +7 -7
  28. package/dist/safety/patterns.js +10 -11
  29. package/dist/safety/patterns.js.map +1 -1
  30. package/dist/tools/fs.js +3 -10
  31. package/dist/tools/fs.js.map +1 -1
  32. package/dist/tools/registry.d.ts +10 -5
  33. package/dist/tools/registry.js +88 -15
  34. package/dist/tools/registry.js.map +1 -1
  35. package/dist/tui-v2/app/commands/picker-commands.js +15 -5
  36. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
  37. package/dist/tui-v2/bootstrap/overlay-ports.d.ts +5 -0
  38. package/dist/tui-v2/bootstrap/overlay-ports.js +63 -1
  39. package/dist/tui-v2/bootstrap/overlay-ports.js.map +1 -1
  40. package/dist/tui-v2/bootstrap/start-tui-v2.js +7 -0
  41. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  42. package/dist/tui-v2/components/modal/confirm-modal.d.ts +2 -0
  43. package/dist/tui-v2/components/modal/confirm-modal.js +10 -3
  44. package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
  45. package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
  46. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  47. package/dist/tui-v2/controllers/overlay-controller.d.ts +8 -1
  48. package/dist/tui-v2/controllers/overlay-controller.js +5 -3
  49. package/dist/tui-v2/controllers/overlay-controller.js.map +1 -1
  50. package/dist/tui-v2/rendering/file-diff-view.d.ts +2 -0
  51. package/dist/tui-v2/rendering/file-diff-view.js +61 -19
  52. package/dist/tui-v2/rendering/file-diff-view.js.map +1 -1
  53. package/dist/tui-v2/state/transcript-hydrate.d.ts +19 -1
  54. package/dist/tui-v2/state/transcript-hydrate.js +108 -9
  55. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
  56. package/dist/ui/markdown.js +19 -5
  57. package/dist/ui/markdown.js.map +1 -1
  58. package/package.json +1 -1
@@ -77,8 +77,9 @@ export async function ensurePentestAuthorization(call, autoConfirm, session, con
77
77
  return true;
78
78
  }
79
79
  export async function confirmToolExecution(call, autoConfirm, session, confirmPort, options) {
80
- // Outside-cwd writes / deletes always prompt — even under allow-all / -y.
81
- if (options?.forceConfirm) {
80
+ // fs.delete + outside-cwd mutates always prompt — even under allow-all / -y.
81
+ // Deletion is irreversible; never auto-approve.
82
+ if (options?.forceConfirm || call.name === "fs.delete") {
82
83
  return confirmPort.confirmTool(call);
83
84
  }
84
85
  const config = getConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../src/agent/confirm-port.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../src/agent/confirm-port.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ import { stripSentinelTokens, parseToolCall, recognizeBareToolJson, looksLikeTru
34
34
  import { createSessionPolicy, isPreApprovalAllowedTool, isPlanModeAllowedShellCommand, isPlanModeAllowedTool, isPlanApprovedByStatus, planHasOpenWork, isAbortError, shouldEnableImageOcr, } from "./session-policy.js";
35
35
  import { saveToolOutput, summarizeOutput, formatToolContext, } from "./tool-output-formatting.js";
36
36
  import { renderPlanForTerminal, planContextMessage, handlePlanTool, resolvePlanTaskId, } from "./plan-tool.js";
37
- import { absorbLooseWorkIntoLedger, applyDestinationCwd, canMarkTaskDone, hasLocalRuntimeProof, hasRemoteWorkProof, isBatchSoftFailTool, isDevServerCall, isEvidenceWorkTool, isFeatureImplementationCall, isPackageInstallCommand, isPlanPreflightTool, isPortListeningOutput, isReadOnlyReconTool, isRemoteActiveTestCall, isRemoteObservationTask, isRemoteReconToolCall, isRuntimeObservationTask, isScaffoldCreateCommand, isServerReadyOutput, ledgerFromTaskEvidence, pickPendingTaskForToolCall, recordTaskWorkSuccess, resolveUserDestinationHint, taskEvidenceFromLedger, TOOL_ABORT_GRACE_MS, toolHardBudgetMs, toolStallBudgetMs, userAskedForFeatureApp, } from "./task-evidence.js";
37
+ import { absorbLooseWorkIntoLedger, applyDestinationCwd, canMarkTaskDone, hasLocalRuntimeProof, hasRemoteWorkProof, isDevServerCall, isEvidenceWorkTool, isFeatureImplementationCall, isPackageInstallCommand, isPlanPreflightTool, isPortListeningOutput, isReadOnlyReconTool, isRemoteActiveTestCall, isRemoteObservationTask, isRemoteReconToolCall, isRuntimeObservationTask, isScaffoldCreateCommand, isServerReadyOutput, ledgerFromTaskEvidence, pickPendingTaskForToolCall, recordTaskWorkSuccess, resolveUserDestinationHint, taskEvidenceFromLedger, TOOL_ABORT_GRACE_MS, toolHardBudgetMs, toolStallBudgetMs, userAskedForFeatureApp, } from "./task-evidence.js";
38
38
  import { buildSessionStateBlock, inferNextHint, upsertSessionStateMessage, } from "./session-state.js";
39
39
  import { detectPackageManager } from "./workspace-orient.js";
40
40
  import { budgetRemaining, consumeBudget, createRecoveryBudgets, freestyleClaimsAppReady, looksLikeShallowPentestReport, recoveryForErrorDiagnosis, recoveryForFailedProbe, recoveryForFreshness, recoveryForMissingFeature, recoveryForMissingPlan, recoveryForNarration, recoveryForPrematureComplete, recoveryForRuntimeVerify, recoveryForShallowPentest, } from "./must-continue.js";
@@ -2861,7 +2861,7 @@ export async function runAgentTurn(prompt, options = {}) {
2861
2861
  // Notice BEFORE tool cards so the transcript reads:
2862
2862
  // thinking → response → "N tool calls…" → tool cards (not tools then info).
2863
2863
  if (allCalls.length > 1) {
2864
- writeNotice("info", `${allCalls.length} tool calls in this message — running scoped (independent read-only lookups in parallel, everything else in order)`, chalk.dim(` ℹ ${allCalls.length} tool calls — read-only lookups in parallel, the rest in order\n`));
2864
+ writeNotice("info", `${allCalls.length} tool calls in this message — read-only in parallel, writes in order (failures do not cancel siblings)`, chalk.dim(` ℹ ${allCalls.length} tool calls — parallel reads, ordered writes; failures continue\n`));
2865
2865
  }
2866
2866
  for (const deferred of activeDeferredToolCalls.slice(0, allCalls.length)) {
2867
2867
  if (!deferred.call.name || deferred.call.name === "…")
@@ -2897,24 +2897,19 @@ export async function runAgentTurn(prompt, options = {}) {
2897
2897
  return false;
2898
2898
  }
2899
2899
  };
2900
- /** Tools whose failure must NOT cancel sibling calls in this turn. */
2901
- const shouldSoftFailTool = (name) => {
2902
- if (isBatchSoftFailTool(name))
2903
- return true;
2904
- if (BATCH_SAFE_TOOLS.has(name))
2905
- return true;
2906
- return false;
2907
- };
2908
2900
  // Recon waves often emit 6–10 lookups; 4 forced a second sequential wave.
2909
2901
  const PARALLEL_LIMIT = 8;
2910
2902
  let aborted = false;
2911
- let blocked = false;
2912
- let blockedResult = null;
2913
- let failed = false;
2914
2903
  let awaitingPlanApproval = false;
2915
2904
  /** Native tool_call ids that already have a role:tool history entry. */
2916
2905
  const recordedNativeIds = new Set();
2917
- const recordResult = (boundCall, res, continueAfterFailure = false) => {
2906
+ /**
2907
+ * Record a tool result into history. Failures / user declines are
2908
+ * always returned to the model — we never cancel later siblings or
2909
+ * force-end the turn as "blocked" because one tool failed. Only an
2910
+ * explicit user abort stops remaining calls.
2911
+ */
2912
+ const recordResult = (boundCall, res) => {
2918
2913
  recordedNativeIds.add(boundCall.id);
2919
2914
  const toolContent = `Tool ${res.call.name} result (exit=${res.result.exitCode ?? 0}, ok=${res.result.ok}):\n${res.contextOutput}`;
2920
2915
  if (historyNativeCalls.length) {
@@ -3021,22 +3016,14 @@ export async function runAgentTurn(prompt, options = {}) {
3021
3016
  session.planApproved.value = true;
3022
3017
  }
3023
3018
  }
3019
+ // User Esc/Ctrl+C only — never cancel siblings because a delete failed
3020
+ // or a confirm was declined; the model must see every tool result.
3024
3021
  if (res.lastAnswer === "Aborted.")
3025
3022
  aborted = true;
3026
- else if (res.blockOrCancel) {
3027
- blocked = true;
3028
- blockedResult = res;
3029
- }
3030
- else if (!res.ok && !continueAfterFailure)
3031
- failed = true;
3032
3023
  };
3033
3024
  const groups = groupToolCallsForExecution(allCalls, isParallelSafe, PARALLEL_LIMIT);
3034
3025
  for (const group of groups) {
3035
- if (aborted ||
3036
- blocked ||
3037
- failed ||
3038
- awaitingPlanApproval ||
3039
- governorPauseReason)
3026
+ if (aborted || awaitingPlanApproval || governorPauseReason)
3040
3027
  break;
3041
3028
  if (group.length === 1) {
3042
3029
  const call = group[0];
@@ -3048,8 +3035,7 @@ export async function runAgentTurn(prompt, options = {}) {
3048
3035
  }
3049
3036
  const id = callIds[bc.index];
3050
3037
  const res = await executeSingleTool(call, id, options.signal || new AbortController().signal);
3051
- const softFail = shouldSoftFailTool(call.name);
3052
- recordResult(bc, res, softFail);
3038
+ recordResult(bc, res);
3053
3039
  }
3054
3040
  else {
3055
3041
  // Concurrent group — BoundCall via Map; record in document order.
@@ -3067,11 +3053,12 @@ export async function runAgentTurn(prompt, options = {}) {
3067
3053
  }
3068
3054
  const results = await Promise.all(groupBound.map((bc, k) => executeSingleTool(bc.call, uiIds[k], options.signal || new AbortController().signal)));
3069
3055
  for (let k = 0; k < results.length; k += 1) {
3070
- recordResult(groupBound[k], results[k], true);
3056
+ recordResult(groupBound[k], results[k]);
3071
3057
  }
3072
3058
  }
3073
3059
  }
3074
3060
  // Cards still "running" get a terminal UI result; history always pairs.
3061
+ // Only abort / plan-gate / governor leave calls un-run now.
3075
3062
  for (let i = 0; i < toRun.length; i += 1) {
3076
3063
  const bc = toRun[i];
3077
3064
  if (recordedNativeIds.has(bc.id))
@@ -3082,15 +3069,11 @@ export async function runAgentTurn(prompt, options = {}) {
3082
3069
  const uiId = callIds[i];
3083
3070
  const reason = aborted
3084
3071
  ? "Cancelled — turn aborted before this call ran."
3085
- : blocked
3086
- ? "Cancelledearlier tool was blocked or declined."
3087
- : awaitingPlanApproval
3088
- ? "Deferred — waiting for plan approval."
3089
- : governorPauseReason
3090
- ? `Deferred — progress governor paused execution: ${governorPauseReason}`
3091
- : failed
3092
- ? "Cancelled — earlier tool in this batch failed."
3093
- : "Cancelled — not executed.";
3072
+ : awaitingPlanApproval
3073
+ ? "Deferredwaiting for plan approval."
3074
+ : governorPauseReason
3075
+ ? `Deferred — progress governor paused execution: ${governorPauseReason}`
3076
+ : "Cancelled — not executed.";
3094
3077
  const result = {
3095
3078
  ok: false,
3096
3079
  output: reason,
@@ -3138,13 +3121,8 @@ export async function runAgentTurn(prompt, options = {}) {
3138
3121
  writeAbort();
3139
3122
  return finishTurn(lastAnswer, productiveSteps, "aborted");
3140
3123
  }
3141
- if (blocked && blockedResult) {
3142
- lastAnswer = blockedResult.lastAnswer || "Blocked or Cancelled.";
3143
- outcomeState.outcome.status = "blocked";
3144
- await saveOutcomeState(outcomeState);
3145
- moveTurn("blocked", lastAnswer);
3146
- return finishTurn(lastAnswer, productiveSteps, "blocked");
3147
- }
3124
+ // Confirm declines / tool failures already have role:tool results —
3125
+ // continue the agent loop so the model can adapt (do not force "blocked").
3148
3126
  await maybeAutoCompact("post-tool-token-budget");
3149
3127
  if (options.onMessages) {
3150
3128
  try {