wave-agent-sdk 0.15.1 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/builtin/skills/loop/SKILL.md +29 -3
  2. package/dist/agent.d.ts +7 -2
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +34 -11
  5. package/dist/constants/tools.d.ts +3 -0
  6. package/dist/constants/tools.d.ts.map +1 -1
  7. package/dist/constants/tools.js +3 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -0
  11. package/dist/managers/aiManager.d.ts +13 -1
  12. package/dist/managers/aiManager.d.ts.map +1 -1
  13. package/dist/managers/aiManager.js +69 -17
  14. package/dist/managers/hookManager.d.ts.map +1 -1
  15. package/dist/managers/hookManager.js +9 -0
  16. package/dist/managers/mcpManager.d.ts +4 -1
  17. package/dist/managers/mcpManager.d.ts.map +1 -1
  18. package/dist/managers/mcpManager.js +25 -5
  19. package/dist/managers/permissionManager.d.ts +0 -2
  20. package/dist/managers/permissionManager.d.ts.map +1 -1
  21. package/dist/managers/permissionManager.js +0 -30
  22. package/dist/managers/slashCommandManager.d.ts +1 -0
  23. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  24. package/dist/managers/slashCommandManager.js +4 -0
  25. package/dist/managers/toolManager.d.ts +6 -0
  26. package/dist/managers/toolManager.d.ts.map +1 -1
  27. package/dist/managers/toolManager.js +41 -1
  28. package/dist/prompts/index.d.ts.map +1 -1
  29. package/dist/prompts/index.js +14 -4
  30. package/dist/services/initializationService.d.ts +0 -2
  31. package/dist/services/initializationService.d.ts.map +1 -1
  32. package/dist/services/initializationService.js +3 -35
  33. package/dist/services/memory.d.ts +6 -0
  34. package/dist/services/memory.d.ts.map +1 -1
  35. package/dist/services/memory.js +27 -14
  36. package/dist/tools/cronCreateTool.d.ts.map +1 -1
  37. package/dist/tools/cronCreateTool.js +71 -6
  38. package/dist/tools/cronDeleteTool.d.ts.map +1 -1
  39. package/dist/tools/cronDeleteTool.js +5 -1
  40. package/dist/tools/cronListTool.d.ts.map +1 -1
  41. package/dist/tools/cronListTool.js +5 -1
  42. package/dist/tools/enterWorktreeTool.d.ts +8 -0
  43. package/dist/tools/enterWorktreeTool.d.ts.map +1 -0
  44. package/dist/tools/enterWorktreeTool.js +144 -0
  45. package/dist/tools/exitWorktreeTool.d.ts +8 -0
  46. package/dist/tools/exitWorktreeTool.d.ts.map +1 -0
  47. package/dist/tools/exitWorktreeTool.js +184 -0
  48. package/dist/tools/taskManagementTools.d.ts.map +1 -1
  49. package/dist/tools/taskManagementTools.js +4 -0
  50. package/dist/tools/toolSearchTool.d.ts +15 -0
  51. package/dist/tools/toolSearchTool.d.ts.map +1 -0
  52. package/dist/tools/toolSearchTool.js +185 -0
  53. package/dist/tools/types.d.ts +19 -0
  54. package/dist/tools/types.d.ts.map +1 -1
  55. package/dist/tools/webFetchTool.d.ts.map +1 -1
  56. package/dist/tools/webFetchTool.js +1 -0
  57. package/dist/types/agent.d.ts +6 -1
  58. package/dist/types/agent.d.ts.map +1 -1
  59. package/dist/types/hooks.d.ts +3 -1
  60. package/dist/types/hooks.d.ts.map +1 -1
  61. package/dist/types/hooks.js +1 -0
  62. package/dist/utils/containerSetup.d.ts.map +1 -1
  63. package/dist/utils/containerSetup.js +4 -6
  64. package/dist/utils/cronToHuman.d.ts +6 -0
  65. package/dist/utils/cronToHuman.d.ts.map +1 -0
  66. package/dist/utils/cronToHuman.js +79 -0
  67. package/dist/utils/isDeferredTool.d.ts +19 -0
  68. package/dist/utils/isDeferredTool.d.ts.map +1 -0
  69. package/dist/utils/isDeferredTool.js +31 -0
  70. package/dist/utils/mcpUtils.d.ts.map +1 -1
  71. package/dist/utils/mcpUtils.js +1 -0
  72. package/dist/utils/parseCronExpression.d.ts +6 -0
  73. package/dist/utils/parseCronExpression.d.ts.map +1 -0
  74. package/dist/utils/parseCronExpression.js +74 -0
  75. package/dist/utils/worktreeSession.d.ts +26 -0
  76. package/dist/utils/worktreeSession.d.ts.map +1 -0
  77. package/dist/utils/worktreeSession.js +14 -0
  78. package/dist/utils/worktreeUtils.d.ts +42 -0
  79. package/dist/utils/worktreeUtils.d.ts.map +1 -0
  80. package/dist/utils/worktreeUtils.js +236 -0
  81. package/package.json +1 -1
  82. package/src/agent.ts +49 -12
  83. package/src/constants/tools.ts +3 -0
  84. package/src/index.ts +1 -0
  85. package/src/managers/aiManager.ts +73 -18
  86. package/src/managers/hookManager.ts +10 -0
  87. package/src/managers/mcpManager.ts +32 -6
  88. package/src/managers/permissionManager.ts +0 -42
  89. package/src/managers/slashCommandManager.ts +6 -0
  90. package/src/managers/toolManager.ts +47 -1
  91. package/src/prompts/index.ts +17 -3
  92. package/src/services/initializationService.ts +2 -41
  93. package/src/services/memory.ts +30 -17
  94. package/src/tools/cronCreateTool.ts +81 -8
  95. package/src/tools/cronDeleteTool.ts +7 -2
  96. package/src/tools/cronListTool.ts +7 -2
  97. package/src/tools/enterWorktreeTool.ts +183 -0
  98. package/src/tools/exitWorktreeTool.ts +242 -0
  99. package/src/tools/taskManagementTools.ts +4 -0
  100. package/src/tools/toolSearchTool.ts +228 -0
  101. package/src/tools/types.ts +19 -0
  102. package/src/tools/webFetchTool.ts +1 -0
  103. package/src/types/agent.ts +6 -0
  104. package/src/types/hooks.ts +4 -0
  105. package/src/utils/containerSetup.ts +7 -8
  106. package/src/utils/cronToHuman.ts +99 -0
  107. package/src/utils/isDeferredTool.ts +36 -0
  108. package/src/utils/mcpUtils.ts +1 -0
  109. package/src/utils/parseCronExpression.ts +78 -0
  110. package/src/utils/worktreeSession.ts +36 -0
  111. package/src/utils/worktreeUtils.ts +288 -0
@@ -0,0 +1,185 @@
1
+ /**
2
+ * ToolSearchTool - Discovers deferred tool schemas on demand.
3
+ *
4
+ * When tool deferral is enabled, deferred tools are not sent to the API.
5
+ * The model must call this tool to discover a deferred tool's full schema
6
+ * before it can invoke it.
7
+ *
8
+ * Query formats:
9
+ * - "select:ToolName" — direct selection by name (comma-separated for multiple)
10
+ * - "notebook jupyter" — keyword search, up to max_results best matches
11
+ * - "+slack send" — require "slack" in the name, rank by remaining terms
12
+ */
13
+ import { isDeferredTool, TOOL_SEARCH_TOOL_NAME, } from "../utils/isDeferredTool.js";
14
+ function formatSchema(tool) {
15
+ const desc = tool.config.function.description || "";
16
+ const params = JSON.stringify(tool.config.function.parameters || {}, null, 2);
17
+ return `${tool.name}: ${desc}\nParameters: ${params}`;
18
+ }
19
+ /**
20
+ * Parse tool name into searchable parts (handles CamelCase and underscores).
21
+ */
22
+ function parseToolName(name) {
23
+ return name
24
+ .replace(/([a-z])([A-Z])/g, "$1 $2") // CamelCase to spaces
25
+ .replace(/_/g, " ")
26
+ .toLowerCase()
27
+ .split(/\s+/)
28
+ .filter(Boolean);
29
+ }
30
+ /**
31
+ * Keyword search over deferred tools by name and description.
32
+ * Matches Claude Code's scoring: required terms (+prefix) must all match,
33
+ * optional terms contribute to ranking.
34
+ */
35
+ function keywordSearch(query, deferredTools, maxResults) {
36
+ const queryLower = query.toLowerCase().trim();
37
+ const queryTerms = queryLower.split(/\s+/).filter(Boolean);
38
+ // Exact match fast path
39
+ const exact = deferredTools.find((t) => t.name.toLowerCase() === queryLower);
40
+ if (exact)
41
+ return [exact];
42
+ // Partition into required (+prefixed) and optional terms
43
+ const requiredTerms = [];
44
+ const optionalTerms = [];
45
+ for (const term of queryTerms) {
46
+ if (term.startsWith("+") && term.length > 1) {
47
+ requiredTerms.push(term.slice(1));
48
+ }
49
+ else {
50
+ optionalTerms.push(term);
51
+ }
52
+ }
53
+ const allScoringTerms = requiredTerms.length > 0
54
+ ? [...requiredTerms, ...optionalTerms]
55
+ : queryTerms;
56
+ // Pre-filter to tools matching ALL required terms
57
+ let candidateTools = deferredTools;
58
+ if (requiredTerms.length > 0) {
59
+ candidateTools = deferredTools.filter((tool) => {
60
+ const parts = parseToolName(tool.name);
61
+ const desc = (tool.config.function.description || "").toLowerCase();
62
+ return requiredTerms.every((term) => parts.includes(term) ||
63
+ parts.some((p) => p.includes(term)) ||
64
+ desc.includes(term));
65
+ });
66
+ }
67
+ // Score each tool
68
+ const scored = candidateTools
69
+ .map((tool) => {
70
+ const parts = parseToolName(tool.name);
71
+ const desc = (tool.config.function.description || "").toLowerCase();
72
+ let score = 0;
73
+ for (const term of allScoringTerms) {
74
+ // Exact part match (high weight)
75
+ if (parts.includes(term)) {
76
+ score += tool.isMcp ? 12 : 10;
77
+ }
78
+ else if (parts.some((p) => p.includes(term))) {
79
+ score += tool.isMcp ? 6 : 5;
80
+ }
81
+ // Full name fallback
82
+ if (tool.name.toLowerCase().includes(term) && score === 0) {
83
+ score += 3;
84
+ }
85
+ // Description match
86
+ if (desc.includes(term)) {
87
+ score += 2;
88
+ }
89
+ }
90
+ return { tool, score };
91
+ })
92
+ .filter((s) => s.score > 0)
93
+ .sort((a, b) => b.score - a.score)
94
+ .slice(0, maxResults)
95
+ .map((s) => s.tool);
96
+ return scored;
97
+ }
98
+ export const toolSearchTool = {
99
+ name: TOOL_SEARCH_TOOL_NAME,
100
+ config: {
101
+ type: "function",
102
+ function: {
103
+ name: TOOL_SEARCH_TOOL_NAME,
104
+ description: `Fetches full schema definitions for deferred tools so they can be called.
105
+
106
+ Deferred tools appear by name in <available-deferred-tools> messages. Until fetched, only the name is known — there is no parameter schema, so the tool cannot be invoked. This tool takes a query, matches it against the deferred tool list, and returns the matched tools' complete JSONSchema definitions inside a <functions> block. Once a tool's schema appears in that result, it is callable exactly like any tool defined at the top of the prompt.
107
+
108
+ Result format: each matched tool appears as one <function>{"description": "...", "name": "...", "parameters": {...}}`,
109
+ },
110
+ },
111
+ shouldDefer: false, // Always available
112
+ execute: async (args, context) => {
113
+ const { query, max_results = 5 } = args;
114
+ if (!query) {
115
+ return {
116
+ success: false,
117
+ content: "",
118
+ error: "Missing required 'query' parameter",
119
+ };
120
+ }
121
+ if (!context.toolManager) {
122
+ return {
123
+ success: false,
124
+ content: "",
125
+ error: "ToolManager not available in context",
126
+ };
127
+ }
128
+ const allTools = context.toolManager.list();
129
+ const deferredTools = allTools.filter(isDeferredTool);
130
+ // Handle select: prefix
131
+ const selectMatch = query.match(/^select:(.+)$/i);
132
+ if (selectMatch) {
133
+ const requested = selectMatch[1]
134
+ .split(",")
135
+ .map((s) => s.trim())
136
+ .filter(Boolean);
137
+ const found = [];
138
+ const missing = [];
139
+ for (const toolName of requested) {
140
+ const tool = deferredTools.find((t) => t.name === toolName) ??
141
+ allTools.find((t) => t.name === toolName);
142
+ if (tool) {
143
+ if (!found.some((f) => f.name === tool.name))
144
+ found.push(tool);
145
+ }
146
+ else {
147
+ missing.push(toolName);
148
+ }
149
+ }
150
+ if (found.length === 0) {
151
+ return {
152
+ success: false,
153
+ content: "",
154
+ error: `No matching deferred tools found for: ${missing.join(", ")}`,
155
+ };
156
+ }
157
+ const result = found.map(formatSchema).join("\n\n---\n\n");
158
+ const shortResult = `Discovered tools: ${found.map((t) => t.name).join(", ")}`;
159
+ return {
160
+ success: true,
161
+ content: result,
162
+ shortResult,
163
+ };
164
+ }
165
+ // Keyword search
166
+ const matches = keywordSearch(query, deferredTools, max_results);
167
+ if (matches.length === 0) {
168
+ return {
169
+ success: false,
170
+ content: "",
171
+ error: `No matching deferred tools found for query: "${query}". Available deferred tools: ${getDeferredToolNamesList(deferredTools)}`,
172
+ };
173
+ }
174
+ const result = matches.map(formatSchema).join("\n\n---\n\n");
175
+ const shortResult = `Found ${matches.length} tools: ${matches.map((t) => t.name).join(", ")}`;
176
+ return {
177
+ success: true,
178
+ content: result,
179
+ shortResult,
180
+ };
181
+ },
182
+ };
183
+ function getDeferredToolNamesList(tools) {
184
+ return tools.map((t) => t.name).join(", ");
185
+ }
@@ -19,6 +19,21 @@ export interface ToolPlugin {
19
19
  workdir?: string;
20
20
  isSubagent?: boolean;
21
21
  }) => string;
22
+ /**
23
+ * When true, this tool is deferred — it's not sent to the API until the model
24
+ * discovers it via ToolSearch. MCP tools are always deferred.
25
+ */
26
+ shouldDefer?: boolean;
27
+ /**
28
+ * When true, this tool is never deferred — its full schema always appears in
29
+ * the initial prompt even when tool search is enabled.
30
+ */
31
+ alwaysLoad?: boolean;
32
+ /**
33
+ * When true, this is an MCP tool (auto-set by McpManager). MCP tools are
34
+ * always deferred unless they have alwaysLoad: true.
35
+ */
36
+ isMcp?: boolean;
22
37
  }
23
38
  export interface ToolResult {
24
39
  success: boolean;
@@ -38,6 +53,8 @@ export interface ToolContext {
38
53
  abortSignal?: AbortSignal;
39
54
  backgroundTaskManager?: import("../managers/backgroundTaskManager.js").BackgroundTaskManager;
40
55
  workdir: string;
56
+ /** Tool manager instance for tool discovery (used by ToolSearchTool) */
57
+ toolManager?: import("../managers/toolManager.js").ToolManager;
41
58
  /** Permission mode for this tool execution */
42
59
  permissionMode?: PermissionMode;
43
60
  /** Custom permission callback */
@@ -86,5 +103,7 @@ export interface ToolContext {
86
103
  mtime: number;
87
104
  hash: string;
88
105
  }>;
106
+ /** Hook manager instance for executing hooks */
107
+ hookManager?: import("../managers/hookManager.js").HookManager;
89
108
  }
90
109
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,WAAW,KACjB,MAAM,CAAC;IACZ;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QACf,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,KAAK,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IAEH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,sCAAsC,EAAE,qBAAqB,CAAC;IAC7F,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iCAAiC;IACjC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,OAAO,kCAAkC,EAAE,iBAAiB,CAAC;IACjF,iDAAiD;IACjD,UAAU,CAAC,EAAE,OAAO,2BAA2B,EAAE,UAAU,CAAC;IAC5D,iDAAiD;IACjD,UAAU,CAAC,EAAE,OAAO,iBAAiB,EAAE,WAAW,CAAC;IACnD,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,OAAO,iCAAiC,EAAE,gBAAgB,CAAC;IAC9E,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,OAAO,uBAAuB,EAAE,sBAAsB,CAAC;IAC/E,gDAAgD;IAChD,WAAW,EAAE,OAAO,4BAA4B,EAAE,WAAW,CAAC;IAC9D,qDAAqD;IACrD,eAAe,CAAC,EAAE,OAAO,gCAAgC,EAAE,eAAe,CAAC;IAC3E,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,6BAA6B,EAAE,YAAY,CAAC;IAClE,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,4BAA4B,EAAE,WAAW,CAAC;IAC/D,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,0BAA0B,EAAE,SAAS,CAAC;IACzD,4CAA4C;IAC5C,SAAS,CAAC,EAAE,cAAc,0BAA0B,CAAC,CAAC;IACtD,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,+BAA+B,EAAE,cAAc,CAAC;IACxE,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,mEAAmE;IACnE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,yCAAyC;IACzC,iBAAiB,CAAC,EAAE;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,mEAAmE;IACnE,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webFetchTool.d.ts","sourceRoot":"","sources":["../../src/tools/webFetchTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAoGtE,eAAO,MAAM,YAAY,EAAE,UAoL1B,CAAC"}
1
+ {"version":3,"file":"webFetchTool.d.ts","sourceRoot":"","sources":["../../src/tools/webFetchTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAoGtE,eAAO,MAAM,YAAY,EAAE,UAqL1B,CAAC"}
@@ -77,6 +77,7 @@ const GITHUB_URL_ERROR = "For GitHub URLs, please use the 'gh' CLI via the Bash
77
77
  // --- Tool ---
78
78
  export const webFetchTool = {
79
79
  name: WEB_FETCH_TOOL_NAME,
80
+ shouldDefer: true,
80
81
  config: {
81
82
  type: "function",
82
83
  function: {
@@ -1,6 +1,6 @@
1
1
  import type { ClientOptions } from "openai";
2
2
  import type { QueuedMessage } from "../managers/messageQueue.js";
3
- import type { Message, Logger, PermissionMode, PermissionCallback, ILspManager, PluginConfig, BackgroundTask } from "./index.js";
3
+ import type { Message, Logger, PermissionMode, PermissionCallback, ILspManager, PluginConfig, BackgroundTask, McpServerConfig } from "./index.js";
4
4
  import type { MessageManagerCallbacks } from "../managers/messageManager.js";
5
5
  import type { BackgroundTaskManagerCallbacks } from "../managers/backgroundTaskManager.js";
6
6
  import type { McpManagerCallbacks } from "../managers/mcpManager.js";
@@ -66,6 +66,11 @@ export interface AgentOptions {
66
66
  * These rules follow the standard permission rule syntax: `ToolName` or `ToolName(pattern)`.
67
67
  */
68
68
  disallowedTools?: string[];
69
+ /**
70
+ * Optional MCP server configs to connect at startup.
71
+ * Overrides .mcp.json for specified server names.
72
+ */
73
+ mcpServers?: Record<string, McpServerConfig>;
69
74
  [key: string]: unknown;
70
75
  }
71
76
  export interface AgentCallbacks extends MessageManagerCallbacks, BackgroundTaskManagerCallbacks, McpManagerCallbacks, SubagentManagerCallbacks {
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * enabling automated actions at specific workflow points.
6
6
  */
7
7
  export type { WaveConfiguration, HookConfiguration, PartialHookConfiguration, HookConfigurationRecord, } from "./configuration.js";
8
- export type HookEvent = "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop" | "SubagentStop" | "PermissionRequest" | "WorktreeCreate" | "SessionStart" | "SessionEnd";
8
+ export type HookEvent = "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop" | "SubagentStop" | "PermissionRequest" | "WorktreeCreate" | "WorktreeRemove" | "SessionStart" | "SessionEnd";
9
9
  export interface HookCommand {
10
10
  type: "command";
11
11
  command: string;
@@ -22,6 +22,8 @@ export interface HookExecutionContext {
22
22
  toolName?: string;
23
23
  projectDir: string;
24
24
  timestamp: Date;
25
+ worktreeName?: string;
26
+ worktreePath?: string;
25
27
  }
26
28
  export interface HookExecutionResult {
27
29
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,MAAM,GACN,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,YAAY,CAAC;AAGjB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAGD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAGD,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,WAAW,EAAE,MAAM;aACnB,aAAa,EAAE,KAAK;aACpB,OAAO,EAAE,oBAAoB;gBAF7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,KAAK,EACpB,OAAO,EAAE,oBAAoB;CAKhD;AAGD,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,UAAU,EAAE,MAAM;aAClB,gBAAgB,EAAE,MAAM,EAAE;gBAD1B,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE;CAO7C;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAG3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAalE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CA4BnE;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,eAAe,CAa3B;AAGD,MAAM,WAAW,aAAa;IAE5B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,SAAS,CAAC;IAG3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAGD,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAGD,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB"}
@@ -33,6 +33,7 @@ export function isValidHookEvent(event) {
33
33
  "SubagentStop",
34
34
  "PermissionRequest",
35
35
  "WorktreeCreate",
36
+ "WorktreeRemove",
36
37
  "SessionStart",
37
38
  "SessionEnd",
38
39
  ].includes(event);
@@ -1 +1 @@
1
- {"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwB3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,CAuQX"}
1
+ {"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwB3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAK3E,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,CAuQX"}
@@ -25,7 +25,6 @@ import { LiveConfigManager } from "../managers/liveConfigManager.js";
25
25
  import { ReversionService } from "../services/reversionService.js";
26
26
  import { MemoryService } from "../services/memory.js";
27
27
  import { AutoMemoryService } from "../services/autoMemoryService.js";
28
- import { getGitMainRepoRoot } from "./gitUtils.js";
29
28
  import { USER_MEMORY_FILE } from "./constants.js";
30
29
  import { logger } from "./globalLogger.js";
31
30
  export function setupAgentContainer(setupOptions) {
@@ -41,10 +40,6 @@ export function setupAgentContainer(setupOptions) {
41
40
  const foregroundTaskManager = new ForegroundTaskManager(container);
42
41
  container.register("ForegroundTaskManager", foregroundTaskManager);
43
42
  container.register("ConfigurationService", configurationService);
44
- if (options.worktreeName) {
45
- container.register("WorktreeName", options.worktreeName);
46
- container.register("MainRepoRoot", getGitMainRepoRoot(workdir));
47
- }
48
43
  const memoryService = new MemoryService(container);
49
44
  container.register("MemoryService", memoryService);
50
45
  const autoMemoryService = new AutoMemoryService(container);
@@ -88,7 +83,10 @@ export function setupAgentContainer(setupOptions) {
88
83
  workdir,
89
84
  });
90
85
  container.register("BackgroundTaskManager", backgroundTaskManager);
91
- const mcpManager = new McpManager(container, { callbacks });
86
+ const mcpManager = new McpManager(container, {
87
+ callbacks,
88
+ mcpServers: options.mcpServers,
89
+ });
92
90
  container.register("McpManager", mcpManager);
93
91
  const lspManager = options.lspManager || new LspManager(container);
94
92
  container.register("LspManager", lspManager);
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Convert a cron expression to a human-readable string.
3
+ * Covers common patterns; falls through to raw cron for anything else.
4
+ */
5
+ export declare function cronToHuman(cron: string): string;
6
+ //# sourceMappingURL=cronToHuman.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cronToHuman.d.ts","sourceRoot":"","sources":["../../src/utils/cronToHuman.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2EhD"}
@@ -0,0 +1,79 @@
1
+ // Human-readable cron expression display.
2
+ // Intentionally narrow: covers common patterns; falls through to raw cron
3
+ // string for anything else. Based on Claude Code's cronToHuman implementation.
4
+ const DAY_NAMES = [
5
+ "Sunday",
6
+ "Monday",
7
+ "Tuesday",
8
+ "Wednesday",
9
+ "Thursday",
10
+ "Friday",
11
+ "Saturday",
12
+ ];
13
+ function formatLocalTime(minute, hour) {
14
+ const d = new Date(2000, 0, 1, hour, minute);
15
+ return d.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" });
16
+ }
17
+ /**
18
+ * Convert a cron expression to a human-readable string.
19
+ * Covers common patterns; falls through to raw cron for anything else.
20
+ */
21
+ export function cronToHuman(cron) {
22
+ const parts = cron.trim().split(/\s+/);
23
+ if (parts.length !== 5)
24
+ return cron;
25
+ const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;
26
+ // Every N minutes: step/N * * * *
27
+ const everyMinMatch = minute.match(/^\*\/(\d+)$/);
28
+ if (everyMinMatch &&
29
+ hour === "*" &&
30
+ dayOfMonth === "*" &&
31
+ month === "*" &&
32
+ dayOfWeek === "*") {
33
+ const n = parseInt(everyMinMatch[1], 10);
34
+ return n === 1 ? "Every minute" : `Every ${n} minutes`;
35
+ }
36
+ // Every hour: 0 * * * *
37
+ if (minute.match(/^\d+$/) &&
38
+ hour === "*" &&
39
+ dayOfMonth === "*" &&
40
+ month === "*" &&
41
+ dayOfWeek === "*") {
42
+ const m = parseInt(minute, 10);
43
+ if (m === 0)
44
+ return "Every hour";
45
+ return `Every hour at :${m.toString().padStart(2, "0")}`;
46
+ }
47
+ // Every N hours: 0 step/N * * *
48
+ const everyHourMatch = hour.match(/^\*\/(\d+)$/);
49
+ if (minute.match(/^\d+$/) &&
50
+ everyHourMatch &&
51
+ dayOfMonth === "*" &&
52
+ month === "*" &&
53
+ dayOfWeek === "*") {
54
+ const n = parseInt(everyHourMatch[1], 10);
55
+ const m = parseInt(minute, 10);
56
+ const suffix = m === 0 ? "" : ` at :${m.toString().padStart(2, "0")}`;
57
+ return n === 1 ? `Every hour${suffix}` : `Every ${n} hours${suffix}`;
58
+ }
59
+ if (!minute.match(/^\d+$/) || !hour.match(/^\d+$/))
60
+ return cron;
61
+ const m = parseInt(minute, 10);
62
+ const h = parseInt(hour, 10);
63
+ // Daily at specific time: M H * * *
64
+ if (dayOfMonth === "*" && month === "*" && dayOfWeek === "*") {
65
+ return `Every day at ${formatLocalTime(m, h)}`;
66
+ }
67
+ // Specific day of week: M H * * D
68
+ if (dayOfMonth === "*" && month === "*" && dayOfWeek.match(/^\d$/)) {
69
+ const dayIndex = parseInt(dayOfWeek, 10) % 7;
70
+ const dayName = DAY_NAMES[dayIndex];
71
+ if (dayName)
72
+ return `Every ${dayName} at ${formatLocalTime(m, h)}`;
73
+ }
74
+ // Weekdays: M H * * 1-5
75
+ if (dayOfMonth === "*" && month === "*" && dayOfWeek === "1-5") {
76
+ return `Weekdays at ${formatLocalTime(m, h)}`;
77
+ }
78
+ return cron;
79
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Determines if a tool should be deferred (not sent to the API until discovered).
3
+ *
4
+ * A tool is deferred if:
5
+ * - It has shouldDefer: true
6
+ * - It is an MCP tool (isMcp: true)
7
+ *
8
+ * A tool is NEVER deferred if:
9
+ * - It has alwaysLoad: true
10
+ * - It is the ToolSearch tool itself (must always be available)
11
+ */
12
+ import type { ToolPlugin } from "../tools/types.js";
13
+ export declare const TOOL_SEARCH_TOOL_NAME = "ToolSearch";
14
+ export declare function isDeferredTool(tool: ToolPlugin): boolean;
15
+ /**
16
+ * Get the list of deferred tool names from a tools array.
17
+ */
18
+ export declare function getDeferredToolNames(tools: ToolPlugin[]): string[];
19
+ //# sourceMappingURL=isDeferredTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isDeferredTool.d.ts","sourceRoot":"","sources":["../../src/utils/isDeferredTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAYxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAElE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Determines if a tool should be deferred (not sent to the API until discovered).
3
+ *
4
+ * A tool is deferred if:
5
+ * - It has shouldDefer: true
6
+ * - It is an MCP tool (isMcp: true)
7
+ *
8
+ * A tool is NEVER deferred if:
9
+ * - It has alwaysLoad: true
10
+ * - It is the ToolSearch tool itself (must always be available)
11
+ */
12
+ export const TOOL_SEARCH_TOOL_NAME = "ToolSearch";
13
+ export function isDeferredTool(tool) {
14
+ // Never defer if explicitly marked as alwaysLoad
15
+ if (tool.alwaysLoad === true)
16
+ return false;
17
+ // Never defer ToolSearch itself — the model needs it to discover other tools
18
+ if (tool.name === TOOL_SEARCH_TOOL_NAME)
19
+ return false;
20
+ // MCP tools are always deferred (workflow-specific, potentially many)
21
+ if (tool.isMcp === true)
22
+ return true;
23
+ // Defer if marked with shouldDefer flag
24
+ return tool.shouldDefer === true;
25
+ }
26
+ /**
27
+ * Get the list of deferred tool names from a tools array.
28
+ */
29
+ export function getDeferredToolNames(tools) {
30
+ return tools.filter(isDeferredTool).map((t) => t.name);
31
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"mcpUtils.d.ts","sourceRoot":"","sources":["../../src/utils/mcpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA8ClE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B,CAgB5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,KAClB,OAAO,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC,GACD,UAAU,CAwBZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EAAE,GACzB,eAAe,GAAG,SAAS,CAK7B"}
1
+ {"version":3,"file":"mcpUtils.d.ts","sourceRoot":"","sources":["../../src/utils/mcpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA8ClE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B,CAgB5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,KAClB,OAAO,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC,GACD,UAAU,CAyBZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EAAE,GACzB,eAAe,GAAG,SAAS,CAK7B"}
@@ -57,6 +57,7 @@ export function createMcpToolPlugin(mcpTool, serverName, executeTool) {
57
57
  return {
58
58
  name: prefixedName,
59
59
  config: mcpToolToOpenAITool(mcpTool, serverName),
60
+ isMcp: true, // MCP tools are always deferred
60
61
  async execute(args, context) {
61
62
  try {
62
63
  const result = await executeTool(prefixedName, args, context);
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Validate a 5-field cron expression.
3
+ * Returns true if valid, false otherwise.
4
+ */
5
+ export declare function parseCronExpression(expr: string): boolean;
6
+ //# sourceMappingURL=parseCronExpression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseCronExpression.d.ts","sourceRoot":"","sources":["../../src/utils/parseCronExpression.ts"],"names":[],"mappings":"AA+DA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUzD"}
@@ -0,0 +1,74 @@
1
+ // Minimal cron expression validation.
2
+ // Supports the standard 5-field cron subset:
3
+ // minute hour day-of-month month day-of-week
4
+ //
5
+ // Field syntax: wildcard, N, step (star-slash-N), range (N-M), list (N,M,...).
6
+ // No L, W, ?, or name aliases. Based on Claude Code's parseCronExpression.
7
+ const FIELD_RANGES = [
8
+ { min: 0, max: 59 }, // minute
9
+ { min: 0, max: 23 }, // hour
10
+ { min: 1, max: 31 }, // dayOfMonth
11
+ { min: 1, max: 12 }, // month
12
+ { min: 0, max: 6 }, // dayOfWeek (0=Sunday; 7 accepted as Sunday alias)
13
+ ];
14
+ function expandField(field, range) {
15
+ const { min, max } = range;
16
+ const out = new Set();
17
+ for (const part of field.split(",")) {
18
+ // wildcard or star-slash-N
19
+ const stepMatch = part.match(/^\*(?:\/(\d+))?$/);
20
+ if (stepMatch) {
21
+ const step = stepMatch[1] ? parseInt(stepMatch[1], 10) : 1;
22
+ if (step < 1)
23
+ return null;
24
+ for (let i = min; i <= max; i += step)
25
+ out.add(i);
26
+ continue;
27
+ }
28
+ // N-M or N-M/S
29
+ const rangeMatch = part.match(/^(\d+)-(\d+)(?:\/(\d+))?$/);
30
+ if (rangeMatch) {
31
+ const lo = parseInt(rangeMatch[1], 10);
32
+ const hi = parseInt(rangeMatch[2], 10);
33
+ const step = rangeMatch[3] ? parseInt(rangeMatch[3], 10) : 1;
34
+ const isDow = min === 0 && max === 6;
35
+ const effMax = isDow ? 7 : max;
36
+ if (lo > hi || step < 1 || lo < min || hi > effMax)
37
+ return null;
38
+ for (let i = lo; i <= hi; i += step) {
39
+ out.add(isDow && i === 7 ? 0 : i);
40
+ }
41
+ continue;
42
+ }
43
+ // plain N
44
+ const singleMatch = part.match(/^\d+$/);
45
+ if (singleMatch) {
46
+ let n = parseInt(part, 10);
47
+ if (min === 0 && max === 6 && n === 7)
48
+ n = 0;
49
+ if (n < min || n > max)
50
+ return null;
51
+ out.add(n);
52
+ continue;
53
+ }
54
+ return null;
55
+ }
56
+ if (out.size === 0)
57
+ return null;
58
+ return Array.from(out).sort((a, b) => a - b);
59
+ }
60
+ /**
61
+ * Validate a 5-field cron expression.
62
+ * Returns true if valid, false otherwise.
63
+ */
64
+ export function parseCronExpression(expr) {
65
+ const parts = expr.trim().split(/\s+/);
66
+ if (parts.length !== 5)
67
+ return false;
68
+ for (let i = 0; i < 5; i++) {
69
+ const result = expandField(parts[i], FIELD_RANGES[i]);
70
+ if (!result)
71
+ return false;
72
+ }
73
+ return true;
74
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Module-level worktree session state tracking.
3
+ * Analogous to Claude Code's currentWorktreeSession in worktree.ts.
4
+ *
5
+ * Tracks whether the current session entered a worktree via EnterWorktree tool,
6
+ * so ExitWorktree can validate scope and restore the original CWD.
7
+ */
8
+ export interface WorktreeSession {
9
+ /** The working directory the session was in before EnterWorktree */
10
+ originalCwd: string;
11
+ /** Path to the worktree directory */
12
+ worktreePath: string;
13
+ /** Git branch name for the worktree */
14
+ worktreeBranch: string;
15
+ /** User-provided or auto-generated worktree name */
16
+ worktreeName: string;
17
+ /** Whether this worktree was newly created (vs resumed existing) */
18
+ isNew: boolean;
19
+ /** The canonical git repo root */
20
+ repoRoot: string;
21
+ /** The HEAD commit of the original branch at worktree creation time */
22
+ originalHeadCommit?: string;
23
+ }
24
+ export declare function getCurrentWorktreeSession(): WorktreeSession | null;
25
+ export declare function setCurrentWorktreeSession(session: WorktreeSession | null): void;
26
+ //# sourceMappingURL=worktreeSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeSession.d.ts","sourceRoot":"","sources":["../../src/utils/worktreeSession.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,yBAAyB,IAAI,eAAe,GAAG,IAAI,CAElE;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,GAAG,IAAI,GAC9B,IAAI,CAEN"}