@snappedly-tools/shipyard 0.8.0 → 0.9.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 (45) hide show
  1. package/README.md +24 -14
  2. package/dist/MountConfig-K5ILnfht.d.ts +26 -0
  3. package/dist/{MountConfig-BHnKnA4h.d.ts → SandboxProvider-oUAwYlWm.d.ts} +1 -26
  4. package/dist/{chunk-L6PX5QTU.js → chunk-57EEKW3R.js} +57 -55
  5. package/dist/chunk-57EEKW3R.js.map +1 -0
  6. package/dist/{chunk-JI3HDDMS.js → chunk-HXSZM52J.js} +3 -3
  7. package/dist/{chunk-JI3HDDMS.js.map → chunk-HXSZM52J.js.map} +1 -1
  8. package/dist/{chunk-44I2BL6E.js → chunk-JZUBT4WG.js} +20 -4
  9. package/dist/chunk-JZUBT4WG.js.map +1 -0
  10. package/dist/chunk-NQRFVKCU.js +1840 -0
  11. package/dist/chunk-NQRFVKCU.js.map +1 -0
  12. package/dist/chunk-Z5C4LHVP.js +137 -0
  13. package/dist/chunk-Z5C4LHVP.js.map +1 -0
  14. package/dist/createSandbox-DmbnWAZv.d.ts +739 -0
  15. package/dist/index.d.ts +7 -2534
  16. package/dist/index.js +216 -7269
  17. package/dist/index.js.map +1 -1
  18. package/dist/integrations/github.d.ts +52 -0
  19. package/dist/integrations/github.js +1049 -0
  20. package/dist/integrations/github.js.map +1 -0
  21. package/dist/integrations/releases.d.ts +136 -0
  22. package/dist/integrations/releases.js +500 -0
  23. package/dist/integrations/releases.js.map +1 -0
  24. package/dist/main.js +641 -383
  25. package/dist/main.js.map +1 -1
  26. package/dist/publication-BPoy_M9M.d.ts +1200 -0
  27. package/dist/sandboxes/docker.d.ts +2 -1
  28. package/dist/sandboxes/docker.js +2 -2
  29. package/dist/templates/parallel-planner/main.mts +11 -7
  30. package/dist/templates/parallel-planner/setup.sh +1 -0
  31. package/dist/templates/parallel-planner-with-review/main.mts +11 -7
  32. package/dist/templates/parallel-planner-with-review/setup.sh +1 -0
  33. package/dist/templates/sequential-reviewer/main.mts +7 -3
  34. package/dist/templates/sequential-reviewer/setup.sh +1 -0
  35. package/dist/templates/shared/setup.sh +1 -0
  36. package/dist/templates/simple-loop/main.mts +7 -3
  37. package/dist/templates/simple-loop/setup.sh +1 -0
  38. package/dist/workflow/coordinator/migrations/002_workflow_phase_records.sql +11 -0
  39. package/dist/workflow/coordinator/migrations/003_phase_record_schema_version.sql +6 -0
  40. package/dist/workflow.d.ts +472 -0
  41. package/dist/workflow.js +4345 -0
  42. package/dist/workflow.js.map +1 -0
  43. package/package.json +13 -1
  44. package/dist/chunk-44I2BL6E.js.map +0 -1
  45. package/dist/chunk-L6PX5QTU.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integrations/github/signature.ts","../../src/integrations/github/store.ts","../../src/integrations/github/integration.ts","../../src/integrations/github/publication.ts"],"names":["pullRequestNumber","result","state","createHash"],"mappings":"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","file":"github.js","sourcesContent":["import { createHmac, timingSafeEqual } from \"node:crypto\";\n\nexport interface GitHubWebhookSignatureInput {\n readonly body: string | Uint8Array;\n readonly signature?: string;\n readonly secret: string | Uint8Array;\n}\n\nconst asBytes = (value: string | Uint8Array): Buffer =>\n typeof value === \"string\" ? Buffer.from(value, \"utf8\") : Buffer.from(value);\n\n/**\n * Verifies GitHub's `X-Hub-Signature-256` value without exposing the secret.\n * Malformed values are compared against a same-sized zero buffer so the final\n * digest comparison always uses the constant-time primitive.\n */\nexport const verifyGitHubWebhookSignature = (\n input: GitHubWebhookSignatureInput,\n): boolean => {\n const expected = createHmac(\"sha256\", asBytes(input.secret))\n .update(asBytes(input.body))\n .digest();\n const signature = input.signature ?? \"\";\n const prefix = \"sha256=\";\n const encoded = signature.startsWith(prefix)\n ? signature.slice(prefix.length)\n : \"\";\n const isHexDigest = /^[0-9a-f]{64}$/i.test(encoded);\n const candidate = isHexDigest\n ? Buffer.from(encoded, \"hex\")\n : Buffer.alloc(expected.length);\n\n return timingSafeEqual(expected, candidate) && isHexDigest;\n};\n","import type {\n GitHubDeliveryRecord,\n GitHubDeliveryStore,\n GitHubTrackedPullRequest,\n GitHubTrackingStore,\n} from \"./types.js\";\n\n/**\n * Small in-memory adapter for tests and local development. Production callers\n * should provide a durable adapter with the same atomic insert semantics.\n */\nexport class InMemoryGitHubStore\n implements GitHubDeliveryStore, GitHubTrackingStore\n{\n private readonly deliveries = new Map<string, GitHubDeliveryRecord>();\n private readonly trackedPullRequests = new Map<\n string,\n GitHubTrackedPullRequest\n >();\n\n async recordDeliveryIfAbsent(delivery: GitHubDeliveryRecord): Promise<{\n readonly delivery: GitHubDeliveryRecord;\n readonly inserted: boolean;\n }> {\n const existing = this.deliveries.get(delivery.deliveryId);\n if (existing !== undefined) {\n return { delivery: existing, inserted: false };\n }\n this.deliveries.set(delivery.deliveryId, delivery);\n return { delivery, inserted: true };\n }\n\n async getDelivery(\n deliveryId: string,\n ): Promise<GitHubDeliveryRecord | undefined> {\n return this.deliveries.get(deliveryId);\n }\n\n async updateDelivery(delivery: GitHubDeliveryRecord): Promise<void> {\n const existing = this.deliveries.get(delivery.deliveryId);\n if (existing === undefined) {\n throw new Error(`GitHub delivery ${delivery.deliveryId} does not exist`);\n }\n this.deliveries.set(delivery.deliveryId, delivery);\n }\n\n async findTrackedPullRequest(\n repository: string,\n pullRequestNumber: number,\n ): Promise<GitHubTrackedPullRequest | undefined> {\n return this.trackedPullRequests.get(\n `${repository.toLowerCase()}\\u0000${pullRequestNumber}`,\n );\n }\n\n async saveTrackedPullRequest(\n pullRequest: GitHubTrackedPullRequest,\n ): Promise<void> {\n this.trackedPullRequests.set(\n `${pullRequest.repository.toLowerCase()}\\u0000${pullRequest.pullRequestNumber}`,\n pullRequest,\n );\n }\n}\n","import { createHash } from \"node:crypto\";\nimport {\n createWorkBrief,\n parseRepositoryPolicy,\n parseWorkBrief,\n type WorkIdentity,\n type WorkItemKind,\n type WorkBrief,\n} from \"../../workflow/contracts/index.js\";\nimport { runTriage, type TriageSource } from \"../../workflow/triage/index.js\";\nimport {\n processHumanReviewDecision,\n type HumanReviewDecisionInput,\n} from \"../../workflow/handoff/index.js\";\nimport { verifyGitHubWebhookSignature } from \"./signature.js\";\nimport type {\n GitHubActor,\n GitHubAuthorizationPolicy,\n GitHubBriefFactoryInput,\n GitHubCommentSnapshot,\n GitHubDeliveryRecord,\n GitHubEventName,\n GitHubIgnoredEvent,\n GitHubIntegrationOptions,\n GitHubIssueSnapshot,\n GitHubNormalizationResult,\n GitHubNormalizedEvent,\n GitHubPullRequestReviewSnapshot,\n GitHubReconciliationInput,\n GitHubReconciliationResult,\n GitHubWebhookEnvelope,\n GitHubWebhookReceipt,\n GitHubWebhookRequest,\n} from \"./types.js\";\n\ntype JsonRecord = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is JsonRecord =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst record = (value: unknown): JsonRecord | undefined =>\n isRecord(value) ? value : undefined;\n\nconst stringValue = (value: unknown, fallback = \"\"): string =>\n typeof value === \"string\" ? value : fallback;\n\nconst requiredStringValue = (value: unknown): string | undefined => {\n const result = stringValue(value).trim();\n return result.length === 0 ? undefined : result;\n};\n\nconst numberValue = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isInteger(value) && value > 0\n ? value\n : undefined;\n\nconst header = (\n headers: Readonly<Record<string, string | undefined>>,\n name: string,\n): string | undefined => {\n const wanted = name.toLowerCase();\n const key = Object.keys(headers).find(\n (candidate) => candidate.toLowerCase() === wanted,\n );\n return key === undefined ? undefined : headers[key];\n};\n\nconst bodyBytes = (body: string | Uint8Array): Uint8Array =>\n typeof body === \"string\" ? new TextEncoder().encode(body) : body;\n\nconst bodyText = (body: string | Uint8Array): string =>\n typeof body === \"string\" ? body : new TextDecoder().decode(body);\n\nconst payloadHash = (body: string | Uint8Array): string =>\n createHash(\"sha256\").update(bodyBytes(body)).digest(\"hex\");\n\nconst MAX_WEBHOOK_BODY_BYTES = 10 * 1024 * 1024;\n\nconst parseBody = (body: string): unknown => {\n try {\n return JSON.parse(body) as unknown;\n } catch {\n return undefined;\n }\n};\n\nconst actor = (value: unknown): GitHubActor => {\n const candidate = record(value);\n return {\n login: stringValue(candidate?.login, \"unknown\"),\n type: stringValue(candidate?.type) || undefined,\n };\n};\n\nconst repositoryName = (payload: JsonRecord): string | undefined =>\n requiredStringValue(record(payload.repository)?.full_name);\n\nconst sender = (payload: JsonRecord): GitHubActor =>\n actor(payload.sender ?? record(payload.comment)?.user ?? undefined);\n\nconst labels = (value: unknown): string[] => {\n if (!Array.isArray(value)) return [];\n return value\n .map((entry) =>\n typeof entry === \"string\" ? entry : stringValue(record(entry)?.name),\n )\n .filter((entry) => entry.length > 0);\n};\n\nconst state = (value: unknown): \"open\" | \"closed\" =>\n value === \"closed\" ? \"closed\" : \"open\";\n\nconst allowedEventNames = new Set<GitHubEventName>([\n \"issues\",\n \"issue_comment\",\n \"pull_request\",\n \"pull_request_review\",\n \"pull_request_review_comment\",\n \"check_run\",\n \"check_suite\",\n]);\n\nconst supportedActions: Readonly<Record<GitHubEventName, readonly string[]>> = {\n issues: [\"opened\", \"edited\", \"reopened\", \"closed\"],\n issue_comment: [\"created\", \"edited\"],\n pull_request: [\n \"opened\",\n \"edited\",\n \"reopened\",\n \"closed\",\n \"synchronize\",\n \"ready_for_review\",\n \"converted_to_draft\",\n ],\n pull_request_review: [\"submitted\", \"edited\", \"dismissed\"],\n pull_request_review_comment: [\"created\", \"edited\", \"deleted\"],\n check_run: [\"created\", \"rerequested\", \"completed\"],\n check_suite: [\"completed\", \"requested\", \"rerequested\"],\n};\n\nconst ignored = (input: {\n readonly reason: GitHubIgnoredEvent[\"reason\"];\n readonly eventName: string;\n readonly action?: string;\n readonly deliveryId: string;\n readonly repository: string;\n readonly sender: GitHubActor;\n}): GitHubIgnoredEvent => ({ disposition: \"ignored\", ...input });\n\ntype IssueBriefResolution =\n | { readonly brief: WorkBrief }\n | {\n readonly ignoredReason: \"triage-source-conflict\" | \"triage-incomplete\";\n };\n\nconst issueSnapshot = (\n payload: JsonRecord,\n): GitHubIssueSnapshot | undefined => {\n const value = record(payload.issue);\n const number = numberValue(value?.number);\n if (value === undefined || number === undefined) return undefined;\n return {\n number,\n title: stringValue(value.title, \"Untitled issue\"),\n body: stringValue(value.body),\n state: state(value.state),\n updatedAt: stringValue(value.updated_at),\n htmlUrl: requiredStringValue(value.html_url),\n authorLogin: requiredStringValue(record(value.user)?.login),\n labels: labels(value.labels),\n pullRequestNumber: numberValue(record(value.pull_request)?.number),\n };\n};\n\nconst commentSnapshot = (\n payload: JsonRecord,\n): GitHubCommentSnapshot | undefined => {\n const value = record(payload.comment);\n const id = requiredStringValue(value?.id);\n if (value === undefined || id === undefined) return undefined;\n return {\n id,\n body: stringValue(value.body),\n updatedAt: stringValue(value.updated_at),\n htmlUrl: requiredStringValue(value.html_url),\n authorLogin: requiredStringValue(record(value.user)?.login),\n };\n};\n\nconst reviewState = (\n value: unknown,\n): GitHubPullRequestReviewSnapshot[\"state\"] | undefined => {\n const normalized = requiredStringValue(value)\n ?.toLowerCase()\n .replaceAll(\"_\", \"-\");\n switch (normalized) {\n case \"approved\":\n case \"changes-requested\":\n case \"commented\":\n case \"dismissed\":\n case \"pending\":\n return normalized;\n default:\n return undefined;\n }\n};\n\nconst reviewSnapshot = (\n payload: JsonRecord,\n): GitHubPullRequestReviewSnapshot | undefined => {\n const value = record(payload.review);\n if (value === undefined) return undefined;\n const rawId = value.id;\n const id =\n typeof rawId === \"number\" && Number.isInteger(rawId) && rawId > 0\n ? String(rawId)\n : requiredStringValue(rawId);\n const state = reviewState(value.state);\n const pullRequest = record(payload.pull_request);\n const headSha =\n requiredStringValue(value.commit_id) ??\n requiredStringValue(record(pullRequest?.head)?.sha);\n const submittedAt =\n requiredStringValue(value.submitted_at) ??\n requiredStringValue(value.updated_at) ??\n requiredStringValue(value.created_at);\n if (\n id === undefined ||\n state === undefined ||\n headSha === undefined ||\n submittedAt === undefined\n ) {\n return undefined;\n }\n return {\n id,\n state,\n headSha,\n submittedAt,\n authorLogin: requiredStringValue(record(value.user)?.login),\n };\n};\n\nexport const reviewDecisionFor = (\n review: GitHubPullRequestReviewSnapshot,\n): HumanReviewDecisionInput | undefined => {\n switch (review.state) {\n case \"approved\":\n return { decision: \"approved\" };\n case \"changes-requested\":\n return { decision: \"changes-requested\" };\n case \"dismissed\":\n return { decision: \"rejected\", reason: \"GitHub review was dismissed\" };\n case \"commented\":\n case \"pending\":\n return undefined;\n }\n};\n\nconst pullRequestNumber = (payload: JsonRecord): number | undefined => {\n const direct = numberValue(record(payload.pull_request)?.number);\n if (direct !== undefined) return direct;\n const issue = numberValue(record(payload.issue)?.number);\n if (\n issue !== undefined &&\n record(payload.issue)?.pull_request !== undefined\n ) {\n return issue;\n }\n const check = record(payload.check_run) ?? record(payload.check_suite);\n const pullRequests = check?.pull_requests;\n if (Array.isArray(pullRequests)) {\n return numberValue(record(pullRequests[0])?.number);\n }\n return undefined;\n};\n\nconst pullRequestHead = (payload: JsonRecord, fallback: string): string =>\n requiredStringValue(record(record(payload.pull_request)?.head)?.sha) ??\n requiredStringValue(record(payload.check_run)?.head_sha) ??\n requiredStringValue(record(payload.check_suite)?.head_sha) ??\n fallback;\n\nconst issueKind = (issue: GitHubIssueSnapshot): WorkItemKind => {\n const normalized = new Set(issue.labels.map((label) => label.toLowerCase()));\n if (normalized.has(\"planning-spec\") || normalized.has(\"planning\")) {\n return \"planning-spec\";\n }\n if (normalized.has(\"pr-repair\") || normalized.has(\"repair\")) {\n return \"pr-repair\";\n }\n return \"executable-issue\";\n};\n\nconst sameIssueContent = (\n brief: WorkBrief,\n issue: GitHubIssueSnapshot,\n): boolean =>\n (brief.problem ===\n `${issue.title}\\n\\n${issue.body || \"(empty issue body)\"}` ||\n brief.problem === issue.title) &&\n brief.source.originalBody === (issue.body || \"(empty issue body)\");\n\nexport const createGitHubIssueBrief = (\n input: GitHubBriefFactoryInput,\n): WorkBrief => {\n const issue = input.event;\n return createWorkBrief({\n id: `${issue.repository}:${issue.kind}:${issue.issueNumber}`,\n revision: input.revision,\n identity: {\n repository: issue.repository,\n itemId: String(issue.issueNumber),\n kind: input.itemKind,\n },\n source: {\n provider: \"github\",\n repository: issue.repository,\n itemId: String(issue.issueNumber),\n url: issue.reply?.htmlUrl ?? issue.trackedPullRequest?.brief.source.url,\n originalBody: issue.body || \"(empty issue body)\",\n author: issue.reply?.authorLogin,\n },\n problem: issue.title + \"\\n\\n\" + (issue.body || \"(empty issue body)\"),\n evidence: [\"Submitted through authenticated GitHub intake.\"],\n acceptanceCriteria: input.defaults?.acceptanceCriteria ?? [],\n exclusions: input.defaults?.exclusions ?? [],\n risk: input.defaults?.risk ?? \"medium\",\n verification: {\n checks: input.policy.checks.map((check) => check.command),\n artifacts: input.defaults?.verificationArtifacts ?? [],\n },\n unresolvedQuestions: input.defaults?.unresolvedQuestions ?? [\n \"A maintainer must confirm acceptance criteria and execution authorization.\",\n ],\n authorization: { status: \"pending\" },\n base: input.base,\n policyRevision: input.policy.revision,\n skillRevision: input.policy.worker.skillRevision,\n createdAt: issue.observedAt,\n });\n};\n\nconst eventName = (value: string): GitHubEventName | undefined =>\n allowedEventNames.has(value as GitHubEventName)\n ? (value as GitHubEventName)\n : undefined;\n\nexport class GitHubIntegration {\n private readonly options: GitHubIntegrationOptions;\n private readonly now: () => string;\n\n constructor(options: GitHubIntegrationOptions) {\n this.options = {\n ...options,\n policy: parseRepositoryPolicy(options.policy),\n };\n this.now = options.now ?? (() => new Date().toISOString());\n }\n\n async receiveWebhook(\n request: GitHubWebhookRequest,\n ): Promise<GitHubWebhookReceipt> {\n const deliveryId = header(request.headers, \"x-github-delivery\");\n const eventHeader = header(request.headers, \"x-github-event\");\n if (deliveryId === undefined || eventHeader === undefined) {\n return {\n status: \"rejected\",\n deliveryId: deliveryId ?? \"unknown\",\n reason: \"missing-delivery-or-event-header\",\n };\n }\n if (bodyBytes(request.body).byteLength > MAX_WEBHOOK_BODY_BYTES) {\n return { status: \"rejected\", deliveryId, reason: \"body-too-large\" };\n }\n const body = bodyText(request.body);\n if (\n !verifyGitHubWebhookSignature({\n body: request.body,\n signature: header(request.headers, \"x-hub-signature-256\"),\n secret: this.options.webhookSecret,\n })\n ) {\n return { status: \"rejected\", deliveryId, reason: \"invalid-signature\" };\n }\n return this.processEnvelope({\n eventName: eventHeader,\n deliveryId,\n payload: parseBody(body),\n receivedAt: this.now(),\n body,\n });\n }\n\n async normalize(\n envelope: GitHubWebhookEnvelope,\n ): Promise<GitHubNormalizationResult> {\n const payload = record(envelope.payload);\n const name = eventName(envelope.eventName);\n const repository = payload\n ? (repositoryName(payload) ?? \"unknown\")\n : \"unknown\";\n const source = payload ? sender(payload) : { login: \"unknown\" };\n if (name === undefined) {\n return ignored({\n reason: \"unsupported-event\",\n eventName: envelope.eventName,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n const action = stringValue(payload?.action);\n if (!supportedActions[name].includes(action)) {\n return ignored({\n reason: \"unsupported-action\",\n eventName: name,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n if (payload === undefined) {\n return ignored({\n reason: \"unsupported-event\",\n eventName: name,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n\n if (name === \"issues\" || name === \"issue_comment\") {\n const issue = issueSnapshot(payload);\n if (issue === undefined) {\n return ignored({\n reason: \"unsupported-event\",\n eventName: name,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n const issueIsPullRequest =\n issue.pullRequestNumber !== undefined ||\n record(record(payload.issue)?.pull_request) !== undefined;\n if (issueIsPullRequest) {\n return this.normalizeTrackedPullRequest(\n envelope,\n payload,\n issue.pullRequestNumber ?? issue.number,\n name === \"issue_comment\" ? commentSnapshot(payload) : undefined,\n );\n }\n const kind = issueKind(issue);\n const draft: Omit<GitHubNormalizedEvent, \"workflowEvent\"> = {\n kind:\n name === \"issue_comment\"\n ? \"issue-replied\"\n : action === \"opened\" || action === \"reopened\"\n ? \"issue-created\"\n : \"issue-edited\",\n eventName: name,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n issueNumber: issue.number,\n title: issue.title,\n body: issue.body,\n labels: issue.labels,\n relevantRevision: issue.updatedAt || envelope.receivedAt,\n observedAt: issue.updatedAt || envelope.receivedAt,\n sourceState: issue.state,\n reply: name === \"issue_comment\" ? commentSnapshot(payload) : undefined,\n };\n const briefResolution = await this.briefForIssue(draft, issue, kind);\n if (\"ignoredReason\" in briefResolution) {\n return ignored({\n reason: briefResolution.ignoredReason,\n eventName: envelope.eventName,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n const brief = briefResolution.brief;\n return {\n disposition: \"accepted\",\n event: {\n ...draft,\n workflowEvent: {\n deliveryId: envelope.deliveryId,\n brief,\n policy: this.options.policy,\n phase: \"triage\",\n relevantRevision: draft.relevantRevision,\n observedAt: draft.observedAt,\n sourceState: draft.sourceState,\n payload: envelope.payload,\n },\n },\n };\n }\n\n const number = pullRequestNumber(payload);\n if (number === undefined) {\n return ignored({\n reason: \"unrelated-pull-request\",\n eventName: name,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n const review =\n name === \"pull_request_review\" ? reviewSnapshot(payload) : undefined;\n if (name === \"pull_request_review\" && review === undefined) {\n return ignored({\n reason: \"unsupported-event\",\n eventName: name,\n action,\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n return this.normalizeTrackedPullRequest(\n envelope,\n payload,\n number,\n undefined,\n review,\n );\n }\n\n async reconcile(\n input: GitHubReconciliationInput,\n ): Promise<GitHubReconciliationResult> {\n const hasIssue = input.issueNumber !== undefined;\n const hasPullRequest = input.pullRequestNumber !== undefined;\n if (hasIssue === hasPullRequest) {\n throw new Error(\n \"Reconciliation requires exactly one issue or pull request\",\n );\n }\n if (hasIssue) {\n const issue = await input.transport.fetchIssue({\n repository: input.repository,\n issueNumber: input.issueNumber!,\n });\n if (issue === undefined) {\n return {\n status: \"not-found\",\n deliveryId: `reconcile:issue:${input.repository}:${input.issueNumber}`,\n };\n }\n const payload = this.issuePayload(issue, input.repository);\n return this.toReconciliationResult(\n await this.processEnvelope(\n {\n eventName: \"issues\",\n deliveryId: `reconcile:issue:${input.repository}:${issue.number}:${issue.updatedAt}`,\n payload,\n receivedAt: this.now(),\n },\n true,\n ),\n );\n }\n const pullRequest = await input.transport.fetchPullRequest({\n repository: input.repository,\n pullRequestNumber: input.pullRequestNumber!,\n });\n if (pullRequest === undefined) {\n return {\n status: \"not-found\",\n deliveryId: `reconcile:pull-request:${input.repository}:${input.pullRequestNumber}`,\n };\n }\n return this.toReconciliationResult(\n await this.processEnvelope(\n {\n eventName: \"pull_request\",\n deliveryId: `reconcile:pull-request:${input.repository}:${pullRequest.number}:${pullRequest.headSha}`,\n payload: this.pullRequestPayload(pullRequest, input.repository),\n receivedAt: this.now(),\n },\n true,\n ),\n );\n }\n\n private async processEnvelope(\n envelope: GitHubWebhookEnvelope & { readonly body?: string },\n trustedReconciliation = false,\n ): Promise<GitHubWebhookReceipt> {\n const payload = record(envelope.payload);\n const repository = payload\n ? (repositoryName(payload) ?? \"unknown\")\n : \"unknown\";\n const source = payload ? sender(payload) : { login: \"unknown\" };\n const body = envelope.body ?? JSON.stringify(envelope.payload);\n const delivery: GitHubDeliveryRecord = {\n deliveryId: envelope.deliveryId,\n eventName: envelope.eventName,\n repository,\n senderLogin: source.login,\n receivedAt: envelope.receivedAt,\n payloadHash: payloadHash(body),\n payload: envelope.payload,\n status: \"received\",\n };\n const stored =\n await this.options.deliveryStore.recordDeliveryIfAbsent(delivery);\n if (!stored.inserted && stored.delivery.status !== \"received\") {\n return { status: \"duplicate\", deliveryId: envelope.deliveryId };\n }\n const effectiveEnvelope = stored.inserted\n ? envelope\n : {\n ...envelope,\n payload: stored.delivery.payload,\n receivedAt: stored.delivery.receivedAt,\n body: JSON.stringify(stored.delivery.payload),\n };\n const effectiveDelivery = stored.inserted ? delivery : stored.delivery;\n if (\n !allowedRepository(\n this.options.authorization,\n effectiveDelivery.repository,\n )\n ) {\n return this.rejectStored(effectiveDelivery, \"disallowed-repository\");\n }\n const effectivePayload = record(effectiveEnvelope.payload);\n const effectiveSource = effectivePayload\n ? sender(effectivePayload)\n : { login: \"unknown\" };\n if (\n !trustedReconciliation &&\n isBot(effectiveSource, this.options.authorization)\n ) {\n return this.ignoreStored(effectiveDelivery, \"bot-originated\");\n }\n if (!trustedReconciliation) {\n const isReview = effectiveEnvelope.eventName === \"pull_request_review\";\n const authorized = isReview\n ? allowedReviewer(this.options.authorization, effectiveSource)\n : allowedSender(this.options.authorization, effectiveSource);\n if (!authorized) {\n return this.rejectStored(\n effectiveDelivery,\n isReview ? \"disallowed-reviewer\" : \"disallowed-sender\",\n );\n }\n }\n const normalized = await this.normalize(effectiveEnvelope);\n if (normalized.disposition === \"ignored\") {\n return this.ignoreStored(effectiveDelivery, normalized.reason);\n }\n if (normalized.event.review !== undefined) {\n const tracked = normalized.event.trackedPullRequest;\n const handler = this.options.reviewHandler;\n const decision = reviewDecisionFor(normalized.event.review);\n if (handler === undefined) {\n return this.rejectStored(\n effectiveDelivery,\n \"review-handler-unconfigured\",\n );\n }\n if (tracked === undefined) {\n return this.rejectStored(\n effectiveDelivery,\n \"review-missing-tracked-pull-request\",\n );\n }\n if (decision === undefined) {\n return this.ignoreStored(effectiveDelivery, \"review-without-decision\");\n }\n const candidate = {\n base: tracked.brief.base,\n head: {\n branch: tracked.branch,\n sha: normalized.event.review.headSha,\n },\n briefHash: tracked.brief.hash,\n };\n let reviewResult: Awaited<ReturnType<typeof processHumanReviewDecision>>;\n try {\n reviewResult = await processHumanReviewDecision({\n candidate,\n decision,\n pullRequestNumber: tracked.pullRequestNumber,\n readCurrent: () =>\n handler.readCurrent({\n candidate,\n trackedPullRequest: tracked,\n }),\n requestRepair: handler.requestRepair,\n });\n } catch (error) {\n return this.rejectStored(\n effectiveDelivery,\n `review-handler-failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n const status =\n reviewResult.outcome === \"blocked\" ? \"ignored\" : \"accepted\";\n await this.options.deliveryStore.updateDelivery({\n ...effectiveDelivery,\n status,\n eventKind: normalized.event.kind,\n jobId: tracked.jobId,\n reason: reviewResult.reason,\n });\n return {\n status,\n deliveryId: envelope.deliveryId,\n event: normalized.event,\n review: reviewResult,\n reason: reviewResult.reason,\n };\n }\n const ingest = await this.options.coordinator.ingest(\n normalized.event.workflowEvent,\n );\n await this.options.deliveryStore.updateDelivery({\n ...effectiveDelivery,\n status: ingest.disposition === \"ignored\" ? \"ignored\" : \"accepted\",\n eventKind: normalized.event.kind,\n jobId: ingest.job?.id,\n reason: ingest.reason,\n });\n return {\n status:\n ingest.disposition === \"duplicate\"\n ? \"duplicate\"\n : ingest.disposition === \"ignored\"\n ? \"ignored\"\n : \"accepted\",\n deliveryId: envelope.deliveryId,\n event: normalized.event,\n ingest,\n reason: ingest.reason,\n };\n }\n\n private async rejectStored(\n delivery: GitHubDeliveryRecord,\n reason: string,\n ): Promise<GitHubWebhookReceipt> {\n await this.options.deliveryStore.updateDelivery({\n ...delivery,\n status: \"rejected\",\n reason,\n });\n return { status: \"rejected\", deliveryId: delivery.deliveryId, reason };\n }\n\n private async ignoreStored(\n delivery: GitHubDeliveryRecord,\n reason: string,\n ): Promise<GitHubWebhookReceipt> {\n await this.options.deliveryStore.updateDelivery({\n ...delivery,\n status: \"ignored\",\n reason,\n });\n return { status: \"ignored\", deliveryId: delivery.deliveryId, reason };\n }\n\n private async briefForIssue(\n draft: Omit<GitHubNormalizedEvent, \"workflowEvent\">,\n issue: GitHubIssueSnapshot,\n kind: WorkItemKind,\n ): Promise<IssueBriefResolution> {\n const identity: WorkIdentity = {\n repository: draft.repository,\n itemId: String(issue.number),\n kind,\n };\n const current = await this.options.coordinator.getCurrentJob(identity);\n if (\n this.options.triage === undefined &&\n current !== undefined &&\n current.control === \"active\" &&\n sameIssueContent(current.brief, issue)\n ) {\n return { brief: current.brief };\n }\n if (this.options.triage !== undefined) {\n const source: TriageSource = {\n provider: \"github\",\n repository: draft.repository,\n itemId: String(issue.number),\n title: issue.title,\n body: issue.body,\n author: issue.authorLogin ?? draft.sender.login,\n url: issue.htmlUrl,\n updatedAt: issue.updatedAt || draft.observedAt,\n kind,\n labels: issue.labels,\n };\n const triage = await runTriage({\n source,\n policy: this.options.policy,\n base: this.options.base,\n store: this.options.triage.store,\n investigator: this.options.triage.investigator,\n clarificationReply:\n draft.kind === \"issue-replied\" && draft.reply !== undefined\n ? {\n id: draft.reply.id,\n body: draft.reply.body,\n author: draft.reply.authorLogin,\n updatedAt: draft.reply.updatedAt,\n }\n : undefined,\n now: this.now,\n });\n if (triage.record.sourceConflict !== undefined) {\n return { ignoredReason: \"triage-source-conflict\" };\n }\n if (triage.brief !== undefined) {\n if (triage.brief.authorization.status === \"approved\") {\n return {\n brief: createWorkBrief({\n ...triage.brief,\n authorization: { status: \"pending\" },\n }),\n };\n }\n return { brief: triage.brief };\n }\n return { ignoredReason: \"triage-incomplete\" };\n }\n const event = draft;\n const revision = current === undefined ? 1 : current.brief.revision + 1;\n const factory = this.options.briefFactory ?? createGitHubIssueBrief;\n const candidate = factory({\n event,\n itemKind: kind,\n policy: this.options.policy,\n base: this.options.base,\n authorization: { status: \"pending\" },\n revision,\n defaults: this.options.briefDefaults,\n });\n const brief = parseWorkBrief(candidate);\n if (brief.authorization.status !== \"pending\") {\n throw new Error(\n \"GitHub intake cannot authorize work from webhook content\",\n );\n }\n return { brief };\n }\n\n private async normalizeTrackedPullRequest(\n envelope: GitHubWebhookEnvelope,\n payload: JsonRecord,\n pullRequestNumberValue: number,\n reply?: GitHubCommentSnapshot,\n review?: GitHubPullRequestReviewSnapshot,\n ): Promise<GitHubNormalizationResult> {\n const repository = repositoryName(payload) ?? \"unknown\";\n const source = sender(payload);\n const trackingStore = this.options.trackingStore;\n const tracked = trackingStore\n ? await trackingStore.findTrackedPullRequest(\n repository,\n pullRequestNumberValue,\n )\n : undefined;\n if (tracked === undefined) {\n return ignored({\n reason: \"unrelated-pull-request\",\n eventName: envelope.eventName,\n action: stringValue(payload.action),\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n });\n }\n const pullRequest = record(payload.pull_request);\n const observedAt =\n requiredStringValue(pullRequest?.updated_at) ??\n requiredStringValue(record(payload.issue)?.updated_at) ??\n reply?.updatedAt ??\n envelope.receivedAt;\n const headSha = pullRequestHead(payload, tracked.headSha);\n const sourceState = state(pullRequest?.state);\n const event: Omit<GitHubNormalizedEvent, \"workflowEvent\"> = {\n kind: \"tracked-pr-updated\",\n eventName: eventName(envelope.eventName) ?? \"pull_request\",\n action: stringValue(payload.action),\n deliveryId: envelope.deliveryId,\n repository,\n sender: source,\n issueNumber: Number(tracked.itemId) || pullRequestNumberValue,\n pullRequestNumber: pullRequestNumberValue,\n title: stringValue(pullRequest?.title, tracked.brief.problem),\n body: stringValue(pullRequest?.body, tracked.brief.source.originalBody),\n labels: labels(pullRequest?.labels),\n relevantRevision: headSha,\n observedAt,\n sourceState,\n reply,\n review,\n trackedPullRequest: tracked,\n };\n return {\n disposition: \"accepted\",\n event: {\n ...event,\n workflowEvent: {\n deliveryId: envelope.deliveryId,\n brief: tracked.brief,\n policy: tracked.policy,\n phase: \"checking\",\n relevantRevision: headSha,\n observedAt,\n sourceState,\n payload: envelope.payload,\n },\n },\n };\n }\n\n private issuePayload(\n issue: GitHubIssueSnapshot,\n repository: string,\n ): JsonRecord {\n return {\n action: issue.state === \"closed\" ? \"closed\" : \"edited\",\n issue: {\n number: issue.number,\n title: issue.title,\n body: issue.body,\n state: issue.state,\n updated_at: issue.updatedAt,\n html_url: issue.htmlUrl,\n user: issue.authorLogin ? { login: issue.authorLogin } : undefined,\n labels: issue.labels.map((name) => ({ name })),\n pull_request:\n issue.pullRequestNumber === undefined\n ? undefined\n : { number: issue.pullRequestNumber },\n },\n repository: { full_name: repository },\n sender: {\n login: this.options.authorization.allowedSenders[0] ?? \"shipyard\",\n },\n };\n }\n\n private pullRequestPayload(\n pullRequest: {\n readonly number: number;\n readonly title: string;\n readonly body: string;\n readonly state: \"open\" | \"closed\";\n readonly branch: string;\n readonly baseBranch: string;\n readonly headSha: string;\n readonly updatedAt: string;\n readonly htmlUrl?: string;\n readonly authorLogin?: string;\n },\n repository: string,\n ): JsonRecord {\n return {\n action: \"synchronize\",\n pull_request: {\n number: pullRequest.number,\n title: pullRequest.title,\n body: pullRequest.body,\n state: pullRequest.state,\n updated_at: pullRequest.updatedAt,\n html_url: pullRequest.htmlUrl,\n user: pullRequest.authorLogin\n ? { login: pullRequest.authorLogin }\n : undefined,\n head: { ref: pullRequest.branch, sha: pullRequest.headSha },\n base: { ref: pullRequest.baseBranch },\n },\n repository: { full_name: repository },\n sender: {\n login: this.options.authorization.allowedSenders[0] ?? \"shipyard\",\n },\n };\n }\n\n private toReconciliationResult(\n receipt: GitHubWebhookReceipt,\n ): GitHubReconciliationResult {\n return {\n status: receipt.status === \"rejected\" ? \"ignored\" : receipt.status,\n deliveryId: receipt.deliveryId,\n reason: receipt.reason,\n event: receipt.event,\n ingest: receipt.ingest,\n };\n }\n}\n\nconst includesCaseInsensitive = (\n candidates: readonly string[],\n value: string,\n): boolean =>\n candidates.some(\n (candidate) => candidate.toLowerCase() === value.toLowerCase(),\n );\n\nconst allowedRepository = (\n policy: GitHubAuthorizationPolicy,\n repository: string,\n): boolean => includesCaseInsensitive(policy.allowedRepositories, repository);\n\nconst allowedSender = (\n policy: GitHubAuthorizationPolicy,\n source: GitHubActor,\n): boolean => includesCaseInsensitive(policy.allowedSenders, source.login);\n\nconst allowedReviewer = (\n policy: GitHubAuthorizationPolicy,\n source: GitHubActor,\n): boolean => includesCaseInsensitive(policy.allowedReviewers, source.login);\n\nconst isBot = (\n source: GitHubActor,\n policy: GitHubAuthorizationPolicy,\n): boolean =>\n source.type === \"Bot\" ||\n includesCaseInsensitive(policy.botLogins ?? [], source.login);\n\nexport { InMemoryGitHubStore } from \"./store.js\";\n","import { createHash } from \"node:crypto\";\nimport type {\n GitHubBranchPublicationInput,\n GitHubBranchSnapshot,\n GitHubBriefPublicationInput,\n GitHubCheckPublicationInput,\n GitHubCheckSnapshot,\n GitHubCommentPublicationInput,\n GitHubCommentSnapshot,\n GitHubIssueSnapshot,\n GitHubPublicationOptions,\n GitHubPublicationResult,\n GitHubPullRequestPublicationInput,\n GitHubPullRequestSnapshot,\n GitHubRepairIssuePublicationInput,\n GitHubRepairLinkPublicationInput,\n} from \"./types.js\";\n\nconst markerText = (marker: string): string => `<!-- shipyard:${marker} -->`;\n\n// Markers are embedded in HTML comments and later used for reconciliation.\n// Encode caller-controlled components so a branch/key/name containing `-->`\n// cannot terminate the comment or manufacture a second marker.\nconst markerPart = (value: string | number): string =>\n encodeURIComponent(String(value));\n\nconst markerHash = (value: string): string =>\n createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16);\n\nconst result = <T>(\n marker: string,\n execution: {\n readonly disposition: GitHubPublicationResult<T>[\"disposition\"];\n readonly effect: GitHubPublicationResult<T>[\"effect\"];\n readonly externalRef?: T;\n },\n): GitHubPublicationResult<T> => ({\n marker,\n remote: execution.externalRef,\n disposition: execution.disposition,\n effect: execution.effect,\n});\n\n/** Coordinator-owned GitHub effects with stable markers and remote reconciliation. */\nexport class GitHubPublication {\n private readonly options: GitHubPublicationOptions;\n\n constructor(options: GitHubPublicationOptions) {\n this.options = options;\n }\n\n async publishComment(\n input: GitHubCommentPublicationInput,\n ): Promise<GitHubPublicationResult<GitHubCommentSnapshot>> {\n const marker = `comment:${markerPart(input.jobId)}:${markerPart(input.key ?? \"default\")}`;\n const body = `${markerText(marker)}\\n${input.body}`;\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n itemId: String(input.issueNumber),\n kind: \"github-comment\",\n marker,\n payload: {\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n },\n reconcile: () =>\n this.options.transport.findCommentByMarker({\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n marker: markerText(marker),\n }),\n publish: () =>\n this.options.transport.createComment({\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n body,\n }),\n });\n return result(marker, execution);\n }\n\n async publishBrief(\n input: GitHubBriefPublicationInput,\n ): Promise<GitHubPublicationResult<GitHubCommentSnapshot>> {\n const marker = `brief:${markerPart(input.jobId)}:${markerPart(input.brief.revision)}`;\n const body = [\n markerText(marker),\n \"## Shipyard executable brief\",\n `- Revision: ${input.brief.revision}`,\n `- Brief hash: \\`${input.brief.hash}\\``,\n `- Risk: ${input.brief.risk}`,\n \"\",\n input.brief.problem,\n \"\",\n \"### Acceptance criteria\",\n ...input.brief.acceptanceCriteria.map((criterion) => `- ${criterion}`),\n \"\",\n \"### Unresolved questions\",\n ...input.brief.unresolvedQuestions.map((question) => `- ${question}`),\n ].join(\"\\n\");\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n itemId: String(input.issueNumber),\n kind: \"github-brief\",\n marker,\n payload: {\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n },\n reconcile: () =>\n this.options.transport.findCommentByMarker({\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n marker: markerText(marker),\n }),\n publish: () =>\n this.options.transport.createComment({\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n body,\n }),\n });\n return result(marker, execution);\n }\n\n async publishBranch(\n input: GitHubBranchPublicationInput,\n ): Promise<GitHubPublicationResult<GitHubBranchSnapshot>> {\n const marker = `branch:${markerPart(input.jobId)}:${markerPart(input.branch)}`;\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n branch: input.branch,\n headSha: input.headSha,\n kind: \"github-branch\",\n marker,\n payload: { repository: input.lease.repository, branch: input.branch },\n reconcile: () =>\n this.options.transport.findBranchByName({\n repository: input.lease.repository,\n branch: input.branch,\n }),\n publish: () =>\n this.options.transport.createBranch({\n repository: input.lease.repository,\n branch: input.branch,\n headSha: input.headSha,\n marker: markerText(marker),\n }),\n });\n return result(marker, execution);\n }\n\n async publishPullRequest(\n input: GitHubPullRequestPublicationInput,\n ): Promise<GitHubPublicationResult<GitHubPullRequestSnapshot>> {\n const marker = `pull-request:${markerPart(input.jobId)}:${markerPart(input.branch)}`;\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n branch: input.branch,\n headSha: input.headSha,\n kind: \"github-pull-request\",\n marker,\n payload: { repository: input.lease.repository, branch: input.branch },\n reconcile: () =>\n this.options.transport.findPullRequestByMarker({\n repository: input.lease.repository,\n marker: markerText(marker),\n }),\n publish: () =>\n this.options.transport.createPullRequest({\n repository: input.lease.repository,\n title: input.title,\n body: `${markerText(marker)}\\n${input.body}`,\n branch: input.branch,\n baseBranch: input.baseBranch,\n draft: input.draft ?? true,\n marker: markerText(marker),\n }),\n });\n const publication = result(marker, execution);\n if (\n publication.remote !== undefined &&\n publication.remote.branch === input.branch &&\n publication.remote.baseBranch === input.baseBranch &&\n publication.remote.headSha === input.headSha\n ) {\n const job = await this.options.coordinator.getJob(input.jobId);\n if (job !== undefined) {\n await this.options.trackingStore.saveTrackedPullRequest({\n repository: input.lease.repository,\n pullRequestNumber: publication.remote.number,\n jobId: input.jobId,\n itemId: job.key.itemId,\n branch: input.branch,\n headSha: input.headSha,\n marker,\n brief: job.brief,\n policy: job.policy,\n createdAt: this.options.now?.() ?? new Date().toISOString(),\n });\n }\n }\n return publication;\n }\n\n async publishCheck(\n input: GitHubCheckPublicationInput,\n ): Promise<GitHubPublicationResult<GitHubCheckSnapshot>> {\n const marker = `check:${markerPart(input.jobId)}:${markerPart(input.key ?? input.name)}:${markerPart(input.headSha)}`;\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n branch: input.branch,\n headSha: input.headSha,\n kind: \"github-check\",\n marker,\n payload: { repository: input.lease.repository, name: input.name },\n reconcile: () =>\n this.options.transport.findCheckByMarker({\n repository: input.lease.repository,\n marker: markerText(marker),\n headSha: input.headSha,\n }),\n publish: () =>\n this.options.transport.createCheck({\n repository: input.lease.repository,\n name: input.name,\n headSha: input.headSha,\n marker: markerText(marker),\n status: input.status,\n conclusion: input.conclusion,\n summary: input.summary,\n }),\n });\n return result(marker, execution);\n }\n\n async publishRepairIssue(\n input: GitHubRepairIssuePublicationInput,\n ): Promise<GitHubPublicationResult<GitHubIssueSnapshot>> {\n const marker = `repair-issue:${markerPart(input.jobId)}:${markerHash(input.title)}`;\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n kind: \"github-repair-issue\",\n marker,\n payload: { repository: input.lease.repository },\n reconcile: () =>\n this.options.transport.findIssueByMarker({\n repository: input.lease.repository,\n marker: markerText(marker),\n }),\n publish: () =>\n this.options.transport.createRepairIssue({\n repository: input.lease.repository,\n title: input.title,\n body: `${markerText(marker)}\\n${input.body}`,\n marker: markerText(marker),\n labels: input.labels ?? [\"shipyard:pr-repair\"],\n }),\n });\n return result(marker, execution);\n }\n\n async publishRepairLink(\n input: GitHubRepairLinkPublicationInput,\n ): Promise<GitHubPublicationResult<GitHubCommentSnapshot>> {\n const marker = `repair-link:${markerPart(input.jobId)}:${markerHash(input.repairIssueUrl)}`;\n const body = `${markerText(marker)}\\nLinked repair issue: ${input.repairIssueUrl}`;\n const execution = await this.options.coordinator.publishEffect({\n jobId: input.jobId,\n lease: input.lease,\n itemId: String(input.issueNumber),\n kind: \"github-repair-link\",\n marker,\n payload: {\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n },\n reconcile: () =>\n this.options.transport.findCommentByMarker({\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n marker: markerText(marker),\n }),\n publish: () =>\n this.options.transport.createComment({\n repository: input.lease.repository,\n issueNumber: input.issueNumber,\n body,\n }),\n });\n return result(marker, execution);\n }\n}\n"]}
@@ -0,0 +1,136 @@
1
+ type ReleaseEnvironment = "staging" | "production";
2
+ type ReleaseCheckStatus = "passed" | "failed" | "missing" | "unknown";
3
+ interface ReleaseCandidate {
4
+ readonly sourceSha: string;
5
+ readonly reviewedHeadSha: string;
6
+ readonly briefHash: string;
7
+ readonly artifactDigest: string;
8
+ /** Provider-specific immutable locator; integrity is bound separately by artifactDigest. */
9
+ readonly artifactRef: string;
10
+ readonly version?: string;
11
+ }
12
+ interface ReleasePolicy {
13
+ readonly repository: string;
14
+ readonly stagingName: string;
15
+ readonly productionName: string;
16
+ readonly requiredStagingChecks: readonly string[];
17
+ readonly requireHumanApproval: boolean;
18
+ /** Maximum age for a production approval before it must be renewed. */
19
+ readonly approvalFreshnessSeconds?: number;
20
+ /** Roles allowed to approve production; release coordinators may request but not approve. */
21
+ readonly approvalRoles?: readonly ("owner" | "maintainer")[];
22
+ /** Recovery is recorded as a requested action; it is never inferred or executed by default. */
23
+ readonly recoveryMode: "roll-forward" | "rollback" | "owner-decision";
24
+ }
25
+ interface ReleaseActor {
26
+ readonly id: string;
27
+ readonly role: "release-coordinator" | "owner" | "maintainer";
28
+ }
29
+ interface ReleaseCheck {
30
+ readonly name: string;
31
+ readonly status: ReleaseCheckStatus;
32
+ readonly summary: string;
33
+ }
34
+ interface ReleaseVerification {
35
+ readonly environment: ReleaseEnvironment;
36
+ readonly candidate: ReleaseCandidate;
37
+ readonly deploymentId: string;
38
+ readonly checks: readonly ReleaseCheck[];
39
+ readonly smoke: "passed" | "failed" | "missing" | "unknown";
40
+ readonly health: "passed" | "failed" | "missing" | "unknown";
41
+ readonly recordedAt: string;
42
+ readonly failureReason?: string;
43
+ }
44
+ interface ProductionApproval {
45
+ readonly actor: ReleaseActor;
46
+ readonly approvedAt: string;
47
+ readonly candidate: ReleaseCandidate;
48
+ }
49
+ type ReleaseStateStatus = "staging-requested" | "staging-failed" | "staging-verified" | "production-approved" | "production-requested" | "production-failed" | "production-verified";
50
+ interface ReleaseState {
51
+ readonly key: string;
52
+ readonly candidate: ReleaseCandidate;
53
+ readonly status: ReleaseStateStatus;
54
+ readonly staging?: ReleaseVerification;
55
+ readonly approval?: ProductionApproval;
56
+ readonly recovery?: RecoveryRecord;
57
+ readonly production?: ReleaseVerification;
58
+ readonly updatedAt: string;
59
+ }
60
+ interface ReleaseStore {
61
+ get(key: string): ReleaseState | undefined;
62
+ save(state: ReleaseState): void;
63
+ }
64
+ declare class InMemoryReleaseStore implements ReleaseStore {
65
+ private readonly states;
66
+ get(key: string): ReleaseState | undefined;
67
+ save(state: ReleaseState): void;
68
+ }
69
+ interface ReleaseTransport {
70
+ requestDeployment(input: {
71
+ readonly environment: ReleaseEnvironment;
72
+ readonly environmentName: string;
73
+ readonly candidate: ReleaseCandidate;
74
+ readonly actor: ReleaseActor;
75
+ readonly idempotencyKey: string;
76
+ }): Promise<{
77
+ readonly deploymentId: string;
78
+ }>;
79
+ reconcileDeployment?(input: {
80
+ readonly environment: ReleaseEnvironment;
81
+ readonly environmentName: string;
82
+ readonly candidate: ReleaseCandidate;
83
+ readonly idempotencyKey: string;
84
+ }): Promise<{
85
+ readonly deploymentId: string;
86
+ } | undefined>;
87
+ }
88
+ interface ReleaseIntegrationOptions {
89
+ readonly policy: ReleasePolicy;
90
+ readonly store: ReleaseStore;
91
+ readonly transport: ReleaseTransport;
92
+ readonly actor: ReleaseActor;
93
+ /** Validate a provider-specific immutable locator not covered by built-in formats. */
94
+ readonly validateArtifactRef?: (candidate: ReleaseCandidate) => string | undefined;
95
+ readonly now?: () => string;
96
+ }
97
+ interface ReleaseOperationResult {
98
+ readonly outcome: "requested" | "duplicate" | "verified" | "approved" | "blocked" | "failed";
99
+ readonly reason?: string;
100
+ readonly state?: ReleaseState;
101
+ }
102
+ interface RecoveryRecord {
103
+ readonly candidate: ReleaseCandidate;
104
+ readonly action: ReleasePolicy["recoveryMode"];
105
+ readonly reason: string;
106
+ readonly authorizedBy: ReleaseActor;
107
+ readonly recordedAt: string;
108
+ }
109
+ declare const releaseCandidateKey: (candidate: ReleaseCandidate) => string;
110
+ declare class ReleaseIntegration {
111
+ private readonly policy;
112
+ private readonly store;
113
+ private readonly transport;
114
+ private readonly actor;
115
+ private readonly validateArtifactRef?;
116
+ private readonly now;
117
+ constructor(options: ReleaseIntegrationOptions);
118
+ private stateKey;
119
+ requestStaging(candidate: ReleaseCandidate): Promise<ReleaseOperationResult>;
120
+ recordStagingVerification(verification: ReleaseVerification): ReleaseOperationResult;
121
+ approveProduction(input: {
122
+ readonly candidate: ReleaseCandidate;
123
+ readonly approval: ProductionApproval;
124
+ }): ReleaseOperationResult;
125
+ promoteProduction(candidate: ReleaseCandidate): Promise<ReleaseOperationResult>;
126
+ private requestDeployment;
127
+ recordProductionVerification(verification: ReleaseVerification): ReleaseOperationResult;
128
+ recordRecovery(input: {
129
+ readonly candidate: ReleaseCandidate;
130
+ readonly reason: string;
131
+ readonly authorizedBy: ReleaseActor;
132
+ }): RecoveryRecord;
133
+ }
134
+ declare const candidateMatchesApproval: (candidate: ReleaseCandidate, approval: ProductionApproval) => boolean;
135
+
136
+ export { InMemoryReleaseStore, type ProductionApproval, type RecoveryRecord, type ReleaseActor, type ReleaseCandidate, type ReleaseCheck, type ReleaseCheckStatus, type ReleaseEnvironment, ReleaseIntegration, type ReleaseIntegrationOptions, type ReleaseOperationResult, type ReleasePolicy, type ReleaseState, type ReleaseStateStatus, type ReleaseStore, type ReleaseTransport, type ReleaseVerification, candidateMatchesApproval, releaseCandidateKey };