cray-code 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 (252) hide show
  1. package/README.md +316 -0
  2. package/dist/Tool.d.ts +217 -0
  3. package/dist/Tool.d.ts.map +1 -0
  4. package/dist/Tool.js +89 -0
  5. package/dist/Tool.js.map +1 -0
  6. package/dist/branding/logo.d.ts +8 -0
  7. package/dist/branding/logo.d.ts.map +1 -0
  8. package/dist/branding/logo.js +26 -0
  9. package/dist/branding/logo.js.map +1 -0
  10. package/dist/branding/theme.d.ts +27 -0
  11. package/dist/branding/theme.d.ts.map +1 -0
  12. package/dist/branding/theme.js +28 -0
  13. package/dist/branding/theme.js.map +1 -0
  14. package/dist/commands/registry.d.ts +32 -0
  15. package/dist/commands/registry.d.ts.map +1 -0
  16. package/dist/commands/registry.js +759 -0
  17. package/dist/commands/registry.js.map +1 -0
  18. package/dist/components/MessageView.d.ts +12 -0
  19. package/dist/components/MessageView.d.ts.map +1 -0
  20. package/dist/components/MessageView.js +35 -0
  21. package/dist/components/MessageView.js.map +1 -0
  22. package/dist/components/PermissionPrompt.d.ts +11 -0
  23. package/dist/components/PermissionPrompt.d.ts.map +1 -0
  24. package/dist/components/PermissionPrompt.js +6 -0
  25. package/dist/components/PermissionPrompt.js.map +1 -0
  26. package/dist/components/PluginManager.d.ts +27 -0
  27. package/dist/components/PluginManager.d.ts.map +1 -0
  28. package/dist/components/PluginManager.js +391 -0
  29. package/dist/components/PluginManager.js.map +1 -0
  30. package/dist/components/ThinkingBlock.d.ts +27 -0
  31. package/dist/components/ThinkingBlock.d.ts.map +1 -0
  32. package/dist/components/ThinkingBlock.js +29 -0
  33. package/dist/components/ThinkingBlock.js.map +1 -0
  34. package/dist/components/ToolCallBlock.d.ts +14 -0
  35. package/dist/components/ToolCallBlock.d.ts.map +1 -0
  36. package/dist/components/ToolCallBlock.js +83 -0
  37. package/dist/components/ToolCallBlock.js.map +1 -0
  38. package/dist/components/TrustDialog.d.ts +20 -0
  39. package/dist/components/TrustDialog.d.ts.map +1 -0
  40. package/dist/components/TrustDialog.js +80 -0
  41. package/dist/components/TrustDialog.js.map +1 -0
  42. package/dist/context.d.ts +25 -0
  43. package/dist/context.d.ts.map +1 -0
  44. package/dist/context.js +268 -0
  45. package/dist/context.js.map +1 -0
  46. package/dist/cray.d.ts +114 -0
  47. package/dist/cray.d.ts.map +1 -0
  48. package/dist/cray.js +338 -0
  49. package/dist/cray.js.map +1 -0
  50. package/dist/index.d.ts +16 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +122 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/plugins/registry.d.ts +106 -0
  55. package/dist/plugins/registry.d.ts.map +1 -0
  56. package/dist/plugins/registry.js +695 -0
  57. package/dist/plugins/registry.js.map +1 -0
  58. package/dist/query.d.ts +31 -0
  59. package/dist/query.d.ts.map +1 -0
  60. package/dist/query.js +637 -0
  61. package/dist/query.js.map +1 -0
  62. package/dist/queryStream.d.ts +36 -0
  63. package/dist/queryStream.d.ts.map +1 -0
  64. package/dist/queryStream.js +704 -0
  65. package/dist/queryStream.js.map +1 -0
  66. package/dist/screens/ReplScreen.d.ts +22 -0
  67. package/dist/screens/ReplScreen.d.ts.map +1 -0
  68. package/dist/screens/ReplScreen.js +763 -0
  69. package/dist/screens/ReplScreen.js.map +1 -0
  70. package/dist/services/agentRunner.d.ts +39 -0
  71. package/dist/services/agentRunner.d.ts.map +1 -0
  72. package/dist/services/agentRunner.js +115 -0
  73. package/dist/services/agentRunner.js.map +1 -0
  74. package/dist/services/compact.d.ts +34 -0
  75. package/dist/services/compact.d.ts.map +1 -0
  76. package/dist/services/compact.js +179 -0
  77. package/dist/services/compact.js.map +1 -0
  78. package/dist/services/loadPluginCommands.d.ts +55 -0
  79. package/dist/services/loadPluginCommands.d.ts.map +1 -0
  80. package/dist/services/loadPluginCommands.js +219 -0
  81. package/dist/services/loadPluginCommands.js.map +1 -0
  82. package/dist/services/mcp/index.d.ts +3 -0
  83. package/dist/services/mcp/index.d.ts.map +1 -0
  84. package/dist/services/mcp/index.js +3 -0
  85. package/dist/services/mcp/index.js.map +1 -0
  86. package/dist/services/mcp/manager.d.ts +24 -0
  87. package/dist/services/mcp/manager.d.ts.map +1 -0
  88. package/dist/services/mcp/manager.js +138 -0
  89. package/dist/services/mcp/manager.js.map +1 -0
  90. package/dist/services/mcp/types.d.ts +52 -0
  91. package/dist/services/mcp/types.d.ts.map +1 -0
  92. package/dist/services/mcp/types.js +5 -0
  93. package/dist/services/mcp/types.js.map +1 -0
  94. package/dist/services/memory.d.ts +38 -0
  95. package/dist/services/memory.d.ts.map +1 -0
  96. package/dist/services/memory.js +181 -0
  97. package/dist/services/memory.js.map +1 -0
  98. package/dist/services/permissionPrompt.d.ts +38 -0
  99. package/dist/services/permissionPrompt.d.ts.map +1 -0
  100. package/dist/services/permissionPrompt.js +83 -0
  101. package/dist/services/permissionPrompt.js.map +1 -0
  102. package/dist/services/permissions.d.ts +15 -0
  103. package/dist/services/permissions.d.ts.map +1 -0
  104. package/dist/services/permissions.js +237 -0
  105. package/dist/services/permissions.js.map +1 -0
  106. package/dist/services/sessionStorage.d.ts +51 -0
  107. package/dist/services/sessionStorage.d.ts.map +1 -0
  108. package/dist/services/sessionStorage.js +266 -0
  109. package/dist/services/sessionStorage.js.map +1 -0
  110. package/dist/setup.d.ts +22 -0
  111. package/dist/setup.d.ts.map +1 -0
  112. package/dist/setup.js +160 -0
  113. package/dist/setup.js.map +1 -0
  114. package/dist/skills/bundledSkills.d.ts +18 -0
  115. package/dist/skills/bundledSkills.d.ts.map +1 -0
  116. package/dist/skills/bundledSkills.js +277 -0
  117. package/dist/skills/bundledSkills.js.map +1 -0
  118. package/dist/skills/index.d.ts +4 -0
  119. package/dist/skills/index.d.ts.map +1 -0
  120. package/dist/skills/index.js +3 -0
  121. package/dist/skills/index.js.map +1 -0
  122. package/dist/skills/loadSkillsDir.d.ts +45 -0
  123. package/dist/skills/loadSkillsDir.d.ts.map +1 -0
  124. package/dist/skills/loadSkillsDir.js +233 -0
  125. package/dist/skills/loadSkillsDir.js.map +1 -0
  126. package/dist/state/AppState.d.ts +70 -0
  127. package/dist/state/AppState.d.ts.map +1 -0
  128. package/dist/state/AppState.js +106 -0
  129. package/dist/state/AppState.js.map +1 -0
  130. package/dist/tools/AgentTool.d.ts +62 -0
  131. package/dist/tools/AgentTool.d.ts.map +1 -0
  132. package/dist/tools/AgentTool.js +133 -0
  133. package/dist/tools/AgentTool.js.map +1 -0
  134. package/dist/tools/AskUserQuestionTool.d.ts +60 -0
  135. package/dist/tools/AskUserQuestionTool.d.ts.map +1 -0
  136. package/dist/tools/AskUserQuestionTool.js +52 -0
  137. package/dist/tools/AskUserQuestionTool.js.map +1 -0
  138. package/dist/tools/BashTool.d.ts +33 -0
  139. package/dist/tools/BashTool.d.ts.map +1 -0
  140. package/dist/tools/BashTool.js +211 -0
  141. package/dist/tools/BashTool.js.map +1 -0
  142. package/dist/tools/EditTool.d.ts +24 -0
  143. package/dist/tools/EditTool.d.ts.map +1 -0
  144. package/dist/tools/EditTool.js +102 -0
  145. package/dist/tools/EditTool.js.map +1 -0
  146. package/dist/tools/GlobTool.d.ts +17 -0
  147. package/dist/tools/GlobTool.d.ts.map +1 -0
  148. package/dist/tools/GlobTool.js +65 -0
  149. package/dist/tools/GlobTool.js.map +1 -0
  150. package/dist/tools/GrepTool.d.ts +30 -0
  151. package/dist/tools/GrepTool.d.ts.map +1 -0
  152. package/dist/tools/GrepTool.js +140 -0
  153. package/dist/tools/GrepTool.js.map +1 -0
  154. package/dist/tools/MCPTool.d.ts +24 -0
  155. package/dist/tools/MCPTool.d.ts.map +1 -0
  156. package/dist/tools/MCPTool.js +67 -0
  157. package/dist/tools/MCPTool.js.map +1 -0
  158. package/dist/tools/NotebookEditTool.d.ts +28 -0
  159. package/dist/tools/NotebookEditTool.d.ts.map +1 -0
  160. package/dist/tools/NotebookEditTool.js +213 -0
  161. package/dist/tools/NotebookEditTool.js.map +1 -0
  162. package/dist/tools/NotebookReadTool.d.ts +19 -0
  163. package/dist/tools/NotebookReadTool.d.ts.map +1 -0
  164. package/dist/tools/NotebookReadTool.js +191 -0
  165. package/dist/tools/NotebookReadTool.js.map +1 -0
  166. package/dist/tools/PlanTools.d.ts +17 -0
  167. package/dist/tools/PlanTools.d.ts.map +1 -0
  168. package/dist/tools/PlanTools.js +65 -0
  169. package/dist/tools/PlanTools.js.map +1 -0
  170. package/dist/tools/ReadTool.d.ts +21 -0
  171. package/dist/tools/ReadTool.d.ts.map +1 -0
  172. package/dist/tools/ReadTool.js +202 -0
  173. package/dist/tools/ReadTool.js.map +1 -0
  174. package/dist/tools/SkillTool.d.ts +32 -0
  175. package/dist/tools/SkillTool.d.ts.map +1 -0
  176. package/dist/tools/SkillTool.js +217 -0
  177. package/dist/tools/SkillTool.js.map +1 -0
  178. package/dist/tools/TodoWriteTool.d.ts +35 -0
  179. package/dist/tools/TodoWriteTool.d.ts.map +1 -0
  180. package/dist/tools/TodoWriteTool.js +58 -0
  181. package/dist/tools/TodoWriteTool.js.map +1 -0
  182. package/dist/tools/WebFetchTool.d.ts +17 -0
  183. package/dist/tools/WebFetchTool.d.ts.map +1 -0
  184. package/dist/tools/WebFetchTool.js +97 -0
  185. package/dist/tools/WebFetchTool.js.map +1 -0
  186. package/dist/tools/WebSearchTool.d.ts +18 -0
  187. package/dist/tools/WebSearchTool.d.ts.map +1 -0
  188. package/dist/tools/WebSearchTool.js +76 -0
  189. package/dist/tools/WebSearchTool.js.map +1 -0
  190. package/dist/tools/WriteTool.d.ts +17 -0
  191. package/dist/tools/WriteTool.d.ts.map +1 -0
  192. package/dist/tools/WriteTool.js +84 -0
  193. package/dist/tools/WriteTool.js.map +1 -0
  194. package/dist/tools/index.d.ts +21 -0
  195. package/dist/tools/index.d.ts.map +1 -0
  196. package/dist/tools/index.js +20 -0
  197. package/dist/tools/index.js.map +1 -0
  198. package/dist/tools.d.ts +34 -0
  199. package/dist/tools.d.ts.map +1 -0
  200. package/dist/tools.js +102 -0
  201. package/dist/tools.js.map +1 -0
  202. package/dist/types/events.d.ts +85 -0
  203. package/dist/types/events.d.ts.map +1 -0
  204. package/dist/types/events.js +12 -0
  205. package/dist/types/events.js.map +1 -0
  206. package/dist/types/index.d.ts +4 -0
  207. package/dist/types/index.d.ts.map +1 -0
  208. package/dist/types/index.js +4 -0
  209. package/dist/types/index.js.map +1 -0
  210. package/dist/types/message.d.ts +71 -0
  211. package/dist/types/message.d.ts.map +1 -0
  212. package/dist/types/message.js +5 -0
  213. package/dist/types/message.js.map +1 -0
  214. package/dist/types/permission.d.ts +56 -0
  215. package/dist/types/permission.d.ts.map +1 -0
  216. package/dist/types/permission.js +46 -0
  217. package/dist/types/permission.js.map +1 -0
  218. package/dist/types/processUserInput.d.ts +18 -0
  219. package/dist/types/processUserInput.d.ts.map +1 -0
  220. package/dist/types/processUserInput.js +8 -0
  221. package/dist/types/processUserInput.js.map +1 -0
  222. package/dist/types/tool.d.ts +32 -0
  223. package/dist/types/tool.d.ts.map +1 -0
  224. package/dist/types/tool.js +5 -0
  225. package/dist/types/tool.js.map +1 -0
  226. package/dist/utils/compactBoundary.d.ts +11 -0
  227. package/dist/utils/compactBoundary.d.ts.map +1 -0
  228. package/dist/utils/compactBoundary.js +26 -0
  229. package/dist/utils/compactBoundary.js.map +1 -0
  230. package/dist/utils/configStore.d.ts +41 -0
  231. package/dist/utils/configStore.d.ts.map +1 -0
  232. package/dist/utils/configStore.js +111 -0
  233. package/dist/utils/configStore.js.map +1 -0
  234. package/dist/utils/forkedAgent.d.ts +40 -0
  235. package/dist/utils/forkedAgent.d.ts.map +1 -0
  236. package/dist/utils/forkedAgent.js +231 -0
  237. package/dist/utils/forkedAgent.js.map +1 -0
  238. package/dist/utils/messages.d.ts +14 -0
  239. package/dist/utils/messages.d.ts.map +1 -0
  240. package/dist/utils/messages.js +29 -0
  241. package/dist/utils/messages.js.map +1 -0
  242. package/dist/utils/sandbox.d.ts +22 -0
  243. package/dist/utils/sandbox.d.ts.map +1 -0
  244. package/dist/utils/sandbox.js +59 -0
  245. package/dist/utils/sandbox.js.map +1 -0
  246. package/dist/utils/sideQuestion.d.ts +29 -0
  247. package/dist/utils/sideQuestion.d.ts.map +1 -0
  248. package/dist/utils/sideQuestion.js +81 -0
  249. package/dist/utils/sideQuestion.js.map +1 -0
  250. package/install.ps1 +86 -0
  251. package/install.sh +92 -0
  252. package/package.json +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStorage.d.ts","sourceRoot":"","sources":["../../src/services/sessionStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAQnD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAErE;AAID,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAqD3E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,CAAC,gBAAgB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAAC,CAoDvF;AA8CD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAGN;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzD;AAID,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,EAAE,CAAC,CAGpB;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAyB9E;AAID,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpF;AAMD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * sessionStorage.ts — Session persistence for Cray Code.
3
+ *
4
+ * Mirrors Claude Code's pattern: conversations persist as JSONL files
5
+ * in ~/.cray/projects/<sanitized-project-path>/<sessionId>.jsonl.
6
+ *
7
+ * Each line is a JSON object representing one message entry.
8
+ * Messages are chained via parentUuid for conversation reconstruction.
9
+ */
10
+ import { mkdir, readdir, readFile, stat, appendFile, unlink, } from 'fs/promises';
11
+ import { join, dirname } from 'path';
12
+ import { homedir } from 'os';
13
+ // ─── Paths ────────────────────────────────────────────────────────────
14
+ function getProjectsDir() {
15
+ return join(homedir(), '.cray', 'projects');
16
+ }
17
+ export function sanitizePath(projectPath) {
18
+ return projectPath
19
+ .replace(/^[A-Za-z]:/, '') // Strip Windows drive letter
20
+ .replace(/\\/g, '/') // Normalize separators
21
+ .replace(/[^a-zA-Z0-9/_-]/g, '_') // Replace unsafe chars
22
+ .replace(/\/+/g, '/') // Collapse slashes
23
+ .replace(/\/$/, '') // Strip trailing slash
24
+ || '_root';
25
+ }
26
+ export function getProjectDir(cwd) {
27
+ return join(getProjectsDir(), sanitizePath(cwd));
28
+ }
29
+ export function getSessionPath(cwd, sessionId) {
30
+ return join(getProjectDir(cwd), `${sessionId}.jsonl`);
31
+ }
32
+ // ─── Session List ─────────────────────────────────────────────────────
33
+ /**
34
+ * List all saved sessions for the current project directory.
35
+ * Reads the JSONL tail to extract first-prompt metadata.
36
+ */
37
+ export async function listSessions(cwd) {
38
+ const projectDir = getProjectDir(cwd);
39
+ const entries = [];
40
+ try {
41
+ const files = await readdir(projectDir);
42
+ for (const file of files) {
43
+ if (!file.endsWith('.jsonl'))
44
+ continue;
45
+ const sessionId = file.replace('.jsonl', '');
46
+ const filePath = join(projectDir, file);
47
+ let firstPrompt = '';
48
+ let messageCount = 0;
49
+ let createdAt = '';
50
+ let updatedAt = '';
51
+ try {
52
+ const st = await stat(filePath);
53
+ createdAt = st.birthtime.toISOString();
54
+ updatedAt = st.mtime.toISOString();
55
+ // Read first and last few entries to extract metadata
56
+ const content = await readFile(filePath, 'utf-8');
57
+ const lines = content.trim().split('\n');
58
+ messageCount = lines.length;
59
+ // Find first user message for display
60
+ for (const line of lines) {
61
+ try {
62
+ const entry = JSON.parse(line);
63
+ if (entry.type === 'user' && !entry.isMeta) {
64
+ const msg = typeof entry.content === 'string'
65
+ ? entry.content
66
+ : entry.content?.[0]?.text ?? '';
67
+ firstPrompt = msg.replace(/\n/g, ' ').trim().slice(0, 120);
68
+ break;
69
+ }
70
+ }
71
+ catch { /* skip malformed */ }
72
+ }
73
+ }
74
+ catch { /* skip */ }
75
+ entries.push({
76
+ sessionId,
77
+ firstPrompt: firstPrompt || '(Empty session)',
78
+ messageCount,
79
+ createdAt,
80
+ updatedAt,
81
+ });
82
+ }
83
+ }
84
+ catch { /* project dir may not exist */ }
85
+ // Newest first
86
+ return entries.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
87
+ }
88
+ /**
89
+ * List sessions across ALL projects (global resume).
90
+ */
91
+ export async function listAllSessions() {
92
+ const projectsDir = getProjectsDir();
93
+ const results = [];
94
+ try {
95
+ const projectDirs = await readdir(projectsDir);
96
+ for (const pDir of projectDirs) {
97
+ const fullPath = join(projectsDir, pDir);
98
+ try {
99
+ const st = await stat(fullPath);
100
+ if (!st.isDirectory())
101
+ continue;
102
+ const files = await readdir(fullPath);
103
+ for (const file of files) {
104
+ if (!file.endsWith('.jsonl'))
105
+ continue;
106
+ const sessionId = file.replace('.jsonl', '');
107
+ const filePath = join(fullPath, file);
108
+ const fst = await stat(filePath);
109
+ // Quick first-prompt read
110
+ let firstPrompt = '';
111
+ try {
112
+ const content = await readFile(filePath, 'utf-8');
113
+ const lines = content.trim().split('\n');
114
+ for (const line of lines) {
115
+ try {
116
+ const entry = JSON.parse(line);
117
+ if (entry.type === 'user' && !entry.isMeta) {
118
+ const msg = typeof entry.content === 'string'
119
+ ? entry.content
120
+ : entry.content?.[0]?.text ?? '';
121
+ firstPrompt = msg.replace(/\n/g, ' ').trim().slice(0, 120);
122
+ break;
123
+ }
124
+ }
125
+ catch { /* skip */ }
126
+ }
127
+ }
128
+ catch { /* skip */ }
129
+ results.push({
130
+ sessionId,
131
+ cwd: pDir.replace(/_/g, '/'), // Approximate reverse of sanitizePath
132
+ firstPrompt: firstPrompt || '(Empty)',
133
+ messageCount: 0,
134
+ createdAt: fst.birthtime.toISOString(),
135
+ updatedAt: fst.mtime.toISOString(),
136
+ });
137
+ }
138
+ }
139
+ catch { /* skip */ }
140
+ }
141
+ }
142
+ catch { /* projects dir may not exist */ }
143
+ return results.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
144
+ }
145
+ let writeQueue = [];
146
+ let flushTimer = null;
147
+ const FLUSH_INTERVAL_MS = 100;
148
+ async function drainWriteQueue() {
149
+ const batch = writeQueue;
150
+ writeQueue = [];
151
+ // Group by session file path
152
+ const byFile = new Map();
153
+ for (const { cwd, sessionId, line } of batch) {
154
+ const path = getSessionPath(cwd, sessionId);
155
+ const lines = byFile.get(path) || [];
156
+ lines.push(line);
157
+ byFile.set(path, lines);
158
+ }
159
+ for (const [path, lines] of byFile) {
160
+ try {
161
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
162
+ await appendFile(path, lines.join('\n') + '\n', { mode: 0o600 });
163
+ }
164
+ catch { /* best-effort, e.g. filesystem full */ }
165
+ }
166
+ }
167
+ function scheduleFlush() {
168
+ if (flushTimer)
169
+ return;
170
+ flushTimer = setTimeout(async () => {
171
+ flushTimer = null;
172
+ await drainWriteQueue();
173
+ }, FLUSH_INTERVAL_MS);
174
+ }
175
+ export function recordTranscriptEntry(cwd, sessionId, entry) {
176
+ writeQueue.push({ cwd, sessionId, line: JSON.stringify(entry) });
177
+ scheduleFlush();
178
+ }
179
+ export function recordMessages(cwd, sessionId, messages, parentUuid) {
180
+ let lastUuid = parentUuid ?? null;
181
+ for (const msg of messages) {
182
+ const entry = {
183
+ type: msg.role,
184
+ uuid: msg.id,
185
+ parentUuid: lastUuid,
186
+ sessionId,
187
+ timestamp: new Date().toISOString(),
188
+ content: msg.content,
189
+ };
190
+ if (msg.model)
191
+ entry.model = msg.model;
192
+ if (msg.stopReason)
193
+ entry.stopReason = msg.stopReason;
194
+ if (msg.usage)
195
+ entry.usage = msg.usage;
196
+ recordTranscriptEntry(cwd, sessionId, entry);
197
+ if (msg.role === 'assistant' || msg.role === 'user') {
198
+ lastUuid = msg.id;
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Flush any pending writes immediately (call before process exit).
204
+ */
205
+ export async function flushSessionStorage() {
206
+ if (flushTimer) {
207
+ clearTimeout(flushTimer);
208
+ flushTimer = null;
209
+ }
210
+ await drainWriteQueue();
211
+ }
212
+ // ─── Session Load (for /resume) ──────────────────────────────────────
213
+ export async function loadSession(cwd, sessionId) {
214
+ const path = getSessionPath(cwd, sessionId);
215
+ return loadSessionFromFile(path);
216
+ }
217
+ export async function loadSessionFromFile(filePath) {
218
+ const messages = [];
219
+ try {
220
+ const content = await readFile(filePath, 'utf-8');
221
+ const lines = content.trim().split('\n');
222
+ for (const line of lines) {
223
+ if (!line.trim())
224
+ continue;
225
+ try {
226
+ const entry = JSON.parse(line);
227
+ // Restore: normalize disk format (type field) → memory format (role field)
228
+ const { parentUuid, sessionId: sid, timestamp: ts, type, ...rest } = entry;
229
+ if (type && entry.id) {
230
+ const msg = {
231
+ ...rest,
232
+ role: type, // disk uses 'type', memory uses 'role'
233
+ id: entry.id ?? entry.uuid,
234
+ timestamp: ts ? new Date(ts).getTime() : Date.now(),
235
+ };
236
+ if (msg.stopReason === undefined)
237
+ msg.stopReason = 'end_turn';
238
+ messages.push(msg);
239
+ }
240
+ }
241
+ catch { /* skip malformed */ }
242
+ }
243
+ }
244
+ catch { /* file may not exist */ }
245
+ return messages;
246
+ }
247
+ // ─── Session Delete ───────────────────────────────────────────────────
248
+ export async function deleteSession(cwd, sessionId) {
249
+ const path = getSessionPath(cwd, sessionId);
250
+ try {
251
+ await unlink(path);
252
+ return true;
253
+ }
254
+ catch {
255
+ return false;
256
+ }
257
+ }
258
+ // ─── Get current session ID ───────────────────────────────────────────
259
+ let currentSessionId = null;
260
+ export function getCurrentSessionId() {
261
+ return currentSessionId;
262
+ }
263
+ export function setCurrentSessionId(id) {
264
+ currentSessionId = id;
265
+ }
266
+ //# sourceMappingURL=sessionStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStorage.js","sourceRoot":"","sources":["../../src/services/sessionStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * First-run Setup Wizard for Cray Code.
3
+ *
4
+ * Runs interactively the first time Cray Code is started (or via /setup command).
5
+ * Prompts the user to:
6
+ * 1. Pick an LLM provider
7
+ * 2. Select a model
8
+ * 3. Enter an API key (if needed)
9
+ * 4. Optionally set a custom Base URL
10
+ */
11
+ import { type CrayConfig } from './utils/configStore.js';
12
+ export interface SetupResult {
13
+ provider: string;
14
+ model: string;
15
+ apiKey: string;
16
+ baseUrl: string;
17
+ }
18
+ /** Run the interactive setup wizard. Returns the resolved config. */
19
+ export declare function runFirstTimeSetup(cwd?: string): Promise<CrayConfig>;
20
+ /** Lightweight re-setup without the welcome banner. */
21
+ export declare function runReSetup(cwd?: string): Promise<CrayConfig>;
22
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,KAAK,UAAU,EAKhB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,qEAAqE;AACrE,wBAAsB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+DzE;AA0HD,uDAAuD;AACvD,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAGlE"}
package/dist/setup.js ADDED
@@ -0,0 +1,160 @@
1
+ /**
2
+ * First-run Setup Wizard for Cray Code.
3
+ *
4
+ * Runs interactively the first time Cray Code is started (or via /setup command).
5
+ * Prompts the user to:
6
+ * 1. Pick an LLM provider
7
+ * 2. Select a model
8
+ * 3. Enter an API key (if needed)
9
+ * 4. Optionally set a custom Base URL
10
+ */
11
+ import * as readline from 'readline';
12
+ import { CRAY_LOGO } from './branding/logo.js';
13
+ import { KNOWN_PROVIDERS, loadConfig, saveConfig, maskApiKey, } from './utils/configStore.js';
14
+ // ─── Main Setup Entry ──────────────────────────────────────────────────
15
+ /** Run the interactive setup wizard. Returns the resolved config. */
16
+ export async function runFirstTimeSetup(cwd) {
17
+ const existing = loadConfig(cwd);
18
+ const rl = readline.createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout,
21
+ });
22
+ const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
23
+ console.clear();
24
+ console.log(CRAY_LOGO);
25
+ console.log(' Welcome to Cray Code!\n');
26
+ console.log(' This appears to be your first time running Cray Code.');
27
+ console.log(' Let\'s set up your LLM connection.\n');
28
+ console.log('─'.repeat(56));
29
+ try {
30
+ // Step 1: Pick provider
31
+ const provider = await pickProvider(ask, existing.provider);
32
+ // Step 2: Pick model
33
+ const model = await pickModel(ask, provider, existing.model);
34
+ // Step 3: API key (if needed)
35
+ let apiKey = existing.apiKey;
36
+ if (KNOWN_PROVIDERS[provider]?.needsApiKey) {
37
+ apiKey = await askForApiKey(ask, provider, existing.apiKey);
38
+ }
39
+ // Step 4: Base URL (if needed)
40
+ let baseUrl = existing.baseUrl ?? '';
41
+ if (KNOWN_PROVIDERS[provider]?.needsBaseUrl) {
42
+ baseUrl = await askForBaseUrl(ask, provider, existing.baseUrl);
43
+ }
44
+ // Save
45
+ const config = {
46
+ ...existing,
47
+ provider,
48
+ model,
49
+ apiKey,
50
+ baseUrl,
51
+ setupComplete: true,
52
+ };
53
+ saveConfig(config);
54
+ console.log('\n' + '─'.repeat(56));
55
+ console.log(' Setup complete!\n');
56
+ console.log(` Provider: ${KNOWN_PROVIDERS[provider]?.label ?? provider}`);
57
+ console.log(` Model: ${model}`);
58
+ if (apiKey)
59
+ console.log(` API Key: ${maskApiKey(apiKey)}`);
60
+ if (baseUrl)
61
+ console.log(` Base URL: ${baseUrl}`);
62
+ console.log('\n Config saved to ~/.cray/settings.json');
63
+ console.log(' You can re-run setup anytime with /setup');
64
+ console.log('─'.repeat(56));
65
+ console.log();
66
+ return config;
67
+ }
68
+ finally {
69
+ rl.close();
70
+ }
71
+ }
72
+ // ─── Interactive Steps ─────────────────────────────────────────────────
73
+ async function pickProvider(ask, currentProvider) {
74
+ console.log('\n Available LLM providers:\n');
75
+ const providers = Object.entries(KNOWN_PROVIDERS);
76
+ providers.forEach(([key, info], i) => {
77
+ const marker = currentProvider === key ? ' (current)' : '';
78
+ console.log(` ${i + 1}. ${info.label}${marker}`);
79
+ });
80
+ console.log();
81
+ const answer = await ask(` Choose a provider [${currentProvider || '1'}-${providers.length}]: `);
82
+ const index = parseInt(answer, 10);
83
+ if (index >= 1 && index <= providers.length) {
84
+ return providers[index - 1][0];
85
+ }
86
+ // Try name matching
87
+ const matched = providers.find(([key]) => key.toLowerCase() === answer.toLowerCase().trim());
88
+ if (matched)
89
+ return matched[0];
90
+ // Default
91
+ if (currentProvider)
92
+ return currentProvider;
93
+ console.log(' Invalid choice, defaulting to Anthropic.\n');
94
+ return 'anthropic';
95
+ }
96
+ async function pickModel(ask, provider, currentModel) {
97
+ const info = KNOWN_PROVIDERS[provider];
98
+ if (!info)
99
+ return currentModel || 'claude-sonnet-4-6';
100
+ const models = info.models;
101
+ const isCustomProvider = provider === 'custom' || provider === 'ollama';
102
+ if (isCustomProvider) {
103
+ console.log(`\n Known models for ${info.label}: ${models.join(', ')}`);
104
+ const answer = await ask(` Enter model name [${currentModel || models[0]}]: `);
105
+ return answer.trim() || currentModel || models[0];
106
+ }
107
+ console.log(`\n Available models for ${info.label}:\n`);
108
+ models.forEach((m, i) => {
109
+ const marker = currentModel === m ? ' (current)' : '';
110
+ console.log(` ${i + 1}. ${m}${marker}`);
111
+ });
112
+ console.log('\n Or type a custom model name.\n');
113
+ const answer = await ask(` Choose a model [${currentModel || '1'}]: `);
114
+ const index = parseInt(answer, 10);
115
+ if (index >= 1 && index <= models.length) {
116
+ return models[index - 1];
117
+ }
118
+ if (answer.trim())
119
+ return answer.trim();
120
+ return currentModel || models[0];
121
+ }
122
+ async function askForApiKey(ask, provider, currentKey) {
123
+ const info = KNOWN_PROVIDERS[provider];
124
+ console.log(`\n ${info?.label ?? provider} requires an API key.`);
125
+ if (currentKey) {
126
+ console.log(` Current key: ${maskApiKey(currentKey)}`);
127
+ const answer = await ask(' Press Enter to keep current key, or paste a new one: ');
128
+ if (answer.trim())
129
+ return answer.trim();
130
+ return currentKey;
131
+ }
132
+ console.log(' Paste your API key below (input will be hidden).');
133
+ console.log(' You can also set the CRAY_API_KEY environment variable.\n');
134
+ // Try env var first
135
+ const envKey = process.env.CRAY_API_KEY;
136
+ if (envKey) {
137
+ console.log(' Found CRAY_API_KEY in environment. Using that.');
138
+ return envKey;
139
+ }
140
+ const answer = await ask(' API Key: ');
141
+ return answer.trim();
142
+ }
143
+ async function askForBaseUrl(ask, provider, currentBaseUrl) {
144
+ const info = KNOWN_PROVIDERS[provider];
145
+ const defaultUrl = info?.defaultBaseUrl ?? '';
146
+ if (currentBaseUrl || defaultUrl) {
147
+ const display = currentBaseUrl || defaultUrl;
148
+ const answer = await ask(` Base URL [${display}]: `);
149
+ return answer.trim() || display;
150
+ }
151
+ const answer = await ask(' API Base URL (e.g., http://localhost:11434/v1): ');
152
+ return answer.trim();
153
+ }
154
+ // ─── Quick Re-setup (from /setup command) ────────────────────────────
155
+ /** Lightweight re-setup without the welcome banner. */
156
+ export async function runReSetup(cwd) {
157
+ console.log('\n Reconfiguring Cray Code...\n');
158
+ return runFirstTimeSetup(cwd);
159
+ }
160
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Bundled Skills System for Cray Code.
3
+ *
4
+ * Skills extend agent capabilities with specialized knowledge and instructions.
5
+ * They can restrict tool access, set preferred models, and provide reference files.
6
+ *
7
+ * Two types:
8
+ * - Bundled skills: compiled into the framework (defined here)
9
+ * - Disk-based skills: loaded from .cray/skills/ directories at runtime
10
+ */
11
+ import type { SkillInfo } from '../Tool.js';
12
+ /** Register a bundled skill */
13
+ export declare function registerBundledSkill(skill: SkillInfo): void;
14
+ /** Get all registered bundled skills */
15
+ export declare function getBundledSkills(): SkillInfo[];
16
+ /** Get a specific bundled skill by name */
17
+ export declare function getBundledSkill(name: string): SkillInfo | undefined;
18
+ //# sourceMappingURL=bundledSkills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundledSkills.d.ts","sourceRoot":"","sources":["../../src/skills/bundledSkills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,+BAA+B;AAC/B,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAE3D;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,IAAI,SAAS,EAAE,CAE9C;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEnE"}