mirror of
https://github.com/morluto/rea.git
synced 2026-11-15 03:02:56 +00:00
* feat(artifacts): inspect classic iNES container regions
* fix(artifacts): preserve iNES source disappearance as integrity failure
* fix(artifacts): revalidate iNES source before parsing header
* fix(artifacts): validate admitted roots before classification
* fix(artifacts): normalize source loss during root hashing
* fix(artifacts): bind iNES extraction admission to inventory
* test(artifacts): clarify non-executing inspection wording
* fix: preserve binary plist detection with extended magic probe
* test(browser): wait for popup document loads before capture
* fix(artifacts): honor cancellation across source validation
* fix(artifacts): prefer artifact magic over implicit database suffix
* fix(artifacts): select extraction readers from scanned format
* fix(artifacts): complete prefix reads and share ZIP format admission
* fix(browser): budget scenario cleanup for content drain and shutdown
* test(artifacts): admit valid universal inputs before routing
* test(artifacts): verify iNES workflows on macOS
* test(ci): own iNES macOS coverage and portable fixture paths
* fix: preserve cleanup retries and avoid duplicate inventory parsing
* fix(contracts): share ZIP target formats across MCP lifecycle schemas
* fix(target): preserve typed cancellation during descriptor admission
* refactor(artifacts): use JSON-safe inventory producer output directly
* test(artifacts): share file read setup and satisfy CI checks
* fix(artifacts): classify changed admission as integrity failure
* ci: run Mach-O summary delivery coverage on macOS
* test(javascript): align parameter provenance with main contract
* test(browser): await discoverable fixture pages before runtime verification
* fix(artifacts): pass target metadata to format detection
* fix(artifacts): bind extraction to opened target
* fix: repair the static-check failures on the default branch (#2895)
* fix: repair the static-check failures on the default branch
The default branch fails its own required `Static checks` job three ways, so
every pull request reports that job as failed regardless of its own change.
- `npm run format:check` reports `src/domain/functionComparison.test.ts` and
`src/ida/IdaOperationRunner.ts`.
- `npm run lint` reports a duplicate `import { join } from "node:path"` in
`tests/boundary/mcp/ghidraInventoryMcp.test.ts` (lines 4 and 17).
- `npm run typecheck` reports `format: "devin"` missing from the client format
union in `src/application/SupportedClients.ts`, and an unchecked index in
`tests/boundary/cli/clientProfileLifecycle.test.ts`, whose pair array is
inferred as `string[][]`.
Apply the pinned formatter, drop the duplicate import, list the `"devin"` format
that its own definition already uses, and mark the pair array `as const`.
Validation: `npm run check:fast` and `npm run format:check` pass.
* fix(setup): keep Devin on the JSON configuration dialect
---------
Co-authored-by: 吴佳浩 <wujiahao@supremind.com>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
(cherry picked from commit df3d96da80)
* fix(artifacts): bind session inventories to target identity
* test(browser): bound fixture readiness acknowledgements
---------
Co-authored-by: 64579525 <17373302683@163.com>
Co-authored-by: 吴佳浩Alben <35291372+XiaoBinGan@users.noreply.github.com>
Co-authored-by: 吴佳浩 <wujiahao@supremind.com>
78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
import type { AsarHeaderAdmission } from "../config/asarHeaderAdmission.js";
|
|
import { createHash } from "node:crypto";
|
|
import type { Readable } from "node:stream";
|
|
|
|
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
import { streamChunkToBuffer } from "./StreamBytes.js";
|
|
import {
|
|
createArtifactClassificationProbe,
|
|
type ArtifactClassificationEvidence,
|
|
} from "./ArtifactClassificationProbe.js";
|
|
|
|
/** Full stream digest and byte count with bounded classification evidence. */
|
|
export type HashResult = ArtifactClassificationEvidence & {
|
|
readonly sha256: string;
|
|
readonly bytes: number;
|
|
readonly md5?: string;
|
|
};
|
|
|
|
/** Preserve the inventory cancellation reason at a stream boundary. */
|
|
export const abortIfNeeded = (signal?: AbortSignal): void => {
|
|
if (signal?.aborted === true)
|
|
throw new ArtifactReaderFailure(
|
|
"cancelled",
|
|
"Artifact inventory cancelled",
|
|
{ cause: signal.reason },
|
|
);
|
|
};
|
|
|
|
/** Hash every stream byte, optionally feeding the same bytes to a scan aggregate. */
|
|
export const hashReadable = async (
|
|
stream: Readable,
|
|
signal?: AbortSignal,
|
|
integrityAlgorithm?: "sha256" | "md5",
|
|
asarHeaderAdmission?: AsarHeaderAdmission,
|
|
observeChunk?: (chunk: Buffer) => void,
|
|
): Promise<HashResult> => {
|
|
const completed = await hashReadableToCompletion(
|
|
stream,
|
|
signal,
|
|
integrityAlgorithm,
|
|
asarHeaderAdmission,
|
|
observeChunk,
|
|
);
|
|
abortIfNeeded(signal);
|
|
return completed;
|
|
};
|
|
|
|
/** Keep a fully delivered digest so its owner can validate before late cancellation.
|
|
* Source stability remains the stream or caller's responsibility.
|
|
*/
|
|
export const hashReadableToCompletion = async (
|
|
stream: Readable,
|
|
signal?: AbortSignal,
|
|
integrityAlgorithm?: "sha256" | "md5",
|
|
asarHeaderAdmission?: AsarHeaderAdmission,
|
|
observeChunk?: (chunk: Buffer) => void,
|
|
): Promise<HashResult> => {
|
|
const hash = createHash("sha256");
|
|
const md5 = integrityAlgorithm === "md5" ? createHash("md5") : undefined;
|
|
const probe = createArtifactClassificationProbe(asarHeaderAdmission);
|
|
let bytes = 0;
|
|
for await (const raw of stream) {
|
|
abortIfNeeded(signal);
|
|
const chunk = streamChunkToBuffer(raw);
|
|
bytes += chunk.length;
|
|
hash.update(chunk);
|
|
observeChunk?.(chunk);
|
|
md5?.update(chunk);
|
|
probe.write(chunk);
|
|
}
|
|
return {
|
|
sha256: hash.digest("hex"),
|
|
...(md5 === undefined ? {} : { md5: md5.digest("hex") }),
|
|
bytes,
|
|
...probe.finish(bytes),
|
|
};
|
|
};
|