atom-lite 0.0.0-stage → 0.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 (175) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.md +265 -2
  4. package/dist/agent/loop.d.ts +30 -0
  5. package/dist/agent/loop.js +199 -0
  6. package/dist/agent/loop.js.map +1 -0
  7. package/dist/agent/types.d.ts +85 -0
  8. package/dist/agent/types.js +2 -0
  9. package/dist/agent/types.js.map +1 -0
  10. package/dist/cli/app.d.ts +1 -0
  11. package/dist/cli/app.js +1060 -0
  12. package/dist/cli/app.js.map +1 -0
  13. package/dist/cli/approvals.d.ts +1 -0
  14. package/dist/cli/approvals.js +2 -0
  15. package/dist/cli/approvals.js.map +1 -0
  16. package/dist/cli/banner.d.ts +8 -0
  17. package/dist/cli/banner.js +29 -0
  18. package/dist/cli/banner.js.map +1 -0
  19. package/dist/cli/commands.d.ts +19 -0
  20. package/dist/cli/commands.js +61 -0
  21. package/dist/cli/commands.js.map +1 -0
  22. package/dist/cli/main.d.ts +2 -0
  23. package/dist/cli/main.js +22 -0
  24. package/dist/cli/main.js.map +1 -0
  25. package/dist/cli/picker.d.ts +26 -0
  26. package/dist/cli/picker.js +175 -0
  27. package/dist/cli/picker.js.map +1 -0
  28. package/dist/cli/renderer.d.ts +1 -0
  29. package/dist/cli/renderer.js +5 -0
  30. package/dist/cli/renderer.js.map +1 -0
  31. package/dist/cli/secret-input.d.ts +21 -0
  32. package/dist/cli/secret-input.js +101 -0
  33. package/dist/cli/secret-input.js.map +1 -0
  34. package/dist/cli/status-line.d.ts +18 -0
  35. package/dist/cli/status-line.js +35 -0
  36. package/dist/cli/status-line.js.map +1 -0
  37. package/dist/cli/stream-text.d.ts +22 -0
  38. package/dist/cli/stream-text.js +50 -0
  39. package/dist/cli/stream-text.js.map +1 -0
  40. package/dist/cli/transcript.d.ts +17 -0
  41. package/dist/cli/transcript.js +40 -0
  42. package/dist/cli/transcript.js.map +1 -0
  43. package/dist/config/credentials.d.ts +26 -0
  44. package/dist/config/credentials.js +79 -0
  45. package/dist/config/credentials.js.map +1 -0
  46. package/dist/config/defaults.d.ts +24 -0
  47. package/dist/config/defaults.js +25 -0
  48. package/dist/config/defaults.js.map +1 -0
  49. package/dist/config/load.d.ts +7 -0
  50. package/dist/config/load.js +105 -0
  51. package/dist/config/load.js.map +1 -0
  52. package/dist/config/paths.d.ts +4 -0
  53. package/dist/config/paths.js +14 -0
  54. package/dist/config/paths.js.map +1 -0
  55. package/dist/config/schema.d.ts +83 -0
  56. package/dist/config/schema.js +52 -0
  57. package/dist/config/schema.js.map +1 -0
  58. package/dist/config/write.d.ts +18 -0
  59. package/dist/config/write.js +61 -0
  60. package/dist/config/write.js.map +1 -0
  61. package/dist/context/budget.d.ts +2 -0
  62. package/dist/context/budget.js +13 -0
  63. package/dist/context/budget.js.map +1 -0
  64. package/dist/context/compaction.d.ts +1 -0
  65. package/dist/context/compaction.js +5 -0
  66. package/dist/context/compaction.js.map +1 -0
  67. package/dist/context/instructions.d.ts +3 -0
  68. package/dist/context/instructions.js +30 -0
  69. package/dist/context/instructions.js.map +1 -0
  70. package/dist/context/manager.d.ts +29 -0
  71. package/dist/context/manager.js +122 -0
  72. package/dist/context/manager.js.map +1 -0
  73. package/dist/index.d.ts +16 -0
  74. package/dist/index.js +16 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/providers/catalog.d.ts +60 -0
  77. package/dist/providers/catalog.js +289 -0
  78. package/dist/providers/catalog.js.map +1 -0
  79. package/dist/providers/context-window.d.ts +11 -0
  80. package/dist/providers/context-window.js +87 -0
  81. package/dist/providers/context-window.js.map +1 -0
  82. package/dist/providers/factory.d.ts +2 -0
  83. package/dist/providers/factory.js +54 -0
  84. package/dist/providers/factory.js.map +1 -0
  85. package/dist/providers/fake.d.ts +14 -0
  86. package/dist/providers/fake.js +23 -0
  87. package/dist/providers/fake.js.map +1 -0
  88. package/dist/providers/gemini.d.ts +24 -0
  89. package/dist/providers/gemini.js +228 -0
  90. package/dist/providers/gemini.js.map +1 -0
  91. package/dist/providers/index.d.ts +5 -0
  92. package/dist/providers/index.js +4 -0
  93. package/dist/providers/index.js.map +1 -0
  94. package/dist/providers/ollama.d.ts +64 -0
  95. package/dist/providers/ollama.js +433 -0
  96. package/dist/providers/ollama.js.map +1 -0
  97. package/dist/providers/openai-compatible.d.ts +27 -0
  98. package/dist/providers/openai-compatible.js +282 -0
  99. package/dist/providers/openai-compatible.js.map +1 -0
  100. package/dist/providers/registry.d.ts +7 -0
  101. package/dist/providers/registry.js +13 -0
  102. package/dist/providers/registry.js.map +1 -0
  103. package/dist/providers/tool-calls.d.ts +18 -0
  104. package/dist/providers/tool-calls.js +42 -0
  105. package/dist/providers/tool-calls.js.map +1 -0
  106. package/dist/providers/types.d.ts +16 -0
  107. package/dist/providers/types.js +2 -0
  108. package/dist/providers/types.js.map +1 -0
  109. package/dist/runtime/approvals.d.ts +20 -0
  110. package/dist/runtime/approvals.js +20 -0
  111. package/dist/runtime/approvals.js.map +1 -0
  112. package/dist/runtime/locks.d.ts +13 -0
  113. package/dist/runtime/locks.js +180 -0
  114. package/dist/runtime/locks.js.map +1 -0
  115. package/dist/runtime/scheduler.d.ts +7 -0
  116. package/dist/runtime/scheduler.js +103 -0
  117. package/dist/runtime/scheduler.js.map +1 -0
  118. package/dist/security/paths.d.ts +1 -0
  119. package/dist/security/paths.js +35 -0
  120. package/dist/security/paths.js.map +1 -0
  121. package/dist/security/process.d.ts +1 -0
  122. package/dist/security/process.js +8 -0
  123. package/dist/security/process.js.map +1 -0
  124. package/dist/security/redaction.d.ts +1 -0
  125. package/dist/security/redaction.js +4 -0
  126. package/dist/security/redaction.js.map +1 -0
  127. package/dist/sessions/events.d.ts +21 -0
  128. package/dist/sessions/events.js +87 -0
  129. package/dist/sessions/events.js.map +1 -0
  130. package/dist/sessions/index.d.ts +3 -0
  131. package/dist/sessions/index.js +4 -0
  132. package/dist/sessions/index.js.map +1 -0
  133. package/dist/sessions/recovery.d.ts +6 -0
  134. package/dist/sessions/recovery.js +35 -0
  135. package/dist/sessions/recovery.js.map +1 -0
  136. package/dist/sessions/store.d.ts +91 -0
  137. package/dist/sessions/store.js +356 -0
  138. package/dist/sessions/store.js.map +1 -0
  139. package/dist/skills/registry.d.ts +23 -0
  140. package/dist/skills/registry.js +129 -0
  141. package/dist/skills/registry.js.map +1 -0
  142. package/dist/tools/bash.d.ts +2 -0
  143. package/dist/tools/bash.js +159 -0
  144. package/dist/tools/bash.js.map +1 -0
  145. package/dist/tools/diff.d.ts +7 -0
  146. package/dist/tools/diff.js +40 -0
  147. package/dist/tools/diff.js.map +1 -0
  148. package/dist/tools/edit.d.ts +2 -0
  149. package/dist/tools/edit.js +117 -0
  150. package/dist/tools/edit.js.map +1 -0
  151. package/dist/tools/index.d.ts +8 -0
  152. package/dist/tools/index.js +8 -0
  153. package/dist/tools/index.js.map +1 -0
  154. package/dist/tools/read.d.ts +2 -0
  155. package/dist/tools/read.js +138 -0
  156. package/dist/tools/read.js.map +1 -0
  157. package/dist/tools/registry.d.ts +7 -0
  158. package/dist/tools/registry.js +13 -0
  159. package/dist/tools/registry.js.map +1 -0
  160. package/dist/tools/types.d.ts +27 -0
  161. package/dist/tools/types.js +2 -0
  162. package/dist/tools/types.js.map +1 -0
  163. package/dist/tools/webfetch.d.ts +2 -0
  164. package/dist/tools/webfetch.js +97 -0
  165. package/dist/tools/webfetch.js.map +1 -0
  166. package/dist/tools/websearch.d.ts +2 -0
  167. package/dist/tools/websearch.js +88 -0
  168. package/dist/tools/websearch.js.map +1 -0
  169. package/dist/tools/write.d.ts +2 -0
  170. package/dist/tools/write.js +91 -0
  171. package/dist/tools/write.js.map +1 -0
  172. package/dist/types.d.ts +83 -0
  173. package/dist/types.js +10 -0
  174. package/dist/types.js.map +1 -0
  175. package/package.json +74 -4
@@ -0,0 +1,18 @@
1
+ import type { Component } from "@earendil-works/pi-tui";
2
+ export interface StatusLineParts {
3
+ left: string;
4
+ tokens: string;
5
+ effort: string;
6
+ }
7
+ /**
8
+ * Lay out the top status row: provider/model on the left and effort hard
9
+ * against the right edge. Context tokens get their own row underneath.
10
+ */
11
+ export declare function formatStatusLine(left: string, right: string, width: number): string;
12
+ /** Two-row status bar: provider/model + effort, then context tokens. */
13
+ export declare class StatusLine implements Component {
14
+ private parts;
15
+ setParts(parts: StatusLineParts): void;
16
+ invalidate(): void;
17
+ render(width: number): string[];
18
+ }
@@ -0,0 +1,35 @@
1
+ import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
2
+ /**
3
+ * Lay out the top status row: provider/model on the left and effort hard
4
+ * against the right edge. Context tokens get their own row underneath.
5
+ */
6
+ export function formatStatusLine(left, right, width) {
7
+ const w = Math.max(1, Math.floor(width));
8
+ const free = w - visibleWidth(left) - visibleWidth(right);
9
+ if (free < 4) {
10
+ return truncateToWidth(`${left} ${right}`, w, "…");
11
+ }
12
+ return `${left}${" ".repeat(free)}${right}`;
13
+ }
14
+ /** Two-row status bar: provider/model + effort, then context tokens. */
15
+ export class StatusLine {
16
+ parts = { left: "", tokens: "", effort: "" };
17
+ setParts(parts) {
18
+ this.parts = parts;
19
+ }
20
+ invalidate() {
21
+ // No cached state.
22
+ }
23
+ render(width) {
24
+ const contentWidth = Math.max(1, width - 2);
25
+ const top = formatStatusLine(this.parts.left, this.parts.effort, contentWidth);
26
+ const bottom = truncateToWidth(this.parts.tokens, contentWidth);
27
+ const topPadding = Math.max(0, width - visibleWidth(top) - 1);
28
+ const bottomPadding = Math.max(0, width - visibleWidth(bottom) - 1);
29
+ return [
30
+ " " + top + " ".repeat(topPadding),
31
+ " " + bottom + " ".repeat(bottomPadding),
32
+ ];
33
+ }
34
+ }
35
+ //# sourceMappingURL=status-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-line.js","sourceRoot":"","sources":["../../src/cli/status-line.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAQvE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,KAAa,EACb,KAAa;IAEb,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED,wEAAwE;AACxE,MAAM,OAAO,UAAU;IACb,KAAK,GAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEtE,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,UAAU;QACR,mBAAmB;IACrB,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,gBAAgB,CAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EACf,IAAI,CAAC,KAAK,CAAC,MAAM,EACjB,YAAY,CACb,CAAC;QACF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;YAClC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;SACzC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { Transcript } from "./transcript.js";
2
+ /** Lines kept live while streaming; older lines are sealed into cached Text. */
3
+ export declare const STREAM_LIVE_LINES = 200;
4
+ /** Extra live lines tolerated before a batch is sealed. */
5
+ export declare const STREAM_SEAL_BATCH = 200;
6
+ /**
7
+ * Incremental assistant text renderer. Completed lines are moved out of the
8
+ * live Text into static components, so each frame only re-wraps a bounded tail
9
+ * even when the message grows to thousands of lines. Sealing happens in
10
+ * batches, which keeps the number of components small as well.
11
+ */
12
+ export declare class StreamText {
13
+ private readonly transcript;
14
+ private readonly maxLines;
15
+ private readonly sealBatch;
16
+ private buffer;
17
+ private live;
18
+ constructor(transcript: Transcript, maxLines?: number, sealBatch?: number);
19
+ append(delta: string): void;
20
+ /** Stop this message; its rendered text stays in the transcript. */
21
+ finalize(): void;
22
+ }
@@ -0,0 +1,50 @@
1
+ import { Text } from "@earendil-works/pi-tui";
2
+ /** Lines kept live while streaming; older lines are sealed into cached Text. */
3
+ export const STREAM_LIVE_LINES = 200;
4
+ /** Extra live lines tolerated before a batch is sealed. */
5
+ export const STREAM_SEAL_BATCH = 200;
6
+ /**
7
+ * Incremental assistant text renderer. Completed lines are moved out of the
8
+ * live Text into static components, so each frame only re-wraps a bounded tail
9
+ * even when the message grows to thousands of lines. Sealing happens in
10
+ * batches, which keeps the number of components small as well.
11
+ */
12
+ export class StreamText {
13
+ transcript;
14
+ maxLines;
15
+ sealBatch;
16
+ buffer = "";
17
+ live = null;
18
+ constructor(transcript, maxLines = STREAM_LIVE_LINES, sealBatch = STREAM_SEAL_BATCH) {
19
+ this.transcript = transcript;
20
+ this.maxLines = maxLines;
21
+ this.sealBatch = sealBatch;
22
+ }
23
+ append(delta) {
24
+ this.buffer += delta;
25
+ const lines = this.buffer.split("\n");
26
+ if (lines.length > this.maxLines + this.sealBatch) {
27
+ const keepCount = this.maxLines;
28
+ const sealed = lines.slice(0, lines.length - keepCount).join("\n");
29
+ this.buffer = lines.slice(-keepCount).join("\n");
30
+ if (this.live)
31
+ this.transcript.container.removeChild(this.live);
32
+ this.transcript.add(new Text(sealed));
33
+ this.live = new Text(this.buffer);
34
+ this.transcript.add(this.live);
35
+ }
36
+ else {
37
+ if (!this.live) {
38
+ this.live = new Text("");
39
+ this.transcript.add(this.live);
40
+ }
41
+ this.live.setText(this.buffer);
42
+ }
43
+ }
44
+ /** Stop this message; its rendered text stays in the transcript. */
45
+ finalize() {
46
+ this.buffer = "";
47
+ this.live = null;
48
+ }
49
+ }
50
+ //# sourceMappingURL=stream-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-text.js","sourceRoot":"","sources":["../../src/cli/stream-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAG9C,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IAKF;IACA;IACA;IANX,MAAM,GAAG,EAAE,CAAC;IACZ,IAAI,GAAgB,IAAI,CAAC;IAEjC,YACmB,UAAsB,EACtB,WAAW,iBAAiB,EAC5B,YAAY,iBAAiB;QAF7B,eAAU,GAAV,UAAU,CAAY;QACtB,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,cAAS,GAAT,SAAS,CAAoB;IAC7C,CAAC;IAEJ,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,IAAI;gBAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import { Container, type Component } from "@earendil-works/pi-tui";
2
+ /** Soft cap on rendered transcript children before the oldest are collapsed. */
3
+ export declare const TRANSCRIPT_MAX_CHILDREN = 1500;
4
+ /** How many children to collapse when the cap is exceeded. */
5
+ export declare const TRANSCRIPT_PRUNE_COUNT = 500;
6
+ /**
7
+ * Append-only transcript with bounded rendering work. The session store keeps
8
+ * the full history; this only limits what the TUI keeps as live components.
9
+ */
10
+ export declare class Transcript {
11
+ readonly container: Container;
12
+ private hidden;
13
+ private marker;
14
+ get hiddenCount(): number;
15
+ add(child: Component): void;
16
+ private pruneIfNeeded;
17
+ }
@@ -0,0 +1,40 @@
1
+ import { Container, Text } from "@earendil-works/pi-tui";
2
+ /** Soft cap on rendered transcript children before the oldest are collapsed. */
3
+ export const TRANSCRIPT_MAX_CHILDREN = 1500;
4
+ /** How many children to collapse when the cap is exceeded. */
5
+ export const TRANSCRIPT_PRUNE_COUNT = 500;
6
+ /**
7
+ * Append-only transcript with bounded rendering work. The session store keeps
8
+ * the full history; this only limits what the TUI keeps as live components.
9
+ */
10
+ export class Transcript {
11
+ container = new Container();
12
+ hidden = 0;
13
+ marker = null;
14
+ get hiddenCount() {
15
+ return this.hidden;
16
+ }
17
+ add(child) {
18
+ this.container.addChild(child);
19
+ this.pruneIfNeeded();
20
+ }
21
+ pruneIfNeeded() {
22
+ const start = this.marker ? 1 : 0;
23
+ if (this.container.children.length - start <= TRANSCRIPT_MAX_CHILDREN)
24
+ return;
25
+ const removable = Math.min(TRANSCRIPT_PRUNE_COUNT, this.container.children.length - start - 1);
26
+ if (removable <= 0)
27
+ return;
28
+ this.container.children.splice(start, removable);
29
+ this.hidden += removable;
30
+ const label = `\x1b[2m… ${this.hidden} earlier lines hidden (session retains full history)\x1b[0m`;
31
+ if (this.marker) {
32
+ this.marker.setText(label);
33
+ }
34
+ else {
35
+ this.marker = new Text(label);
36
+ this.container.children.unshift(this.marker);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/cli/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAkB,MAAM,wBAAwB,CAAC;AAEzE,gFAAgF;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAC5C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C;;;GAGG;AACH,MAAM,OAAO,UAAU;IACZ,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAC7B,MAAM,GAAG,CAAC,CAAC;IACX,MAAM,GAAgB,IAAI,CAAC;IAEnC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,KAAgB;QAClB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,IAAI,uBAAuB;YAAE,OAAO;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,sBAAsB,EACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAC3C,CAAC;QACF,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO;QAE3B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;QACzB,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,MAAM,6DAA6D,CAAC;QACnG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ export interface Credentials {
2
+ /** Provider profile name -> raw API key. */
3
+ apiKeys: Record<string, string>;
4
+ }
5
+ /**
6
+ * Load the user's credentials file. Missing or malformed files yield an empty
7
+ * credential set so a broken file never blocks starting the CLI.
8
+ */
9
+ export declare function loadCredentials(path?: string): Credentials;
10
+ /** Persist an API key for a provider profile with owner-only permissions. */
11
+ export declare function saveApiKey(profile: string, apiKey: string, path?: string): void;
12
+ export declare function removeApiKey(profile: string, path?: string): void;
13
+ export declare function getApiKey(profile: string, path?: string): string | null;
14
+ export declare function hasApiKey(profile: string, opts?: {
15
+ apiKeyEnv?: string | null;
16
+ path?: string;
17
+ }): boolean;
18
+ /**
19
+ * Resolve a provider key using the same precedence as provider construction:
20
+ * environment variable first, then the stored credential file.
21
+ */
22
+ export declare function resolveApiKey(profile: string, opts?: {
23
+ apiKeyEnv?: string | null;
24
+ inline?: string | null;
25
+ path?: string;
26
+ }): string | null;
@@ -0,0 +1,79 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { defaultCredentialsPath } from "./paths.js";
4
+ function emptyCredentials() {
5
+ return { apiKeys: {} };
6
+ }
7
+ /**
8
+ * Load the user's credentials file. Missing or malformed files yield an empty
9
+ * credential set so a broken file never blocks starting the CLI.
10
+ */
11
+ export function loadCredentials(path = defaultCredentialsPath()) {
12
+ if (!existsSync(path))
13
+ return emptyCredentials();
14
+ try {
15
+ const raw = JSON.parse(readFileSync(path, "utf8"));
16
+ if (!raw || typeof raw !== "object")
17
+ return emptyCredentials();
18
+ const apiKeys = raw.apiKeys;
19
+ if (!apiKeys || typeof apiKeys !== "object")
20
+ return emptyCredentials();
21
+ const out = {};
22
+ for (const [name, value] of Object.entries(apiKeys)) {
23
+ if (typeof value === "string" && value)
24
+ out[name] = value;
25
+ }
26
+ return { apiKeys: out };
27
+ }
28
+ catch {
29
+ return emptyCredentials();
30
+ }
31
+ }
32
+ function writeCredentials(creds, path) {
33
+ mkdirSync(dirname(path), { recursive: true });
34
+ const tmp = `${path}.${process.pid}.tmp`;
35
+ writeFileSync(tmp, JSON.stringify(creds, null, 2) + "\n", {
36
+ encoding: "utf8",
37
+ mode: 0o600,
38
+ });
39
+ renameSync(tmp, path);
40
+ try {
41
+ chmodSync(path, 0o600);
42
+ }
43
+ catch {
44
+ // Best effort (e.g., Windows filesystems without POSIX modes).
45
+ }
46
+ }
47
+ /** Persist an API key for a provider profile with owner-only permissions. */
48
+ export function saveApiKey(profile, apiKey, path = defaultCredentialsPath()) {
49
+ const creds = loadCredentials(path);
50
+ creds.apiKeys[profile] = apiKey.trim();
51
+ writeCredentials(creds, path);
52
+ }
53
+ export function removeApiKey(profile, path = defaultCredentialsPath()) {
54
+ const creds = loadCredentials(path);
55
+ delete creds.apiKeys[profile];
56
+ writeCredentials(creds, path);
57
+ }
58
+ export function getApiKey(profile, path = defaultCredentialsPath()) {
59
+ return loadCredentials(path).apiKeys[profile] ?? null;
60
+ }
61
+ export function hasApiKey(profile, opts = {}) {
62
+ return resolveApiKey(profile, opts) !== null;
63
+ }
64
+ /**
65
+ * Resolve a provider key using the same precedence as provider construction:
66
+ * environment variable first, then the stored credential file.
67
+ */
68
+ export function resolveApiKey(profile, opts = {}) {
69
+ if (opts.apiKeyEnv) {
70
+ const fromEnv = process.env[opts.apiKeyEnv];
71
+ if (fromEnv)
72
+ return fromEnv;
73
+ }
74
+ const stored = getApiKey(profile, opts.path);
75
+ if (stored)
76
+ return stored;
77
+ return opts.inline ?? null;
78
+ }
79
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export declare const DEFAULT_CONFIG: {
2
+ defaultProvider: string;
3
+ providers: Record<string, unknown>;
4
+ runtime: {
5
+ bashConcurrency: string;
6
+ approvalMode: string;
7
+ maxIterations: number;
8
+ maxToolCalls: number;
9
+ maxExecutionMs: number;
10
+ maxParallelToolCalls: number;
11
+ maxToolOutputBytes: number;
12
+ maxBashTimeMs: number;
13
+ };
14
+ context: {
15
+ maxInputTokens: number | null;
16
+ reserveOutputTokens: number;
17
+ compactAtPercent: number;
18
+ maxProjectInstructionBytes: number;
19
+ };
20
+ sessions: {
21
+ enabled: boolean;
22
+ retentionDays: number | null;
23
+ };
24
+ };
@@ -0,0 +1,25 @@
1
+ import { DEFAULT_LIMITS } from "../types.js";
2
+ export const DEFAULT_CONFIG = {
3
+ defaultProvider: "kilo",
4
+ providers: {
5
+ kilo: {
6
+ type: "openai-compatible",
7
+ baseUrl: "https://api.kilo.ai/api/gateway",
8
+ model: "kilo-auto/free",
9
+ apiKeyEnv: null,
10
+ },
11
+ },
12
+ runtime: {
13
+ ...DEFAULT_LIMITS,
14
+ bashConcurrency: "serial",
15
+ approvalMode: "ask",
16
+ },
17
+ context: {
18
+ maxInputTokens: null,
19
+ reserveOutputTokens: 4096,
20
+ compactAtPercent: 85,
21
+ maxProjectInstructionBytes: 30000,
22
+ },
23
+ sessions: { enabled: true, retentionDays: null },
24
+ };
25
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,eAAe,EAAE,MAAM;IACvB,SAAS,EAAE;QACT,IAAI,EAAE;YACJ,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,iCAAiC;YAC1C,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,IAAI;SAChB;KACyB;IAC5B,OAAO,EAAE;QACP,GAAG,cAAc;QACjB,eAAe,EAAE,QAAQ;QACzB,YAAY,EAAE,KAAK;KACpB;IACD,OAAO,EAAE;QACP,cAAc,EAAE,IAAqB;QACrC,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,EAAE;QACpB,0BAA0B,EAAE,KAAK;KAClC;IACD,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAqB,EAAE;CAClE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Config } from "./schema.js";
2
+ export interface LoadConfigOptions {
3
+ userConfigPath?: string;
4
+ projectRoot?: string;
5
+ overrides?: Partial<Config>;
6
+ }
7
+ export declare function loadConfig(options?: LoadConfigOptions): Config;
@@ -0,0 +1,105 @@
1
+ import { readFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { ConfigSchema } from "./schema.js";
4
+ import { DEFAULT_CONFIG } from "./defaults.js";
5
+ import { defaultUserConfigPath } from "./paths.js";
6
+ function readJsonFile(path) {
7
+ if (!existsSync(path))
8
+ return undefined;
9
+ try {
10
+ return JSON.parse(readFileSync(path, "utf8"));
11
+ }
12
+ catch {
13
+ throw new Error(`Invalid JSON in config file: ${path}`);
14
+ }
15
+ }
16
+ function ensureUserConfig(path) {
17
+ if (existsSync(path))
18
+ return;
19
+ try {
20
+ mkdirSync(join(path, ".."), { recursive: true });
21
+ writeFileSync(path, JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n", "utf8");
22
+ }
23
+ catch {
24
+ // Best effort; ignore failures (e.g., read-only filesystem).
25
+ }
26
+ }
27
+ function envOverrides() {
28
+ const out = {};
29
+ if (process.env.ATOM_LITE_PROVIDER)
30
+ out.defaultProvider = process.env.ATOM_LITE_PROVIDER;
31
+ if (process.env.ATOM_LITE_MODEL) {
32
+ // model override applies to all providers is not precise; store as override hint only
33
+ }
34
+ if (process.env.ATOM_LITE_APPROVAL_MODE) {
35
+ out.runtime = { approvalMode: process.env.ATOM_LITE_APPROVAL_MODE };
36
+ }
37
+ return out;
38
+ }
39
+ export function loadConfig(options = {}) {
40
+ const userPath = options.userConfigPath ?? defaultUserConfigPath();
41
+ const projectPath = options.projectRoot
42
+ ? join(options.projectRoot, ".atom-lite", "config.json")
43
+ : join(process.cwd(), ".atom-lite", "config.json");
44
+ // Auto-create default user config on first run (never overwrite).
45
+ if (options.userConfigPath === undefined) {
46
+ ensureUserConfig(userPath);
47
+ }
48
+ const userRaw = (readJsonFile(userPath) ?? {});
49
+ const projectRaw = (readJsonFile(projectPath) ?? {});
50
+ // Precedence (low -> high): defaults, user, project (allowed non-secret),
51
+ // env, overrides. Security-critical user settings (approvalMode) are not
52
+ // overridden by project config.
53
+ const merged = {
54
+ ...DEFAULT_CONFIG,
55
+ ...userRaw,
56
+ ...projectRaw,
57
+ defaultProvider: userRaw.defaultProvider ??
58
+ projectRaw.defaultProvider ??
59
+ DEFAULT_CONFIG.defaultProvider,
60
+ providers: {
61
+ ...DEFAULT_CONFIG.providers,
62
+ ...(userRaw.providers ?? {}),
63
+ ...(projectRaw.providers ?? {}),
64
+ },
65
+ runtime: {
66
+ ...DEFAULT_CONFIG.runtime,
67
+ ...(userRaw.runtime ?? {}),
68
+ ...(projectRaw.runtime ?? {}),
69
+ },
70
+ context: {
71
+ ...DEFAULT_CONFIG.context,
72
+ ...(userRaw.context ?? {}),
73
+ ...(projectRaw.context ?? {}),
74
+ },
75
+ sessions: {
76
+ ...DEFAULT_CONFIG.sessions,
77
+ ...(userRaw.sessions ?? {}),
78
+ ...(projectRaw.sessions ?? {}),
79
+ },
80
+ };
81
+ // Protect security-critical user settings from project override.
82
+ const userRuntime = userRaw.runtime ?? {};
83
+ const mergedRuntime = merged.runtime ?? {};
84
+ mergedRuntime.approvalMode = userRuntime.approvalMode ?? "ask";
85
+ merged.runtime = mergedRuntime;
86
+ // no fallback; trust explicit configuration
87
+ const env = envOverrides();
88
+ const mergedWithEnv = {
89
+ ...merged,
90
+ ...(env.defaultProvider ? { defaultProvider: env.defaultProvider } : {}),
91
+ runtime: { ...merged.runtime, ...(env.runtime ?? {}) },
92
+ };
93
+ const parsed = ConfigSchema.safeParse({
94
+ ...mergedWithEnv,
95
+ ...(options.overrides ?? {}),
96
+ });
97
+ if (!parsed.success) {
98
+ const issues = parsed.error.issues
99
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
100
+ .join("; ");
101
+ throw new Error(`Invalid configuration: ${issues}`);
102
+ }
103
+ return parsed.data;
104
+ }
105
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Base directory for all user-level Atom-lite state. */
2
+ export declare function userConfigDir(): string;
3
+ export declare function defaultUserConfigPath(): string;
4
+ export declare function defaultCredentialsPath(): string;
@@ -0,0 +1,14 @@
1
+ import { join } from "node:path";
2
+ import { homedir } from "node:os";
3
+ /** Base directory for all user-level Atom-lite state. */
4
+ export function userConfigDir() {
5
+ const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
6
+ return join(base, "atom-lite");
7
+ }
8
+ export function defaultUserConfigPath() {
9
+ return join(userConfigDir(), "config.json");
10
+ }
11
+ export function defaultCredentialsPath() {
12
+ return join(userConfigDir(), "credentials.json");
13
+ }
14
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,yDAAyD;AACzD,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ export declare const ProviderConfigSchema: z.ZodObject<{
3
+ type: z.ZodString;
4
+ baseUrl: z.ZodOptional<z.ZodString>;
5
+ model: z.ZodString;
6
+ apiKeyEnv: z.ZodOptional<z.ZodNullable<z.ZodString>>;
7
+ apiKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
8
+ keepAlive: z.ZodOptional<z.ZodString>;
9
+ think: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
10
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
11
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
12
+ contextWindow: z.ZodOptional<z.ZodNumber>;
13
+ }, z.core.$strict>;
14
+ export declare const RuntimeConfigSchema: z.ZodObject<{
15
+ maxIterations: z.ZodDefault<z.ZodNumber>;
16
+ maxToolCalls: z.ZodDefault<z.ZodNumber>;
17
+ maxExecutionMs: z.ZodDefault<z.ZodNumber>;
18
+ maxParallelToolCalls: z.ZodDefault<z.ZodNumber>;
19
+ maxToolOutputBytes: z.ZodDefault<z.ZodNumber>;
20
+ maxBashTimeMs: z.ZodDefault<z.ZodNumber>;
21
+ bashConcurrency: z.ZodDefault<z.ZodEnum<{
22
+ serial: "serial";
23
+ parallel: "parallel";
24
+ }>>;
25
+ approvalMode: z.ZodDefault<z.ZodEnum<{
26
+ ask: "ask";
27
+ trusted: "trusted";
28
+ deny: "deny";
29
+ }>>;
30
+ }, z.core.$strict>;
31
+ export declare const ContextConfigSchema: z.ZodObject<{
32
+ maxInputTokens: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
33
+ reserveOutputTokens: z.ZodDefault<z.ZodNumber>;
34
+ compactAtPercent: z.ZodDefault<z.ZodNumber>;
35
+ maxProjectInstructionBytes: z.ZodDefault<z.ZodNumber>;
36
+ }, z.core.$strict>;
37
+ export declare const SessionsConfigSchema: z.ZodObject<{
38
+ enabled: z.ZodDefault<z.ZodBoolean>;
39
+ retentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
40
+ }, z.core.$strict>;
41
+ export declare const ConfigSchema: z.ZodObject<{
42
+ defaultProvider: z.ZodDefault<z.ZodString>;
43
+ providers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
44
+ type: z.ZodString;
45
+ baseUrl: z.ZodOptional<z.ZodString>;
46
+ model: z.ZodString;
47
+ apiKeyEnv: z.ZodOptional<z.ZodNullable<z.ZodString>>;
48
+ apiKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
49
+ keepAlive: z.ZodOptional<z.ZodString>;
50
+ think: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
51
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
52
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
53
+ contextWindow: z.ZodOptional<z.ZodNumber>;
54
+ }, z.core.$strict>>>;
55
+ runtime: z.ZodPrefault<z.ZodObject<{
56
+ maxIterations: z.ZodDefault<z.ZodNumber>;
57
+ maxToolCalls: z.ZodDefault<z.ZodNumber>;
58
+ maxExecutionMs: z.ZodDefault<z.ZodNumber>;
59
+ maxParallelToolCalls: z.ZodDefault<z.ZodNumber>;
60
+ maxToolOutputBytes: z.ZodDefault<z.ZodNumber>;
61
+ maxBashTimeMs: z.ZodDefault<z.ZodNumber>;
62
+ bashConcurrency: z.ZodDefault<z.ZodEnum<{
63
+ serial: "serial";
64
+ parallel: "parallel";
65
+ }>>;
66
+ approvalMode: z.ZodDefault<z.ZodEnum<{
67
+ ask: "ask";
68
+ trusted: "trusted";
69
+ deny: "deny";
70
+ }>>;
71
+ }, z.core.$strict>>;
72
+ context: z.ZodPrefault<z.ZodObject<{
73
+ maxInputTokens: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
74
+ reserveOutputTokens: z.ZodDefault<z.ZodNumber>;
75
+ compactAtPercent: z.ZodDefault<z.ZodNumber>;
76
+ maxProjectInstructionBytes: z.ZodDefault<z.ZodNumber>;
77
+ }, z.core.$strict>>;
78
+ sessions: z.ZodPrefault<z.ZodObject<{
79
+ enabled: z.ZodDefault<z.ZodBoolean>;
80
+ retentionDays: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
81
+ }, z.core.$strict>>;
82
+ }, z.core.$strict>;
83
+ export type Config = z.infer<typeof ConfigSchema>;
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ export const ProviderConfigSchema = z
3
+ .object({
4
+ type: z.string(),
5
+ baseUrl: z.string().url().optional(),
6
+ model: z.string(),
7
+ apiKeyEnv: z.string().nullable().optional(),
8
+ apiKey: z.string().nullable().optional(),
9
+ keepAlive: z.string().optional(),
10
+ think: z.union([z.boolean(), z.string()]).optional(),
11
+ headers: z.record(z.string(), z.string()).optional(),
12
+ options: z.record(z.string(), z.unknown()).optional(),
13
+ /** Explicit context window for custom/local models without metadata. */
14
+ contextWindow: z.number().int().positive().optional(),
15
+ })
16
+ .strict();
17
+ export const RuntimeConfigSchema = z
18
+ .object({
19
+ maxIterations: z.number().int().positive().default(40),
20
+ maxToolCalls: z.number().int().positive().default(100),
21
+ maxExecutionMs: z.number().int().positive().default(1_800_000),
22
+ maxParallelToolCalls: z.number().int().positive().default(4),
23
+ maxToolOutputBytes: z.number().int().positive().default(30_000),
24
+ maxBashTimeMs: z.number().int().positive().default(120_000),
25
+ bashConcurrency: z.enum(["serial", "parallel"]).default("serial"),
26
+ approvalMode: z.enum(["ask", "trusted", "deny"]).default("ask"),
27
+ })
28
+ .strict();
29
+ export const ContextConfigSchema = z
30
+ .object({
31
+ maxInputTokens: z.number().int().positive().nullable().default(null),
32
+ reserveOutputTokens: z.number().int().positive().default(4096),
33
+ compactAtPercent: z.number().int().min(1).max(100).default(85),
34
+ maxProjectInstructionBytes: z.number().int().positive().default(30000),
35
+ })
36
+ .strict();
37
+ export const SessionsConfigSchema = z
38
+ .object({
39
+ enabled: z.boolean().default(true),
40
+ retentionDays: z.number().int().positive().nullable().default(null),
41
+ })
42
+ .strict();
43
+ export const ConfigSchema = z
44
+ .object({
45
+ defaultProvider: z.string().default("openai-compatible"),
46
+ providers: z.record(z.string(), ProviderConfigSchema).default({}),
47
+ runtime: RuntimeConfigSchema.prefault({}),
48
+ context: ContextConfigSchema.prefault({}),
49
+ sessions: SessionsConfigSchema.prefault({}),
50
+ })
51
+ .strict();
52
+ //# sourceMappingURL=schema.js.map