git: 5a631398ecdd - main - misc/opencode: New port: AI coding agent for the terminal

From: Oleksii Samorukov <samm_at_FreeBSD.org>
Date: Mon, 19 Oct 2026 21:35:42 UTC
The branch main has been updated by samm:

URL: https://cgit.FreeBSD.org/ports/commit/?id=5a631398ecdd18a1dc814afac38833a1b8d9f346

commit 5a631398ecdd18a1dc814afac38833a1b8d9f346
Author:     Oleksii Samorukov <samm@FreeBSD.org>
AuthorDate: 2026-10-19 21:33:54 +0000
Commit:     Oleksii Samorukov <samm@FreeBSD.org>
CommitDate: 2026-10-19 21:33:54 +0000

    misc/opencode: New port: AI coding agent for the terminal
    
    OpenCode is an open-source, model-agnostic AI coding agent that runs in
    the terminal.  It combines a full-screen TUI and a scriptable CLI with
    a client/server architecture, LSP awareness and multi-session support.
    Tested on arm64 and amd64.
---
 misc/Makefile                                      |   1 +
 misc/opencode/Makefile                             | 235 +++++++
 misc/opencode/Makefile.crates                      | 375 ++++++++++
 misc/opencode/distinfo                             | 753 +++++++++++++++++++++
 misc/opencode/files/ghostty-zig-0.16-std.patch     |  28 +
 misc/opencode/files/opencode-pty-build.rs.patch    |  69 ++
 misc/opencode/files/opentui-build.zig.patch        |  14 +
 .../files/opentui-ghostty-vt-freebsd.patch         |  18 +
 .../files/patch-packages_cli_script_build.ts       |  51 ++
 .../patch-packages_cli_script_opencode-pty.ts      |  19 +
 misc/opencode/files/setup-fff-freebsd.py           | 113 ++++
 misc/opencode/files/setup-opentui-freebsd.py       | 156 +++++
 misc/opencode/files/webui-wasm-package.json        |  10 +
 misc/opencode/pkg-descr                            |   4 +
 14 files changed, 1846 insertions(+)

diff --git a/misc/Makefile b/misc/Makefile
index ed18e23ee2a5..2a88a2dfda80 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -338,6 +338,7 @@
     SUBDIR += onnxruntime
     SUBDIR += ooo
     SUBDIR += openclaw
+    SUBDIR += opencode
     SUBDIR += opencyc
     SUBDIR += openhab
     SUBDIR += openhab-addons
diff --git a/misc/opencode/Makefile b/misc/opencode/Makefile
new file mode 100644
index 000000000000..8cb98c6f3287
--- /dev/null
+++ b/misc/opencode/Makefile
@@ -0,0 +1,235 @@
+PORTNAME=	opencode
+DISTVERSION=	2.0.32
+CATEGORIES=	misc
+
+# Upstream ships no FreeBSD builds of OpenTUI's Zig core, fff's Rust cdylib, the
+# opencode-pty terminal daemon or the web UI's native Vite 8 bindings, so the
+# port builds them from source (extra source trees plus a WASM fallback) and
+# embeds everything into a single `bun --compile` executable.  See
+# files/setup-*-freebsd.py, files/*.patch and files/webui-wasm-package.json.
+#
+# OPENTUI_VERSION and FFF_VERSION must match the pinned @opentui/core and
+# @ff-labs/fff-bun releases (packages/cli/package.json, packages/core/package.json)
+# or the native FFI ABI breaks.
+OPENTUI_VERSION=	0.5.17
+FFF_VERSION=	0.10.5
+#
+# opencode-pty is the persistent terminal daemon the client spawns.  Its version
+# must match the pinned @opencode-ai/pty release and speak the same wire protocol
+# as the bundled client (packages/cli/package.json, packages/core/package.json),
+# and GHOSTTY_REVISION must match its ghostty-revision file, or the client
+# rejects the daemon as a protocol mismatch.
+OPENCODE_PTY_VERSION=	0.2.0
+GHOSTTY_REVISION=	ab0b9da9e88fcb4b0533a1854e84628f663930af
+
+MASTER_SITES=	https://github.com/anomalyco/opencode/archive/refs/tags/:opencode \
+		https://github.com/anomalyco/opentui/archive/refs/tags/:opentui \
+		https://github.com/dmtrKovalenko/fff/archive/refs/tags/:fff \
+		https://registry.npmjs.org/@ff-labs/fff-bun/-/:fffbun \
+		https://github.com/anomalyco/opencode-pty/archive/refs/tags/:opencodepty \
+		https://github.com/ghostty-org/ghostty/archive/:ghostty
+DISTFILES=	v${DISTVERSION}${EXTRACT_SUFX}:opencode \
+		v${OPENTUI_VERSION}${EXTRACT_SUFX}:opentui \
+		v${FFF_VERSION}${EXTRACT_SUFX}:fff \
+		fff-bun-${FFF_VERSION}.tgz:fffbun \
+		v${OPENCODE_PTY_VERSION}${EXTRACT_SUFX}:opencodepty \
+		${GHOSTTY_REVISION}${EXTRACT_SUFX}:ghostty
+DIST_SUBDIR=	${PORTNAME}
+
+MAINTAINER=	samm@FreeBSD.org
+COMMENT=	AI coding agent for the terminal
+WWW=		https://opencode.ai/ \
+		https://github.com/anomalyco/opencode
+
+LICENSE=	MIT
+
+ONLY_FOR_ARCHS=		aarch64 amd64
+ONLY_FOR_ARCHS_REASON=	OpenTUI's Zig core is only wired up for FreeBSD/aarch64 and FreeBSD/amd64
+
+USES=		python:build cargo
+
+# The port drives the whole build; keep cargo.mk from adding its own
+# do-build/do-install/do-test.
+CARGO_BUILD=	no
+CARGO_INSTALL=	no
+CARGO_TEST=	no
+
+# node (husky `prepare` + Vite 8 web UI).  Use node24: on aarch64 Vite 8's
+# rolldown has no native binding and its WASI fallback SIGSEGVs under node26.
+BUILD_DEPENDS=	${LOCALBASE}/bin/bun:lang/bun \
+		${LOCALBASE}/bin/zig:lang/zig \
+		${LOCALBASE}/bin/node:www/node24
+# post-fetch warms the offline bun and Ghostty Zig caches, so both are needed.
+# Zig 0.16 hardcodes /etc/ssl/cert.pem on FreeBSD; ca_root_nss provides it.
+FETCH_DEPENDS=	${LOCALBASE}/bin/bun:lang/bun \
+		${LOCALBASE}/bin/zig:lang/zig \
+		${LOCALBASE}/share/certs/ca-root-nss.crt:security/ca_root_nss
+
+# OpenCode's bundled ripgrep bootstrap has no FreeBSD build and only falls back
+# to a system `rg`, so make sure one exists: it backs the non-VCS file search
+# and the grep/glob tools.
+RUN_DEPENDS=	rg:textproc/ripgrep
+
+WRKSRC=		${WRKDIR}/opencode-${DISTVERSION}
+OPENTUI_WRKSRC=	${WRKDIR}/opentui-${OPENTUI_VERSION}
+FFF_WRKSRC=	${WRKDIR}/fff-${FFF_VERSION}
+OPENCODE_PTY_WRKSRC=	${WRKDIR}/opencode-pty-${OPENCODE_PTY_VERSION}
+GHOSTTY_WRKSRC=		${WRKDIR}/ghostty-${GHOSTTY_REVISION}
+
+# Build only the fff C-ABI cdylib (not the nvim/python/mcp crates).
+CARGO_BUILD_ARGS=	--package fff-c
+FFF_SO=			${CARGO_TARGET_DIR}/release/libfff_c.so
+
+BUN=			${LOCALBASE}/bin/bun
+ZIG=			${LOCALBASE}/bin/zig
+BUN_INSTALL_CACHE_DIR=	${WRKDIR}/bun-cache
+WEBUI_WASM_DIR=	${WRKDIR}/gen-webui
+WEBUI_WASM_CACHE=	${DISTDIR}/${DIST_SUBDIR}/opencode-webui-wasm-${DISTVERSION}.tar.gz
+BUN_CACHE_TARBALL=	${DISTDIR}/${DIST_SUBDIR}/opencode-bun-cache-${DISTVERSION}.tar.gz
+ZIG_PTY_CACHE_DIR=	${WRKDIR}/zig-pty-cache
+ZIG_PTY_CACHE=		${DISTDIR}/${DIST_SUBDIR}/opencode-pty-zig-cache-${DISTVERSION}.tar.gz
+
+PLIST_FILES=	bin/${PORTNAME}
+
+.include <bsd.port.pre.mk>
+
+# cargo.mk hard-assigns CARGO_WRKSRC from WRKSRC, so point it at the fff tree.
+CARGO_WRKSRC=	${FFF_WRKSRC}
+
+# OpenTUI/Bun arch names differ from ARCH: x64/arm64 for the JS side, and
+# x86_64-freebsd/aarch64-freebsd for the Zig artifact directory.
+.if ${ARCH} == amd64
+OPENTUI_ARCH=	x64
+OPENTUI_ZIGDIR=	x86_64-freebsd
+.elif ${ARCH} == aarch64
+OPENTUI_ARCH=	arm64
+OPENTUI_ZIGDIR=	aarch64-freebsd
+.endif
+
+OPENTUI_SO=		${OPENTUI_WRKSRC}/packages/native/lib/${OPENTUI_ZIGDIR}/libopentui.so
+OPENCODE_BIN=		${WRKSRC}/packages/cli/dist/cli-freebsd-${OPENTUI_ARCH}/bin/opencode
+# Built from source by this port and embedded into the executable (see do-build).
+OPENCODE_PTY_BIN=	${CARGO_TARGET_DIR}/release/opencode-pty
+
+# Build the offline caches at fetch time.  The generated archives live in
+# DISTDIR but are deliberately not listed in DISTFILES, so `make checksum` does
+# not try to verify the generated files.
+post-fetch:
+	@${ECHO_MSG} "===> Warming bun install cache"
+	@${RM} -rf ${WRKDIR}/gen && ${MKDIR} ${WRKDIR}/gen
+	@${TAR} xf ${DISTDIR}/${DIST_SUBDIR}/v${DISTVERSION}${EXTRACT_SUFX} -C ${WRKDIR}/gen
+	@if [ ! -f ${BUN_CACHE_TARBALL} ]; then \
+		cd ${WRKDIR}/gen/opencode-${DISTVERSION} && \
+		${SETENV} BUN_INSTALL_CACHE_DIR=${BUN_INSTALL_CACHE_DIR} \
+			${BUN} install --frozen-lockfile && \
+		${TAR} czf ${BUN_CACHE_TARBALL} -C ${BUN_INSTALL_CACHE_DIR} . ; \
+	fi
+	@if [ ! -f ${WEBUI_WASM_CACHE} ]; then \
+		${ECHO_MSG} "===> Staging Web UI WASM fallbacks"; \
+		${RM} -rf ${WEBUI_WASM_DIR} && ${MKDIR} ${WEBUI_WASM_DIR} && \
+		${CP} ${FILESDIR}/webui-wasm-package.json ${WEBUI_WASM_DIR}/package.json && \
+		cd ${WEBUI_WASM_DIR} && \
+		${SETENV} BUN_INSTALL_CACHE_DIR=${BUN_INSTALL_CACHE_DIR} ${BUN} install && \
+		${TAR} czf ${WEBUI_WASM_CACHE} -C ${WEBUI_WASM_DIR} node_modules ; \
+	fi
+	@if [ ! -f ${ZIG_PTY_CACHE} ]; then \
+		${ECHO_MSG} "===> Warming the Ghostty Zig dependency cache"; \
+		${RM} -rf ${WRKDIR}/gen-ghostty && ${MKDIR} ${WRKDIR}/gen-ghostty && \
+		${TAR} xf ${DISTDIR}/${DIST_SUBDIR}/${GHOSTTY_REVISION}${EXTRACT_SUFX} \
+			-C ${WRKDIR}/gen-ghostty && \
+		cd ${WRKDIR}/gen-ghostty/ghostty-${GHOSTTY_REVISION} && \
+		${SETENV} ZIG_GLOBAL_CACHE_DIR=${ZIG_PTY_CACHE_DIR} \
+			${ZIG} build --fetch=all && \
+		${TAR} czf ${ZIG_PTY_CACHE} -C ${ZIG_PTY_CACHE_DIR} . ; \
+	fi
+
+post-extract:
+	@${MKDIR} ${BUN_INSTALL_CACHE_DIR}
+	@${TAR} xf ${BUN_CACHE_TARBALL} -C ${BUN_INSTALL_CACHE_DIR}
+	@${MKDIR} ${ZIG_PTY_CACHE_DIR}
+	@${TAR} xf ${ZIG_PTY_CACHE} -C ${ZIG_PTY_CACHE_DIR}
+
+# OpenTUI, opencode-pty and Ghostty are extra source trees, so their patches are
+# applied by hand.
+post-patch:
+	@${PATCH} -d ${OPENTUI_WRKSRC} -p0 --batch < ${FILESDIR}/opentui-build.zig.patch
+	@${PATCH} -d ${OPENTUI_WRKSRC} -p0 --batch < ${FILESDIR}/opentui-ghostty-vt-freebsd.patch
+	@${PATCH} -d ${OPENCODE_PTY_WRKSRC} -p1 --batch < ${FILESDIR}/opencode-pty-build.rs.patch
+	@${PATCH} -d ${GHOSTTY_WRKSRC} -p1 --batch < ${FILESDIR}/ghostty-zig-0.16-std.patch
+
+do-build:
+	@${ECHO_MSG} "===> Installing OpenCode dependencies (offline)"
+	@cd ${WRKSRC} && ${SETENV} BUN_INSTALL_CACHE_DIR=${BUN_INSTALL_CACHE_DIR} \
+		${BUN} install --frozen-lockfile
+	@${ECHO_MSG} "===> Installing @ff-labs/fff-bun (upstream ships no FreeBSD package)"
+	@${MKDIR} ${WRKSRC}/node_modules/@ff-labs
+	@${RM} -rf ${WRKSRC}/node_modules/@ff-labs/fff-bun
+	@${MKDIR} ${WRKSRC}/node_modules/@ff-labs/fff-bun
+	@${TAR} xf ${DISTDIR}/${DIST_SUBDIR}/fff-bun-${FFF_VERSION}.tgz \
+		-C ${WRKSRC}/node_modules/@ff-labs/fff-bun --strip-components=1
+	@${ECHO_MSG} "===> Adding Web UI WASM fallbacks"
+	@${TAR} xf ${WEBUI_WASM_CACHE} -C ${WRKSRC}
+	@${MKDIR} ${WRKSRC}/node_modules/lightningcss-freebsd-arm64
+	@${ECHO_CMD} '{"name":"lightningcss-freebsd-arm64","version":"1.32.0","main":"index.js"}' \
+		> ${WRKSRC}/node_modules/lightningcss-freebsd-arm64/package.json
+	@${ECHO_CMD} 'module.exports = require("lightningcss-wasm")' \
+		> ${WRKSRC}/node_modules/lightningcss-freebsd-arm64/index.js
+	@${ECHO_MSG} "===> Building OpenTUI native core"
+	@cd ${OPENTUI_WRKSRC}/packages/native && \
+		${SETENV} HOME=${WRKDIR} \
+			ZIG_GLOBAL_CACHE_DIR=${WRKDIR}/zig-cache \
+			ZIG_LOCAL_CACHE_DIR=${WRKDIR}/zig-cache-local \
+			${SH} scripts/prepare-zig-deps.sh && \
+		${SETENV} HOME=${WRKDIR} \
+			ZIG_GLOBAL_CACHE_DIR=${WRKDIR}/zig-cache \
+			ZIG_LOCAL_CACHE_DIR=${WRKDIR}/zig-cache-local \
+			${ZIG} build -Doptimize=ReleaseFast
+	@${ECHO_MSG} "===> Wiring OpenTUI for FreeBSD"
+	@cd ${WRKSRC} && ${PYTHON_CMD} ${FILESDIR}/setup-opentui-freebsd.py \
+		"${WRKSRC}" "${OPENTUI_SO}" "${OPENTUI_VERSION}" "${OPENTUI_ARCH}"
+	@${ECHO_MSG} "===> Building the fff native library"
+	@${CARGO_CARGO_RUN} build --manifest-path ${CARGO_CARGOTOML} ${CARGO_BUILD_ARGS}
+	@${ECHO_MSG} "===> Wiring fff for FreeBSD"
+	@cd ${WRKSRC} && ${PYTHON_CMD} ${FILESDIR}/setup-fff-freebsd.py \
+		"${WRKSRC}" "${FFF_SO}" "${FFF_VERSION}" "${OPENTUI_ARCH}"
+	@${ECHO_MSG} "===> Building the opencode-pty terminal daemon"
+	@cd ${OPENCODE_PTY_WRKSRC} && ${SETENV} ${CARGO_ENV} \
+		HOME=${WRKDIR} \
+		ZIG_GLOBAL_CACHE_DIR=${ZIG_PTY_CACHE_DIR} \
+		GHOSTTY_SOURCE_DIR=${GHOSTTY_WRKSRC} \
+		OPENCODE_ZIG_CPU=baseline \
+		${CARGO} build --release --locked
+	@test -x ${OPENCODE_PTY_BIN} || (${ECHO_MSG} "Missing ${OPENCODE_PTY_BIN}"; ${FALSE})
+	@${ECHO_MSG} "===> Building the web UI and compiling the OpenCode binary"
+	@cd ${WRKSRC}/packages/cli && ${SETENV} \
+		HOME=${WRKDIR} \
+		OPENCODE_VERSION=${DISTVERSION} \
+		BUN_INSTALL_CACHE_DIR=${BUN_INSTALL_CACHE_DIR} \
+		OPENCODE_PTY_BIN=${OPENCODE_PTY_BIN} \
+		${BUN} run script/build.ts \
+			--target=opencode-freebsd-${OPENTUI_ARCH} \
+			--skip-install \
+			--outdir=dist
+	@test -x ${OPENCODE_BIN} || (${ECHO_MSG} "Missing ${OPENCODE_BIN}"; ${FALSE})
+
+do-install:
+	# bun --compile appends the standalone payload to the executable.  Stripping
+	# it (the default ${INSTALL_PROGRAM}) discards that payload, leaving a binary
+	# that runs as plain bun, so install it unstripped.
+	${INSTALL} -m 555 ${OPENCODE_BIN} ${STAGEDIR}${PREFIX}/bin/opencode
+
+do-test:
+	@${ECHO_MSG} "==> Running OpenCode smoke test..."
+	${STAGEDIR}${PREFIX}/bin/opencode --version
+	@${ECHO_MSG} "==> Checking the fff native library is embedded..."
+	@if ! ${GREP} -aq "crates/fff-c/src" ${STAGEDIR}${PREFIX}/bin/opencode; then \
+		${ECHO_MSG} "ERROR: the fff native library is not embedded in the binary"; \
+		${FALSE}; \
+	fi
+	@${ECHO_MSG} "==> Checking the opencode-pty terminal daemon is embedded..."
+	@if ! ${GREP} -aq "libghostty" ${STAGEDIR}${PREFIX}/bin/opencode; then \
+		${ECHO_MSG} "ERROR: the opencode-pty terminal daemon is not embedded in the binary"; \
+		${FALSE}; \
+	fi
+
+.include <bsd.port.post.mk>
diff --git a/misc/opencode/Makefile.crates b/misc/opencode/Makefile.crates
new file mode 100644
index 000000000000..0055b2040d21
--- /dev/null
+++ b/misc/opencode/Makefile.crates
@@ -0,0 +1,375 @@
+# Crates.io dependencies of the fff and opencode-pty Cargo.locks (see Makefile).
+# Re-create after bumping FFF_VERSION or OPENCODE_PTY_VERSION with:
+#   make cargo-crates-merge               # needs ports-mgmt/portfmt
+# or:
+#   make cargo-crates > Makefile.crates && make makesum
+CARGO_CRATES=ahash-0.8.12 \
+		aho-corasick-1.1.4 \
+		android_system_properties-0.1.5 \
+		anes-0.1.6 \
+		anstream-1.0.0 \
+		anstyle-1.0.14 \
+		anstyle-parse-1.0.0 \
+		anstyle-query-1.1.5 \
+		anstyle-wincon-3.0.11 \
+		anyhow-1.0.103 \
+		anyhow-1.0.104 \
+		arrayref-0.3.9 \
+		arrayvec-0.7.6 \
+		async-trait-0.1.89 \
+		autocfg-1.5.0 \
+		base64-0.22.1 \
+		bincode-1.3.3 \
+		bindgen-0.72.1 \
+		bitflags-1.3.2 \
+		bitflags-2.11.0 \
+		bitflags-2.13.1 \
+		blake3-1.8.3 \
+		block-buffer-0.10.4 \
+		block2-0.6.2 \
+		bstr-1.12.1 \
+		bumpalo-3.20.2 \
+		byteorder-1.5.0 \
+		bytes-1.11.1 \
+		cast-0.3.0 \
+		cc-1.2.57 \
+		cexpr-0.6.0 \
+		cfg-if-1.0.4 \
+		cfg_aliases-0.1.1 \
+		cfg_aliases-0.2.1 \
+		chrono-0.4.44 \
+		ciborium-0.2.2 \
+		ciborium-io-0.2.2 \
+		ciborium-ll-0.2.2 \
+		clang-sys-1.8.1 \
+		clap-4.6.0 \
+		clap_builder-4.6.0 \
+		clap_derive-4.6.0 \
+		clap_lex-1.1.0 \
+		colorchoice-1.0.5 \
+		constant_time_eq-0.4.2 \
+		core-foundation-sys-0.8.7 \
+		cpufeatures-0.2.17 \
+		criterion-0.5.1 \
+		criterion-plot-0.5.0 \
+		crossbeam-channel-0.5.15 \
+		crossbeam-channel-0.5.16 \
+		crossbeam-deque-0.8.6 \
+		crossbeam-epoch-0.9.20 \
+		crossbeam-queue-0.3.12 \
+		crossbeam-utils-0.8.21 \
+		crossbeam-utils-0.8.22 \
+		crunchy-0.2.4 \
+		crypto-common-0.1.7 \
+		ctor-0.2.9 \
+		ctrlc-3.5.2 \
+		cty-0.2.2 \
+		darling-0.23.0 \
+		darling_core-0.23.0 \
+		darling_macro-0.23.0 \
+		deranged-0.5.8 \
+		digest-0.10.7 \
+		dirs-5.0.1 \
+		dirs-sys-0.4.1 \
+		dispatch2-0.3.1 \
+		displaydoc-0.2.5 \
+		downcast-rs-1.2.1 \
+		doxygen-rs-0.4.2 \
+		dunce-1.0.5 \
+		dyn-clone-1.0.20 \
+		either-1.15.0 \
+		equivalent-1.0.2 \
+		errno-0.3.14 \
+		fastrand-2.3.0 \
+		fff-notify-debouncer-full-0.9.4 \
+		file-id-0.2.3 \
+		filedescriptor-0.8.3 \
+		find-msvc-tools-0.1.9 \
+		fnv-1.0.7 \
+		foldhash-0.1.5 \
+		form_urlencoded-1.2.2 \
+		fs2-0.4.3 \
+		futures-0.3.32 \
+		futures-channel-0.3.32 \
+		futures-core-0.3.32 \
+		futures-executor-0.3.32 \
+		futures-io-0.3.32 \
+		futures-macro-0.3.32 \
+		futures-sink-0.3.32 \
+		futures-task-0.3.32 \
+		futures-util-0.3.32 \
+		generic-array-0.14.7 \
+		getrandom-0.2.17 \
+		getrandom-0.3.4 \
+		getrandom-0.4.2 \
+		git2-0.21.0 \
+		glidesort-0.1.2 \
+		glob-0.3.3 \
+		globset-0.4.18 \
+		half-2.7.1 \
+		hashbrown-0.15.5 \
+		hashbrown-0.16.1 \
+		heck-0.5.0 \
+		heed-0.22.0 \
+		heed-traits-0.20.0 \
+		heed-types-0.21.0 \
+		hermit-abi-0.5.2 \
+		iana-time-zone-0.1.65 \
+		iana-time-zone-haiku-0.1.2 \
+		icu_collections-2.1.1 \
+		icu_locale_core-2.1.1 \
+		icu_normalizer-2.1.1 \
+		icu_normalizer_data-2.1.1 \
+		icu_properties-2.1.2 \
+		icu_properties_data-2.1.2 \
+		icu_provider-2.1.1 \
+		id-arena-2.3.0 \
+		ident_case-1.0.1 \
+		idna-1.1.0 \
+		idna_adapter-1.2.1 \
+		ignore-0.4.25 \
+		indexmap-2.13.0 \
+		indoc-2.0.7 \
+		inotify-0.11.1 \
+		inotify-sys-0.1.5 \
+		is-terminal-0.4.17 \
+		is_terminal_polyfill-1.70.2 \
+		itertools-0.10.5 \
+		itertools-0.13.0 \
+		itoa-1.0.17 \
+		itoa-1.0.18 \
+		jobserver-0.1.34 \
+		js-sys-0.3.91 \
+		kqueue-1.1.1 \
+		kqueue-sys-1.0.4 \
+		lazy_static-1.5.0 \
+		leb128fmt-0.1.0 \
+		libc-0.2.183 \
+		libc-0.2.189 \
+		libgit2-sys-0.18.7+1.9.6 \
+		libloading-0.8.9 \
+		libmimalloc-sys-0.1.44 \
+		libredox-0.1.14 \
+		libz-sys-1.1.25 \
+		linux-raw-sys-0.12.1 \
+		litemap-0.8.1 \
+		lmdb-master-sys-0.2.5 \
+		lock_api-0.4.14 \
+		log-0.4.29 \
+		log-0.4.33 \
+		matchers-0.2.0 \
+		memchr-2.8.0 \
+		memchr-2.8.3 \
+		memmap2-0.9.11 \
+		memoffset-0.9.1 \
+		mimalloc-0.1.48 \
+		minimal-lexical-0.2.1 \
+		mio-1.1.1 \
+		mlua-0.11.6 \
+		mlua-sys-0.10.0 \
+		mlua_derive-0.11.0 \
+		neo_frizbee-0.11.0 \
+		nix-0.28.0 \
+		nix-0.31.2 \
+		nom-7.1.3 \
+		notify-9.0.0-rc.4 \
+		notify-types-2.1.0 \
+		nu-ansi-term-0.50.3 \
+		num-conv-0.2.0 \
+		num-traits-0.2.19 \
+		objc2-0.6.4 \
+		objc2-core-foundation-0.3.2 \
+		objc2-core-services-0.3.2 \
+		objc2-encode-4.1.0 \
+		once_cell-1.21.4 \
+		once_cell_polyfill-1.70.2 \
+		oorandom-11.1.5 \
+		option-ext-0.2.0 \
+		page_size-0.6.0 \
+		parking_lot-0.12.5 \
+		parking_lot_core-0.9.12 \
+		pastey-0.2.1 \
+		pathdiff-0.2.3 \
+		percent-encoding-2.3.2 \
+		phf-0.11.3 \
+		phf_generator-0.11.3 \
+		phf_macros-0.11.3 \
+		phf_shared-0.11.3 \
+		pin-project-lite-0.2.17 \
+		pkg-config-0.3.32 \
+		plotters-0.3.7 \
+		plotters-backend-0.3.7 \
+		plotters-svg-0.3.7 \
+		portable-atomic-1.13.1 \
+		portable-pty-0.9.0 \
+		potential_utf-0.1.4 \
+		powerfmt-0.2.0 \
+		ppv-lite86-0.2.21 \
+		prettyplease-0.2.37 \
+		proc-macro2-1.0.106 \
+		proc-macro2-1.0.107 \
+		proptest-1.11.0 \
+		pyo3-0.24.2 \
+		pyo3-build-config-0.24.2 \
+		pyo3-ffi-0.24.2 \
+		pyo3-macros-0.24.2 \
+		pyo3-macros-backend-0.24.2 \
+		quick-error-1.2.3 \
+		quote-1.0.45 \
+		quote-1.0.47 \
+		r-efi-5.3.0 \
+		r-efi-6.0.0 \
+		rand-0.8.5 \
+		rand-0.9.4 \
+		rand-0.9.5 \
+		rand_chacha-0.3.1 \
+		rand_chacha-0.9.0 \
+		rand_core-0.6.4 \
+		rand_core-0.9.5 \
+		rand_xorshift-0.4.0 \
+		rayon-1.11.0 \
+		rayon-core-1.13.0 \
+		redox_syscall-0.5.18 \
+		redox_users-0.4.6 \
+		ref-cast-1.0.25 \
+		ref-cast-impl-1.0.25 \
+		regex-1.12.3 \
+		regex-automata-0.4.14 \
+		regex-syntax-0.8.10 \
+		rmcp-1.7.0 \
+		rmcp-macros-1.7.0 \
+		rustc-hash-2.1.2 \
+		rustix-1.1.4 \
+		rustversion-1.0.22 \
+		rusty-fork-0.3.1 \
+		same-file-1.0.6 \
+		schemars-1.2.1 \
+		schemars_derive-1.2.1 \
+		scopeguard-1.2.0 \
+		semver-1.0.27 \
+		serde-1.0.228 \
+		serde-1.0.229 \
+		serde_core-1.0.228 \
+		serde_core-1.0.229 \
+		serde_derive-1.0.228 \
+		serde_derive-1.0.229 \
+		serde_derive_internals-0.29.1 \
+		serde_json-1.0.149 \
+		serde_json-1.0.151 \
+		serial2-0.2.38 \
+		sha2-0.10.9 \
+		sharded-slab-0.1.7 \
+		shared_library-0.1.9 \
+		shell-words-1.1.1 \
+		shlex-1.3.0 \
+		signal-hook-registry-1.4.8 \
+		siphasher-1.0.2 \
+		slab-0.4.12 \
+		smallvec-1.15.1 \
+		socket2-0.6.3 \
+		stable_deref_trait-1.2.1 \
+		strsim-0.11.1 \
+		syn-2.0.117 \
+		syn-2.0.119 \
+		syn-3.0.3 \
+		synchronoise-1.0.1 \
+		synstructure-0.13.2 \
+		target-lexicon-0.13.5 \
+		tempfile-3.27.0 \
+		thiserror-1.0.69 \
+		thiserror-2.0.18 \
+		thiserror-impl-1.0.69 \
+		thiserror-impl-2.0.18 \
+		thread_local-1.1.9 \
+		time-0.3.47 \
+		time-core-0.1.8 \
+		time-macros-0.2.27 \
+		tinystr-0.8.2 \
+		tinytemplate-1.2.1 \
+		tokio-1.50.0 \
+		tokio-macros-2.6.1 \
+		tokio-util-0.7.18 \
+		tracing-0.1.44 \
+		tracing-appender-0.2.4 \
+		tracing-attributes-0.1.31 \
+		tracing-core-0.1.36 \
+		tracing-log-0.2.0 \
+		tracing-subscriber-0.3.23 \
+		typenum-1.20.1 \
+		unarray-0.1.4 \
+		unicode-ident-1.0.24 \
+		unicode-xid-0.2.6 \
+		unindent-0.2.4 \
+		url-2.5.8 \
+		utf8_iter-1.0.4 \
+		utf8parse-0.2.2 \
+		valuable-0.1.1 \
+		vcpkg-0.2.15 \
+		version_check-0.9.5 \
+		walkdir-2.5.0 \
+		wasi-0.11.1+wasi-snapshot-preview1 \
+		wasip2-1.0.2+wasi-0.2.9 \
+		wasip2-1.0.4+wasi-0.2.12 \
+		wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06 \
+		wasm-bindgen-0.2.114 \
+		wasm-bindgen-macro-0.2.114 \
+		wasm-bindgen-macro-support-0.2.114 \
+		wasm-bindgen-shared-0.2.114 \
+		wasm-encoder-0.244.0 \
+		wasm-metadata-0.244.0 \
+		wasmparser-0.244.0 \
+		web-sys-0.3.91 \
+		winapi-0.3.9 \
+		winapi-i686-pc-windows-gnu-0.4.0 \
+		winapi-util-0.1.11 \
+		winapi-x86_64-pc-windows-gnu-0.4.0 \
+		windows-core-0.62.2 \
+		windows-implement-0.60.2 \
+		windows-interface-0.59.3 \
+		windows-link-0.2.1 \
+		windows-result-0.4.1 \
+		windows-strings-0.5.1 \
+		windows-sys-0.48.0 \
+		windows-sys-0.60.2 \
+		windows-sys-0.61.2 \
+		windows-targets-0.48.5 \
+		windows-targets-0.53.5 \
+		windows_aarch64_gnullvm-0.48.5 \
+		windows_aarch64_gnullvm-0.53.1 \
+		windows_aarch64_msvc-0.48.5 \
+		windows_aarch64_msvc-0.53.1 \
+		windows_i686_gnu-0.48.5 \
+		windows_i686_gnu-0.53.1 \
+		windows_i686_gnullvm-0.53.1 \
+		windows_i686_msvc-0.48.5 \
+		windows_i686_msvc-0.53.1 \
+		windows_x86_64_gnu-0.48.5 \
+		windows_x86_64_gnu-0.53.1 \
+		windows_x86_64_gnullvm-0.48.5 \
+		windows_x86_64_gnullvm-0.53.1 \
+		windows_x86_64_msvc-0.48.5 \
+		windows_x86_64_msvc-0.53.1 \
+		winreg-0.10.1 \
+		wit-bindgen-0.51.0 \
+		wit-bindgen-0.57.1 \
+		wit-bindgen-core-0.51.0 \
+		wit-bindgen-rust-0.51.0 \
+		wit-bindgen-rust-macro-0.51.0 \
+		wit-component-0.244.0 \
+		wit-parser-0.244.0 \
+		writeable-0.6.2 \
+		xxhash-rust-0.8.15 \
+		yoke-0.8.1 \
+		yoke-derive-0.8.1 \
+		zerocopy-0.8.47 \
+		zerocopy-0.8.56 \
+		zerocopy-derive-0.8.47 \
+		zerocopy-derive-0.8.56 \
+		zerofrom-0.1.6 \
+		zerofrom-derive-0.1.6 \
+		zerotrie-0.2.3 \
+		zerovec-0.11.5 \
+		zerovec-derive-0.11.2 \
+		zlob-1.6.3 \
+		zmij-1.0.21 \
+		zmij-1.0.23
diff --git a/misc/opencode/distinfo b/misc/opencode/distinfo
new file mode 100644
index 000000000000..6be6395e1f58
--- /dev/null
+++ b/misc/opencode/distinfo
@@ -0,0 +1,753 @@
+TIMESTAMP = 1791718697
+SHA256 (opencode/v2.0.32.tar.gz) = d9e080eae0965104dfe3857aabbc8ce976e9aeaa62110ce101bc1a107d243d97
+SIZE (opencode/v2.0.32.tar.gz) = 79782481
+SHA256 (opencode/v0.5.17.tar.gz) = f272f54f96ff230a188c9cf9f593105c6e784f0a14fdbcb7169e523d9c9b7a96
+SIZE (opencode/v0.5.17.tar.gz) = 30017526
+SHA256 (opencode/v0.10.5.tar.gz) = db50fa8aaabb77211f8dbeb4d77dc8852e0ee52070e40bfd9ef5af44ac50accc
+SIZE (opencode/v0.10.5.tar.gz) = 2798793
+SHA256 (opencode/fff-bun-0.10.5.tgz) = 16afa70bcb078c9b28378545396298f73a67fc10e7ff7bba4f9ff1d0462c27f0
+SIZE (opencode/fff-bun-0.10.5.tgz) = 83121
+SHA256 (opencode/v0.2.0.tar.gz) = 7fc1d1ebf4b74cd1b2a83f059afa29a899990b85cf078e73b703004370a52754
+SIZE (opencode/v0.2.0.tar.gz) = 72121
+SHA256 (opencode/ab0b9da9e88fcb4b0533a1854e84628f663930af.tar.gz) = 651ffa67e98060bc41aac04fcab45f71fb9998eb265957d85a89218ecf94d50b
+SIZE (opencode/ab0b9da9e88fcb4b0533a1854e84628f663930af.tar.gz) = 38024504
+SHA256 (opencode/rust/crates/ahash-0.8.12.crate) = 5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75
+SIZE (opencode/rust/crates/ahash-0.8.12.crate) = 43413
+SHA256 (opencode/rust/crates/aho-corasick-1.1.4.crate) = ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301
+SIZE (opencode/rust/crates/aho-corasick-1.1.4.crate) = 184015
+SHA256 (opencode/rust/crates/android_system_properties-0.1.5.crate) = 819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311
+SIZE (opencode/rust/crates/android_system_properties-0.1.5.crate) = 5243
+SHA256 (opencode/rust/crates/anes-0.1.6.crate) = 4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299
+SIZE (opencode/rust/crates/anes-0.1.6.crate) = 23857
+SHA256 (opencode/rust/crates/anstream-1.0.0.crate) = 824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d
+SIZE (opencode/rust/crates/anstream-1.0.0.crate) = 28916
+SHA256 (opencode/rust/crates/anstyle-1.0.14.crate) = 940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000
+SIZE (opencode/rust/crates/anstyle-1.0.14.crate) = 17787
+SHA256 (opencode/rust/crates/anstyle-parse-1.0.0.crate) = 52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e
+SIZE (opencode/rust/crates/anstyle-parse-1.0.0.crate) = 22042
+SHA256 (opencode/rust/crates/anstyle-query-1.1.5.crate) = 40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc
+SIZE (opencode/rust/crates/anstyle-query-1.1.5.crate) = 10264
+SHA256 (opencode/rust/crates/anstyle-wincon-3.0.11.crate) = 291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d
+SIZE (opencode/rust/crates/anstyle-wincon-3.0.11.crate) = 12638
+SHA256 (opencode/rust/crates/anyhow-1.0.103.crate) = 2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3
+SIZE (opencode/rust/crates/anyhow-1.0.103.crate) = 48746
+SHA256 (opencode/rust/crates/anyhow-1.0.104.crate) = 330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470
+SIZE (opencode/rust/crates/anyhow-1.0.104.crate) = 48819
+SHA256 (opencode/rust/crates/arrayref-0.3.9.crate) = 76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb
+SIZE (opencode/rust/crates/arrayref-0.3.9.crate) = 9186
+SHA256 (opencode/rust/crates/arrayvec-0.7.6.crate) = 7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50
+SIZE (opencode/rust/crates/arrayvec-0.7.6.crate) = 31237
+SHA256 (opencode/rust/crates/async-trait-0.1.89.crate) = 9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb
+SIZE (opencode/rust/crates/async-trait-0.1.89.crate) = 32171
+SHA256 (opencode/rust/crates/autocfg-1.5.0.crate) = c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8
+SIZE (opencode/rust/crates/autocfg-1.5.0.crate) = 18729
+SHA256 (opencode/rust/crates/base64-0.22.1.crate) = 72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6
+SIZE (opencode/rust/crates/base64-0.22.1.crate) = 81597
+SHA256 (opencode/rust/crates/bincode-1.3.3.crate) = b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad
+SIZE (opencode/rust/crates/bincode-1.3.3.crate) = 28958
+SHA256 (opencode/rust/crates/bindgen-0.72.1.crate) = 993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895
+SIZE (opencode/rust/crates/bindgen-0.72.1.crate) = 246071
+SHA256 (opencode/rust/crates/bitflags-1.3.2.crate) = bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a
+SIZE (opencode/rust/crates/bitflags-1.3.2.crate) = 23021
+SHA256 (opencode/rust/crates/bitflags-2.11.0.crate) = 843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af
+SIZE (opencode/rust/crates/bitflags-2.11.0.crate) = 48906
+SHA256 (opencode/rust/crates/bitflags-2.13.1.crate) = b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da
+SIZE (opencode/rust/crates/bitflags-2.13.1.crate) = 51395
+SHA256 (opencode/rust/crates/blake3-1.8.3.crate) = 2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d
+SIZE (opencode/rust/crates/blake3-1.8.3.crate) = 207224
+SHA256 (opencode/rust/crates/block-buffer-0.10.4.crate) = 3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71
+SIZE (opencode/rust/crates/block-buffer-0.10.4.crate) = 10538
+SHA256 (opencode/rust/crates/block2-0.6.2.crate) = cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5
+SIZE (opencode/rust/crates/block2-0.6.2.crate) = 34505
+SHA256 (opencode/rust/crates/bstr-1.12.1.crate) = 63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab
+SIZE (opencode/rust/crates/bstr-1.12.1.crate) = 354916
+SHA256 (opencode/rust/crates/bumpalo-3.20.2.crate) = 5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb
+SIZE (opencode/rust/crates/bumpalo-3.20.2.crate) = 97696
+SHA256 (opencode/rust/crates/byteorder-1.5.0.crate) = 1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b
+SIZE (opencode/rust/crates/byteorder-1.5.0.crate) = 23288
+SHA256 (opencode/rust/crates/bytes-1.11.1.crate) = 1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33
+SIZE (opencode/rust/crates/bytes-1.11.1.crate) = 78584
+SHA256 (opencode/rust/crates/cast-0.3.0.crate) = 37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5
+SIZE (opencode/rust/crates/cast-0.3.0.crate) = 11452
+SHA256 (opencode/rust/crates/cc-1.2.57.crate) = 7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423
+SIZE (opencode/rust/crates/cc-1.2.57.crate) = 96188
+SHA256 (opencode/rust/crates/cexpr-0.6.0.crate) = 6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766
+SIZE (opencode/rust/crates/cexpr-0.6.0.crate) = 17966
+SHA256 (opencode/rust/crates/cfg-if-1.0.4.crate) = 9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801
+SIZE (opencode/rust/crates/cfg-if-1.0.4.crate) = 9360
+SHA256 (opencode/rust/crates/cfg_aliases-0.1.1.crate) = fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e
+SIZE (opencode/rust/crates/cfg_aliases-0.1.1.crate) = 6009
+SHA256 (opencode/rust/crates/cfg_aliases-0.2.1.crate) = 613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724
+SIZE (opencode/rust/crates/cfg_aliases-0.2.1.crate) = 6355
+SHA256 (opencode/rust/crates/chrono-0.4.44.crate) = c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0
+SIZE (opencode/rust/crates/chrono-0.4.44.crate) = 240549
+SHA256 (opencode/rust/crates/ciborium-0.2.2.crate) = 42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e
+SIZE (opencode/rust/crates/ciborium-0.2.2.crate) = 35611
+SHA256 (opencode/rust/crates/ciborium-io-0.2.2.crate) = 05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757
+SIZE (opencode/rust/crates/ciborium-io-0.2.2.crate) = 6697
+SHA256 (opencode/rust/crates/ciborium-ll-0.2.2.crate) = 57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9
+SIZE (opencode/rust/crates/ciborium-ll-0.2.2.crate) = 14695
+SHA256 (opencode/rust/crates/clang-sys-1.8.1.crate) = 0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4
+SIZE (opencode/rust/crates/clang-sys-1.8.1.crate) = 44009
+SHA256 (opencode/rust/crates/clap-4.6.0.crate) = b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351
+SIZE (opencode/rust/crates/clap-4.6.0.crate) = 62930
+SHA256 (opencode/rust/crates/clap_builder-4.6.0.crate) = 714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f
+SIZE (opencode/rust/crates/clap_builder-4.6.0.crate) = 171122
+SHA256 (opencode/rust/crates/clap_derive-4.6.0.crate) = 1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a
+SIZE (opencode/rust/crates/clap_derive-4.6.0.crate) = 33435
+SHA256 (opencode/rust/crates/clap_lex-1.1.0.crate) = c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9
+SIZE (opencode/rust/crates/clap_lex-1.1.0.crate) = 13470
+SHA256 (opencode/rust/crates/colorchoice-1.0.5.crate) = 1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570
+SIZE (opencode/rust/crates/colorchoice-1.0.5.crate) = 8187
+SHA256 (opencode/rust/crates/constant_time_eq-0.4.2.crate) = 3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b
+SIZE (opencode/rust/crates/constant_time_eq-0.4.2.crate) = 25831
+SHA256 (opencode/rust/crates/core-foundation-sys-0.8.7.crate) = 773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b
+SIZE (opencode/rust/crates/core-foundation-sys-0.8.7.crate) = 37712
+SHA256 (opencode/rust/crates/cpufeatures-0.2.17.crate) = 59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280
+SIZE (opencode/rust/crates/cpufeatures-0.2.17.crate) = 13466
+SHA256 (opencode/rust/crates/criterion-0.5.1.crate) = f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f
+SIZE (opencode/rust/crates/criterion-0.5.1.crate) = 110088
+SHA256 (opencode/rust/crates/criterion-plot-0.5.0.crate) = 6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1
+SIZE (opencode/rust/crates/criterion-plot-0.5.0.crate) = 22706
+SHA256 (opencode/rust/crates/crossbeam-channel-0.5.15.crate) = 82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2
+SIZE (opencode/rust/crates/crossbeam-channel-0.5.15.crate) = 92716
+SHA256 (opencode/rust/crates/crossbeam-channel-0.5.16.crate) = d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e
+SIZE (opencode/rust/crates/crossbeam-channel-0.5.16.crate) = 93189
+SHA256 (opencode/rust/crates/crossbeam-deque-0.8.6.crate) = 9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51
+SIZE (opencode/rust/crates/crossbeam-deque-0.8.6.crate) = 22471
+SHA256 (opencode/rust/crates/crossbeam-epoch-0.9.20.crate) = 2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f
+SIZE (opencode/rust/crates/crossbeam-epoch-0.9.20.crate) = 47545
+SHA256 (opencode/rust/crates/crossbeam-queue-0.3.12.crate) = 0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115
+SIZE (opencode/rust/crates/crossbeam-queue-0.3.12.crate) = 16270
+SHA256 (opencode/rust/crates/crossbeam-utils-0.8.21.crate) = d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28
+SIZE (opencode/rust/crates/crossbeam-utils-0.8.21.crate) = 42691
+SHA256 (opencode/rust/crates/crossbeam-utils-0.8.22.crate) = 61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17
+SIZE (opencode/rust/crates/crossbeam-utils-0.8.22.crate) = 46874
+SHA256 (opencode/rust/crates/crunchy-0.2.4.crate) = 460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5
+SIZE (opencode/rust/crates/crunchy-0.2.4.crate) = 3887
+SHA256 (opencode/rust/crates/crypto-common-0.1.7.crate) = 78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a
+SIZE (opencode/rust/crates/crypto-common-0.1.7.crate) = 9619
+SHA256 (opencode/rust/crates/ctor-0.2.9.crate) = 32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501
+SIZE (opencode/rust/crates/ctor-0.2.9.crate) = 11032
+SHA256 (opencode/rust/crates/ctrlc-3.5.2.crate) = e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162
+SIZE (opencode/rust/crates/ctrlc-3.5.2.crate) = 14194
+SHA256 (opencode/rust/crates/cty-0.2.2.crate) = b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35
+SIZE (opencode/rust/crates/cty-0.2.2.crate) = 7230
+SHA256 (opencode/rust/crates/darling-0.23.0.crate) = 25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d
+SIZE (opencode/rust/crates/darling-0.23.0.crate) = 43298
+SHA256 (opencode/rust/crates/darling_core-0.23.0.crate) = 9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0
+SIZE (opencode/rust/crates/darling_core-0.23.0.crate) = 74564
+SHA256 (opencode/rust/crates/darling_macro-0.23.0.crate) = ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d
+SIZE (opencode/rust/crates/darling_macro-0.23.0.crate) = 2480
+SHA256 (opencode/rust/crates/deranged-0.5.8.crate) = 7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c
+SIZE (opencode/rust/crates/deranged-0.5.8.crate) = 26885
+SHA256 (opencode/rust/crates/digest-0.10.7.crate) = 9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292
+SIZE (opencode/rust/crates/digest-0.10.7.crate) = 19557
+SHA256 (opencode/rust/crates/dirs-5.0.1.crate) = 44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225
+SIZE (opencode/rust/crates/dirs-5.0.1.crate) = 12255
+SHA256 (opencode/rust/crates/dirs-sys-0.4.1.crate) = 520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c
+SIZE (opencode/rust/crates/dirs-sys-0.4.1.crate) = 10719
+SHA256 (opencode/rust/crates/dispatch2-0.3.1.crate) = 1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38
+SIZE (opencode/rust/crates/dispatch2-0.3.1.crate) = 55299
+SHA256 (opencode/rust/crates/displaydoc-0.2.5.crate) = 97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0
+SIZE (opencode/rust/crates/displaydoc-0.2.5.crate) = 24219
+SHA256 (opencode/rust/crates/downcast-rs-1.2.1.crate) = 75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2
+SIZE (opencode/rust/crates/downcast-rs-1.2.1.crate) = 11821
+SHA256 (opencode/rust/crates/doxygen-rs-0.4.2.crate) = 415b6ec780d34dcf624666747194393603d0373b7141eef01d12ee58881507d9
+SIZE (opencode/rust/crates/doxygen-rs-0.4.2.crate) = 15907
+SHA256 (opencode/rust/crates/dunce-1.0.5.crate) = 92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813
+SIZE (opencode/rust/crates/dunce-1.0.5.crate) = 8244
+SHA256 (opencode/rust/crates/dyn-clone-1.0.20.crate) = d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555
+SIZE (opencode/rust/crates/dyn-clone-1.0.20.crate) = 13134
+SHA256 (opencode/rust/crates/either-1.15.0.crate) = 48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719
+SIZE (opencode/rust/crates/either-1.15.0.crate) = 20114
+SHA256 (opencode/rust/crates/equivalent-1.0.2.crate) = 877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f
+SIZE (opencode/rust/crates/equivalent-1.0.2.crate) = 7419
+SHA256 (opencode/rust/crates/errno-0.3.14.crate) = 39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb
+SIZE (opencode/rust/crates/errno-0.3.14.crate) = 12002
+SHA256 (opencode/rust/crates/fastrand-2.3.0.crate) = 37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be
+SIZE (opencode/rust/crates/fastrand-2.3.0.crate) = 15076
+SHA256 (opencode/rust/crates/fff-notify-debouncer-full-0.9.4.crate) = 29a4ebea7b8a2840cd59358bbf396f6f04313ce8eae84ac79703ce80298b8731
+SIZE (opencode/rust/crates/fff-notify-debouncer-full-0.9.4.crate) = 34298
+SHA256 (opencode/rust/crates/file-id-0.2.3.crate) = e1fc6a637b6dc58414714eddd9170ff187ecb0933d4c7024d1abbd23a3cc26e9
+SIZE (opencode/rust/crates/file-id-0.2.3.crate) = 10148
+SHA256 (opencode/rust/crates/filedescriptor-0.8.3.crate) = e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d
+SIZE (opencode/rust/crates/filedescriptor-0.8.3.crate) = 12635
+SHA256 (opencode/rust/crates/find-msvc-tools-0.1.9.crate) = 5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582
+SIZE (opencode/rust/crates/find-msvc-tools-0.1.9.crate) = 31493
+SHA256 (opencode/rust/crates/fnv-1.0.7.crate) = 3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1
+SIZE (opencode/rust/crates/fnv-1.0.7.crate) = 11266
+SHA256 (opencode/rust/crates/foldhash-0.1.5.crate) = d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2
+SIZE (opencode/rust/crates/foldhash-0.1.5.crate) = 21901
+SHA256 (opencode/rust/crates/form_urlencoded-1.2.2.crate) = cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf
+SIZE (opencode/rust/crates/form_urlencoded-1.2.2.crate) = 9347
+SHA256 (opencode/rust/crates/fs2-0.4.3.crate) = 9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213
+SIZE (opencode/rust/crates/fs2-0.4.3.crate) = 13138
+SHA256 (opencode/rust/crates/futures-0.3.32.crate) = 8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d
+SIZE (opencode/rust/crates/futures-0.3.32.crate) = 61234
+SHA256 (opencode/rust/crates/futures-channel-0.3.32.crate) = 07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d
+SIZE (opencode/rust/crates/futures-channel-0.3.32.crate) = 33213
+SHA256 (opencode/rust/crates/futures-core-0.3.32.crate) = 7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d
+SIZE (opencode/rust/crates/futures-core-0.3.32.crate) = 14684
+SHA256 (opencode/rust/crates/futures-executor-0.3.32.crate) = baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d
+SIZE (opencode/rust/crates/futures-executor-0.3.32.crate) = 18581
+SHA256 (opencode/rust/crates/futures-io-0.3.32.crate) = cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718
+SIZE (opencode/rust/crates/futures-io-0.3.32.crate) = 9191
+SHA256 (opencode/rust/crates/futures-macro-0.3.32.crate) = e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b
+SIZE (opencode/rust/crates/futures-macro-0.3.32.crate) = 11929
+SHA256 (opencode/rust/crates/futures-sink-0.3.32.crate) = c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893
+SIZE (opencode/rust/crates/futures-sink-0.3.32.crate) = 8106
+SHA256 (opencode/rust/crates/futures-task-0.3.32.crate) = 037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393
+SIZE (opencode/rust/crates/futures-task-0.3.32.crate) = 11377
+SHA256 (opencode/rust/crates/futures-util-0.3.32.crate) = 389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6
+SIZE (opencode/rust/crates/futures-util-0.3.32.crate) = 168797
+SHA256 (opencode/rust/crates/generic-array-0.14.7.crate) = 85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a
+SIZE (opencode/rust/crates/generic-array-0.14.7.crate) = 15950
+SHA256 (opencode/rust/crates/getrandom-0.2.17.crate) = ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0
+SIZE (opencode/rust/crates/getrandom-0.2.17.crate) = 40780
+SHA256 (opencode/rust/crates/getrandom-0.3.4.crate) = 899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd
+SIZE (opencode/rust/crates/getrandom-0.3.4.crate) = 50932
+SHA256 (opencode/rust/crates/getrandom-0.4.2.crate) = 0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555
+SIZE (opencode/rust/crates/getrandom-0.4.2.crate) = 53905
+SHA256 (opencode/rust/crates/git2-0.21.0.crate) = ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e
+SIZE (opencode/rust/crates/git2-0.21.0.crate) = 242222
+SHA256 (opencode/rust/crates/glidesort-0.1.2.crate) = f2e102e6eb644d3e0b186fc161e4460417880a0a0b87d235f2e5b8fb30f2e9e0
+SIZE (opencode/rust/crates/glidesort-0.1.2.crate) = 33672
+SHA256 (opencode/rust/crates/glob-0.3.3.crate) = 0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280
+SIZE (opencode/rust/crates/glob-0.3.3.crate) = 22861
+SHA256 (opencode/rust/crates/globset-0.4.18.crate) = 52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3
+SIZE (opencode/rust/crates/globset-0.4.18.crate) = 28970
+SHA256 (opencode/rust/crates/half-2.7.1.crate) = 6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b
+SIZE (opencode/rust/crates/half-2.7.1.crate) = 61040
+SHA256 (opencode/rust/crates/hashbrown-0.15.5.crate) = 9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1
+SIZE (opencode/rust/crates/hashbrown-0.15.5.crate) = 140908
+SHA256 (opencode/rust/crates/hashbrown-0.16.1.crate) = 841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100
+SIZE (opencode/rust/crates/hashbrown-0.16.1.crate) = 147785
+SHA256 (opencode/rust/crates/heck-0.5.0.crate) = 2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea
+SIZE (opencode/rust/crates/heck-0.5.0.crate) = 11517
+SHA256 (opencode/rust/crates/heed-0.22.0.crate) = 6a56c94661ddfb51aa9cdfbf102cfcc340aa69267f95ebccc4af08d7c530d393
+SIZE (opencode/rust/crates/heed-0.22.0.crate) = 75150
+SHA256 (opencode/rust/crates/heed-traits-0.20.0.crate) = eb3130048d404c57ce5a1ac61a903696e8fcde7e8c2991e9fcfc1f27c3ef74ff
+SIZE (opencode/rust/crates/heed-traits-0.20.0.crate) = 3108
+SHA256 (opencode/rust/crates/heed-types-0.21.0.crate) = 13c255bdf46e07fb840d120a36dcc81f385140d7191c76a7391672675c01a55d
+SIZE (opencode/rust/crates/heed-types-0.21.0.crate) = 4898
+SHA256 (opencode/rust/crates/hermit-abi-0.5.2.crate) = fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c
+SIZE (opencode/rust/crates/hermit-abi-0.5.2.crate) = 17435
+SHA256 (opencode/rust/crates/iana-time-zone-0.1.65.crate) = e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470
+SIZE (opencode/rust/crates/iana-time-zone-0.1.65.crate) = 34079
+SHA256 (opencode/rust/crates/iana-time-zone-haiku-0.1.2.crate) = f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f
+SIZE (opencode/rust/crates/iana-time-zone-haiku-0.1.2.crate) = 7185
+SHA256 (opencode/rust/crates/icu_collections-2.1.1.crate) = 4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43
+SIZE (opencode/rust/crates/icu_collections-2.1.1.crate) = 87233
+SHA256 (opencode/rust/crates/icu_locale_core-2.1.1.crate) = edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6
+SIZE (opencode/rust/crates/icu_locale_core-2.1.1.crate) = 70876
+SHA256 (opencode/rust/crates/icu_normalizer-2.1.1.crate) = 5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599
+SIZE (opencode/rust/crates/icu_normalizer-2.1.1.crate) = 67132
+SHA256 (opencode/rust/crates/icu_normalizer_data-2.1.1.crate) = 7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a
+SIZE (opencode/rust/crates/icu_normalizer_data-2.1.1.crate) = 68649
+SHA256 (opencode/rust/crates/icu_properties-2.1.2.crate) = 020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec
+SIZE (opencode/rust/crates/icu_properties-2.1.2.crate) = 60136
+SHA256 (opencode/rust/crates/icu_properties_data-2.1.2.crate) = 616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af
+SIZE (opencode/rust/crates/icu_properties_data-2.1.2.crate) = 163057
+SHA256 (opencode/rust/crates/icu_provider-2.1.1.crate) = 85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614
+SIZE (opencode/rust/crates/icu_provider-2.1.1.crate) = 50907
+SHA256 (opencode/rust/crates/id-arena-2.3.0.crate) = 3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954
+SIZE (opencode/rust/crates/id-arena-2.3.0.crate) = 12883
+SHA256 (opencode/rust/crates/ident_case-1.0.1.crate) = b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39
+SIZE (opencode/rust/crates/ident_case-1.0.1.crate) = 3492
+SHA256 (opencode/rust/crates/idna-1.1.0.crate) = 3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de
+SIZE (opencode/rust/crates/idna-1.1.0.crate) = 148747
+SHA256 (opencode/rust/crates/idna_adapter-1.2.1.crate) = 3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344
+SIZE (opencode/rust/crates/idna_adapter-1.2.1.crate) = 10389
+SHA256 (opencode/rust/crates/ignore-0.4.25.crate) = d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a
+SIZE (opencode/rust/crates/ignore-0.4.25.crate) = 59154
+SHA256 (opencode/rust/crates/indexmap-2.13.0.crate) = 7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017
+SIZE (opencode/rust/crates/indexmap-2.13.0.crate) = 102206
+SHA256 (opencode/rust/crates/indoc-2.0.7.crate) = 79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706
+SIZE (opencode/rust/crates/indoc-2.0.7.crate) = 17184
+SHA256 (opencode/rust/crates/inotify-0.11.1.crate) = bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199
+SIZE (opencode/rust/crates/inotify-0.11.1.crate) = 29364
+SHA256 (opencode/rust/crates/inotify-sys-0.1.5.crate) = e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb
+SIZE (opencode/rust/crates/inotify-sys-0.1.5.crate) = 6965
+SHA256 (opencode/rust/crates/is-terminal-0.4.17.crate) = 3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46
+SIZE (opencode/rust/crates/is-terminal-0.4.17.crate) = 7458
+SHA256 (opencode/rust/crates/is_terminal_polyfill-1.70.2.crate) = a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695
+SIZE (opencode/rust/crates/is_terminal_polyfill-1.70.2.crate) = 7548
+SHA256 (opencode/rust/crates/itertools-0.10.5.crate) = b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473
+SIZE (opencode/rust/crates/itertools-0.10.5.crate) = 115354
+SHA256 (opencode/rust/crates/itertools-0.13.0.crate) = 413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186
+SIZE (opencode/rust/crates/itertools-0.13.0.crate) = 146261
+SHA256 (opencode/rust/crates/itoa-1.0.17.crate) = 92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2
+SIZE (opencode/rust/crates/itoa-1.0.17.crate) = 15905
+SHA256 (opencode/rust/crates/itoa-1.0.18.crate) = 8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682
+SIZE (opencode/rust/crates/itoa-1.0.18.crate) = 15935
+SHA256 (opencode/rust/crates/jobserver-0.1.34.crate) = 9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33
+SIZE (opencode/rust/crates/jobserver-0.1.34.crate) = 29013
+SHA256 (opencode/rust/crates/js-sys-0.3.91.crate) = b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c
+SIZE (opencode/rust/crates/js-sys-0.3.91.crate) = 91416
+SHA256 (opencode/rust/crates/kqueue-1.1.1.crate) = eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a
+SIZE (opencode/rust/crates/kqueue-1.1.1.crate) = 21504
+SHA256 (opencode/rust/crates/kqueue-sys-1.0.4.crate) = ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b
+SIZE (opencode/rust/crates/kqueue-sys-1.0.4.crate) = 7160
+SHA256 (opencode/rust/crates/lazy_static-1.5.0.crate) = bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe
+SIZE (opencode/rust/crates/lazy_static-1.5.0.crate) = 14025
+SHA256 (opencode/rust/crates/leb128fmt-0.1.0.crate) = 09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2
+SIZE (opencode/rust/crates/leb128fmt-0.1.0.crate) = 14138
+SHA256 (opencode/rust/crates/libc-0.2.183.crate) = b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d
+SIZE (opencode/rust/crates/libc-0.2.183.crate) = 816918
+SHA256 (opencode/rust/crates/libc-0.2.189.crate) = 3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2
+SIZE (opencode/rust/crates/libc-0.2.189.crate) = 851502
+SHA256 (opencode/rust/crates/libgit2-sys-0.18.7+1.9.6.crate) = 23c7391e4b9f4ffab1a624223cc1d7385ff9a678f490768add717de7ea2f4d89
+SIZE (opencode/rust/crates/libgit2-sys-0.18.7+1.9.6.crate) = 1961742
+SHA256 (opencode/rust/crates/libloading-0.8.9.crate) = d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55
+SIZE (opencode/rust/crates/libloading-0.8.9.crate) = 30222
+SHA256 (opencode/rust/crates/libmimalloc-sys-0.1.44.crate) = 667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870
+SIZE (opencode/rust/crates/libmimalloc-sys-0.1.44.crate) = 451625
+SHA256 (opencode/rust/crates/libredox-0.1.14.crate) = 1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a
+SIZE (opencode/rust/crates/libredox-0.1.14.crate) = 9536
+SHA256 (opencode/rust/crates/libz-sys-1.1.25.crate) = d52f4c29e2a68ac30c9087e1b772dc9f44a2b66ed44edf2266cf2be9b03dafc1
+SIZE (opencode/rust/crates/libz-sys-1.1.25.crate) = 880435
+SHA256 (opencode/rust/crates/linux-raw-sys-0.12.1.crate) = 32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53
+SIZE (opencode/rust/crates/linux-raw-sys-0.12.1.crate) = 3006116
+SHA256 (opencode/rust/crates/litemap-0.8.1.crate) = 6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77
+SIZE (opencode/rust/crates/litemap-0.8.1.crate) = 34172
+SHA256 (opencode/rust/crates/lmdb-master-sys-0.2.5.crate) = 864808e0b19fb6dd3b70ba94ee671b82fce17554cf80aeb0a155c65bb08027df
*** 981 LINES SKIPPED ***