@usine/github 0.1.2 → 0.3.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 (72) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +35 -56
  3. package/dist/access.d.ts +30 -8
  4. package/dist/access.d.ts.map +1 -1
  5. package/dist/access.js +31 -8
  6. package/dist/access.js.map +1 -1
  7. package/dist/credentials.d.ts +6 -6
  8. package/dist/credentials.d.ts.map +1 -1
  9. package/dist/credentials.js +6 -6
  10. package/dist/credentials.js.map +1 -1
  11. package/dist/error.d.ts +28 -10
  12. package/dist/error.d.ts.map +1 -1
  13. package/dist/error.js +34 -7
  14. package/dist/error.js.map +1 -1
  15. package/dist/github-app.d.ts +19 -10
  16. package/dist/github-app.d.ts.map +1 -1
  17. package/dist/github-app.js +69 -30
  18. package/dist/github-app.js.map +1 -1
  19. package/dist/graphql.d.ts +11 -0
  20. package/dist/graphql.d.ts.map +1 -0
  21. package/dist/graphql.js +47 -0
  22. package/dist/graphql.js.map +1 -0
  23. package/dist/http.d.ts +11 -5
  24. package/dist/http.d.ts.map +1 -1
  25. package/dist/http.js +27 -9
  26. package/dist/http.js.map +1 -1
  27. package/dist/installation.d.ts +17 -9
  28. package/dist/installation.d.ts.map +1 -1
  29. package/dist/installation.js +17 -9
  30. package/dist/installation.js.map +1 -1
  31. package/dist/item-history.d.ts +57 -0
  32. package/dist/item-history.d.ts.map +1 -0
  33. package/dist/item-history.js +190 -0
  34. package/dist/item-history.js.map +1 -0
  35. package/dist/item-writer.d.ts +3 -3
  36. package/dist/item-writer.d.ts.map +1 -1
  37. package/dist/item-writer.js +2 -2
  38. package/dist/item-writer.js.map +1 -1
  39. package/dist/jwt.d.ts +3 -3
  40. package/dist/jwt.d.ts.map +1 -1
  41. package/dist/jwt.js +4 -4
  42. package/dist/jwt.js.map +1 -1
  43. package/dist/label-writer.d.ts +3 -3
  44. package/dist/label-writer.d.ts.map +1 -1
  45. package/dist/label-writer.js +3 -3
  46. package/dist/label-writer.js.map +1 -1
  47. package/dist/local-secrets.d.ts +2 -2
  48. package/dist/local-secrets.d.ts.map +1 -1
  49. package/dist/local-secrets.js +6 -6
  50. package/dist/local-secrets.js.map +1 -1
  51. package/dist/polling/content.js +2 -2
  52. package/dist/polling/detection.d.ts +21 -10
  53. package/dist/polling/detection.d.ts.map +1 -1
  54. package/dist/polling/detection.js +20 -10
  55. package/dist/polling/detection.js.map +1 -1
  56. package/dist/polling/labels.d.ts +5 -5
  57. package/dist/polling/labels.d.ts.map +1 -1
  58. package/dist/polling/labels.js +5 -5
  59. package/dist/polling/labels.js.map +1 -1
  60. package/dist/polling/payload.d.ts +12 -8
  61. package/dist/polling/payload.d.ts.map +1 -1
  62. package/dist/polling/payload.js +17 -12
  63. package/dist/polling/payload.js.map +1 -1
  64. package/dist/polling/polling.d.ts +27 -9
  65. package/dist/polling/polling.d.ts.map +1 -1
  66. package/dist/polling/polling.js +94 -56
  67. package/dist/polling/polling.js.map +1 -1
  68. package/dist/polling/queries.d.ts +6 -1
  69. package/dist/polling/queries.d.ts.map +1 -1
  70. package/dist/polling/queries.js +16 -0
  71. package/dist/polling/queries.js.map +1 -1
  72. package/package.json +14 -9
@@ -1,6 +1,8 @@
1
+ import type { LoopPermissions } from "@usine/core/loop";
1
2
  import { RepositoryName } from "@usine/core/repository";
3
+ import { BotAccount } from "@usine/core/worker";
2
4
  import { Context, Effect, Layer } from "effect";
3
- import { HttpClient } from "effect/unstable/http";
5
+ import { HttpClient } from "effect/http";
4
6
  import { type AppAuthenticationError, GitHubCredentials } from "./credentials.ts";
5
7
  import { type CoveredProject, type ProjectAccess } from "./access.ts";
6
8
  import { type GitHubAppError } from "./error.ts";
@@ -8,23 +10,30 @@ import { Installation, InstallationToken } from "./installation.ts";
8
10
  declare const GitHubApp_base: Context.ServiceClass<GitHubApp, "@usine/github/GitHubApp", {
9
11
  /** Returns the App installation after checking its required permissions. */
10
12
  readonly installation: () => Effect.Effect<Installation, GitHubAppError>;
13
+ /**
14
+ * Returns the App's bot account, `<slug>[bot]`, read from GitHub's users API once per App
15
+ * slug.
16
+ */
17
+ readonly botAccount: () => Effect.Effect<BotAccount, GitHubAppError>;
11
18
  /** Returns the shared installation-wide token for orchestrator operations, renewing it near expiry. */
12
19
  readonly installationToken: () => Effect.Effect<InstallationToken, GitHubAppError>;
13
- /** Reports access for every registry repository, retaining uncovered Projects as individual errors. */
20
+ /** Returns the access of every registry repository, with each uncovered Project as its own error. */
14
21
  readonly projectAccess: (registry: ReadonlyArray<RepositoryName>) => Effect.Effect<ReadonlyArray<ProjectAccess>, GitHubAppError>;
15
- /** Mints a fresh token restricted to the covered Project's repository for a Worker. */
16
- readonly workerToken: (project: CoveredProject) => Effect.Effect<InstallationToken, GitHubAppError>;
22
+ /**
23
+ * Mints a new Worker token for the covered Project's repository, with the permissions
24
+ * `WORKER_TOKEN_PERMISSIONS` lists for the Loop permission level.
25
+ */
26
+ readonly workerToken: (project: CoveredProject, permissions: LoopPermissions) => Effect.Effect<InstallationToken, GitHubAppError>;
17
27
  }>;
18
28
  /**
19
- * The factory's GitHub identity and repository access.
20
- * Orchestrator operations share installation-wide access; each Worker token is
21
- * newly minted for the repository assigned to its Attempt.
29
+ * The factory's GitHub App identity and repository access. Orchestrator operations share an
30
+ * installation-wide token; each Worker token is minted for its Attempt's repository.
22
31
  */
23
32
  export declare class GitHubApp extends GitHubApp_base {
24
33
  static readonly layer: Layer.Layer<GitHubApp, AppAuthenticationError, GitHubCredentials | HttpClient.HttpClient>;
25
34
  }
26
- export { REQUIRED_REPOSITORY_PERMISSIONS, deriveProjectAccess, missingPermissions, type InstalledRepository, type RequiredRepositoryPermission, CoveredProject, ProjectNotInstalledError, ProjectAccess, AppPermissionError, } from "./access.ts";
35
+ export { REQUIRED_REPOSITORY_PERMISSIONS, WORKER_TOKEN_PERMISSIONS, deriveProjectAccess, missingPermissions, type InstalledRepository, type RequiredRepositoryPermission, CoveredProject, ProjectNotInstalledError, ProjectAccess, AppPermissionError, } from "./access.ts";
27
36
  export { AppId, PrivateKey, RedactedPrivateKey, AppCredentials, GitHubCredentials, AppAuthenticationError, } from "./credentials.ts";
28
- export { InstallationId, RepositoryId, Installation, InstallationWide, SingleRepository, TokenScope, InstallationToken, InstallationDiscoveryReason, InstallationDiscoveryError, } from "./installation.ts";
29
- export { GitHubOperation, GitHubApiError, GitHubRateLimitError, InvalidGitHubResponseError, GitHubAppError, } from "./error.ts";
37
+ export { AppSlug, InstallationId, RepositoryId, Installation, InstallationWide, SingleRepository, TokenScope, InstallationToken, InstallationDiscoveryReason, InstallationDiscoveryError, } from "./installation.ts";
38
+ export { GitHubOperation, GitHubApiError, GitHubRateLimitError, InvalidGitHubResponseError, GitHubAppError, isRefusal, } from "./error.ts";
30
39
  //# sourceMappingURL=github-app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-app.d.ts","sourceRoot":"","sources":["../src/github-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,OAAO,EAEP,MAAM,EACN,KAAK,EAKN,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,UAAU,EAAyC,MAAM,sBAAsB,CAAC;AAGzF,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,aAAa,EAInB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EAGZ,iBAAiB,EAKlB,MAAM,mBAAmB,CAAC;;IA8DvB,4EAA4E;2BACrD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC;IACxE,uGAAuG;gCAC3E,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;IAClF,uGAAuG;4BAC/E,CACtB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,KACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC;IAChE,uFAAuF;0BACjE,CACpB,OAAO,EAAE,cAAc,KACpB,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;;AAnBzD;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,cAgBD;IAC5B,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAChC,SAAS,EACT,sBAAsB,EACtB,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAC1C,CAuLC;CACH;AAED,OAAO,EACL,+BAA+B,EAC/B,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"github-app.d.ts","sourceRoot":"","sources":["../src/github-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAuB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAEL,OAAO,EAEP,MAAM,EACN,KAAK,EAKN,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,UAAU,EAAyC,MAAM,aAAa,CAAC;AAUhF,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,YAAY,EAGZ,iBAAiB,EAKlB,MAAM,mBAAmB,CAAC;;IAgEvB,4EAA4E;2BACrD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC;IACxE;;;OAGG;yBACkB,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC;IACpE,uGAAuG;gCAC3E,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;IAClF,qGAAqG;4BAC7E,CACtB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,KACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC;IAChE;;;OAGG;0BACmB,CACpB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,eAAe,KACzB,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;;AA3BzD;;;GAGG;AACH,qBAAa,SAAU,SAAQ,cAyBD;IAC5B,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAChC,SAAS,EACT,sBAAsB,EACtB,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAC1C,CA+OC;CACH;AAED,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,OAAO,EACP,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,SAAS,GACV,MAAM,YAAY,CAAC"}
@@ -1,24 +1,27 @@
1
1
  import { RepositoryName } from "@usine/core/repository";
2
+ import { BotAccount, BotLogin, BotUserId } from "@usine/core/worker";
2
3
  import { Clock, Context, DateTime, Effect, Layer, Option, Redacted, Schema, SynchronizedRef, } from "effect";
3
- import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
4
+ import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http";
4
5
  import { appJwtSigner } from "./jwt.js";
5
- import { API_ROOT, authorized, invalidResponse, statusError, transportError } from "./http.js";
6
+ import { API_ROOT, authorized, invalidResponse, statusError, transportError, withGitHubReason, } from "./http.js";
6
7
  import { GitHubCredentials } from "./credentials.js";
7
- import { AppPermissionError, REQUIRED_REPOSITORY_PERMISSIONS, deriveProjectAccess, missingPermissions, } from "./access.js";
8
+ import { AppPermissionError, REQUIRED_REPOSITORY_PERMISSIONS, WORKER_TOKEN_PERMISSIONS, deriveProjectAccess, missingPermissions, } from "./access.js";
8
9
  import { InvalidGitHubResponseError, } from "./error.js";
9
- import { Installation, InstallationDiscoveryError, InstallationId, InstallationToken, InstallationWide, RepositoryId, SingleRepository, } from "./installation.js";
10
+ import { AppSlug, Installation, InstallationDiscoveryError, InstallationId, InstallationToken, InstallationWide, RepositoryId, SingleRepository, } from "./installation.js";
10
11
  const TOKEN_MAX_LIFETIME_MS = 60 * 60 * 1_000;
11
- /** GitHub's expiry uses its own clock; ordinary worker/orchestrator skew is not a bad token. */
12
+ /** The margin for clock skew between GitHub and this machine when checking token expiry, in milliseconds. */
12
13
  const TOKEN_CLOCK_SKEW_MARGIN_MS = 3 * 60 * 1_000;
13
- /** Renew the shared lease when its token has less than this long left. */
14
+ /** The remaining token lifetime below which the shared lease is renewed, in milliseconds. */
14
15
  const LEASE_RENEWAL_MARGIN_MS = 5 * 60 * 1_000;
15
16
  const InstallationResponse = Schema.Struct({
16
17
  id: InstallationId,
18
+ appSlug: AppSlug,
17
19
  account: Schema.Struct({ login: Schema.NonEmptyString }),
18
20
  permissions: Schema.Record(Schema.String, Schema.String),
19
21
  suspendedAt: Schema.NullOr(Schema.String),
20
- }).pipe(Schema.encodeKeys({ suspendedAt: "suspended_at" }));
22
+ }).pipe(Schema.encodeKeys({ appSlug: "app_slug", suspendedAt: "suspended_at" }));
21
23
  const InstallationsResponse = Schema.Array(InstallationResponse);
24
+ const UserResponse = Schema.Struct({ login: BotLogin, id: BotUserId });
22
25
  const RepositoryResponse = Schema.Struct({
23
26
  id: RepositoryId,
24
27
  name: RepositoryName,
@@ -32,7 +35,7 @@ const TokenResponse = Schema.Struct({
32
35
  expiresAt: Schema.DateTimeUtcFromString,
33
36
  repositories: Schema.OptionFromOptionalKey(Schema.Array(RepositoryResponse)),
34
37
  }).pipe(Schema.encodeKeys({ expiresAt: "expires_at" }));
35
- /** The operation name and request body for minting a token of this scope. */
38
+ /** Returns the operation name and request body for minting a token of `scope`. */
36
39
  const mintPlan = (scope) => scope._tag === "InstallationWide"
37
40
  ? {
38
41
  operation: "mint-installation-token",
@@ -41,27 +44,30 @@ const mintPlan = (scope) => scope._tag === "InstallationWide"
41
44
  : {
42
45
  operation: "mint-worker-token",
43
46
  body: {
44
- permissions: REQUIRED_REPOSITORY_PERMISSIONS,
47
+ permissions: WORKER_TOKEN_PERMISSIONS[scope.permissions],
45
48
  repository_ids: [scope.repositoryId],
46
49
  },
47
50
  };
48
51
  /**
49
- * The factory's GitHub identity and repository access.
50
- * Orchestrator operations share installation-wide access; each Worker token is
51
- * newly minted for the repository assigned to its Attempt.
52
+ * The factory's GitHub App identity and repository access. Orchestrator operations share an
53
+ * installation-wide token; each Worker token is minted for its Attempt's repository.
52
54
  */
53
55
  export class GitHubApp extends Context.Service()("@usine/github/GitHubApp") {
54
56
  static layer = Layer.effect(GitHubApp, Effect.gen(function* () {
55
57
  const credentials = yield* GitHubCredentials;
56
58
  const sign = yield* appJwtSigner(credentials);
57
59
  const http = yield* HttpClient.HttpClient;
58
- /** Sends one request and decodes its JSON body. Any other outcome is a typed GitHub error. */
60
+ /** Sends one request and decodes its JSON body. Fails with a typed GitHub error otherwise. */
59
61
  const fetchJson = (operation, request, schema) => Effect.gen(function* () {
60
62
  const response = yield* http
61
63
  .execute(request)
62
64
  .pipe(Effect.mapError((error) => transportError(operation, error)));
63
65
  if (response.status < 200 || response.status >= 300) {
64
- return yield* statusError(operation, response, yield* Clock.currentTimeMillis);
66
+ const failure = statusError(operation, response, yield* Clock.currentTimeMillis);
67
+ if (failure._tag === "GitHubRateLimitError")
68
+ return yield* failure;
69
+ const explained = yield* withGitHubReason(failure, response);
70
+ return yield* explained;
65
71
  }
66
72
  return yield* HttpClientResponse.schemaBodyJson(schema)(response).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
67
73
  });
@@ -71,33 +77,42 @@ export class GitHubApp extends Context.Service()("@usine/github/GitHubApp") {
71
77
  if (found === undefined) {
72
78
  return yield* new InstallationDiscoveryError({
73
79
  reason: "missing",
74
- message: "The GitHub App is not installed on an account",
80
+ message: "The GitHub App is not installed on any account. Install it on the account that owns the repositories.",
75
81
  });
76
82
  }
77
83
  if (others.length > 0) {
78
84
  return yield* new InstallationDiscoveryError({
79
85
  reason: "multiple",
80
- message: "The GitHub App must have exactly one installation for this factory",
86
+ message: "The GitHub App has more than one installation. Uninstall it from every account except one.",
81
87
  });
82
88
  }
83
89
  if (found.suspendedAt !== null) {
84
90
  return yield* new InstallationDiscoveryError({
85
91
  reason: "suspended",
86
- message: "The GitHub App installation is suspended",
92
+ message: "The GitHub App installation is suspended. Unsuspend it in the installation settings on GitHub.",
87
93
  });
88
94
  }
89
95
  const missing = missingPermissions(found.permissions);
90
96
  if (missing.length > 0) {
91
97
  return yield* new AppPermissionError({
92
98
  missing,
93
- message: `The GitHub App installation is missing permissions: ${missing.join(", ")}`,
99
+ message: `The GitHub App installation is missing permissions: ${missing.join(", ")}. Grant them in the GitHub App settings, then approve the change on the installation.`,
94
100
  });
95
101
  }
96
- return new Installation({ id: found.id, accountLogin: found.account.login });
102
+ return new Installation({
103
+ id: found.id,
104
+ accountLogin: found.account.login,
105
+ appSlug: found.appSlug,
106
+ });
97
107
  });
98
108
  const mintToken = Effect.fn("GitHubApp.mintToken")(function* (installationId, scope) {
99
109
  const { operation, body } = mintPlan(scope);
100
- yield* Effect.annotateCurrentSpan({ installationId, operation, scope: scope._tag });
110
+ yield* Effect.annotateCurrentSpan({
111
+ installationId,
112
+ operation,
113
+ scope: scope._tag,
114
+ permissions: scope._tag === "SingleRepository" ? scope.permissions : "installation",
115
+ });
101
116
  const jwt = yield* sign();
102
117
  const response = yield* fetchJson(operation, HttpClientRequest.post(`${API_ROOT}/app/installations/${installationId}/access_tokens`).pipe(HttpClientRequest.bodyJsonUnsafe(body), authorized(jwt)), TokenResponse);
103
118
  const now = yield* Clock.currentTimeMillis;
@@ -105,8 +120,8 @@ export class GitHubApp extends Context.Service()("@usine/github/GitHubApp") {
105
120
  if (lifetime <= 0 || lifetime > TOKEN_MAX_LIFETIME_MS + TOKEN_CLOCK_SKEW_MARGIN_MS) {
106
121
  return yield* new InvalidGitHubResponseError({
107
122
  operation,
108
- message: "GitHub returned an installation token outside the one-hour lifetime bound",
109
- detail: `expires_at ${DateTime.formatIso(response.expiresAt)} leaves ${lifetime}ms to live`,
123
+ message: "GitHub returned an installation token that is expired or exceeds the one-hour lifetime limit",
124
+ detail: `expires_at ${DateTime.formatIso(response.expiresAt)} is ${lifetime}ms from now`,
110
125
  });
111
126
  }
112
127
  if (lifetime > TOKEN_MAX_LIFETIME_MS) {
@@ -121,8 +136,8 @@ export class GitHubApp extends Context.Service()("@usine/github/GitHubApp") {
121
136
  !(confirmed.length === 1 && confirmed.every((repo) => repo.id === scope.repositoryId))) {
122
137
  return yield* new InvalidGitHubResponseError({
123
138
  operation,
124
- message: "GitHub did not confirm that the worker token is scoped to exactly one repo",
125
- detail: `expected repository id ${scope.repositoryId}, confirmed [${confirmed.map((repo) => repo.id).join(", ")}]`,
139
+ message: "GitHub did not confirm that the worker token is scoped to exactly one repository",
140
+ detail: `expected repository ID ${scope.repositoryId}, got [${confirmed.map((repo) => repo.id).join(", ")}]`,
126
141
  });
127
142
  }
128
143
  return new InstallationToken({
@@ -141,14 +156,14 @@ export class GitHubApp extends Context.Service()("@usine/github/GitHubApp") {
141
156
  if (response.repositories.length === 0) {
142
157
  return yield* new InvalidGitHubResponseError({
143
158
  operation: "list-installation-repositories",
144
- message: "GitHub pagination ended before total_count repositories were returned",
159
+ message: "GitHub returned an empty page before it listed total_count repositories",
145
160
  detail: `page ${page} was empty after ${installed.length} of ${response.totalCount} repositories`,
146
161
  });
147
162
  }
148
163
  }
149
164
  });
150
165
  const leaseRef = yield* SynchronizedRef.make(Option.none());
151
- /** Returns the current lease, renewing it inside the ref when its token is under the margin. */
166
+ /** Returns the current lease, renewing it inside the ref if its token is within the margin. */
152
167
  const lease = Effect.fn("GitHubApp.lease")(() => SynchronizedRef.modifyEffect(leaseRef, (current) => Effect.gen(function* () {
153
168
  const now = yield* Clock.currentTimeMillis;
154
169
  if (Option.isSome(current) &&
@@ -162,23 +177,47 @@ export class GitHubApp extends Context.Service()("@usine/github/GitHubApp") {
162
177
  const stored = [renewed, Option.some(renewed)];
163
178
  return stored;
164
179
  })));
180
+ const botAccountRef = yield* SynchronizedRef.make(Option.none());
181
+ const botAccount = Effect.fn("GitHubApp.botAccount")(() => SynchronizedRef.modifyEffect(botAccountRef, (current) => Effect.gen(function* () {
182
+ const { installation, token } = yield* lease();
183
+ const { appSlug } = installation;
184
+ yield* Effect.annotateCurrentSpan({ appSlug });
185
+ if (Option.isSome(current) && current.value.appSlug === appSlug) {
186
+ const kept = [current.value.account, current];
187
+ return kept;
188
+ }
189
+ const user = yield* fetchJson("read-bot-account", HttpClientRequest.get(`${API_ROOT}/users/${encodeURIComponent(`${appSlug}[bot]`)}`).pipe(authorized(token.value)), UserResponse);
190
+ const account = new BotAccount(user);
191
+ yield* Effect.logInfo("Read the App's bot account", {
192
+ appSlug,
193
+ login: account.login,
194
+ id: account.id,
195
+ });
196
+ const stored = [
197
+ account,
198
+ Option.some({ appSlug, account }),
199
+ ];
200
+ return stored;
201
+ })));
165
202
  return {
166
203
  installation: Effect.fn("GitHubApp.installation")(() => Effect.map(lease(), (current) => current.installation)),
204
+ botAccount,
167
205
  installationToken: Effect.fn("GitHubApp.installationToken")(() => Effect.map(lease(), (current) => current.token)),
168
206
  projectAccess: Effect.fn("GitHubApp.projectAccess")(function* (registry) {
169
207
  const { installation, token } = yield* lease();
170
208
  const installed = yield* installedRepositories(token);
171
209
  return deriveProjectAccess(installation, registry, installed);
172
210
  }),
173
- workerToken: Effect.fn("GitHubApp.workerToken")((project) => mintToken(project.installationId, new SingleRepository({
211
+ workerToken: Effect.fn("GitHubApp.workerToken")((project, permissions) => mintToken(project.installationId, new SingleRepository({
174
212
  repository: project.repository,
175
213
  repositoryId: project.repositoryId,
214
+ permissions,
176
215
  }))),
177
216
  };
178
217
  }));
179
218
  }
180
- export { REQUIRED_REPOSITORY_PERMISSIONS, deriveProjectAccess, missingPermissions, CoveredProject, ProjectNotInstalledError, ProjectAccess, AppPermissionError, } from "./access.js";
219
+ export { REQUIRED_REPOSITORY_PERMISSIONS, WORKER_TOKEN_PERMISSIONS, deriveProjectAccess, missingPermissions, CoveredProject, ProjectNotInstalledError, ProjectAccess, AppPermissionError, } from "./access.js";
181
220
  export { AppId, PrivateKey, RedactedPrivateKey, AppCredentials, GitHubCredentials, AppAuthenticationError, } from "./credentials.js";
182
- export { InstallationId, RepositoryId, Installation, InstallationWide, SingleRepository, TokenScope, InstallationToken, InstallationDiscoveryReason, InstallationDiscoveryError, } from "./installation.js";
183
- export { GitHubOperation, GitHubApiError, GitHubRateLimitError, InvalidGitHubResponseError, GitHubAppError, } from "./error.js";
221
+ export { AppSlug, InstallationId, RepositoryId, Installation, InstallationWide, SingleRepository, TokenScope, InstallationToken, InstallationDiscoveryReason, InstallationDiscoveryError, } from "./installation.js";
222
+ export { GitHubOperation, GitHubApiError, GitHubRateLimitError, InvalidGitHubResponseError, GitHubAppError, isRefusal, } from "./error.js";
184
223
  //# sourceMappingURL=github-app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-app.js","sourceRoot":"","sources":["../src/github-app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-app.js","sourceRoot":"","sources":["../src/github-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { type HttpClient } from "effect/http";
3
+ import { GitHubRateLimitError } from "./error.ts";
4
+ import type { InstallationToken } from "./installation.ts";
5
+ /**
6
+ * Sends one GraphQL query with `token` and decodes `data` with `dataSchema`. Fails with
7
+ * `GitHubRateLimitError` on rate limiting, and with GitHub's messages on other errors. A
8
+ * NOT_FOUND error leaves its null field for `dataSchema` to decode.
9
+ */
10
+ export declare const queryGraphql: <S extends Schema.Codec<unknown, unknown, never, unknown>>(http: HttpClient.HttpClient, token: InstallationToken, operation: "create-repository-label" | "discover-installation" | "fetch-base-ref-head" | "fetch-issue-snapshot" | "fetch-item-labels" | "fetch-item-timeline" | "fetch-pull-request-snapshot" | "find-missing-issues" | "list-installation-repositories" | "list-repository-labels" | "mint-installation-token" | "mint-worker-token" | "poll-repository-changes" | "read-bot-account" | "update-item-labels", query: string, variables: Readonly<Record<string, Schema.Json>>, dataSchema: S) => Effect.Effect<S["Type"], import("./error.ts").GitHubApiError | GitHubRateLimitError | import("./error.ts").InvalidGitHubResponseError, S["DecodingServices"]>;
11
+ //# sourceMappingURL=graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,KAAK,UAAU,EAAyC,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAwB,MAAM,YAAY,CAAC;AASxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAkB3D;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,wrBA8CxD,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { Clock, DateTime, Effect, Option, Schema } from "effect";
2
+ import { HttpClientRequest, HttpClientResponse } from "effect/http";
3
+ import { GitHubRateLimitError } from "./error.js";
4
+ import { API_ROOT, authorized, invalidResponse, rateLimitRetryEpoch, statusError, transportError, } from "./http.js";
5
+ /** The wait for a GraphQL rate limit without reset headers, in milliseconds. */
6
+ const GRAPHQL_RATE_LIMIT_FALLBACK_MS = 60_000;
7
+ /** The GraphQL response envelope. `errors` can arrive with HTTP 200. */
8
+ const GraphqlEnvelope = Schema.Struct({
9
+ data: Schema.optionalKey(Schema.Unknown),
10
+ errors: Schema.optionalKey(Schema.Array(Schema.Struct({
11
+ message: Schema.String,
12
+ type: Schema.optionalKey(Schema.String),
13
+ }))),
14
+ });
15
+ /**
16
+ * Sends one GraphQL query with `token` and decodes `data` with `dataSchema`. Fails with
17
+ * `GitHubRateLimitError` on rate limiting, and with GitHub's messages on other errors. A
18
+ * NOT_FOUND error leaves its null field for `dataSchema` to decode.
19
+ */
20
+ export const queryGraphql = Effect.fn("GitHub.queryGraphql")(function* (http, token, operation, query, variables, dataSchema) {
21
+ const request = HttpClientRequest.post(`${API_ROOT}/graphql`).pipe(HttpClientRequest.bodyJsonUnsafe({ query, variables }), authorized(token.value));
22
+ const response = yield* http
23
+ .execute(request)
24
+ .pipe(Effect.mapError((error) => transportError(operation, error)));
25
+ const now = yield* Clock.currentTimeMillis;
26
+ if (response.status !== 200)
27
+ return yield* statusError(operation, response, now);
28
+ const envelope = yield* HttpClientResponse.schemaBodyJson(GraphqlEnvelope)(response).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
29
+ if (envelope.errors !== undefined && envelope.errors.length > 0) {
30
+ const rateLimited = envelope.errors.some((error) => error.type === "RATE_LIMITED");
31
+ if (rateLimited) {
32
+ const retryAt = Option.getOrElse(rateLimitRetryEpoch(response.headers, now), () => now + GRAPHQL_RATE_LIMIT_FALLBACK_MS);
33
+ return yield* new GitHubRateLimitError({
34
+ operation,
35
+ retryAt: DateTime.makeUnsafe(retryAt),
36
+ message: "GitHub GraphQL API rate limit exceeded",
37
+ });
38
+ }
39
+ // GitHub reports a missing Item as a NOT_FOUND error with a null field, which `dataSchema`
40
+ // decodes as absent.
41
+ if (!envelope.errors.every((error) => error.type === "NOT_FOUND")) {
42
+ return yield* invalidResponse(operation, `GraphQL errors: ${envelope.errors.map((error) => error.message).join("; ")}`);
43
+ }
44
+ }
45
+ return yield* Schema.decodeUnknownEffect(dataSchema)(envelope.data).pipe(Effect.mapError((error) => invalidResponse(operation, error.message)));
46
+ });
47
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts CHANGED
@@ -1,18 +1,24 @@
1
- import { Option, Redacted } from "effect";
2
- import { HttpClientRequest, type HttpClientResponse } from "effect/unstable/http";
3
- import type { HttpClientError } from "effect/unstable/http/HttpClientError";
1
+ import { Effect, Option, Redacted } from "effect";
2
+ import { HttpClientRequest, type HttpClientResponse } from "effect/http";
3
+ import type { HttpClientError } from "effect/http/HttpClientError";
4
4
  import { GitHubApiError, GitHubRateLimitError, InvalidGitHubResponseError, type GitHubOperation } from "./error.ts";
5
5
  export declare const API_ROOT = "https://api.github.com";
6
6
  export declare const authorized: (credential: Redacted.Redacted<string>) => (self: HttpClientRequest.HttpClientRequest) => HttpClientRequest.HttpClientRequest;
7
7
  export declare const transportError: (operation: GitHubOperation, error: HttpClientError) => GitHubApiError;
8
+ /**
9
+ * Returns `failure` with the `message` field of GitHub's error response appended, for example
10
+ * `The permissions requested are not granted to this installation.`. Returns `failure`
11
+ * unchanged if the body has no such field.
12
+ */
13
+ export declare const withGitHubReason: (failure: GitHubApiError, response: HttpClientResponse.HttpClientResponse) => Effect.Effect<GitHubApiError>;
8
14
  export declare const invalidResponse: (operation: GitHubOperation, detail: string) => InvalidGitHubResponseError;
9
15
  type Headers = HttpClientResponse.HttpClientResponse["headers"];
10
16
  export declare const retryAfterMillis: (value: string | undefined, now: number) => Option.Option<number>;
11
17
  export declare const rateLimitResetMillis: (headers: Headers, threshold: number) => Option.Option<number>;
12
18
  export declare const pollIntervalMillis: (headers: Headers, now: number) => Option.Option<number>;
13
- /** The epoch when GitHub allows the next request, from `retry-after` and an exhausted primary rate-limit budget. */
19
+ /** Returns the epoch milliseconds when GitHub allows the next request, from `retry-after` or an exhausted primary rate limit. */
14
20
  export declare const rateLimitRetryEpoch: (headers: Headers, now: number) => Option.Option<number>;
15
- /** Turns a non-2xx GitHub response into a typed error. A rate-limit status with a known retry time becomes a wait, not a failure. */
21
+ /** Returns the typed error for a non-2xx GitHub response: `GitHubRateLimitError` for a 403 or 429 with a known retry time, otherwise `GitHubApiError`. */
16
22
  export declare const statusError: (operation: GitHubOperation, response: HttpClientResponse.HttpClientResponse, now: number) => GitHubApiError | GitHubRateLimitError;
17
23
  export {};
18
24
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,QAAQ,2BAA2B,CAAC;AAGjD,eAAO,MAAM,UAAU,eAAgB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,uFAM5D,CAAC;AAEL,eAAO,MAAM,cAAc,cAAe,eAAe,SAAS,eAAe,mBAQ7E,CAAC;AAEL,eAAO,MAAM,eAAe,cAAe,eAAe,UAAU,MAAM,+BAKtE,CAAC;AAEL,KAAK,OAAO,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAQhE,eAAO,MAAM,gBAAgB,UAAW,MAAM,GAAG,SAAS,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAM7F,CAAC;AAEF,eAAO,MAAM,oBAAoB,YACtB,OAAO,aACL,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,CAMtB,CAAC;AAEF,eAAO,MAAM,kBAAkB,YAAa,OAAO,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACG,CAAC;AAS3F,oHAAoH;AACpH,eAAO,MAAM,mBAAmB,YAAa,OAAO,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACQ,CAAC;AAEjG,qIAAqI;AACrI,eAAO,MAAM,WAAW,cACX,eAAe,YAChB,kBAAkB,CAAC,kBAAkB,OAC1C,MAAM,KACV,cAAc,GAAG,oBAanB,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAU,MAAM,QAAQ,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,QAAQ,2BAA2B,CAAC;AAGjD,eAAO,MAAM,UAAU,eAAgB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,uFAM5D,CAAC;AAEL,eAAO,MAAM,cAAc,cAAe,eAAe,SAAS,eAAe,mBAQ7E,CAAC;AAKL;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAClB,cAAc,YACb,kBAAkB,CAAC,kBAAkB,KAC9C,MAAM,CAAC,MAAM,CAAC,cAAc,CAmB5B,CAAC;AAEJ,eAAO,MAAM,eAAe,cAAe,eAAe,UAAU,MAAM,+BAKtE,CAAC;AAEL,KAAK,OAAO,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAQhE,eAAO,MAAM,gBAAgB,UAAW,MAAM,GAAG,SAAS,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAM7F,CAAC;AAEF,eAAO,MAAM,oBAAoB,YACtB,OAAO,aACL,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,CAMtB,CAAC;AAEF,eAAO,MAAM,kBAAkB,YAAa,OAAO,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACG,CAAC;AAS3F,iIAAiI;AACjI,eAAO,MAAM,mBAAmB,YAAa,OAAO,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACQ,CAAC;AAEjG,0JAA0J;AAC1J,eAAO,MAAM,WAAW,cACX,eAAe,YAChB,kBAAkB,CAAC,kBAAkB,OAC1C,MAAM,KACV,cAAc,GAAG,oBAanB,CAAC"}
package/dist/http.js CHANGED
@@ -1,5 +1,5 @@
1
- import { DateTime, Option, Redacted } from "effect";
2
- import { HttpClientRequest } from "effect/unstable/http";
1
+ import { DateTime, Effect, Option, Redacted, Schema } from "effect";
2
+ import { HttpClientRequest } from "effect/http";
3
3
  import { GitHubApiError, GitHubRateLimitError, InvalidGitHubResponseError, } from "./error.js";
4
4
  export const API_ROOT = "https://api.github.com";
5
5
  const API_VERSION = "2026-03-10";
@@ -13,12 +13,30 @@ export const transportError = (operation, error) => new GitHubApiError({
13
13
  operation,
14
14
  status: error.response === undefined ? Option.none() : Option.some(error.response.status),
15
15
  message: error.response === undefined
16
- ? "The request to GitHub could not be sent"
17
- : `GitHub rejected the request with status ${error.response.status}`,
16
+ ? "Could not send the request to GitHub"
17
+ : `GitHub returned HTTP status ${error.response.status}`,
18
18
  });
19
+ const ErrorBody = Schema.Struct({ message: Schema.NonEmptyString });
20
+ const decodeErrorBody = Schema.decodeUnknownOption(ErrorBody);
21
+ /**
22
+ * Returns `failure` with the `message` field of GitHub's error response appended, for example
23
+ * `The permissions requested are not granted to this installation.`. Returns `failure`
24
+ * unchanged if the body has no such field.
25
+ */
26
+ export const withGitHubReason = (failure, response) => response.json.pipe(Effect.map((body) => Option.match(decodeErrorBody(body), {
27
+ onNone: () => failure,
28
+ onSome: ({ message }) => new GitHubApiError({
29
+ operation: failure.operation,
30
+ status: failure.status,
31
+ message: `${failure.message}: ${message}`,
32
+ }),
33
+ })), Effect.catch((error) => Effect.logDebug("GitHub's error response has no JSON body to read a reason from", {
34
+ operation: failure.operation,
35
+ message: error.message,
36
+ }).pipe(Effect.as(failure))));
19
37
  export const invalidResponse = (operation, detail) => new InvalidGitHubResponseError({
20
38
  operation,
21
- message: "GitHub returned a response that does not match its API contract",
39
+ message: "GitHub returned a response in an unexpected format",
22
40
  detail,
23
41
  });
24
42
  const parseInteger = (value) => {
@@ -48,21 +66,21 @@ const latestEpoch = (candidates) => {
48
66
  const epochs = candidates.flatMap((candidate) => Option.match(candidate, { onNone: () => [], onSome: (value) => [value] }));
49
67
  return epochs.length === 0 ? Option.none() : Option.some(Math.max(...epochs));
50
68
  };
51
- /** The epoch when GitHub allows the next request, from `retry-after` and an exhausted primary rate-limit budget. */
69
+ /** Returns the epoch milliseconds when GitHub allows the next request, from `retry-after` or an exhausted primary rate limit. */
52
70
  export const rateLimitRetryEpoch = (headers, now) => latestEpoch([retryAfterMillis(headers["retry-after"], now), rateLimitResetMillis(headers, 0)]);
53
- /** Turns a non-2xx GitHub response into a typed error. A rate-limit status with a known retry time becomes a wait, not a failure. */
71
+ /** Returns the typed error for a non-2xx GitHub response: `GitHubRateLimitError` for a 403 or 429 with a known retry time, otherwise `GitHubApiError`. */
54
72
  export const statusError = (operation, response, now) => {
55
73
  const retryAt = Option.flatMap(rateLimitRetryEpoch(response.headers, now), DateTime.make);
56
74
  return (response.status === 403 || response.status === 429) && Option.isSome(retryAt)
57
75
  ? new GitHubRateLimitError({
58
76
  operation,
59
77
  retryAt: retryAt.value,
60
- message: "GitHub asked the poller to wait before retrying",
78
+ message: "GitHub API rate limit exceeded",
61
79
  })
62
80
  : new GitHubApiError({
63
81
  operation,
64
82
  status: Option.some(response.status),
65
- message: `GitHub rejected the request with status ${response.status}`,
83
+ message: `GitHub returned HTTP status ${response.status}`,
66
84
  });
67
85
  };
68
86
  //# sourceMappingURL=http.js.map
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,37 @@
1
1
  import { Schema } from "effect";
2
- /** The numeric identity of an installation of the factory's GitHub App. */
2
+ /** The ID of an installation of the factory's GitHub App. */
3
3
  export declare const InstallationId: Schema.brand<Schema.Int, "GitHubInstallationId">;
4
4
  export type InstallationId = typeof InstallationId.Type;
5
- /** GitHub's numeric repository identity, used to restrict installation tokens. */
5
+ /** GitHub's numeric repository ID, used to restrict installation tokens. */
6
6
  export declare const RepositoryId: Schema.brand<Schema.Int, "GitHubRepositoryId">;
7
7
  export type RepositoryId = typeof RepositoryId.Type;
8
+ /**
9
+ * The App's URL name. GitHub's GraphQL API reports the App's own changes with a `Bot` actor
10
+ * whose login is this slug; the REST login adds `[bot]`.
11
+ */
12
+ export declare const AppSlug: Schema.brand<Schema.NonEmptyString, "GitHubAppSlug">;
13
+ export type AppSlug = typeof AppSlug.Type;
8
14
  declare const Installation_base: Schema.Class<Installation, Schema.Struct<{
9
15
  readonly id: Schema.brand<Schema.Int, "GitHubInstallationId">;
10
16
  readonly accountLogin: Schema.NonEmptyString;
17
+ readonly appSlug: Schema.brand<Schema.NonEmptyString, "GitHubAppSlug">;
11
18
  }>, {}>;
12
- /** The discovered App installation and the account that owns it. */
19
+ /** The App installation, its owner account, and the App's slug. */
13
20
  export declare class Installation extends Installation_base {
14
21
  }
15
22
  declare const InstallationWide_base: Schema.Class<InstallationWide, Schema.TaggedStruct<"InstallationWide", {}>, {}>;
16
- /** Token access to every repository covered by the installation. */
23
+ /** A token scope that covers every repository of the installation. */
17
24
  export declare class InstallationWide extends InstallationWide_base {
18
25
  }
19
26
  declare const SingleRepository_base: Schema.Class<SingleRepository, Schema.TaggedStruct<"SingleRepository", {
20
27
  readonly repository: Schema.brand<Schema.String, "RepositoryName">;
21
28
  readonly repositoryId: Schema.brand<Schema.Int, "GitHubRepositoryId">;
29
+ readonly permissions: Schema.Literals<readonly ["write", "read"]>;
22
30
  }>, {}>;
23
- /** Token access restricted to the repository assigned to one Attempt. */
31
+ /** A token scope restricted to one Attempt's repository, at the Loop's permission level (`WORKER_TOKEN_PERMISSIONS`). */
24
32
  export declare class SingleRepository extends SingleRepository_base {
25
33
  }
26
- /** The repository coverage requested when minting an installation token. */
34
+ /** The repository scope requested when minting an installation token. */
27
35
  export declare const TokenScope: Schema.Union<readonly [typeof InstallationWide, typeof SingleRepository]>;
28
36
  export type TokenScope = typeof TokenScope.Type;
29
37
  declare const InstallationToken_base: Schema.Class<InstallationToken, Schema.Struct<{
@@ -31,17 +39,17 @@ declare const InstallationToken_base: Schema.Class<InstallationToken, Schema.Str
31
39
  readonly expiresAt: Schema.DateTimeUtc;
32
40
  readonly scope: Schema.Union<readonly [typeof InstallationWide, typeof SingleRepository]>;
33
41
  }>, {}>;
34
- /** A redacted installation credential with its expiry and permitted repository scope. */
42
+ /** A redacted installation token with its expiry and repository scope. */
35
43
  export declare class InstallationToken extends InstallationToken_base {
36
44
  }
37
- /** Why App installation discovery could not select one usable installation. */
45
+ /** The reason installation discovery couldn't select one usable installation. */
38
46
  export declare const InstallationDiscoveryReason: Schema.Literals<readonly ["missing", "multiple", "suspended"]>;
39
47
  export type InstallationDiscoveryReason = typeof InstallationDiscoveryReason.Type;
40
48
  declare const InstallationDiscoveryError_base: Schema.Class<InstallationDiscoveryError, Schema.TaggedStruct<"InstallationDiscoveryError", {
41
49
  readonly reason: Schema.Literals<readonly ["missing", "multiple", "suspended"]>;
42
50
  readonly message: Schema.NonEmptyString;
43
51
  }>, import("effect/Cause").YieldableError>;
44
- /** The App has no unambiguous active installation to use for repository access. */
52
+ /** The error when the App has no single active installation. */
45
53
  export declare class InstallationDiscoveryError extends InstallationDiscoveryError_base {
46
54
  }
47
55
  export {};