@switchboard-mcp/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +9 -0
  2. package/dist/approvals/approval-requests.d.ts +151 -0
  3. package/dist/approvals/approval-requests.d.ts.map +1 -0
  4. package/dist/approvals/approval-requests.js +393 -0
  5. package/dist/approvals/approval-requests.js.map +1 -0
  6. package/dist/audit/audit-log.d.ts +45 -0
  7. package/dist/audit/audit-log.d.ts.map +1 -0
  8. package/dist/audit/audit-log.js +88 -0
  9. package/dist/audit/audit-log.js.map +1 -0
  10. package/dist/config/gitignore.d.ts +9 -0
  11. package/dist/config/gitignore.d.ts.map +1 -0
  12. package/dist/config/gitignore.js +90 -0
  13. package/dist/config/gitignore.js.map +1 -0
  14. package/dist/config/load-config.d.ts +28 -0
  15. package/dist/config/load-config.d.ts.map +1 -0
  16. package/dist/config/load-config.js +138 -0
  17. package/dist/config/load-config.js.map +1 -0
  18. package/dist/config/paths.d.ts +13 -0
  19. package/dist/config/paths.d.ts.map +1 -0
  20. package/dist/config/paths.js +38 -0
  21. package/dist/config/paths.js.map +1 -0
  22. package/dist/daemon/daemon-state.d.ts +44 -0
  23. package/dist/daemon/daemon-state.d.ts.map +1 -0
  24. package/dist/daemon/daemon-state.js +110 -0
  25. package/dist/daemon/daemon-state.js.map +1 -0
  26. package/dist/import/import-plan.d.ts +92 -0
  27. package/dist/import/import-plan.d.ts.map +1 -0
  28. package/dist/import/import-plan.js +677 -0
  29. package/dist/import/import-plan.js.map +1 -0
  30. package/dist/index.d.ts +18 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +18 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/install/client-config.d.ts +73 -0
  35. package/dist/install/client-config.d.ts.map +1 -0
  36. package/dist/install/client-config.js +514 -0
  37. package/dist/install/client-config.js.map +1 -0
  38. package/dist/mandates/mandates.d.ts +244 -0
  39. package/dist/mandates/mandates.d.ts.map +1 -0
  40. package/dist/mandates/mandates.js +690 -0
  41. package/dist/mandates/mandates.js.map +1 -0
  42. package/dist/namespaces/namespaces.d.ts +16 -0
  43. package/dist/namespaces/namespaces.d.ts.map +1 -0
  44. package/dist/namespaces/namespaces.js +49 -0
  45. package/dist/namespaces/namespaces.js.map +1 -0
  46. package/dist/onboarding/init-config.d.ts +19 -0
  47. package/dist/onboarding/init-config.d.ts.map +1 -0
  48. package/dist/onboarding/init-config.js +85 -0
  49. package/dist/onboarding/init-config.js.map +1 -0
  50. package/dist/providers/provider-add.d.ts +25 -0
  51. package/dist/providers/provider-add.d.ts.map +1 -0
  52. package/dist/providers/provider-add.js +179 -0
  53. package/dist/providers/provider-add.js.map +1 -0
  54. package/dist/providers/provider-templates.d.ts +96 -0
  55. package/dist/providers/provider-templates.d.ts.map +1 -0
  56. package/dist/providers/provider-templates.js +556 -0
  57. package/dist/providers/provider-templates.js.map +1 -0
  58. package/dist/scan/scan.d.ts +67 -0
  59. package/dist/scan/scan.d.ts.map +1 -0
  60. package/dist/scan/scan.js +389 -0
  61. package/dist/scan/scan.js.map +1 -0
  62. package/dist/schemas/config.d.ts +197 -0
  63. package/dist/schemas/config.d.ts.map +1 -0
  64. package/dist/schemas/config.js +133 -0
  65. package/dist/schemas/config.js.map +1 -0
  66. package/dist/secrets/secret-refs.d.ts +10 -0
  67. package/dist/secrets/secret-refs.d.ts.map +1 -0
  68. package/dist/secrets/secret-refs.js +32 -0
  69. package/dist/secrets/secret-refs.js.map +1 -0
  70. package/dist/secrets/secrets.d.ts +63 -0
  71. package/dist/secrets/secrets.d.ts.map +1 -0
  72. package/dist/secrets/secrets.js +301 -0
  73. package/dist/secrets/secrets.js.map +1 -0
  74. package/package.json +42 -0
@@ -0,0 +1,556 @@
1
+ import { stringify as stringifyYaml } from "yaml";
2
+ import { evaluateMandateToolPolicy } from "../mandates/mandates.js";
3
+ import { normalizeNamespace } from "../namespaces/namespaces.js";
4
+ import { switchboardConfigSchema } from "../schemas/config.js";
5
+ export const providerSafetyTemplates = [
6
+ {
7
+ id: "github-ci",
8
+ provider: "github",
9
+ label: "GitHub CI",
10
+ description: "Generic GitHub MCP profile shape for inspecting checks and cautiously rerunning CI under a mandate.",
11
+ defaultProfileName: "github_ci",
12
+ defaultNamespace: "github_ci",
13
+ defaultSecretRef: "github/example/dev/token",
14
+ secretEnvName: "GITHUB_PERSONAL_ACCESS_TOKEN",
15
+ defaultCommand: "docker",
16
+ defaultArgs: [
17
+ "run",
18
+ "-i",
19
+ "--rm",
20
+ "-e",
21
+ "GITHUB_PERSONAL_ACCESS_TOKEN",
22
+ "ghcr.io/github/github-mcp-server"
23
+ ],
24
+ environment: "development",
25
+ readOnly: false,
26
+ mode: "guarded",
27
+ recommendedMandate: {
28
+ task: "fix-ci",
29
+ agent: "implementer",
30
+ branch: "fix/ci",
31
+ lease: "2h",
32
+ allowedTools: ["{namespace}_*"],
33
+ deniedTools: [
34
+ "{namespace}_deploy_prod",
35
+ "{namespace}_delete*",
36
+ "{namespace}_delete_*",
37
+ "{namespace}_admin_*",
38
+ "{namespace}_create_repository"
39
+ ],
40
+ approvalGates: [
41
+ {
42
+ toolPattern: "{namespace}_*comment*",
43
+ reason: "commenting changes GitHub conversation state",
44
+ risk: "medium",
45
+ labels: ["github", "write"]
46
+ },
47
+ {
48
+ toolPattern: "{namespace}_add_reply*",
49
+ reason: "replying changes GitHub conversation state",
50
+ risk: "medium",
51
+ labels: ["github", "write"]
52
+ },
53
+ {
54
+ toolPattern: "{namespace}_assign_copilot*",
55
+ reason: "assigning Copilot starts delegated remote work",
56
+ risk: "high",
57
+ labels: ["github", "copilot", "write"]
58
+ },
59
+ {
60
+ toolPattern: "{namespace}_create*",
61
+ reason: "creating GitHub resources changes repository or account state",
62
+ risk: "high",
63
+ labels: ["github", "write"]
64
+ },
65
+ {
66
+ toolPattern: "{namespace}_fork_*",
67
+ reason: "forking creates a repository under an account or organization",
68
+ risk: "medium",
69
+ labels: ["github", "write"]
70
+ },
71
+ {
72
+ toolPattern: "{namespace}_*write*",
73
+ reason: "write tools change GitHub repository, issue, or pull request state",
74
+ risk: "medium",
75
+ labels: ["github", "write"]
76
+ },
77
+ {
78
+ toolPattern: "{namespace}_*rerun*",
79
+ reason: "rerunning CI changes remote provider state",
80
+ risk: "medium",
81
+ labels: ["github", "write"]
82
+ },
83
+ {
84
+ toolPattern: "{namespace}_push_*",
85
+ reason: "pushing changes repository contents or refs",
86
+ risk: "high",
87
+ labels: ["github", "write"]
88
+ },
89
+ {
90
+ toolPattern: "{namespace}_*update*",
91
+ reason: "updating GitHub resources changes repository state",
92
+ risk: "medium",
93
+ labels: ["github", "write"]
94
+ },
95
+ {
96
+ toolPattern: "{namespace}_*merge*",
97
+ reason: "merging changes repository state and should stay human-gated",
98
+ risk: "high",
99
+ labels: ["github", "write"]
100
+ }
101
+ ]
102
+ },
103
+ credentialGuidance: {
104
+ posture: "Start with a repo-scoped token that can read repository metadata, pull requests, checks, and workflow status. Add write scopes only when the team intends to approve CI reruns or GitHub write actions.",
105
+ minimumScopes: [
106
+ "read repository metadata",
107
+ "read pull requests",
108
+ "read checks/statuses",
109
+ "read workflow runs/logs"
110
+ ],
111
+ approvalScopes: [
112
+ "rerun workflow jobs",
113
+ "write pull request comments or reviews",
114
+ "push branches or update pull requests"
115
+ ],
116
+ avoidScopes: [
117
+ "admin:org",
118
+ "delete_repo",
119
+ "repository creation",
120
+ "production deployment credentials"
121
+ ],
122
+ notes: [
123
+ "Use the narrowest GitHub token model available for the target repo or org.",
124
+ "If a needed write action requires broader scopes, keep the matching tool approval-gated and record the reason in the mandate."
125
+ ]
126
+ },
127
+ notes: [
128
+ "Use a least-privilege token that can read repo metadata and checks; add write scopes only for the exact CI actions you intend to approve.",
129
+ "Keep production deployment and admin tools outside the mandate allow list unless a human explicitly gates them."
130
+ ]
131
+ },
132
+ {
133
+ id: "stripe-test",
134
+ provider: "stripe",
135
+ label: "Stripe Test",
136
+ description: "Stripe test-mode MCP profile shape for inspecting test payments without touching live money.",
137
+ defaultProfileName: "stripe_test",
138
+ defaultNamespace: "stripe_test",
139
+ defaultSecretRef: "stripe/example/test/secret-key",
140
+ secretEnvName: "STRIPE_API_KEY",
141
+ defaultCommand: "npx",
142
+ defaultArgs: ["-y", "@stripe/mcp", "--tools=all"],
143
+ environment: "test",
144
+ readOnly: false,
145
+ mode: "guarded",
146
+ recommendedMandate: {
147
+ task: "inspect-test-payments",
148
+ agent: "implementer",
149
+ branch: "fix/payments",
150
+ lease: "2h",
151
+ allowedTools: ["{namespace}_*"],
152
+ deniedTools: [
153
+ "{namespace}_*live*",
154
+ "{namespace}_*production*",
155
+ "{namespace}_create_live*",
156
+ "{namespace}_delete*",
157
+ "{namespace}_delete_*",
158
+ "{namespace}_admin_*",
159
+ "{namespace}_account_*",
160
+ "{namespace}_payout*",
161
+ "{namespace}_transfer*",
162
+ "{namespace}_terminal*",
163
+ "{namespace}_issuing*",
164
+ "{namespace}_treasury*",
165
+ "{namespace}_webhook*",
166
+ "{namespace}_secret*",
167
+ "{namespace}_token*"
168
+ ],
169
+ approvalGates: [
170
+ {
171
+ toolPattern: "{namespace}_create*",
172
+ reason: "creating Stripe test resources changes payment state and should be intentional",
173
+ risk: "medium",
174
+ labels: ["stripe", "test", "write"]
175
+ },
176
+ {
177
+ toolPattern: "{namespace}_update*",
178
+ reason: "updating Stripe test resources changes payment state and should be intentional",
179
+ risk: "medium",
180
+ labels: ["stripe", "test", "write"]
181
+ },
182
+ {
183
+ toolPattern: "{namespace}_refund*",
184
+ reason: "refund-like Stripe actions affect money-shaped records even in test mode",
185
+ risk: "high",
186
+ labels: ["stripe", "test", "money"]
187
+ },
188
+ {
189
+ toolPattern: "{namespace}_cancel*",
190
+ reason: "cancelling Stripe resources can invalidate test sessions or subscriptions",
191
+ risk: "medium",
192
+ labels: ["stripe", "test", "write"]
193
+ },
194
+ {
195
+ toolPattern: "{namespace}_capture*",
196
+ reason: "capturing payment intents is payment-affecting even in test mode",
197
+ risk: "high",
198
+ labels: ["stripe", "test", "money"]
199
+ },
200
+ {
201
+ toolPattern: "{namespace}_confirm*",
202
+ reason: "confirming payment intents is payment-affecting even in test mode",
203
+ risk: "high",
204
+ labels: ["stripe", "test", "money"]
205
+ }
206
+ ]
207
+ },
208
+ credentialGuidance: {
209
+ posture: "Use a restricted Stripe test-mode secret key. Never use live keys for this preset.",
210
+ minimumScopes: [
211
+ "read test-mode customers",
212
+ "read test-mode payment intents",
213
+ "read test-mode charges",
214
+ "read test-mode subscriptions"
215
+ ],
216
+ approvalScopes: [
217
+ "create or update test-mode customers",
218
+ "create or update test-mode payment intents",
219
+ "refund or cancel test-mode payment records"
220
+ ],
221
+ avoidScopes: [
222
+ "live-mode secret keys",
223
+ "payouts or transfers",
224
+ "account administration",
225
+ "webhook secret management"
226
+ ],
227
+ notes: [
228
+ "Stripe test keys start with sk_test; live keys start with sk_live and should not be used with this preset.",
229
+ "Keep money-affecting write tools approval-gated even when the key is test-mode."
230
+ ]
231
+ },
232
+ notes: [
233
+ "This preset is for Stripe test-mode only: agents can inspect test payments without touching real money.",
234
+ "If a live/prod-looking key or tool surface appears, stop and switch to a test-mode key before running unattended work."
235
+ ]
236
+ },
237
+ {
238
+ id: "vercel-preview",
239
+ provider: "vercel",
240
+ label: "Vercel Preview",
241
+ description: "Generic Vercel MCP profile shape for preview deployment/log inspection with production actions denied.",
242
+ defaultProfileName: "vercel_preview",
243
+ defaultNamespace: "vercel_preview",
244
+ defaultSecretRef: "vercel/example/preview/token",
245
+ secretEnvName: "VERCEL_TOKEN",
246
+ defaultCommand: "npx",
247
+ defaultArgs: ["-y", "vercel-platform-mcp-server"],
248
+ defaultEnv: {
249
+ VERCEL_ENABLED_TOOLGROUPS: "readonly"
250
+ },
251
+ environment: "staging",
252
+ readOnly: false,
253
+ mode: "guarded",
254
+ recommendedMandate: {
255
+ task: "inspect-preview",
256
+ agent: "implementer",
257
+ branch: "fix/preview",
258
+ lease: "2h",
259
+ allowedTools: ["{namespace}_*"],
260
+ deniedTools: [
261
+ "{namespace}_deploy_prod",
262
+ "{namespace}_deploy_production",
263
+ "{namespace}_*prod*",
264
+ "{namespace}_*production*",
265
+ "{namespace}_promote_*",
266
+ "{namespace}_create_env",
267
+ "{namespace}_*env*",
268
+ "{namespace}_environment_*",
269
+ "{namespace}_domain_*",
270
+ "{namespace}_env_*",
271
+ "{namespace}_domains_*",
272
+ "{namespace}_*secret*",
273
+ "{namespace}_*token*",
274
+ "{namespace}_billing_*",
275
+ "{namespace}_team_*"
276
+ ],
277
+ approvalGates: [
278
+ {
279
+ toolPattern: "{namespace}_create_deployment",
280
+ reason: "creating deployments changes remote provider state",
281
+ risk: "medium",
282
+ labels: ["vercel", "write"]
283
+ },
284
+ {
285
+ toolPattern: "{namespace}_cancel_deployment",
286
+ reason: "cancelling deployments changes remote provider state",
287
+ risk: "medium",
288
+ labels: ["vercel", "write"]
289
+ },
290
+ {
291
+ toolPattern: "{namespace}_delete_deployment",
292
+ reason: "deleting deployments changes remote provider state",
293
+ risk: "high",
294
+ labels: ["vercel", "write"]
295
+ },
296
+ {
297
+ toolPattern: "{namespace}_*rollback*",
298
+ reason: "rollback actions can affect shared environments",
299
+ risk: "high",
300
+ labels: ["vercel", "write"]
301
+ }
302
+ ]
303
+ },
304
+ credentialGuidance: {
305
+ posture: "Use a token scoped to the Vercel team and project needed for preview inspection. Prefer read/log access first; add deploy or rollback capability only when those tools remain approval-gated.",
306
+ minimumScopes: [
307
+ "read project metadata",
308
+ "read deployments",
309
+ "read build/runtime logs"
310
+ ],
311
+ approvalScopes: [
312
+ "create preview deployments",
313
+ "rollback preview deployments"
314
+ ],
315
+ avoidScopes: [
316
+ "production promotion",
317
+ "environment variable writes",
318
+ "domain management",
319
+ "team or billing administration"
320
+ ],
321
+ notes: [
322
+ "Keep production deploy, promote, env, and domain tools denied unless a specific mandate intentionally changes that posture.",
323
+ "Use a separate token for preview dogfood instead of a broad personal production token."
324
+ ]
325
+ },
326
+ notes: [
327
+ "Prefer a token scoped to the project/team needed for the current repo.",
328
+ "Production promotion, environment-variable edits, and domain changes should remain denied or approval-gated."
329
+ ]
330
+ }
331
+ ];
332
+ export function listProviderSafetyTemplates() {
333
+ return providerSafetyTemplates;
334
+ }
335
+ export function getProviderSafetyTemplate(id) {
336
+ return providerSafetyTemplates.find((template) => template.id === id);
337
+ }
338
+ export function renderProviderSafetyTemplate(id, options = {}) {
339
+ const template = getProviderSafetyTemplate(id);
340
+ if (!template) {
341
+ throw new Error(`unknown provider safety template "${id}"`);
342
+ }
343
+ const profileName = options.profileName ?? template.defaultProfileName;
344
+ const namespace = normalizeNamespace(options.namespace ?? template.defaultNamespace);
345
+ const secretRef = options.secretRef ?? template.defaultSecretRef;
346
+ const command = options.command ?? template.defaultCommand;
347
+ const args = options.args ?? template.defaultArgs;
348
+ const config = {
349
+ version: 1,
350
+ profiles: {
351
+ [profileName]: {
352
+ provider: template.provider,
353
+ environment: template.environment,
354
+ namespace,
355
+ readOnly: template.readOnly,
356
+ mode: template.mode,
357
+ enforcement: "switchboard",
358
+ description: template.description,
359
+ upstream: {
360
+ type: "stdio",
361
+ command,
362
+ ...(args.length > 0 ? { args } : {}),
363
+ env: {
364
+ ...(template.defaultEnv ?? {}),
365
+ [template.secretEnvName]: {
366
+ secretRef
367
+ }
368
+ }
369
+ }
370
+ }
371
+ },
372
+ workspaces: {
373
+ default: {
374
+ paths: ["."],
375
+ profiles: [profileName],
376
+ defaultEnvironment: template.environment
377
+ }
378
+ }
379
+ };
380
+ const parsed = switchboardConfigSchema.safeParse(config);
381
+ if (!parsed.success) {
382
+ throw new Error(parsed.error.issues.map((issue) => issue.message).join("\n"));
383
+ }
384
+ const mandateCommandArgs = renderMandateCommandArgs(template, profileName, namespace, options.mandateBranch ? { branch: options.mandateBranch } : {});
385
+ return {
386
+ template,
387
+ profileName,
388
+ namespace,
389
+ secretRef,
390
+ command,
391
+ args,
392
+ configYaml: stringifyYaml(config, { lineWidth: 0 }),
393
+ secretCommands: [`switchboard secrets set ${secretRef} --value-stdin`],
394
+ mandateCommand: mandateCommandArgs.map(shellQuoteIfNeeded).join(" "),
395
+ mandateCommandArgs,
396
+ credentialGuidance: template.credentialGuidance,
397
+ notes: template.notes
398
+ };
399
+ }
400
+ export function providerSafetyTemplatePolicy(id, namespaceInput) {
401
+ const template = getProviderSafetyTemplate(id);
402
+ if (!template) {
403
+ throw new Error(`unknown provider safety template "${id}"`);
404
+ }
405
+ const namespace = normalizeNamespace(namespaceInput ?? template.defaultNamespace);
406
+ return {
407
+ allowedTools: template.recommendedMandate.allowedTools.map((pattern) => interpolateNamespace(pattern, namespace)),
408
+ deniedTools: template.recommendedMandate.deniedTools.map((pattern) => interpolateNamespace(pattern, namespace)),
409
+ approvalGates: template.recommendedMandate.approvalGates.map((gate, index) => ({
410
+ id: `gate-${index + 1}`,
411
+ toolPattern: interpolateNamespace(gate.toolPattern, namespace),
412
+ reason: gate.reason,
413
+ risk: gate.risk,
414
+ labels: gate.labels
415
+ }))
416
+ };
417
+ }
418
+ export function checkProviderSafetyTemplateTools(id, options) {
419
+ const template = getProviderSafetyTemplate(id);
420
+ if (!template) {
421
+ throw new Error(`unknown provider safety template "${id}"`);
422
+ }
423
+ const namespace = normalizeNamespace(options.namespace ?? template.defaultNamespace);
424
+ const policy = providerSafetyTemplatePolicy(id, namespace);
425
+ const tools = options.toolNames.map((toolName) => classifyProviderPresetTool(toolName, policy));
426
+ const counts = {
427
+ tools: tools.length,
428
+ allowed: tools.filter((tool) => tool.classification === "allowed").length,
429
+ allowedSensitive: tools.filter((tool) => tool.classification === "allowed_sensitive").length,
430
+ approvalRequired: tools.filter((tool) => tool.classification === "approval_required").length,
431
+ denied: tools.filter((tool) => tool.classification === "denied").length,
432
+ notAllowed: tools.filter((tool) => tool.classification === "not_allowed")
433
+ .length
434
+ };
435
+ const policyCovered = counts.allowedSensitive === 0 && counts.notAllowed === 0;
436
+ const requiresMandatePolicy = counts.approvalRequired > 0 || counts.denied > 0 || counts.allowedSensitive > 0;
437
+ const nextActions = [
438
+ ...(requiresMandatePolicy
439
+ ? [
440
+ "Use this profile through a mandate that applies the rendered allow, deny, and approval policy; direct unmandated profile use is not safety-checked."
441
+ ]
442
+ : []),
443
+ ...(counts.allowedSensitive > 0
444
+ ? [
445
+ "Review allowed sensitive-looking tools and add deny or approval patterns before using this preset for unattended work."
446
+ ]
447
+ : []),
448
+ ...(counts.notAllowed > 0
449
+ ? [
450
+ "Check that the rendered namespace matches the configured profile namespace."
451
+ ]
452
+ : [])
453
+ ];
454
+ return {
455
+ template,
456
+ namespace,
457
+ policy,
458
+ ok: policyCovered,
459
+ policyCovered,
460
+ requiresMandatePolicy,
461
+ counts,
462
+ tools,
463
+ nextActions
464
+ };
465
+ }
466
+ function renderMandateCommandArgs(template, profileName, namespace, options = {}) {
467
+ const policy = providerSafetyTemplatePolicy(template.id, namespace);
468
+ const branch = options.branch ?? template.recommendedMandate.branch;
469
+ return [
470
+ "switchboard",
471
+ "mandate",
472
+ "create",
473
+ template.recommendedMandate.task,
474
+ "--agent",
475
+ template.recommendedMandate.agent,
476
+ "--profiles",
477
+ profileName,
478
+ "--branch",
479
+ branch,
480
+ "--lease",
481
+ template.recommendedMandate.lease,
482
+ ...(policy.allowedTools ?? []).flatMap((pattern) => [
483
+ "--allow-tool",
484
+ pattern
485
+ ]),
486
+ ...(policy.deniedTools ?? []).flatMap((pattern) => [
487
+ "--deny-tool",
488
+ pattern
489
+ ]),
490
+ ...(policy.approvalGates ?? []).flatMap((gate) => [
491
+ "--require-approval-tool",
492
+ gate.toolPattern,
493
+ "--require-approval-reason",
494
+ gate.reason ?? "",
495
+ ...(gate.risk ? ["--require-approval-risk", gate.risk] : []),
496
+ ...(gate.labels && gate.labels.length > 0
497
+ ? ["--require-approval-labels", gate.labels.join(",")]
498
+ : [])
499
+ ])
500
+ ];
501
+ }
502
+ function classifyProviderPresetTool(toolName, policy) {
503
+ const decision = evaluateMandateToolPolicy(toolName, policy);
504
+ if (!decision.allowed && "approvalRequired" in decision) {
505
+ return {
506
+ toolName,
507
+ classification: "approval_required",
508
+ reason: decision.reason,
509
+ approvalGateId: decision.approvalGate.id,
510
+ approvalGatePattern: decision.approvalGate.toolPattern
511
+ };
512
+ }
513
+ if (!decision.allowed && decision.reason.includes("is denied")) {
514
+ return {
515
+ toolName,
516
+ classification: "denied",
517
+ reason: decision.reason
518
+ };
519
+ }
520
+ if (!decision.allowed) {
521
+ return {
522
+ toolName,
523
+ classification: "not_allowed",
524
+ reason: decision.reason
525
+ };
526
+ }
527
+ if (isSensitiveLookingToolName(toolName)) {
528
+ return {
529
+ toolName,
530
+ classification: "allowed_sensitive",
531
+ reason: "tool name looks write-like or privileged but is currently allowed without explicit approval"
532
+ };
533
+ }
534
+ return {
535
+ toolName,
536
+ classification: "allowed",
537
+ reason: "tool is allowed by the preset policy"
538
+ };
539
+ }
540
+ function isSensitiveLookingToolName(toolName) {
541
+ const normalized = toolName
542
+ .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
543
+ .replace(/[^A-Za-z0-9]+/g, "_")
544
+ .toLowerCase();
545
+ return /(^|_)(admin|cancel|create|delete|deploy|destroy|domain|drop|env|merge|promote|remove|rerun|rollback|secret|set|token|update|write)(_|$)/.test(normalized);
546
+ }
547
+ function interpolateNamespace(value, namespace) {
548
+ return value.replaceAll("{namespace}", namespace);
549
+ }
550
+ function shellQuoteIfNeeded(value) {
551
+ if (/^[A-Za-z0-9_./:-]+$/.test(value)) {
552
+ return value;
553
+ }
554
+ return `'${value.replace(/'/g, "'\\''")}'`;
555
+ }
556
+ //# sourceMappingURL=provider-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-templates.js","sourceRoot":"","sources":["../../src/providers/provider-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { ProjectClientConfigInspection } from "../install/client-config.js";
2
+ export declare const scanSchemaVersion = "switchboard.scan.v1";
3
+ export type ScanProviderId = "github" | "vercel" | "stripe" | "supabase" | "posthog";
4
+ export type ScanEnvironmentClass = "dev" | "test" | "preview" | "prod" | "unknown";
5
+ export interface SwitchboardScanOptions {
6
+ cwd?: string;
7
+ env?: NodeJS.ProcessEnv;
8
+ homeDir?: string;
9
+ command?: string;
10
+ commandArgs?: string[];
11
+ }
12
+ export interface SwitchboardScanResult {
13
+ schemaVersion: typeof scanSchemaVersion;
14
+ repo: {
15
+ cwd: string;
16
+ gitRoot: string | null;
17
+ name: string;
18
+ branch: string | null;
19
+ remote: {
20
+ url: string | null;
21
+ owner: string | null;
22
+ repo: string | null;
23
+ provider: "github" | "unknown" | null;
24
+ };
25
+ };
26
+ runtime: {
27
+ kind: "local" | "git-worktree";
28
+ devcontainerPresent: boolean;
29
+ vercelProjectPresent: boolean;
30
+ };
31
+ clients: Array<Pick<ProjectClientConfigInspection, "client" | "targetPath" | "status" | "message" | "otherServerNames">>;
32
+ providers: ScanProviderHint[];
33
+ switchboard: {
34
+ configSources: Array<{
35
+ kind: string;
36
+ path?: string;
37
+ loaded: boolean;
38
+ }>;
39
+ profileNames: string[];
40
+ workspaceNames: string[];
41
+ };
42
+ suggestions: ScanSuggestion[];
43
+ warnings: string[];
44
+ nextActions: string[];
45
+ }
46
+ export interface ScanProviderHint {
47
+ provider: ScanProviderId;
48
+ sources: ScanProviderSource[];
49
+ envVars: string[];
50
+ environment: ScanEnvironmentClass;
51
+ switchboardProfiles: string[];
52
+ }
53
+ export interface ScanProviderSource {
54
+ kind: "env-file" | "directory" | "file" | "client-config";
55
+ path: string;
56
+ detail?: string;
57
+ }
58
+ export interface ScanSuggestion {
59
+ kind: "provider-profile" | "client-install" | "mandate";
60
+ provider?: ScanProviderId;
61
+ profileName?: string;
62
+ namespace?: string;
63
+ command: string;
64
+ reason: string;
65
+ }
66
+ export declare function scanSwitchboardProject(options?: SwitchboardScanOptions): Promise<SwitchboardScanResult>;
67
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/scan/scan.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAEjF,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AAEvD,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,MAAM,oBAAoB,GAC5B,KAAK,GACL,MAAM,GACN,SAAS,GACT,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,OAAO,iBAAiB,CAAC;IACxC,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;YACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;SACvC,CAAC;KACH,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC;QAC/B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,oBAAoB,EAAE,OAAO,CAAC;KAC/B,CAAC;IACF,OAAO,EAAE,KAAK,CACZ,IAAI,CACF,6BAA6B,EAC7B,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CACpE,CACF,CAAC;IACF,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,WAAW,EAAE;QACX,aAAa,EAAE,KAAK,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,OAAO,CAAC;SACjB,CAAC,CAAC;QACH,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,oBAAoB,CAAC;IAClC,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,eAAe,CAAC;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAoCD,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAsEhC"}