@treeseed/sdk 0.6.16 → 0.6.17

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 (47) hide show
  1. package/dist/db/d1.d.ts +3493 -0
  2. package/dist/db/d1.js +8 -0
  3. package/dist/db/index.d.ts +2 -0
  4. package/dist/db/index.js +2 -0
  5. package/dist/db/node-sqlite.d.ts +3544 -0
  6. package/dist/db/node-sqlite.js +119 -0
  7. package/dist/db/schema.d.ts +6272 -0
  8. package/dist/db/schema.js +231 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.js +1 -0
  11. package/dist/operations/providers/default.js +1 -0
  12. package/dist/operations/services/commit-message-provider.d.ts +33 -1
  13. package/dist/operations/services/commit-message-provider.js +228 -51
  14. package/dist/operations/services/config-runtime.js +0 -1
  15. package/dist/operations/services/deploy.d.ts +19 -5
  16. package/dist/operations/services/deploy.js +75 -36
  17. package/dist/operations/services/github-actions-verification.d.ts +123 -0
  18. package/dist/operations/services/github-actions-verification.js +440 -0
  19. package/dist/operations/services/mailpit-runtime.d.ts +5 -0
  20. package/dist/operations/services/mailpit-runtime.js +2 -2
  21. package/dist/operations/services/repository-save-orchestrator.js +64 -8
  22. package/dist/operations/services/runtime-tools.d.ts +6 -0
  23. package/dist/operations/services/runtime-tools.js +11 -0
  24. package/dist/operations-registry.js +1 -0
  25. package/dist/platform/contracts.d.ts +6 -0
  26. package/dist/platform/deploy-config.js +17 -0
  27. package/dist/reconcile/builtin-adapters.js +2 -16
  28. package/dist/reconcile/contracts.d.ts +1 -1
  29. package/dist/reconcile/desired-state.d.ts +6 -0
  30. package/dist/reconcile/desired-state.js +1 -13
  31. package/dist/reconcile/engine.d.ts +12 -0
  32. package/dist/reconcile/state.js +2 -1
  33. package/dist/reconcile/units.js +0 -1
  34. package/dist/scripts/tenant-d1-migrate-local.js +5 -2
  35. package/dist/scripts/tenant-destroy.js +3 -1
  36. package/dist/sdk.js +2 -6
  37. package/dist/types/cloudflare.d.ts +0 -1
  38. package/dist/workflow/operations.d.ts +2 -1
  39. package/dist/workflow/operations.js +115 -35
  40. package/dist/workflow-support.d.ts +1 -0
  41. package/dist/workflow-support.js +6 -0
  42. package/dist/workflow.d.ts +24 -2
  43. package/dist/workflow.js +6 -0
  44. package/package.json +19 -5
  45. package/templates/github/deploy.workflow.yml +4 -0
  46. package/dist/wrangler-d1.d.ts +0 -25
  47. package/dist/wrangler-d1.js +0 -89
@@ -226,7 +226,7 @@ function resolveTargetPaths(tenantRoot, scopeOrTarget = "prod") {
226
226
  target,
227
227
  generatedRoot,
228
228
  wranglerPath: resolve(generatedRoot, "wrangler.toml"),
229
- workerEntryPath: resolve(generatedRoot, "worker/index.js"),
229
+ workerEntryPath: resolve(tenantRoot, "dist/_worker.js/index.js"),
230
230
  statePath
231
231
  };
232
232
  }
@@ -314,6 +314,59 @@ function buildPublicVars(deployConfig) {
314
314
  TREESEED_WEB_CACHE_R2_STALE_IF_ERROR_SECONDS: String(webCachePolicy.r2PublishedObjects.staleIfErrorSeconds)
315
315
  };
316
316
  }
317
+ function envValue(env, key) {
318
+ const value = env?.[key] ?? process.env[key];
319
+ return typeof value === "string" && value.trim() ? value.trim() : null;
320
+ }
321
+ const LOCAL_RUNTIME_AUTH_ENV_KEYS = [
322
+ "BETTER_AUTH_URL",
323
+ "TREESEED_SITE_URL",
324
+ "TREESEED_AUTH_MODE",
325
+ "TREESEED_AUTH_INTERNAL_SIGNUP",
326
+ "TREESEED_AUTH_EMAIL_LINKING",
327
+ "TREESEED_AUTH_ALLOW_MEMORY_DB",
328
+ "TREESEED_AUTH_LOCAL_USE_MAILPIT",
329
+ "TREESEED_AUTH_EMAIL_FROM",
330
+ "TREESEED_WEB_SESSION_TTL",
331
+ "TREESEED_API_BOOTSTRAP_ADMIN_ALLOWLIST",
332
+ "TREESEED_API_AUTH_SECRET",
333
+ "TREESEED_API_ISSUER",
334
+ "TREESEED_API_ACCESS_TOKEN_TTL",
335
+ "TREESEED_API_REFRESH_TOKEN_TTL",
336
+ "TREESEED_API_DEVICE_CODE_TTL",
337
+ "TREESEED_API_DEVICE_ACCESS_TOKEN_TTL",
338
+ "TREESEED_API_DEVICE_POLL_INTERVAL",
339
+ "TREESEED_API_WEB_EXCHANGE_TTL",
340
+ "TREESEED_GITHUB_CLIENT_ID",
341
+ "TREESEED_GITHUB_CLIENT_SECRET",
342
+ "TREESEED_GOOGLE_CLIENT_ID",
343
+ "TREESEED_GOOGLE_CLIENT_SECRET",
344
+ "TREESEED_MICROSOFT_CLIENT_ID",
345
+ "TREESEED_MICROSOFT_CLIENT_SECRET",
346
+ "TREESEED_APPLE_CLIENT_ID",
347
+ "TREESEED_APPLE_CLIENT_SECRET"
348
+ ];
349
+ function localAuthRuntimeVars(env) {
350
+ return Object.fromEntries(
351
+ LOCAL_RUNTIME_AUTH_ENV_KEYS.map((key) => [key, envValue(env, key)]).filter(([, value]) => value != null)
352
+ );
353
+ }
354
+ function buildLocalRuntimeVars(deployConfig, state, target, env) {
355
+ if (target.kind !== "persistent" || target.scope !== "local") {
356
+ return {};
357
+ }
358
+ return {
359
+ ...localAuthRuntimeVars(env),
360
+ TREESEED_LOCAL_DEV_MODE: envValue(env, "TREESEED_LOCAL_DEV_MODE") ?? "cloudflare",
361
+ TREESEED_FORM_TOKEN_SECRET: envValue(env, "TREESEED_FORM_TOKEN_SECRET") ?? state.generatedSecrets?.TREESEED_FORM_TOKEN_SECRET ?? "treeseed-local-form-token-secret",
362
+ TREESEED_BETTER_AUTH_SECRET: envValue(env, "TREESEED_BETTER_AUTH_SECRET") ?? state.generatedSecrets?.TREESEED_BETTER_AUTH_SECRET ?? state.generatedSecrets?.TREESEED_FORM_TOKEN_SECRET ?? "treeseed-local-better-auth-secret-minimum-32-characters",
363
+ TREESEED_EDITORIAL_PREVIEW_SECRET: envValue(env, "TREESEED_EDITORIAL_PREVIEW_SECRET") ?? state.generatedSecrets?.TREESEED_EDITORIAL_PREVIEW_SECRET ?? "treeseed-local-editorial-preview-secret",
364
+ TREESEED_FORMS_LOCAL_BYPASS_CLOUDFLARE_GUARDS: envValue(env, "TREESEED_FORMS_LOCAL_BYPASS_CLOUDFLARE_GUARDS") ?? "",
365
+ TREESEED_FORMS_LOCAL_USE_MAILPIT: envValue(env, "TREESEED_FORMS_LOCAL_USE_MAILPIT") ?? "false",
366
+ TREESEED_MAILPIT_SMTP_HOST: envValue(env, "TREESEED_MAILPIT_SMTP_HOST") ?? "127.0.0.1",
367
+ TREESEED_MAILPIT_SMTP_PORT: envValue(env, "TREESEED_MAILPIT_SMTP_PORT") ?? "1025"
368
+ };
369
+ }
317
370
  function buildSecretMap(deployConfig, state) {
318
371
  const generatedSecret = state.generatedSecrets?.TREESEED_FORM_TOKEN_SECRET ?? randomBytes(24).toString("hex");
319
372
  const previewSecret = state.generatedSecrets?.TREESEED_EDITORIAL_PREVIEW_SECRET ?? randomBytes(24).toString("hex");
@@ -344,12 +397,6 @@ function defaultStateFromConfig(deployConfig, target) {
344
397
  binding: "FORM_GUARD_KV",
345
398
  id: `dryrun-${suffix}-form-guard`,
346
399
  previewId: `dryrun-${suffix}-form-guard-preview`
347
- },
348
- SESSION: {
349
- name: environmentScopedIdentityName(identity, "session", target),
350
- binding: "SESSION",
351
- id: `dryrun-${suffix}-session`,
352
- previewId: `dryrun-${suffix}-session-preview`
353
400
  }
354
401
  },
355
402
  d1Databases: {
@@ -508,19 +555,13 @@ function loadDeployState(tenantRoot, deployConfig, options = {}) {
508
555
  workerName: defaults.workerName,
509
556
  kvNamespaces: {
510
557
  ...defaults.kvNamespaces,
511
- ...persisted.kvNamespaces ?? {},
512
558
  FORM_GUARD_KV: {
513
559
  ...defaults.kvNamespaces.FORM_GUARD_KV,
514
560
  ...persisted.kvNamespaces?.FORM_GUARD_KV ?? {},
515
561
  name: defaults.kvNamespaces.FORM_GUARD_KV.name,
516
562
  binding: defaults.kvNamespaces.FORM_GUARD_KV.binding
517
563
  },
518
- SESSION: {
519
- ...defaults.kvNamespaces.SESSION,
520
- ...persisted.kvNamespaces?.SESSION ?? {},
521
- name: defaults.kvNamespaces.SESSION.name,
522
- binding: defaults.kvNamespaces.SESSION.binding
523
- }
564
+ ...persisted.kvNamespaces?.SESSION ? { SESSION: persisted.kvNamespaces.SESSION } : {}
524
565
  },
525
566
  d1Databases: {
526
567
  ...defaults.d1Databases,
@@ -685,10 +726,13 @@ function buildWranglerConfigContents(tenantRoot, deployConfig, state, options =
685
726
  const target = normalizeTarget(options.scope ?? options.target ?? state.target ?? "prod");
686
727
  const { generatedRoot } = resolveTargetPaths(tenantRoot, target);
687
728
  const workerName = state.workerName ?? targetWorkerName(deployConfig, target);
688
- const mainPath = relativeFromGeneratedRoot(resolve(generatedRoot, "worker/index.js"), generatedRoot);
729
+ const mainPath = relativeFromGeneratedRoot(resolve(tenantRoot, "dist/_worker.js/index.js"), generatedRoot);
689
730
  const assetsDirectory = relativeFromGeneratedRoot(resolve(tenantRoot, "dist"), generatedRoot);
690
731
  const migrationsDir = relativeFromGeneratedRoot(resolve(tenantRoot, "migrations"), generatedRoot);
691
- const vars = buildPublicVars(deployConfig);
732
+ const vars = {
733
+ ...buildPublicVars(deployConfig),
734
+ ...buildLocalRuntimeVars(deployConfig, state, target, options.env)
735
+ };
692
736
  const r2Config = deployConfig.cloudflare.r2;
693
737
  const r2Binding = resolveConfiguredContentBucketBinding(deployConfig);
694
738
  const r2BucketName = resolveConfiguredContentBucketName(deployConfig);
@@ -711,11 +755,6 @@ function buildWranglerConfigContents(tenantRoot, deployConfig, state, options =
711
755
  `id = ${renderTomlString(state.kvNamespaces.FORM_GUARD_KV.id)}`,
712
756
  `preview_id = ${renderTomlString(state.kvNamespaces.FORM_GUARD_KV.previewId ?? state.kvNamespaces.FORM_GUARD_KV.id)}`,
713
757
  "",
714
- "[[kv_namespaces]]",
715
- 'binding = "SESSION"',
716
- `id = ${renderTomlString(state.kvNamespaces.SESSION.id)}`,
717
- `preview_id = ${renderTomlString(state.kvNamespaces.SESSION.previewId ?? state.kvNamespaces.SESSION.id)}`,
718
- "",
719
758
  "[[d1_databases]]",
720
759
  'binding = "SITE_DATA_DB"',
721
760
  `database_name = ${renderTomlString(state.d1Databases.SITE_DATA_DB.databaseName)}`,
@@ -737,7 +776,7 @@ function ensureGeneratedWranglerConfig(tenantRoot, options = {}) {
737
776
  const state = loadDeployState(tenantRoot, deployConfig, { target });
738
777
  const { wranglerPath } = resolveTargetPaths(tenantRoot, target);
739
778
  const manifestFingerprint = stableHash(JSON.stringify({ deployConfig, targetKey: targetKey(target) }));
740
- const contents = buildWranglerConfigContents(tenantRoot, deployConfig, state, { target });
779
+ const contents = buildWranglerConfigContents(tenantRoot, deployConfig, state, { target, env: options.env });
741
780
  ensureParent(wranglerPath);
742
781
  writeFileSync(wranglerPath, contents, "utf8");
743
782
  state.lastManifestFingerprint = manifestFingerprint;
@@ -887,7 +926,7 @@ function buildProvisioningSummary(deployConfig, state, target) {
887
926
  accountId: resolveConfiguredCloudflareAccountId(deployConfig),
888
927
  pages: state.pages ?? null,
889
928
  formGuardKv: state.kvNamespaces.FORM_GUARD_KV,
890
- sessionKv: state.kvNamespaces.SESSION,
929
+ sessionKv: state.kvNamespaces.SESSION ?? null,
891
930
  siteDataDb: state.d1Databases.SITE_DATA_DB,
892
931
  queue: state.queues?.agentWork ?? null,
893
932
  content: state.content ?? null,
@@ -898,7 +937,6 @@ function buildProvisioningSummary(deployConfig, state, target) {
898
937
  dlq: state.queues?.agentWork?.dlqName ?? null,
899
938
  database: state.d1Databases?.SITE_DATA_DB?.databaseName ?? null,
900
939
  formGuardKv: state.kvNamespaces?.FORM_GUARD_KV?.name ?? null,
901
- sessionKv: state.kvNamespaces?.SESSION?.name ?? null,
902
940
  railwayProject: state.services?.worker?.projectName ?? state.services?.api?.projectName ?? null,
903
941
  webDomain: configuredWebDomain,
904
942
  apiDomain: configuredApiDomain,
@@ -1254,7 +1292,7 @@ function queueId(entry) {
1254
1292
  }
1255
1293
  function hasProvisionedCloudflareResources(state) {
1256
1294
  return Boolean(
1257
- state?.pages?.projectName && state?.pages?.url && state?.d1Databases?.SITE_DATA_DB?.databaseId && state?.kvNamespaces?.FORM_GUARD_KV?.id && state?.kvNamespaces?.SESSION?.id && state?.queues?.agentWork?.name && state?.content?.bucketName
1295
+ state?.pages?.projectName && state?.pages?.url && state?.d1Databases?.SITE_DATA_DB?.databaseId && state?.kvNamespaces?.FORM_GUARD_KV?.id && state?.queues?.agentWork?.name && state?.content?.bucketName
1258
1296
  );
1259
1297
  }
1260
1298
  function absoluteUrlForPath(baseUrl, path) {
@@ -1593,11 +1631,13 @@ function destroyCloudflareResources(tenantRoot, options = {}) {
1593
1631
  state.kvNamespaces.FORM_GUARD_KV.name,
1594
1632
  state.kvNamespaces.FORM_GUARD_KV.id
1595
1633
  );
1596
- state.kvNamespaces.SESSION.id = resolveExistingKvIdByName(
1597
- kvNamespaces,
1598
- state.kvNamespaces.SESSION.name,
1599
- state.kvNamespaces.SESSION.id
1600
- );
1634
+ if (state.kvNamespaces.SESSION?.name) {
1635
+ state.kvNamespaces.SESSION.id = resolveExistingKvIdByName(
1636
+ kvNamespaces,
1637
+ state.kvNamespaces.SESSION.name,
1638
+ state.kvNamespaces.SESSION.id
1639
+ );
1640
+ }
1601
1641
  state.d1Databases.SITE_DATA_DB = resolveExistingD1ByName(
1602
1642
  d1Databases,
1603
1643
  state.d1Databases.SITE_DATA_DB.databaseName,
@@ -1606,8 +1646,8 @@ function destroyCloudflareResources(tenantRoot, options = {}) {
1606
1646
  const worker = deleteWorker(tenantRoot, state.workerName, { env, dryRun, force });
1607
1647
  const formGuard = deleteKvNamespace(tenantRoot, state.kvNamespaces.FORM_GUARD_KV.id, { env, dryRun });
1608
1648
  const formGuardPreview = state.kvNamespaces.FORM_GUARD_KV.previewId && state.kvNamespaces.FORM_GUARD_KV.previewId !== state.kvNamespaces.FORM_GUARD_KV.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.FORM_GUARD_KV.previewId, { env, dryRun, preview: true }) : null;
1609
- const session = deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.id, { env, dryRun });
1610
- const sessionPreview = state.kvNamespaces.SESSION.previewId && state.kvNamespaces.SESSION.previewId !== state.kvNamespaces.SESSION.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.previewId, { env, dryRun, preview: true }) : null;
1649
+ const session = state.kvNamespaces.SESSION?.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.id, { env, dryRun }) : null;
1650
+ const sessionPreview = state.kvNamespaces.SESSION?.previewId && state.kvNamespaces.SESSION.previewId !== state.kvNamespaces.SESSION.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.previewId, { env, dryRun, preview: true }) : null;
1611
1651
  const database = deleteD1Database(tenantRoot, state.d1Databases.SITE_DATA_DB.databaseName, { env, dryRun });
1612
1652
  return {
1613
1653
  target,
@@ -1820,7 +1860,6 @@ function provisionCloudflareResources(tenantRoot, options = {}) {
1820
1860
  current.url = `https://${current.projectName}.pages.dev`;
1821
1861
  };
1822
1862
  ensureKv("FORM_GUARD_KV");
1823
- ensureKv("SESSION");
1824
1863
  ensureD1();
1825
1864
  ensureQueue();
1826
1865
  ensureR2Bucket();
@@ -1897,7 +1936,6 @@ function verifyProvisionedCloudflareResources(tenantRoot, options = {}) {
1897
1936
  const checks = {
1898
1937
  pages: Boolean(state.pages?.projectName && pagesProjects.find((entry) => entry?.name === state.pages.projectName)),
1899
1938
  formGuardKv: Boolean(state.kvNamespaces?.FORM_GUARD_KV?.name && kvNamespaces.find((entry) => entry?.title === state.kvNamespaces.FORM_GUARD_KV.name)),
1900
- sessionKv: Boolean(state.kvNamespaces?.SESSION?.name && kvNamespaces.find((entry) => entry?.title === state.kvNamespaces.SESSION.name)),
1901
1939
  d1: Boolean(state.d1Databases?.SITE_DATA_DB?.databaseName && d1Databases.find((entry) => entry?.name === state.d1Databases.SITE_DATA_DB.databaseName)),
1902
1940
  queue: Boolean(state.queues?.agentWork?.name && queues.find((entry) => queueName(entry) === state.queues.agentWork.name)),
1903
1941
  dlq: !state.queues?.agentWork?.dlqName || Boolean(queues.find((entry) => queueName(entry) === state.queues.agentWork.dlqName)),
@@ -2078,7 +2116,6 @@ function printDeploySummary(summary) {
2078
2116
  console.log(` Account ID: ${summary.accountId}`);
2079
2117
  console.log(` D1: ${summary.siteDataDb.databaseName} (${summary.siteDataDb.databaseId})`);
2080
2118
  console.log(` KV FORM_GUARD_KV: ${summary.formGuardKv.id}`);
2081
- console.log(` KV SESSION: ${summary.sessionKv.id}`);
2082
2119
  }
2083
2120
  function printDestroySummary(result) {
2084
2121
  const { summary, operations } = result;
@@ -2092,7 +2129,9 @@ function printDestroySummary(result) {
2092
2129
  if (operations.formGuardPreview) {
2093
2130
  console.log(` KV FORM_GUARD_KV preview -> ${operations.formGuardPreview.status}`);
2094
2131
  }
2095
- console.log(` KV SESSION: ${summary.sessionKv.name} -> ${operations.session.status}`);
2132
+ if (summary.sessionKv && operations.session) {
2133
+ console.log(` KV SESSION (deprecated): ${summary.sessionKv.name} -> ${operations.session.status}`);
2134
+ }
2096
2135
  if (operations.sessionPreview) {
2097
2136
  console.log(` KV SESSION preview -> ${operations.sessionPreview.status}`);
2098
2137
  }
@@ -0,0 +1,123 @@
1
+ import { type GitHubApiClient } from './github-api.ts';
2
+ export type GitHubActionsWorkflowState = 'success' | 'failure' | 'pending' | 'missing' | 'not_pushed' | 'error';
3
+ export type GitHubActionsVerificationTarget = {
4
+ name: string;
5
+ repoPath: string;
6
+ repository: string | null;
7
+ branch: string | null;
8
+ headSha: string | null;
9
+ workflows: string[];
10
+ kind?: 'root' | 'package';
11
+ };
12
+ export type GitHubActionsWorkflowGate = {
13
+ name: string;
14
+ repoPath: string;
15
+ repository?: string;
16
+ workflow: string;
17
+ branch: string;
18
+ headSha: string;
19
+ };
20
+ export type GitHubActionsWorkflowJobStep = {
21
+ name: string;
22
+ number: number | null;
23
+ status: string | null;
24
+ conclusion: string | null;
25
+ startedAt: string | null;
26
+ completedAt: string | null;
27
+ };
28
+ export type GitHubActionsWorkflowJob = {
29
+ id: number;
30
+ name: string;
31
+ status: string | null;
32
+ conclusion: string | null;
33
+ url: string | null;
34
+ steps: GitHubActionsWorkflowJobStep[];
35
+ failedSteps: GitHubActionsWorkflowJobStep[];
36
+ logExcerpt?: string | null;
37
+ };
38
+ export type GitHubActionsWorkflowRunInspection = {
39
+ workflow: string;
40
+ state: GitHubActionsWorkflowState;
41
+ status: string | null;
42
+ conclusion: string | null;
43
+ runId: number | null;
44
+ url: string | null;
45
+ headSha: string | null;
46
+ branch: string | null;
47
+ createdAt: string | null;
48
+ updatedAt: string | null;
49
+ jobs: GitHubActionsWorkflowJob[];
50
+ failedJobs: GitHubActionsWorkflowJob[];
51
+ inspectCommand: string | null;
52
+ message: string | null;
53
+ };
54
+ export type GitHubActionsRepositoryInspection = {
55
+ name: string;
56
+ repoPath: string;
57
+ repository: string | null;
58
+ kind: 'root' | 'package';
59
+ branch: string | null;
60
+ headSha: string | null;
61
+ remoteHeadSha: string | null;
62
+ remoteSynced: boolean;
63
+ state: GitHubActionsWorkflowState;
64
+ message: string | null;
65
+ workflows: GitHubActionsWorkflowRunInspection[];
66
+ };
67
+ export type GitHubActionsVerificationFailure = {
68
+ type: 'repository' | 'workflow' | 'job';
69
+ repository: string | null;
70
+ repoName: string;
71
+ workflow: string | null;
72
+ runId: number | null;
73
+ jobId: number | null;
74
+ jobName: string | null;
75
+ state: GitHubActionsWorkflowState;
76
+ conclusion: string | null;
77
+ url: string | null;
78
+ inspectCommand: string | null;
79
+ message: string;
80
+ failedSteps: GitHubActionsWorkflowJobStep[];
81
+ logExcerpt?: string | null;
82
+ };
83
+ export type GitHubActionsVerificationSummary = {
84
+ repositories: number;
85
+ workflows: number;
86
+ success: number;
87
+ failure: number;
88
+ pending: number;
89
+ missing: number;
90
+ notPushed: number;
91
+ error: number;
92
+ failures: number;
93
+ };
94
+ export type GitHubActionsVerificationReport = {
95
+ checkedAt: string;
96
+ repositories: GitHubActionsRepositoryInspection[];
97
+ failures: GitHubActionsVerificationFailure[];
98
+ summary: GitHubActionsVerificationSummary;
99
+ };
100
+ type GitHubActionsVerificationOptions = {
101
+ client?: GitHubApiClient;
102
+ includeLogs?: boolean;
103
+ logLines?: number;
104
+ };
105
+ export declare function inspectGitHubActionsVerification(targets: GitHubActionsVerificationTarget[], { client, includeLogs, logLines, }?: GitHubActionsVerificationOptions): Promise<GitHubActionsVerificationReport>;
106
+ export declare function skippedGitHubActionsGate(gate: GitHubActionsWorkflowGate, reason: string): {
107
+ name: string;
108
+ repository: string | null;
109
+ workflow: string;
110
+ branch: string;
111
+ headSha: string;
112
+ status: string;
113
+ reason: string;
114
+ conclusion: null;
115
+ runId: null;
116
+ url: null;
117
+ };
118
+ export declare function formatGitHubActionsGateFailure(gate: GitHubActionsWorkflowGate, result: Record<string, unknown>): string;
119
+ export declare function waitForGitHubActionsGate(gate: GitHubActionsWorkflowGate, options?: {
120
+ timeoutSeconds?: number;
121
+ pollSeconds?: number;
122
+ }): Promise<Record<string, unknown>>;
123
+ export {};