sylas-edge-worker 0.2.21

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 (163) hide show
  1. package/README.md +293 -0
  2. package/dist/ActivityPoster.d.ts +15 -0
  3. package/dist/ActivityPoster.d.ts.map +1 -0
  4. package/dist/ActivityPoster.js +194 -0
  5. package/dist/ActivityPoster.js.map +1 -0
  6. package/dist/AgentSessionManager.d.ts +280 -0
  7. package/dist/AgentSessionManager.d.ts.map +1 -0
  8. package/dist/AgentSessionManager.js +1412 -0
  9. package/dist/AgentSessionManager.js.map +1 -0
  10. package/dist/AskUserQuestionHandler.d.ts +97 -0
  11. package/dist/AskUserQuestionHandler.d.ts.map +1 -0
  12. package/dist/AskUserQuestionHandler.js +206 -0
  13. package/dist/AskUserQuestionHandler.js.map +1 -0
  14. package/dist/AttachmentService.d.ts +69 -0
  15. package/dist/AttachmentService.d.ts.map +1 -0
  16. package/dist/AttachmentService.js +369 -0
  17. package/dist/AttachmentService.js.map +1 -0
  18. package/dist/ChatSessionHandler.d.ts +87 -0
  19. package/dist/ChatSessionHandler.d.ts.map +1 -0
  20. package/dist/ChatSessionHandler.js +231 -0
  21. package/dist/ChatSessionHandler.js.map +1 -0
  22. package/dist/ConfigManager.d.ts +91 -0
  23. package/dist/ConfigManager.d.ts.map +1 -0
  24. package/dist/ConfigManager.js +227 -0
  25. package/dist/ConfigManager.js.map +1 -0
  26. package/dist/EdgeWorker.d.ts +670 -0
  27. package/dist/EdgeWorker.d.ts.map +1 -0
  28. package/dist/EdgeWorker.js +3801 -0
  29. package/dist/EdgeWorker.js.map +1 -0
  30. package/dist/GitService.d.ts +39 -0
  31. package/dist/GitService.d.ts.map +1 -0
  32. package/dist/GitService.js +432 -0
  33. package/dist/GitService.js.map +1 -0
  34. package/dist/GlobalSessionRegistry.d.ts +142 -0
  35. package/dist/GlobalSessionRegistry.d.ts.map +1 -0
  36. package/dist/GlobalSessionRegistry.js +254 -0
  37. package/dist/GlobalSessionRegistry.js.map +1 -0
  38. package/dist/PromptBuilder.d.ts +175 -0
  39. package/dist/PromptBuilder.d.ts.map +1 -0
  40. package/dist/PromptBuilder.js +884 -0
  41. package/dist/PromptBuilder.js.map +1 -0
  42. package/dist/RepositoryRouter.d.ts +152 -0
  43. package/dist/RepositoryRouter.d.ts.map +1 -0
  44. package/dist/RepositoryRouter.js +480 -0
  45. package/dist/RepositoryRouter.js.map +1 -0
  46. package/dist/RunnerSelectionService.d.ts +62 -0
  47. package/dist/RunnerSelectionService.d.ts.map +1 -0
  48. package/dist/RunnerSelectionService.js +379 -0
  49. package/dist/RunnerSelectionService.js.map +1 -0
  50. package/dist/SharedApplicationServer.d.ts +107 -0
  51. package/dist/SharedApplicationServer.d.ts.map +1 -0
  52. package/dist/SharedApplicationServer.js +247 -0
  53. package/dist/SharedApplicationServer.js.map +1 -0
  54. package/dist/SharedWebhookServer.d.ts +39 -0
  55. package/dist/SharedWebhookServer.d.ts.map +1 -0
  56. package/dist/SharedWebhookServer.js +150 -0
  57. package/dist/SharedWebhookServer.js.map +1 -0
  58. package/dist/SlackChatAdapter.d.ts +25 -0
  59. package/dist/SlackChatAdapter.d.ts.map +1 -0
  60. package/dist/SlackChatAdapter.js +143 -0
  61. package/dist/SlackChatAdapter.js.map +1 -0
  62. package/dist/UserAccessControl.d.ts +69 -0
  63. package/dist/UserAccessControl.d.ts.map +1 -0
  64. package/dist/UserAccessControl.js +171 -0
  65. package/dist/UserAccessControl.js.map +1 -0
  66. package/dist/WorktreeIncludeService.d.ts +32 -0
  67. package/dist/WorktreeIncludeService.d.ts.map +1 -0
  68. package/dist/WorktreeIncludeService.js +123 -0
  69. package/dist/WorktreeIncludeService.js.map +1 -0
  70. package/dist/index.d.ts +22 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +17 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/label-prompt-template.md +27 -0
  75. package/dist/procedures/ProcedureAnalyzer.d.ts +69 -0
  76. package/dist/procedures/ProcedureAnalyzer.d.ts.map +1 -0
  77. package/dist/procedures/ProcedureAnalyzer.js +271 -0
  78. package/dist/procedures/ProcedureAnalyzer.js.map +1 -0
  79. package/dist/procedures/index.d.ts +7 -0
  80. package/dist/procedures/index.d.ts.map +1 -0
  81. package/dist/procedures/index.js +7 -0
  82. package/dist/procedures/index.js.map +1 -0
  83. package/dist/procedures/registry.d.ts +156 -0
  84. package/dist/procedures/registry.d.ts.map +1 -0
  85. package/dist/procedures/registry.js +240 -0
  86. package/dist/procedures/registry.js.map +1 -0
  87. package/dist/procedures/types.d.ts +103 -0
  88. package/dist/procedures/types.d.ts.map +1 -0
  89. package/dist/procedures/types.js +5 -0
  90. package/dist/procedures/types.js.map +1 -0
  91. package/dist/prompt-assembly/types.d.ts +80 -0
  92. package/dist/prompt-assembly/types.d.ts.map +1 -0
  93. package/dist/prompt-assembly/types.js +8 -0
  94. package/dist/prompt-assembly/types.js.map +1 -0
  95. package/dist/prompts/builder.md +191 -0
  96. package/dist/prompts/debugger.md +128 -0
  97. package/dist/prompts/graphite-orchestrator.md +362 -0
  98. package/dist/prompts/orchestrator.md +290 -0
  99. package/dist/prompts/scoper.md +95 -0
  100. package/dist/prompts/standard-issue-assigned-user-prompt.md +33 -0
  101. package/dist/prompts/subroutines/changelog-update.md +79 -0
  102. package/dist/prompts/subroutines/coding-activity.md +12 -0
  103. package/dist/prompts/subroutines/concise-summary.md +67 -0
  104. package/dist/prompts/subroutines/debugger-fix.md +92 -0
  105. package/dist/prompts/subroutines/debugger-reproduction.md +74 -0
  106. package/dist/prompts/subroutines/full-delegation.md +68 -0
  107. package/dist/prompts/subroutines/get-approval.md +175 -0
  108. package/dist/prompts/subroutines/gh-pr.md +80 -0
  109. package/dist/prompts/subroutines/git-commit.md +37 -0
  110. package/dist/prompts/subroutines/plan-summary.md +21 -0
  111. package/dist/prompts/subroutines/preparation.md +16 -0
  112. package/dist/prompts/subroutines/question-answer.md +8 -0
  113. package/dist/prompts/subroutines/question-investigation.md +8 -0
  114. package/dist/prompts/subroutines/release-execution.md +81 -0
  115. package/dist/prompts/subroutines/release-summary.md +60 -0
  116. package/dist/prompts/subroutines/user-testing-summary.md +87 -0
  117. package/dist/prompts/subroutines/user-testing.md +48 -0
  118. package/dist/prompts/subroutines/validation-fixer.md +56 -0
  119. package/dist/prompts/subroutines/verbose-summary.md +46 -0
  120. package/dist/prompts/subroutines/verifications.md +77 -0
  121. package/dist/prompts/todolist-system-prompt-extension.md +15 -0
  122. package/dist/sinks/IActivitySink.d.ts +60 -0
  123. package/dist/sinks/IActivitySink.d.ts.map +1 -0
  124. package/dist/sinks/IActivitySink.js +2 -0
  125. package/dist/sinks/IActivitySink.js.map +1 -0
  126. package/dist/sinks/LinearActivitySink.d.ts +69 -0
  127. package/dist/sinks/LinearActivitySink.d.ts.map +1 -0
  128. package/dist/sinks/LinearActivitySink.js +111 -0
  129. package/dist/sinks/LinearActivitySink.js.map +1 -0
  130. package/dist/sinks/NoopActivitySink.d.ts +13 -0
  131. package/dist/sinks/NoopActivitySink.d.ts.map +1 -0
  132. package/dist/sinks/NoopActivitySink.js +17 -0
  133. package/dist/sinks/NoopActivitySink.js.map +1 -0
  134. package/dist/sinks/index.d.ts +9 -0
  135. package/dist/sinks/index.d.ts.map +1 -0
  136. package/dist/sinks/index.js +8 -0
  137. package/dist/sinks/index.js.map +1 -0
  138. package/dist/types.d.ts +32 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +2 -0
  141. package/dist/types.js.map +1 -0
  142. package/dist/validation/ValidationLoopController.d.ts +54 -0
  143. package/dist/validation/ValidationLoopController.d.ts.map +1 -0
  144. package/dist/validation/ValidationLoopController.js +242 -0
  145. package/dist/validation/ValidationLoopController.js.map +1 -0
  146. package/dist/validation/index.d.ts +7 -0
  147. package/dist/validation/index.d.ts.map +1 -0
  148. package/dist/validation/index.js +7 -0
  149. package/dist/validation/index.js.map +1 -0
  150. package/dist/validation/types.d.ts +82 -0
  151. package/dist/validation/types.d.ts.map +1 -0
  152. package/dist/validation/types.js +29 -0
  153. package/dist/validation/types.js.map +1 -0
  154. package/label-prompt-template.md +27 -0
  155. package/package.json +56 -0
  156. package/prompt-template.md +116 -0
  157. package/prompts/builder.md +191 -0
  158. package/prompts/debugger.md +128 -0
  159. package/prompts/graphite-orchestrator.md +362 -0
  160. package/prompts/orchestrator.md +290 -0
  161. package/prompts/scoper.md +95 -0
  162. package/prompts/standard-issue-assigned-user-prompt.md +33 -0
  163. package/prompts/todolist-system-prompt-extension.md +15 -0
@@ -0,0 +1,379 @@
1
+ import { getAllTools, getCoordinatorTools, getReadOnlyTools, getSafeTools, } from "sylas-claude-runner";
2
+ export class RunnerSelectionService {
3
+ config;
4
+ logger;
5
+ constructor(config, logger) {
6
+ this.config = config;
7
+ this.logger = logger;
8
+ }
9
+ /**
10
+ * Resolve default model for a given runner from config with sensible built-in defaults.
11
+ */
12
+ getDefaultModelForRunner(runnerType) {
13
+ if (runnerType === "claude") {
14
+ return (this.config.claudeDefaultModel || this.config.defaultModel || "opus");
15
+ }
16
+ if (runnerType === "gemini") {
17
+ return this.config.geminiDefaultModel || "gemini-2.5-pro";
18
+ }
19
+ if (runnerType === "cursor") {
20
+ return "gpt-5";
21
+ }
22
+ if (runnerType === "opencode") {
23
+ return (this.config.openCodeDefaultModel ||
24
+ this.config.defaultModel ||
25
+ "anthropic/claude-sonnet-4-20250514");
26
+ }
27
+ return this.config.codexDefaultModel || "gpt-5.3-codex";
28
+ }
29
+ /**
30
+ * Resolve default fallback model for a given runner from config with sensible built-in defaults.
31
+ * Supports legacy Claude fallback key for backwards compatibility.
32
+ */
33
+ getDefaultFallbackModelForRunner(runnerType) {
34
+ if (runnerType === "claude") {
35
+ return (this.config.claudeDefaultFallbackModel ||
36
+ this.config.defaultFallbackModel ||
37
+ "sonnet");
38
+ }
39
+ if (runnerType === "gemini") {
40
+ return "gemini-2.5-flash";
41
+ }
42
+ if (runnerType === "cursor") {
43
+ return "gpt-5";
44
+ }
45
+ if (runnerType === "opencode") {
46
+ return (this.config.openCodeDefaultModel ||
47
+ this.config.defaultFallbackModel ||
48
+ "anthropic/claude-sonnet-4-20250514");
49
+ }
50
+ return "gpt-5";
51
+ }
52
+ /**
53
+ * Parse a bracketed tag from issue description.
54
+ *
55
+ * Supports escaped brackets (`\\[tag=value\\]`) which Linear can emit.
56
+ */
57
+ parseDescriptionTag(description, tagName) {
58
+ const escapedTag = tagName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
59
+ const pattern = new RegExp(`\\\\?\\[${escapedTag}=([a-zA-Z0-9_.:/-]+)\\\\?\\]`, "i");
60
+ const match = description.match(pattern);
61
+ return match?.[1];
62
+ }
63
+ /**
64
+ * Determine runner type and model using labels + issue description tags.
65
+ *
66
+ * Supported description tags:
67
+ * - [agent=claude|gemini|codex|cursor|opencode]
68
+ * - [model=<model-name>]
69
+ *
70
+ * Precedence:
71
+ * 1. Description tags override labels
72
+ * 2. Agent labels override model labels
73
+ * 3. Model labels can infer agent type
74
+ * 4. Defaults to opencode runner
75
+ */
76
+ determineRunnerSelection(labels, issueDescription) {
77
+ const normalizedLabels = (labels || []).map((label) => label.toLowerCase());
78
+ const normalizedDescription = issueDescription || "";
79
+ const descriptionAgentTagRaw = this.parseDescriptionTag(normalizedDescription, "agent");
80
+ const descriptionModelTagRaw = this.parseDescriptionTag(normalizedDescription, "model");
81
+ const defaultModelByRunner = {
82
+ claude: this.getDefaultModelForRunner("claude"),
83
+ gemini: this.getDefaultModelForRunner("gemini"),
84
+ codex: this.getDefaultModelForRunner("codex"),
85
+ cursor: this.getDefaultModelForRunner("cursor"),
86
+ opencode: this.getDefaultModelForRunner("opencode"),
87
+ };
88
+ const defaultFallbackByRunner = {
89
+ claude: this.getDefaultFallbackModelForRunner("claude"),
90
+ gemini: this.getDefaultFallbackModelForRunner("gemini"),
91
+ codex: this.getDefaultFallbackModelForRunner("codex"),
92
+ cursor: this.getDefaultFallbackModelForRunner("cursor"),
93
+ opencode: this.getDefaultFallbackModelForRunner("opencode"),
94
+ };
95
+ const isCodexModel = (model) => /gpt-[a-z0-9.-]*codex$/i.test(model) || /^gpt-[a-z0-9.-]+$/i.test(model);
96
+ const inferRunnerFromModel = (model) => {
97
+ if (!model)
98
+ return undefined;
99
+ const normalizedModel = model.toLowerCase();
100
+ if (normalizedModel.startsWith("gemini"))
101
+ return "gemini";
102
+ if (normalizedModel === "opus" ||
103
+ normalizedModel === "sonnet" ||
104
+ normalizedModel === "haiku" ||
105
+ normalizedModel.startsWith("claude")) {
106
+ return "claude";
107
+ }
108
+ if (isCodexModel(normalizedModel))
109
+ return "codex";
110
+ return undefined;
111
+ };
112
+ const inferFallbackModel = (model, runnerType) => {
113
+ const normalizedModel = model.toLowerCase();
114
+ if (runnerType === "claude") {
115
+ if (normalizedModel === "opus")
116
+ return "sonnet";
117
+ if (normalizedModel === "sonnet")
118
+ return "haiku";
119
+ // Keep haiku fallback on sonnet for retry behavior
120
+ if (normalizedModel === "haiku")
121
+ return "sonnet";
122
+ return "sonnet";
123
+ }
124
+ if (runnerType === "gemini") {
125
+ if (normalizedModel === "gemini-3" ||
126
+ normalizedModel === "gemini-3-pro" ||
127
+ normalizedModel === "gemini-3-pro-preview") {
128
+ return "gemini-2.5-pro";
129
+ }
130
+ if (normalizedModel === "gemini-2.5-pro" ||
131
+ normalizedModel === "gemini-2.5") {
132
+ return "gemini-2.5-flash";
133
+ }
134
+ if (normalizedModel === "gemini-2.5-flash") {
135
+ return "gemini-2.5-flash-lite";
136
+ }
137
+ if (normalizedModel === "gemini-2.5-flash-lite") {
138
+ return "gemini-2.5-flash-lite";
139
+ }
140
+ return "gemini-2.5-flash";
141
+ }
142
+ if (isCodexModel(normalizedModel)) {
143
+ if (normalizedModel.endsWith("-codex")) {
144
+ return model.slice(0, -"-codex".length);
145
+ }
146
+ return "gpt-5";
147
+ }
148
+ return "gpt-5";
149
+ };
150
+ const resolveAgentFromLabel = (lowercaseLabels) => {
151
+ if (lowercaseLabels.includes("opencode")) {
152
+ return "opencode";
153
+ }
154
+ if (lowercaseLabels.includes("cursor")) {
155
+ return "cursor";
156
+ }
157
+ if (lowercaseLabels.includes("codex") ||
158
+ lowercaseLabels.includes("openai")) {
159
+ return "codex";
160
+ }
161
+ if (lowercaseLabels.includes("gemini")) {
162
+ return "gemini";
163
+ }
164
+ if (lowercaseLabels.includes("claude")) {
165
+ return "claude";
166
+ }
167
+ return undefined;
168
+ };
169
+ const resolveModelFromLabel = (lowercaseLabels) => {
170
+ const codexModelLabel = lowercaseLabels.find((label) => /gpt-[a-z0-9.-]*codex$/i.test(label));
171
+ if (codexModelLabel) {
172
+ return codexModelLabel;
173
+ }
174
+ if (lowercaseLabels.includes("gemini-2.5-pro") ||
175
+ lowercaseLabels.includes("gemini-2.5")) {
176
+ return "gemini-2.5-pro";
177
+ }
178
+ if (lowercaseLabels.includes("gemini-2.5-flash")) {
179
+ return "gemini-2.5-flash";
180
+ }
181
+ if (lowercaseLabels.includes("gemini-2.5-flash-lite")) {
182
+ return "gemini-2.5-flash-lite";
183
+ }
184
+ if (lowercaseLabels.includes("gemini-3") ||
185
+ lowercaseLabels.includes("gemini-3-pro") ||
186
+ lowercaseLabels.includes("gemini-3-pro-preview")) {
187
+ return "gemini-3-pro-preview";
188
+ }
189
+ if (lowercaseLabels.includes("opus"))
190
+ return "opus";
191
+ if (lowercaseLabels.includes("sonnet"))
192
+ return "sonnet";
193
+ if (lowercaseLabels.includes("haiku"))
194
+ return "haiku";
195
+ return undefined;
196
+ };
197
+ const agentFromDescription = descriptionAgentTagRaw?.toLowerCase();
198
+ const resolvedAgentFromDescription = agentFromDescription === "opencode"
199
+ ? "opencode"
200
+ : agentFromDescription === "cursor"
201
+ ? "cursor"
202
+ : agentFromDescription === "codex" ||
203
+ agentFromDescription === "openai"
204
+ ? "codex"
205
+ : agentFromDescription === "gemini"
206
+ ? "gemini"
207
+ : agentFromDescription === "claude"
208
+ ? "claude"
209
+ : undefined;
210
+ const resolvedAgentFromLabels = resolveAgentFromLabel(normalizedLabels);
211
+ const modelFromDescription = descriptionModelTagRaw;
212
+ const modelFromLabels = resolveModelFromLabel(normalizedLabels);
213
+ const explicitModel = modelFromDescription || modelFromLabels;
214
+ const runnerType = resolvedAgentFromDescription ||
215
+ resolvedAgentFromLabels ||
216
+ inferRunnerFromModel(explicitModel) ||
217
+ "opencode";
218
+ // If an explicit agent conflicts with model's implied runner, keep the agent and reset model.
219
+ const modelRunner = inferRunnerFromModel(explicitModel);
220
+ let modelOverride = explicitModel;
221
+ if (modelOverride && modelRunner && modelRunner !== runnerType) {
222
+ modelOverride = undefined;
223
+ }
224
+ if (!modelOverride) {
225
+ modelOverride = defaultModelByRunner[runnerType];
226
+ }
227
+ let fallbackModelOverride = inferFallbackModel(modelOverride, runnerType);
228
+ if (!fallbackModelOverride) {
229
+ fallbackModelOverride = defaultFallbackByRunner[runnerType];
230
+ }
231
+ return {
232
+ runnerType,
233
+ modelOverride,
234
+ fallbackModelOverride,
235
+ };
236
+ }
237
+ /**
238
+ * Resolve a tool preset string to an array of tool names.
239
+ */
240
+ resolveToolPreset(preset) {
241
+ if (Array.isArray(preset)) {
242
+ return preset;
243
+ }
244
+ switch (preset) {
245
+ case "readOnly":
246
+ return getReadOnlyTools();
247
+ case "safe":
248
+ return getSafeTools();
249
+ case "all":
250
+ return getAllTools();
251
+ case "coordinator":
252
+ return getCoordinatorTools();
253
+ default:
254
+ // If it's a string but not a preset, treat it as a single tool
255
+ return [preset];
256
+ }
257
+ }
258
+ /**
259
+ * Build allowed tools list with Linear MCP tools automatically included
260
+ */
261
+ buildAllowedTools(repository, promptType) {
262
+ // graphite-orchestrator uses the same tool config as orchestrator
263
+ const effectivePromptType = promptType === "graphite-orchestrator" ? "orchestrator" : promptType;
264
+ let baseTools = [];
265
+ let toolSource = "";
266
+ // Priority order:
267
+ // 1. Repository-specific prompt type configuration
268
+ const promptConfig = effectivePromptType
269
+ ? repository.labelPrompts?.[effectivePromptType]
270
+ : undefined;
271
+ // Only access allowedTools if config is object form (not simple string[])
272
+ const promptAllowedTools = promptConfig && !Array.isArray(promptConfig)
273
+ ? promptConfig.allowedTools
274
+ : undefined;
275
+ if (promptAllowedTools) {
276
+ baseTools = this.resolveToolPreset(promptAllowedTools);
277
+ toolSource = `repository label prompt (${effectivePromptType})`;
278
+ }
279
+ // 2. Global prompt type defaults
280
+ else if (effectivePromptType &&
281
+ this.config.promptDefaults?.[effectivePromptType]?.allowedTools) {
282
+ baseTools = this.resolveToolPreset(this.config.promptDefaults[effectivePromptType].allowedTools);
283
+ toolSource = `global prompt defaults (${effectivePromptType})`;
284
+ }
285
+ // 3. Repository-level allowed tools
286
+ else if (repository.allowedTools) {
287
+ baseTools = repository.allowedTools;
288
+ toolSource = "repository configuration";
289
+ }
290
+ // 4. Global default allowed tools
291
+ else if (this.config.defaultAllowedTools) {
292
+ baseTools = this.config.defaultAllowedTools;
293
+ toolSource = "global defaults";
294
+ }
295
+ // 5. Fall back to safe tools
296
+ else {
297
+ baseTools = getSafeTools();
298
+ toolSource = "safe tools fallback";
299
+ }
300
+ // Linear MCP tools that should always be available
301
+ // See: https://docs.anthropic.com/en/docs/claude-code/iam#tool-specific-permission-rules
302
+ const linearMcpTools = ["mcp__linear", "mcp__sylas-tools"];
303
+ // Combine and deduplicate
304
+ const allTools = [...new Set([...baseTools, ...linearMcpTools])];
305
+ this.logger.debug(`Tool selection for ${repository.name}: ${allTools.length} tools from ${toolSource}`);
306
+ return allTools;
307
+ }
308
+ /**
309
+ * Build disallowed tools list from repository and global config
310
+ */
311
+ buildDisallowedTools(repository, promptType) {
312
+ // graphite-orchestrator uses the same tool config as orchestrator
313
+ const effectivePromptType = promptType === "graphite-orchestrator" ? "orchestrator" : promptType;
314
+ let disallowedTools = [];
315
+ let toolSource = "";
316
+ // Priority order (same as allowedTools):
317
+ // 1. Repository-specific prompt type configuration
318
+ const promptConfig = effectivePromptType
319
+ ? repository.labelPrompts?.[effectivePromptType]
320
+ : undefined;
321
+ // Only access disallowedTools if config is object form (not simple string[])
322
+ const promptDisallowedTools = promptConfig && !Array.isArray(promptConfig)
323
+ ? promptConfig.disallowedTools
324
+ : undefined;
325
+ if (promptDisallowedTools) {
326
+ disallowedTools = promptDisallowedTools;
327
+ toolSource = `repository label prompt (${effectivePromptType})`;
328
+ }
329
+ // 2. Global prompt type defaults
330
+ else if (effectivePromptType &&
331
+ this.config.promptDefaults?.[effectivePromptType]?.disallowedTools) {
332
+ disallowedTools =
333
+ this.config.promptDefaults[effectivePromptType].disallowedTools;
334
+ toolSource = `global prompt defaults (${effectivePromptType})`;
335
+ }
336
+ // 3. Repository-level disallowed tools
337
+ else if (repository.disallowedTools) {
338
+ disallowedTools = repository.disallowedTools;
339
+ toolSource = "repository configuration";
340
+ }
341
+ // 4. Global default disallowed tools
342
+ else if (this.config.defaultDisallowedTools) {
343
+ disallowedTools = this.config.defaultDisallowedTools;
344
+ toolSource = "global defaults";
345
+ }
346
+ // 5. No defaults for disallowedTools (as per requirements)
347
+ else {
348
+ disallowedTools = [];
349
+ toolSource = "none (no defaults)";
350
+ }
351
+ if (disallowedTools.length > 0) {
352
+ this.logger.debug(`Disallowed tools for ${repository.name}: ${disallowedTools.length} tools from ${toolSource}`);
353
+ }
354
+ return disallowedTools;
355
+ }
356
+ /**
357
+ * Merge subroutine-level disallowedTools with base disallowedTools
358
+ * @param session Current agent session
359
+ * @param baseDisallowedTools Base disallowed tools from repository/global config
360
+ * @param logContext Context string for logging (e.g., "EdgeWorker", "resumeClaudeSession")
361
+ * @param procedureAnalyzer ProcedureAnalyzer instance to resolve current subroutine
362
+ * @returns Merged disallowed tools list
363
+ */
364
+ mergeSubroutineDisallowedTools(session, baseDisallowedTools, logContext, procedureAnalyzer) {
365
+ const currentSubroutine = procedureAnalyzer.getCurrentSubroutine(session);
366
+ if (currentSubroutine?.disallowedTools) {
367
+ const mergedTools = [
368
+ ...new Set([
369
+ ...baseDisallowedTools,
370
+ ...currentSubroutine.disallowedTools,
371
+ ]),
372
+ ];
373
+ this.logger.debug(`[${logContext}] Merged subroutine-level disallowedTools for ${currentSubroutine.name}:`, currentSubroutine.disallowedTools);
374
+ return mergedTools;
375
+ }
376
+ return baseDisallowedTools;
377
+ }
378
+ }
379
+ //# sourceMappingURL=RunnerSelectionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerSelectionService.js","sourceRoot":"","sources":["../src/RunnerSelectionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type FastifyInstance } from "fastify";
3
+ import { type ILogger } from "sylas-core";
4
+ /**
5
+ * OAuth callback state for tracking flows
6
+ */
7
+ export interface OAuthCallback {
8
+ resolve: (credentials: {
9
+ linearToken: string;
10
+ linearWorkspaceId: string;
11
+ linearWorkspaceName: string;
12
+ }) => void;
13
+ reject: (error: Error) => void;
14
+ id: string;
15
+ }
16
+ /**
17
+ * Approval callback state for tracking approval workflows
18
+ */
19
+ export interface ApprovalCallback {
20
+ resolve: (approved: boolean, feedback?: string) => void;
21
+ reject: (error: Error) => void;
22
+ sessionId: string;
23
+ createdAt: number;
24
+ }
25
+ /**
26
+ * Shared application server that handles both webhooks and OAuth callbacks on a single port
27
+ * Consolidates functionality from SharedWebhookServer and CLI OAuth server
28
+ */
29
+ export declare class SharedApplicationServer {
30
+ private app;
31
+ private webhookHandlers;
32
+ private linearWebhookHandlers;
33
+ private oauthCallbacks;
34
+ private pendingApprovals;
35
+ private port;
36
+ private host;
37
+ private isListening;
38
+ private tunnelClient;
39
+ private skipTunnel;
40
+ private logger;
41
+ constructor(port?: number, host?: string, skipTunnel?: boolean, logger?: ILogger);
42
+ /**
43
+ * Initialize the Fastify app instance (must be called before registering routes)
44
+ */
45
+ initializeFastify(): void;
46
+ /**
47
+ * Start the shared application server
48
+ */
49
+ start(): Promise<void>;
50
+ /**
51
+ * Start Cloudflare tunnel and wait for 4 'connected' events
52
+ */
53
+ private startCloudflareTunnel;
54
+ /**
55
+ * Stop the shared application server
56
+ */
57
+ stop(): Promise<void>;
58
+ /**
59
+ * Get the port number the server is listening on
60
+ */
61
+ getPort(): number;
62
+ /**
63
+ * Get the Fastify instance for registering routes
64
+ * Initializes Fastify if not already done
65
+ */
66
+ getFastifyInstance(): FastifyInstance;
67
+ /**
68
+ * Register a webhook handler for a specific token (LEGACY - deprecated)
69
+ * Supports two signatures:
70
+ * 1. For ndjson-client: (token, secret, handler)
71
+ * 2. For legacy direct registration: (token, handler) where handler takes (req, res)
72
+ *
73
+ * NOTE: New code should use LinearEventTransport which registers routes directly with Fastify
74
+ */
75
+ registerWebhookHandler(token: string, secretOrHandler: string | ((req: IncomingMessage, res: ServerResponse) => Promise<void>), handler?: (body: string, signature: string, timestamp?: string) => boolean): void;
76
+ /**
77
+ * Unregister a webhook handler
78
+ */
79
+ unregisterWebhookHandler(token: string): void;
80
+ /**
81
+ * Start OAuth flow and return promise that resolves when callback is received
82
+ */
83
+ startOAuthFlow(proxyUrl: string): Promise<{
84
+ linearToken: string;
85
+ linearWorkspaceId: string;
86
+ linearWorkspaceName: string;
87
+ }>;
88
+ /**
89
+ * Get the webhook URL
90
+ */
91
+ getWebhookUrl(): string;
92
+ /**
93
+ * Get the OAuth callback URL for registration with proxy
94
+ */
95
+ getOAuthCallbackUrl(): string;
96
+ /**
97
+ * Register an approval request and get approval URL
98
+ */
99
+ registerApprovalRequest(sessionId: string): {
100
+ promise: Promise<{
101
+ approved: boolean;
102
+ feedback?: string;
103
+ }>;
104
+ url: string;
105
+ };
106
+ }
107
+ //# sourceMappingURL=SharedApplicationServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedApplicationServer.d.ts","sourceRoot":"","sources":["../src/SharedApplicationServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,CAAC,WAAW,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;KAC5B,KAAK,IAAI,CAAC;IACX,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IACnC,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,eAAe,CAMnB;IAEJ,OAAO,CAAC,qBAAqB,CAGzB;IACJ,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,MAAM,CAAU;gBAGvB,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE,MAAoB,EAC1B,UAAU,GAAE,OAAe,EAC3B,MAAM,CAAC,EAAE,OAAO;IASjB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAUzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B5B;;OAEG;YACW,qBAAqB;IAuDnC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;;OAGG;IACH,kBAAkB,IAAI,eAAe;IAKrC;;;;;;;OAOG;IACH,sBAAsB,CACrB,KAAK,EAAE,MAAM,EACb,eAAe,EACZ,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,EACjE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,GACxE,IAAI;IAkBP;;OAEG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU7C;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC;KAC5B,CAAC;IA6CF;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG;QAC3C,OAAO,EAAE,OAAO,CAAC;YAAE,QAAQ,EAAE,OAAO,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC3D,GAAG,EAAE,MAAM,CAAC;KACZ;CA+BD"}