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
package/dist/cray.d.ts ADDED
@@ -0,0 +1,114 @@
1
+ /**
2
+ * CrayCode — Main orchestrator class.
3
+ *
4
+ * This is the primary public API for Cray Code. It ties together:
5
+ * - Tool system (built-in + MCP + skill-linked)
6
+ * - Query engine (agent loop)
7
+ * - State management
8
+ * - Skill system
9
+ * - Plugin system
10
+ * - Command system
11
+ *
12
+ * Usage:
13
+ * const cray = new CrayCode({ cwd: process.cwd() });
14
+ * await cray.initialize();
15
+ * const result = await cray.processMessage("Review this code");
16
+ */
17
+ import { EventEmitter } from 'events';
18
+ import type { ToolUseContext } from './Tool.js';
19
+ import type { Message } from './types/message.js';
20
+ import type { PermissionMode } from './types/permission.js';
21
+ import type { MCPServerConfig } from './services/mcp/types.js';
22
+ import { type CommandResult } from './commands/registry.js';
23
+ import { type CompactResult } from './services/compact.js';
24
+ export interface CrayCodeOptions {
25
+ /** Working directory */
26
+ cwd?: string;
27
+ /** LLM provider (anthropic|openai|ollama|openrouter|deepseek|custom) */
28
+ provider?: string;
29
+ /** Model to use */
30
+ model?: string;
31
+ /** API key for the provider */
32
+ apiKey?: string;
33
+ /** Custom API base URL */
34
+ baseUrl?: string;
35
+ /** Permission mode */
36
+ permissionMode?: PermissionMode;
37
+ /** Max agent loop turns */
38
+ maxTurns?: number;
39
+ /** Enable verbose debug logging */
40
+ verbose?: boolean;
41
+ /** MCP server configurations */
42
+ mcpServers?: MCPServerConfig[];
43
+ /** Additional skill directories */
44
+ skillDirs?: string[];
45
+ /** Resume a previous session by session ID */
46
+ resumeSessionId?: string;
47
+ }
48
+ export interface CrayCodeEvents {
49
+ 'message': (message: Message) => void;
50
+ 'toolCall': (toolName: string, input: unknown) => void;
51
+ 'toolResult': (toolName: string, result: unknown) => void;
52
+ 'agentStart': (agentId: string, description: string) => void;
53
+ 'agentEnd': (agentId: string, status: string) => void;
54
+ 'mcpConnect': (serverName: string) => void;
55
+ 'mcpDisconnect': (serverName: string) => void;
56
+ 'error': (error: Error) => void;
57
+ 'ready': () => void;
58
+ 'shutdown': () => void;
59
+ }
60
+ export declare class CrayCode extends EventEmitter {
61
+ private options;
62
+ private initialized;
63
+ /** @internal — exposed for React/Ink renderer to access tool context */
64
+ toolContext: ToolUseContext;
65
+ constructor(options?: CrayCodeOptions);
66
+ /** Initialize Cray Code. Must be called before processMessage(). */
67
+ initialize(): Promise<void>;
68
+ /** Process a user message and return the agent's response. */
69
+ processMessage(userInput: string, options?: {
70
+ systemPrompt?: string;
71
+ isSubAgent?: boolean;
72
+ allowedTools?: string[];
73
+ }): Promise<{
74
+ messages: Message[];
75
+ finalResponse: string;
76
+ toolCalls: number;
77
+ tokensUsed: number;
78
+ duration: number;
79
+ }>;
80
+ /** Execute a slash command (e.g., /help, /model, /config). */
81
+ executeCommand(input: string): Promise<CommandResult>;
82
+ /** Compact conversation context: summarize old turns, keep the last N intact. */
83
+ compact(options?: {
84
+ keepLastTurns?: number;
85
+ }): CompactResult;
86
+ /** Add an MCP server dynamically */
87
+ addMCPServer(config: MCPServerConfig): Promise<void>;
88
+ /** Remove an MCP server */
89
+ removeMCPServer(serverName: string): Promise<void>;
90
+ /** Get current framework status summary */
91
+ getStatus(): {
92
+ initialized: boolean;
93
+ cwd: string;
94
+ model: string;
95
+ permissionMode: string;
96
+ toolCount: number;
97
+ skillCount: number;
98
+ mcpServerCount: number;
99
+ pluginCount: number;
100
+ messages: number;
101
+ };
102
+ /** Display welcome message in the terminal */
103
+ getWelcomeMessage(): string;
104
+ /** Gracefully shut down Cray Code */
105
+ shutdown(): Promise<void>;
106
+ /** Refresh the tool context with current state */
107
+ private refreshToolContext;
108
+ /** Rebuild tool pool after MCP/server changes */
109
+ private refreshToolPool;
110
+ /** Debug logging */
111
+ private log;
112
+ }
113
+ export default CrayCode;
114
+ //# sourceMappingURL=cray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cray.d.ts","sourceRoot":"","sources":["../src/cray.ts"],"names":[],"mappings":"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"}
package/dist/cray.js ADDED
@@ -0,0 +1,338 @@
1
+ /**
2
+ * CrayCode — Main orchestrator class.
3
+ *
4
+ * This is the primary public API for Cray Code. It ties together:
5
+ * - Tool system (built-in + MCP + skill-linked)
6
+ * - Query engine (agent loop)
7
+ * - State management
8
+ * - Skill system
9
+ * - Plugin system
10
+ * - Command system
11
+ *
12
+ * Usage:
13
+ * const cray = new CrayCode({ cwd: process.cwd() });
14
+ * await cray.initialize();
15
+ * const result = await cray.processMessage("Review this code");
16
+ */
17
+ import { EventEmitter } from 'events';
18
+ import { getDefaultPermissionContext } from './types/permission.js';
19
+ import { initAppState, getStore, setAppState } from './state/AppState.js';
20
+ import { buildContext } from './context.js';
21
+ import { setCurrentSessionId, flushSessionStorage, loadSession } from './services/sessionStorage.js';
22
+ import { buildToolPool, invalidateToolPoolCache } from './tools.js';
23
+ import { getAllMCPServers, registerMCPServer } from './services/mcp/manager.js';
24
+ import { getBundledSkills } from './skills/bundledSkills.js';
25
+ import { loadDiskSkills } from './skills/loadSkillsDir.js';
26
+ import { getPluginSkills, getPluginMCPServers, executeSessionStartHooks, executeSessionEndHooks, loadAllPlugins } from './plugins/registry.js';
27
+ import { getCommand } from './commands/registry.js';
28
+ import { query } from './query.js';
29
+ import { compact as compactMessages } from './services/compact.js';
30
+ import { WELCOME_MESSAGE } from './branding/logo.js';
31
+ export class CrayCode extends EventEmitter {
32
+ options;
33
+ initialized = false;
34
+ /** @internal — exposed for React/Ink renderer to access tool context */
35
+ toolContext;
36
+ constructor(options = {}) {
37
+ super();
38
+ this.options = {
39
+ cwd: options.cwd ?? process.cwd(),
40
+ provider: options.provider ?? 'anthropic',
41
+ model: options.model ?? process.env.CRAY_MODEL ?? 'claude-sonnet-4-6',
42
+ apiKey: options.apiKey ?? process.env.CRAY_API_KEY ?? '',
43
+ baseUrl: options.baseUrl ?? '',
44
+ permissionMode: options.permissionMode ?? 'default',
45
+ maxTurns: options.maxTurns ?? 25,
46
+ verbose: options.verbose ?? false,
47
+ mcpServers: options.mcpServers ?? [],
48
+ skillDirs: options.skillDirs ?? [],
49
+ resumeSessionId: options.resumeSessionId ?? '',
50
+ };
51
+ }
52
+ // ─── Initialization ─────────────────────────────────────────────────
53
+ /** Initialize Cray Code. Must be called before processMessage(). */
54
+ async initialize() {
55
+ if (this.initialized)
56
+ return;
57
+ this.log('Initializing Cray Code...');
58
+ // 1. Initialize state
59
+ initAppState(this.options.cwd);
60
+ // Record session ID for persistence
61
+ const state = getStore().getState();
62
+ const sessionId = state.sessionId;
63
+ setCurrentSessionId(sessionId);
64
+ this.log(`Session ID: ${sessionId}`);
65
+ // If resuming, load previous messages
66
+ if (this.options.resumeSessionId) {
67
+ try {
68
+ const resumed = await loadSession(this.options.cwd, this.options.resumeSessionId);
69
+ if (resumed.length > 0) {
70
+ setAppState((prev) => ({
71
+ ...prev,
72
+ messages: resumed,
73
+ }));
74
+ this.log(`Resumed session: ${this.options.resumeSessionId} (${resumed.length} messages)`);
75
+ }
76
+ }
77
+ catch (err) {
78
+ this.log(`Resume failed: ${err.message}`);
79
+ }
80
+ }
81
+ // 2. Build context
82
+ this.toolContext = await buildContext({
83
+ cwd: this.options.cwd,
84
+ settings: {
85
+ provider: this.options.provider,
86
+ model: this.options.model,
87
+ apiKey: this.options.apiKey,
88
+ baseUrl: this.options.baseUrl,
89
+ permissionMode: this.options.permissionMode,
90
+ maxTurns: this.options.maxTurns,
91
+ verbose: this.options.verbose,
92
+ },
93
+ });
94
+ // 3. Configure permission context
95
+ const permContext = getDefaultPermissionContext();
96
+ permContext.mode = this.options.permissionMode;
97
+ setAppState((prev) => ({
98
+ ...prev,
99
+ permissionContext: permContext,
100
+ }));
101
+ // 4. Load plugins (discover + register before loading plugin skills)
102
+ await loadAllPlugins(this.options.cwd);
103
+ // 5. Load skills
104
+ const bundledSkills = getBundledSkills();
105
+ const diskSkills = await loadDiskSkills(this.options.cwd);
106
+ const pluginSkills = getPluginSkills();
107
+ const allSkills = [...bundledSkills, ...diskSkills, ...pluginSkills];
108
+ setAppState((prev) => ({
109
+ ...prev,
110
+ skills: allSkills,
111
+ availableSkills: allSkills,
112
+ }));
113
+ this.log(`Loaded ${allSkills.length} skills (${bundledSkills.length} bundled, ${diskSkills.length} disk, ${pluginSkills.length} plugin)`);
114
+ // 6. Initialize MCP servers
115
+ for (const config of this.options.mcpServers) {
116
+ if (config.enabled !== false) {
117
+ try {
118
+ const connection = registerMCPServer(config);
119
+ await connection.connect();
120
+ this.emit('mcpConnect', config.name);
121
+ this.log(`MCP server connected: ${config.name}`);
122
+ }
123
+ catch (err) {
124
+ this.emit('error', new Error(`MCP connect failed: ${config.name} — ${err.message}`));
125
+ }
126
+ }
127
+ }
128
+ // Plugin MCP servers
129
+ for (const [name, config] of getPluginMCPServers()) {
130
+ try {
131
+ const connection = registerMCPServer(config);
132
+ await connection.connect();
133
+ this.log(`Plugin MCP server connected: ${name}`);
134
+ }
135
+ catch {
136
+ // Plugin MCP failures are non-fatal
137
+ }
138
+ }
139
+ // 7. Execute plugin session start hooks
140
+ await executeSessionStartHooks();
141
+ // 8. Build initial tool pool
142
+ const toolPool = buildToolPool(permContext);
143
+ setAppState((prev) => ({ ...prev, toolPool }));
144
+ this.initialized = true;
145
+ this.emit('ready');
146
+ this.log(`Cray Code ready. ${toolPool.length} tools available.`);
147
+ }
148
+ // ─── Message Processing ─────────────────────────────────────────────
149
+ /** Process a user message and return the agent's response. */
150
+ async processMessage(userInput, options) {
151
+ if (!this.initialized) {
152
+ throw new Error('CrayCode not initialized. Call initialize() first.');
153
+ }
154
+ const startTime = Date.now();
155
+ this.log(`Processing: "${userInput.slice(0, 100)}..."`);
156
+ // Update tool context with latest state
157
+ this.refreshToolContext();
158
+ // Collect events from async generator query
159
+ const messages = [];
160
+ for await (const event of query({
161
+ prompt: userInput,
162
+ context: this.toolContext,
163
+ systemPrompt: options?.systemPrompt,
164
+ model: this.options.model,
165
+ allowedTools: options?.allowedTools,
166
+ isSubAgent: options?.isSubAgent ?? false,
167
+ maxTurns: this.options.maxTurns,
168
+ })) {
169
+ if (event.type === 'done') {
170
+ messages.push(...event.messages);
171
+ }
172
+ }
173
+ // Extract final text response
174
+ const lastAssistant = [...messages].reverse().find((m) => m.role === 'assistant');
175
+ const finalResponse = lastAssistant
176
+ ? lastAssistant.content
177
+ .filter((c) => c.type === 'text')
178
+ .map((c) => c.text)
179
+ .join('\n')
180
+ : '';
181
+ // Count tool calls
182
+ const toolCalls = messages.reduce((count, m) => {
183
+ if (m.role === 'assistant') {
184
+ return count + m.content.filter((c) => c.type === 'tool_use').length;
185
+ }
186
+ return count;
187
+ }, 0);
188
+ const duration = Date.now() - startTime;
189
+ this.log(`Completed in ${duration}ms, ${toolCalls} tool calls, ${messages.length} messages`);
190
+ return {
191
+ messages,
192
+ finalResponse,
193
+ toolCalls,
194
+ tokensUsed: 0, // Tracked by API service in production
195
+ duration,
196
+ };
197
+ }
198
+ // ─── Command Execution ──────────────────────────────────────────────
199
+ /** Execute a slash command (e.g., /help, /model, /config). */
200
+ async executeCommand(input) {
201
+ const match = input.match(/^\/(\w+)\s*(.*)/);
202
+ if (!match) {
203
+ return { success: false, message: 'Not a command. Use /help for available commands.' };
204
+ }
205
+ const [, commandName, argsString] = match;
206
+ const cmd = getCommand(commandName);
207
+ if (!cmd) {
208
+ return { success: false, message: `Unknown command: /${commandName}. Type /help for available commands.` };
209
+ }
210
+ const args = argsString ? argsString.trim().split(/\s+/) : [];
211
+ return cmd.execute(args, {
212
+ cwd: this.options.cwd,
213
+ settings: {
214
+ model: this.options.model,
215
+ provider: this.options.provider,
216
+ apiKey: this.options.apiKey,
217
+ baseUrl: this.options.baseUrl,
218
+ permissionMode: this.options.permissionMode,
219
+ maxTurns: this.options.maxTurns,
220
+ verbose: this.options.verbose,
221
+ },
222
+ logDebug: (msg) => this.log(msg),
223
+ });
224
+ }
225
+ // ─── Context Compaction ──────────────────────────────────────────────
226
+ /** Compact conversation context: summarize old turns, keep the last N intact. */
227
+ compact(options) {
228
+ const state = getStore().getState();
229
+ const msgs = this.toolContext.messages.length > 0
230
+ ? this.toolContext.messages
231
+ : state.messages;
232
+ if (msgs.length === 0) {
233
+ return { messages: [], removedCount: 0, keptCount: 0, summaryText: '', estimatedTokensSaved: 0 };
234
+ }
235
+ const result = compactMessages(msgs, {
236
+ keepLastTurns: options?.keepLastTurns ?? 3,
237
+ });
238
+ this.log(`Compacted: ${result.removedCount} msgs → ${result.keptCount} kept, saved ~${result.estimatedTokensSaved} tokens`);
239
+ // Update the tool context messages to the compacted set
240
+ this.toolContext.messages = result.messages;
241
+ // Also update the app state
242
+ setAppState((prev) => ({ ...prev, messages: result.messages }));
243
+ return result;
244
+ }
245
+ // ─── MCP Management ─────────────────────────────────────────────────
246
+ /** Add an MCP server dynamically */
247
+ async addMCPServer(config) {
248
+ const connection = registerMCPServer(config);
249
+ await connection.connect();
250
+ this.refreshToolPool();
251
+ this.emit('mcpConnect', config.name);
252
+ this.log(`MCP server added: ${config.name}`);
253
+ }
254
+ /** Remove an MCP server */
255
+ async removeMCPServer(serverName) {
256
+ const servers = getAllMCPServers();
257
+ const server = servers.get(serverName);
258
+ if (server) {
259
+ await server.disconnect();
260
+ servers.delete(serverName);
261
+ this.refreshToolPool();
262
+ this.emit('mcpDisconnect', serverName);
263
+ this.log(`MCP server removed: ${serverName}`);
264
+ }
265
+ }
266
+ // ─── Status ─────────────────────────────────────────────────────────
267
+ /** Get current framework status summary */
268
+ getStatus() {
269
+ const state = getStore().getState();
270
+ return {
271
+ initialized: this.initialized,
272
+ cwd: this.options.cwd,
273
+ model: this.options.model,
274
+ permissionMode: this.options.permissionMode,
275
+ toolCount: state.toolPool.length,
276
+ skillCount: state.skills.length,
277
+ mcpServerCount: getAllMCPServers().size,
278
+ pluginCount: 0, // Updated when plugins loaded
279
+ messages: state.messages.length,
280
+ };
281
+ }
282
+ /** Display welcome message in the terminal */
283
+ getWelcomeMessage() {
284
+ return WELCOME_MESSAGE;
285
+ }
286
+ // ─── Cleanup ────────────────────────────────────────────────────────
287
+ /** Gracefully shut down Cray Code */
288
+ async shutdown() {
289
+ this.log('Shutting down Cray Code...');
290
+ // Flush pending session writes
291
+ await flushSessionStorage();
292
+ // Disconnect all MCP servers
293
+ for (const [name, server] of getAllMCPServers()) {
294
+ try {
295
+ await server.disconnect();
296
+ this.log(`Disconnected MCP: ${name}`);
297
+ }
298
+ catch {
299
+ // Force disconnect
300
+ }
301
+ }
302
+ // Execute plugin end hooks
303
+ await executeSessionEndHooks();
304
+ this.emit('shutdown');
305
+ this.removeAllListeners();
306
+ this.initialized = false;
307
+ this.log('Cray Code shutdown complete.');
308
+ }
309
+ // ─── Private Helpers ────────────────────────────────────────────────
310
+ /** Refresh the tool context with current state */
311
+ refreshToolContext() {
312
+ const state = getStore().getState();
313
+ this.toolContext = {
314
+ ...this.toolContext,
315
+ permissionContext: state.permissionContext,
316
+ mcpClients: state.mcpClients,
317
+ availableSkills: state.availableSkills,
318
+ agentDefinitions: state.agentDefinitions,
319
+ messages: state.messages,
320
+ };
321
+ }
322
+ /** Rebuild tool pool after MCP/server changes */
323
+ refreshToolPool() {
324
+ const state = getStore().getState();
325
+ invalidateToolPoolCache();
326
+ const toolPool = buildToolPool(state.permissionContext);
327
+ setAppState((prev) => ({ ...prev, toolPool }));
328
+ }
329
+ /** Debug logging */
330
+ log(message) {
331
+ if (this.options.verbose) {
332
+ console.log(`[Cray] ${message}`);
333
+ }
334
+ }
335
+ }
336
+ // ─── Default Export ──────────────────────────────────────────────────────
337
+ export default CrayCode;
338
+ //# sourceMappingURL=cray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cray.js","sourceRoot":"","sources":["../src/cray.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cray Code — Main Entry Point
4
+ *
5
+ * Always launches the interactive React/Ink terminal UI.
6
+ * If a prompt argument is given, it's sent as the first message
7
+ * and the REPL stays open for follow-up.
8
+ *
9
+ * Usage:
10
+ * cray # Interactive
11
+ * cray "hello" # Interactive, with first message
12
+ * cray --setup # Re-run setup
13
+ * cray --show-welcome # Banner only
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
package/dist/index.js ADDED
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cray Code — Main Entry Point
4
+ *
5
+ * Always launches the interactive React/Ink terminal UI.
6
+ * If a prompt argument is given, it's sent as the first message
7
+ * and the REPL stays open for follow-up.
8
+ *
9
+ * Usage:
10
+ * cray # Interactive
11
+ * cray "hello" # Interactive, with first message
12
+ * cray --setup # Re-run setup
13
+ * cray --show-welcome # Banner only
14
+ */
15
+ import { Command } from 'commander';
16
+ import { resolve } from 'path';
17
+ import CrayCode from './cray.js';
18
+ import { CRAY_LOGO, CRAY_TAGLINE } from './branding/logo.js';
19
+ import { runFirstTimeSetup } from './setup.js';
20
+ import { loadConfig, isSetupComplete } from './utils/configStore.js';
21
+ const program = new Command();
22
+ program
23
+ .name('cray')
24
+ .description(CRAY_TAGLINE)
25
+ .version('1.0.0')
26
+ .argument('[prompt]', 'First message to send, then stay interactive')
27
+ .option('-m, --model <model>', 'Override the configured model')
28
+ .option('-d, --dir <directory>', 'Working directory', 'D:/VSCODE/TEST')
29
+ .option('-p, --permission <mode>', 'Permission mode', 'default')
30
+ .option('-v, --verbose', 'Enable verbose logging', false)
31
+ .option('--max-turns <number>', 'Max agent turns', '25')
32
+ .option('--resume <sessionId>', 'Resume a previous conversation by session ID')
33
+ .option('--setup', 'Re-run the setup wizard')
34
+ .option('--show-welcome', 'Show welcome banner and exit')
35
+ .option('--list-sessions', 'List saved sessions and exit')
36
+ .action(async (prompt, options) => {
37
+ if (options.showWelcome) {
38
+ showWelcome();
39
+ return;
40
+ }
41
+ if (options.setup) {
42
+ await runFirstTimeSetup();
43
+ return;
44
+ }
45
+ // --list-sessions
46
+ if (options.listSessions) {
47
+ const { listSessions } = await import('./services/sessionStorage.js');
48
+ const sessions = await listSessions(resolve(options.dir));
49
+ if (!sessions.length) {
50
+ console.log('No saved sessions.');
51
+ }
52
+ else {
53
+ console.log(`Saved sessions (${sessions.length}):\n`);
54
+ for (let i = 0; i < sessions.length; i++) {
55
+ const s = sessions[i];
56
+ const date = new Date(s.updatedAt).toLocaleString();
57
+ console.log(` ${i + 1}. [${date}] ${s.firstPrompt.slice(0, 80)}`);
58
+ console.log(` ID: ${s.sessionId} · ${s.messageCount} msgs\n`);
59
+ }
60
+ }
61
+ process.exit(0);
62
+ }
63
+ // Ensure setup
64
+ if (!isSetupComplete()) {
65
+ console.clear();
66
+ const config = await runFirstTimeSetup();
67
+ if (!config.setupComplete || !config.apiKey) {
68
+ console.log('\n Setup incomplete. Run `cray --setup` to try again.\n');
69
+ process.exit(0);
70
+ }
71
+ }
72
+ const config = loadConfig();
73
+ const cray = new CrayCode({
74
+ cwd: resolve(options.dir),
75
+ provider: config.provider,
76
+ model: options.model ?? config.model,
77
+ apiKey: config.apiKey,
78
+ baseUrl: config.baseUrl,
79
+ permissionMode: (options.permission ?? config.permissionMode),
80
+ maxTurns: parseInt(options.maxTurns, 10),
81
+ verbose: options.verbose,
82
+ resumeSessionId: options.resume,
83
+ });
84
+ try {
85
+ await cray.initialize();
86
+ await runInteractive(cray, prompt || undefined);
87
+ }
88
+ catch (err) {
89
+ console.error(`\nCray Code error: ${err.message}`);
90
+ if (options.verbose)
91
+ console.error(err.stack);
92
+ process.exit(1);
93
+ }
94
+ finally {
95
+ await cray.shutdown();
96
+ }
97
+ });
98
+ // ─── Interactive (React/Ink terminal UI) ─────────────────────────────
99
+ async function runInteractive(cray, initialPrompt) {
100
+ const { mountReplScreen } = await import('./screens/ReplScreen.js');
101
+ const { unmount } = mountReplScreen(cray, initialPrompt);
102
+ const onSigint = () => cray.shutdown();
103
+ process.once('SIGINT', onSigint);
104
+ await new Promise((resolve) => {
105
+ cray.once('shutdown', () => { unmount(); resolve(); });
106
+ });
107
+ process.off('SIGINT', onSigint);
108
+ }
109
+ // ─── Welcome Banner ──────────────────────────────────────────────────
110
+ function showWelcome() {
111
+ console.log(CRAY_LOGO);
112
+ console.log(` ${CRAY_TAGLINE}`);
113
+ console.log('\n Features:');
114
+ console.log(' - Multi-turn agent loop with tool calling & streaming');
115
+ console.log(' - MCP / Skills / Sub-agent / Plugin systems');
116
+ console.log(' - React/Ink terminal UI with real-time thinking display');
117
+ console.log('\n Providers: Anthropic | OpenAI | Ollama | OpenRouter | DeepSeek | Custom');
118
+ console.log();
119
+ }
120
+ // ─── Startup ─────────────────────────────────────────────────────────
121
+ program.parse();
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}