@markusylisiurunen/tau 0.1.2

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 (106) hide show
  1. package/README.md +228 -0
  2. package/dist/app.js +1140 -0
  3. package/dist/app.js.map +1 -0
  4. package/dist/bash_commands.js +81 -0
  5. package/dist/bash_commands.js.map +1 -0
  6. package/dist/cli.js +147 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/clipboard.js +16 -0
  9. package/dist/clipboard.js.map +1 -0
  10. package/dist/commands.js +76 -0
  11. package/dist/commands.js.map +1 -0
  12. package/dist/config.js +39 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/content_loader.js +241 -0
  15. package/dist/content_loader.js.map +1 -0
  16. package/dist/debug-ui.js +134 -0
  17. package/dist/debug-ui.js.map +1 -0
  18. package/dist/main.js +85 -0
  19. package/dist/main.js.map +1 -0
  20. package/dist/personas.js +227 -0
  21. package/dist/personas.js.map +1 -0
  22. package/dist/prompts.js +261 -0
  23. package/dist/prompts.js.map +1 -0
  24. package/dist/session/message_accumulator.js +56 -0
  25. package/dist/session/message_accumulator.js.map +1 -0
  26. package/dist/session/session_engine.js +290 -0
  27. package/dist/session/session_engine.js.map +1 -0
  28. package/dist/subagents/explore.js +42 -0
  29. package/dist/subagents/explore.js.map +1 -0
  30. package/dist/subagents/registry.js +30 -0
  31. package/dist/subagents/registry.js.map +1 -0
  32. package/dist/subagents/subagent_engine.js +147 -0
  33. package/dist/subagents/subagent_engine.js.map +1 -0
  34. package/dist/subagents/types.js +2 -0
  35. package/dist/subagents/types.js.map +1 -0
  36. package/dist/terminal.js +115 -0
  37. package/dist/terminal.js.map +1 -0
  38. package/dist/tools/bash.js +334 -0
  39. package/dist/tools/bash.js.map +1 -0
  40. package/dist/tools/edit.js +199 -0
  41. package/dist/tools/edit.js.map +1 -0
  42. package/dist/tools/registry.js +15 -0
  43. package/dist/tools/registry.js.map +1 -0
  44. package/dist/tools/task.js +202 -0
  45. package/dist/tools/task.js.map +1 -0
  46. package/dist/tools/write.js +89 -0
  47. package/dist/tools/write.js.map +1 -0
  48. package/dist/types.js +9 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/ui/assistant_message.js +87 -0
  51. package/dist/ui/assistant_message.js.map +1 -0
  52. package/dist/ui/bash_execution.js +127 -0
  53. package/dist/ui/bash_execution.js.map +1 -0
  54. package/dist/ui/chat_container.js +90 -0
  55. package/dist/ui/chat_container.js.map +1 -0
  56. package/dist/ui/components/dynamic_border.js +11 -0
  57. package/dist/ui/components/dynamic_border.js.map +1 -0
  58. package/dist/ui/components/one_line_segments.js +79 -0
  59. package/dist/ui/components/one_line_segments.js.map +1 -0
  60. package/dist/ui/components/padded_container.js +24 -0
  61. package/dist/ui/components/padded_container.js.map +1 -0
  62. package/dist/ui/custom_editor.js +53 -0
  63. package/dist/ui/custom_editor.js.map +1 -0
  64. package/dist/ui/file_execution.js +189 -0
  65. package/dist/ui/file_execution.js.map +1 -0
  66. package/dist/ui/footer.js +56 -0
  67. package/dist/ui/footer.js.map +1 -0
  68. package/dist/ui/queued_messages.js +31 -0
  69. package/dist/ui/queued_messages.js.map +1 -0
  70. package/dist/ui/session_divider.js +17 -0
  71. package/dist/ui/session_divider.js.map +1 -0
  72. package/dist/ui/session_summary.js +30 -0
  73. package/dist/ui/session_summary.js.map +1 -0
  74. package/dist/ui/slash_autocomplete.js +177 -0
  75. package/dist/ui/slash_autocomplete.js.map +1 -0
  76. package/dist/ui/system_message.js +8 -0
  77. package/dist/ui/system_message.js.map +1 -0
  78. package/dist/ui/task_execution.js +190 -0
  79. package/dist/ui/task_execution.js.map +1 -0
  80. package/dist/ui/theme.js +108 -0
  81. package/dist/ui/theme.js.map +1 -0
  82. package/dist/ui/tool_output.js +24 -0
  83. package/dist/ui/tool_output.js.map +1 -0
  84. package/dist/ui/user_message.js +14 -0
  85. package/dist/ui/user_message.js.map +1 -0
  86. package/dist/utils/color.js +13 -0
  87. package/dist/utils/color.js.map +1 -0
  88. package/dist/utils/context.js +108 -0
  89. package/dist/utils/context.js.map +1 -0
  90. package/dist/utils/fork.js +41 -0
  91. package/dist/utils/fork.js.map +1 -0
  92. package/dist/utils/format.js +35 -0
  93. package/dist/utils/format.js.map +1 -0
  94. package/dist/utils/fuzzy.js +48 -0
  95. package/dist/utils/fuzzy.js.map +1 -0
  96. package/dist/utils/git.js +21 -0
  97. package/dist/utils/git.js.map +1 -0
  98. package/dist/utils/messages.js +41 -0
  99. package/dist/utils/messages.js.map +1 -0
  100. package/dist/utils/never.js +4 -0
  101. package/dist/utils/never.js.map +1 -0
  102. package/dist/utils/project_files.js +96 -0
  103. package/dist/utils/project_files.js.map +1 -0
  104. package/dist/utils/truncate.js +299 -0
  105. package/dist/utils/truncate.js.map +1 -0
  106. package/package.json +37 -0
@@ -0,0 +1,108 @@
1
+ import { Chalk } from "chalk";
2
+ import { hslToHex } from "../utils/color.js";
3
+ import { assertNever } from "../utils/never.js";
4
+ const chalk = new Chalk({ level: 3 });
5
+ const ACCENT_HUE = 28;
6
+ const TEXT_HUE = 24;
7
+ const LINK_HUE = 328;
8
+ const CODE_HUE = 224;
9
+ const WARN_HUE = 24;
10
+ const ERROR_HUE = 0;
11
+ const palette = {
12
+ // Primary colors
13
+ accent: chalk.hex(hslToHex(ACCENT_HUE, 92, 72)),
14
+ muted: chalk.hex(hslToHex(TEXT_HUE, 8, 56)),
15
+ dim: chalk.hex(hslToHex(TEXT_HUE, 6, 42)),
16
+ link: chalk.hex(hslToHex(LINK_HUE, 84, 72)),
17
+ thinking: chalk.hex(hslToHex(TEXT_HUE, 8, 56)),
18
+ codeInline: chalk.hex(hslToHex(CODE_HUE, 64, 74)),
19
+ codeBlock: chalk.hex(hslToHex(CODE_HUE, 64, 74)),
20
+ // Semantic colors
21
+ warn: chalk.hex(hslToHex(WARN_HUE, 76, 68)),
22
+ error: chalk.hex(hslToHex(ERROR_HUE, 76, 68)),
23
+ memoryMode: chalk.hex(hslToHex(280, 80, 72)),
24
+ bashRunning: chalk.hex(hslToHex(168, 80, 72)),
25
+ bashRan: chalk.hex(hslToHex(192, 80, 72)),
26
+ bashOutput: chalk.hex(hslToHex(TEXT_HUE, 8, 56)),
27
+ toolFileRan: chalk.hex(hslToHex(192, 80, 72)),
28
+ filePreview: chalk.hex(hslToHex(TEXT_HUE, 8, 56)),
29
+ taskRunning: chalk.hex(hslToHex(168, 80, 72)),
30
+ taskRan: chalk.hex(hslToHex(192, 80, 72)),
31
+ taskPreview: chalk.hex(hslToHex(TEXT_HUE, 8, 56)),
32
+ // Diff colors
33
+ diffAdded: chalk.hex(hslToHex(72, 40, 46)),
34
+ diffRemoved: chalk.hex(hslToHex(6, 44, 52)),
35
+ // Notices
36
+ noticeSuccess: chalk.hex(hslToHex(CODE_HUE, 64, 74)),
37
+ noticeWarn: chalk.hex(hslToHex(WARN_HUE, 76, 68)),
38
+ noticeError: chalk.hex(hslToHex(ERROR_HUE, 76, 68)),
39
+ // User message
40
+ userBg: chalk.bgHex(hslToHex(TEXT_HUE, 6, 12)),
41
+ userText: (text) => text,
42
+ userMemoryBg: chalk.bgHex(hslToHex(280, 18, 18)),
43
+ userMemoryText: chalk.hex(hslToHex(280, 42, 82)),
44
+ // Risk level indicators
45
+ riskNone: chalk.hex(hslToHex(TEXT_HUE, 6, 42)),
46
+ riskReadOnly: chalk.hex(hslToHex(72, 16, 44)),
47
+ riskReadWrite: chalk.hex(hslToHex(8, 20, 56)),
48
+ };
49
+ const markdownTheme = {
50
+ bold: (text) => chalk.bold(text),
51
+ code: (text) => palette.codeInline(text),
52
+ codeBlock: (text) => palette.codeBlock(text),
53
+ codeBlockBorder: (text) => palette.dim(text),
54
+ heading: (text) => chalk.bold(palette.accent(text)),
55
+ hr: (text) => palette.dim(text),
56
+ italic: (text) => chalk.italic(text),
57
+ link: (text) => palette.link(text),
58
+ linkUrl: (text) => palette.dim(text),
59
+ listBullet: (text) => palette.accent(text),
60
+ quote: (text) => chalk.italic(palette.muted(text)),
61
+ quoteBorder: (text) => palette.dim(text),
62
+ strikethrough: (text) => chalk.strikethrough(text),
63
+ underline: (text) => chalk.underline(text),
64
+ };
65
+ const selectListTheme = {
66
+ selectedPrefix: (text) => chalk.bold(palette.accent(text)),
67
+ selectedText: (text) => chalk.bold(palette.accent(text)),
68
+ description: (text) => palette.muted(text),
69
+ scrollInfo: (text) => palette.dim(text),
70
+ noMatch: (text) => palette.muted(text),
71
+ };
72
+ const editorTheme = {
73
+ borderColor: (text) => editorBorderForReasoning("none")(text),
74
+ selectList: selectListTheme,
75
+ };
76
+ export const theme = {
77
+ palette: palette,
78
+ markdownTheme: markdownTheme,
79
+ editorTheme: editorTheme,
80
+ };
81
+ export function editorBorderForReasoning(effort) {
82
+ const [MIN_H, MAX_H] = [20, 28];
83
+ const [MIN_S, MAX_S] = [8, 76];
84
+ const [MIN_L, MAX_L] = [24, 52];
85
+ const [RANGE_H, RANGE_S, RANGE_L] = [MAX_H - MIN_H, MAX_S - MIN_S, MAX_L - MIN_L];
86
+ const h = (x) => MIN_H + RANGE_H * x;
87
+ const s = (x) => MIN_S + RANGE_S * x;
88
+ const l = (x) => MIN_L + RANGE_L * x;
89
+ switch (effort) {
90
+ case undefined:
91
+ case "none":
92
+ return chalk.hex(hslToHex(h(0), s(0), l(0)));
93
+ case "minimal":
94
+ return chalk.hex(hslToHex(h(0.2), s(0.2), l(0.2)));
95
+ case "low":
96
+ return chalk.hex(hslToHex(h(0.4), s(0.4), l(0.4)));
97
+ case "medium":
98
+ return chalk.hex(hslToHex(h(0.6), s(0.6), l(0.6)));
99
+ case "high":
100
+ return chalk.hex(hslToHex(h(0.8), s(0.8), l(0.8)));
101
+ case "xhigh":
102
+ return chalk.hex(hslToHex(h(1), s(1), l(1)));
103
+ default:
104
+ assertNever(effort);
105
+ }
106
+ }
107
+ export { editorTheme, markdownTheme, palette };
108
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Container, Text } from "@mariozechner/pi-tui";
2
+ import { DynamicBorder } from "./components/dynamic_border.js";
3
+ import { OneLineSegmentsComponent } from "./components/one_line_segments.js";
4
+ export class ToolOutputComponent extends Container {
5
+ constructor(props) {
6
+ super();
7
+ if (props.compact) {
8
+ const { segments, flexIndices, extraText, extraComponent, paddingX, paddingY } = props.compactView;
9
+ this.addChild(new OneLineSegmentsComponent(segments, flexIndices ?? []));
10
+ if (extraComponent) {
11
+ this.addChild(extraComponent);
12
+ }
13
+ else if (extraText && extraText.trim() !== "") {
14
+ this.addChild(new Text(extraText, paddingX ?? 0, paddingY ?? 0));
15
+ }
16
+ return;
17
+ }
18
+ const { borderColor, text, paddingX, paddingY } = props.expanded;
19
+ this.addChild(new DynamicBorder(borderColor));
20
+ this.addChild(new Text(text, paddingX ?? 1, paddingY ?? 0));
21
+ this.addChild(new DynamicBorder(borderColor));
22
+ }
23
+ }
24
+ //# sourceMappingURL=tool_output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_output.js","sourceRoot":"","sources":["../../src/ui/tool_output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAuB,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAwBlG,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAChD,YAAY,KAAsB;QAChC,KAAK,EAAE,CAAC;QAER,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAC5E,KAAK,CAAC,WAAW,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,wBAAwB,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;YAEzE,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;YAED,OAAO;QACT,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEjE,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { Container, Markdown } from "@mariozechner/pi-tui";
2
+ import { theme } from "./theme.js";
3
+ export class UserMessageComponent extends Container {
4
+ constructor(text, opts) {
5
+ super();
6
+ const bgColor = opts?.isMemoryMode ? theme.palette.userMemoryBg : theme.palette.userBg;
7
+ const color = opts?.isMemoryMode ? theme.palette.userMemoryText : theme.palette.userText;
8
+ this.addChild(new Markdown(text, 1, 1, theme.markdownTheme, {
9
+ bgColor: (t) => bgColor(t),
10
+ color: (t) => color(t),
11
+ }));
12
+ }
13
+ }
14
+ //# sourceMappingURL=user_message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_message.js","sourceRoot":"","sources":["../../src/ui/user_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACjD,YAAY,IAAY,EAAE,IAAiC;QACzD,KAAK,EAAE,CAAC;QAER,MAAM,OAAO,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACvF,MAAM,KAAK,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAEzF,IAAI,CAAC,QAAQ,CACX,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE;YAC5C,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;SAC/B,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export function hslToHex(h, s, l) {
2
+ l /= 100;
3
+ const a = (s * Math.min(l, 1 - l)) / 100;
4
+ const f = (n) => {
5
+ const k = (n + h / 30) % 12;
6
+ const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
7
+ return Math.round(255 * color)
8
+ .toString(16)
9
+ .padStart(2, "0");
10
+ };
11
+ return `#${f(0)}${f(8)}${f(4)}`;
12
+ }
13
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/utils/color.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACtD,CAAC,IAAI,GAAG,CAAC;IACT,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;aAC3B,QAAQ,CAAC,EAAE,CAAC;aACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join, resolve, sep } from "node:path";
3
+ function buildUserPreferencesBlock(userPreferences) {
4
+ if (typeof userPreferences === "string" && userPreferences.trim()) {
5
+ return ["<user_preferences>", userPreferences, "</user_preferences>"].join("\n");
6
+ }
7
+ return undefined;
8
+ }
9
+ export function buildBaseSystemPrompt(args) {
10
+ const parts = [args.personaSystemPrompt.trim()];
11
+ if (args.projectContextBlock?.trim()) {
12
+ parts.push(args.projectContextBlock.trim());
13
+ }
14
+ if (args.previousSessionSummary?.trim()) {
15
+ parts.push([
16
+ "### Previous session context",
17
+ "",
18
+ "The following is a summary of a previous conversation session that provides relevant context:",
19
+ "<previous_session_summary>",
20
+ args.previousSessionSummary.trim(),
21
+ "</previous_session_summary>",
22
+ ].join("\n"));
23
+ }
24
+ parts.push(args.environmentTag.trim());
25
+ const userPrefsBlock = buildUserPreferencesBlock(args.userPreferences);
26
+ if (userPrefsBlock) {
27
+ parts.push(userPrefsBlock);
28
+ }
29
+ return parts.join("\n\n");
30
+ }
31
+ export function buildProjectContextBlock(args) {
32
+ const agentsFiles = findAgentsFilesFromCwdToHome(args.cwd, args.home);
33
+ if (agentsFiles.length === 0)
34
+ return undefined;
35
+ const lines = ["### Project context", ""];
36
+ for (const filePath of agentsFiles) {
37
+ let content = "";
38
+ try {
39
+ content = readFileSync(filePath, "utf-8");
40
+ }
41
+ catch {
42
+ continue;
43
+ }
44
+ lines.push(`<file path="${filePath}">`);
45
+ lines.push(content.trimEnd());
46
+ lines.push("</file>");
47
+ lines.push("");
48
+ }
49
+ const out = lines.join("\n").trimEnd();
50
+ return out.trim() ? out : undefined;
51
+ }
52
+ export function findAgentsFilesFromCwdToHome(cwd, home) {
53
+ const cwdAbs = resolve(cwd);
54
+ const homeAbs = resolve(home);
55
+ // If we're not inside the user's home directory, don't walk beyond it.
56
+ if (cwdAbs !== homeAbs && !cwdAbs.startsWith(homeAbs + sep)) {
57
+ return [];
58
+ }
59
+ const found = [];
60
+ let dir = cwdAbs;
61
+ // Closest-first order: cwd, parent, ..., home.
62
+ while (true) {
63
+ const candidate = join(dir, "AGENTS.md");
64
+ if (existsSync(candidate)) {
65
+ found.push(candidate);
66
+ }
67
+ if (dir === homeAbs)
68
+ break;
69
+ const parent = dirname(dir);
70
+ if (parent === dir)
71
+ break;
72
+ // Stay within home.
73
+ if (parent !== homeAbs && !parent.startsWith(homeAbs + sep))
74
+ break;
75
+ dir = parent;
76
+ }
77
+ return found;
78
+ }
79
+ export function describeRiskLevel(level) {
80
+ switch (level) {
81
+ case "none":
82
+ return "No bash tool access for the model.";
83
+ case "read-only":
84
+ return "Model may call bash only for read-only commands (safetyLevel='read').";
85
+ case "read-write":
86
+ return "Model may call bash for read or write commands (safetyLevel='read' or 'write').";
87
+ }
88
+ }
89
+ export function buildEnvironmentTag(args) {
90
+ const riskDesc = describeRiskLevel(args.riskLevel);
91
+ const nodeVersion = process.version;
92
+ const platform = process.platform;
93
+ return [
94
+ "<environment>",
95
+ ` <datetime>${args.datetime}</datetime>`,
96
+ ` <cwd>${args.cwd}</cwd>`,
97
+ ` <risk_level level="${args.riskLevel}">${riskDesc}</risk_level>`,
98
+ ` <node>${nodeVersion}</node>`,
99
+ ` <platform>${platform}</platform>`,
100
+ " <notes>This environment tag is static for the session and reflects the initial risk level. If the user changes risk level, you will be informed in a <system> tag at the start of the next user message.</notes>",
101
+ "</environment>",
102
+ ].join("\n");
103
+ }
104
+ export function formatRiskLevelChangeNotice(change) {
105
+ const toDesc = describeRiskLevel(change.to);
106
+ return `<system>Risk level changed by user from '${change.from}' to '${change.to}'. ${toDesc} This overrides the initial risk level described in the system prompt.</system>`;
107
+ }
108
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/utils/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export function formatHistoryForCompression(history) {
2
+ const lines = [];
3
+ for (const message of history) {
4
+ if (message.role === "user") {
5
+ lines.push("--- USER ---");
6
+ for (const block of message.content) {
7
+ if (typeof block === "string") {
8
+ lines.push(block);
9
+ }
10
+ else if (block.type === "text") {
11
+ lines.push(block.text);
12
+ }
13
+ }
14
+ lines.push("");
15
+ }
16
+ else if (message.role === "assistant") {
17
+ lines.push("--- ASSISTANT ---");
18
+ const assistantMsg = message;
19
+ for (const block of assistantMsg.content) {
20
+ if (block.type === "text") {
21
+ lines.push(block.text);
22
+ }
23
+ else if (block.type === "toolCall") {
24
+ const toolCall = block;
25
+ lines.push(`[Tool call: ${toolCall.name}(${JSON.stringify(toolCall.arguments)})]`);
26
+ }
27
+ else if (block.type === "thinking") {
28
+ // Skip thinking blocks for compression
29
+ }
30
+ }
31
+ lines.push("");
32
+ }
33
+ else if (message.role === "toolResult") {
34
+ const toolResult = message;
35
+ lines.push(`[Tool output: ${toolResult.toolName} (truncated)]`);
36
+ lines.push("");
37
+ }
38
+ }
39
+ return lines.join("\n").trim();
40
+ }
41
+ //# sourceMappingURL=fork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../src/utils/fork.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,2BAA2B,CAAC,OAA2B;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,MAAM,YAAY,GAAG,OAA2B,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,KAAiB,CAAC;oBACnC,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACrF,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACrC,uCAAuC;gBACzC,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,OAA4B,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,QAAQ,eAAe,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { homedir } from "node:os";
2
+ export function formatTokenWindow(tokens) {
3
+ if (tokens >= 1_000_000) {
4
+ const m = tokens / 1_000_000;
5
+ return `${m.toFixed(tokens % 1_000_000 === 0 ? 0 : 1)}M`;
6
+ }
7
+ if (tokens >= 1_000) {
8
+ const k = tokens / 1_000;
9
+ return `${k.toFixed(tokens % 1_000 === 0 ? 0 : 1)}k`;
10
+ }
11
+ return String(tokens);
12
+ }
13
+ export function formatAdaptiveNumber(value, minDecimals, maxDecimals) {
14
+ if (!Number.isFinite(value))
15
+ return "0";
16
+ if (value === 0)
17
+ return value.toFixed(minDecimals);
18
+ let decimals = minDecimals;
19
+ let formatted = value.toFixed(decimals);
20
+ while (decimals < maxDecimals && Number(formatted) === 0) {
21
+ decimals += 1;
22
+ formatted = value.toFixed(decimals);
23
+ }
24
+ return formatted;
25
+ }
26
+ export function formatCwd(cwd) {
27
+ const home = homedir();
28
+ if (cwd === home)
29
+ return "~";
30
+ if (cwd.startsWith(`${home}/`)) {
31
+ return `~${cwd.slice(home.length)}`;
32
+ }
33
+ return cwd;
34
+ }
35
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;QAC7B,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;QACzB,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,WAAmB,EACnB,WAAmB;IAEnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnD,IAAI,QAAQ,GAAG,WAAW,CAAC;IAC3B,IAAI,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO,QAAQ,GAAG,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,QAAQ,IAAI,CAAC,CAAC;QACd,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,48 @@
1
+ export function fuzzyMatch(query, text) {
2
+ const q = query.toLowerCase();
3
+ const t = text.toLowerCase();
4
+ if (q.length === 0)
5
+ return { matches: true, score: 0 };
6
+ if (q.length > t.length)
7
+ return { matches: false, score: 0 };
8
+ let qi = 0;
9
+ let score = 0;
10
+ let lastMatch = -1;
11
+ let consecutive = 0;
12
+ for (let i = 0; i < t.length && qi < q.length; i++) {
13
+ if (t[i] === q[qi]) {
14
+ const isBoundary = i === 0 || /[\s\-_./]/.test(t[i - 1]);
15
+ if (lastMatch === i - 1) {
16
+ consecutive++;
17
+ score -= consecutive * 5;
18
+ }
19
+ else {
20
+ consecutive = 0;
21
+ if (lastMatch >= 0) {
22
+ score += (i - lastMatch - 1) * 2;
23
+ }
24
+ }
25
+ if (isBoundary)
26
+ score -= 10;
27
+ score += i * 0.1;
28
+ lastMatch = i;
29
+ qi++;
30
+ }
31
+ }
32
+ if (qi < q.length)
33
+ return { matches: false, score: 0 };
34
+ return { matches: true, score };
35
+ }
36
+ export function fuzzyFilter(items, query, getText) {
37
+ if (!query.trim())
38
+ return items;
39
+ const scored = [];
40
+ for (const item of items) {
41
+ const match = fuzzyMatch(query, getText(item));
42
+ if (match.matches)
43
+ scored.push({ item, score: match.score });
44
+ }
45
+ scored.sort((a, b) => a.score - b.score);
46
+ return scored.map((s) => s.item);
47
+ }
48
+ //# sourceMappingURL=fuzzy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../src/utils/fuzzy.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAY;IACpD,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACvD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAE7D,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;YAE1D,IAAI,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;gBACd,KAAK,IAAI,WAAW,GAAG,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,CAAC,CAAC;gBAChB,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;oBACnB,KAAK,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,IAAI,UAAU;gBAAE,KAAK,IAAI,EAAE,CAAC;YAE5B,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC;YAEjB,SAAS,GAAG,CAAC,CAAC;YACd,EAAE,EAAE,CAAC;QACP,CAAC;IACH,CAAC;IAED,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,KAAU,EAAE,KAAa,EAAE,OAA4B;IACpF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAEhC,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { resolve } from "node:path";
3
+ export function getGitRoot(cwd) {
4
+ try {
5
+ const res = spawnSync("git", ["rev-parse", "--show-toplevel"], {
6
+ cwd,
7
+ encoding: "utf-8",
8
+ stdio: ["ignore", "pipe", "ignore"],
9
+ });
10
+ if (res.status !== 0)
11
+ return undefined;
12
+ const root = (res.stdout ?? "").trim();
13
+ if (!root)
14
+ return undefined;
15
+ return resolve(root);
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAC7D,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEvC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ export function extractAssistantText(message) {
2
+ return message.content
3
+ .filter((c) => c.type === "text")
4
+ .map((c) => c.text)
5
+ .join("\n")
6
+ .trim();
7
+ }
8
+ export function createToolResult(toolCall, text, isError) {
9
+ return {
10
+ role: "toolResult",
11
+ toolCallId: toolCall.id,
12
+ toolName: toolCall.name,
13
+ content: [{ type: "text", text }],
14
+ isError: isError,
15
+ timestamp: Date.now(),
16
+ };
17
+ }
18
+ export function createToolError(toolCall, errorMessage) {
19
+ return createToolResult(toolCall, errorMessage, true);
20
+ }
21
+ export function createToolSuccess(toolCall, text) {
22
+ return createToolResult(toolCall, text, false);
23
+ }
24
+ export function extractAllFencedCodeBlocks(text) {
25
+ // Match all triple-backtick fenced code blocks with optional language specifier
26
+ // Allows optional spaces after opening fence, any language/info string, optional trailing spaces
27
+ // on closing fence, and both LF and CRLF line endings
28
+ const codeBlockRegex = /^```[ \t]*[^\r\n]*\r?\n([\s\S]*?)\r?\n```[ \t]*$/gm;
29
+ const codeBlocks = [];
30
+ let match = codeBlockRegex.exec(text);
31
+ while (match !== null) {
32
+ codeBlocks.push(match[1] ?? "");
33
+ match = codeBlockRegex.exec(text);
34
+ }
35
+ if (codeBlocks.length === 0) {
36
+ return null;
37
+ }
38
+ // Join all code blocks with newlines
39
+ return codeBlocks.join("\n");
40
+ }
41
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/utils/messages.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,OAAO,OAAO,CAAC,OAAO;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAkB,EAClB,IAAY,EACZ,OAAgB;IAEhB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,YAAoB;IACtE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,IAAY;IAChE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,gFAAgF;IAChF,iGAAiG;IACjG,sDAAsD;IACtD,MAAM,cAAc,GAAG,oDAAoD,CAAC;IAE5E,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function assertNever(_) {
2
+ throw new Error("never reached");
3
+ }
4
+ //# sourceMappingURL=never.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"never.js","sourceRoot":"","sources":["../../src/utils/never.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,96 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { readdirSync, statSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ const DEFAULT_IGNORED_DIRS = new Set([".git", "node_modules"]);
5
+ export function listProjectFiles(cwd) {
6
+ const fromGit = listProjectFilesFromGit(cwd);
7
+ if (fromGit.length)
8
+ return fromGit;
9
+ return listProjectFilesByWalking(cwd);
10
+ }
11
+ function listProjectFilesFromGit(cwd) {
12
+ try {
13
+ const inside = spawnSync("git", ["rev-parse", "--is-inside-work-tree"], {
14
+ cwd,
15
+ encoding: "utf-8",
16
+ stdio: ["ignore", "pipe", "ignore"],
17
+ });
18
+ if (inside.status !== 0)
19
+ return [];
20
+ if ((inside.stdout ?? "").trim() !== "true")
21
+ return [];
22
+ const res = spawnSync("git", ["ls-files", "--cached", "--others", "--exclude-standard"], {
23
+ cwd,
24
+ encoding: "utf-8",
25
+ stdio: ["ignore", "pipe", "ignore"],
26
+ maxBuffer: 10 * 1024 * 1024,
27
+ });
28
+ if (res.status !== 0)
29
+ return [];
30
+ const files = (res.stdout ?? "")
31
+ .split("\n")
32
+ .map((l) => l.trim())
33
+ .filter(Boolean);
34
+ // Keep stable order and avoid duplicates.
35
+ return [...new Set(files)].sort();
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ }
41
+ function listProjectFilesByWalking(cwd) {
42
+ const out = [];
43
+ const walk = (dirAbs, dirRel) => {
44
+ try {
45
+ const entries = readdirSync(dirAbs, { withFileTypes: true, encoding: "utf8" });
46
+ for (const entry of entries) {
47
+ if (entry.name.startsWith(".")) {
48
+ // Keep hidden files out of autocomplete by default; they are rarely helpful.
49
+ // (Still allow hidden directories to be traversed if explicitly desired later.)
50
+ if (entry.isDirectory())
51
+ continue;
52
+ continue;
53
+ }
54
+ if (entry.isDirectory()) {
55
+ if (DEFAULT_IGNORED_DIRS.has(entry.name))
56
+ continue;
57
+ const nextAbs = join(dirAbs, entry.name);
58
+ const nextRel = dirRel ? join(dirRel, entry.name) : entry.name;
59
+ walk(nextAbs, nextRel);
60
+ continue;
61
+ }
62
+ // Handle symlinks that point to directories
63
+ if (entry.isSymbolicLink()) {
64
+ try {
65
+ const targetPath = join(dirAbs, entry.name);
66
+ const stat = statSync(targetPath);
67
+ if (stat.isDirectory()) {
68
+ if (DEFAULT_IGNORED_DIRS.has(entry.name))
69
+ continue;
70
+ const nextRel = dirRel ? join(dirRel, entry.name) : entry.name;
71
+ walk(targetPath, nextRel);
72
+ }
73
+ else if (stat.isFile()) {
74
+ const rel = dirRel ? join(dirRel, entry.name) : entry.name;
75
+ out.push(rel);
76
+ }
77
+ }
78
+ catch {
79
+ // Broken symlink or permission error, skip
80
+ }
81
+ continue;
82
+ }
83
+ if (entry.isFile()) {
84
+ const rel = dirRel ? join(dirRel, entry.name) : entry.name;
85
+ out.push(rel);
86
+ }
87
+ }
88
+ }
89
+ catch {
90
+ return;
91
+ }
92
+ };
93
+ walk(cwd, "");
94
+ return [...new Set(out)].sort();
95
+ }
96
+ //# sourceMappingURL=project_files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project_files.js","sourceRoot":"","sources":["../../src/utils/project_files.ts"],"names":[],"mappings":"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"}