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.
- package/README.md +293 -0
- package/dist/ActivityPoster.d.ts +15 -0
- package/dist/ActivityPoster.d.ts.map +1 -0
- package/dist/ActivityPoster.js +194 -0
- package/dist/ActivityPoster.js.map +1 -0
- package/dist/AgentSessionManager.d.ts +280 -0
- package/dist/AgentSessionManager.d.ts.map +1 -0
- package/dist/AgentSessionManager.js +1412 -0
- package/dist/AgentSessionManager.js.map +1 -0
- package/dist/AskUserQuestionHandler.d.ts +97 -0
- package/dist/AskUserQuestionHandler.d.ts.map +1 -0
- package/dist/AskUserQuestionHandler.js +206 -0
- package/dist/AskUserQuestionHandler.js.map +1 -0
- package/dist/AttachmentService.d.ts +69 -0
- package/dist/AttachmentService.d.ts.map +1 -0
- package/dist/AttachmentService.js +369 -0
- package/dist/AttachmentService.js.map +1 -0
- package/dist/ChatSessionHandler.d.ts +87 -0
- package/dist/ChatSessionHandler.d.ts.map +1 -0
- package/dist/ChatSessionHandler.js +231 -0
- package/dist/ChatSessionHandler.js.map +1 -0
- package/dist/ConfigManager.d.ts +91 -0
- package/dist/ConfigManager.d.ts.map +1 -0
- package/dist/ConfigManager.js +227 -0
- package/dist/ConfigManager.js.map +1 -0
- package/dist/EdgeWorker.d.ts +670 -0
- package/dist/EdgeWorker.d.ts.map +1 -0
- package/dist/EdgeWorker.js +3801 -0
- package/dist/EdgeWorker.js.map +1 -0
- package/dist/GitService.d.ts +39 -0
- package/dist/GitService.d.ts.map +1 -0
- package/dist/GitService.js +432 -0
- package/dist/GitService.js.map +1 -0
- package/dist/GlobalSessionRegistry.d.ts +142 -0
- package/dist/GlobalSessionRegistry.d.ts.map +1 -0
- package/dist/GlobalSessionRegistry.js +254 -0
- package/dist/GlobalSessionRegistry.js.map +1 -0
- package/dist/PromptBuilder.d.ts +175 -0
- package/dist/PromptBuilder.d.ts.map +1 -0
- package/dist/PromptBuilder.js +884 -0
- package/dist/PromptBuilder.js.map +1 -0
- package/dist/RepositoryRouter.d.ts +152 -0
- package/dist/RepositoryRouter.d.ts.map +1 -0
- package/dist/RepositoryRouter.js +480 -0
- package/dist/RepositoryRouter.js.map +1 -0
- package/dist/RunnerSelectionService.d.ts +62 -0
- package/dist/RunnerSelectionService.d.ts.map +1 -0
- package/dist/RunnerSelectionService.js +379 -0
- package/dist/RunnerSelectionService.js.map +1 -0
- package/dist/SharedApplicationServer.d.ts +107 -0
- package/dist/SharedApplicationServer.d.ts.map +1 -0
- package/dist/SharedApplicationServer.js +247 -0
- package/dist/SharedApplicationServer.js.map +1 -0
- package/dist/SharedWebhookServer.d.ts +39 -0
- package/dist/SharedWebhookServer.d.ts.map +1 -0
- package/dist/SharedWebhookServer.js +150 -0
- package/dist/SharedWebhookServer.js.map +1 -0
- package/dist/SlackChatAdapter.d.ts +25 -0
- package/dist/SlackChatAdapter.d.ts.map +1 -0
- package/dist/SlackChatAdapter.js +143 -0
- package/dist/SlackChatAdapter.js.map +1 -0
- package/dist/UserAccessControl.d.ts +69 -0
- package/dist/UserAccessControl.d.ts.map +1 -0
- package/dist/UserAccessControl.js +171 -0
- package/dist/UserAccessControl.js.map +1 -0
- package/dist/WorktreeIncludeService.d.ts +32 -0
- package/dist/WorktreeIncludeService.d.ts.map +1 -0
- package/dist/WorktreeIncludeService.js +123 -0
- package/dist/WorktreeIncludeService.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/label-prompt-template.md +27 -0
- package/dist/procedures/ProcedureAnalyzer.d.ts +69 -0
- package/dist/procedures/ProcedureAnalyzer.d.ts.map +1 -0
- package/dist/procedures/ProcedureAnalyzer.js +271 -0
- package/dist/procedures/ProcedureAnalyzer.js.map +1 -0
- package/dist/procedures/index.d.ts +7 -0
- package/dist/procedures/index.d.ts.map +1 -0
- package/dist/procedures/index.js +7 -0
- package/dist/procedures/index.js.map +1 -0
- package/dist/procedures/registry.d.ts +156 -0
- package/dist/procedures/registry.d.ts.map +1 -0
- package/dist/procedures/registry.js +240 -0
- package/dist/procedures/registry.js.map +1 -0
- package/dist/procedures/types.d.ts +103 -0
- package/dist/procedures/types.d.ts.map +1 -0
- package/dist/procedures/types.js +5 -0
- package/dist/procedures/types.js.map +1 -0
- package/dist/prompt-assembly/types.d.ts +80 -0
- package/dist/prompt-assembly/types.d.ts.map +1 -0
- package/dist/prompt-assembly/types.js +8 -0
- package/dist/prompt-assembly/types.js.map +1 -0
- package/dist/prompts/builder.md +191 -0
- package/dist/prompts/debugger.md +128 -0
- package/dist/prompts/graphite-orchestrator.md +362 -0
- package/dist/prompts/orchestrator.md +290 -0
- package/dist/prompts/scoper.md +95 -0
- package/dist/prompts/standard-issue-assigned-user-prompt.md +33 -0
- package/dist/prompts/subroutines/changelog-update.md +79 -0
- package/dist/prompts/subroutines/coding-activity.md +12 -0
- package/dist/prompts/subroutines/concise-summary.md +67 -0
- package/dist/prompts/subroutines/debugger-fix.md +92 -0
- package/dist/prompts/subroutines/debugger-reproduction.md +74 -0
- package/dist/prompts/subroutines/full-delegation.md +68 -0
- package/dist/prompts/subroutines/get-approval.md +175 -0
- package/dist/prompts/subroutines/gh-pr.md +80 -0
- package/dist/prompts/subroutines/git-commit.md +37 -0
- package/dist/prompts/subroutines/plan-summary.md +21 -0
- package/dist/prompts/subroutines/preparation.md +16 -0
- package/dist/prompts/subroutines/question-answer.md +8 -0
- package/dist/prompts/subroutines/question-investigation.md +8 -0
- package/dist/prompts/subroutines/release-execution.md +81 -0
- package/dist/prompts/subroutines/release-summary.md +60 -0
- package/dist/prompts/subroutines/user-testing-summary.md +87 -0
- package/dist/prompts/subroutines/user-testing.md +48 -0
- package/dist/prompts/subroutines/validation-fixer.md +56 -0
- package/dist/prompts/subroutines/verbose-summary.md +46 -0
- package/dist/prompts/subroutines/verifications.md +77 -0
- package/dist/prompts/todolist-system-prompt-extension.md +15 -0
- package/dist/sinks/IActivitySink.d.ts +60 -0
- package/dist/sinks/IActivitySink.d.ts.map +1 -0
- package/dist/sinks/IActivitySink.js +2 -0
- package/dist/sinks/IActivitySink.js.map +1 -0
- package/dist/sinks/LinearActivitySink.d.ts +69 -0
- package/dist/sinks/LinearActivitySink.d.ts.map +1 -0
- package/dist/sinks/LinearActivitySink.js +111 -0
- package/dist/sinks/LinearActivitySink.js.map +1 -0
- package/dist/sinks/NoopActivitySink.d.ts +13 -0
- package/dist/sinks/NoopActivitySink.d.ts.map +1 -0
- package/dist/sinks/NoopActivitySink.js +17 -0
- package/dist/sinks/NoopActivitySink.js.map +1 -0
- package/dist/sinks/index.d.ts +9 -0
- package/dist/sinks/index.d.ts.map +1 -0
- package/dist/sinks/index.js +8 -0
- package/dist/sinks/index.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/ValidationLoopController.d.ts +54 -0
- package/dist/validation/ValidationLoopController.d.ts.map +1 -0
- package/dist/validation/ValidationLoopController.js +242 -0
- package/dist/validation/ValidationLoopController.js.map +1 -0
- package/dist/validation/index.d.ts +7 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/types.d.ts +82 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +29 -0
- package/dist/validation/types.js.map +1 -0
- package/label-prompt-template.md +27 -0
- package/package.json +56 -0
- package/prompt-template.md +116 -0
- package/prompts/builder.md +191 -0
- package/prompts/debugger.md +128 -0
- package/prompts/graphite-orchestrator.md +362 -0
- package/prompts/orchestrator.md +290 -0
- package/prompts/scoper.md +95 -0
- package/prompts/standard-issue-assigned-user-prompt.md +33 -0
- 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":"AAAA,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,GACZ,MAAM,qBAAqB,CAAC;AAU7B,MAAM,OAAO,sBAAsB;IAC1B,MAAM,CAAmB;IACzB,MAAM,CAAU;IAExB,YAAY,MAAwB,EAAE,MAAe;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,wBAAwB,CAC9B,UAAiE;QAEjE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CACN,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CACpE,CAAC;QACH,CAAC;QACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,gBAAgB,CAAC;QAC3D,CAAC;QACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,CACN,IAAI,CAAC,MAAM,CAAC,oBAAoB;gBAChC,IAAI,CAAC,MAAM,CAAC,YAAY;gBACxB,oCAAoC,CACpC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,eAAe,CAAC;IACzD,CAAC;IAED;;;OAGG;IACI,gCAAgC,CACtC,UAAiE;QAEjE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CACN,IAAI,CAAC,MAAM,CAAC,0BAA0B;gBACtC,IAAI,CAAC,MAAM,CAAC,oBAAoB;gBAChC,QAAQ,CACR,CAAC;QACH,CAAC;QACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,kBAAkB,CAAC;QAC3B,CAAC;QACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,CACN,IAAI,CAAC,MAAM,CAAC,oBAAoB;gBAChC,IAAI,CAAC,MAAM,CAAC,oBAAoB;gBAChC,oCAAoC,CACpC,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CACzB,WAAmB,EACnB,OAAe;QAEf,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,MAAM,CACzB,WAAW,UAAU,8BAA8B,EACnD,GAAG,CACH,CAAC;QACF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,wBAAwB,CAC9B,MAAgB,EAChB,gBAAyB;QAMzB,MAAM,gBAAgB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,MAAM,qBAAqB,GAAG,gBAAgB,IAAI,EAAE,CAAC;QACrD,MAAM,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,CACtD,qBAAqB,EACrB,OAAO,CACP,CAAC;QACF,MAAM,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,CACtD,qBAAqB,EACrB,OAAO,CACP,CAAC;QAEF,MAAM,oBAAoB,GAGtB;YACH,MAAM,EAAE,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;YAC/C,MAAM,EAAE,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;YAC/C,KAAK,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;YAC/C,QAAQ,EAAE,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC;SACnD,CAAC;QACF,MAAM,uBAAuB,GAGzB;YACH,MAAM,EAAE,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC;YACvD,MAAM,EAAE,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC;YACvD,KAAK,EAAE,IAAI,CAAC,gCAAgC,CAAC,OAAO,CAAC;YACrD,MAAM,EAAE,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC;YACvD,QAAQ,EAAE,IAAI,CAAC,gCAAgC,CAAC,UAAU,CAAC;SAC3D,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAW,EAAE,CAC/C,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1E,MAAM,oBAAoB,GAAG,CAC5B,KAAc,EACsD,EAAE;YACtE,IAAI,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC1D,IACC,eAAe,KAAK,MAAM;gBAC1B,eAAe,KAAK,QAAQ;gBAC5B,eAAe,KAAK,OAAO;gBAC3B,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EACnC,CAAC;gBACF,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,IAAI,YAAY,CAAC,eAAe,CAAC;gBAAE,OAAO,OAAO,CAAC;YAClD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,CAC1B,KAAa,EACb,UAAiE,EAC5C,EAAE;YACvB,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC7B,IAAI,eAAe,KAAK,MAAM;oBAAE,OAAO,QAAQ,CAAC;gBAChD,IAAI,eAAe,KAAK,QAAQ;oBAAE,OAAO,OAAO,CAAC;gBACjD,mDAAmD;gBACnD,IAAI,eAAe,KAAK,OAAO;oBAAE,OAAO,QAAQ,CAAC;gBACjD,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC7B,IACC,eAAe,KAAK,UAAU;oBAC9B,eAAe,KAAK,cAAc;oBAClC,eAAe,KAAK,sBAAsB,EACzC,CAAC;oBACF,OAAO,gBAAgB,CAAC;gBACzB,CAAC;gBACD,IACC,eAAe,KAAK,gBAAgB;oBACpC,eAAe,KAAK,YAAY,EAC/B,CAAC;oBACF,OAAO,kBAAkB,CAAC;gBAC3B,CAAC;gBACD,IAAI,eAAe,KAAK,kBAAkB,EAAE,CAAC;oBAC5C,OAAO,uBAAuB,CAAC;gBAChC,CAAC;gBACD,IAAI,eAAe,KAAK,uBAAuB,EAAE,CAAC;oBACjD,OAAO,uBAAuB,CAAC;gBAChC,CAAC;gBACD,OAAO,kBAAkB,CAAC;YAC3B,CAAC;YACD,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,OAAO,CAAC;YAChB,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAC7B,eAAyB,EAC2C,EAAE;YACtE,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,OAAO,UAAU,CAAC;YACnB,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,IACC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACjC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,CAAC;gBACF,OAAO,OAAO,CAAC;YAChB,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAC7B,eAAyB,EACJ,EAAE;YACvB,MAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CACpC,CAAC;YACF,IAAI,eAAe,EAAE,CAAC;gBACrB,OAAO,eAAe,CAAC;YACxB,CAAC;YAED,IACC,eAAe,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAC1C,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EACrC,CAAC;gBACF,OAAO,gBAAgB,CAAC;YACzB,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAClD,OAAO,kBAAkB,CAAC;YAC3B,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACvD,OAAO,uBAAuB,CAAC;YAChC,CAAC;YACD,IACC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACpC,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC;gBACxC,eAAe,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAC/C,CAAC;gBACF,OAAO,sBAAsB,CAAC;YAC/B,CAAC;YAED,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YACpD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACxD,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC;YAEtD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,oBAAoB,GAAG,sBAAsB,EAAE,WAAW,EAAE,CAAC;QACnE,MAAM,4BAA4B,GACjC,oBAAoB,KAAK,UAAU;YAClC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,oBAAoB,KAAK,QAAQ;gBAClC,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,oBAAoB,KAAK,OAAO;oBAChC,oBAAoB,KAAK,QAAQ;oBAClC,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,oBAAoB,KAAK,QAAQ;wBAClC,CAAC,CAAC,QAAQ;wBACV,CAAC,CAAC,oBAAoB,KAAK,QAAQ;4BAClC,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QAExE,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;QACpD,MAAM,eAAe,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,oBAAoB,IAAI,eAAe,CAAC;QAE9D,MAAM,UAAU,GACf,4BAA4B;YAC5B,uBAAuB;YACvB,oBAAoB,CAAC,aAAa,CAAC;YACnC,UAAU,CAAC;QAEZ,8FAA8F;QAC9F,MAAM,WAAW,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,aAAa,GAAG,aAAa,CAAC;QAClC,IAAI,aAAa,IAAI,WAAW,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;YAChE,aAAa,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,aAAa,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,qBAAqB,GAAG,kBAAkB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5B,qBAAqB,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO;YACN,UAAU;YACV,aAAa;YACb,qBAAqB;SACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,MAAyB;QACjD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC;QACf,CAAC;QAED,QAAQ,MAAM,EAAE,CAAC;YAChB,KAAK,UAAU;gBACd,OAAO,gBAAgB,EAAE,CAAC;YAC3B,KAAK,MAAM;gBACV,OAAO,YAAY,EAAE,CAAC;YACvB,KAAK,KAAK;gBACT,OAAO,WAAW,EAAE,CAAC;YACtB,KAAK,aAAa;gBACjB,OAAO,mBAAmB,EAAE,CAAC;YAC9B;gBACC,+DAA+D;gBAC/D,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAED;;OAEG;IACI,iBAAiB,CACvB,UAA4B,EAC5B,UAK0B;QAE1B,kEAAkE;QAClE,MAAM,mBAAmB,GACxB,UAAU,KAAK,uBAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;QACtE,IAAI,SAAS,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,kBAAkB;QAClB,mDAAmD;QACnD,MAAM,YAAY,GAAG,mBAAmB;YACvC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,mBAAmB,CAAC;YAChD,CAAC,CAAC,SAAS,CAAC;QACb,0EAA0E;QAC1E,MAAM,kBAAkB,GACvB,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC3C,CAAC,CAAC,YAAY,CAAC,YAAY;YAC3B,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,kBAAkB,EAAE,CAAC;YACxB,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YACvD,UAAU,GAAG,4BAA4B,mBAAmB,GAAG,CAAC;QACjE,CAAC;QACD,iCAAiC;aAC5B,IACJ,mBAAmB;YACnB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,mBAAmB,CAAC,EAAE,YAAY,EAC9D,CAAC;YACF,SAAS,GAAG,IAAI,CAAC,iBAAiB,CACjC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,YAAY,CAC5D,CAAC;YACF,UAAU,GAAG,2BAA2B,mBAAmB,GAAG,CAAC;QAChE,CAAC;QACD,oCAAoC;aAC/B,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YAClC,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC;YACpC,UAAU,GAAG,0BAA0B,CAAC;QACzC,CAAC;QACD,kCAAkC;aAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC1C,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YAC5C,UAAU,GAAG,iBAAiB,CAAC;QAChC,CAAC;QACD,6BAA6B;aACxB,CAAC;YACL,SAAS,GAAG,YAAY,EAAE,CAAC;YAC3B,UAAU,GAAG,qBAAqB,CAAC;QACpC,CAAC;QAED,mDAAmD;QACnD,yFAAyF;QACzF,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAE3D,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAChB,sBAAsB,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,eAAe,UAAU,EAAE,CACpF,CAAC;QAEF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,oBAAoB,CAC1B,UAA4B,EAC5B,UAK0B;QAE1B,kEAAkE;QAClE,MAAM,mBAAmB,GACxB,UAAU,KAAK,uBAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;QACtE,IAAI,eAAe,GAAa,EAAE,CAAC;QACnC,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,yCAAyC;QACzC,mDAAmD;QACnD,MAAM,YAAY,GAAG,mBAAmB;YACvC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,mBAAmB,CAAC;YAChD,CAAC,CAAC,SAAS,CAAC;QACb,6EAA6E;QAC7E,MAAM,qBAAqB,GAC1B,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC3C,CAAC,CAAC,YAAY,CAAC,eAAe;YAC9B,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,qBAAqB,EAAE,CAAC;YAC3B,eAAe,GAAG,qBAAqB,CAAC;YACxC,UAAU,GAAG,4BAA4B,mBAAmB,GAAG,CAAC;QACjE,CAAC;QACD,iCAAiC;aAC5B,IACJ,mBAAmB;YACnB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,mBAAmB,CAAC,EAAE,eAAe,EACjE,CAAC;YACF,eAAe;gBACd,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,eAAe,CAAC;YACjE,UAAU,GAAG,2BAA2B,mBAAmB,GAAG,CAAC;QAChE,CAAC;QACD,uCAAuC;aAClC,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;YACrC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;YAC7C,UAAU,GAAG,0BAA0B,CAAC;QACzC,CAAC;QACD,qCAAqC;aAChC,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC;YAC7C,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;YACrD,UAAU,GAAG,iBAAiB,CAAC;QAChC,CAAC;QACD,2DAA2D;aACtD,CAAC;YACL,eAAe,GAAG,EAAE,CAAC;YACrB,UAAU,GAAG,oBAAoB,CAAC;QACnC,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAChB,wBAAwB,UAAU,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,eAAe,UAAU,EAAE,CAC7F,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACI,8BAA8B,CACpC,OAA0B,EAC1B,mBAA6B,EAC7B,UAAkB,EAClB,iBAAoC;QAEpC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,iBAAiB,EAAE,eAAe,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG;gBACnB,GAAG,IAAI,GAAG,CAAC;oBACV,GAAG,mBAAmB;oBACtB,GAAG,iBAAiB,CAAC,eAAe;iBACpC,CAAC;aACF,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAChB,IAAI,UAAU,iDAAiD,iBAAiB,CAAC,IAAI,GAAG,EACxF,iBAAiB,CAAC,eAAe,CACjC,CAAC;YACF,OAAO,WAAW,CAAC;QACpB,CAAC;QACD,OAAO,mBAAmB,CAAC;IAC5B,CAAC;CACD"}
|
|
@@ -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"}
|