@cjhyy/code-shell 0.1.0-alpha.1 → 0.1.0-alpha.3

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 (275) hide show
  1. package/README.md +8 -0
  2. package/dist/anthropic-P5VETAFI.cjs +10 -0
  3. package/dist/{anthropic-NENYS535.js → anthropic-W2GU3D76.js} +3 -2
  4. package/dist/arena/context/context-tools.d.ts +1 -1
  5. package/dist/arena/index.cjs +4 -4
  6. package/dist/arena/index.js +3 -3
  7. package/dist/arena/providers/index.d.ts +19 -3
  8. package/dist/arena/strategies/utils.d.ts +6 -1
  9. package/dist/arena/types.d.ts +10 -1
  10. package/dist/{arena-46QQ6BZQ.js → arena-ENHBHB2W.js} +5 -7
  11. package/dist/{arena-HZZZ2GJH.cjs → arena-HHDYYVHJ.cjs} +19 -21
  12. package/dist/{chunk-BE6IPRDM.js → chunk-2EUAE7AY.js} +1 -1
  13. package/dist/{chunk-WYKNZ54E.cjs → chunk-3CAZIWUA.cjs} +6 -6
  14. package/dist/{chunk-J5XW6UYL.js → chunk-5C5HIOML.js} +63 -4
  15. package/dist/chunk-75E4BBFC.js +224 -0
  16. package/dist/chunk-BF4LXLQV.cjs +4753 -0
  17. package/dist/{chunk-ZJV3YSY3.cjs → chunk-BUJ5KYCI.cjs} +53 -11
  18. package/dist/{chunk-BMH65OVB.cjs → chunk-C7C7ZZY4.cjs} +8 -8
  19. package/dist/{chunk-KO2FPF7G.js → chunk-F5BS3GUC.js} +20 -2
  20. package/dist/chunk-FPFTIKEJ.js +4753 -0
  21. package/dist/chunk-FV2ARONZ.cjs +224 -0
  22. package/dist/{chunk-DICG4AB7.cjs → chunk-GZBD6QRS.cjs} +42 -3
  23. package/dist/{chunk-FVP7XJGS.cjs → chunk-HOXQLX5R.cjs} +406 -196
  24. package/dist/{chunk-4PKZPFCD.js → chunk-I57ZD5IQ.js} +47 -14
  25. package/dist/{chunk-JUHRV2XF.js → chunk-ID6EJUHP.js} +1703 -438
  26. package/dist/chunk-JHNCK7JP.cjs +202 -0
  27. package/dist/{chunk-MOILS4WE.cjs → chunk-JHXNOB5G.cjs} +3 -3
  28. package/dist/{chunk-UK2SU23S.cjs → chunk-KOGV6PDQ.cjs} +20 -2
  29. package/dist/{chunk-VKGNCYRL.js → chunk-LMEKCQX4.js} +95 -13
  30. package/dist/{chunk-3EAEC566.cjs → chunk-M2QI5X3X.cjs} +51 -18
  31. package/dist/{chunk-YZ25SSWJ.js → chunk-M2SVOKC6.js} +46 -4
  32. package/dist/{chunk-NG73UR3L.cjs → chunk-OP57WUWQ.cjs} +23 -1
  33. package/dist/{chunk-ZXYDDJEJ.js → chunk-OUC2DFA7.js} +2 -2
  34. package/dist/{chunk-AP5F6VYE.js → chunk-REFCCVDM.js} +1 -1
  35. package/dist/{chunk-O6F2EF2Z.js → chunk-SCDKLTN3.js} +41 -2
  36. package/dist/{chunk-FECTK5KJ.js → chunk-SW3L7HIM.js} +1 -1
  37. package/dist/chunk-TDXBHD24.js +54 -0
  38. package/dist/chunk-VIPLU4RY.cjs +54 -0
  39. package/dist/{chunk-Q6BYFYGD.cjs → chunk-VWFET3MG.cjs} +1886 -621
  40. package/dist/{chunk-3EUDE77E.cjs → chunk-X2DNIMPC.cjs} +19 -19
  41. package/dist/{chunk-SQZHPD3S.js → chunk-Y7TSCDF6.js} +297 -87
  42. package/dist/{chunk-WHRTARDJ.cjs → chunk-YAFCN7ZW.cjs} +112 -30
  43. package/dist/{chunk-LRAY5IYC.cjs → chunk-YD7XTI7T.cjs} +65 -6
  44. package/dist/{chunk-S74VVJBF.js → chunk-ZLPJJZUW.js} +23 -1
  45. package/dist/chunk-ZRVPCXI7.js +202 -0
  46. package/dist/cli/commands/builtin/advanced-commands.d.ts +1 -1
  47. package/dist/cli/commands/builtin/extra-commands.d.ts +2 -2
  48. package/dist/cli/commands/builtin/more-commands.d.ts +1 -3
  49. package/dist/cli/commands/registry.d.ts +8 -0
  50. package/dist/cli/cost-tracker.d.ts +6 -0
  51. package/dist/cli/main.cjs +3556 -1995
  52. package/dist/cli/main.js +3658 -2097
  53. package/dist/cli/onboarding.d.ts +67 -14
  54. package/dist/client-base-TOVE25FA.js +9 -0
  55. package/dist/client-base-VDDIADAC.cjs +9 -0
  56. package/dist/compaction-D3KV2NWY.cjs +31 -0
  57. package/dist/{compaction-CCHWA4G6.js → compaction-YNWCEF7B.js} +1 -2
  58. package/dist/context/manager.d.ts +9 -0
  59. package/dist/data/openrouter-models.d.ts +35 -0
  60. package/dist/data/openrouter-sync.d.ts +16 -0
  61. package/dist/{devtools-KIY3LWQJ.js → devtools-IRQQPIRY.js} +1 -1
  62. package/dist/{devtools-LRP47DDV.cjs → devtools-WTC3NFNE.cjs} +1 -1
  63. package/dist/engine/engine.d.ts +29 -6
  64. package/dist/engine/turn-loop.d.ts +7 -0
  65. package/dist/engine/turn-state.d.ts +6 -0
  66. package/dist/index.cjs +19 -28
  67. package/dist/index.js +28 -37
  68. package/dist/llm/client-base.d.ts +7 -0
  69. package/dist/llm/model-pool.d.ts +4 -0
  70. package/dist/logging/logger.d.ts +69 -8
  71. package/dist/manager-FWLOVEEK.cjs +7 -0
  72. package/dist/manager-GEXJLOIS.js +7 -0
  73. package/dist/{mcp-manager-OKXHHWYR.js → mcp-manager-37GQLFGX.js} +2 -2
  74. package/dist/mcp-manager-U77NEXBY.cjs +8 -0
  75. package/dist/memory-ADGOWADP.cjs +9 -0
  76. package/dist/memory-EPFDBPII.js +9 -0
  77. package/dist/native-ts/yoga-layout/index.d.ts +2 -2
  78. package/dist/{openai-5HQGBL4L.js → openai-RXU5URYI.js} +3 -2
  79. package/dist/openai-SQW4H2K4.cjs +10 -0
  80. package/dist/openrouter-models-2FM3H4SQ.js +15 -0
  81. package/dist/openrouter-models-PLCWZZYE.cjs +15 -0
  82. package/dist/openrouter-sync-K2WK3A2A.cjs +11 -0
  83. package/dist/openrouter-sync-SO3AWEAM.js +11 -0
  84. package/dist/product/index.cjs +12 -16
  85. package/dist/product/index.js +11 -15
  86. package/dist/protocol/types.d.ts +11 -3
  87. package/dist/{ink → render}/hooks/use-input.d.ts +1 -1
  88. package/dist/run/index.cjs +12 -16
  89. package/dist/run/index.js +11 -15
  90. package/dist/session/memory.d.ts +23 -3
  91. package/dist/session/session-manager.d.ts +4 -1
  92. package/dist/{session-manager-UQKB564H.cjs → session-manager-HRSKENKB.cjs} +2 -2
  93. package/dist/{session-manager-JIIBCFTC.js → session-manager-NEKFEHF3.js} +1 -1
  94. package/dist/settings/manager.d.ts +9 -0
  95. package/dist/settings/schema.d.ts +48 -39
  96. package/dist/{tool-summary-J2ICNMWP.js → tool-summary-2RUFL5QK.js} +1 -1
  97. package/dist/{tool-summary-5P2GKRA4.cjs → tool-summary-RYNR4DDB.cjs} +2 -2
  98. package/dist/tool-system/builtin/agent.d.ts +3 -26
  99. package/dist/tool-system/builtin/apply-patch/applier.d.ts +26 -0
  100. package/dist/tool-system/builtin/apply-patch/index.d.ts +19 -0
  101. package/dist/tool-system/builtin/apply-patch/parser.d.ts +17 -0
  102. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +18 -0
  103. package/dist/tool-system/builtin/apply-patch/types.d.ts +49 -0
  104. package/dist/tool-system/builtin/arena.d.ts +18 -5
  105. package/dist/tool-system/builtin/ask-user.d.ts +6 -6
  106. package/dist/tool-system/builtin/index.d.ts +11 -1
  107. package/dist/tool-system/builtin/tool-search.d.ts +2 -3
  108. package/dist/tool-system/context.d.ts +74 -0
  109. package/dist/tool-system/executor.d.ts +16 -0
  110. package/dist/tool-system/permission.d.ts +40 -5
  111. package/dist/tool-system/registry.d.ts +2 -0
  112. package/dist/types.d.ts +28 -1
  113. package/dist/ui/App.d.ts +1 -1
  114. package/dist/ui/components/AgentBlock.d.ts +1 -1
  115. package/dist/ui/components/AskUserPrompt.d.ts +7 -0
  116. package/dist/ui/components/MessageContent.d.ts +7 -3
  117. package/dist/ui/components/ModelManager.d.ts +35 -0
  118. package/dist/ui/components/ModelSelector.d.ts +10 -0
  119. package/dist/ui/components/OnboardingPrompt.d.ts +7 -0
  120. package/dist/ui/components/PermissionPrompt.d.ts +5 -2
  121. package/dist/ui/components/SessionPicker.d.ts +14 -0
  122. package/dist/ui/components/StatusLine.d.ts +4 -2
  123. package/dist/ui/components/ThemedBox.d.ts +1 -1
  124. package/dist/ui/components/ToolCall.d.ts +8 -1
  125. package/dist/ui/components/WelcomeTips.d.ts +5 -0
  126. package/dist/ui/onboarding-runner.d.ts +2 -0
  127. package/dist/ui/store.d.ts +1 -0
  128. package/dist/{updater-2N6745WR.cjs → updater-J7L7R6BY.cjs} +7 -5
  129. package/dist/{updater-PV7FKSUI.js → updater-LDBNYCAO.js} +7 -5
  130. package/dist/utils/debug.d.ts +17 -33
  131. package/package.json +7 -5
  132. package/scripts/check-node.cjs +21 -0
  133. package/dist/anthropic-XMTTVNSH.cjs +0 -9
  134. package/dist/bridge-4ZRXVWBN.js +0 -98
  135. package/dist/bridge-W476QDFH.cjs +0 -98
  136. package/dist/chunk-4RRUP4MM.js +0 -86
  137. package/dist/chunk-4SFPFHMG.js +0 -132
  138. package/dist/chunk-5LHVI777.cjs +0 -246
  139. package/dist/chunk-6ZIROYXX.js +0 -207
  140. package/dist/chunk-C7JBCO5V.js +0 -80
  141. package/dist/chunk-CSO5EOEP.cjs +0 -132
  142. package/dist/chunk-FGZGCFJX.cjs +0 -207
  143. package/dist/chunk-HD7MT5XU.cjs +0 -86
  144. package/dist/chunk-IMMTBZ33.cjs +0 -63
  145. package/dist/chunk-JT2WSQSR.cjs +0 -335
  146. package/dist/chunk-NZ4DQ72D.cjs +0 -664
  147. package/dist/chunk-OG4MIQJ6.js +0 -335
  148. package/dist/chunk-WRZJUQ5Z.js +0 -664
  149. package/dist/chunk-X4HAERTQ.js +0 -63
  150. package/dist/chunk-XHC2JMEC.cjs +0 -80
  151. package/dist/chunk-ZRSSGYA5.js +0 -246
  152. package/dist/compaction-44I55TLI.cjs +0 -32
  153. package/dist/coordinator-5HY7ALO2.js +0 -7
  154. package/dist/coordinator-INDLPVMF.cjs +0 -7
  155. package/dist/cost-tracker-IWYAUPXH.js +0 -9
  156. package/dist/cost-tracker-JXTJQQWE.cjs +0 -9
  157. package/dist/loader-DXFSUB4R.cjs +0 -91
  158. package/dist/loader-J5UID6CV.js +0 -91
  159. package/dist/manager-ETWDOCHN.cjs +0 -9
  160. package/dist/manager-HGMQNEJB.cjs +0 -11
  161. package/dist/manager-HUAQOORS.js +0 -9
  162. package/dist/manager-VJIZ2CQC.js +0 -11
  163. package/dist/mcp-manager-G4G2QASE.cjs +0 -8
  164. package/dist/memory-AP747G5H.js +0 -7
  165. package/dist/memory-BH3BYUN5.cjs +0 -7
  166. package/dist/onboarding-6WEPV7C2.js +0 -11
  167. package/dist/onboarding-QM5DY2TU.cjs +0 -11
  168. package/dist/openai-656VWUQW.cjs +0 -9
  169. package/dist/skills-63RBYQRX.js +0 -13
  170. package/dist/skills-V3BPLW3D.cjs +0 -13
  171. package/dist/token-counter-CHAXW5O7.cjs +0 -13
  172. package/dist/token-counter-DSOZGZ5Q.js +0 -13
  173. package/dist/utils/log.d.ts +0 -56
  174. package/dist/voice-KTZ7PAGO.js +0 -80
  175. package/dist/voice-KZE25GKB.cjs +0 -80
  176. /package/dist/{ink → render}/Ansi.d.ts +0 -0
  177. /package/dist/{ink → render}/bidi.d.ts +0 -0
  178. /package/dist/{ink → render}/clearTerminal.d.ts +0 -0
  179. /package/dist/{ink → render}/colorize.d.ts +0 -0
  180. /package/dist/{ink → render}/components/AlternateScreen.d.ts +0 -0
  181. /package/dist/{ink → render}/components/App.d.ts +0 -0
  182. /package/dist/{ink → render}/components/AppContext.d.ts +0 -0
  183. /package/dist/{ink → render}/components/Box.d.ts +0 -0
  184. /package/dist/{ink → render}/components/Button.d.ts +0 -0
  185. /package/dist/{ink → render}/components/ClockContext.d.ts +0 -0
  186. /package/dist/{ink → render}/components/CursorDeclarationContext.d.ts +0 -0
  187. /package/dist/{ink → render}/components/ErrorOverview.d.ts +0 -0
  188. /package/dist/{ink → render}/components/Link.d.ts +0 -0
  189. /package/dist/{ink → render}/components/Newline.d.ts +0 -0
  190. /package/dist/{ink → render}/components/NoSelect.d.ts +0 -0
  191. /package/dist/{ink → render}/components/RawAnsi.d.ts +0 -0
  192. /package/dist/{ink → render}/components/ScrollBox.d.ts +0 -0
  193. /package/dist/{ink → render}/components/Spacer.d.ts +0 -0
  194. /package/dist/{ink → render}/components/StdinContext.d.ts +0 -0
  195. /package/dist/{ink → render}/components/TerminalFocusContext.d.ts +0 -0
  196. /package/dist/{ink → render}/components/TerminalSizeContext.d.ts +0 -0
  197. /package/dist/{ink → render}/components/Text.d.ts +0 -0
  198. /package/dist/{ink → render}/constants.d.ts +0 -0
  199. /package/dist/{ink → render}/cursor.d.ts +0 -0
  200. /package/dist/{ink → render}/devtools.d.ts +0 -0
  201. /package/dist/{ink → render}/dom.d.ts +0 -0
  202. /package/dist/{ink → render}/events/click-event.d.ts +0 -0
  203. /package/dist/{ink → render}/events/dispatcher.d.ts +0 -0
  204. /package/dist/{ink → render}/events/emitter.d.ts +0 -0
  205. /package/dist/{ink → render}/events/event-handlers.d.ts +0 -0
  206. /package/dist/{ink → render}/events/event.d.ts +0 -0
  207. /package/dist/{ink → render}/events/focus-event.d.ts +0 -0
  208. /package/dist/{ink → render}/events/input-event.d.ts +0 -0
  209. /package/dist/{ink → render}/events/keyboard-event.d.ts +0 -0
  210. /package/dist/{ink → render}/events/paste-event.d.ts +0 -0
  211. /package/dist/{ink → render}/events/resize-event.d.ts +0 -0
  212. /package/dist/{ink → render}/events/terminal-event.d.ts +0 -0
  213. /package/dist/{ink → render}/events/terminal-focus-event.d.ts +0 -0
  214. /package/dist/{ink → render}/focus.d.ts +0 -0
  215. /package/dist/{ink → render}/frame.d.ts +0 -0
  216. /package/dist/{ink → render}/get-max-width.d.ts +0 -0
  217. /package/dist/{ink → render}/hit-test.d.ts +0 -0
  218. /package/dist/{ink → render}/hooks/use-animation-frame.d.ts +0 -0
  219. /package/dist/{ink → render}/hooks/use-app.d.ts +0 -0
  220. /package/dist/{ink → render}/hooks/use-declared-cursor.d.ts +0 -0
  221. /package/dist/{ink → render}/hooks/use-interval.d.ts +0 -0
  222. /package/dist/{ink → render}/hooks/use-search-highlight.d.ts +0 -0
  223. /package/dist/{ink → render}/hooks/use-selection.d.ts +0 -0
  224. /package/dist/{ink → render}/hooks/use-stdin.d.ts +0 -0
  225. /package/dist/{ink → render}/hooks/use-tab-status.d.ts +0 -0
  226. /package/dist/{ink → render}/hooks/use-terminal-focus.d.ts +0 -0
  227. /package/dist/{ink → render}/hooks/use-terminal-title.d.ts +0 -0
  228. /package/dist/{ink → render}/hooks/use-terminal-viewport.d.ts +0 -0
  229. /package/dist/{ink → render}/index.d.ts +0 -0
  230. /package/dist/{ink → render}/ink.d.ts +0 -0
  231. /package/dist/{ink → render}/instances.d.ts +0 -0
  232. /package/dist/{ink → render}/layout/engine.d.ts +0 -0
  233. /package/dist/{ink → render}/layout/geometry.d.ts +0 -0
  234. /package/dist/{ink → render}/layout/node.d.ts +0 -0
  235. /package/dist/{ink → render}/layout/yoga.d.ts +0 -0
  236. /package/dist/{ink → render}/line-width-cache.d.ts +0 -0
  237. /package/dist/{ink → render}/log-update.d.ts +0 -0
  238. /package/dist/{ink → render}/measure-element.d.ts +0 -0
  239. /package/dist/{ink → render}/measure-text.d.ts +0 -0
  240. /package/dist/{ink → render}/node-cache.d.ts +0 -0
  241. /package/dist/{ink → render}/optimizer.d.ts +0 -0
  242. /package/dist/{ink → render}/output.d.ts +0 -0
  243. /package/dist/{ink → render}/parse-keypress.d.ts +0 -0
  244. /package/dist/{ink → render}/reconciler.d.ts +0 -0
  245. /package/dist/{ink → render}/render-border.d.ts +0 -0
  246. /package/dist/{ink → render}/render-node-to-output.d.ts +0 -0
  247. /package/dist/{ink → render}/render-to-screen.d.ts +0 -0
  248. /package/dist/{ink → render}/renderer.d.ts +0 -0
  249. /package/dist/{ink → render}/root.d.ts +0 -0
  250. /package/dist/{ink → render}/screen.d.ts +0 -0
  251. /package/dist/{ink → render}/searchHighlight.d.ts +0 -0
  252. /package/dist/{ink → render}/selection.d.ts +0 -0
  253. /package/dist/{ink → render}/squash-text-nodes.d.ts +0 -0
  254. /package/dist/{ink → render}/stringWidth.d.ts +0 -0
  255. /package/dist/{ink → render}/styles.d.ts +0 -0
  256. /package/dist/{ink → render}/supports-hyperlinks.d.ts +0 -0
  257. /package/dist/{ink → render}/tabstops.d.ts +0 -0
  258. /package/dist/{ink → render}/terminal-focus-state.d.ts +0 -0
  259. /package/dist/{ink → render}/terminal-querier.d.ts +0 -0
  260. /package/dist/{ink → render}/terminal.d.ts +0 -0
  261. /package/dist/{ink → render}/termio/ansi.d.ts +0 -0
  262. /package/dist/{ink → render}/termio/csi.d.ts +0 -0
  263. /package/dist/{ink → render}/termio/dec.d.ts +0 -0
  264. /package/dist/{ink → render}/termio/esc.d.ts +0 -0
  265. /package/dist/{ink → render}/termio/osc.d.ts +0 -0
  266. /package/dist/{ink → render}/termio/parser.d.ts +0 -0
  267. /package/dist/{ink → render}/termio/sgr.d.ts +0 -0
  268. /package/dist/{ink → render}/termio/tokenize.d.ts +0 -0
  269. /package/dist/{ink → render}/termio/types.d.ts +0 -0
  270. /package/dist/{ink → render}/termio.d.ts +0 -0
  271. /package/dist/{ink → render}/useTerminalNotification.d.ts +0 -0
  272. /package/dist/{ink → render}/warn.d.ts +0 -0
  273. /package/dist/{ink → render}/widest-line.d.ts +0 -0
  274. /package/dist/{ink → render}/wrap-text.d.ts +0 -0
  275. /package/dist/{ink → render}/wrapAnsi.d.ts +0 -0
@@ -5,14 +5,29 @@ import type { ToolCall, ToolResult, Message } from "../types.js";
5
5
  import type { HookRegistry } from "../hooks/registry.js";
6
6
  import { ToolRegistry } from "./registry.js";
7
7
  import { PermissionClassifier } from "./permission.js";
8
+ import { logger as rootLogger } from "../logging/logger.js";
9
+ import type { ToolContext } from "./context.js";
10
+ type Logger = typeof rootLogger;
8
11
  export declare class ToolExecutor {
9
12
  private readonly registry;
10
13
  private readonly permission;
11
14
  private readonly hooks;
12
15
  private signal?;
16
+ /** Per-Engine ToolContext injected for every tool call. */
17
+ private toolCtx?;
18
+ /**
19
+ * Turn-scoped logger set by TurnLoop at the top of each iteration.
20
+ * Falls back to the root logger so executor calls outside the turn loop
21
+ * (tests, ad-hoc tool runs) still write log lines, just without turn tags.
22
+ */
23
+ private log;
13
24
  constructor(registry: ToolRegistry, permission: PermissionClassifier, hooks: HookRegistry);
14
25
  /** Set the abort signal for cascading cancellation. */
15
26
  setSignal(signal?: AbortSignal): void;
27
+ /** Set the per-Engine ToolContext (askUser, llmConfig, modelPool, etc.). */
28
+ setContext(ctx: ToolContext | undefined): void;
29
+ /** Inject a turn-scoped logger so tool-execution lines carry turn/turnId. */
30
+ setLogger(log: Logger): void;
16
31
  /** Check if a tool is safe for concurrent execution (read-only). */
17
32
  isConcurrencySafe(toolName: string): boolean;
18
33
  executeSingle(call: ToolCall): Promise<ToolResult>;
@@ -23,3 +38,4 @@ export declare class ToolExecutor {
23
38
  */
24
39
  resultsToMessages(toolCalls: ToolCall[], results: ToolResult[]): Message[];
25
40
  }
41
+ export {};
@@ -2,6 +2,7 @@
2
2
  * Permission system — classifier + approval backend.
3
3
  */
4
4
  import type { PermissionDecision, PermissionMode, PermissionRule, ApprovalRequest, ApprovalResult } from "../types.js";
5
+ import { logger as rootPermLogger } from "../logging/logger.js";
5
6
  export interface ApprovalBackend {
6
7
  requestApproval(request: ApprovalRequest): Promise<ApprovalResult>;
7
8
  }
@@ -22,14 +23,33 @@ export declare class AutoApprovalBackend implements ApprovalBackend {
22
23
  }
23
24
  /**
24
25
  * Interactive approval backend — prompts the user via a callback.
25
- * Supports "always allow" rules that persist for the session.
26
+ *
27
+ * Stores "always allow" decisions at two scopes:
28
+ * - session: in-memory map, lost when the process exits
29
+ * - project: persisted to <cwd>/.code-shell/settings.local.json so the
30
+ * same project remembers the rule across REPL restarts
31
+ *
32
+ * The classifier reads project rules from settings on session start (see
33
+ * Engine.buildPermissionConfig), so persisted rules become "auto-allow"
34
+ * the next time the user opens the project.
26
35
  */
27
36
  export declare class InteractiveApprovalBackend implements ApprovalBackend {
28
37
  private sessionRules;
29
38
  private promptFn;
39
+ private cwd;
40
+ private savedProjectRules;
41
+ private onProjectRules;
30
42
  setPromptFn(fn: (request: ApprovalRequest) => Promise<ApprovalResult>): void;
43
+ /** Inject the project root so persistence writes to the right settings file. */
44
+ setCwd(cwd: string): void;
45
+ /**
46
+ * Inject a callback fired when the user approves "for this project". The
47
+ * callback receives the *full* accumulated list of project rules saved in
48
+ * this session, so the classifier can be reconfigured without losing
49
+ * earlier approvals.
50
+ */
51
+ setOnProjectRules(fn: (rules: PermissionRule[]) => void): void;
31
52
  requestApproval(req: ApprovalRequest): Promise<ApprovalResult>;
32
- private ruleKeyFromArgs;
33
53
  }
34
54
  export declare function getInteractiveApprovalBackend(): InteractiveApprovalBackend;
35
55
  export declare function setInteractiveApprovalFn(fn: (request: ApprovalRequest) => Promise<ApprovalResult>): void;
@@ -52,11 +72,21 @@ export declare class DenialTracker {
52
72
  export declare function setRuntimeBypass(enabled: boolean): void;
53
73
  export declare function isRuntimeBypass(): boolean;
54
74
  export declare class PermissionClassifier {
55
- private readonly rules;
56
- private readonly defaultMode;
57
- private readonly approvalBackend;
75
+ private rules;
76
+ private defaultMode;
77
+ private approvalBackend;
58
78
  private denialTracker;
79
+ /**
80
+ * Turn-scoped logger so permission events (ask/decision/auto-deny) are
81
+ * tagged with the current turn/turnId. Falls back to the root logger so
82
+ * tests and ad-hoc usages still write log lines.
83
+ */
84
+ private log;
59
85
  constructor(rules: PermissionRule[], defaultMode?: PermissionMode, approvalBackend?: ApprovalBackend);
86
+ setLogger(log: typeof rootPermLogger): void;
87
+ /** Replace mode + backend in place so live tool execution sees the change. */
88
+ reconfigure(mode: PermissionMode, approvalBackend: ApprovalBackend, rules?: PermissionRule[]): void;
89
+ getMode(): PermissionMode;
60
90
  classify(toolName: string, args: Record<string, unknown>): PermissionDecision;
61
91
  handleAsk(toolName: string, args: Record<string, unknown>): Promise<boolean>;
62
92
  /** Get denial warning message if the model keeps getting denied. */
@@ -64,6 +94,11 @@ export declare class PermissionClassifier {
64
94
  private matchesRule;
65
95
  private isDangerousCommand;
66
96
  private assessRisk;
97
+ /**
98
+ * Short, human-friendly subtitle. The UI shows this under the tool title;
99
+ * full args (command bodies, diffs, etc.) come from the args field, so this
100
+ * stays compact — no truncation here, just a label.
101
+ */
67
102
  private describeToolCall;
68
103
  }
69
104
  export {};
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { RegisteredTool, ToolDefinition, ToolResult } from "../types.js";
5
5
  import { type BuiltinToolFn } from "./builtin/index.js";
6
+ import type { ToolContext } from "./context.js";
6
7
  /**
7
8
  * Default execution timeout for any tool that does not declare its own
8
9
  * timeoutMs at registration time. Tools that need to run longer (Agent,
@@ -24,6 +25,7 @@ export declare class ToolRegistry {
24
25
  executeTool(name: string, args: Record<string, unknown>, options?: {
25
26
  timeoutMs?: number;
26
27
  signal?: AbortSignal;
28
+ ctx?: ToolContext;
27
29
  }): Promise<ToolResult>;
28
30
  listTools(): string[];
29
31
  listToolsDetailed(): RegisteredTool[];
package/dist/types.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Core type definitions for the code-shell orchestration framework.
3
3
  */
4
4
  export interface ContentBlock {
5
- type: "text" | "tool_use" | "tool_result" | "image";
5
+ type: "text" | "tool_use" | "tool_result" | "image" | "reasoning";
6
6
  text?: string;
7
7
  id?: string;
8
8
  name?: string;
@@ -14,6 +14,7 @@ export interface ContentBlock {
14
14
  media_type: string;
15
15
  data: string;
16
16
  };
17
+ reasoningContent?: string;
17
18
  }
18
19
  export interface Message {
19
20
  role: "system" | "user" | "assistant" | "tool";
@@ -124,14 +125,25 @@ export interface ApprovalRequest {
124
125
  description: string;
125
126
  riskLevel: "low" | "medium" | "high";
126
127
  }
128
+ /**
129
+ * Scope of an "always allow" decision.
130
+ * "once" — this single call only (default when always not set)
131
+ * "session" — remembered for the rest of the REPL session (in-memory)
132
+ * "project" — persisted to <cwd>/.code-shell/settings.local.json so it
133
+ * survives restart for the current project. Not committed.
134
+ */
135
+ export type ApprovalScope = "once" | "session" | "project";
127
136
  export type ApprovalResult = {
128
137
  approved: true;
129
138
  permanent?: boolean;
130
139
  always?: boolean;
140
+ scope?: ApprovalScope;
141
+ /** Used by AskUserQuestion to carry the user's free-text answer. */ answer?: string;
131
142
  } | {
132
143
  approved: false;
133
144
  reason?: string;
134
145
  always?: boolean;
146
+ scope?: ApprovalScope;
135
147
  };
136
148
  export type TurnPhase = "pre_check" | "model_call" | "post_check" | "tool_exec" | "context_mgmt" | "hook_notify" | "complete" | "error";
137
149
  export interface TurnResult {
@@ -148,6 +160,9 @@ export interface TaskInfo {
148
160
  status: "pending" | "in_progress" | "completed" | "stopped";
149
161
  }
150
162
  export type StreamEvent = {
163
+ type: "session_started";
164
+ sessionId: string;
165
+ } | {
151
166
  type: "stream_request_start";
152
167
  turnNumber: number;
153
168
  agentId?: string;
@@ -159,6 +174,11 @@ export type StreamEvent = {
159
174
  type: "tool_use_start";
160
175
  toolCall: ToolCall;
161
176
  agentId?: string;
177
+ } | {
178
+ type: "tool_use_args_delta";
179
+ toolCallId: string;
180
+ args: Record<string, unknown>;
181
+ agentId?: string;
162
182
  } | {
163
183
  type: "tool_result";
164
184
  result: ToolResult;
@@ -197,6 +217,12 @@ export type StreamEvent = {
197
217
  } | {
198
218
  type: "tool_summary";
199
219
  summary: string;
220
+ } | {
221
+ type: "context_compact";
222
+ strategy: "summary" | "window" | "snip" | "emergency";
223
+ before: number;
224
+ after: number;
225
+ agentId?: string;
200
226
  };
201
227
  export type StreamCallback = (event: StreamEvent) => void | Promise<void>;
202
228
  export interface LLMConfig {
@@ -216,6 +242,7 @@ export interface LLMResponse {
216
242
  toolCalls: ToolCall[];
217
243
  usage?: TokenUsage;
218
244
  stopReason?: string;
245
+ reasoningContent?: string;
219
246
  }
220
247
  export interface LLMStreamChunk {
221
248
  type: "text" | "tool_use_start" | "tool_use_delta" | "tool_use_end" | "stop";
package/dist/ui/App.d.ts CHANGED
@@ -10,5 +10,5 @@ interface AppProps {
10
10
  /** Pre-fill the input box without submitting (--prefill flag). */
11
11
  prefill?: string;
12
12
  }
13
- export declare function App({ client, model: initialModel, effort, maxTurns, cwd, maxContextTokens, sessionId: initialSessionId, prefill }: AppProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare function App({ client, model: initialModel, effort, maxTurns, cwd, maxContextTokens, sessionId: initialSessionId, prefill, }: AppProps): import("react/jsx-runtime").JSX.Element;
14
14
  export {};
@@ -25,7 +25,7 @@ export declare function AgentBlockEnd({ description, error, isLast }: AgentBlock
25
25
  /**
26
26
  * Tree line prefix for nested content under an agent.
27
27
  */
28
- export declare function NestedPrefix({ children, isLast }: {
28
+ export declare function NestedPrefix({ children, isLast, }: {
29
29
  children: React.ReactNode;
30
30
  isLast?: boolean;
31
31
  }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ interface AskUserPromptProps {
2
+ question: string;
3
+ onAnswer: (answer: string) => void;
4
+ onCancel: () => void;
5
+ }
6
+ export declare function AskUserPrompt({ question, onAnswer, onCancel }: AskUserPromptProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -1,22 +1,26 @@
1
1
  interface MessageContentProps {
2
2
  text: string;
3
3
  streaming?: boolean;
4
+ /** When rendered inside an agent block, suppress the leading message gap. */
5
+ nested?: boolean;
4
6
  }
5
- export declare function MessageContent({ text, streaming }: MessageContentProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export declare function MessageContent({ text, streaming, nested }: MessageContentProps): import("react/jsx-runtime").JSX.Element | null;
6
8
  interface UserMessageProps {
7
9
  text: string;
8
10
  }
9
11
  export declare function UserMessage({ text }: UserMessageProps): import("react/jsx-runtime").JSX.Element;
10
12
  interface ErrorMessageProps {
11
13
  error: string;
14
+ nested?: boolean;
12
15
  }
13
- export declare function ErrorMessage({ error }: ErrorMessageProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function ErrorMessage({ error, nested }: ErrorMessageProps): import("react/jsx-runtime").JSX.Element;
14
17
  export declare function RateLimitMessage({ text }: {
15
18
  text: string;
16
19
  }): import("react/jsx-runtime").JSX.Element;
17
20
  export declare function ContextLimitMessage(): import("react/jsx-runtime").JSX.Element;
18
- export declare function ThinkingMessage({ content, collapsed }: {
21
+ export declare function ThinkingMessage({ content, collapsed, nested, }: {
19
22
  content?: string;
20
23
  collapsed?: boolean;
24
+ nested?: boolean;
21
25
  }): import("react/jsx-runtime").JSX.Element;
22
26
  export {};
@@ -0,0 +1,35 @@
1
+ import type { ProtocolModelEntry } from "../../protocol/types.js";
2
+ interface SnapshotInfo {
3
+ count: number;
4
+ fetchedAt: string;
5
+ }
6
+ /**
7
+ * Settings stores arena.participants as Array<string | object>. The panel
8
+ * surfaces strings (pool keys); object-form entries are shown read-only so
9
+ * we don't clobber a user's hand-edited config.
10
+ */
11
+ export type ArenaParticipantEntry = {
12
+ kind: "key";
13
+ value: string;
14
+ } | {
15
+ kind: "object";
16
+ label: string;
17
+ };
18
+ interface ModelManagerProps {
19
+ entries: ProtocolModelEntry[];
20
+ snapshot: SnapshotInfo;
21
+ arenaParticipants: ArenaParticipantEntry[];
22
+ /** Activate a model. */
23
+ onSwitch: (key: string) => Promise<void>;
24
+ /** Trigger an OpenRouter snapshot refresh. */
25
+ onSync: () => Promise<{
26
+ ok: boolean;
27
+ count: number;
28
+ error?: string;
29
+ }>;
30
+ /** Persist updated participant list (string[]) to settings. */
31
+ onSaveArena: (participants: string[]) => Promise<void>;
32
+ onClose: () => void;
33
+ }
34
+ export declare function ModelManager({ entries, snapshot, arenaParticipants, onSwitch, onSync, onSaveArena, onClose, }: ModelManagerProps): import("react/jsx-runtime").JSX.Element;
35
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { ProtocolModelEntry } from "../../protocol/types.js";
2
+ /** Re-export under the UI name for convenience. */
3
+ export type ModelEntry = ProtocolModelEntry;
4
+ interface ModelSelectorProps {
5
+ entries: ModelEntry[];
6
+ onSelect: (key: string) => void;
7
+ onCancel: () => void;
8
+ }
9
+ export declare function ModelSelector({ entries, onSelect, onCancel }: ModelSelectorProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,7 @@
1
+ import { type OnboardingResult } from "../../cli/onboarding.js";
2
+ interface OnboardingPromptProps {
3
+ onComplete: (result: OnboardingResult) => void;
4
+ onCancel: () => void;
5
+ }
6
+ export declare function OnboardingPrompt({ onComplete, onCancel }: OnboardingPromptProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export {};
@@ -1,8 +1,11 @@
1
+ import type { ApprovalScope } from "../../types.js";
1
2
  interface PermissionPromptProps {
2
3
  toolName: string;
3
4
  description: string;
4
5
  riskLevel: string;
5
- onDecision: (approved: boolean, always: boolean) => void;
6
+ args: Record<string, unknown>;
7
+ cwd: string;
8
+ onDecision: (approved: boolean, scope: ApprovalScope) => void;
6
9
  }
7
- export declare function PermissionPrompt({ toolName, description, riskLevel, onDecision }: PermissionPromptProps): import("react/jsx-runtime").JSX.Element;
10
+ export declare function PermissionPrompt({ toolName, description, riskLevel, args, cwd, onDecision, }: PermissionPromptProps): import("react/jsx-runtime").JSX.Element;
8
11
  export {};
@@ -0,0 +1,14 @@
1
+ export interface SessionPickerEntry {
2
+ sessionId: string;
3
+ startedAt: number;
4
+ turnCount: number;
5
+ preview?: string;
6
+ cwd?: string;
7
+ }
8
+ interface SessionPickerProps {
9
+ entries: SessionPickerEntry[];
10
+ onSelect: (sessionId: string) => void;
11
+ onCancel: () => void;
12
+ }
13
+ export declare function SessionPicker({ entries, onSelect, onCancel }: SessionPickerProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -12,11 +12,13 @@ interface StatusLineProps {
12
12
  tokens: number;
13
13
  cost: number;
14
14
  sessionId?: string;
15
- contextPercent?: number;
15
+ /** Last known prompt tokens from completed turn. Live streaming is added on top. */
16
+ baseContextTokens?: number;
17
+ maxContextTokens?: number;
16
18
  gitBranch?: string;
17
19
  isRunning?: boolean;
18
20
  streamingCharsRef?: MutableRefObject<number>;
19
21
  runStartRef?: MutableRefObject<number>;
20
22
  }
21
- export declare function StatusLine({ model, effort, tokens, cost, sessionId, contextPercent, gitBranch, isRunning, streamingCharsRef, runStartRef, }: StatusLineProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function StatusLine({ model, effort, tokens, cost, sessionId, baseContextTokens, maxContextTokens, gitBranch, isRunning, streamingCharsRef, runStartRef, }: StatusLineProps): import("react/jsx-runtime").JSX.Element;
22
24
  export {};
@@ -7,7 +7,7 @@
7
7
  * version uses the lightweight ui/theme.ts context.
8
8
  */
9
9
  import React from "react";
10
- import { type BoxProps } from "../../ink/index.js";
10
+ import { type BoxProps } from "../../render/index.js";
11
11
  import type { Theme } from "../../utils/theme.js";
12
12
  type ColorProp = keyof Theme | string;
13
13
  export interface ThemedBoxProps extends Omit<BoxProps, "borderColor" | "backgroundColor"> {
@@ -16,6 +16,13 @@ interface ToolCallResultProps {
16
16
  nested?: boolean;
17
17
  /** When true, show full output instead of collapsed preview. */
18
18
  expanded?: boolean;
19
+ /**
20
+ * When true, render as a single dim line — used for transient
21
+ * "this attempt failed and was retried" cases (e.g. Arena's
22
+ * fail-fast endpoint check) so the feed isn't swamped with scary
23
+ * red error cards for what was just a parameter fix-up.
24
+ */
25
+ compact?: boolean;
19
26
  }
20
- export declare function ToolCallResult({ toolName, result, error, nested, expanded: forceExpand }: ToolCallResultProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function ToolCallResult({ toolName, result, error, nested, expanded: forceExpand, compact, }: ToolCallResultProps): import("react/jsx-runtime").JSX.Element;
21
28
  export {};
@@ -0,0 +1,5 @@
1
+ interface WelcomeTipsProps {
2
+ cwd: string;
3
+ }
4
+ export declare function WelcomeTips({ cwd }: WelcomeTipsProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { OnboardingResult } from "../cli/onboarding.js";
2
+ export declare function runInkOnboarding(): Promise<OnboardingResult | null>;
@@ -17,6 +17,7 @@ type ChatEntryData = {
17
17
  type: "tool_start";
18
18
  toolName: string;
19
19
  args: Record<string, unknown>;
20
+ toolCallId?: string;
20
21
  agentId?: string;
21
22
  } | {
22
23
  type: "tool_running";
@@ -8,7 +8,7 @@ var require_package = _chunkIJSHQGMPcjs.__commonJS.call(void 0, {
8
8
  "package.json"(exports, module) {
9
9
  module.exports = {
10
10
  name: "@cjhyy/code-shell",
11
- version: "0.1.0-alpha.1",
11
+ version: "0.1.0-alpha.3",
12
12
  description: "Code Shell \u2014 general-purpose agent orchestration framework with a terminal coding preset",
13
13
  type: "module",
14
14
  main: "./dist/index.cjs",
@@ -52,9 +52,11 @@ var require_package = _chunkIJSHQGMPcjs.__commonJS.call(void 0, {
52
52
  access: "public"
53
53
  },
54
54
  scripts: {
55
- build: "bun run tsup && bun run build:dts",
55
+ preinstall: "node scripts/check-node.cjs",
56
+ build: "bun run sync-models && bun run tsup && bun run build:dts",
56
57
  "build:dts": "tsc --emitDeclarationOnly --declaration --outDir dist || true",
57
- dev: "bun run src/cli/main.ts",
58
+ "sync-models": "bun run scripts/sync-models.ts",
59
+ dev: "CODE_SHELL_DEV=1 bun run src/cli/main.ts",
58
60
  test: "bun test",
59
61
  "test:watch": "bun test --watch",
60
62
  lint: "eslint src/",
@@ -63,10 +65,11 @@ var require_package = _chunkIJSHQGMPcjs.__commonJS.call(void 0, {
63
65
  prepublishOnly: "bun run build"
64
66
  },
65
67
  engines: {
66
- node: ">=20"
68
+ node: ">=20.10"
67
69
  },
68
70
  files: [
69
71
  "dist",
72
+ "scripts/check-node.cjs",
70
73
  "README.md",
71
74
  "LICENSE",
72
75
  "CHANGELOG.md"
@@ -100,7 +103,6 @@ var require_package = _chunkIJSHQGMPcjs.__commonJS.call(void 0, {
100
103
  "get-east-asian-width": "^1.5.0",
101
104
  glob: "^11.0.0",
102
105
  "indent-string": "^5.0.0",
103
- ink: "^6.8.0",
104
106
  "lodash-es": "^4.17.23",
105
107
  marked: "^17.0.5",
106
108
  "marked-terminal": "^7.3.0",
@@ -8,7 +8,7 @@ var require_package = __commonJS({
8
8
  "package.json"(exports, module) {
9
9
  module.exports = {
10
10
  name: "@cjhyy/code-shell",
11
- version: "0.1.0-alpha.1",
11
+ version: "0.1.0-alpha.3",
12
12
  description: "Code Shell \u2014 general-purpose agent orchestration framework with a terminal coding preset",
13
13
  type: "module",
14
14
  main: "./dist/index.cjs",
@@ -52,9 +52,11 @@ var require_package = __commonJS({
52
52
  access: "public"
53
53
  },
54
54
  scripts: {
55
- build: "bun run tsup && bun run build:dts",
55
+ preinstall: "node scripts/check-node.cjs",
56
+ build: "bun run sync-models && bun run tsup && bun run build:dts",
56
57
  "build:dts": "tsc --emitDeclarationOnly --declaration --outDir dist || true",
57
- dev: "bun run src/cli/main.ts",
58
+ "sync-models": "bun run scripts/sync-models.ts",
59
+ dev: "CODE_SHELL_DEV=1 bun run src/cli/main.ts",
58
60
  test: "bun test",
59
61
  "test:watch": "bun test --watch",
60
62
  lint: "eslint src/",
@@ -63,10 +65,11 @@ var require_package = __commonJS({
63
65
  prepublishOnly: "bun run build"
64
66
  },
65
67
  engines: {
66
- node: ">=20"
68
+ node: ">=20.10"
67
69
  },
68
70
  files: [
69
71
  "dist",
72
+ "scripts/check-node.cjs",
70
73
  "README.md",
71
74
  "LICENSE",
72
75
  "CHANGELOG.md"
@@ -100,7 +103,6 @@ var require_package = __commonJS({
100
103
  "get-east-asian-width": "^1.5.0",
101
104
  glob: "^11.0.0",
102
105
  "indent-string": "^5.0.0",
103
- ink: "^6.8.0",
104
106
  "lodash-es": "^4.17.23",
105
107
  marked: "^17.0.5",
106
108
  "marked-terminal": "^7.3.0",
@@ -1,35 +1,26 @@
1
1
  /**
2
- * Debug logging — category-filtered, leveled output with file support.
2
+ * Debug logging — thin facade over the unified logger.
3
3
  *
4
- * Activation:
5
- * CODE_SHELL_DEBUG=1 — all debug output to stderr
6
- * --debug — all debug output to file (~/.code-shell/debug/<session>.txt)
7
- * --debug=api,hooks — filtered categories only
8
- * --debug-file=/path/to/file — explicit output file
9
- * --debug-to-stderr / -d2e — force stderr output
4
+ * Historically this module wrote to ~/.code-shell/debug/<session>.txt.
5
+ * It now delegates to logger so all output lands in ~/.code-shell/logs/.
10
6
  *
11
- * Levels: verbose < debug < info < warn < error
12
- * Set CODE_SHELL_DEBUG_LOG_LEVEL=verbose to include high-volume diagnostics.
7
+ * Activation knobs (still honored, parsed inside logger):
8
+ * CODE_SHELL_LOG_LEVEL=debug — explicit level
9
+ * CODE_SHELL_DEBUG=mcp,api — category filter
10
+ * --debug — local dev: defaults to debug level
11
+ * --debug=mcp,api — category filter (CLI form)
12
+ * --debug-to-stderr / -d2e — echo to stderr instead of file
13
13
  */
14
- export type DebugLogLevel = "verbose" | "debug" | "info" | "warn" | "error";
15
- type DebugFilter = {
16
- categories: Set<string>;
17
- };
14
+ import { type LogLevel } from "../logging/logger.js";
15
+ export type DebugLogLevel = "verbose" | LogLevel;
18
16
  export declare function setDebugSessionId(id: string): void;
19
- export declare function getMinDebugLogLevel(): DebugLogLevel;
20
17
  export declare function isDebugMode(): boolean;
21
- /**
22
- * Enable debug logging mid-session (e.g. via /debug command).
23
- * Returns true if logging was already active.
24
- */
25
18
  export declare function enableDebugLogging(): boolean;
26
19
  export declare function isDebugToStdErr(): boolean;
27
- export declare function getDebugFilter(): DebugFilter | null;
28
- export declare function getDebugFilePath(): string | null;
20
+ export declare function getMinDebugLogLevel(): DebugLogLevel;
29
21
  /**
30
- * Log a debug message with optional level.
31
- * Output goes to stderr (--debug-to-stderr / CODE_SHELL_DEBUG=1)
32
- * or to a file (~/.code-shell/debug/<session>.txt).
22
+ * Log a debug message. Optional level via opts.level.
23
+ * Embedded `[category]` tags are extracted into the structured `cat` field.
33
24
  */
34
25
  export declare function logForDebugging(message: string, opts?: {
35
26
  level?: DebugLogLevel | string;
@@ -40,18 +31,11 @@ export declare function logForDebugging(message: string, opts?: {
40
31
  */
41
32
  export declare function debugCategory(category: string): (msg: string) => void;
42
33
  /**
43
- * Time a function and log the duration.
34
+ * Time a function and log the duration at debug level.
44
35
  */
45
36
  export declare function debugTiming<T>(label: string, fn: () => T | Promise<T>): Promise<T>;
46
- /**
47
- * CC compatibility: log errors for Anthropic internal users.
48
- * In Code Shell this is a debug-level error log.
49
- */
50
37
  export declare function logAntError(msg: string, _err?: unknown): void;
51
- /**
52
- * CC compatibility exports.
53
- */
54
- export declare function setHasFormattedOutput(_value: boolean): void;
38
+ export declare function getDebugFilePath(): string | null;
39
+ export declare function setHasFormattedOutput(_v: boolean): void;
55
40
  export declare function getHasFormattedOutput(): boolean;
56
41
  export declare function flushDebugLogs(): Promise<void>;
57
- export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cjhyy/code-shell",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.3",
4
4
  "description": "Code Shell — general-purpose agent orchestration framework with a terminal coding preset",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -44,9 +44,11 @@
44
44
  "access": "public"
45
45
  },
46
46
  "scripts": {
47
- "build": "bun run tsup && bun run build:dts",
47
+ "preinstall": "node scripts/check-node.cjs",
48
+ "build": "bun run sync-models && bun run tsup && bun run build:dts",
48
49
  "build:dts": "tsc --emitDeclarationOnly --declaration --outDir dist || true",
49
- "dev": "bun run src/cli/main.ts",
50
+ "sync-models": "bun run scripts/sync-models.ts",
51
+ "dev": "CODE_SHELL_DEV=1 bun run src/cli/main.ts",
50
52
  "test": "bun test",
51
53
  "test:watch": "bun test --watch",
52
54
  "lint": "eslint src/",
@@ -55,10 +57,11 @@
55
57
  "prepublishOnly": "bun run build"
56
58
  },
57
59
  "engines": {
58
- "node": ">=20"
60
+ "node": ">=20.10"
59
61
  },
60
62
  "files": [
61
63
  "dist",
64
+ "scripts/check-node.cjs",
62
65
  "README.md",
63
66
  "LICENSE",
64
67
  "CHANGELOG.md"
@@ -92,7 +95,6 @@
92
95
  "get-east-asian-width": "^1.5.0",
93
96
  "glob": "^11.0.0",
94
97
  "indent-string": "^5.0.0",
95
- "ink": "^6.8.0",
96
98
  "lodash-es": "^4.17.23",
97
99
  "marked": "^17.0.5",
98
100
  "marked-terminal": "^7.3.0",
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ const REQUIRED_MAJOR = 20;
3
+ const REQUIRED_MINOR = 10;
4
+
5
+ const [major, minor] = process.versions.node.split('.').map(Number);
6
+
7
+ if (major < REQUIRED_MAJOR || (major === REQUIRED_MAJOR && minor < REQUIRED_MINOR)) {
8
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
9
+ const bold = (s) => `\x1b[1m${s}\x1b[0m`;
10
+ console.error('');
11
+ console.error(red(bold('✖ @cjhyy/code-shell requires Node.js >= 20.10')));
12
+ console.error(` current: ${process.versions.node}`);
13
+ console.error('');
14
+ console.error(' Some dependencies use ESM import attributes (`with { type: "json" }`),');
15
+ console.error(' which Node 16/18 do not support.');
16
+ console.error('');
17
+ console.error(' Fix: install Node 20.10+ (or 22 LTS) via nvm:');
18
+ console.error(' nvm install 22 && nvm use 22');
19
+ console.error('');
20
+ process.exit(1);
21
+ }