agent-sory 1.0.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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +265 -0
  3. package/dist/commands/base.d.ts +26 -0
  4. package/dist/commands/base.d.ts.map +1 -0
  5. package/dist/commands/base.js +3 -0
  6. package/dist/commands/base.js.map +1 -0
  7. package/dist/commands/definitions/clear.d.ts +3 -0
  8. package/dist/commands/definitions/clear.d.ts.map +1 -0
  9. package/dist/commands/definitions/clear.js +12 -0
  10. package/dist/commands/definitions/clear.js.map +1 -0
  11. package/dist/commands/definitions/help.d.ts +3 -0
  12. package/dist/commands/definitions/help.d.ts.map +1 -0
  13. package/dist/commands/definitions/help.js +28 -0
  14. package/dist/commands/definitions/help.js.map +1 -0
  15. package/dist/commands/definitions/init.d.ts +3 -0
  16. package/dist/commands/definitions/init.d.ts.map +1 -0
  17. package/dist/commands/definitions/init.js +23 -0
  18. package/dist/commands/definitions/init.js.map +1 -0
  19. package/dist/commands/definitions/login.d.ts +3 -0
  20. package/dist/commands/definitions/login.d.ts.map +1 -0
  21. package/dist/commands/definitions/login.js +8 -0
  22. package/dist/commands/definitions/login.js.map +1 -0
  23. package/dist/commands/definitions/model.d.ts +3 -0
  24. package/dist/commands/definitions/model.d.ts.map +1 -0
  25. package/dist/commands/definitions/model.js +10 -0
  26. package/dist/commands/definitions/model.js.map +1 -0
  27. package/dist/commands/definitions/reasoning.d.ts +3 -0
  28. package/dist/commands/definitions/reasoning.d.ts.map +1 -0
  29. package/dist/commands/definitions/reasoning.js +21 -0
  30. package/dist/commands/definitions/reasoning.js.map +1 -0
  31. package/dist/commands/definitions/stats.d.ts +3 -0
  32. package/dist/commands/definitions/stats.d.ts.map +1 -0
  33. package/dist/commands/definitions/stats.js +22 -0
  34. package/dist/commands/definitions/stats.js.map +1 -0
  35. package/dist/commands/index.d.ts +6 -0
  36. package/dist/commands/index.d.ts.map +1 -0
  37. package/dist/commands/index.js +38 -0
  38. package/dist/commands/index.js.map +1 -0
  39. package/dist/core/agent.d.ts +41 -0
  40. package/dist/core/agent.d.ts.map +1 -0
  41. package/dist/core/agent.js +266 -0
  42. package/dist/core/agent.js.map +1 -0
  43. package/dist/core/cli.d.ts +3 -0
  44. package/dist/core/cli.d.ts.map +1 -0
  45. package/dist/core/cli.js +48 -0
  46. package/dist/core/cli.js.map +1 -0
  47. package/dist/core/llm/factory.d.ts +12 -0
  48. package/dist/core/llm/factory.d.ts.map +1 -0
  49. package/dist/core/llm/factory.js +44 -0
  50. package/dist/core/llm/factory.js.map +1 -0
  51. package/dist/core/llm/providers/gemini.d.ts +22 -0
  52. package/dist/core/llm/providers/gemini.d.ts.map +1 -0
  53. package/dist/core/llm/providers/gemini.js +167 -0
  54. package/dist/core/llm/providers/gemini.js.map +1 -0
  55. package/dist/core/llm/providers/groq.d.ts +23 -0
  56. package/dist/core/llm/providers/groq.d.ts.map +1 -0
  57. package/dist/core/llm/providers/groq.js +96 -0
  58. package/dist/core/llm/providers/groq.js.map +1 -0
  59. package/dist/core/llm/providers/openai-compatible.d.ts +24 -0
  60. package/dist/core/llm/providers/openai-compatible.d.ts.map +1 -0
  61. package/dist/core/llm/providers/openai-compatible.js +86 -0
  62. package/dist/core/llm/providers/openai-compatible.js.map +1 -0
  63. package/dist/core/llm/types.d.ts +37 -0
  64. package/dist/core/llm/types.d.ts.map +1 -0
  65. package/dist/core/llm/types.js +2 -0
  66. package/dist/core/llm/types.js.map +1 -0
  67. package/dist/core/prompts/system.d.ts +6 -0
  68. package/dist/core/prompts/system.d.ts.map +1 -0
  69. package/dist/core/prompts/system.js +36 -0
  70. package/dist/core/prompts/system.js.map +1 -0
  71. package/dist/tests/proxy-config.test.d.ts +2 -0
  72. package/dist/tests/proxy-config.test.d.ts.map +1 -0
  73. package/dist/tests/proxy-config.test.js +169 -0
  74. package/dist/tests/proxy-config.test.js.map +1 -0
  75. package/dist/tools/tool-schemas.d.ts +36 -0
  76. package/dist/tools/tool-schemas.d.ts.map +1 -0
  77. package/dist/tools/tool-schemas.js +482 -0
  78. package/dist/tools/tool-schemas.js.map +1 -0
  79. package/dist/tools/tools.d.ts +114 -0
  80. package/dist/tools/tools.d.ts.map +1 -0
  81. package/dist/tools/tools.js +1015 -0
  82. package/dist/tools/tools.js.map +1 -0
  83. package/dist/tools/utils/edit-logic.d.ts +9 -0
  84. package/dist/tools/utils/edit-logic.d.ts.map +1 -0
  85. package/dist/tools/utils/edit-logic.js +149 -0
  86. package/dist/tools/utils/edit-logic.js.map +1 -0
  87. package/dist/tools/utils/ripgrep-runner.d.ts +15 -0
  88. package/dist/tools/utils/ripgrep-runner.d.ts.map +1 -0
  89. package/dist/tools/utils/ripgrep-runner.js +90 -0
  90. package/dist/tools/utils/ripgrep-runner.js.map +1 -0
  91. package/dist/tools/validators.d.ts +4 -0
  92. package/dist/tools/validators.d.ts.map +1 -0
  93. package/dist/tools/validators.js +18 -0
  94. package/dist/tools/validators.js.map +1 -0
  95. package/dist/ui/App.d.ts +7 -0
  96. package/dist/ui/App.d.ts.map +1 -0
  97. package/dist/ui/App.js +12 -0
  98. package/dist/ui/App.js.map +1 -0
  99. package/dist/ui/components/core/Chat.d.ts +7 -0
  100. package/dist/ui/components/core/Chat.d.ts.map +1 -0
  101. package/dist/ui/components/core/Chat.js +60 -0
  102. package/dist/ui/components/core/Chat.js.map +1 -0
  103. package/dist/ui/components/core/MessageHistory.d.ts +7 -0
  104. package/dist/ui/components/core/MessageHistory.d.ts.map +1 -0
  105. package/dist/ui/components/core/MessageHistory.js +39 -0
  106. package/dist/ui/components/core/MessageHistory.js.map +1 -0
  107. package/dist/ui/components/core/MessageInput.d.ts +10 -0
  108. package/dist/ui/components/core/MessageInput.d.ts.map +1 -0
  109. package/dist/ui/components/core/MessageInput.js +130 -0
  110. package/dist/ui/components/core/MessageInput.js.map +1 -0
  111. package/dist/ui/components/display/DiffPreview.d.ts +15 -0
  112. package/dist/ui/components/display/DiffPreview.d.ts.map +1 -0
  113. package/dist/ui/components/display/DiffPreview.js +298 -0
  114. package/dist/ui/components/display/DiffPreview.js.map +1 -0
  115. package/dist/ui/components/display/Stats.d.ts +19 -0
  116. package/dist/ui/components/display/Stats.d.ts.map +1 -0
  117. package/dist/ui/components/display/Stats.js +31 -0
  118. package/dist/ui/components/display/Stats.js.map +1 -0
  119. package/dist/ui/components/display/TokenMetrics.d.ts +11 -0
  120. package/dist/ui/components/display/TokenMetrics.d.ts.map +1 -0
  121. package/dist/ui/components/display/TokenMetrics.js +16 -0
  122. package/dist/ui/components/display/TokenMetrics.js.map +1 -0
  123. package/dist/ui/components/display/ToolHistoryItem.d.ts +7 -0
  124. package/dist/ui/components/display/ToolHistoryItem.d.ts.map +1 -0
  125. package/dist/ui/components/display/ToolHistoryItem.js +102 -0
  126. package/dist/ui/components/display/ToolHistoryItem.js.map +1 -0
  127. package/dist/ui/components/input-overlays/ErrorRetry.d.ts +8 -0
  128. package/dist/ui/components/input-overlays/ErrorRetry.d.ts.map +1 -0
  129. package/dist/ui/components/input-overlays/ErrorRetry.js +6 -0
  130. package/dist/ui/components/input-overlays/ErrorRetry.js.map +1 -0
  131. package/dist/ui/components/input-overlays/Login.d.ts +7 -0
  132. package/dist/ui/components/input-overlays/Login.d.ts.map +1 -0
  133. package/dist/ui/components/input-overlays/Login.js +32 -0
  134. package/dist/ui/components/input-overlays/Login.js.map +1 -0
  135. package/dist/ui/components/input-overlays/MaxIterationsContinue.d.ts +8 -0
  136. package/dist/ui/components/input-overlays/MaxIterationsContinue.d.ts.map +1 -0
  137. package/dist/ui/components/input-overlays/MaxIterationsContinue.js +32 -0
  138. package/dist/ui/components/input-overlays/MaxIterationsContinue.js.map +1 -0
  139. package/dist/ui/components/input-overlays/ModelSelector.d.ts +12 -0
  140. package/dist/ui/components/input-overlays/ModelSelector.d.ts.map +1 -0
  141. package/dist/ui/components/input-overlays/ModelSelector.js +114 -0
  142. package/dist/ui/components/input-overlays/ModelSelector.js.map +1 -0
  143. package/dist/ui/components/input-overlays/PendingToolApproval.d.ts +10 -0
  144. package/dist/ui/components/input-overlays/PendingToolApproval.d.ts.map +1 -0
  145. package/dist/ui/components/input-overlays/PendingToolApproval.js +51 -0
  146. package/dist/ui/components/input-overlays/PendingToolApproval.js.map +1 -0
  147. package/dist/ui/components/input-overlays/SlashCommandSuggestions.d.ts +8 -0
  148. package/dist/ui/components/input-overlays/SlashCommandSuggestions.d.ts.map +1 -0
  149. package/dist/ui/components/input-overlays/SlashCommandSuggestions.js +13 -0
  150. package/dist/ui/components/input-overlays/SlashCommandSuggestions.js.map +1 -0
  151. package/dist/ui/hooks/useAgent.d.ts +41 -0
  152. package/dist/ui/hooks/useAgent.d.ts.map +1 -0
  153. package/dist/ui/hooks/useAgent.js +205 -0
  154. package/dist/ui/hooks/useAgent.js.map +1 -0
  155. package/dist/ui/hooks/useMouseScroll.d.ts +3 -0
  156. package/dist/ui/hooks/useMouseScroll.d.ts.map +1 -0
  157. package/dist/ui/hooks/useMouseScroll.js +32 -0
  158. package/dist/ui/hooks/useMouseScroll.js.map +1 -0
  159. package/dist/ui/hooks/useSessionStats.d.ts +20 -0
  160. package/dist/ui/hooks/useSessionStats.d.ts.map +1 -0
  161. package/dist/ui/hooks/useSessionStats.js +36 -0
  162. package/dist/ui/hooks/useSessionStats.js.map +1 -0
  163. package/dist/ui/hooks/useTokenMetrics.d.ts +21 -0
  164. package/dist/ui/hooks/useTokenMetrics.d.ts.map +1 -0
  165. package/dist/ui/hooks/useTokenMetrics.js +102 -0
  166. package/dist/ui/hooks/useTokenMetrics.js.map +1 -0
  167. package/dist/ui/utils/CodeColorizer.d.ts +5 -0
  168. package/dist/ui/utils/CodeColorizer.d.ts.map +1 -0
  169. package/dist/ui/utils/CodeColorizer.js +47 -0
  170. package/dist/ui/utils/CodeColorizer.js.map +1 -0
  171. package/dist/utils/constants.d.ts +8 -0
  172. package/dist/utils/constants.d.ts.map +1 -0
  173. package/dist/utils/constants.js +104 -0
  174. package/dist/utils/constants.js.map +1 -0
  175. package/dist/utils/context.d.ts +36 -0
  176. package/dist/utils/context.d.ts.map +1 -0
  177. package/dist/utils/context.js +239 -0
  178. package/dist/utils/context.js.map +1 -0
  179. package/dist/utils/file-ops.d.ts +21 -0
  180. package/dist/utils/file-ops.d.ts.map +1 -0
  181. package/dist/utils/file-ops.js +125 -0
  182. package/dist/utils/file-ops.js.map +1 -0
  183. package/dist/utils/local-settings.d.ts +18 -0
  184. package/dist/utils/local-settings.d.ts.map +1 -0
  185. package/dist/utils/local-settings.js +176 -0
  186. package/dist/utils/local-settings.js.map +1 -0
  187. package/dist/utils/markdown.d.ts +13 -0
  188. package/dist/utils/markdown.d.ts.map +1 -0
  189. package/dist/utils/markdown.js +122 -0
  190. package/dist/utils/markdown.js.map +1 -0
  191. package/dist/utils/proxy-config.d.ts +25 -0
  192. package/dist/utils/proxy-config.d.ts.map +1 -0
  193. package/dist/utils/proxy-config.js +145 -0
  194. package/dist/utils/proxy-config.js.map +1 -0
  195. package/package.json +76 -0
@@ -0,0 +1,36 @@
1
+ export interface ProjectContextJson {
2
+ generated_at: string;
3
+ root: string;
4
+ summary: {
5
+ total_files: number;
6
+ total_directories: number;
7
+ languages: Array<{
8
+ extension: string;
9
+ files: number;
10
+ }>;
11
+ };
12
+ package?: {
13
+ name?: string;
14
+ version?: string;
15
+ description?: string;
16
+ scripts?: string[];
17
+ dependencies_count?: number;
18
+ dev_dependencies_count?: number;
19
+ };
20
+ config_files: string[];
21
+ notable_files: string[];
22
+ tree: string[];
23
+ }
24
+ export interface GenerateContextOptions {
25
+ maxDepth?: number;
26
+ maxEntries?: number;
27
+ }
28
+ export declare function generateProjectContext(rootDir?: string, options?: GenerateContextOptions): {
29
+ json: ProjectContextJson;
30
+ markdown: string;
31
+ };
32
+ export declare function writeProjectContext(rootDir?: string, options?: GenerateContextOptions): {
33
+ mdPath: string;
34
+ jsonPath: string;
35
+ };
36
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/utils/context.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxD,CAAC;IACF,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAsB,EAAE,OAAO,GAAE,sBAA2B,GAAG;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAmD5J;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAsB,EAAE,OAAO,GAAE,sBAA2B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAa/I"}
@@ -0,0 +1,239 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { shouldIgnore } from './file-ops.js';
4
+ const DEFAULT_OPTIONS = {
5
+ maxDepth: 3,
6
+ maxEntries: 1500,
7
+ };
8
+ export function generateProjectContext(rootDir = process.cwd(), options = {}) {
9
+ const opts = { ...DEFAULT_OPTIONS, ...options };
10
+ const root = path.resolve(rootDir);
11
+ // Validate root directory exists and is accessible
12
+ let rootStat;
13
+ try {
14
+ rootStat = fs.statSync(root);
15
+ }
16
+ catch {
17
+ throw new Error(`Root directory does not exist or is not accessible: ${root}`);
18
+ }
19
+ if (!rootStat.isDirectory()) {
20
+ throw new Error(`Root path is not a directory: ${root}`);
21
+ }
22
+ const stats = walkDirectory(root, opts.maxDepth, opts.maxEntries);
23
+ const languages = Object.entries(stats.extensionCounts)
24
+ .sort((a, b) => b[1] - a[1])
25
+ .map(([ext, count]) => ({ extension: ext || '(none)', files: count }));
26
+ const pkg = readPackageJson(root);
27
+ const configFiles = stats.allFiles
28
+ .filter(fp => isConfigFile(fp))
29
+ .map(fp => path.relative(root, fp))
30
+ .sort();
31
+ const notableFiles = stats.allFiles
32
+ .filter(fp => isNotableFile(fp))
33
+ .map(fp => path.relative(root, fp))
34
+ .sort();
35
+ const treeLines = renderTree(stats.treeNodes);
36
+ const json = {
37
+ generated_at: new Date().toISOString(),
38
+ root,
39
+ summary: {
40
+ total_files: stats.fileCount,
41
+ total_directories: stats.dirCount,
42
+ languages,
43
+ },
44
+ package: pkg || undefined,
45
+ config_files: configFiles,
46
+ notable_files: notableFiles,
47
+ tree: treeLines,
48
+ };
49
+ const markdown = buildMarkdown(json);
50
+ return { json, markdown };
51
+ }
52
+ export function writeProjectContext(rootDir = process.cwd(), options = {}) {
53
+ const { json, markdown } = generateProjectContext(rootDir, options);
54
+ const outputDir = path.join(rootDir, '.sory');
55
+ fs.mkdirSync(outputDir, { recursive: true });
56
+ const mdPath = path.join(outputDir, 'context.md');
57
+ const jsonPath = path.join(outputDir, 'context.json');
58
+ fs.writeFileSync(mdPath, markdown, 'utf-8');
59
+ fs.writeFileSync(jsonPath, JSON.stringify(json, null, 2), 'utf-8');
60
+ return { mdPath, jsonPath };
61
+ }
62
+ function readPackageJson(rootDir) {
63
+ const pkgPath = path.join(rootDir, 'package.json');
64
+ try {
65
+ if (!fs.existsSync(pkgPath))
66
+ return null;
67
+ const raw = fs.readFileSync(pkgPath, 'utf-8');
68
+ const pkg = JSON.parse(raw);
69
+ return {
70
+ name: pkg.name,
71
+ version: pkg.version,
72
+ description: pkg.description,
73
+ scripts: pkg.scripts ? Object.keys(pkg.scripts) : [],
74
+ dependencies_count: pkg.dependencies ? Object.keys(pkg.dependencies).length : 0,
75
+ dev_dependencies_count: pkg.devDependencies ? Object.keys(pkg.devDependencies).length : 0,
76
+ };
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ function isConfigFile(filePath) {
83
+ const base = path.basename(filePath).toLowerCase();
84
+ const configNames = new Set([
85
+ 'package.json', 'tsconfig.json', 'jsconfig.json', 'pyproject.toml', 'poetry.lock', 'requirements.txt',
86
+ 'go.mod', 'go.sum', 'cargo.toml', 'cargo.lock', 'composer.json', 'composer.lock', 'gemfile', 'gemfile.lock',
87
+ 'pipfile', 'pipfile.lock', 'dockerfile', 'docker-compose.yml', '.dockerignore', '.gitignore', '.env', '.editorconfig',
88
+ '.eslintrc', '.eslintrc.js', '.prettierrc', '.prettierrc.js', 'makefile', 'justfile',
89
+ ]);
90
+ return configNames.has(base);
91
+ }
92
+ function isNotableFile(filePath) {
93
+ const base = path.basename(filePath).toLowerCase();
94
+ return base.startsWith('readme') || base === 'license' || base === 'license.md' || base.endsWith('.md');
95
+ }
96
+ function walkDirectory(root, maxDepth, maxEntries) {
97
+ let fileCount = 0;
98
+ let dirCount = 0;
99
+ let totalEntries = 0;
100
+ const extensionCounts = {};
101
+ const allFiles = [];
102
+ function isDirectorySafe(p) {
103
+ try {
104
+ return fs.statSync(p).isDirectory();
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ }
110
+ function walk(current, depth) {
111
+ if (depth > maxDepth)
112
+ return null;
113
+ if (totalEntries >= maxEntries)
114
+ return null;
115
+ const name = path.basename(current);
116
+ let isDir = false;
117
+ try {
118
+ const stat = fs.statSync(current);
119
+ isDir = stat.isDirectory();
120
+ }
121
+ catch {
122
+ // File might have been deleted or is inaccessible
123
+ return null;
124
+ }
125
+ if (depth === 0 && shouldIgnore(current)) {
126
+ // Do not ignore the root itself; only skip if ignore would exclude it intentionally.
127
+ }
128
+ if (depth > 0 && shouldIgnore(current)) {
129
+ return null;
130
+ }
131
+ const node = { name, path: current, isDir, children: [] };
132
+ totalEntries++;
133
+ if (isDir) {
134
+ dirCount++;
135
+ let entries = [];
136
+ try {
137
+ entries = fs.readdirSync(current).map(e => path.join(current, e));
138
+ }
139
+ catch {
140
+ entries = [];
141
+ }
142
+ // Sort: dirs first then files alphabetically
143
+ entries.sort((a, b) => {
144
+ const aDir = isDirectorySafe(a);
145
+ const bDir = isDirectorySafe(b);
146
+ if (aDir !== bDir)
147
+ return aDir ? -1 : 1;
148
+ return path.basename(a).toLowerCase().localeCompare(path.basename(b).toLowerCase());
149
+ });
150
+ for (const entry of entries) {
151
+ if (totalEntries >= maxEntries)
152
+ break;
153
+ const child = walk(entry, depth + 1);
154
+ if (child)
155
+ node.children.push(child);
156
+ }
157
+ }
158
+ else {
159
+ fileCount++;
160
+ allFiles.push(current);
161
+ const ext = path.extname(name).replace(/^\./, '');
162
+ extensionCounts[ext] = (extensionCounts[ext] || 0) + 1;
163
+ }
164
+ return node;
165
+ }
166
+ const rootEntries = fs.readdirSync(root).map(e => path.join(root, e));
167
+ const nodes = [];
168
+ for (const entry of rootEntries) {
169
+ if (totalEntries >= maxEntries)
170
+ break;
171
+ const child = walk(entry, 1);
172
+ if (child)
173
+ nodes.push(child);
174
+ }
175
+ return { treeNodes: nodes, fileCount, dirCount, extensionCounts, allFiles };
176
+ }
177
+ function renderTree(nodes) {
178
+ const lines = [];
179
+ function render(node, prefix, isLast) {
180
+ const connector = prefix ? (isLast ? '└── ' : '├── ') : '';
181
+ const name = node.isDir ? `${node.name}/` : node.name;
182
+ lines.push(`${prefix}${connector}${name}`);
183
+ const childPrefix = prefix + (prefix ? (isLast ? ' ' : '│ ') : '');
184
+ node.children.forEach((child, index) => {
185
+ const last = index === node.children.length - 1;
186
+ render(child, childPrefix, last);
187
+ });
188
+ }
189
+ nodes.forEach((n, idx) => render(n, '', idx === nodes.length - 1));
190
+ return lines;
191
+ }
192
+ function buildMarkdown(ctx) {
193
+ const lines = [];
194
+ lines.push(`# Project Context`);
195
+ lines.push('');
196
+ lines.push(`Generated: ${ctx.generated_at}`);
197
+ lines.push('');
198
+ lines.push(`Root: ${ctx.root}`);
199
+ lines.push('');
200
+ lines.push('## Summary');
201
+ lines.push(`- Files: ${ctx.summary.total_files}`);
202
+ lines.push(`- Directories: ${ctx.summary.total_directories}`);
203
+ if (ctx.package) {
204
+ lines.push(`- Package: ${ctx.package.name || ''} ${ctx.package.version ? `v${ctx.package.version}` : ''}`.trim());
205
+ if (ctx.package.description)
206
+ lines.push(`- Description: ${ctx.package.description}`);
207
+ lines.push(`- Scripts: ${ctx.package.scripts?.length || 0}`);
208
+ lines.push(`- Dependencies: ${ctx.package.dependencies_count || 0}`);
209
+ lines.push(`- Dev Dependencies: ${ctx.package.dev_dependencies_count || 0}`);
210
+ }
211
+ lines.push('');
212
+ lines.push('## Languages (by file count)');
213
+ const langLines = ctx.summary.languages.slice(0, 12).map(l => l.extension === '(none)'
214
+ ? `- ${l.extension}: ${l.files}`
215
+ : `- .${l.extension}: ${l.files}`);
216
+ lines.push(...(langLines.length ? langLines : ['- (no code files detected)']));
217
+ if (ctx.config_files.length) {
218
+ lines.push('');
219
+ lines.push('## Configuration Files');
220
+ ctx.config_files.forEach(f => lines.push(`- ${f}`));
221
+ }
222
+ if (ctx.notable_files.length) {
223
+ lines.push('');
224
+ lines.push('## Notable Files');
225
+ ctx.notable_files.forEach(f => lines.push(`- ${f}`));
226
+ }
227
+ if (ctx.tree.length) {
228
+ lines.push('');
229
+ lines.push('## Directory Tree');
230
+ lines.push('```');
231
+ ctx.tree.forEach(l => lines.push(l));
232
+ lines.push('```');
233
+ }
234
+ lines.push('');
235
+ lines.push('---');
236
+ lines.push('This file is auto-generated. Re-run the init command to refresh.');
237
+ return lines.join('\n');
238
+ }
239
+ //# 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,21 @@
1
+ /**
2
+ * Write content to a file with safety checks
3
+ */
4
+ export declare function writeFile(filepath: string, content: string, force?: boolean, backup?: boolean): Promise<boolean>;
5
+ /**
6
+ * Create a directory with parent directories
7
+ */
8
+ export declare function createDirectory(directoryPath: string): Promise<boolean>;
9
+ /**
10
+ * Delete a file with safety checks
11
+ */
12
+ export declare function deleteFile(filepath: string, force?: boolean): Promise<boolean>;
13
+ /**
14
+ * Simple tree display for list_files tool
15
+ */
16
+ export declare function displayTree(directory?: string, pattern?: string, recursive?: boolean, showHidden?: boolean): Promise<string>;
17
+ /**
18
+ * Check if a file or directory should be ignored
19
+ */
20
+ export declare function shouldIgnore(filePath: string): boolean;
21
+ //# sourceMappingURL=file-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ops.d.ts","sourceRoot":"","sources":["../../src/utils/file-ops.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAapI;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAsB3F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,GAAE,MAAY,EACvB,OAAO,GAAE,MAAY,EACrB,SAAS,GAAE,OAAe,EAC1B,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAGD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CA2BtD"}
@@ -0,0 +1,125 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { IGNORE_PATTERNS } from './constants.js';
4
+ /**
5
+ * Write content to a file with safety checks
6
+ */
7
+ export async function writeFile(filepath, content, force = false, backup = false) {
8
+ const filePath = path.resolve(filepath);
9
+ try {
10
+ // Create parent directories if they don't exist
11
+ const parentDir = path.dirname(filePath);
12
+ await fs.promises.mkdir(parentDir, { recursive: true });
13
+ await fs.promises.writeFile(filePath, content, 'utf-8');
14
+ return true;
15
+ }
16
+ catch (error) {
17
+ return false;
18
+ }
19
+ }
20
+ /**
21
+ * Create a directory with parent directories
22
+ */
23
+ export async function createDirectory(directoryPath) {
24
+ try {
25
+ await fs.promises.mkdir(directoryPath, { recursive: true });
26
+ return true;
27
+ }
28
+ catch (error) {
29
+ return false;
30
+ }
31
+ }
32
+ /**
33
+ * Delete a file with safety checks
34
+ */
35
+ export async function deleteFile(filepath, force = false) {
36
+ const filePath = path.resolve(filepath);
37
+ try {
38
+ const stats = await fs.promises.stat(filePath);
39
+ if (!force) {
40
+ return false;
41
+ }
42
+ if (stats.isFile()) {
43
+ await fs.promises.unlink(filePath);
44
+ }
45
+ else if (stats.isDirectory()) {
46
+ await fs.promises.rmdir(filePath, { recursive: true });
47
+ }
48
+ return true;
49
+ }
50
+ catch (error) {
51
+ if (error.code === 'ENOENT') {
52
+ return false;
53
+ }
54
+ return false;
55
+ }
56
+ }
57
+ /**
58
+ * Simple tree display for list_files tool
59
+ */
60
+ export async function displayTree(directory = '.', pattern = '*', recursive = false, showHidden = false) {
61
+ const directoryPath = path.resolve(directory);
62
+ try {
63
+ const exists = await fs.promises.access(directoryPath).then(() => true).catch(() => false);
64
+ if (!exists) {
65
+ return `Directory not found: ${directory}`;
66
+ }
67
+ const items = await fs.promises.readdir(directoryPath, { withFileTypes: true });
68
+ const validItems = items
69
+ .filter(item => !shouldIgnore(path.join(directoryPath, item.name)))
70
+ .filter(item => showHidden || !item.name.startsWith('.'))
71
+ .sort((a, b) => {
72
+ // Directories first, then alphabetical
73
+ if (a.isDirectory() && !b.isDirectory())
74
+ return -1;
75
+ if (!a.isDirectory() && b.isDirectory())
76
+ return 1;
77
+ return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
78
+ });
79
+ let output = `${path.basename(directoryPath)}/\n`;
80
+ validItems.forEach((item, index) => {
81
+ const isLast = index === validItems.length - 1;
82
+ const prefix = isLast ? '└── ' : '├── ';
83
+ if (item.isDirectory()) {
84
+ output += `${prefix}${item.name}/\n`;
85
+ }
86
+ else {
87
+ output += `${prefix}${item.name}\n`;
88
+ }
89
+ });
90
+ return output.trim();
91
+ }
92
+ catch (error) {
93
+ return `Error reading directory: ${error}`;
94
+ }
95
+ }
96
+ /**
97
+ * Check if a file or directory should be ignored
98
+ */
99
+ export function shouldIgnore(filePath) {
100
+ const pathStr = path.resolve(filePath);
101
+ const name = path.basename(pathStr);
102
+ // Check ignore patterns
103
+ for (const pattern of IGNORE_PATTERNS) {
104
+ if (pattern.includes('*')) {
105
+ // Simple glob matching, convert * to regex
106
+ const regexPattern = pattern.replace(/\*/g, '.*');
107
+ const regex = new RegExp(regexPattern);
108
+ if (regex.test(name)) {
109
+ return true;
110
+ }
111
+ }
112
+ else {
113
+ if (pathStr.includes(pattern) || name === pattern) {
114
+ return true;
115
+ }
116
+ }
117
+ }
118
+ // Ignore hidden files and directories (starting with .)
119
+ const allowedHiddenFiles = new Set(['.env', '.gitignore', '.dockerfile']);
120
+ if (name.startsWith('.') && !allowedHiddenFiles.has(name)) {
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ //# sourceMappingURL=file-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ops.js","sourceRoot":"","sources":["../../src/utils/file-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare class ConfigManager {
2
+ private configPath;
3
+ constructor();
4
+ private ensureConfigDir;
5
+ private readConfig;
6
+ private writeConfig;
7
+ getActiveProvider(): string;
8
+ setActiveProvider(provider: string): void;
9
+ getApiKey(provider?: string): string | null;
10
+ setApiKey(apiKey: string, provider?: string): void;
11
+ clearApiKey(provider?: string): void;
12
+ getDefaultModel(provider?: string): string | null;
13
+ setDefaultModel(model: string, provider?: string): void;
14
+ getProxy(): string | null;
15
+ setProxy(proxy: string): void;
16
+ clearProxy(): void;
17
+ }
18
+ //# sourceMappingURL=local-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-settings.d.ts","sourceRoot":"","sources":["../../src/utils/local-settings.ts"],"names":[],"mappings":"AAgBA,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;;IAO3B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IAYZ,iBAAiB,IAAI,MAAM;IAK3B,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMzC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAY3C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAmClD,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBpC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBjD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBvD,QAAQ,IAAI,MAAM,GAAG,IAAI;IAKzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAqB7B,UAAU,IAAI,IAAI;CAS1B"}
@@ -0,0 +1,176 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const CONFIG_DIR = '.sory'; // In home directory
5
+ const CONFIG_FILE = 'local-settings.json';
6
+ export class ConfigManager {
7
+ configPath;
8
+ constructor() {
9
+ const homeDir = os.homedir();
10
+ this.configPath = path.join(homeDir, CONFIG_DIR, CONFIG_FILE);
11
+ }
12
+ ensureConfigDir() {
13
+ const configDir = path.dirname(this.configPath);
14
+ if (!fs.existsSync(configDir)) {
15
+ fs.mkdirSync(configDir, { recursive: true });
16
+ }
17
+ }
18
+ readConfig() {
19
+ try {
20
+ if (!fs.existsSync(this.configPath)) {
21
+ return {};
22
+ }
23
+ const configData = fs.readFileSync(this.configPath, 'utf8');
24
+ return JSON.parse(configData);
25
+ }
26
+ catch (error) {
27
+ console.warn('Failed to read config file:', error);
28
+ return {};
29
+ }
30
+ }
31
+ writeConfig(config) {
32
+ this.ensureConfigDir();
33
+ fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2), {
34
+ mode: 0o600 // Read/write for owner only
35
+ });
36
+ try {
37
+ fs.chmodSync(this.configPath, 0o600);
38
+ }
39
+ catch {
40
+ // noop
41
+ }
42
+ }
43
+ getActiveProvider() {
44
+ const config = this.readConfig();
45
+ return config.activeProvider || 'groq';
46
+ }
47
+ setActiveProvider(provider) {
48
+ const config = this.readConfig();
49
+ config.activeProvider = provider;
50
+ this.writeConfig(config);
51
+ }
52
+ getApiKey(provider) {
53
+ const config = this.readConfig();
54
+ const active = provider || config.activeProvider || 'groq';
55
+ // Legacy support for Groq
56
+ if (active === 'groq' && config.groqApiKey) {
57
+ return config.groqApiKey;
58
+ }
59
+ return config.apiKeys?.[active] || null;
60
+ }
61
+ setApiKey(apiKey, provider) {
62
+ try {
63
+ const config = this.readConfig();
64
+ // Auto-detect provider if not specified
65
+ let targetProvider = provider;
66
+ if (!targetProvider) {
67
+ const key = apiKey.trim();
68
+ if (key.startsWith('gsk_'))
69
+ targetProvider = 'groq';
70
+ else if (key.startsWith('sk-or-'))
71
+ targetProvider = 'openrouter';
72
+ else if (key.startsWith('sk-proj-') || key.startsWith('sk-'))
73
+ targetProvider = 'openai'; // Basic generic check
74
+ else
75
+ targetProvider = config.activeProvider || 'groq';
76
+ }
77
+ // Initialize apiKeys object if missing
78
+ if (!config.apiKeys)
79
+ config.apiKeys = {};
80
+ config.apiKeys[targetProvider] = apiKey;
81
+ // Also update legacy field for backward compatibility tools relying on it
82
+ if (targetProvider === 'groq') {
83
+ config.groqApiKey = apiKey;
84
+ }
85
+ // Auto-switch active provider if we just set a new key
86
+ if (!provider) { // Only if auto-detected/default
87
+ config.activeProvider = targetProvider;
88
+ }
89
+ this.writeConfig(config);
90
+ }
91
+ catch (error) {
92
+ throw new Error(`Failed to save API key: ${error}`);
93
+ }
94
+ }
95
+ clearApiKey(provider) {
96
+ try {
97
+ const config = this.readConfig();
98
+ const target = provider || config.activeProvider || 'groq';
99
+ if (config.apiKeys && config.apiKeys[target]) {
100
+ delete config.apiKeys[target];
101
+ }
102
+ if (target === 'groq') {
103
+ delete config.groqApiKey;
104
+ }
105
+ this.writeConfig(config);
106
+ }
107
+ catch (error) {
108
+ console.warn('Failed to clear API key:', error);
109
+ }
110
+ }
111
+ getDefaultModel(provider) {
112
+ const config = this.readConfig();
113
+ const active = provider || config.activeProvider || 'groq';
114
+ // Check specific provider model
115
+ if (config.providerModels && config.providerModels[active]) {
116
+ return config.providerModels[active];
117
+ }
118
+ // Fallback to legacy global default if Groq
119
+ if (active === 'groq') {
120
+ return config.defaultModel || null;
121
+ }
122
+ return null;
123
+ }
124
+ setDefaultModel(model, provider) {
125
+ try {
126
+ const config = this.readConfig();
127
+ const target = provider || config.activeProvider || 'groq';
128
+ if (!config.providerModels)
129
+ config.providerModels = {};
130
+ config.providerModels[target] = model;
131
+ // Legacy sync
132
+ if (target === 'groq') {
133
+ config.defaultModel = model;
134
+ }
135
+ this.writeConfig(config);
136
+ }
137
+ catch (error) {
138
+ throw new Error(`Failed to save default model: ${error}`);
139
+ }
140
+ }
141
+ getProxy() {
142
+ const config = this.readConfig();
143
+ return config.groqProxy || null;
144
+ }
145
+ setProxy(proxy) {
146
+ try {
147
+ const trimmed = proxy?.trim?.() ?? '';
148
+ if (!trimmed) {
149
+ throw new Error('Proxy must be a non-empty string');
150
+ }
151
+ try {
152
+ new URL(trimmed);
153
+ }
154
+ catch {
155
+ throw new Error(`Invalid proxy URL: ${trimmed}`);
156
+ }
157
+ const config = this.readConfig();
158
+ config.groqProxy = trimmed;
159
+ this.writeConfig(config);
160
+ }
161
+ catch (error) {
162
+ throw new Error(`Failed to save proxy: ${error instanceof Error ? error.message : String(error)}`);
163
+ }
164
+ }
165
+ clearProxy() {
166
+ try {
167
+ const config = this.readConfig();
168
+ delete config.groqProxy;
169
+ this.writeConfig(config);
170
+ }
171
+ catch (error) {
172
+ console.warn('Failed to clear proxy:', error);
173
+ }
174
+ }
175
+ }
176
+ //# sourceMappingURL=local-settings.js.map