@defrex/autobuild 0.8.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.
- package/LICENSE +201 -0
- package/README.md +192 -0
- package/SPEC.md +2269 -0
- package/bin/ab-build-runner.ts +47 -0
- package/bin/ab-dev.ts +27 -0
- package/bin/ab-dispatch-kernel.ts +92 -0
- package/bin/ab-harvest-runner.ts +29 -0
- package/bin/ab-init-probe.ts +19 -0
- package/bin/ab-process-group-reaper.ts +32 -0
- package/bin/ab.ts +6 -0
- package/bin/agent/ab +3 -0
- package/docs/answering-blocked-builds.md +89 -0
- package/docs/architecture.md +726 -0
- package/docs/assets/headline-wide.png +0 -0
- package/docs/configuration.md +1623 -0
- package/docs/hosted-dispatcher-cutover-validation.md +178 -0
- package/docs/hosted-dispatcher.md +204 -0
- package/docs/mcp.md +119 -0
- package/docs/operator-api.md +186 -0
- package/docs/remote-store-protocol.md +972 -0
- package/docs/remote-ticket-protocol.md +79 -0
- package/docs/setup.md +289 -0
- package/docs/spec-standard.md +63 -0
- package/docs/ticket-dependencies.md +59 -0
- package/docs/vercel-sandbox-rollout-probe.md +7 -0
- package/package.json +135 -0
- package/packages/core/src/cli/args.ts +74 -0
- package/packages/core/src/cli/artifact.ts +182 -0
- package/packages/core/src/cli/binary.ts +198 -0
- package/packages/core/src/cli/build-control.ts +789 -0
- package/packages/core/src/cli/build-progress.ts +55 -0
- package/packages/core/src/cli/bulk-control.ts +385 -0
- package/packages/core/src/cli/context.ts +470 -0
- package/packages/core/src/cli/dashboard/actions.ts +59 -0
- package/packages/core/src/cli/dashboard/cells.ts +92 -0
- package/packages/core/src/cli/dashboard/composer.ts +230 -0
- package/packages/core/src/cli/dashboard/detail.ts +100 -0
- package/packages/core/src/cli/dashboard/frame-image.ts +373 -0
- package/packages/core/src/cli/dashboard/live.ts +152 -0
- package/packages/core/src/cli/dashboard/model.ts +1173 -0
- package/packages/core/src/cli/dashboard/poll.ts +196 -0
- package/packages/core/src/cli/dashboard/render.ts +1568 -0
- package/packages/core/src/cli/dashboard/selection.ts +66 -0
- package/packages/core/src/cli/dashboard/session-feed.ts +244 -0
- package/packages/core/src/cli/dashboard/session-view.ts +506 -0
- package/packages/core/src/cli/dashboard/transcript.ts +108 -0
- package/packages/core/src/cli/dev.ts +46 -0
- package/packages/core/src/cli/dispatch-frontend.ts +1045 -0
- package/packages/core/src/cli/dispatch-process.ts +259 -0
- package/packages/core/src/cli/dispatch.ts +3692 -0
- package/packages/core/src/cli/dotenv.ts +48 -0
- package/packages/core/src/cli/env.ts +206 -0
- package/packages/core/src/cli/harvest.ts +698 -0
- package/packages/core/src/cli/help.ts +713 -0
- package/packages/core/src/cli/init-agent.ts +106 -0
- package/packages/core/src/cli/init-validation.ts +583 -0
- package/packages/core/src/cli/init.ts +756 -0
- package/packages/core/src/cli/installation.ts +333 -0
- package/packages/core/src/cli/keyboard.ts +261 -0
- package/packages/core/src/cli/main.ts +1399 -0
- package/packages/core/src/cli/mcp.ts +279 -0
- package/packages/core/src/cli/models.ts +65 -0
- package/packages/core/src/cli/observe.ts +55 -0
- package/packages/core/src/cli/plugin.ts +227 -0
- package/packages/core/src/cli/pr-attachments.ts +138 -0
- package/packages/core/src/cli/pr-summary.ts +124 -0
- package/packages/core/src/cli/publication-settlement.ts +188 -0
- package/packages/core/src/cli/repo-state.ts +213 -0
- package/packages/core/src/cli/repository-status.ts +80 -0
- package/packages/core/src/cli/self-update.ts +443 -0
- package/packages/core/src/cli/status.ts +895 -0
- package/packages/core/src/cli/store-opening.contract.ts +289 -0
- package/packages/core/src/cli/store-opening.ts +167 -0
- package/packages/core/src/cli/store-ref.ts +33 -0
- package/packages/core/src/cli/terminal-restore.ts +174 -0
- package/packages/core/src/cli/terminal.ts +361 -0
- package/packages/core/src/cli/terminals.ts +995 -0
- package/packages/core/src/cli/testkit.ts +194 -0
- package/packages/core/src/cli/ticket.ts +484 -0
- package/packages/core/src/cli/upgrade-agent.ts +180 -0
- package/packages/core/src/cli/upgrade-commit.ts +468 -0
- package/packages/core/src/cli/upgrade-notice.ts +91 -0
- package/packages/core/src/cli/upgrade-progress.ts +110 -0
- package/packages/core/src/cli/upgrade.ts +888 -0
- package/packages/core/src/cli/wait.ts +587 -0
- package/packages/core/src/cli/watch.ts +932 -0
- package/packages/core/src/config/live.ts +255 -0
- package/packages/core/src/config/load.ts +98 -0
- package/packages/core/src/config/roles.ts +438 -0
- package/packages/core/src/config/schema.ts +774 -0
- package/packages/core/src/distribution.ts +24 -0
- package/packages/core/src/events/catalog.ts +201 -0
- package/packages/core/src/events/envelope.ts +59 -0
- package/packages/core/src/events/payloads.ts +618 -0
- package/packages/core/src/events/repository.ts +559 -0
- package/packages/core/src/events/sessions.ts +180 -0
- package/packages/core/src/harvest/schema.ts +147 -0
- package/packages/core/src/ids.ts +45 -0
- package/packages/core/src/integration/harness.ts +681 -0
- package/packages/core/src/kernel/auto-merge.ts +259 -0
- package/packages/core/src/kernel/converge.ts +117 -0
- package/packages/core/src/kernel/dispatch-settings.ts +60 -0
- package/packages/core/src/kernel/dispatch-status.ts +141 -0
- package/packages/core/src/kernel/engine.ts +1047 -0
- package/packages/core/src/kernel/harvest.ts +823 -0
- package/packages/core/src/kernel/origin.ts +69 -0
- package/packages/core/src/kernel/phases.ts +196 -0
- package/packages/core/src/kernel/plan-verify-selection.ts +105 -0
- package/packages/core/src/kernel/pr-attachments.ts +82 -0
- package/packages/core/src/kernel/reducer.ts +752 -0
- package/packages/core/src/kernel/stall.ts +155 -0
- package/packages/core/src/kernel/verify-applicability.ts +52 -0
- package/packages/core/src/markdown.ts +67 -0
- package/packages/core/src/ontology.ts +288 -0
- package/packages/core/src/open-map.ts +203 -0
- package/packages/core/src/operator/annotations.ts +187 -0
- package/packages/core/src/operator/client.ts +311 -0
- package/packages/core/src/operator/control.ts +117 -0
- package/packages/core/src/operator/index.ts +62 -0
- package/packages/core/src/operator/presentation.ts +22 -0
- package/packages/core/src/operator/protocol.ts +98 -0
- package/packages/core/src/operator/query.ts +201 -0
- package/packages/core/src/operator/registry.ts +1043 -0
- package/packages/core/src/operator/requests.ts +138 -0
- package/packages/core/src/operator/sandbox.ts +458 -0
- package/packages/core/src/operator/server.ts +616 -0
- package/packages/core/src/operator/sessions.ts +223 -0
- package/packages/core/src/operator/tickets.ts +177 -0
- package/packages/core/src/plugin-sdk/index.ts +174 -0
- package/packages/core/src/plugins/contract-entry.ts +74 -0
- package/packages/core/src/plugins/contract-env.ts +3 -0
- package/packages/core/src/plugins/load.ts +259 -0
- package/packages/core/src/plugins/manifest.ts +236 -0
- package/packages/core/src/plugins/registry.ts +274 -0
- package/packages/core/src/plugins/runtimes.ts +75 -0
- package/packages/core/src/ports/forge/contract.ts +258 -0
- package/packages/core/src/ports/forge/create.ts +74 -0
- package/packages/core/src/ports/forge/fake.ts +488 -0
- package/packages/core/src/ports/forge/github-pr-attachments.ts +351 -0
- package/packages/core/src/ports/forge/github-transport.ts +352 -0
- package/packages/core/src/ports/forge/github.ts +1162 -0
- package/packages/core/src/ports/forge/local-git.ts +568 -0
- package/packages/core/src/ports/runner/claude.ts +873 -0
- package/packages/core/src/ports/runner/cli-stream.ts +90 -0
- package/packages/core/src/ports/runner/codex.ts +873 -0
- package/packages/core/src/ports/runner/contract.ts +492 -0
- package/packages/core/src/ports/runner/fake.ts +213 -0
- package/packages/core/src/ports/runner/json-record.ts +2 -0
- package/packages/core/src/ports/runner/live-contract-fixture.ts +176 -0
- package/packages/core/src/ports/runner/one-shot.ts +29 -0
- package/packages/core/src/ports/runner/pi-bridge-core.ts +136 -0
- package/packages/core/src/ports/runner/pi-bridge.js +6 -0
- package/packages/core/src/ports/runner/pi-rpc.ts +454 -0
- package/packages/core/src/ports/runner/pi.ts +617 -0
- package/packages/core/src/ports/runner/production.ts +74 -0
- package/packages/core/src/ports/runner/provider-error.ts +121 -0
- package/packages/core/src/ports/runner/routing.ts +234 -0
- package/packages/core/src/ports/runner/runtime.ts +214 -0
- package/packages/core/src/ports/runner/session-env.ts +34 -0
- package/packages/core/src/ports/runner/stream-parts.ts +103 -0
- package/packages/core/src/ports/tickets/contract.ts +570 -0
- package/packages/core/src/ports/tickets/create.ts +135 -0
- package/packages/core/src/ports/tickets/fake.ts +215 -0
- package/packages/core/src/ports/tickets/file.ts +559 -0
- package/packages/core/src/ports/tickets/linear.ts +811 -0
- package/packages/core/src/ports/tickets/operations.ts +161 -0
- package/packages/core/src/ports/tickets/remote-index.ts +13 -0
- package/packages/core/src/ports/tickets/remote-protocol.ts +80 -0
- package/packages/core/src/ports/tickets/remote-server.ts +185 -0
- package/packages/core/src/ports/tickets/remote.ts +130 -0
- package/packages/core/src/ports/tickets/update.ts +51 -0
- package/packages/core/src/ports/types.ts +528 -0
- package/packages/core/src/ports/workspace/build-execution.ts +123 -0
- package/packages/core/src/ports/workspace/contract.ts +136 -0
- package/packages/core/src/ports/workspace/create.ts +132 -0
- package/packages/core/src/ports/workspace/distribution-archive.ts +317 -0
- package/packages/core/src/ports/workspace/fake.ts +432 -0
- package/packages/core/src/ports/workspace/git-worktree.ts +848 -0
- package/packages/core/src/ports/workspace/harvest-execution.ts +111 -0
- package/packages/core/src/ports/workspace/in-process-build-execution.ts +30 -0
- package/packages/core/src/ports/workspace/local-build-execution.ts +88 -0
- package/packages/core/src/ports/workspace/operator-sandbox.ts +142 -0
- package/packages/core/src/ports/workspace/phase-scratch.ts +156 -0
- package/packages/core/src/ports/workspace/vercel-sandbox.ts +2541 -0
- package/packages/core/src/processes/build-child-exit.ts +78 -0
- package/packages/core/src/processes/build-child.ts +119 -0
- package/packages/core/src/processes/build-execution-state.ts +95 -0
- package/packages/core/src/processes/build-parent-watch.ts +35 -0
- package/packages/core/src/processes/build-runner.ts +2614 -0
- package/packages/core/src/processes/dispatcher.ts +2825 -0
- package/packages/core/src/processes/execution-settlement.ts +171 -0
- package/packages/core/src/processes/harvest-child.ts +115 -0
- package/packages/core/src/processes/harvest-execution-state.ts +121 -0
- package/packages/core/src/processes/harvest-runner.ts +1656 -0
- package/packages/core/src/processes/harvest.ts +595 -0
- package/packages/core/src/processes/infrastructure-failure-budget.ts +146 -0
- package/packages/core/src/processes/phase-failure-budget.ts +52 -0
- package/packages/core/src/processes/process-group-reaper.ts +35 -0
- package/packages/core/src/processes/process-group.ts +65 -0
- package/packages/core/src/processes/publication-loss.ts +62 -0
- package/packages/core/src/processes/publication-state.ts +93 -0
- package/packages/core/src/processes/sandbox-state.ts +101 -0
- package/packages/core/src/registry.ts +24 -0
- package/packages/core/src/sessions/reducer.ts +185 -0
- package/packages/core/src/skills.ts +7 -0
- package/packages/core/src/spec-standard.ts +47 -0
- package/packages/core/src/store/adapter.ts +80 -0
- package/packages/core/src/store/build-scope.ts +272 -0
- package/packages/core/src/store/contract.ts +2581 -0
- package/packages/core/src/store/local/blobs.ts +38 -0
- package/packages/core/src/store/local/schema.ts +180 -0
- package/packages/core/src/store/local/store.ts +1713 -0
- package/packages/core/src/store/memory.ts +1138 -0
- package/packages/core/src/store/phase-session.ts +425 -0
- package/packages/core/src/store/remote/client.ts +780 -0
- package/packages/core/src/store/remote/index.ts +12 -0
- package/packages/core/src/store/remote/protocol.ts +348 -0
- package/packages/core/src/store/remote/server.ts +923 -0
- package/packages/core/src/store/remote/token.ts +137 -0
- package/packages/core/src/store/remote/version.ts +10 -0
- package/packages/core/src/store/retention.ts +91 -0
- package/packages/core/src/store/session-handle.ts +265 -0
- package/packages/core/src/store/streams/assemble.ts +79 -0
- package/packages/core/src/store/streams/lock.ts +42 -0
- package/packages/core/src/store/streams/session-writer.ts +306 -0
- package/packages/core/src/store/streams/types.ts +171 -0
- package/packages/core/src/store/streams/wait.ts +127 -0
- package/packages/core/src/store/subscribe.ts +105 -0
- package/packages/core/src/store/types.ts +466 -0
- package/packages/core/src/testing/fixed.ts +44 -0
- package/packages/core/src/testing/store-failures.ts +32 -0
- package/packages/core/src/zod-issues.ts +91 -0
- package/skills/code-review/SKILL.md +100 -0
- package/skills/finalize/SKILL.md +44 -0
- package/skills/guide/SKILL.md +1781 -0
- package/skills/guide/references/operator-api.md +164 -0
- package/skills/guide/references/plugin-authoring.md +354 -0
- package/skills/guide/references/remote-store-protocol.md +972 -0
- package/skills/guide/references/remote-ticket-protocol.md +79 -0
- package/skills/guide/references/setup.md +289 -0
- package/skills/guide/references/spec-standard.md +63 -0
- package/skills/guide/references/ticket-dependencies.md +59 -0
- package/skills/harvest/SKILL.md +66 -0
- package/skills/harvest-review/SKILL.md +63 -0
- package/skills/implement/SKILL.md +82 -0
- package/skills/plan/SKILL.md +123 -0
- package/skills/plan-review/SKILL.md +121 -0
- package/skills/reconcile/SKILL.md +65 -0
- package/skills/spec/SKILL.md +132 -0
- package/skills/tickets/SKILL.md +139 -0
- package/templates/autobuild.toml +36 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export const UPGRADE_NOTICE_INTERVAL_MS = 4 * 60 * 60 * 1_000
|
|
2
|
+
export const UPGRADE_NOTICE_DEADLINE_MS = 30_000
|
|
3
|
+
|
|
4
|
+
export type AvailableReleaseProbe = (signal: AbortSignal) => Promise<string | undefined>
|
|
5
|
+
|
|
6
|
+
export interface UpgradeNoticeTimer {
|
|
7
|
+
clear(): void
|
|
8
|
+
unref?(): void
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface UpgradeNoticeScheduler {
|
|
12
|
+
interval(callback: () => void, ms: number): UpgradeNoticeTimer
|
|
13
|
+
timeout(callback: () => void, ms: number): UpgradeNoticeTimer
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const productionScheduler: UpgradeNoticeScheduler = {
|
|
17
|
+
interval(callback, ms) {
|
|
18
|
+
const timer = setInterval(callback, ms)
|
|
19
|
+
return {
|
|
20
|
+
clear: () => clearInterval(timer),
|
|
21
|
+
unref: () => timer.unref?.(),
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
timeout(callback, ms) {
|
|
25
|
+
const timer = setTimeout(callback, ms)
|
|
26
|
+
return {
|
|
27
|
+
clear: () => clearTimeout(timer),
|
|
28
|
+
unref: () => timer.unref?.(),
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface UpgradeNoticeOptions {
|
|
34
|
+
probe: AvailableReleaseProbe
|
|
35
|
+
onAvailable: (version: string) => void
|
|
36
|
+
scheduler?: UpgradeNoticeScheduler
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Run the dashboard's release courtesy in the background. The returned stop
|
|
40
|
+
* function is synchronous and idempotent: teardown never joins a probe that
|
|
41
|
+
* ignores cancellation. */
|
|
42
|
+
export function startUpgradeNotice(options: UpgradeNoticeOptions): () => void {
|
|
43
|
+
const scheduler = options.scheduler ?? productionScheduler
|
|
44
|
+
let stopped = false
|
|
45
|
+
let current: AbortController | undefined
|
|
46
|
+
|
|
47
|
+
const check = (): void => {
|
|
48
|
+
if (stopped || current !== undefined) return
|
|
49
|
+
const controller = new AbortController()
|
|
50
|
+
current = controller
|
|
51
|
+
let deadline: UpgradeNoticeTimer
|
|
52
|
+
try {
|
|
53
|
+
deadline = scheduler.timeout(() => {
|
|
54
|
+
controller.abort()
|
|
55
|
+
// A probe may ignore cancellation forever. Release the overlap guard at
|
|
56
|
+
// the deadline so the next four-hour boundary can still try again.
|
|
57
|
+
if (current === controller) current = undefined
|
|
58
|
+
}, UPGRADE_NOTICE_DEADLINE_MS)
|
|
59
|
+
deadline.unref?.()
|
|
60
|
+
} catch {
|
|
61
|
+
current = undefined
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
void (async () => {
|
|
66
|
+
try {
|
|
67
|
+
const version = await options.probe(controller.signal)
|
|
68
|
+
if (!stopped && !controller.signal.aborted && version !== undefined) {
|
|
69
|
+
options.onAvailable(version)
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
// Upgrade discovery is a silent courtesy, never a dispatcher warning.
|
|
73
|
+
} finally {
|
|
74
|
+
deadline.clear()
|
|
75
|
+
if (current === controller) current = undefined
|
|
76
|
+
}
|
|
77
|
+
})()
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const cadence = scheduler.interval(check, UPGRADE_NOTICE_INTERVAL_MS)
|
|
81
|
+
cadence.unref?.()
|
|
82
|
+
check()
|
|
83
|
+
|
|
84
|
+
return () => {
|
|
85
|
+
if (stopped) return
|
|
86
|
+
stopped = true
|
|
87
|
+
cadence.clear()
|
|
88
|
+
current?.abort()
|
|
89
|
+
current = undefined
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { TerminalInput, TerminalOut } from './terminal'
|
|
2
|
+
import {
|
|
3
|
+
UpgradeResolutionCancelledError,
|
|
4
|
+
type ResolveConflict,
|
|
5
|
+
type ResolveConflictOptions,
|
|
6
|
+
} from './upgrade'
|
|
7
|
+
|
|
8
|
+
const SPINNER = ['|', '/', '-', '\\'] as const
|
|
9
|
+
const DEFAULT_REFRESH_MS = 250
|
|
10
|
+
const CLEAR_LINE = '\r\u001b[2K'
|
|
11
|
+
|
|
12
|
+
/** Keep every repaint on one physical terminal row. */
|
|
13
|
+
function fitToColumns(frame: string, columns: number): string {
|
|
14
|
+
const width = Math.max(0, Math.floor(columns))
|
|
15
|
+
if (frame.length <= width) return frame
|
|
16
|
+
if (width === 0) return ''
|
|
17
|
+
if (width === 1) return '~'
|
|
18
|
+
return `${frame.slice(0, width - 1)}~`
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface UpgradeProgressOptions {
|
|
22
|
+
terminal: TerminalOut
|
|
23
|
+
input: TerminalInput
|
|
24
|
+
/** Deterministic time/scheduling seams for the renderer tests. */
|
|
25
|
+
now?: () => number
|
|
26
|
+
refreshMs?: number
|
|
27
|
+
schedule?: (callback: () => void, milliseconds: number) => unknown
|
|
28
|
+
cancelSchedule?: (timer: unknown) => void
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Decorate one per-file upgrade resolver with an interactive-only live line.
|
|
33
|
+
* Plain output never enters the progress path, preserving piped stdout bytes.
|
|
34
|
+
*/
|
|
35
|
+
export function withUpgradeProgress(
|
|
36
|
+
resolve: ResolveConflict,
|
|
37
|
+
options: UpgradeProgressOptions,
|
|
38
|
+
): ResolveConflict {
|
|
39
|
+
if (!options.terminal.interactive) return resolve
|
|
40
|
+
|
|
41
|
+
return async (conflict, callOptions?: ResolveConflictOptions) => {
|
|
42
|
+
const now = options.now ?? Date.now
|
|
43
|
+
const schedule =
|
|
44
|
+
options.schedule ?? ((callback, milliseconds) => setInterval(callback, milliseconds))
|
|
45
|
+
const cancelSchedule =
|
|
46
|
+
options.cancelSchedule ?? ((timer) => clearInterval(timer as NodeJS.Timeout))
|
|
47
|
+
const startedAt = now()
|
|
48
|
+
const controller = new AbortController()
|
|
49
|
+
let frame = 0
|
|
50
|
+
let cleaned = false
|
|
51
|
+
let cancelled = false
|
|
52
|
+
let rejectCancellation!: (error: Error) => void
|
|
53
|
+
const cancellation = new Promise<never>((_resolve, reject) => {
|
|
54
|
+
rejectCancellation = reject
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const cancel = (): void => {
|
|
58
|
+
if (cancelled) return
|
|
59
|
+
cancelled = true
|
|
60
|
+
controller.abort()
|
|
61
|
+
rejectCancellation(new UpgradeResolutionCancelledError())
|
|
62
|
+
}
|
|
63
|
+
const onCallerCancel = (): void => cancel()
|
|
64
|
+
if (callOptions?.signal !== undefined) {
|
|
65
|
+
callOptions.signal.addEventListener('abort', onCallerCancel, { once: true })
|
|
66
|
+
if (callOptions.signal.aborted) cancel()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const paint = (): void => {
|
|
70
|
+
const elapsed = Math.max(0, Math.floor((now() - startedAt) / 1_000))
|
|
71
|
+
const spinner = SPINNER[frame % SPINNER.length]
|
|
72
|
+
frame += 1
|
|
73
|
+
const status =
|
|
74
|
+
`${spinner} Resolving ${conflict.skill}/${conflict.path} — ` +
|
|
75
|
+
`elapsed ${elapsed}s — Ctrl-C to cancel`
|
|
76
|
+
options.terminal.write(`${CLEAR_LINE}${fitToColumns(status, options.terminal.columns)}`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let timer: unknown
|
|
80
|
+
let stopInput = (): void => {}
|
|
81
|
+
const cleanup = (): void => {
|
|
82
|
+
if (cleaned) return
|
|
83
|
+
cleaned = true
|
|
84
|
+
try {
|
|
85
|
+
if (timer !== undefined) cancelSchedule(timer)
|
|
86
|
+
} finally {
|
|
87
|
+
try {
|
|
88
|
+
stopInput()
|
|
89
|
+
} finally {
|
|
90
|
+
callOptions?.signal?.removeEventListener('abort', onCallerCancel)
|
|
91
|
+
options.terminal.write(CLEAR_LINE)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
paint()
|
|
98
|
+
timer = schedule(paint, Math.min(1_000, Math.max(1, options.refreshMs ?? DEFAULT_REFRESH_MS)))
|
|
99
|
+
stopInput = options.input.start((event) => {
|
|
100
|
+
if (event.type === 'interrupt') cancel()
|
|
101
|
+
})
|
|
102
|
+
if (cancelled) return await cancellation
|
|
103
|
+
// The race is deliberate: even an injected or defective resolver that
|
|
104
|
+
// ignores its signal cannot return a proposal after the human cancels.
|
|
105
|
+
return await Promise.race([resolve(conflict, { signal: controller.signal }), cancellation])
|
|
106
|
+
} finally {
|
|
107
|
+
cleanup()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|