@defrex/autobuild 0.8.0 → 0.10.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 (182) hide show
  1. package/README.md +1 -1
  2. package/SPEC.md +323 -26
  3. package/bin/ab-build-runner.ts +8 -2
  4. package/docs/architecture.md +166 -14
  5. package/docs/assets/headline-wide.png +0 -0
  6. package/docs/configuration.md +175 -28
  7. package/docs/hosted-dispatcher.md +69 -13
  8. package/docs/operator-api.md +2 -2
  9. package/docs/remote-store-protocol.md +204 -16
  10. package/docs/remote-ticket-protocol.md +1 -1
  11. package/docs/setup.md +12 -9
  12. package/docs/website.md +14 -0
  13. package/package.json +45 -23
  14. package/packages/core/src/cli/artifact.ts +130 -6
  15. package/packages/core/src/cli/binary.ts +9 -1
  16. package/packages/core/src/cli/build-control.ts +110 -13
  17. package/packages/core/src/cli/context.ts +46 -0
  18. package/packages/core/src/cli/dashboard/facts.ts +215 -0
  19. package/packages/core/src/cli/dashboard/frame-parse.ts +223 -0
  20. package/packages/core/src/cli/dashboard/model.ts +141 -153
  21. package/packages/core/src/cli/dashboard/poll.ts +76 -12
  22. package/packages/core/src/cli/dashboard/render.ts +34 -5
  23. package/packages/core/src/cli/dispatch-frontend.ts +54 -5
  24. package/packages/core/src/cli/dispatch-process.ts +1 -13
  25. package/packages/core/src/cli/dispatch.ts +392 -75
  26. package/packages/core/src/cli/harvest.ts +122 -8
  27. package/packages/core/src/cli/help.ts +62 -9
  28. package/packages/core/src/cli/init-readiness-remote.ts +110 -0
  29. package/packages/core/src/cli/init-readiness-shared.ts +72 -0
  30. package/packages/core/src/cli/init-validation.ts +266 -222
  31. package/packages/core/src/cli/installation.ts +50 -8
  32. package/packages/core/src/cli/main.ts +70 -11
  33. package/packages/core/src/cli/mcp.ts +23 -1
  34. package/packages/core/src/cli/plugin.ts +7 -4
  35. package/packages/core/src/cli/remote-poll.ts +277 -0
  36. package/packages/core/src/cli/repo-state.ts +22 -0
  37. package/packages/core/src/cli/repository-status.ts +39 -1
  38. package/packages/core/src/cli/self-update.ts +77 -2
  39. package/packages/core/src/cli/status.ts +150 -28
  40. package/packages/core/src/cli/terminals.ts +2 -1
  41. package/packages/core/src/cli/ticket-assets.ts +247 -0
  42. package/packages/core/src/cli/ticket.ts +453 -8
  43. package/packages/core/src/cli/wait.ts +157 -41
  44. package/packages/core/src/cli/watch.ts +138 -168
  45. package/packages/core/src/config/live.ts +23 -0
  46. package/packages/core/src/config/pipeline-source.ts +388 -0
  47. package/packages/core/src/config/schema.ts +251 -19
  48. package/packages/core/src/events/catalog.ts +1 -0
  49. package/packages/core/src/events/globs.ts +47 -0
  50. package/packages/core/src/events/payloads.ts +52 -2
  51. package/packages/core/src/events/repository.ts +52 -1
  52. package/packages/core/src/events/sessions.ts +69 -10
  53. package/packages/core/src/events/workspace-remote.ts +12 -0
  54. package/packages/core/src/integration/harness.ts +115 -2
  55. package/packages/core/src/kernel/__snapshots__/reducer-registry.test.ts.snap +1369 -0
  56. package/packages/core/src/kernel/auto-merge-default.ts +157 -0
  57. package/packages/core/src/kernel/auto-merge.ts +99 -22
  58. package/packages/core/src/kernel/dispatch-settings.ts +42 -17
  59. package/packages/core/src/kernel/dispatch-status.ts +23 -0
  60. package/packages/core/src/kernel/engine.ts +9 -438
  61. package/packages/core/src/kernel/generators/build-log.ts +259 -0
  62. package/packages/core/src/kernel/generators/repository-journals.ts +206 -0
  63. package/packages/core/src/kernel/generators/session-log.ts +72 -0
  64. package/packages/core/src/kernel/harvest.ts +62 -18
  65. package/packages/core/src/kernel/incremental-contract.ts +75 -0
  66. package/packages/core/src/kernel/incremental-fixtures.ts +211 -0
  67. package/packages/core/src/kernel/incremental.ts +53 -0
  68. package/packages/core/src/kernel/log-index.ts +620 -0
  69. package/packages/core/src/kernel/phases.ts +16 -2
  70. package/packages/core/src/kernel/pr-attachments.ts +164 -46
  71. package/packages/core/src/kernel/reducer-registry.ts +164 -0
  72. package/packages/core/src/kernel/reducer.ts +254 -73
  73. package/packages/core/src/operator/annotations.ts +6 -0
  74. package/packages/core/src/operator/control.ts +19 -5
  75. package/packages/core/src/operator/index.ts +71 -6
  76. package/packages/core/src/operator/query.ts +253 -24
  77. package/packages/core/src/operator/read-view.ts +98 -0
  78. package/packages/core/src/operator/registry.ts +55 -10
  79. package/packages/core/src/operator/requests.ts +9 -6
  80. package/packages/core/src/operator/sandbox-host.ts +140 -0
  81. package/packages/core/src/operator/sandbox.ts +247 -14
  82. package/packages/core/src/operator/ticket-source-backend.ts +47 -0
  83. package/packages/core/src/orchestrator/approvals.ts +115 -0
  84. package/packages/core/src/orchestrator/conversation.ts +167 -0
  85. package/packages/core/src/orchestrator/model.ts +86 -0
  86. package/packages/core/src/orchestrator/prompt.ts +61 -0
  87. package/packages/core/src/orchestrator/tools.ts +117 -0
  88. package/packages/core/src/orchestrator/turn-runner.ts +457 -0
  89. package/packages/core/src/plugin-sdk/index.ts +51 -1
  90. package/packages/core/src/plugins/load.ts +135 -7
  91. package/packages/core/src/plugins/manifest.ts +183 -10
  92. package/packages/core/src/plugins/registry.ts +73 -4
  93. package/packages/core/src/ports/forge/create.ts +1 -1
  94. package/packages/core/src/ports/forge/fake.ts +31 -0
  95. package/packages/core/src/ports/forge/github-transport.ts +13 -2
  96. package/packages/core/src/ports/forge/github.ts +13 -2
  97. package/packages/core/src/ports/forge/local-git.ts +31 -1
  98. package/packages/core/src/ports/runner/claude.ts +2 -2
  99. package/packages/core/src/ports/runner/codex.ts +6 -2
  100. package/packages/core/src/ports/runner/fake.ts +7 -1
  101. package/packages/core/src/ports/runner/pi.ts +8 -6
  102. package/packages/core/src/ports/runner/provider-error.ts +13 -3
  103. package/packages/core/src/ports/tickets/fake.ts +5 -1
  104. package/packages/core/src/ports/tickets/file.ts +169 -48
  105. package/packages/core/src/ports/tickets/{remote-index.ts → hosted-index.ts} +3 -2
  106. package/packages/core/src/ports/tickets/linear.ts +33 -1
  107. package/packages/core/src/ports/tickets/operations.ts +1 -1
  108. package/packages/core/src/ports/tickets/remote.ts +8 -1
  109. package/packages/core/src/ports/types.ts +49 -3
  110. package/packages/core/src/ports/workspace/builtin-capabilities.ts +114 -0
  111. package/packages/core/src/ports/workspace/create.ts +74 -39
  112. package/packages/core/src/ports/workspace/distribution-archive.ts +171 -12
  113. package/packages/core/src/ports/workspace/fake.ts +169 -4
  114. package/packages/core/src/ports/workspace/git-worktree.ts +246 -26
  115. package/packages/core/src/ports/workspace/github-origin.ts +36 -0
  116. package/packages/core/src/ports/workspace/operator-sandbox.ts +7 -1
  117. package/packages/core/src/ports/workspace/provider-capabilities.ts +171 -0
  118. package/packages/core/src/ports/workspace/vercel-capabilities.ts +110 -0
  119. package/packages/core/src/ports/workspace/vercel-sandbox.ts +142 -114
  120. package/packages/core/src/processes/build-child.ts +17 -2
  121. package/packages/core/src/processes/build-execution-state.ts +68 -15
  122. package/packages/core/src/processes/build-runner.ts +238 -93
  123. package/packages/core/src/processes/dispatcher-selectors.ts +123 -0
  124. package/packages/core/src/processes/dispatcher.ts +501 -201
  125. package/packages/core/src/processes/execution-settlement.ts +72 -39
  126. package/packages/core/src/processes/harvest-child.ts +5 -0
  127. package/packages/core/src/processes/harvest-execution-state.ts +41 -29
  128. package/packages/core/src/processes/harvest-runner.ts +66 -19
  129. package/packages/core/src/processes/harvest.ts +196 -24
  130. package/packages/core/src/processes/infrastructure-failure-budget.ts +31 -18
  131. package/packages/core/src/processes/orchestrator-tick.ts +360 -0
  132. package/packages/core/src/processes/publication-state.ts +164 -52
  133. package/packages/core/src/processes/repo-view.ts +1436 -0
  134. package/packages/core/src/processes/sandbox-state.ts +36 -2
  135. package/packages/core/src/processes/tick-state.ts +33 -0
  136. package/packages/core/src/store/adapter.ts +41 -0
  137. package/packages/core/src/store/build-scope.ts +90 -0
  138. package/packages/core/src/store/contract.ts +1205 -0
  139. package/packages/core/src/store/digest.ts +102 -0
  140. package/packages/core/src/store/local/schema.ts +46 -2
  141. package/packages/core/src/store/local/store.ts +445 -4
  142. package/packages/core/src/store/memory.ts +246 -0
  143. package/packages/core/src/store/new-build.ts +17 -0
  144. package/packages/core/src/store/phase-session.ts +94 -0
  145. package/packages/core/src/store/remote/client.ts +310 -2
  146. package/packages/core/src/store/remote/index.ts +14 -2
  147. package/packages/core/src/store/remote/protocol.ts +115 -12
  148. package/packages/core/src/store/remote/version.ts +6 -2
  149. package/packages/core/src/store/repo-state-events.ts +205 -0
  150. package/packages/core/src/store/retention.ts +7 -0
  151. package/packages/core/src/store/session-handle.ts +94 -0
  152. package/packages/core/src/{sessions/reducer.ts → store/session-reducer.ts} +79 -19
  153. package/packages/core/src/store/snapshots.ts +88 -0
  154. package/packages/core/src/store/streams/session-writer.ts +42 -2
  155. package/packages/core/src/store/streams/wait.ts +4 -5
  156. package/packages/core/src/store/ticket-assets.ts +458 -0
  157. package/packages/core/src/store/types.ts +160 -1
  158. package/packages/core/src/testing/index.ts +59 -0
  159. package/skills/code-review/SKILL.md +5 -1
  160. package/skills/guide/SKILL.md +152 -40
  161. package/skills/guide/references/operator-api.md +2 -2
  162. package/skills/guide/references/plugin-authoring.md +17 -0
  163. package/skills/guide/references/remote-store-protocol.md +204 -16
  164. package/skills/guide/references/remote-ticket-protocol.md +1 -1
  165. package/skills/guide/references/setup.md +12 -9
  166. package/skills/implement/SKILL.md +3 -0
  167. package/skills/operate/SKILL.md +126 -0
  168. package/skills/plan/SKILL.md +4 -0
  169. package/skills/plan-review/SKILL.md +5 -1
  170. package/skills/spec/SKILL.md +46 -3
  171. package/skills/tickets/SKILL.md +57 -5
  172. package/packages/core/src/cli/dashboard/frame-image.ts +0 -373
  173. package/packages/core/src/cli/store-opening.contract.ts +0 -289
  174. package/packages/core/src/cli/testkit.ts +0 -194
  175. package/packages/core/src/markdown.ts +0 -67
  176. package/packages/core/src/operator/client.ts +0 -311
  177. package/packages/core/src/operator/server.ts +0 -616
  178. package/packages/core/src/operator/sessions.ts +0 -223
  179. package/packages/core/src/ports/runner/live-contract-fixture.ts +0 -176
  180. package/packages/core/src/ports/tickets/remote-server.ts +0 -185
  181. package/packages/core/src/store/remote/server.ts +0 -923
  182. package/packages/core/src/testing/store-failures.ts +0 -32
@@ -9,6 +9,7 @@
9
9
  * orphaned environment.
10
10
  */
11
11
  import type { RepositoryEvent } from '../events/repository'
12
+ import { defineReducer, type IncrementalReducer } from '../kernel/incremental'
12
13
 
13
14
  export type SandboxEnvironmentState = 'live' | 'stopped' | 'released'
14
15
 
@@ -22,6 +23,12 @@ export interface SandboxEnvironmentSnapshot {
22
23
  * `[orchestrator].sandbox.idleMinutes`. */
23
24
  lastEvidenceTs: string
24
25
  sessionId?: string
26
+ /** The base branch head the fresh provision selected; carried forward
27
+ * through later lifecycle facts (the base head cannot change without a
28
+ * fresh provision, which overwrites it) — the publication precondition's
29
+ * reference point, read by the publish operation. Absent on snapshots
30
+ * provisioned before this field existed. */
31
+ baseSha?: string
25
32
  }
26
33
 
27
34
  type MutableSnapshot = {
@@ -31,6 +38,7 @@ type MutableSnapshot = {
31
38
  state: SandboxEnvironmentState
32
39
  lastEvidenceTs: string
33
40
  sessionId?: string
41
+ baseSha?: string
34
42
  }
35
43
 
36
44
  /** Per-environment sandbox state, keyed deterministically by
@@ -38,7 +46,18 @@ type MutableSnapshot = {
38
46
  * derived from both). Latest fact wins; `released` environments stay in the
39
47
  * result with their closing evidence so callers can distinguish them. */
40
48
  export function sandboxStates(events: readonly RepositoryEvent[]): SandboxEnvironmentSnapshot[] {
41
- const byEnvironment = new Map<string, MutableSnapshot>()
49
+ return sandboxStatesReducer.reduce(events)
50
+ }
51
+
52
+ /** The carried accumulator: environments in `Map` insertion order (a re-set
53
+ * of an existing id keeps its position). */
54
+ export type SandboxStatesAcc = MutableSnapshot[]
55
+
56
+ /** Bump when `SandboxStatesAcc`'s shape or fold semantics change. */
57
+ export const SANDBOX_STATES_REDUCER_VERSION = 1
58
+
59
+ function foldSandboxStates(acc: SandboxStatesAcc, events: readonly RepositoryEvent[]): void {
60
+ const byEnvironment = new Map<string, MutableSnapshot>(acc.map((s) => [s.environmentId, s]))
42
61
  for (const event of events) {
43
62
  const ts = event.ts
44
63
  if (event.type === 'orchestrator.sandbox.provisioned') {
@@ -49,6 +68,7 @@ export function sandboxStates(events: readonly RepositoryEvent[]): SandboxEnviro
49
68
  state: 'live',
50
69
  lastEvidenceTs: ts,
51
70
  ...(event.payload.sessionId !== undefined ? { sessionId: event.payload.sessionId } : {}),
71
+ ...(event.payload.baseSha !== undefined ? { baseSha: event.payload.baseSha } : {}),
52
72
  })
53
73
  } else if (event.type === 'orchestrator.sandbox.resumed') {
54
74
  const previous = byEnvironment.get(event.payload.environmentId)
@@ -63,6 +83,7 @@ export function sandboxStates(events: readonly RepositoryEvent[]): SandboxEnviro
63
83
  : previous?.sessionId !== undefined
64
84
  ? { sessionId: previous.sessionId }
65
85
  : {}),
86
+ ...(previous?.baseSha !== undefined ? { baseSha: previous.baseSha } : {}),
66
87
  })
67
88
  } else if (event.type === 'orchestrator.sandbox.activity') {
68
89
  const current = byEnvironment.get(event.payload.environmentId)
@@ -94,8 +115,21 @@ export function sandboxStates(events: readonly RepositoryEvent[]): SandboxEnviro
94
115
  state: 'released',
95
116
  lastEvidenceTs: ts,
96
117
  ...(existing?.sessionId !== undefined ? { sessionId: existing.sessionId } : {}),
118
+ ...(existing?.baseSha !== undefined ? { baseSha: existing.baseSha } : {}),
97
119
  })
98
120
  }
99
121
  }
100
- return [...byEnvironment.values()]
122
+ acc.length = 0
123
+ acc.push(...byEnvironment.values())
101
124
  }
125
+
126
+ export const sandboxStatesReducer: IncrementalReducer<
127
+ SandboxStatesAcc,
128
+ RepositoryEvent,
129
+ SandboxEnvironmentSnapshot[]
130
+ > = defineReducer({
131
+ version: SANDBOX_STATES_REDUCER_VERSION,
132
+ initial: (): SandboxStatesAcc => [],
133
+ fold: foldSandboxStates,
134
+ finish: (acc) => acc.map((s) => ({ ...s })),
135
+ })
@@ -0,0 +1,33 @@
1
+ import type { RepositoryEvent } from '../events/repository'
2
+ import { defineReducer } from '../kernel/incremental'
3
+
4
+ export const OPEN_TICK_REDUCER_VERSION = 1
5
+
6
+ /** Whether the dispatcher run's latest tick boundary (started, completed or
7
+ * failed) is a `dispatcher.tick-started`. A factory because the run id is a
8
+ * parameter of the projection; the accumulator holds only the last boundary
9
+ * type seen for that run. */
10
+ export function openTickReducer(run: string) {
11
+ return defineReducer<{ boundary?: string }, RepositoryEvent, boolean>({
12
+ version: OPEN_TICK_REDUCER_VERSION,
13
+ initial: () => ({}),
14
+ fold(acc, events) {
15
+ for (const event of events) {
16
+ if (
17
+ 'run' in event.payload &&
18
+ event.payload.run === run &&
19
+ (event.type === 'dispatcher.tick-started' ||
20
+ event.type === 'dispatcher.tick-completed' ||
21
+ event.type === 'dispatcher.tick-failed')
22
+ ) {
23
+ acc.boundary = event.type
24
+ }
25
+ }
26
+ },
27
+ finish: (acc) => acc.boundary === 'dispatcher.tick-started',
28
+ })
29
+ }
30
+
31
+ export function hasOpenTick(events: readonly RepositoryEvent[], run: string): boolean {
32
+ return openTickReducer(run).reduce(events)
33
+ }
@@ -16,8 +16,39 @@ export type {
16
16
  SessionEventType,
17
17
  SessionEventWrite,
18
18
  } from '../events/sessions'
19
+ export {
20
+ DEFAULT_TICKET_ASSET_LIMITS,
21
+ effectiveTicketAssetLimits,
22
+ loadTicketAsset,
23
+ resolvePinnedAsset,
24
+ storeTicketAssetBlobs,
25
+ summarizeTicketAsset,
26
+ TICKET_ASSET_MAX_BYTES,
27
+ TICKET_ASSET_MAX_ENTRIES,
28
+ TicketAssetValidationError,
29
+ validateTicketAssetInput,
30
+ } from './ticket-assets'
31
+ export type {
32
+ TicketAsset,
33
+ TicketAssetContentEntry,
34
+ TicketAssetEntry,
35
+ TicketAssetEntryInput,
36
+ TicketAssetInput,
37
+ TicketAssetLayout,
38
+ TicketAssetLimits,
39
+ TicketAssetMeta,
40
+ TicketAssetSummary,
41
+ } from './ticket-assets'
42
+ export { validateCreatedEvent } from './new-build'
19
43
  export { createBuildScopedStore } from './build-scope'
20
44
  export { createSessionScopedStore } from './session-handle'
45
+ export { DIGEST_EVENT_TYPES, type DigestEventRow, reduceBuildDigest } from './digest'
46
+ export {
47
+ projectRepositoryStateEvents,
48
+ REPOSITORY_RUN_SCOPED_EVENT_TYPES,
49
+ REPOSITORY_STATE_EVENT_TYPES,
50
+ readRepoStateEventsWithAnchorRecheck,
51
+ } from './repo-state-events'
21
52
  export {
22
53
  DEFAULT_ARTIFACT_RETENTION_MAX_REVISIONS,
23
54
  DISPATCHER_RETENTION_BUILD_KINDS,
@@ -61,6 +92,7 @@ export type {
61
92
  ArtifactInput,
62
93
  ArtifactMeta,
63
94
  BlobStore,
95
+ BuildDigest,
64
96
  BuildRecord,
65
97
  BuildScopedStore,
66
98
  BuildStore,
@@ -78,3 +110,12 @@ export type {
78
110
  Unsubscribe,
79
111
  } from './types'
80
112
  export { normalizeOperator } from './types'
113
+ export {
114
+ loadReducerSnapshot,
115
+ persistReducerSnapshot,
116
+ reducerSnapshotWireSchema,
117
+ SNAPSHOT_REDUCER_NAME,
118
+ snapshotScopeKey,
119
+ snapshotSupersedes,
120
+ } from './snapshots'
121
+ export type { ReducerSnapshot, SnapshotScope } from './snapshots'
@@ -1,3 +1,4 @@
1
+ import type { ReducerSnapshot, SnapshotScope } from './snapshots'
1
2
  import type { EventType } from '../events/payloads'
2
3
  import type { EventWrite } from '../events/catalog'
3
4
  import type { RepositoryEventType, RepositoryEventWrite } from '../events/repository'
@@ -13,6 +14,7 @@ import type {
13
14
  Artifact,
14
15
  ArtifactInput,
15
16
  ArtifactMeta,
17
+ BuildDigest,
16
18
  BuildRecord,
17
19
  BuildScopedStore,
18
20
  BuildStore,
@@ -25,6 +27,13 @@ import type {
25
27
  SubscribeOptions,
26
28
  Unsubscribe,
27
29
  } from './types'
30
+ import type {
31
+ TicketAsset,
32
+ TicketAssetInput,
33
+ TicketAssetLimits,
34
+ TicketAssetMeta,
35
+ TicketAssetSummary,
36
+ } from './ticket-assets'
28
37
  import type {
29
38
  StreamChunk,
30
39
  StreamOutcome,
@@ -179,6 +188,37 @@ export function createBuildScopedStore(store: BuildStore, scope: string): BuildS
179
188
  getRepoEvents(repo: string, _sinceSeq?: number): Promise<RepositoryEvent[]> {
180
189
  return Promise.reject(new BuildScopeError(scope, 'getRepoEvents', repo))
181
190
  },
191
+ getRepoStateEvents(repo: string): Promise<RepositoryEvent[]> {
192
+ return Promise.reject(new BuildScopeError(scope, 'getRepoStateEvents', repo))
193
+ },
194
+ getRepoHighWater(repo: string): Promise<number> {
195
+ return Promise.reject(new BuildScopeError(scope, 'getRepoHighWater', repo))
196
+ },
197
+ async getReducerSnapshot(
198
+ target: SnapshotScope,
199
+ reducer: string,
200
+ version: number,
201
+ ): Promise<ReducerSnapshot | null> {
202
+ if (target.kind !== 'build') {
203
+ throw new BuildScopeError(scope, 'getReducerSnapshot', target.repo)
204
+ }
205
+ own('getReducerSnapshot', target.slug)
206
+ return store.getReducerSnapshot(target, reducer, version)
207
+ },
208
+ async putReducerSnapshot(
209
+ target: SnapshotScope,
210
+ reducer: string,
211
+ snapshot: ReducerSnapshot,
212
+ ): Promise<boolean> {
213
+ if (target.kind !== 'build') {
214
+ throw new BuildScopeError(scope, 'putReducerSnapshot', target.repo)
215
+ }
216
+ own('putReducerSnapshot', target.slug)
217
+ return store.putReducerSnapshot(target, reducer, snapshot)
218
+ },
219
+ getRepoBuildDigests(repo: string): Promise<Map<string, BuildDigest>> {
220
+ return Promise.reject(new BuildScopeError(scope, 'getRepoBuildDigests', repo))
221
+ },
182
222
  putRepoArtifact(repo: string, _artifact: ArtifactInput): Promise<RepositoryArtifactMeta> {
183
223
  return Promise.reject(new BuildScopeError(scope, 'putRepoArtifact', repo))
184
224
  },
@@ -192,6 +232,49 @@ export function createBuildScopedStore(store: BuildStore, scope: string): BuildS
192
232
  listRepoArtifacts(repo: string, _kind?: string): Promise<RepositoryArtifactMeta[]> {
193
233
  return Promise.reject(new BuildScopeError(scope, 'listRepoArtifacts', repo))
194
234
  },
235
+ ticketAssetLimits(repo: string): Promise<TicketAssetLimits> {
236
+ return Promise.reject(new BuildScopeError(scope, 'ticketAssetLimits', repo))
237
+ },
238
+ putTicketAsset(
239
+ repo: string,
240
+ _ticketId: string,
241
+ _asset: TicketAssetInput,
242
+ ): Promise<TicketAssetMeta> {
243
+ return Promise.reject(new BuildScopeError(scope, 'putTicketAsset', repo))
244
+ },
245
+ getTicketAsset(
246
+ repo: string,
247
+ _ticketId: string,
248
+ _kind: string,
249
+ _name: string,
250
+ _rev?: number,
251
+ ): Promise<TicketAsset | null> {
252
+ return Promise.reject(new BuildScopeError(scope, 'getTicketAsset', repo))
253
+ },
254
+ async getPinnedTicketAsset(
255
+ slug: string,
256
+ kind: string,
257
+ name: string,
258
+ rev?: number,
259
+ ): Promise<TicketAsset | null> {
260
+ own('getPinnedTicketAsset', slug)
261
+ return store.getPinnedTicketAsset(slug, kind, name, rev)
262
+ },
263
+ listTicketAssets(
264
+ repo: string,
265
+ _ticketId: string,
266
+ _opts?: { revisions?: boolean },
267
+ ): Promise<TicketAssetSummary[]> {
268
+ return Promise.reject(new BuildScopeError(scope, 'listTicketAssets', repo))
269
+ },
270
+ removeTicketAsset(
271
+ repo: string,
272
+ _ticketId: string,
273
+ _kind: string,
274
+ _name: string,
275
+ ): Promise<TicketAssetMeta | null> {
276
+ return Promise.reject(new BuildScopeError(scope, 'removeTicketAsset', repo))
277
+ },
195
278
  claimRepoLease(repo: string, _holder: string, _ttlMs: number): Promise<boolean> {
196
279
  return Promise.reject(new BuildScopeError(scope, 'claimRepoLease', repo))
197
280
  },
@@ -216,6 +299,13 @@ export function createBuildScopedStore(store: BuildStore, scope: string): BuildS
216
299
  ): Promise<SessionEventEnvelope<T>> {
217
300
  return Promise.reject(new BuildScopeError(scope, 'appendSessionEvent', id))
218
301
  },
302
+ appendSessionEventIfCurrent<T extends SessionEventType>(
303
+ id: string,
304
+ _expectedSeq: number,
305
+ _event: SessionEventWrite<T>,
306
+ ): Promise<SessionEventEnvelope<T> | null> {
307
+ return Promise.reject(new BuildScopeError(scope, 'appendSessionEventIfCurrent', id))
308
+ },
219
309
  getSessionEvents(id: string, _sinceSeq?: number): Promise<SessionEvent[]> {
220
310
  return Promise.reject(new BuildScopeError(scope, 'getSessionEvents', id))
221
311
  },