chivgent 1.0.0 → 1.1.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 (235) hide show
  1. package/README.md +97 -897
  2. package/README.zh-CN.md +97 -801
  3. package/dist/agent.d.ts +30 -2
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +255 -36
  6. package/dist/agent.js.map +1 -1
  7. package/dist/auth/oauth.d.ts +51 -0
  8. package/dist/auth/oauth.d.ts.map +1 -0
  9. package/dist/auth/oauth.js +444 -0
  10. package/dist/auth/oauth.js.map +1 -0
  11. package/dist/cli-options.d.ts +9 -4
  12. package/dist/cli-options.d.ts.map +1 -1
  13. package/dist/cli-options.js +46 -3
  14. package/dist/cli-options.js.map +1 -1
  15. package/dist/cli-runtime.d.ts +33 -0
  16. package/dist/cli-runtime.d.ts.map +1 -0
  17. package/dist/cli-runtime.js +90 -0
  18. package/dist/cli-runtime.js.map +1 -0
  19. package/dist/cli.js +76 -81
  20. package/dist/cli.js.map +1 -1
  21. package/dist/context/compaction.d.ts +5 -2
  22. package/dist/context/compaction.d.ts.map +1 -1
  23. package/dist/context/compaction.js +58 -32
  24. package/dist/context/compaction.js.map +1 -1
  25. package/dist/context/context-manager.d.ts +23 -0
  26. package/dist/context/context-manager.d.ts.map +1 -1
  27. package/dist/context/context-manager.js +200 -35
  28. package/dist/context/context-manager.js.map +1 -1
  29. package/dist/context/project-instructions.d.ts +17 -0
  30. package/dist/context/project-instructions.d.ts.map +1 -0
  31. package/dist/context/project-instructions.js +191 -0
  32. package/dist/context/project-instructions.js.map +1 -0
  33. package/dist/evals/baseline.d.ts +41 -0
  34. package/dist/evals/baseline.d.ts.map +1 -0
  35. package/dist/evals/baseline.js +121 -0
  36. package/dist/evals/baseline.js.map +1 -0
  37. package/dist/evals/cli.js +27 -1
  38. package/dist/evals/cli.js.map +1 -1
  39. package/dist/evals/parse-args.d.ts +2 -0
  40. package/dist/evals/parse-args.d.ts.map +1 -1
  41. package/dist/evals/parse-args.js +5 -0
  42. package/dist/evals/parse-args.js.map +1 -1
  43. package/dist/evals/report.d.ts +2 -0
  44. package/dist/evals/report.d.ts.map +1 -1
  45. package/dist/evals/report.js +12 -8
  46. package/dist/evals/report.js.map +1 -1
  47. package/dist/evals/runner.d.ts +3 -0
  48. package/dist/evals/runner.d.ts.map +1 -1
  49. package/dist/evals/runner.js +5 -1
  50. package/dist/evals/runner.js.map +1 -1
  51. package/dist/evals/task.d.ts.map +1 -1
  52. package/dist/evals/task.js +1 -0
  53. package/dist/evals/task.js.map +1 -1
  54. package/dist/evals/tools.d.ts +4 -1
  55. package/dist/evals/tools.d.ts.map +1 -1
  56. package/dist/evals/tools.js +13 -4
  57. package/dist/evals/tools.js.map +1 -1
  58. package/dist/events.d.ts +12 -1
  59. package/dist/events.d.ts.map +1 -1
  60. package/dist/events.js.map +1 -1
  61. package/dist/patch/parse.d.ts +26 -0
  62. package/dist/patch/parse.d.ts.map +1 -0
  63. package/dist/patch/parse.js +117 -0
  64. package/dist/patch/parse.js.map +1 -0
  65. package/dist/permissions.d.ts +35 -0
  66. package/dist/permissions.d.ts.map +1 -0
  67. package/dist/permissions.js +89 -0
  68. package/dist/permissions.js.map +1 -0
  69. package/dist/prompts.d.ts +3 -3
  70. package/dist/prompts.d.ts.map +1 -1
  71. package/dist/prompts.js +5 -3
  72. package/dist/prompts.js.map +1 -1
  73. package/dist/providers/client.d.ts +1 -1
  74. package/dist/providers/client.d.ts.map +1 -1
  75. package/dist/providers/client.js +19 -1
  76. package/dist/providers/client.js.map +1 -1
  77. package/dist/providers/definitions.d.ts +2 -0
  78. package/dist/providers/definitions.d.ts.map +1 -1
  79. package/dist/providers/definitions.js +3 -1
  80. package/dist/providers/definitions.js.map +1 -1
  81. package/dist/providers/interactive.d.ts +4 -0
  82. package/dist/providers/interactive.d.ts.map +1 -1
  83. package/dist/providers/interactive.js +86 -2
  84. package/dist/providers/interactive.js.map +1 -1
  85. package/dist/providers/oauth-client.d.ts +14 -0
  86. package/dist/providers/oauth-client.d.ts.map +1 -0
  87. package/dist/providers/oauth-client.js +52 -0
  88. package/dist/providers/oauth-client.js.map +1 -0
  89. package/dist/providers/openai-compatible-chat.d.ts +1 -0
  90. package/dist/providers/openai-compatible-chat.d.ts.map +1 -1
  91. package/dist/providers/openai-compatible-chat.js +1 -0
  92. package/dist/providers/openai-compatible-chat.js.map +1 -1
  93. package/dist/providers/openai.d.ts +3 -0
  94. package/dist/providers/openai.d.ts.map +1 -1
  95. package/dist/providers/openai.js +72 -10
  96. package/dist/providers/openai.js.map +1 -1
  97. package/dist/remote/repl.d.ts.map +1 -1
  98. package/dist/remote/repl.js +9 -0
  99. package/dist/remote/repl.js.map +1 -1
  100. package/dist/repl.d.ts +53 -1
  101. package/dist/repl.d.ts.map +1 -1
  102. package/dist/repl.js +554 -10
  103. package/dist/repl.js.map +1 -1
  104. package/dist/session-store.d.ts +27 -2
  105. package/dist/session-store.d.ts.map +1 -1
  106. package/dist/session-store.js +85 -2
  107. package/dist/session-store.js.map +1 -1
  108. package/dist/session.d.ts +20 -0
  109. package/dist/session.d.ts.map +1 -1
  110. package/dist/session.js +141 -13
  111. package/dist/session.js.map +1 -1
  112. package/dist/shell/approval.d.ts +15 -0
  113. package/dist/shell/approval.d.ts.map +1 -0
  114. package/dist/shell/approval.js +25 -0
  115. package/dist/shell/approval.js.map +1 -0
  116. package/dist/shell/docker.d.ts +20 -0
  117. package/dist/shell/docker.d.ts.map +1 -0
  118. package/dist/shell/docker.js +97 -0
  119. package/dist/shell/docker.js.map +1 -0
  120. package/dist/shell/factory.d.ts +9 -0
  121. package/dist/shell/factory.d.ts.map +1 -0
  122. package/dist/shell/factory.js +13 -0
  123. package/dist/shell/factory.js.map +1 -0
  124. package/dist/shell/local.d.ts +5 -1
  125. package/dist/shell/local.d.ts.map +1 -1
  126. package/dist/shell/local.js +17 -2
  127. package/dist/shell/local.js.map +1 -1
  128. package/dist/shell/native.d.ts +15 -0
  129. package/dist/shell/native.d.ts.map +1 -0
  130. package/dist/shell/native.js +99 -0
  131. package/dist/shell/native.js.map +1 -0
  132. package/dist/shell/types.d.ts +1 -0
  133. package/dist/shell/types.d.ts.map +1 -1
  134. package/dist/tools/apply-patch.d.ts +18 -0
  135. package/dist/tools/apply-patch.d.ts.map +1 -0
  136. package/dist/tools/apply-patch.js +53 -0
  137. package/dist/tools/apply-patch.js.map +1 -0
  138. package/dist/tools/bash.d.ts +23 -0
  139. package/dist/tools/bash.d.ts.map +1 -1
  140. package/dist/tools/bash.js +55 -11
  141. package/dist/tools/bash.js.map +1 -1
  142. package/dist/tools/edit-file.d.ts.map +1 -1
  143. package/dist/tools/edit-file.js +1 -1
  144. package/dist/tools/edit-file.js.map +1 -1
  145. package/dist/tools/parallel.d.ts +16 -0
  146. package/dist/tools/parallel.d.ts.map +1 -0
  147. package/dist/tools/parallel.js +28 -0
  148. package/dist/tools/parallel.js.map +1 -0
  149. package/dist/tools/tool.d.ts +7 -0
  150. package/dist/tools/tool.d.ts.map +1 -1
  151. package/dist/tools/tool.js +7 -1
  152. package/dist/tools/tool.js.map +1 -1
  153. package/dist/tools/update-plan.d.ts +57 -0
  154. package/dist/tools/update-plan.d.ts.map +1 -0
  155. package/dist/tools/update-plan.js +99 -0
  156. package/dist/tools/update-plan.js.map +1 -0
  157. package/dist/tools/write-file.d.ts.map +1 -1
  158. package/dist/tools/write-file.js +1 -1
  159. package/dist/tools/write-file.js.map +1 -1
  160. package/dist/transcript-hash.d.ts +4 -0
  161. package/dist/transcript-hash.d.ts.map +1 -0
  162. package/dist/transcript-hash.js +6 -0
  163. package/dist/transcript-hash.js.map +1 -0
  164. package/dist/tui/activity.d.ts +17 -0
  165. package/dist/tui/activity.d.ts.map +1 -0
  166. package/dist/tui/activity.js +188 -0
  167. package/dist/tui/activity.js.map +1 -0
  168. package/dist/tui/diff.d.ts +14 -0
  169. package/dist/tui/diff.d.ts.map +1 -0
  170. package/dist/tui/diff.js +57 -0
  171. package/dist/tui/diff.js.map +1 -0
  172. package/dist/tui/editor-input.d.ts +53 -0
  173. package/dist/tui/editor-input.d.ts.map +1 -0
  174. package/dist/tui/editor-input.js +353 -0
  175. package/dist/tui/editor-input.js.map +1 -0
  176. package/dist/tui/editor.d.ts +72 -0
  177. package/dist/tui/editor.d.ts.map +1 -0
  178. package/dist/tui/editor.js +321 -0
  179. package/dist/tui/editor.js.map +1 -0
  180. package/dist/tui/git-diff.d.ts +7 -0
  181. package/dist/tui/git-diff.d.ts.map +1 -0
  182. package/dist/tui/git-diff.js +48 -0
  183. package/dist/tui/git-diff.js.map +1 -0
  184. package/dist/tui/input.d.ts +14 -0
  185. package/dist/tui/input.d.ts.map +1 -1
  186. package/dist/tui/input.js +77 -1
  187. package/dist/tui/input.js.map +1 -1
  188. package/dist/tui/live.d.ts +10 -0
  189. package/dist/tui/live.d.ts.map +1 -1
  190. package/dist/tui/live.js +42 -5
  191. package/dist/tui/live.js.map +1 -1
  192. package/dist/tui/markdown.d.ts +7 -0
  193. package/dist/tui/markdown.d.ts.map +1 -0
  194. package/dist/tui/markdown.js +55 -0
  195. package/dist/tui/markdown.js.map +1 -0
  196. package/dist/tui/menu.js +1 -1
  197. package/dist/tui/review.d.ts +27 -0
  198. package/dist/tui/review.d.ts.map +1 -0
  199. package/dist/tui/review.js +114 -0
  200. package/dist/tui/review.js.map +1 -0
  201. package/dist/tui/slash.d.ts +11 -0
  202. package/dist/tui/slash.d.ts.map +1 -0
  203. package/dist/tui/slash.js +13 -0
  204. package/dist/tui/slash.js.map +1 -0
  205. package/dist/tui/state.d.ts +5 -0
  206. package/dist/tui/state.d.ts.map +1 -1
  207. package/dist/tui/state.js +10 -1
  208. package/dist/tui/state.js.map +1 -1
  209. package/dist/tui/syntax.d.ts +6 -0
  210. package/dist/tui/syntax.d.ts.map +1 -0
  211. package/dist/tui/syntax.js +48 -0
  212. package/dist/tui/syntax.js.map +1 -0
  213. package/dist/tui/view.d.ts +1 -1
  214. package/dist/tui/view.d.ts.map +1 -1
  215. package/dist/tui/view.js +21 -9
  216. package/dist/tui/view.js.map +1 -1
  217. package/dist/tui/welcome.d.ts +5 -0
  218. package/dist/tui/welcome.d.ts.map +1 -1
  219. package/dist/tui/welcome.js +35 -20
  220. package/dist/tui/welcome.js.map +1 -1
  221. package/dist/workspace/patch.d.ts +11 -0
  222. package/dist/workspace/patch.d.ts.map +1 -0
  223. package/dist/workspace/patch.js +124 -0
  224. package/dist/workspace/patch.js.map +1 -0
  225. package/dist/workspace/paths.d.ts.map +1 -1
  226. package/dist/workspace/paths.js +4 -0
  227. package/dist/workspace/paths.js.map +1 -1
  228. package/dist/workspace/types.d.ts +9 -2
  229. package/dist/workspace/types.d.ts.map +1 -1
  230. package/dist/workspace/types.js.map +1 -1
  231. package/dist/workspace.d.ts +4 -3
  232. package/dist/workspace.d.ts.map +1 -1
  233. package/dist/workspace.js +7 -2
  234. package/dist/workspace.js.map +1 -1
  235. package/package.json +6 -2
package/dist/session.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Agent } from "./agent.js";
2
+ import { transcriptHash } from "./transcript-hash.js";
2
3
  import { addUsage } from "./providers/usage.js";
3
4
  import { createSessionId, SESSION_FORMAT_VERSION, } from "./session-store.js";
4
5
  /**
@@ -17,14 +18,24 @@ export class AgentSession {
17
18
  transcript;
18
19
  headerWritten;
19
20
  promptCount = 0;
21
+ promptInProgress = false;
22
+ controlInProgress = false;
20
23
  usageTotal;
24
+ compaction;
25
+ sessionTitle;
26
+ planModeEnabled;
21
27
  constructor(options) {
22
28
  this.id = options.id ?? createSessionId();
23
29
  this.cwd = options.cwd ?? process.cwd();
24
30
  this.store = options.store;
25
31
  this.now = options.now ?? (() => new Date());
26
32
  this.transcript = structuredClone(options.messages ?? []);
33
+ this.compaction = options.compaction === undefined ? undefined : structuredClone(options.compaction);
34
+ this.promptCount = options.promptCount ?? 0;
35
+ this.usageTotal = options.usage === undefined ? undefined : structuredClone(options.usage);
27
36
  this.headerWritten = options.resumed ?? false;
37
+ this.sessionTitle = options.title;
38
+ this.planModeEnabled = options.planMode ?? false;
28
39
  this.agent = new Agent({
29
40
  ...options.agent,
30
41
  onEvent: (event) => {
@@ -45,6 +56,82 @@ export class AgentSession {
45
56
  get toolNames() {
46
57
  return this.agent.toolNames;
47
58
  }
59
+ get title() { return this.sessionTitle; }
60
+ get planMode() { return this.planModeEnabled; }
61
+ async rename(title) {
62
+ this.beginControl("rename");
63
+ try {
64
+ const clean = title.trim();
65
+ if (!clean || clean.length > 120 || /[\x00-\x1f\x7f]/.test(clean))
66
+ throw new TypeError("Title must be 1–120 characters without control characters.");
67
+ await this.writeHeaderStrict();
68
+ if (this.store !== undefined) {
69
+ await this.store.append(this.id, { type: "session_rename", title: clean });
70
+ await this.store.flush?.();
71
+ }
72
+ this.sessionTitle = clean;
73
+ }
74
+ finally {
75
+ this.controlInProgress = false;
76
+ }
77
+ }
78
+ async setPlanMode(enabled) {
79
+ this.beginControl("change Plan Mode");
80
+ try {
81
+ if (this.planModeEnabled === enabled)
82
+ return;
83
+ await this.writeHeaderStrict();
84
+ if (this.store !== undefined) {
85
+ await this.store.append(this.id, { type: "session_plan_mode", enabled });
86
+ await this.store.flush?.();
87
+ }
88
+ this.planModeEnabled = enabled;
89
+ }
90
+ finally {
91
+ this.controlInProgress = false;
92
+ }
93
+ }
94
+ /** Persist a new empty session immediately so it appears in /resume. */
95
+ async initialize() {
96
+ this.beginControl("initialize");
97
+ try {
98
+ await this.writeHeaderStrict();
99
+ await this.store?.flush?.();
100
+ }
101
+ finally {
102
+ this.controlInProgress = false;
103
+ }
104
+ }
105
+ async compact(signal) {
106
+ this.beginControl("compact");
107
+ try {
108
+ if (this.compaction === undefined && this.transcript.length < 2)
109
+ throw new Error("There is no older conversation to compact safely.");
110
+ const result = await this.agent.compactHistory(this.transcript, this.compaction, signal);
111
+ if (!result.compacted)
112
+ return false;
113
+ if (signal?.aborted)
114
+ throw new Error("Compaction cancelled.");
115
+ const total = addUsage(this.usageTotal, result.usage);
116
+ await this.writeHeaderStrict();
117
+ if (this.store !== undefined) {
118
+ await this.store.append(this.id, { type: "session_compaction", compaction: result.compaction, transcriptHash: transcriptHash(this.transcript), ...(result.usage === undefined ? {} : { usage: total }) });
119
+ await this.store.flush?.();
120
+ }
121
+ this.compaction = result.compaction;
122
+ if (result.usage !== undefined)
123
+ this.usageTotal = total;
124
+ return true;
125
+ }
126
+ finally {
127
+ this.controlInProgress = false;
128
+ }
129
+ }
130
+ beginControl(action) {
131
+ if (this.promptInProgress || this.controlInProgress)
132
+ throw new Error(`Cannot ${action} while another session operation is running.`);
133
+ this.controlInProgress = true;
134
+ }
48
135
  subscribe(listener) {
49
136
  this.listeners.add(listener);
50
137
  return () => {
@@ -53,22 +140,41 @@ export class AgentSession {
53
140
  }
54
141
  /** Drops the transcript but keeps the session id and its log. */
55
142
  clear() {
143
+ if (this.promptInProgress)
144
+ throw new Error("Cannot clear a session while a prompt is running.");
145
+ if (this.controlInProgress)
146
+ throw new Error("Cannot clear a session while another session operation is running.");
56
147
  this.transcript = [];
148
+ this.compaction = undefined;
149
+ this.promptCount = 0;
150
+ this.usageTotal = undefined;
151
+ this.record({ type: "session_clear" });
57
152
  }
58
153
  async prompt(text, options = {}) {
59
- await this.writeHeader();
60
- this.promptCount += 1;
61
- const result = await this.agent.run(text, {
62
- history: this.transcript,
63
- ...(options.signal === undefined ? {} : { signal: options.signal }),
64
- });
65
- this.transcript = result.messages;
66
- this.usageTotal = addUsage(this.usageTotal, result.usage?.usage);
67
- if (result.usage?.complete === false) {
68
- this.usageTotal = { usage: this.usageTotal.usage, complete: false };
154
+ if (this.promptInProgress || this.controlInProgress) {
155
+ throw new Error("This session is already running a prompt.");
156
+ }
157
+ this.promptInProgress = true;
158
+ try {
159
+ await this.writeHeader();
160
+ this.promptCount += 1;
161
+ try {
162
+ return await this.agent.run(text, {
163
+ history: this.transcript,
164
+ ...(this.compaction === undefined ? {} : { compaction: this.compaction }),
165
+ planMode: this.planModeEnabled,
166
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
167
+ });
168
+ }
169
+ finally {
170
+ // A Provider error still emits agent_end; flush that authoritative
171
+ // snapshot so a restart restores the same transcript as this process.
172
+ await this.flush();
173
+ }
174
+ }
175
+ finally {
176
+ this.promptInProgress = false;
69
177
  }
70
- await this.flush();
71
- return result;
72
178
  }
73
179
  header() {
74
180
  return {
@@ -80,6 +186,22 @@ export class AgentSession {
80
186
  };
81
187
  }
82
188
  dispatch(event) {
189
+ let persisted = event;
190
+ // agent_end is authoritative even for an error (where agent.run throws).
191
+ // Keep in-memory state and the persisted event snapshot identical.
192
+ if (event.type === "agent_end") {
193
+ this.transcript = structuredClone(event.messages);
194
+ this.compaction = event.compaction === undefined ? undefined : structuredClone(event.compaction);
195
+ this.usageTotal = addUsage(this.usageTotal, event.usage?.usage);
196
+ if (event.usage?.complete === false) {
197
+ this.usageTotal = {
198
+ usage: this.usageTotal.usage,
199
+ complete: false,
200
+ };
201
+ }
202
+ persisted = { ...event, promptCount: this.promptCount, sessionUsage: this.usageTotal,
203
+ ...(this.compaction === undefined ? {} : { compactionTranscriptHash: transcriptHash(this.transcript) }) };
204
+ }
83
205
  for (const listener of this.listeners) {
84
206
  try {
85
207
  listener(event);
@@ -88,7 +210,7 @@ export class AgentSession {
88
210
  // A failing subscriber must not change the outcome of the run.
89
211
  }
90
212
  }
91
- this.record(event);
213
+ this.record(persisted);
92
214
  }
93
215
  record(event) {
94
216
  if (this.store === undefined ||
@@ -114,6 +236,12 @@ export class AgentSession {
114
236
  // Skip persistence for this run. A later prompt can retry the header.
115
237
  }
116
238
  }
239
+ async writeHeaderStrict() {
240
+ if (this.store === undefined || this.headerWritten)
241
+ return;
242
+ await this.store.append(this.id, this.header());
243
+ this.headerWritten = true;
244
+ }
117
245
  async flush() {
118
246
  try {
119
247
  await this.store?.flush?.();
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Every shell call requires a positive user decision. */
2
+ export type ShellApproval = (command: string, signal?: AbortSignal, context?: string) => Promise<boolean>;
3
+ /**
4
+ * Shell permission is scoped to the current CLI process. Interactive sessions
5
+ * install a per-command prompt; headless sessions deny unless the user passes
6
+ * the explicit session-wide approval flag.
7
+ */
8
+ export declare class ShellApprovalGate {
9
+ private readonly approveAll;
10
+ private handler;
11
+ constructor(approveAll?: boolean);
12
+ setHandler(handler: ShellApproval | undefined): void;
13
+ approve(command: string, signal?: AbortSignal, context?: string): Promise<boolean>;
14
+ }
15
+ //# sourceMappingURL=approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../src/shell/approval.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1G;;;;GAIG;AACH,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,OAAO,CAA4B;IAE3C,YAA6B,UAAU,UAAQ,EAAI;IAEnD,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAEnD;IAEK,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKvF;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shell permission is scoped to the current CLI process. Interactive sessions
3
+ * install a per-command prompt; headless sessions deny unless the user passes
4
+ * the explicit session-wide approval flag.
5
+ */
6
+ export class ShellApprovalGate {
7
+ approveAll;
8
+ handler;
9
+ constructor(approveAll = false) {
10
+ this.approveAll = approveAll;
11
+ }
12
+ setHandler(handler) {
13
+ this.handler = handler;
14
+ }
15
+ async approve(command, signal, context) {
16
+ if (signal?.aborted)
17
+ return false;
18
+ if (this.approveAll)
19
+ return true;
20
+ if (this.handler === undefined)
21
+ return false;
22
+ return (await this.handler(command, signal, context)) && signal?.aborted !== true;
23
+ }
24
+ }
25
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/shell/approval.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAGC,UAAU;IAF/B,OAAO,CAA4B;IAE3C,YAA6B,UAAU,GAAG,KAAK;0BAAlB,UAAU;IAAW,CAAC;IAEnD,UAAU,CAAC,OAAkC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,MAAoB,EAAE,OAAgB;QACnE,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7C,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACpF,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { ShellConfig } from "./config.js";
2
+ import type { ShellOperations } from "./types.js";
3
+ /**
4
+ * A deliberately constrained Docker invocation. The only host mount is the
5
+ * working directory; no home, Docker socket, API credentials or host network
6
+ * are made available to commands.
7
+ */
8
+ export declare const DEFAULT_SHELL_IMAGE = "node:22-alpine";
9
+ export interface DockerShellOptions {
10
+ readonly image?: string;
11
+ readonly dockerExecutable?: string;
12
+ readonly containerName?: string;
13
+ readonly allowWrites?: boolean;
14
+ readonly allowNetwork?: boolean;
15
+ }
16
+ export declare function dockerShellConfig(cwd: string, options?: DockerShellOptions): ShellConfig;
17
+ /** Synchronous best-effort cleanup for normal process exit and signal handlers. */
18
+ export declare function killTrackedDockerContainers(docker?: string): void;
19
+ export declare function createDockerShellOperations(options?: DockerShellOptions): ShellOperations;
20
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/shell/docker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAyC5F;AASD,mFAAmF;AACnF,wBAAgB,2BAA2B,CAAC,MAAM,SAAW,GAAG,IAAI,CAQnE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kBAAuB,GAAG,eAAe,CAuB7F"}
@@ -0,0 +1,97 @@
1
+ import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
2
+ import { randomUUID } from "node:crypto";
3
+ import { spawnSync } from "node:child_process";
4
+ import { createLocalShellOperations } from "./local.js";
5
+ /**
6
+ * A deliberately constrained Docker invocation. The only host mount is the
7
+ * working directory; no home, Docker socket, API credentials or host network
8
+ * are made available to commands.
9
+ */
10
+ export const DEFAULT_SHELL_IMAGE = "node:22-alpine";
11
+ const PROTECTED_WRITE_PATHS = [".git", ".agents", ".codex", ".aws", ".ssh"];
12
+ export function dockerShellConfig(cwd, options = {}) {
13
+ const workspace = realpathSync(cwd);
14
+ const image = options.image ?? DEFAULT_SHELL_IMAGE;
15
+ const docker = options.dockerExecutable ?? "docker";
16
+ if (!image || image.startsWith("-")) {
17
+ throw new TypeError("Invalid Docker image.");
18
+ }
19
+ const user = typeof process.getuid === "function"
20
+ ? `${process.getuid()}:${process.getgid?.() ?? process.getuid()}`
21
+ : "1000:1000";
22
+ return {
23
+ shell: docker,
24
+ args: [
25
+ "run", "--rm",
26
+ ...(options.containerName === undefined ? [] : ["--name", options.containerName]),
27
+ "--network", options.allowNetwork ? "bridge" : "none",
28
+ "--read-only",
29
+ "--cap-drop", "ALL",
30
+ "--security-opt", "no-new-privileges",
31
+ "--pids-limit", "64",
32
+ "--memory", "512m",
33
+ "--cpus", "2",
34
+ "--user", user,
35
+ "--tmpfs", "/tmp:rw,nosuid,nodev,size=64m",
36
+ "--mount", `type=bind,source=${workspace},target=/workspace${options.allowWrites ? "" : ",readonly"}`,
37
+ ...(options.allowWrites ? PROTECTED_WRITE_PATHS.flatMap((name) => {
38
+ const protectedPath = `${workspace}/${name}`;
39
+ if (!existsSync(protectedPath)) {
40
+ return ["--tmpfs", `/workspace/${name}:ro,nosuid,nodev,size=1m`];
41
+ }
42
+ const entry = lstatSync(protectedPath);
43
+ if (entry.isSymbolicLink())
44
+ throw new Error(`Protected path is a symlink; refusing write-enabled Docker shell: ${name}`);
45
+ if (name === ".git" && entry.isFile())
46
+ throw new Error("Write-enabled Docker shell cannot safely protect a .git pointer file; use --shell-backend native on macOS or disable shell writes.");
47
+ return ["--mount", `type=bind,source=${protectedPath},target=/workspace/${name},readonly`];
48
+ }) : []),
49
+ "--workdir", "/workspace",
50
+ "--env", "HOME=/tmp",
51
+ image, "sh", "-c",
52
+ ],
53
+ };
54
+ }
55
+ /**
56
+ * Reuse the existing streaming, timeout and process-tree cancellation logic.
57
+ * A missing Docker binary or daemon fails the command; there is never a host
58
+ * shell fallback.
59
+ */
60
+ const activeContainers = new Set();
61
+ /** Synchronous best-effort cleanup for normal process exit and signal handlers. */
62
+ export function killTrackedDockerContainers(docker = "docker") {
63
+ if (activeContainers.size === 0)
64
+ return;
65
+ const names = [...activeContainers];
66
+ activeContainers.clear();
67
+ spawnSync(docker, ["rm", "--force", ...names], {
68
+ stdio: "ignore",
69
+ timeout: 3_000,
70
+ });
71
+ }
72
+ export function createDockerShellOperations(options = {}) {
73
+ const docker = options.dockerExecutable ?? "docker";
74
+ return {
75
+ backend: `Docker (network ${options.allowNetwork ? "enabled" : "denied"}${options.allowWrites ? ", workspace writes enabled" : ", read-only workspace"})`,
76
+ async exec(command, cwd, execOptions) {
77
+ const containerName = `chivgent-${randomUUID()}`;
78
+ activeContainers.add(containerName);
79
+ const runner = createLocalShellOperations({
80
+ resolveConfig: () => dockerShellConfig(cwd, { ...options, containerName }),
81
+ });
82
+ try {
83
+ return await runner.exec(command, cwd, execOptions);
84
+ }
85
+ finally {
86
+ activeContainers.delete(containerName);
87
+ // Stopping the docker CLI does not always stop its daemon-managed
88
+ // container. Force-remove by a unique name on every exit path.
89
+ spawnSync(docker, ["rm", "--force", containerName], {
90
+ stdio: "ignore",
91
+ timeout: 3_000,
92
+ });
93
+ }
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/shell/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ShellOperations } from "./types.js";
2
+ export type ShellBackend = "auto" | "native" | "docker";
3
+ export declare function createShellOperations(options?: {
4
+ backend?: ShellBackend;
5
+ allowWrites?: boolean;
6
+ allowNetwork?: boolean;
7
+ allowHostAccess?: boolean;
8
+ }): ShellOperations;
9
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/shell/factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACxD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,YAAY,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,eAAe,CAOzK"}
@@ -0,0 +1,13 @@
1
+ import { createDockerShellOperations } from "./docker.js";
2
+ import { createNativeShellOperations } from "./native.js";
3
+ import { ShellUnavailableError } from "./types.js";
4
+ export function createShellOperations(options = {}) {
5
+ const backend = options.backend ?? "auto";
6
+ if (backend === "native" || (backend === "auto" && process.platform === "darwin")) {
7
+ return createNativeShellOperations({ allowWrites: options.allowWrites, allowNetwork: options.allowNetwork, allowHostAccess: options.allowHostAccess });
8
+ }
9
+ if (options.allowHostAccess)
10
+ throw new ShellUnavailableError("Host access is unavailable in the Docker shell backend; no command was run.");
11
+ return createDockerShellOperations({ allowWrites: options.allowWrites, allowNetwork: options.allowNetwork });
12
+ }
13
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/shell/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,UAAU,qBAAqB,CAAC,OAAO,GAAyG,EAAE;IACtJ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;QAClF,OAAO,2BAA2B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACzJ,CAAC;IACD,IAAI,OAAO,CAAC,eAAe;QAAE,MAAM,IAAI,qBAAqB,CAAC,6EAA6E,CAAC,CAAC;IAC5I,OAAO,2BAA2B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/G,CAAC"}
@@ -3,8 +3,12 @@ import { type ShellOperations } from "./types.js";
3
3
  export declare function validateTimeoutSeconds(value: number): number;
4
4
  export interface LocalShellOptions {
5
5
  /** Resolved once per command so a shell installed mid-session is picked up. */
6
- readonly resolveConfig?: () => ShellConfig;
6
+ readonly resolveConfig?: (cwd: string) => ShellConfig;
7
+ /** Optional environment override; otherwise the child inherits the host environment. */
8
+ readonly env?: NodeJS.ProcessEnv;
7
9
  }
8
10
  /** Runs commands as child processes of this one. */
9
11
  export declare function createLocalShellOperations(options?: LocalShellOptions): ShellOperations;
12
+ /** Keep host tool discovery while withholding provider credentials and shell startup injection. */
13
+ export declare function safeShellEnvironment(): NodeJS.ProcessEnv;
10
14
  //# sourceMappingURL=local.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/shell/local.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAOnE,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AASpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,WAAW,CAAC;CAC5C;AAED,oDAAoD;AACpD,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,iBAAsB,GAC9B,eAAe,CA+EjB"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/shell/local.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAOnE,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AASpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;IACtD,wFAAwF;IACxF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,oDAAoD;AACpD,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,iBAAsB,GAC9B,eAAe,CAiFjB;AAED,mGAAmG;AACnG,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,UAAU,CAUxD"}
@@ -29,13 +29,13 @@ export function createLocalShellOperations(options = {}) {
29
29
  if (!existsSync(cwd)) {
30
30
  throw new ShellUnavailableError(`Working directory does not exist: ${cwd}`);
31
31
  }
32
- const config = resolveConfig();
32
+ const config = resolveConfig(cwd);
33
33
  // detached makes the child a process group leader, which is what lets a
34
34
  // cancel kill its descendants too.
35
35
  const child = spawn(config.shell, [...config.args, command], {
36
36
  cwd,
37
37
  detached: true,
38
- env: env ?? process.env,
38
+ env: env ?? options.env ?? process.env,
39
39
  stdio: ["ignore", "pipe", "pipe"],
40
40
  });
41
41
  if (child.pid !== undefined) {
@@ -77,6 +77,8 @@ export function createLocalShellOperations(options = {}) {
77
77
  }
78
78
  finally {
79
79
  if (child.pid !== undefined) {
80
+ // A command may leave background descendants in its process group.
81
+ killProcessTree(child.pid);
80
82
  untrackChildPid(child.pid);
81
83
  }
82
84
  if (timeoutHandle !== undefined) {
@@ -87,4 +89,17 @@ export function createLocalShellOperations(options = {}) {
87
89
  },
88
90
  };
89
91
  }
92
+ /** Keep host tool discovery while withholding provider credentials and shell startup injection. */
93
+ export function safeShellEnvironment() {
94
+ const result = {};
95
+ for (const key of ["PATH", "HOME", "TMPDIR", "LANG", "LC_ALL", "LC_CTYPE", "TERM", "NO_COLOR", "CI"]) {
96
+ const value = process.env[key];
97
+ if (value !== undefined)
98
+ result[key] = value;
99
+ }
100
+ result.HOME = process.env.TMPDIR ?? "/tmp";
101
+ result.BASH_ENV = "/dev/null";
102
+ result.ENV = "/dev/null";
103
+ return result;
104
+ }
90
105
  //# sourceMappingURL=local.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/shell/local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/shell/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ShellConfig } from "./config.js";
2
+ import type { ShellOperations } from "./types.js";
3
+ export interface NativeShellOptions {
4
+ readonly allowWrites?: boolean;
5
+ readonly allowNetwork?: boolean;
6
+ /** Explicitly requested one-command host access; Seatbelt remains active. */
7
+ readonly allowHostAccess?: boolean;
8
+ readonly sandboxExecutable?: string;
9
+ readonly temporaryDirectory?: string;
10
+ readonly protectedPaths?: readonly string[];
11
+ }
12
+ /** Build a fail-closed macOS Seatbelt profile. Reads from user homes and shared temp are denied. */
13
+ export declare function nativeShellConfig(cwd: string, options?: NativeShellOptions): ShellConfig;
14
+ export declare function createNativeShellOperations(options?: NativeShellOptions): ShellOperations;
15
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/shell/native.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,CA6C5F;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kBAAuB,GAAG,eAAe,CAsC7F"}