@carboncode/cli 0.1.0 → 0.1.1

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 (99) hide show
  1. package/README.md +15 -24
  2. package/README.zh-CN.md +13 -11
  3. package/dist/cli/{acp-35C4ME6Y.js → acp-E6QAGSG4.js} +17 -16
  4. package/dist/cli/acp-E6QAGSG4.js.map +1 -0
  5. package/dist/cli/{chat-A6UJDPGV.js → chat-6MBLB7MU.js} +21 -21
  6. package/dist/cli/{chunk-J5BYPUB5.js → chunk-2EKLWOE3.js} +794 -554
  7. package/dist/cli/chunk-2EKLWOE3.js.map +1 -0
  8. package/dist/cli/{chunk-UI66BH6D.js → chunk-2UXHZAXP.js} +2 -2
  9. package/dist/cli/{chunk-IX6XI2RG.js → chunk-3PNIUDTA.js} +2 -2
  10. package/dist/cli/{chunk-JKGYMRX5.js → chunk-676EW5HH.js} +2 -2
  11. package/dist/cli/{chunk-BSINVTTL.js → chunk-7R3PKZXB.js} +7 -7
  12. package/dist/cli/{chunk-3T6VBZCL.js → chunk-B2RA3NMS.js} +2 -2
  13. package/dist/cli/{chunk-CPKCNHRR.js → chunk-BYBOY5UY.js} +5 -5
  14. package/dist/cli/{chunk-3OAR6NVL.js → chunk-GG2V37EH.js} +2 -2
  15. package/dist/cli/{chunk-4IBIPQVB.js → chunk-J6UWUIT2.js} +3 -3
  16. package/dist/cli/{chunk-4TVNJWMA.js → chunk-LRXTF6NZ.js} +178 -18
  17. package/dist/cli/chunk-LRXTF6NZ.js.map +1 -0
  18. package/dist/cli/{chunk-T5TQ4NDT.js → chunk-MDQWQYBS.js} +3 -3
  19. package/dist/cli/{chunk-TH756VLN.js → chunk-NCMC7AMN.js} +240 -191
  20. package/dist/cli/chunk-NCMC7AMN.js.map +1 -0
  21. package/dist/cli/{chunk-ILJOIQ5W.js → chunk-NTF4IE7G.js} +2 -2
  22. package/dist/cli/{chunk-XJ5SRLKK.js → chunk-OYAIE6C7.js} +2 -2
  23. package/dist/cli/{chunk-BSGCXZQN.js → chunk-PT4UDK7Z.js} +2 -2
  24. package/dist/cli/{chunk-QJG7OF27.js → chunk-QLPHVU3W.js} +27 -10
  25. package/dist/cli/chunk-QLPHVU3W.js.map +1 -0
  26. package/dist/cli/{chunk-WRN65TRD.js → chunk-RLQQOIBS.js} +2 -2
  27. package/dist/cli/{chunk-QVC75MR3.js → chunk-U7RHC7D6.js} +2 -2
  28. package/dist/cli/{chunk-IAUOP25G.js → chunk-V6A26HU5.js} +34 -20
  29. package/dist/cli/chunk-V6A26HU5.js.map +1 -0
  30. package/dist/cli/{chunk-D5NFKRGO.js → chunk-VVQTSZWX.js} +2 -2
  31. package/dist/cli/{chunk-7L2WTRNU.js → chunk-X3IHKOYW.js} +2 -2
  32. package/dist/cli/{chunk-S2KIUQKQ.js → chunk-XJIF545V.js} +7 -6
  33. package/dist/cli/{chunk-S2KIUQKQ.js.map → chunk-XJIF545V.js.map} +1 -1
  34. package/dist/cli/{chunk-4MQ3VURH.js → chunk-ZADUQPQP.js} +24 -24
  35. package/dist/cli/chunk-ZADUQPQP.js.map +1 -0
  36. package/dist/cli/{code-4TUTAGO5.js → code-LBRSX6ZI.js} +24 -33
  37. package/dist/cli/code-LBRSX6ZI.js.map +1 -0
  38. package/dist/cli/{commands-KMOZEYCF.js → commands-PCHFC3CL.js} +4 -4
  39. package/dist/cli/{commit-DTFA56VQ.js → commit-HDN6VJBA.js} +3 -3
  40. package/dist/cli/{desktop-7N3MHNBD.js → desktop-RHWSCBHO.js} +17 -17
  41. package/dist/cli/{diff-E5OWTF4C.js → diff-MV5JNUH4.js} +8 -8
  42. package/dist/cli/{doctor-IEJQRJMN.js → doctor-QLO4V4DD.js} +8 -8
  43. package/dist/cli/index.js +32 -32
  44. package/dist/cli/{mcp-PDI2PDLG.js → mcp-JSHFAINM.js} +2 -2
  45. package/dist/cli/{mcp-browse-OSPXOFPZ.js → mcp-browse-ESMKKKYH.js} +2 -2
  46. package/dist/cli/{mcp-inspect-QRFVTHMF.js → mcp-inspect-WSUN36FM.js} +2 -2
  47. package/dist/cli/{prompt-3CDII3UO.js → prompt-5LMDCF4M.js} +3 -3
  48. package/dist/cli/{replay-HYOSRQIV.js → replay-D3ILR2YO.js} +8 -8
  49. package/dist/cli/{run-2ZHADOUP.js → run-6NN3P5JM.js} +13 -13
  50. package/dist/cli/{server-X75PAZG5.js → server-HE7LFAHH.js} +10 -10
  51. package/dist/cli/{sessions-POOZA5CQ.js → sessions-HXDBQM3V.js} +12 -12
  52. package/dist/cli/{setup-YLPFI3OH.js → setup-EP3UPG3F.js} +5 -5
  53. package/dist/cli/{stats-NXJ3TO2D.js → stats-5RC6P5TN.js} +6 -6
  54. package/dist/cli/{version-NXXWE3WN.js → version-AIR25TRN.js} +12 -12
  55. package/dist/index.d.ts +15 -2
  56. package/dist/index.js +328 -89
  57. package/dist/index.js.map +1 -1
  58. package/package.json +2 -2
  59. package/dist/cli/acp-35C4ME6Y.js.map +0 -1
  60. package/dist/cli/chunk-4MQ3VURH.js.map +0 -1
  61. package/dist/cli/chunk-4TVNJWMA.js.map +0 -1
  62. package/dist/cli/chunk-IAUOP25G.js.map +0 -1
  63. package/dist/cli/chunk-J5BYPUB5.js.map +0 -1
  64. package/dist/cli/chunk-QJG7OF27.js.map +0 -1
  65. package/dist/cli/chunk-TH756VLN.js.map +0 -1
  66. package/dist/cli/code-4TUTAGO5.js.map +0 -1
  67. /package/dist/cli/{chat-A6UJDPGV.js.map → chat-6MBLB7MU.js.map} +0 -0
  68. /package/dist/cli/{chunk-UI66BH6D.js.map → chunk-2UXHZAXP.js.map} +0 -0
  69. /package/dist/cli/{chunk-IX6XI2RG.js.map → chunk-3PNIUDTA.js.map} +0 -0
  70. /package/dist/cli/{chunk-JKGYMRX5.js.map → chunk-676EW5HH.js.map} +0 -0
  71. /package/dist/cli/{chunk-BSINVTTL.js.map → chunk-7R3PKZXB.js.map} +0 -0
  72. /package/dist/cli/{chunk-3T6VBZCL.js.map → chunk-B2RA3NMS.js.map} +0 -0
  73. /package/dist/cli/{chunk-CPKCNHRR.js.map → chunk-BYBOY5UY.js.map} +0 -0
  74. /package/dist/cli/{chunk-3OAR6NVL.js.map → chunk-GG2V37EH.js.map} +0 -0
  75. /package/dist/cli/{chunk-4IBIPQVB.js.map → chunk-J6UWUIT2.js.map} +0 -0
  76. /package/dist/cli/{chunk-T5TQ4NDT.js.map → chunk-MDQWQYBS.js.map} +0 -0
  77. /package/dist/cli/{chunk-ILJOIQ5W.js.map → chunk-NTF4IE7G.js.map} +0 -0
  78. /package/dist/cli/{chunk-XJ5SRLKK.js.map → chunk-OYAIE6C7.js.map} +0 -0
  79. /package/dist/cli/{chunk-BSGCXZQN.js.map → chunk-PT4UDK7Z.js.map} +0 -0
  80. /package/dist/cli/{chunk-WRN65TRD.js.map → chunk-RLQQOIBS.js.map} +0 -0
  81. /package/dist/cli/{chunk-QVC75MR3.js.map → chunk-U7RHC7D6.js.map} +0 -0
  82. /package/dist/cli/{chunk-D5NFKRGO.js.map → chunk-VVQTSZWX.js.map} +0 -0
  83. /package/dist/cli/{chunk-7L2WTRNU.js.map → chunk-X3IHKOYW.js.map} +0 -0
  84. /package/dist/cli/{commands-KMOZEYCF.js.map → commands-PCHFC3CL.js.map} +0 -0
  85. /package/dist/cli/{commit-DTFA56VQ.js.map → commit-HDN6VJBA.js.map} +0 -0
  86. /package/dist/cli/{desktop-7N3MHNBD.js.map → desktop-RHWSCBHO.js.map} +0 -0
  87. /package/dist/cli/{diff-E5OWTF4C.js.map → diff-MV5JNUH4.js.map} +0 -0
  88. /package/dist/cli/{doctor-IEJQRJMN.js.map → doctor-QLO4V4DD.js.map} +0 -0
  89. /package/dist/cli/{mcp-PDI2PDLG.js.map → mcp-JSHFAINM.js.map} +0 -0
  90. /package/dist/cli/{mcp-browse-OSPXOFPZ.js.map → mcp-browse-ESMKKKYH.js.map} +0 -0
  91. /package/dist/cli/{mcp-inspect-QRFVTHMF.js.map → mcp-inspect-WSUN36FM.js.map} +0 -0
  92. /package/dist/cli/{prompt-3CDII3UO.js.map → prompt-5LMDCF4M.js.map} +0 -0
  93. /package/dist/cli/{replay-HYOSRQIV.js.map → replay-D3ILR2YO.js.map} +0 -0
  94. /package/dist/cli/{run-2ZHADOUP.js.map → run-6NN3P5JM.js.map} +0 -0
  95. /package/dist/cli/{server-X75PAZG5.js.map → server-HE7LFAHH.js.map} +0 -0
  96. /package/dist/cli/{sessions-POOZA5CQ.js.map → sessions-HXDBQM3V.js.map} +0 -0
  97. /package/dist/cli/{setup-YLPFI3OH.js.map → setup-EP3UPG3F.js.map} +0 -0
  98. /package/dist/cli/{stats-NXJ3TO2D.js.map → stats-5RC6P5TN.js.map} +0 -0
  99. /package/dist/cli/{version-NXXWE3WN.js.map → version-AIR25TRN.js.map} +0 -0
@@ -24,11 +24,11 @@ import {
24
24
  } from "./chunk-4VR6XF4P.js";
25
25
  import {
26
26
  registerSemanticSearchTool
27
- } from "./chunk-3OAR6NVL.js";
27
+ } from "./chunk-GG2V37EH.js";
28
28
  import {
29
29
  BUILTIN_ALLOWLIST,
30
30
  lineDiff
31
- } from "./chunk-TH756VLN.js";
31
+ } from "./chunk-NCMC7AMN.js";
32
32
  import {
33
33
  CARBON_RUNTIME_DIRNAME,
34
34
  LEGACY_REASONIX_RUNTIME_DIRNAME,
@@ -46,7 +46,7 @@ import {
46
46
  checkOllamaStatus,
47
47
  pullOllamaModel,
48
48
  startOllamaDaemon
49
- } from "./chunk-JKGYMRX5.js";
49
+ } from "./chunk-676EW5HH.js";
50
50
  import {
51
51
  buildIndex,
52
52
  compareIndexIdentity,
@@ -55,13 +55,13 @@ import {
55
55
  querySemantic,
56
56
  readIndexMeta,
57
57
  walkChunks
58
- } from "./chunk-WRN65TRD.js";
58
+ } from "./chunk-RLQQOIBS.js";
59
59
  import {
60
60
  HOOK_EVENTS,
61
61
  globalSettingsPath,
62
62
  loadHooks,
63
63
  projectSettingsPath
64
- } from "./chunk-IX6XI2RG.js";
64
+ } from "./chunk-3PNIUDTA.js";
65
65
  import "./chunk-S4XVGLRW.js";
66
66
  import {
67
67
  deleteSession,
@@ -74,16 +74,16 @@ import {
74
74
  bucketCacheHitRatio,
75
75
  formatLogSize,
76
76
  readUsageLog
77
- } from "./chunk-QVC75MR3.js";
77
+ } from "./chunk-U7RHC7D6.js";
78
78
  import {
79
79
  DEEPSEEK_PRICING,
80
80
  cacheSavingsUsd
81
- } from "./chunk-ILJOIQ5W.js";
81
+ } from "./chunk-NTF4IE7G.js";
82
82
  import {
83
83
  getLanguage,
84
84
  getSupportedLanguages,
85
85
  setLanguage
86
- } from "./chunk-IAUOP25G.js";
86
+ } from "./chunk-V6A26HU5.js";
87
87
  import {
88
88
  DEFAULT_INDEX_EXCLUDES,
89
89
  DEFAULT_MAX_FILE_BYTES,
@@ -106,7 +106,7 @@ import {
106
106
  resolveSemanticEmbeddingConfig,
107
107
  saveSemanticEmbeddingConfig,
108
108
  writeConfig
109
- } from "./chunk-4MQ3VURH.js";
109
+ } from "./chunk-ZADUQPQP.js";
110
110
  import {
111
111
  VERSION
112
112
  } from "./chunk-LN3B5PMX.js";
@@ -3569,4 +3569,4 @@ export {
3569
3569
  readBody,
3570
3570
  startDashboardServer
3571
3571
  };
3572
- //# sourceMappingURL=server-X75PAZG5.js.map
3572
+ //# sourceMappingURL=server-HE7LFAHH.js.map
@@ -1,29 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
- import "./chunk-4TVNJWMA.js";
4
- import "./chunk-7L2WTRNU.js";
5
- import "./chunk-T5TQ4NDT.js";
3
+ import "./chunk-LRXTF6NZ.js";
4
+ import "./chunk-X3IHKOYW.js";
5
+ import "./chunk-MDQWQYBS.js";
6
6
  import "./chunk-GALC45Q2.js";
7
- import "./chunk-QJG7OF27.js";
7
+ import "./chunk-QLPHVU3W.js";
8
8
  import "./chunk-6OWJV3YW.js";
9
- import "./chunk-BSGCXZQN.js";
9
+ import "./chunk-PT4UDK7Z.js";
10
10
  import "./chunk-25T6CVUP.js";
11
11
  import "./chunk-2UQP6H6T.js";
12
- import "./chunk-TH756VLN.js";
12
+ import "./chunk-NCMC7AMN.js";
13
13
  import "./chunk-M2UFZUX3.js";
14
- import "./chunk-IX6XI2RG.js";
14
+ import "./chunk-3PNIUDTA.js";
15
15
  import "./chunk-S4XVGLRW.js";
16
16
  import {
17
17
  listSessions,
18
18
  loadSessionMessages,
19
19
  sessionPath
20
20
  } from "./chunk-U4IJVG32.js";
21
- import "./chunk-QVC75MR3.js";
22
- import "./chunk-ILJOIQ5W.js";
21
+ import "./chunk-U7RHC7D6.js";
22
+ import "./chunk-NTF4IE7G.js";
23
23
  import {
24
24
  t
25
- } from "./chunk-IAUOP25G.js";
26
- import "./chunk-4MQ3VURH.js";
25
+ } from "./chunk-V6A26HU5.js";
26
+ import "./chunk-ZADUQPQP.js";
27
27
  import "./chunk-LN3B5PMX.js";
28
28
  import "./chunk-TUK7OWJA.js";
29
29
 
@@ -117,4 +117,4 @@ function truncate(s, max) {
117
117
  export {
118
118
  sessionsCommand
119
119
  };
120
- //# sourceMappingURL=sessions-POOZA5CQ.js.map
120
+ //# sourceMappingURL=sessions-HXDBQM3V.js.map
@@ -3,11 +3,11 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  MultiSelect,
5
5
  SingleSelect
6
- } from "./chunk-UI66BH6D.js";
6
+ } from "./chunk-2UXHZAXP.js";
7
7
  import {
8
8
  ThemeProvider,
9
9
  useTheme
10
- } from "./chunk-D5NFKRGO.js";
10
+ } from "./chunk-VVQTSZWX.js";
11
11
  import {
12
12
  Box_default,
13
13
  Text,
@@ -34,7 +34,7 @@ import {
34
34
  onLanguageChange,
35
35
  setLanguage,
36
36
  t
37
- } from "./chunk-IAUOP25G.js";
37
+ } from "./chunk-V6A26HU5.js";
38
38
  import {
39
39
  defaultConfigPath,
40
40
  isPlausibleKey,
@@ -46,7 +46,7 @@ import {
46
46
  redactKey,
47
47
  resolveThemePreference,
48
48
  writeConfig
49
- } from "./chunk-4MQ3VURH.js";
49
+ } from "./chunk-ZADUQPQP.js";
50
50
  import {
51
51
  __toESM
52
52
  } from "./chunk-TUK7OWJA.js";
@@ -615,4 +615,4 @@ async function setupCommand(opts = {}) {
615
615
  export {
616
616
  setupCommand
617
617
  };
618
- //# sourceMappingURL=setup-YLPFI3OH.js.map
618
+ //# sourceMappingURL=setup-EP3UPG3F.js.map
@@ -3,14 +3,14 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  renderDashboard,
5
5
  statsCommand
6
- } from "./chunk-4IBIPQVB.js";
7
- import "./chunk-QVC75MR3.js";
8
- import "./chunk-ILJOIQ5W.js";
9
- import "./chunk-IAUOP25G.js";
10
- import "./chunk-4MQ3VURH.js";
6
+ } from "./chunk-J6UWUIT2.js";
7
+ import "./chunk-U7RHC7D6.js";
8
+ import "./chunk-NTF4IE7G.js";
9
+ import "./chunk-V6A26HU5.js";
10
+ import "./chunk-ZADUQPQP.js";
11
11
  import "./chunk-TUK7OWJA.js";
12
12
  export {
13
13
  renderDashboard,
14
14
  statsCommand
15
15
  };
16
- //# sourceMappingURL=stats-NXJ3TO2D.js.map
16
+ //# sourceMappingURL=stats-5RC6P5TN.js.map
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
- import "./chunk-4TVNJWMA.js";
4
- import "./chunk-7L2WTRNU.js";
5
- import "./chunk-T5TQ4NDT.js";
3
+ import "./chunk-LRXTF6NZ.js";
4
+ import "./chunk-X3IHKOYW.js";
5
+ import "./chunk-MDQWQYBS.js";
6
6
  import "./chunk-GALC45Q2.js";
7
- import "./chunk-QJG7OF27.js";
7
+ import "./chunk-QLPHVU3W.js";
8
8
  import "./chunk-6OWJV3YW.js";
9
- import "./chunk-BSGCXZQN.js";
9
+ import "./chunk-PT4UDK7Z.js";
10
10
  import "./chunk-25T6CVUP.js";
11
11
  import "./chunk-2UQP6H6T.js";
12
- import "./chunk-TH756VLN.js";
12
+ import "./chunk-NCMC7AMN.js";
13
13
  import "./chunk-M2UFZUX3.js";
14
- import "./chunk-IX6XI2RG.js";
14
+ import "./chunk-3PNIUDTA.js";
15
15
  import "./chunk-S4XVGLRW.js";
16
16
  import "./chunk-U4IJVG32.js";
17
- import "./chunk-QVC75MR3.js";
18
- import "./chunk-ILJOIQ5W.js";
19
- import "./chunk-IAUOP25G.js";
20
- import "./chunk-4MQ3VURH.js";
17
+ import "./chunk-U7RHC7D6.js";
18
+ import "./chunk-NTF4IE7G.js";
19
+ import "./chunk-V6A26HU5.js";
20
+ import "./chunk-ZADUQPQP.js";
21
21
  import {
22
22
  VERSION
23
23
  } from "./chunk-LN3B5PMX.js";
@@ -30,4 +30,4 @@ function versionCommand() {
30
30
  export {
31
31
  versionCommand
32
32
  };
33
- //# sourceMappingURL=version-NXXWE3WN.js.map
33
+ //# sourceMappingURL=version-AIR25TRN.js.map
package/dist/index.d.ts CHANGED
@@ -634,6 +634,8 @@ interface LoopEvent {
634
634
  toolCallReadyCount?: number;
635
635
  /** Stable id for tool_start / tool pairs — also the inflight-set key. UI uses this as the card id so it can derive `running` from `loop.inflight.has(callId)` instead of trusting end-event delivery. */
636
636
  callId?: string;
637
+ /** Tool execution duration excluding interactive approval wait when available. */
638
+ elapsedMs?: number;
637
639
  stats?: TurnStats;
638
640
  repair?: RepairReport;
639
641
  error?: string;
@@ -689,6 +691,8 @@ interface ToolCallContext {
689
691
  signal?: AbortSignal;
690
692
  /** Inject a mock PauseGate for tests. When absent, tools use the singleton. */
691
693
  confirmationGate?: PauseGate;
694
+ /** Time spent waiting for interactive approval; UIs subtract this from tool runtime. */
695
+ onInteractiveWait?: (elapsedMs: number) => void;
692
696
  }
693
697
  interface ToolDefinition<A = any, R = any> {
694
698
  name: string;
@@ -714,7 +718,7 @@ type ToolCallAuditEvent = {
714
718
  };
715
719
  type ToolCallAuditListener = (event: ToolCallAuditEvent) => void;
716
720
  /** String return short-circuits dispatch; null/undefined falls through to the tool fn. */
717
- type ToolInterceptor = (name: string, args: Record<string, unknown>) => string | null | undefined | Promise<string | null | undefined>;
721
+ type ToolInterceptor = (name: string, args: Record<string, unknown>, ctx?: ToolCallContext) => string | null | undefined | Promise<string | null | undefined>;
718
722
  /** Final-stage post-processor — runs on every dispatch return (success and error paths) so callers can append context like a remaining-budget hint. Whatever it returns becomes the dispatch result. */
719
723
  type ToolResultAugmenter = (name: string, args: Record<string, unknown>, result: string) => string;
720
724
  declare class ToolRegistry {
@@ -755,6 +759,8 @@ declare class ToolRegistry {
755
759
  maxResultTokens?: number;
756
760
  /** Inject a mock PauseGate for tests. */
757
761
  confirmationGate?: PauseGate;
762
+ /** Report modal / approval wait time so callers can keep runtime metrics honest. */
763
+ onInteractiveWait?: (elapsedMs: number) => void;
758
764
  }): Promise<string>;
759
765
  /** Records the failed call's fingerprint; on the 2nd consecutive identical malformed call to the same tool, returns a sharper error that tells the model to stop retrying. */
760
766
  private _noteMalformed;
@@ -1174,8 +1180,11 @@ interface ReasonixConfig {
1174
1180
  /** Stable URL token (#968). If unset, a fresh token is minted each boot. Min 16 chars enforced at load time. */
1175
1181
  token?: string;
1176
1182
  };
1177
- /** Per-field visibility toggles for the bottom status row. All default to true (visible). */
1183
+ /** Per-field visibility toggles for the bottom status row. Codex-style defaults keep only turn cost and context visible. */
1178
1184
  statusBar?: {
1185
+ showMode?: boolean;
1186
+ showPreset?: boolean;
1187
+ showSessionInfo?: boolean;
1179
1188
  showBalance?: boolean;
1180
1189
  showSessionCost?: boolean;
1181
1190
  showTurnCost?: boolean;
@@ -1651,6 +1660,8 @@ declare function detectShellOperator(cmd: string): string | null;
1651
1660
  declare function isAllowed(cmd: string, extra?: readonly string[], projectRoot?: string, sensitivePathConfig?: {
1652
1661
  prefixes?: readonly string[];
1653
1662
  patterns?: readonly string[];
1663
+ }, opts?: {
1664
+ includeBuiltin?: boolean;
1654
1665
  }): boolean;
1655
1666
 
1656
1667
  /** cwd pinned to root; non-allowlisted commands throw to a UI confirm gate; spawn is `shell: false`, tokenized argv only. */
@@ -1665,6 +1676,8 @@ interface ShellToolsOptions {
1665
1676
  extraAllowed?: readonly string[] | (() => readonly string[]);
1666
1677
  /** Getter form lets `editMode === "yolo"` flip mid-session without re-registering tools. */
1667
1678
  allowAll?: boolean | (() => boolean);
1679
+ /** When true, built-in read/test/lint commands still go through the approval gate. Project allowlist entries still bypass it. */
1680
+ requireApprovalForBuiltin?: boolean;
1668
1681
  jobs?: JobRegistry;
1669
1682
  /** Fired after `run_background` / `stop_job` mutate the registry — used by the desktop popover for near-real-time updates without polling. */
1670
1683
  onJobsChanged?: () => void;