@cjhyy/code-shell 0.1.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/README.md +35 -2
  3. package/dist/anthropic-DJXVKFMJ.js +1 -0
  4. package/dist/arena/index.js +1 -1
  5. package/dist/arena-MRBATZFD.js +3 -0
  6. package/dist/chunk-2OD6VR4N.js +2 -0
  7. package/dist/{chunk-RP26WO4R.js → chunk-5QIVXFCT.js} +1 -1
  8. package/dist/{chunk-NFH3UQ3E.js → chunk-AFMP73YP.js} +1 -1
  9. package/dist/{chunk-XDOWC7EG.js → chunk-D3TVASD2.js} +2 -2
  10. package/dist/chunk-DI26OUIU.js +2 -0
  11. package/dist/chunk-FZXY554D.js +2 -0
  12. package/dist/chunk-GGVAOPI7.js +1 -0
  13. package/dist/chunk-GKAQH2DG.js +2 -0
  14. package/dist/chunk-GYNO4R7R.js +2 -0
  15. package/dist/{chunk-Q4O2HGWS.js → chunk-K4HILJ6G.js} +3 -3
  16. package/dist/chunk-M7VU4YVY.js +49 -0
  17. package/dist/chunk-MLCTC53I.js +1 -0
  18. package/dist/{chunk-HIJ2XXGX.js → chunk-OWBYLMDD.js} +1 -1
  19. package/dist/chunk-SKIX2M5Z.js +4 -0
  20. package/dist/chunk-SV7H4FKT.js +3 -0
  21. package/dist/{chunk-Y2NS6HPO.js → chunk-WONQHE4P.js} +41 -41
  22. package/dist/{chunk-WOP6MJKW.js → chunk-X2S7ASQ2.js} +1 -1
  23. package/dist/chunk-Z5HKHAO7.js +336 -0
  24. package/dist/cli/commands/builtin/plugin-commands-registration.d.ts +12 -0
  25. package/dist/cli/commands/builtin/plugin-handler.d.ts +6 -0
  26. package/dist/cli/commands/registry.d.ts +9 -2
  27. package/dist/cli/main.js +140 -124
  28. package/dist/cli/onboarding.d.ts +7 -2
  29. package/dist/client-base-GSFXPP2Y.js +1 -0
  30. package/dist/compaction-L3Y6NG4N.js +1 -0
  31. package/dist/context/compaction.d.ts +2 -1
  32. package/dist/data/static-catalogs.d.ts +25 -0
  33. package/dist/devtools-FBX4HVVY.js +1 -0
  34. package/dist/engine/engine.d.ts +45 -0
  35. package/dist/engine/turn-loop.d.ts +45 -0
  36. package/dist/hooks/events.d.ts +84 -5
  37. package/dist/hooks/inject.d.ts +19 -0
  38. package/dist/hooks/shell-runner.d.ts +45 -0
  39. package/dist/index.d.ts +4 -3
  40. package/dist/index.js +1 -1
  41. package/dist/llm/api-key-sanitize.d.ts +22 -0
  42. package/dist/llm/capabilities/index.d.ts +20 -0
  43. package/dist/llm/capabilities/rules.d.ts +26 -0
  44. package/dist/llm/capabilities/types.d.ts +108 -0
  45. package/dist/llm/model-pool.d.ts +7 -0
  46. package/dist/llm/provider-catalog.d.ts +2 -0
  47. package/dist/llm/provider-kinds.d.ts +1 -1
  48. package/dist/llm/providers/openai.d.ts +45 -0
  49. package/dist/llm/retry.d.ts +12 -0
  50. package/dist/llm/stream-watchdog.d.ts +42 -0
  51. package/dist/llm/types.d.ts +8 -0
  52. package/dist/logging/logger.d.ts +24 -2
  53. package/dist/logging/session-recorder.d.ts +16 -3
  54. package/dist/manager-4XKLZHKE.js +1 -0
  55. package/dist/mcp-manager-3JGHEJO3.js +1 -0
  56. package/dist/model-fetcher-X5W5EASG.js +1 -0
  57. package/dist/openai-OQ6LLN5J.js +1 -0
  58. package/dist/{openrouter-models-AM6M52D6.js → openrouter-models-ZT4R2AE3.js} +1 -1
  59. package/dist/openrouter-sync-ARMVWY7S.js +1 -0
  60. package/dist/plugin-handler-GJISMH5Q.js +11 -0
  61. package/dist/plugins/gitOps.d.ts +23 -0
  62. package/dist/plugins/installedPlugins.d.ts +15 -0
  63. package/dist/plugins/knownMarketplaces.d.ts +10 -0
  64. package/dist/plugins/loadPluginHooks.d.ts +52 -0
  65. package/dist/plugins/marketplaceManager.d.ts +49 -0
  66. package/dist/plugins/parseMarketplaceInput.d.ts +16 -0
  67. package/dist/plugins/pluginCommandHook.d.ts +54 -0
  68. package/dist/plugins/pluginCommandsLoader.d.ts +25 -0
  69. package/dist/plugins/pluginInstaller.d.ts +36 -0
  70. package/dist/plugins/schemas.d.ts +9 -0
  71. package/dist/plugins/types.d.ts +73 -2
  72. package/dist/plugins/varRewrite.d.ts +42 -0
  73. package/dist/product/index.js +1 -1
  74. package/dist/protocol/client.d.ts +1 -1
  75. package/dist/protocol/helpers.d.ts +42 -0
  76. package/dist/render/clearTerminal.d.ts +9 -3
  77. package/dist/render/components/App.d.ts +1 -0
  78. package/dist/render/components/Static.d.ts +23 -0
  79. package/dist/render/devtools.d.ts +8 -4
  80. package/dist/render/dom.d.ts +2 -1
  81. package/dist/render/frame.d.ts +1 -0
  82. package/dist/render/index.d.ts +10 -0
  83. package/dist/render/ink.d.ts +24 -2
  84. package/dist/render/log-update.d.ts +12 -1
  85. package/dist/render/selection.d.ts +1 -1
  86. package/dist/run/index.js +1 -1
  87. package/dist/{seatbelt-WBYROQT6.js → seatbelt-L54CNI2Y.js} +5 -5
  88. package/dist/services/index.d.ts +1 -0
  89. package/dist/services/memory-orchestrator.d.ts +39 -0
  90. package/dist/settings/schema.d.ts +168 -21
  91. package/dist/skills/frontmatter.d.ts +13 -0
  92. package/dist/skills/index.d.ts +4 -4
  93. package/dist/skills/scanner.d.ts +11 -21
  94. package/dist/tool-summary-HJX6RHG4.js +2 -0
  95. package/dist/tool-system/builtin/agent-notifications.d.ts +55 -0
  96. package/dist/tool-system/builtin/agent-registry.d.ts +35 -4
  97. package/dist/tool-system/builtin/agent-transcript-translator.d.ts +22 -0
  98. package/dist/tool-system/builtin/skill-prompt.d.ts +7 -0
  99. package/dist/tool-system/builtin/skill.d.ts +3 -1
  100. package/dist/tool-system/context.d.ts +23 -0
  101. package/dist/tool-system/executor.d.ts +5 -1
  102. package/dist/tool-system/permission.d.ts +1 -1
  103. package/dist/tool-system/sandbox/index.d.ts +7 -0
  104. package/dist/tool-system/task-guard.d.ts +30 -0
  105. package/dist/types.d.ts +48 -0
  106. package/dist/ui/components/AgentBlock.d.ts +5 -2
  107. package/dist/ui/components/AgentDock.d.ts +36 -0
  108. package/dist/ui/components/CommandInput.d.ts +12 -1
  109. package/dist/ui/components/MessageRow.d.ts +54 -0
  110. package/dist/ui/components/SpinnerWithVerb.d.ts +7 -1
  111. package/dist/ui/components/StatusLine.d.ts +5 -1
  112. package/dist/ui/components/TextInput.d.ts +9 -1
  113. package/dist/ui/components/VirtualMessageList.d.ts +30 -11
  114. package/dist/ui/dev-seed.d.ts +1 -0
  115. package/dist/ui/fullscreen-mode.d.ts +9 -0
  116. package/dist/ui/hooks/useVirtualScroll.d.ts +101 -0
  117. package/dist/ui/perf-probes.d.ts +22 -0
  118. package/dist/ui/query-guard.d.ts +35 -0
  119. package/dist/ui/slice-anchor.d.ts +44 -0
  120. package/dist/ui/store.d.ts +26 -1
  121. package/package.json +5 -3
  122. package/dist/anthropic-UBSB5AQH.js +0 -1
  123. package/dist/arena-OW55ZCHT.js +0 -3
  124. package/dist/chunk-2NS3JMNK.js +0 -1
  125. package/dist/chunk-B7K2OWKC.js +0 -2
  126. package/dist/chunk-EWWK56K6.js +0 -2
  127. package/dist/chunk-KCXSARAA.js +0 -1
  128. package/dist/chunk-NMBYBGC7.js +0 -250
  129. package/dist/chunk-NVAZJ5XS.js +0 -2
  130. package/dist/chunk-PGANL6F2.js +0 -3
  131. package/dist/chunk-UDPUTFQT.js +0 -2
  132. package/dist/chunk-W47Z7MGS.js +0 -33
  133. package/dist/client-base-6ZZJJYDY.js +0 -1
  134. package/dist/compaction-ECVQVOCT.js +0 -1
  135. package/dist/devtools-SGDUOOM4.js +0 -1
  136. package/dist/manager-C3TDN6MS.js +0 -1
  137. package/dist/mcp-manager-OP4XYV53.js +0 -1
  138. package/dist/model-fetcher-BJ64META.js +0 -1
  139. package/dist/openai-KEWQ54TM.js +0 -1
  140. package/dist/openrouter-sync-5JNBL3Z6.js +0 -1
  141. package/dist/plugins/loader.d.ts +0 -72
  142. package/dist/skills/matcher.d.ts +0 -21
  143. package/dist/tool-summary-5UE62VU4.js +0 -2
  144. package/skills-builtin/codeshell-help.md +0 -135
@@ -0,0 +1,35 @@
1
+ /**
2
+ * QueryGuard — synchronous state machine for "is a query in flight".
3
+ * Replaces React useState for isRunning. Subscribers (via useSyncExternalStore)
4
+ * see state changes immediately, bypassing React 18 batching that otherwise
5
+ * opens a 1–10 ms window for double-submit / dead-click bugs.
6
+ *
7
+ * States:
8
+ * idle — no query active
9
+ * reserved — processUserInput started its sync prep but hasn't created the AbortController yet
10
+ * running — AbortController attached; query is in flight
11
+ *
12
+ * The only writers are reserve/tryStart/cancelReservation/end/forceEnd.
13
+ * No setter is exposed.
14
+ */
15
+ export type QueryState = "idle" | "reserved" | "running";
16
+ export declare class QueryGuard {
17
+ private state;
18
+ private controller;
19
+ private listeners;
20
+ subscribe: (cb: () => void) => (() => void);
21
+ getSnapshot: () => boolean;
22
+ private notify;
23
+ /** Reserve a slot synchronously before the AbortController exists. */
24
+ reserve(): boolean;
25
+ /** Attach the AbortController. Must follow reserve(). */
26
+ tryStart(controller: AbortController): boolean;
27
+ /** Roll back reserve() when processUserInput threw before tryStart. */
28
+ cancelReservation(): void;
29
+ /** Normal completion — clean up without aborting (already finished). */
30
+ end(): void;
31
+ /** Hard abort: abort the controller AND clean up. */
32
+ forceEnd(reason?: string): void;
33
+ /** Read the current controller's signal; null when idle/reserved. */
34
+ getSignal(): AbortSignal | null;
35
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * SliceAnchor — UUID-anchored cap for the flow-mode chat slice.
3
+ *
4
+ * Flow mode renders all entries through Ink's normal diff path (no <Static>),
5
+ * relying on the terminal's native scrollback for history. To keep yoga
6
+ * layout and the screen buffer bounded, we slice the rendered list to a
7
+ * fixed cap. The naive `entries.slice(-CAP)` shifts the head by one on every
8
+ * append — that means row 0 of prev and row 0 of next describe different
9
+ * content, and log-update's diff sees changes at scrollback rows it can't
10
+ * reach, forcing a fullResetSequence_CAUSES_FLICKER per turn.
11
+ *
12
+ * Fix: anchor the slice start to a specific entry id and only advance when
13
+ * (entries.length - start) exceeds CAP + STEP. Quantizing in STEP-sized
14
+ * chunks turns "flicker every append" into "flicker every STEP appends".
15
+ *
16
+ * The anchor stores BOTH id and idx — if the anchored id disappears (rare
17
+ * for chat entries since ids are stable, but defensive), we fall back to
18
+ * the stored idx clamped into range, instead of resetting to 0 which would
19
+ * try to render the full history at once.
20
+ *
21
+ * Mirrors Claude Code's computeSliceStart in src/components/Messages.tsx.
22
+ */
23
+ export declare const DEFAULT_CAP = 200;
24
+ export declare const DEFAULT_STEP = 50;
25
+ export type SliceAnchor = {
26
+ id: string;
27
+ idx: number;
28
+ } | null;
29
+ export interface AnchorRef {
30
+ current: SliceAnchor;
31
+ }
32
+ /**
33
+ * Returns the index at which the rendered slice should start. May mutate
34
+ * `anchorRef.current` to refresh the stored anchor when the window advances
35
+ * or the anchored id has shifted in the entries array.
36
+ *
37
+ * @param entries - The full, post-filter chat entries (must expose `.id`).
38
+ * @param anchorRef - Mutable container for the persistent anchor.
39
+ * @param cap - Soft maximum entries to render. Window advances past this.
40
+ * @param step - Hysteresis: only advance when length exceeds cap + step.
41
+ */
42
+ export declare function computeSliceStart(entries: ReadonlyArray<{
43
+ id: string;
44
+ }>, anchorRef: AnchorRef, cap?: number, step?: number): number;
@@ -48,21 +48,36 @@ type ChatEntryData = {
48
48
  } | {
49
49
  type: "agent_start";
50
50
  agentId: string;
51
+ name?: string;
51
52
  description: string;
52
53
  } | {
53
54
  type: "agent_end";
54
55
  agentId: string;
56
+ name?: string;
55
57
  description: string;
58
+ text?: string;
56
59
  error?: string;
57
60
  };
58
61
  /** Specialized error kinds for smart rendering. */
59
62
  export type ErrorKind = "rate_limit" | "context_limit" | "invalid_api_key" | "api_timeout" | "credit_balance" | "generic";
60
63
  /** System message subtypes. */
61
- export type SystemSubtype = "compact_boundary" | "memory_saved" | "turn_duration" | "info";
64
+ export type SystemSubtype = "compact_boundary" | "memory_saved" | "turn_duration" | "info" | "bg_agent_notification";
62
65
  export type ChatEntry = ChatEntryData & {
63
66
  id: string;
64
67
  };
65
68
  export declare function createEntry(data: ChatEntryData): ChatEntry;
69
+ /**
70
+ * "Finalized" = entry's content is stable; further stream events will not
71
+ * mutate it in place. Used by VirtualMessageList flow mode to route entries
72
+ * into <Static> (append-only, never re-rendered) vs. the active region (kept
73
+ * in React tree and re-rendered on each delta).
74
+ *
75
+ * assistant_text → final once streaming flips to false
76
+ * tool_running → transient, always replaced by tool_result; not final
77
+ * thinking → transient, filtered out on next tool_use_start
78
+ * everything else → final on append
79
+ */
80
+ export declare function isEntryFinalized(e: ChatEntry): boolean;
66
81
  type Listener = () => void;
67
82
  declare class ChatStore {
68
83
  private entries;
@@ -74,6 +89,16 @@ declare class ChatStore {
74
89
  append(data: ChatEntryData): void;
75
90
  /** Functional update — same API as setState(fn). */
76
91
  update(fn: (prev: ChatEntry[]) => ChatEntry[]): void;
92
+ /**
93
+ * Commit the in-flight streaming assistant entry as a final (non-streaming)
94
+ * message, optionally appending a suffix (e.g., "[Request interrupted by user]").
95
+ * Drops any thinking entries — model scratch, no user value after interruption.
96
+ * No-op if there is no streaming entry.
97
+ *
98
+ * Empty-text streaming entry is finalized in place (streaming=false) without
99
+ * suffix — keeps the store transition consistent without persisting noise.
100
+ */
101
+ commitInterruptedStreaming(suffix: string): void;
77
102
  clear(): void;
78
103
  subscribe(listener: Listener): () => void;
79
104
  private notify;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cjhyy/code-shell",
3
- "version": "0.1.7",
3
+ "version": "0.3.0",
4
4
  "description": "Code Shell — general-purpose agent orchestration framework with a terminal coding preset",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -44,10 +44,13 @@
44
44
  "build": "bun run sync-models && bun run tsup && bun run build:dts",
45
45
  "build:dts": "tsc --emitDeclarationOnly --declaration --outDir dist || true",
46
46
  "sync-models": "bun run scripts/sync-models.ts",
47
- "dev": "CODE_SHELL_DEV=1 bun run src/cli/main.ts",
47
+ "dev": "CODE_SHELL_DEV=1 CODESHELL_UI_PERF=1 bun run src/cli/main.ts",
48
+ "dev:bigtranscript": "bun run scripts/render-bigtranscript-dev.ts",
48
49
  "test": "bun test",
50
+ "bench:render": "bun run bench/render-tail.bench.ts && bun run bench/render-streaming.bench.ts && bun run bench/render-spinner.bench.ts && bun run bench/render-wheel.bench.ts",
49
51
  "test:watch": "bun test --watch",
50
52
  "lint": "eslint src/",
53
+ "lint:engine-bypass": "bash scripts/check-no-engine-bypass.sh",
51
54
  "format": "prettier --write 'src/**/*.ts'",
52
55
  "typecheck": "bun run tsc --noEmit",
53
56
  "prepublishOnly": "bun run build"
@@ -58,7 +61,6 @@
58
61
  "files": [
59
62
  "dist",
60
63
  "scripts/check-node.cjs",
61
- "skills-builtin",
62
64
  "README.md",
63
65
  "LICENSE",
64
66
  "CHANGELOG.md"
@@ -1 +0,0 @@
1
- export{a as AnthropicClient}from'./chunk-WOP6MJKW.js';import'./chunk-O5HFCH2U.js';import'./chunk-HIJ2XXGX.js';import'./chunk-FU7AHZNN.js';import'./chunk-B7K2OWKC.js';import'./chunk-3QP5BQ3L.js';
@@ -1,3 +0,0 @@
1
- import {a as a$1}from'./chunk-2NS3JMNK.js';import'./chunk-P6JSTIFM.js';import {c as c$1}from'./chunk-UDPUTFQT.js';import {U,V,J,W,T as T$1,R as R$1,Q as Q$1}from'./chunk-Y2NS6HPO.js';export{W as formatArenaResultForSession}from'./chunk-Y2NS6HPO.js';import'./chunk-NVAZJ5XS.js';import'./chunk-FU7AHZNN.js';import'./chunk-B7K2OWKC.js';import {h,a}from'./chunk-3QP5BQ3L.js';import l from'chalk';h();async function Q(e,s,a){let{models:n,mode:i,base:m,head:r,topic:t}=E(e),o=a?.output??(d=>console.log(d));if(!t){o(R());return}let f=j(s,n);if(f.length<2){o(L());return}let P=i?i.charAt(0).toUpperCase()+i.slice(1):"Auto";o(l.bold(`\u2550\u2550\u2550 Arena ${P} \u2550\u2550\u2550`)),o(l.dim(`Topic: ${t}`)),o(l.dim(`Models: ${f.map(d=>d.name).join(" vs ")}`));let x=a?.output?U(a.output):V,O=new J({participants:f,mode:i,enableContextTools:true,onProgress:x});try{let d=await O.run(t,{mode:i,base:m,head:r}),y=a?.outputMessage??a?.output;return y?y(W(d)):T$1(d),d}catch(d){o(l.red(`Arena failed: ${d.message}`));return}}a(Q,"runArenaReview");function T(e){let s=new a$1;try{let a=new c$1(process.cwd()).get();if(a.models?.length)for(let n of a.models)s.register({key:n.key,label:n.label,provider:n.provider??"",model:n.model,baseUrl:n.baseUrl??e.llm.baseUrl,apiKey:n.apiKey??e.llm.apiKey,maxOutputTokens:n.maxOutputTokens});}catch{}return s}a(T,"buildModelPool");function K(e,s,a){if(typeof e=="string"){let n=s.get(e);return n?{name:n.label??c(n.model),llm:{provider:n.provider,model:n.model,apiKey:n.apiKey??a.llm.apiKey,baseUrl:n.baseUrl??a.llm.baseUrl,temperature:.3,maxTokens:n.maxOutputTokens??R$1(n.model),enableStreaming:false}}:void 0}return {name:e.name,llm:{provider:e.provider??a.llm.provider,model:e.model,apiKey:e.apiKey??a.llm.apiKey,baseUrl:e.baseUrl??a.llm.baseUrl,temperature:.3,maxTokens:R$1(e.model),enableStreaming:false}}}a(K,"resolveOneParticipant");function j(e,s){let a=T(e);if(s)return s.split(",").map(r=>r.trim().toLowerCase()).map(r=>{let t=a.get(r);if(t)return {name:t.label??c(t.model),llm:{provider:t.provider,model:t.model,apiKey:t.apiKey??e.llm.apiKey,baseUrl:t.baseUrl??e.llm.baseUrl,temperature:.3,maxTokens:t.maxOutputTokens??R$1(t.model),enableStreaming:false}};let o=Q$1[r];return o?{name:c(o.model),llm:{provider:o.provider,model:o.model,apiKey:e.llm.apiKey,baseUrl:e.llm.baseUrl,temperature:.3,maxTokens:o.maxOutputTokens,enableStreaming:false}}:{name:c(r),llm:{...e.llm,model:r,enableStreaming:false}}});let n=new c$1(process.cwd()).get();if(n.arena?.participants?.length>=2){let m=n.arena.participants.map(r=>K(r,a,e)).filter(r=>r!==void 0);if(m.length>=2)return m}let i=[{name:c(e.llm.model),llm:{...e.llm,maxTokens:R$1(e.llm.model),enableStreaming:false}}];if(e.llm.baseUrl?.includes("openrouter")){let r=e.llm.model.includes("claude")?"openai/gpt-5.4":"anthropic/claude-opus-4.6";i.push({name:c(r),llm:{...e.llm,model:r,maxTokens:R$1(r),enableStreaming:false}});}return i}a(j,"resolveParticipants");var S=["review","discussion","planning"];function E(e){let s,a,n,i,m=[],r=e.split(/\s+/);for(let t=0;t<r.length;t++)if(r[t]==="--models"&&r[t+1])s=r[++t];else if(r[t]==="--mode"&&r[t+1]){let o=r[++t].toLowerCase();S.includes(o)?a=o:console.log(l.yellow(` Unknown mode "${o}", valid: ${S.join(", ")}`));}else r[t]==="--base"&&r[t+1]?n=r[++t]:r[t]==="--head"&&r[t+1]?i=r[++t]:m.push(r[t]);return {models:s,mode:a,base:n,head:i,topic:m.join(" ").trim()}}a(E,"parseFlags");function R(){return [l.bold("Arena \u2014 Multi-model collaborative analysis"),"",l.dim("Usage:")," /arena review the authentication module"," /arena --models claude,gpt4o is the error handling correct?"," /arena --mode planning design the new auth system"," /arena --mode discussion should we use REST or GraphQL"," /arena --base main review changes since main",' code-shell arena "review my latest changes"',"",`${l.dim("Modes:")} review (default), discussion, planning`,l.dim("Mode is auto-detected from the topic if --mode is not specified."),"",l.dim("Flags:")," --base <ref> Base branch/ref for comparison"," --head <ref> Head branch/ref (default: HEAD)","",`${l.dim("Available model presets:")} ${Object.keys(Q$1).join(", ")}`].join(`
2
- `)}a(R,"formatUsage");function L(e){return [l.red("Arena needs at least 2 models."),"","Use --models to specify:"," /arena --models claude,gpt4o review the code","","Or configure in ~/.code-shell/settings.json:",' "arena": { "participants": [',' { "name": "Claude", "model": "anthropic/claude-sonnet-4-20250514" },',' { "name": "GPT-4o", "model": "openai/gpt-4o" }'," ]}"].join(`
3
- `)}a(L,"formatModelHelp");function c(e){return (e.split("/").pop()??e).replace(/-\d.*$/,"").split("-").map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")}a(c,"modelDisplayName");export{Q as runArenaReview};
@@ -1 +0,0 @@
1
- import {a as a$1}from'./chunk-P6JSTIFM.js';import {h,a}from'./chunk-3QP5BQ3L.js';h();var u=[[/^deepseek-v4(?:-|$)/i,1e6],[/(?:^|\/)deepseek-v4(?:-|$)/i,1e6]];function f(s){for(let[e,t]of u)if(e.test(s))return t}a(f,"lookupBuiltinContextWindow");var l=class{static{a(this,"ModelPool");}models=new Map;activeKey;providerCatalog;cacheDir;setProviderCatalog(e){this.providerCatalog=e;}setCacheDir(e){this.cacheDir=e;}reloadCachedContextWindows(){if(this.cacheDir)for(let[e,t]of this.models){if(t.maxContextTokens!=null||!t.providerKey)continue;let i=a$1(this.cacheDir,t.providerKey);if(!i)continue;let r=i.models.find(n=>n.id===t.model);r?.contextLength&&this.models.set(e,{...t,maxContextTokens:r.contextLength});}}constructor(e,t){if(e)for(let i of e)this.models.set(i.key,this.withBuiltinDefaults(i));t&&this.models.has(t)?this.activeKey=t:e?.length&&(this.activeKey=e[0].key);}register(e){this.models.set(e.key,this.withBuiltinDefaults(e)),this.activeKey||(this.activeKey=e.key);}withBuiltinDefaults(e){if(e.maxContextTokens!=null)return e;let t=f(e.model);return t==null?e:{...e,maxContextTokens:t}}switch(e){let t=this.models.get(e);if(!t){let i=[...this.models.keys()].join(", ");throw new Error(`Model "${e}" not found. Available: ${i}`)}return this.activeKey=e,t}get(e){if(e)return this.models.get(e);if(this.activeKey)return this.models.get(this.activeKey)}getActiveKey(){return this.activeKey}list(){return [...this.models.values()]}get size(){return this.models.size}has(e){return this.models.has(e)}toLLMConfig(e,t){let i=e.providerKey&&this.providerCatalog?this.providerCatalog.get(e.providerKey):void 0,r=a(n=>n&&n==="anthropic"?"anthropic":"openai","kindToClientProvider");return {provider:e.provider||r(i?.kind)||"openai",model:e.model,apiKey:e.apiKey??i?.apiKey??t?.apiKey,baseUrl:e.baseUrl??i?.baseUrl??t?.baseUrl,temperature:t?.temperature??.3,maxTokens:e.maxOutputTokens??t?.maxTokens??8192,enableStreaming:t?.enableStreaming??true}}resolveLLMConfig(e,t){let i=this.get(e);if(i)return this.toLLMConfig(i,t)}};export{l as a};
@@ -1,2 +0,0 @@
1
- import {h as h$1,a}from'./chunk-3QP5BQ3L.js';import {existsSync,mkdirSync,appendFileSync,readdirSync,unlinkSync}from'fs';import {join}from'path';import {homedir}from'os';h$1();var u={debug:0,info:1,warn:2,error:3},g=join(homedir(),".code-shell","logs"),h=7,R=100;function b(){return process.env.CODE_SHELL_DEV==="1"||process.argv.includes("--debug")||process.argv.includes("-d")||process.argv.some(r=>r.startsWith("--debug="))?true:process.env.NODE_ENV==="test"||process.env.BUN_TEST==="1"||process.argv.some(r=>r.includes("/tests/")||r.endsWith(".test.ts"))?false:!!(process.argv[1]??"").includes("/src/")}a(b,"isLocalDev");function x(){let o=process.env.CODE_SHELL_LOG_LEVEL?.toLowerCase().trim();return o&&Object.hasOwn(u,o)?o:b()?"debug":"info"}a(x,"resolveDefaultLevel");function D(){let o=process.argv.find(t=>t.startsWith("--debug=")),r;if(o)r=o.slice(8);else {let t=process.env.CODE_SHELL_DEBUG;t&&t!=="1"&&t!=="true"&&(r=t);}if(!r)return null;let e=new Set(r.split(",").map(t=>t.trim().toLowerCase()).filter(Boolean));return e.size>0?e:null}a(D,"resolveCategoryFilter");var v=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`;function _(o){v=o;}a(_,"setCurrentSid");function C(){return v}a(C,"getCurrentSid");var l=[];var d=class o{constructor(r={}){this.context=r;this.enabled=process.env.CODE_SHELL_LOG!=="0",this.minLevel=x(),this.categoryFilter=D(),this.stderrEcho=process.env.CODE_SHELL_DEBUG==="1"||process.argv.includes("--debug-to-stderr")||process.argv.includes("-d2e");}static{a(this,"Logger");}enabled;minLevel;categoryFilter;stderrEcho;dirReady=false;child(r){return new o({...this.context,...r})}setSid(r){_(r);}getSid(){return C()}debug(r,e){this.write("debug",r,e);}info(r,e){this.write("info",r,e);}warn(r,e){this.write("warn",r,e);}error(r,e){let t,n;typeof r=="string"?(t=r,e instanceof Error?(n={error:e.message,stack:e.stack}):n=e):r instanceof Error?(t=r.message,n={stack:r.stack}):t=String(r),this.recordError(t,n),this.write("error",t,n);}recordError(r,e){l.length>=R&&l.shift(),l.push({msg:r,t:new Date().toISOString(),data:e});}write(r,e,t){if(!this.enabled||u[r]<u[this.minLevel])return;let n=t?.cat??this.context.cat;if(r==="debug"&&this.categoryFilter&&(!n||!this.categoryFilter.has(n.toLowerCase())))return;let i=new Date().toISOString(),c={t:i,l:r,msg:e,...this.context};n&&!c.cat&&(c.cat=n),c.sid===void 0&&(c.sid=v),t&&(c.d=t);let a=JSON.stringify(c)+`
2
- `;if(this.stderrEcho){process.stderr.write(a);return}try{this.dirReady||(existsSync(g)||mkdirSync(g,{recursive:!0}),this.dirReady=!0);let w=i.slice(0,10);appendFileSync(join(g,`${w}.log`),a,"utf-8");}catch{}}getMinLevel(){return this.minLevel}isCategoryActive(r){return !this.categoryFilter||this.categoryFilter.has(r.toLowerCase())}span(r,e){let t=Date.now();return this.write("debug",`${r}.begin`,e),{end:a(n=>{let i=Date.now()-t;this.write("info",`${r}.end`,{...e,...n,duration_ms:i});},"end"),fail:a((n,i)=>{let c=Date.now()-t,a=n instanceof Error?n.message:String(n);this.write("error",`${r}.fail`,{...e,...i,duration_ms:c,error:a});},"fail")}}},B=new d;function H(){try{if(!existsSync(g))return;let o=readdirSync(g).filter(r=>r.endsWith(".log")).sort();if(o.length<=h)return;for(let r of o.slice(0,o.length-h))try{unlinkSync(join(g,r));}catch{}}catch{}}a(H,"rotateLogs");export{C as a,B as b,H as c};
@@ -1,2 +0,0 @@
1
- import {a as a$1,c as c$1,b}from'./chunk-P6JSTIFM.js';import {h,a}from'./chunk-3QP5BQ3L.js';import {existsSync,readFileSync}from'fs';import {fileURLToPath}from'url';import {dirname,join}from'path';h();h();var S=/(?:^|[-_/])(?:embed(?:ding)?|whisper|tts|audio|image|dall-?e|moderation|rerank|guard|vision-only)(?:$|[-_/])/i,i=a(e=>!S.test(e),"isChatLike"),s=a(e=>e?{Authorization:`Bearer ${e}`}:{},"bearer"),g={openai:{label:"OpenAI",defaultBaseUrl:"https://api.openai.com/v1",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i},anthropic:{label:"Anthropic",defaultBaseUrl:"https://api.anthropic.com/v1",modelsPath:"/models",protocol:"anthropic-style",authHeader:a(e=>e?{"x-api-key":e,"anthropic-version":"2023-06-01"}:{"anthropic-version":"2023-06-01"},"authHeader"),chatFilter:i},deepseek:{label:"DeepSeek",defaultBaseUrl:"https://api.deepseek.com/v1",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i},xai:{label:"xAI (Grok)",defaultBaseUrl:"https://api.x.ai/v1",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i},mistral:{label:"Mistral",defaultBaseUrl:"https://api.mistral.ai/v1",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i},groq:{label:"Groq",defaultBaseUrl:"https://api.groq.com/openai/v1",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i},google:{label:"Google Gemini",defaultBaseUrl:"https://generativelanguage.googleapis.com/v1beta",modelsPath:"/models",protocol:"gemini",authHeader:a(()=>({}),"authHeader"),authQuery:a(e=>e?{key:e}:{},"authQuery"),chatFilter:a(e=>i(e)&&/gemini/i.test(e),"chatFilter")},openrouter:{label:"OpenRouter",defaultBaseUrl:"https://openrouter.ai/api/v1",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i},ollama:{label:"Ollama (local)",defaultBaseUrl:"http://localhost:11434",modelsPath:"/api/tags",protocol:"ollama",authHeader:a(()=>({}),"authHeader"),chatFilter:i},custom:{label:"Custom",defaultBaseUrl:"",modelsPath:"/models",protocol:"openai-compat",authHeader:s,chatFilter:i}};function f(e){return g[e]??g.custom}a(f,"getKindMeta");var U=dirname(fileURLToPath(import.meta.url)),x=join(U,"..","data","openrouter-models.json");async function q(e,a){let n=f(e.kind);if(!a.refresh){let o=a$1(a.cacheDir,e.key);if(o&&!c$1(o))return {...o,fromCache:true}}if(e.kind==="openrouter")return L(e.key,a.cacheDir);try{let o=e.modelsPath??n.modelsPath,t=new URL(M(e.baseUrl,o)),P=n.authHeader(e.apiKey??"");if(n.authQuery){let m=n.authQuery(e.apiKey??"");for(let[R,b]of Object.entries(m))t.searchParams.set(R,b);}let p=await fetch(t.toString(),{headers:{Accept:"application/json",...P},signal:AbortSignal.timeout(a.timeoutMs??2e4)});if(!p.ok)return c(e.key,a.cacheDir,`HTTP ${p.status}`);let k=await p.json(),y=H(k,n.protocol).filter(m=>n.chatFilter(m.id));return b(a.cacheDir,e.key,y)}catch(o){let t=o.message||String(o);return c(e.key,a.cacheDir,t)}}a(q,"fetchModelList");function H(e,a){switch(a){case "ollama":return (e.models??[]).map(t=>({id:t.name,contextLength:0,maxOutputTokens:0}));case "anthropic-style":return (e.data??[]).map(t=>({id:t.id,contextLength:t.context_window??2e5,maxOutputTokens:t.max_output_tokens??0}));case "gemini":return (e.models??[]).map(t=>({id:t.name.replace(/^models\//,""),contextLength:t.inputTokenLimit??0,maxOutputTokens:t.outputTokenLimit??0}));case "openai-compat":return (e.data??[]).map(t=>({id:t.id,contextLength:t.context_window??t.context_length??0,maxOutputTokens:t.max_completion_tokens??0}))}return a}a(H,"normalize");function L(e,a){if(!existsSync(x))return c(e,a,"openrouter snapshot missing");try{let o=(JSON.parse(readFileSync(x,"utf-8")).models??[]).map(t=>({id:t.id,contextLength:t.contextLength??0,maxOutputTokens:t.maxOutputTokens??0}));return b(a,e,o)}catch(n){return c(e,a,n.message)}}a(L,"loadOpenRouterSnapshot");function c(e,a,n){let o=a$1(a,e);return o?{...o,error:n,fromCache:true}:{fetchedAt:new Date().toISOString(),providerKey:e,models:[],error:n}}a(c,"errorResult");function M(e,a){return e?`${e.replace(/\/$/,"")}${a.startsWith("/")?"":"/"}${a}`:a}a(M,"joinUrl");
2
- export{g as a,q as b};
@@ -1 +0,0 @@
1
- import {L,ca,ba,V,ea}from'./chunk-NMBYBGC7.js';import {h,a}from'./chunk-3QP5BQ3L.js';import {join}from'path';import {homedir}from'os';h();h();function R(y,s){let{preset:e,adapter:t,contract:o}=y,w=e.name,x=["Read","Write","Edit","Glob","Grep","Bash","AskUserQuestion","Agent","ToolSearch","TaskCreate","TaskList","TaskUpdate","TaskGet"],i=new Set([...x,...t?.enableTools??[]]);for(let n of t?.disableTools??[])i.delete(n);let S=[{tool:"Read",decision:"allow"},{tool:"Glob",decision:"allow"},{tool:"Grep",decision:"allow"},{tool:"AskUserQuestion",decision:"allow"},{tool:"ToolSearch",decision:"allow"},{tool:"TaskCreate",decision:"allow"},{tool:"TaskList",decision:"allow"},{tool:"TaskUpdate",decision:"allow"},{tool:"TaskGet",decision:"allow"},...t?.permissionRules??[]],l={name:w,label:e.label,description:e.description,promptSections:e.sections??["base","orchestration"],injectGitStatus:e.injectGitStatus??false,builtinTools:[...i],defaultPermissionRules:S};L(l);let r;o?.evaluator?Array.isArray(o.evaluator)?r=new ca(o.evaluator):r=o.evaluator:r=new ba;let c=t?.tools??[],d=c.map(n=>({definition:n.definition,execute:n.execute})),u=s.runsDir??join(homedir(),".code-shell","runs"),k=new V(u);return {manager:new ea({store:k,executor:{llm:s.llm,maxTurns:o?.maxTurns??30,maxContextTokens:o?.maxContextTokens??2e5,permissionMode:s.permissionMode??"acceptEdits",sessionStorageDir:s.sessionStorageDir,mcpServers:t?.mcpServers,enabledBuiltinTools:[...i],disabledBuiltinTools:t?.disableTools,customSystemPrompt:e.customPrompt,appendSystemPrompt:e.appendPrompt,hooks:t?.hooks,customTools:d.length>0?d:void 0},concurrency:o?.concurrency??1,runsDir:u,evaluator:r,defaultTags:o?.defaultTags,defaultMetadata:o?.defaultMetadata}),preset:l,customTools:c}}a(R,"defineProduct");export{R as a};