cyrus-edge-worker 0.2.21 ā 0.2.23
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/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 +63 -21
- package/dist/AgentSessionManager.d.ts.map +1 -1
- package/dist/AgentSessionManager.js +413 -404
- package/dist/AgentSessionManager.js.map +1 -1
- package/dist/AskUserQuestionHandler.d.ts +3 -2
- package/dist/AskUserQuestionHandler.d.ts.map +1 -1
- package/dist/AskUserQuestionHandler.js +15 -12
- package/dist/AskUserQuestionHandler.js.map +1 -1
- 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 +227 -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 +229 -0
- package/dist/ConfigManager.js.map +1 -0
- package/dist/EdgeWorker.d.ts +152 -120
- package/dist/EdgeWorker.d.ts.map +1 -1
- package/dist/EdgeWorker.js +1335 -2125
- package/dist/EdgeWorker.js.map +1 -1
- package/dist/GitService.d.ts +14 -10
- package/dist/GitService.d.ts.map +1 -1
- package/dist/GitService.js +91 -12
- package/dist/GitService.js.map +1 -1
- 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 +182 -0
- package/dist/PromptBuilder.d.ts.map +1 -0
- package/dist/PromptBuilder.js +963 -0
- package/dist/PromptBuilder.js.map +1 -0
- package/dist/RepositoryRouter.d.ts +3 -2
- package/dist/RepositoryRouter.d.ts.map +1 -1
- package/dist/RepositoryRouter.js +39 -37
- package/dist/RepositoryRouter.js.map +1 -1
- package/dist/RunnerSelectionService.d.ts +71 -0
- package/dist/RunnerSelectionService.d.ts.map +1 -0
- package/dist/RunnerSelectionService.js +392 -0
- package/dist/RunnerSelectionService.js.map +1 -0
- package/dist/SharedApplicationServer.d.ts +3 -1
- package/dist/SharedApplicationServer.d.ts.map +1 -1
- package/dist/SharedApplicationServer.js +21 -17
- package/dist/SharedApplicationServer.js.map +1 -1
- package/dist/SharedWebhookServer.d.ts +3 -1
- package/dist/SharedWebhookServer.d.ts.map +1 -1
- package/dist/SharedWebhookServer.js +19 -16
- package/dist/SharedWebhookServer.js.map +1 -1
- package/dist/SlackChatAdapter.d.ts +25 -0
- package/dist/SlackChatAdapter.d.ts.map +1 -0
- package/dist/SlackChatAdapter.js +163 -0
- package/dist/SlackChatAdapter.js.map +1 -0
- package/dist/WorktreeIncludeService.d.ts +2 -9
- package/dist/WorktreeIncludeService.d.ts.map +1 -1
- package/dist/WorktreeIncludeService.js +3 -9
- package/dist/WorktreeIncludeService.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/label-prompt-template.md +6 -2
- package/dist/procedures/ProcedureAnalyzer.d.ts +6 -4
- package/dist/procedures/ProcedureAnalyzer.d.ts.map +1 -1
- package/dist/procedures/ProcedureAnalyzer.js +32 -12
- package/dist/procedures/ProcedureAnalyzer.js.map +1 -1
- package/dist/procedures/registry.d.ts +19 -19
- package/dist/procedures/registry.d.ts.map +1 -1
- package/dist/procedures/registry.js +19 -19
- package/dist/procedures/registry.js.map +1 -1
- package/dist/procedures/types.d.ts +1 -0
- package/dist/procedures/types.d.ts.map +1 -1
- package/dist/prompt-assembly/types.d.ts +2 -0
- package/dist/prompt-assembly/types.d.ts.map +1 -1
- package/dist/prompts/graphite-orchestrator.md +4 -2
- package/dist/prompts/orchestrator.md +5 -3
- package/dist/prompts/standard-issue-assigned-user-prompt.md +7 -0
- package/dist/prompts/subroutines/gh-pr.md +12 -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/label-prompt-template.md +6 -2
- package/package.json +17 -11
- package/prompts/graphite-orchestrator.md +4 -2
- package/prompts/orchestrator.md +5 -3
- package/prompts/standard-issue-assigned-user-prompt.md +7 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { getAllTools, getCoordinatorTools, getReadOnlyTools, getSafeTools, } from "cyrus-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
|
+
* Determine the default runner type.
|
|
11
|
+
*
|
|
12
|
+
* Priority:
|
|
13
|
+
* 1. Explicit `defaultRunner` in config
|
|
14
|
+
* 2. Auto-detect from available API keys (if exactly one runner has keys)
|
|
15
|
+
* 3. Fall back to "claude"
|
|
16
|
+
*/
|
|
17
|
+
getDefaultRunner() {
|
|
18
|
+
if (this.config.defaultRunner) {
|
|
19
|
+
return this.config.defaultRunner;
|
|
20
|
+
}
|
|
21
|
+
// Auto-detect from environment: if exactly one runner's API key is set, use it
|
|
22
|
+
const available = [];
|
|
23
|
+
if (process.env.CLAUDE_CODE_OAUTH_TOKEN || process.env.ANTHROPIC_API_KEY) {
|
|
24
|
+
available.push("claude");
|
|
25
|
+
}
|
|
26
|
+
if (process.env.GEMINI_API_KEY) {
|
|
27
|
+
available.push("gemini");
|
|
28
|
+
}
|
|
29
|
+
if (process.env.OPENAI_API_KEY) {
|
|
30
|
+
available.push("codex");
|
|
31
|
+
}
|
|
32
|
+
if (process.env.CURSOR_API_KEY) {
|
|
33
|
+
available.push("cursor");
|
|
34
|
+
}
|
|
35
|
+
if (available.length === 1 && available[0]) {
|
|
36
|
+
return available[0];
|
|
37
|
+
}
|
|
38
|
+
return "claude";
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve default model for a given runner from config with sensible built-in defaults.
|
|
42
|
+
*/
|
|
43
|
+
getDefaultModelForRunner(runnerType) {
|
|
44
|
+
if (runnerType === "claude") {
|
|
45
|
+
return (this.config.claudeDefaultModel || this.config.defaultModel || "opus");
|
|
46
|
+
}
|
|
47
|
+
if (runnerType === "gemini") {
|
|
48
|
+
return this.config.geminiDefaultModel || "gemini-2.5-pro";
|
|
49
|
+
}
|
|
50
|
+
if (runnerType === "cursor") {
|
|
51
|
+
return "gpt-5";
|
|
52
|
+
}
|
|
53
|
+
return this.config.codexDefaultModel || "gpt-5.3-codex";
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve default fallback model for a given runner from config with sensible built-in defaults.
|
|
57
|
+
* Supports legacy Claude fallback key for backwards compatibility.
|
|
58
|
+
*/
|
|
59
|
+
getDefaultFallbackModelForRunner(runnerType) {
|
|
60
|
+
if (runnerType === "claude") {
|
|
61
|
+
return (this.config.claudeDefaultFallbackModel ||
|
|
62
|
+
this.config.defaultFallbackModel ||
|
|
63
|
+
"sonnet");
|
|
64
|
+
}
|
|
65
|
+
if (runnerType === "gemini") {
|
|
66
|
+
return "gemini-2.5-flash";
|
|
67
|
+
}
|
|
68
|
+
if (runnerType === "codex") {
|
|
69
|
+
return "gpt-5.2-codex";
|
|
70
|
+
}
|
|
71
|
+
if (runnerType === "cursor") {
|
|
72
|
+
return "gpt-5";
|
|
73
|
+
}
|
|
74
|
+
return "gpt-5";
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse a bracketed tag from issue description.
|
|
78
|
+
*
|
|
79
|
+
* Supports escaped brackets (`\\[tag=value\\]`) which Linear can emit.
|
|
80
|
+
*/
|
|
81
|
+
parseDescriptionTag(description, tagName) {
|
|
82
|
+
const escapedTag = tagName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
83
|
+
const pattern = new RegExp(`\\\\?\\[${escapedTag}=([a-zA-Z0-9_.:/-]+)\\\\?\\]`, "i");
|
|
84
|
+
const match = description.match(pattern);
|
|
85
|
+
return match?.[1];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Determine runner type and model using labels + issue description tags.
|
|
89
|
+
*
|
|
90
|
+
* Supported description tags:
|
|
91
|
+
* - [agent=claude|gemini|codex|cursor]
|
|
92
|
+
* - [model=<model-name>]
|
|
93
|
+
*
|
|
94
|
+
* Precedence:
|
|
95
|
+
* 1. Description tags override labels
|
|
96
|
+
* 2. Agent labels override model labels
|
|
97
|
+
* 3. Model labels can infer agent type
|
|
98
|
+
* 4. Defaults to claude runner
|
|
99
|
+
*/
|
|
100
|
+
determineRunnerSelection(labels, issueDescription) {
|
|
101
|
+
const normalizedLabels = (labels || []).map((label) => label.toLowerCase());
|
|
102
|
+
const normalizedDescription = issueDescription || "";
|
|
103
|
+
const descriptionAgentTagRaw = this.parseDescriptionTag(normalizedDescription, "agent");
|
|
104
|
+
const descriptionModelTagRaw = this.parseDescriptionTag(normalizedDescription, "model");
|
|
105
|
+
const defaultModelByRunner = {
|
|
106
|
+
claude: this.getDefaultModelForRunner("claude"),
|
|
107
|
+
gemini: this.getDefaultModelForRunner("gemini"),
|
|
108
|
+
codex: this.getDefaultModelForRunner("codex"),
|
|
109
|
+
cursor: this.getDefaultModelForRunner("cursor"),
|
|
110
|
+
};
|
|
111
|
+
const defaultFallbackByRunner = {
|
|
112
|
+
claude: this.getDefaultFallbackModelForRunner("claude"),
|
|
113
|
+
gemini: this.getDefaultFallbackModelForRunner("gemini"),
|
|
114
|
+
codex: this.getDefaultFallbackModelForRunner("codex"),
|
|
115
|
+
cursor: this.getDefaultFallbackModelForRunner("cursor"),
|
|
116
|
+
};
|
|
117
|
+
const isCodexModel = (model) => /gpt-[a-z0-9.-]*codex$/i.test(model) || /^gpt-[a-z0-9.-]+$/i.test(model);
|
|
118
|
+
const inferRunnerFromModel = (model) => {
|
|
119
|
+
if (!model)
|
|
120
|
+
return undefined;
|
|
121
|
+
const normalizedModel = model.toLowerCase();
|
|
122
|
+
if (normalizedModel.startsWith("gemini"))
|
|
123
|
+
return "gemini";
|
|
124
|
+
if (normalizedModel === "opus" ||
|
|
125
|
+
normalizedModel === "sonnet" ||
|
|
126
|
+
normalizedModel === "haiku" ||
|
|
127
|
+
normalizedModel.startsWith("claude")) {
|
|
128
|
+
return "claude";
|
|
129
|
+
}
|
|
130
|
+
if (isCodexModel(normalizedModel))
|
|
131
|
+
return "codex";
|
|
132
|
+
return undefined;
|
|
133
|
+
};
|
|
134
|
+
const inferFallbackModel = (model, runnerType) => {
|
|
135
|
+
const normalizedModel = model.toLowerCase();
|
|
136
|
+
if (runnerType === "claude") {
|
|
137
|
+
if (normalizedModel === "opus")
|
|
138
|
+
return "sonnet";
|
|
139
|
+
if (normalizedModel === "sonnet")
|
|
140
|
+
return "haiku";
|
|
141
|
+
// Keep haiku fallback on sonnet for retry behavior
|
|
142
|
+
if (normalizedModel === "haiku")
|
|
143
|
+
return "sonnet";
|
|
144
|
+
return "sonnet";
|
|
145
|
+
}
|
|
146
|
+
if (runnerType === "gemini") {
|
|
147
|
+
if (normalizedModel === "gemini-3" ||
|
|
148
|
+
normalizedModel === "gemini-3-pro" ||
|
|
149
|
+
normalizedModel === "gemini-3-pro-preview") {
|
|
150
|
+
return "gemini-2.5-pro";
|
|
151
|
+
}
|
|
152
|
+
if (normalizedModel === "gemini-2.5-pro" ||
|
|
153
|
+
normalizedModel === "gemini-2.5") {
|
|
154
|
+
return "gemini-2.5-flash";
|
|
155
|
+
}
|
|
156
|
+
if (normalizedModel === "gemini-2.5-flash") {
|
|
157
|
+
return "gemini-2.5-flash-lite";
|
|
158
|
+
}
|
|
159
|
+
if (normalizedModel === "gemini-2.5-flash-lite") {
|
|
160
|
+
return "gemini-2.5-flash-lite";
|
|
161
|
+
}
|
|
162
|
+
return "gemini-2.5-flash";
|
|
163
|
+
}
|
|
164
|
+
if (isCodexModel(normalizedModel)) {
|
|
165
|
+
return "gpt-5.2-codex";
|
|
166
|
+
}
|
|
167
|
+
return "gpt-5";
|
|
168
|
+
};
|
|
169
|
+
const resolveAgentFromLabel = (lowercaseLabels) => {
|
|
170
|
+
if (lowercaseLabels.includes("cursor")) {
|
|
171
|
+
return "cursor";
|
|
172
|
+
}
|
|
173
|
+
if (lowercaseLabels.includes("codex") ||
|
|
174
|
+
lowercaseLabels.includes("openai")) {
|
|
175
|
+
return "codex";
|
|
176
|
+
}
|
|
177
|
+
if (lowercaseLabels.includes("gemini")) {
|
|
178
|
+
return "gemini";
|
|
179
|
+
}
|
|
180
|
+
if (lowercaseLabels.includes("claude")) {
|
|
181
|
+
return "claude";
|
|
182
|
+
}
|
|
183
|
+
return undefined;
|
|
184
|
+
};
|
|
185
|
+
const resolveModelFromLabel = (lowercaseLabels) => {
|
|
186
|
+
const codexModelLabel = lowercaseLabels.find((label) => /gpt-[a-z0-9.-]*codex$/i.test(label));
|
|
187
|
+
if (codexModelLabel) {
|
|
188
|
+
return codexModelLabel;
|
|
189
|
+
}
|
|
190
|
+
if (lowercaseLabels.includes("gemini-2.5-pro") ||
|
|
191
|
+
lowercaseLabels.includes("gemini-2.5")) {
|
|
192
|
+
return "gemini-2.5-pro";
|
|
193
|
+
}
|
|
194
|
+
if (lowercaseLabels.includes("gemini-2.5-flash")) {
|
|
195
|
+
return "gemini-2.5-flash";
|
|
196
|
+
}
|
|
197
|
+
if (lowercaseLabels.includes("gemini-2.5-flash-lite")) {
|
|
198
|
+
return "gemini-2.5-flash-lite";
|
|
199
|
+
}
|
|
200
|
+
if (lowercaseLabels.includes("gemini-3") ||
|
|
201
|
+
lowercaseLabels.includes("gemini-3-pro") ||
|
|
202
|
+
lowercaseLabels.includes("gemini-3-pro-preview")) {
|
|
203
|
+
return "gemini-3-pro-preview";
|
|
204
|
+
}
|
|
205
|
+
if (lowercaseLabels.includes("opus"))
|
|
206
|
+
return "opus";
|
|
207
|
+
if (lowercaseLabels.includes("sonnet"))
|
|
208
|
+
return "sonnet";
|
|
209
|
+
if (lowercaseLabels.includes("haiku"))
|
|
210
|
+
return "haiku";
|
|
211
|
+
return undefined;
|
|
212
|
+
};
|
|
213
|
+
const agentFromDescription = descriptionAgentTagRaw?.toLowerCase();
|
|
214
|
+
const resolvedAgentFromDescription = agentFromDescription === "cursor"
|
|
215
|
+
? "cursor"
|
|
216
|
+
: agentFromDescription === "codex" || agentFromDescription === "openai"
|
|
217
|
+
? "codex"
|
|
218
|
+
: agentFromDescription === "gemini"
|
|
219
|
+
? "gemini"
|
|
220
|
+
: agentFromDescription === "claude"
|
|
221
|
+
? "claude"
|
|
222
|
+
: undefined;
|
|
223
|
+
const resolvedAgentFromLabels = resolveAgentFromLabel(normalizedLabels);
|
|
224
|
+
const modelFromDescription = descriptionModelTagRaw;
|
|
225
|
+
const modelFromLabels = resolveModelFromLabel(normalizedLabels);
|
|
226
|
+
const explicitModel = modelFromDescription || modelFromLabels;
|
|
227
|
+
const runnerType = resolvedAgentFromDescription ||
|
|
228
|
+
resolvedAgentFromLabels ||
|
|
229
|
+
inferRunnerFromModel(explicitModel) ||
|
|
230
|
+
this.getDefaultRunner();
|
|
231
|
+
// If an explicit agent conflicts with model's implied runner, keep the agent and reset model.
|
|
232
|
+
const modelRunner = inferRunnerFromModel(explicitModel);
|
|
233
|
+
let modelOverride = explicitModel;
|
|
234
|
+
if (modelOverride && modelRunner && modelRunner !== runnerType) {
|
|
235
|
+
modelOverride = undefined;
|
|
236
|
+
}
|
|
237
|
+
if (!modelOverride) {
|
|
238
|
+
modelOverride = defaultModelByRunner[runnerType];
|
|
239
|
+
}
|
|
240
|
+
let fallbackModelOverride = inferFallbackModel(modelOverride, runnerType);
|
|
241
|
+
if (!fallbackModelOverride) {
|
|
242
|
+
fallbackModelOverride = defaultFallbackByRunner[runnerType];
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
runnerType,
|
|
246
|
+
modelOverride,
|
|
247
|
+
fallbackModelOverride,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Resolve a tool preset string to an array of tool names.
|
|
252
|
+
*/
|
|
253
|
+
resolveToolPreset(preset) {
|
|
254
|
+
if (Array.isArray(preset)) {
|
|
255
|
+
return preset;
|
|
256
|
+
}
|
|
257
|
+
switch (preset) {
|
|
258
|
+
case "readOnly":
|
|
259
|
+
return getReadOnlyTools();
|
|
260
|
+
case "safe":
|
|
261
|
+
return getSafeTools();
|
|
262
|
+
case "all":
|
|
263
|
+
return getAllTools();
|
|
264
|
+
case "coordinator":
|
|
265
|
+
return getCoordinatorTools();
|
|
266
|
+
default:
|
|
267
|
+
// If it's a string but not a preset, treat it as a single tool
|
|
268
|
+
return [preset];
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Build allowed tools list with Linear MCP tools automatically included
|
|
273
|
+
*/
|
|
274
|
+
buildAllowedTools(repository, promptType) {
|
|
275
|
+
// graphite-orchestrator uses the same tool config as orchestrator
|
|
276
|
+
const effectivePromptType = promptType === "graphite-orchestrator" ? "orchestrator" : promptType;
|
|
277
|
+
let baseTools = [];
|
|
278
|
+
let toolSource = "";
|
|
279
|
+
// Priority order:
|
|
280
|
+
// 1. Repository-specific prompt type configuration
|
|
281
|
+
const promptConfig = effectivePromptType
|
|
282
|
+
? repository.labelPrompts?.[effectivePromptType]
|
|
283
|
+
: undefined;
|
|
284
|
+
// Only access allowedTools if config is object form (not simple string[])
|
|
285
|
+
const promptAllowedTools = promptConfig && !Array.isArray(promptConfig)
|
|
286
|
+
? promptConfig.allowedTools
|
|
287
|
+
: undefined;
|
|
288
|
+
if (promptAllowedTools) {
|
|
289
|
+
baseTools = this.resolveToolPreset(promptAllowedTools);
|
|
290
|
+
toolSource = `repository label prompt (${effectivePromptType})`;
|
|
291
|
+
}
|
|
292
|
+
// 2. Global prompt type defaults
|
|
293
|
+
else if (effectivePromptType &&
|
|
294
|
+
this.config.promptDefaults?.[effectivePromptType]?.allowedTools) {
|
|
295
|
+
baseTools = this.resolveToolPreset(this.config.promptDefaults[effectivePromptType].allowedTools);
|
|
296
|
+
toolSource = `global prompt defaults (${effectivePromptType})`;
|
|
297
|
+
}
|
|
298
|
+
// 3. Repository-level allowed tools
|
|
299
|
+
else if (repository.allowedTools) {
|
|
300
|
+
baseTools = repository.allowedTools;
|
|
301
|
+
toolSource = "repository configuration";
|
|
302
|
+
}
|
|
303
|
+
// 4. Global default allowed tools
|
|
304
|
+
else if (this.config.defaultAllowedTools) {
|
|
305
|
+
baseTools = this.config.defaultAllowedTools;
|
|
306
|
+
toolSource = "global defaults";
|
|
307
|
+
}
|
|
308
|
+
// 5. Fall back to safe tools
|
|
309
|
+
else {
|
|
310
|
+
baseTools = getSafeTools();
|
|
311
|
+
toolSource = "safe tools fallback";
|
|
312
|
+
}
|
|
313
|
+
// Linear MCP tools that should always be available
|
|
314
|
+
// See: https://docs.anthropic.com/en/docs/claude-code/iam#tool-specific-permission-rules
|
|
315
|
+
const linearMcpTools = ["mcp__linear", "mcp__cyrus-tools"];
|
|
316
|
+
// Combine and deduplicate
|
|
317
|
+
const allTools = [...new Set([...baseTools, ...linearMcpTools])];
|
|
318
|
+
this.logger.debug(`Tool selection for ${repository.name}: ${allTools.length} tools from ${toolSource}`);
|
|
319
|
+
return allTools;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Build disallowed tools list from repository and global config
|
|
323
|
+
*/
|
|
324
|
+
buildDisallowedTools(repository, promptType) {
|
|
325
|
+
// graphite-orchestrator uses the same tool config as orchestrator
|
|
326
|
+
const effectivePromptType = promptType === "graphite-orchestrator" ? "orchestrator" : promptType;
|
|
327
|
+
let disallowedTools = [];
|
|
328
|
+
let toolSource = "";
|
|
329
|
+
// Priority order (same as allowedTools):
|
|
330
|
+
// 1. Repository-specific prompt type configuration
|
|
331
|
+
const promptConfig = effectivePromptType
|
|
332
|
+
? repository.labelPrompts?.[effectivePromptType]
|
|
333
|
+
: undefined;
|
|
334
|
+
// Only access disallowedTools if config is object form (not simple string[])
|
|
335
|
+
const promptDisallowedTools = promptConfig && !Array.isArray(promptConfig)
|
|
336
|
+
? promptConfig.disallowedTools
|
|
337
|
+
: undefined;
|
|
338
|
+
if (promptDisallowedTools) {
|
|
339
|
+
disallowedTools = promptDisallowedTools;
|
|
340
|
+
toolSource = `repository label prompt (${effectivePromptType})`;
|
|
341
|
+
}
|
|
342
|
+
// 2. Global prompt type defaults
|
|
343
|
+
else if (effectivePromptType &&
|
|
344
|
+
this.config.promptDefaults?.[effectivePromptType]?.disallowedTools) {
|
|
345
|
+
disallowedTools =
|
|
346
|
+
this.config.promptDefaults[effectivePromptType].disallowedTools;
|
|
347
|
+
toolSource = `global prompt defaults (${effectivePromptType})`;
|
|
348
|
+
}
|
|
349
|
+
// 3. Repository-level disallowed tools
|
|
350
|
+
else if (repository.disallowedTools) {
|
|
351
|
+
disallowedTools = repository.disallowedTools;
|
|
352
|
+
toolSource = "repository configuration";
|
|
353
|
+
}
|
|
354
|
+
// 4. Global default disallowed tools
|
|
355
|
+
else if (this.config.defaultDisallowedTools) {
|
|
356
|
+
disallowedTools = this.config.defaultDisallowedTools;
|
|
357
|
+
toolSource = "global defaults";
|
|
358
|
+
}
|
|
359
|
+
// 5. No defaults for disallowedTools (as per requirements)
|
|
360
|
+
else {
|
|
361
|
+
disallowedTools = [];
|
|
362
|
+
toolSource = "none (no defaults)";
|
|
363
|
+
}
|
|
364
|
+
if (disallowedTools.length > 0) {
|
|
365
|
+
this.logger.debug(`Disallowed tools for ${repository.name}: ${disallowedTools.length} tools from ${toolSource}`);
|
|
366
|
+
}
|
|
367
|
+
return disallowedTools;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Merge subroutine-level disallowedTools with base disallowedTools
|
|
371
|
+
* @param session Current agent session
|
|
372
|
+
* @param baseDisallowedTools Base disallowed tools from repository/global config
|
|
373
|
+
* @param logContext Context string for logging (e.g., "EdgeWorker", "resumeClaudeSession")
|
|
374
|
+
* @param procedureAnalyzer ProcedureAnalyzer instance to resolve current subroutine
|
|
375
|
+
* @returns Merged disallowed tools list
|
|
376
|
+
*/
|
|
377
|
+
mergeSubroutineDisallowedTools(session, baseDisallowedTools, logContext, procedureAnalyzer) {
|
|
378
|
+
const currentSubroutine = procedureAnalyzer.getCurrentSubroutine(session);
|
|
379
|
+
if (currentSubroutine?.disallowedTools) {
|
|
380
|
+
const mergedTools = [
|
|
381
|
+
...new Set([
|
|
382
|
+
...baseDisallowedTools,
|
|
383
|
+
...currentSubroutine.disallowedTools,
|
|
384
|
+
]),
|
|
385
|
+
];
|
|
386
|
+
this.logger.debug(`[${logContext}] Merged subroutine-level disallowedTools for ${currentSubroutine.name}:`, currentSubroutine.disallowedTools);
|
|
387
|
+
return mergedTools;
|
|
388
|
+
}
|
|
389
|
+
return baseDisallowedTools;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=RunnerSelectionService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunnerSelectionService.js","sourceRoot":"","sources":["../src/RunnerSelectionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { type ILogger } from "cyrus-core";
|
|
2
3
|
import { type FastifyInstance } from "fastify";
|
|
3
4
|
/**
|
|
4
5
|
* OAuth callback state for tracking flows
|
|
@@ -36,7 +37,8 @@ export declare class SharedApplicationServer {
|
|
|
36
37
|
private isListening;
|
|
37
38
|
private tunnelClient;
|
|
38
39
|
private skipTunnel;
|
|
39
|
-
|
|
40
|
+
private logger;
|
|
41
|
+
constructor(port?: number, host?: string, skipTunnel?: boolean, logger?: ILogger);
|
|
40
42
|
/**
|
|
41
43
|
* Initialize the Fastify app instance (must be called before registering routes)
|
|
42
44
|
*/
|
|
@@ -1 +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;AAEjE,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,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;
|
|
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;AAEjE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CloudflareTunnelClient } from "cyrus-cloudflare-tunnel-client";
|
|
2
|
+
import { createLogger } from "cyrus-core";
|
|
2
3
|
import Fastify from "fastify";
|
|
3
4
|
/**
|
|
4
5
|
* Shared application server that handles both webhooks and OAuth callbacks on a single port
|
|
@@ -16,10 +17,13 @@ export class SharedApplicationServer {
|
|
|
16
17
|
isListening = false;
|
|
17
18
|
tunnelClient = null;
|
|
18
19
|
skipTunnel;
|
|
19
|
-
|
|
20
|
+
logger;
|
|
21
|
+
constructor(port = 3456, host = "localhost", skipTunnel = false, logger) {
|
|
20
22
|
this.port = port;
|
|
21
23
|
this.host = host;
|
|
22
24
|
this.skipTunnel = skipTunnel;
|
|
25
|
+
this.logger =
|
|
26
|
+
logger ?? createLogger({ component: "SharedApplicationServer" });
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
25
29
|
* Initialize the Fastify app instance (must be called before registering routes)
|
|
@@ -47,7 +51,7 @@ export class SharedApplicationServer {
|
|
|
47
51
|
host: this.host,
|
|
48
52
|
});
|
|
49
53
|
this.isListening = true;
|
|
50
|
-
|
|
54
|
+
this.logger.info(`Shared application server listening on http://${this.host}:${this.port}`);
|
|
51
55
|
// Start Cloudflare tunnel if CLOUDFLARE_TOKEN is set and tunnel is not skipped
|
|
52
56
|
if (!this.skipTunnel && process.env.CLOUDFLARE_TOKEN) {
|
|
53
57
|
await this.startCloudflareTunnel(process.env.CLOUDFLARE_TOKEN);
|
|
@@ -69,24 +73,24 @@ export class SharedApplicationServer {
|
|
|
69
73
|
// Listen for connection events (Cloudflare establishes 4 connections per tunnel)
|
|
70
74
|
this.tunnelClient.on("connected", () => {
|
|
71
75
|
connectionCount++;
|
|
72
|
-
|
|
76
|
+
this.logger.info(`Cloudflare tunnel connection ${connectionCount}/${requiredConnections} established`);
|
|
73
77
|
if (connectionCount === requiredConnections) {
|
|
74
|
-
|
|
78
|
+
this.logger.info("Cloudflare tunnel fully connected and ready");
|
|
75
79
|
resolve();
|
|
76
80
|
}
|
|
77
81
|
});
|
|
78
82
|
// Listen for ready event to get tunnel URL
|
|
79
83
|
this.tunnelClient.on("ready", (tunnelUrl) => {
|
|
80
|
-
|
|
84
|
+
this.logger.info(`Cloudflare tunnel URL: ${tunnelUrl}`);
|
|
81
85
|
});
|
|
82
86
|
// Listen for error events
|
|
83
87
|
this.tunnelClient.on("error", (error) => {
|
|
84
|
-
|
|
88
|
+
this.logger.error("Cloudflare tunnel error:", error);
|
|
85
89
|
reject(error);
|
|
86
90
|
});
|
|
87
91
|
// Listen for disconnect events
|
|
88
92
|
this.tunnelClient.on("disconnect", (reason) => {
|
|
89
|
-
|
|
93
|
+
this.logger.info(`Cloudflare tunnel disconnected: ${reason}`);
|
|
90
94
|
});
|
|
91
95
|
// Start the tunnel
|
|
92
96
|
this.tunnelClient.startTunnel().catch(reject);
|
|
@@ -105,19 +109,19 @@ export class SharedApplicationServer {
|
|
|
105
109
|
// Reject all pending approvals before shutdown
|
|
106
110
|
for (const [sessionId, approval] of this.pendingApprovals) {
|
|
107
111
|
approval.reject(new Error("Server shutting down"));
|
|
108
|
-
|
|
112
|
+
this.logger.debug(`Rejected pending approval for session ${sessionId} due to shutdown`);
|
|
109
113
|
}
|
|
110
114
|
this.pendingApprovals.clear();
|
|
111
115
|
// Stop Cloudflare tunnel if running
|
|
112
116
|
if (this.tunnelClient) {
|
|
113
117
|
this.tunnelClient.disconnect();
|
|
114
118
|
this.tunnelClient = null;
|
|
115
|
-
|
|
119
|
+
this.logger.info("Cloudflare tunnel stopped");
|
|
116
120
|
}
|
|
117
121
|
if (this.app && this.isListening) {
|
|
118
122
|
await this.app.close();
|
|
119
123
|
this.isListening = false;
|
|
120
|
-
|
|
124
|
+
this.logger.info("Shared application server stopped");
|
|
121
125
|
}
|
|
122
126
|
}
|
|
123
127
|
/**
|
|
@@ -146,12 +150,12 @@ export class SharedApplicationServer {
|
|
|
146
150
|
if (typeof secretOrHandler === "string" && handler) {
|
|
147
151
|
// ndjson-client style registration
|
|
148
152
|
this.webhookHandlers.set(token, { secret: secretOrHandler, handler });
|
|
149
|
-
|
|
153
|
+
this.logger.debug(`Registered webhook handler (proxy-style) for token ending in ...${token.slice(-4)}`);
|
|
150
154
|
}
|
|
151
155
|
else if (typeof secretOrHandler === "function") {
|
|
152
156
|
// Legacy direct registration
|
|
153
157
|
this.linearWebhookHandlers.set(token, secretOrHandler);
|
|
154
|
-
|
|
158
|
+
this.logger.debug(`Registered webhook handler (legacy direct-style) for token ending in ...${token.slice(-4)}`);
|
|
155
159
|
}
|
|
156
160
|
else {
|
|
157
161
|
throw new Error("Invalid webhook handler registration parameters");
|
|
@@ -164,7 +168,7 @@ export class SharedApplicationServer {
|
|
|
164
168
|
const hadProxyHandler = this.webhookHandlers.delete(token);
|
|
165
169
|
const hadDirectHandler = this.linearWebhookHandlers.delete(token);
|
|
166
170
|
if (hadProxyHandler || hadDirectHandler) {
|
|
167
|
-
|
|
171
|
+
this.logger.debug(`Unregistered webhook handler for token ending in ...${token.slice(-4)}`);
|
|
168
172
|
}
|
|
169
173
|
}
|
|
170
174
|
/**
|
|
@@ -184,14 +188,14 @@ export class SharedApplicationServer {
|
|
|
184
188
|
if (useDirectOAuth) {
|
|
185
189
|
// Use local OAuth authorize endpoint
|
|
186
190
|
authUrl = `${callbackBaseUrl}/oauth/authorize?callback=${encodeURIComponent(`${callbackBaseUrl}/callback`)}`;
|
|
187
|
-
|
|
191
|
+
this.logger.info(`Using direct OAuth mode (CYRUS_HOST_EXTERNAL=true)`);
|
|
188
192
|
}
|
|
189
193
|
else {
|
|
190
194
|
// Use proxy OAuth endpoint
|
|
191
195
|
authUrl = `${proxyUrl}/oauth/authorize?callback=${encodeURIComponent(`${callbackBaseUrl}/callback`)}`;
|
|
192
196
|
}
|
|
193
|
-
|
|
194
|
-
|
|
197
|
+
this.logger.info(`Opening your browser to authorize with Linear...`);
|
|
198
|
+
this.logger.info(`If the browser doesn't open, visit: ${authUrl}`);
|
|
195
199
|
// Timeout after 5 minutes
|
|
196
200
|
setTimeout(() => {
|
|
197
201
|
if (this.oauthCallbacks.has(flowId)) {
|
|
@@ -236,7 +240,7 @@ export class SharedApplicationServer {
|
|
|
236
240
|
});
|
|
237
241
|
// Generate approval URL
|
|
238
242
|
const url = `http://${this.host}:${this.port}/approval?session=${encodeURIComponent(sessionId)}`;
|
|
239
|
-
|
|
243
|
+
this.logger.debug(`Registered approval request for session ${sessionId}: ${url}`);
|
|
240
244
|
return { promise, url };
|
|
241
245
|
}
|
|
242
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedApplicationServer.js","sourceRoot":"","sources":["../src/SharedApplicationServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,OAAiC,MAAM,SAAS,CAAC;AAyBxD;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAC3B,GAAG,GAA2B,IAAI,CAAC;IACnC,eAAe,GAAG,IAAI,GAAG,EAM9B,CAAC;IACJ,sEAAsE;IAC9D,qBAAqB,GAAG,IAAI,GAAG,EAGpC,CAAC;IACI,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,gBAAgB,GAAG,IAAI,GAAG,EAA4B,CAAC;IACvD,IAAI,CAAS;IACb,IAAI,CAAS;IACb,WAAW,GAAG,KAAK,CAAC;IACpB,YAAY,GAAkC,IAAI,CAAC;IACnD,UAAU,CAAU;
|
|
1
|
+
{"version":3,"file":"SharedApplicationServer.js","sourceRoot":"","sources":["../src/SharedApplicationServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ILogger } from "cyrus-core";
|
|
1
2
|
/**
|
|
2
3
|
* Shared webhook server that can handle multiple Linear tokens
|
|
3
4
|
* Each token has its own webhook secret for signature verification
|
|
@@ -8,7 +9,8 @@ export declare class SharedWebhookServer {
|
|
|
8
9
|
private port;
|
|
9
10
|
private host;
|
|
10
11
|
private isListening;
|
|
11
|
-
|
|
12
|
+
private logger;
|
|
13
|
+
constructor(port?: number, host?: string, logger?: ILogger);
|
|
12
14
|
/**
|
|
13
15
|
* Start the shared webhook server
|
|
14
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedWebhookServer.d.ts","sourceRoot":"","sources":["../src/SharedWebhookServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SharedWebhookServer.d.ts","sourceRoot":"","sources":["../src/SharedWebhookServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD;;;GAGG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,eAAe,CAMnB;IACJ,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAU;gBAGvB,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE,MAAoB,EAC1B,MAAM,CAAC,EAAE,OAAO;IAOjB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;OAEG;IACH,sBAAsB,CACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,GACvE,IAAI;IAOP;;OAEG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO7C;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;YACW,oBAAoB;CAyFlC"}
|