agent-hitch 0.1.1 → 0.2.1
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/README.md +235 -132
- package/README.zh-CN.md +335 -0
- package/dist/bin/hitch.js +9 -0
- package/dist/bin/hitch.js.map +1 -0
- package/dist/scripts/check-architecture.js +159 -0
- package/dist/scripts/check-architecture.js.map +1 -0
- package/dist/scripts/check-release.js +25 -0
- package/dist/scripts/check-release.js.map +1 -0
- package/dist/scripts/check-syntax.js +32 -0
- package/dist/scripts/check-syntax.js.map +1 -0
- package/dist/src/adapters/catalog.js +55 -0
- package/dist/src/adapters/catalog.js.map +1 -0
- package/dist/src/adapters/contract.js +2 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/discovery.js +22 -0
- package/dist/src/adapters/discovery.js.map +1 -0
- package/dist/src/adapters/index.js +3 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/providers/claude.js +69 -0
- package/dist/src/adapters/providers/claude.js.map +1 -0
- package/dist/src/adapters/providers/codex.js +74 -0
- package/dist/src/adapters/providers/codex.js.map +1 -0
- package/dist/src/adapters/providers/deepseek.js +51 -0
- package/dist/src/adapters/providers/deepseek.js.map +1 -0
- package/dist/src/adapters/providers/opencode.js +73 -0
- package/dist/src/adapters/providers/opencode.js.map +1 -0
- package/dist/src/adapters/providers/pi.js +82 -0
- package/dist/src/adapters/providers/pi.js.map +1 -0
- package/dist/src/adapters/providers/shared.js +82 -0
- package/dist/src/adapters/providers/shared.js.map +1 -0
- package/dist/src/artifacts/index.js +3 -0
- package/dist/src/artifacts/index.js.map +1 -0
- package/dist/src/artifacts/integrity.js +188 -0
- package/dist/src/artifacts/integrity.js.map +1 -0
- package/dist/src/artifacts/preparer.js +379 -0
- package/dist/src/artifacts/preparer.js.map +1 -0
- package/dist/src/artifacts/store.js +87 -0
- package/dist/src/artifacts/store.js.map +1 -0
- package/dist/src/artifacts/types.js +2 -0
- package/dist/src/artifacts/types.js.map +1 -0
- package/dist/src/backends/contract.js +2 -0
- package/dist/src/backends/contract.js.map +1 -0
- package/dist/src/backends/harbor/backend.js +305 -0
- package/dist/src/backends/harbor/backend.js.map +1 -0
- package/dist/src/backends/harbor/index.js +4 -0
- package/dist/src/backends/harbor/index.js.map +1 -0
- package/dist/src/backends/harbor/local-git-transport.js +447 -0
- package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
- package/dist/src/backends/harbor/tools.js +314 -0
- package/dist/src/backends/harbor/tools.js.map +1 -0
- package/dist/src/backends/index.js +4 -0
- package/dist/src/backends/index.js.map +1 -0
- package/dist/src/cli/arguments.js +123 -0
- package/dist/src/cli/arguments.js.map +1 -0
- package/dist/src/cli/commands/compare.js +55 -0
- package/dist/src/cli/commands/compare.js.map +1 -0
- package/dist/src/cli/commands/daemon.js +106 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/eval.js +126 -0
- package/dist/src/cli/commands/eval.js.map +1 -0
- package/dist/src/cli/commands/feedback.js +84 -0
- package/dist/src/cli/commands/feedback.js.map +1 -0
- package/dist/src/cli/commands/inspect.js +20 -0
- package/dist/src/cli/commands/inspect.js.map +1 -0
- package/dist/src/cli/commands/list.js +17 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/prepare.js +21 -0
- package/dist/src/cli/commands/prepare.js.map +1 -0
- package/dist/src/cli/commands/resolve.js +17 -0
- package/dist/src/cli/commands/resolve.js.map +1 -0
- package/dist/src/cli/commands/run.js +83 -0
- package/dist/src/cli/commands/run.js.map +1 -0
- package/dist/src/cli/commands/runs.js +45 -0
- package/dist/src/cli/commands/runs.js.map +1 -0
- package/dist/src/cli/commands/trajectory.js +31 -0
- package/dist/src/cli/commands/trajectory.js.map +1 -0
- package/dist/src/cli/commands/workspace.js +44 -0
- package/dist/src/cli/commands/workspace.js.map +1 -0
- package/dist/src/cli/index.js +2 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/main.js +48 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/output.js +96 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/controller-runtime/hash.js +353 -0
- package/dist/src/controller-runtime/hash.js.map +1 -0
- package/dist/src/controller-runtime/index.js +3 -0
- package/dist/src/controller-runtime/index.js.map +1 -0
- package/dist/src/controller-runtime/store.js +318 -0
- package/dist/src/controller-runtime/store.js.map +1 -0
- package/dist/src/daemon/auth.js +108 -0
- package/dist/src/daemon/auth.js.map +1 -0
- package/dist/src/daemon/client.js +76 -0
- package/dist/src/daemon/client.js.map +1 -0
- package/dist/src/daemon/index.js +5 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/launcher.js +24 -0
- package/dist/src/daemon/launcher.js.map +1 -0
- package/dist/src/daemon/scheduler.js +161 -0
- package/dist/src/daemon/scheduler.js.map +1 -0
- package/dist/src/daemon/server.js +316 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/domain/artifacts.js +2 -0
- package/dist/src/domain/artifacts.js.map +1 -0
- package/dist/src/domain/controller-runtime.js +2 -0
- package/dist/src/domain/controller-runtime.js.map +1 -0
- package/dist/src/domain/eval-records.js +2 -0
- package/dist/src/domain/eval-records.js.map +1 -0
- package/dist/src/domain/evals.js +2 -0
- package/dist/src/domain/evals.js.map +1 -0
- package/dist/src/domain/feedback.js +2 -0
- package/dist/src/domain/feedback.js.map +1 -0
- package/dist/src/domain/ids.js +10 -0
- package/dist/src/domain/ids.js.map +1 -0
- package/dist/src/domain/index.js +11 -0
- package/dist/src/domain/index.js.map +1 -0
- package/dist/src/domain/revisions.js +2 -0
- package/dist/src/domain/revisions.js.map +1 -0
- package/dist/src/domain/runs.js +3 -0
- package/dist/src/domain/runs.js.map +1 -0
- package/dist/src/domain/trajectories.js +2 -0
- package/dist/src/domain/trajectories.js.map +1 -0
- package/dist/src/domain/validation.js +429 -0
- package/dist/src/domain/validation.js.map +1 -0
- package/dist/src/domain/workspaces.js +2 -0
- package/dist/src/domain/workspaces.js.map +1 -0
- package/dist/src/evals/events.js +67 -0
- package/dist/src/evals/events.js.map +1 -0
- package/dist/src/evals/index.js +5 -0
- package/dist/src/evals/index.js.map +1 -0
- package/dist/src/evals/records.js +55 -0
- package/dist/src/evals/records.js.map +1 -0
- package/dist/src/evals/request.js +109 -0
- package/dist/src/evals/request.js.map +1 -0
- package/dist/src/evals/service.js +227 -0
- package/dist/src/evals/service.js.map +1 -0
- package/dist/src/evals/trial-import.js +394 -0
- package/dist/src/evals/trial-import.js.map +1 -0
- package/dist/src/feedback/index.js +2 -0
- package/dist/src/feedback/index.js.map +1 -0
- package/dist/src/feedback/service.js +314 -0
- package/dist/src/feedback/service.js.map +1 -0
- package/dist/src/foundation/config.js +54 -0
- package/dist/src/foundation/config.js.map +1 -0
- package/dist/src/foundation/errors.js +14 -0
- package/dist/src/foundation/errors.js.map +1 -0
- package/dist/src/foundation/executable.js +135 -0
- package/dist/src/foundation/executable.js.map +1 -0
- package/dist/src/foundation/fs.js +45 -0
- package/dist/src/foundation/fs.js.map +1 -0
- package/dist/src/foundation/hash.js +24 -0
- package/dist/src/foundation/hash.js.map +1 -0
- package/dist/src/foundation/index.js +11 -0
- package/dist/src/foundation/index.js.map +1 -0
- package/dist/src/foundation/line-stream.js +20 -0
- package/dist/src/foundation/line-stream.js.map +1 -0
- package/dist/src/foundation/locks.js +114 -0
- package/dist/src/foundation/locks.js.map +1 -0
- package/dist/src/foundation/package-root.js +41 -0
- package/dist/src/foundation/package-root.js.map +1 -0
- package/dist/src/foundation/process.js +50 -0
- package/dist/src/foundation/process.js.map +1 -0
- package/dist/src/revisions/index.js +4 -0
- package/dist/src/revisions/index.js.map +1 -0
- package/dist/src/revisions/reference.js +97 -0
- package/dist/src/revisions/reference.js.map +1 -0
- package/dist/src/revisions/resolver.js +25 -0
- package/dist/src/revisions/resolver.js.map +1 -0
- package/dist/src/revisions/sources/git.js +180 -0
- package/dist/src/revisions/sources/git.js.map +1 -0
- package/dist/src/revisions/sources/installed.js +45 -0
- package/dist/src/revisions/sources/installed.js.map +1 -0
- package/dist/src/revisions/sources/npm.js +97 -0
- package/dist/src/revisions/sources/npm.js.map +1 -0
- package/dist/src/runs/compare.js +132 -0
- package/dist/src/runs/compare.js.map +1 -0
- package/dist/src/runs/events.js +79 -0
- package/dist/src/runs/events.js.map +1 -0
- package/dist/src/runs/executor.js +480 -0
- package/dist/src/runs/executor.js.map +1 -0
- package/dist/src/runs/finalizer.js +22 -0
- package/dist/src/runs/finalizer.js.map +1 -0
- package/dist/src/runs/identity.js +35 -0
- package/dist/src/runs/identity.js.map +1 -0
- package/dist/src/runs/index.js +11 -0
- package/dist/src/runs/index.js.map +1 -0
- package/dist/src/runs/manifest.js +70 -0
- package/dist/src/runs/manifest.js.map +1 -0
- package/dist/src/runs/outcome.js +49 -0
- package/dist/src/runs/outcome.js.map +1 -0
- package/dist/src/runs/query.js +104 -0
- package/dist/src/runs/query.js.map +1 -0
- package/dist/src/runs/queued.js +54 -0
- package/dist/src/runs/queued.js.map +1 -0
- package/dist/src/runs/records.js +288 -0
- package/dist/src/runs/records.js.map +1 -0
- package/dist/src/runs/request.js +169 -0
- package/dist/src/runs/request.js.map +1 -0
- package/dist/src/trajectories/contract.js +17 -0
- package/dist/src/trajectories/contract.js.map +1 -0
- package/dist/src/trajectories/format.js +127 -0
- package/dist/src/trajectories/format.js.map +1 -0
- package/dist/src/trajectories/index.js +7 -0
- package/dist/src/trajectories/index.js.map +1 -0
- package/dist/src/trajectories/projector.js +385 -0
- package/dist/src/trajectories/projector.js.map +1 -0
- package/dist/src/trajectories/provider-capture.js +133 -0
- package/dist/src/trajectories/provider-capture.js.map +1 -0
- package/dist/src/trajectories/providers/deepseek.js +179 -0
- package/dist/src/trajectories/providers/deepseek.js.map +1 -0
- package/dist/src/trajectories/store.js +421 -0
- package/dist/src/trajectories/store.js.map +1 -0
- package/dist/src/workspaces/copy.js +142 -0
- package/dist/src/workspaces/copy.js.map +1 -0
- package/dist/src/workspaces/digest.js +47 -0
- package/dist/src/workspaces/digest.js.map +1 -0
- package/dist/src/workspaces/git.js +164 -0
- package/dist/src/workspaces/git.js.map +1 -0
- package/dist/src/workspaces/index.js +6 -0
- package/dist/src/workspaces/index.js.map +1 -0
- package/dist/src/workspaces/lifecycle.js +313 -0
- package/dist/src/workspaces/lifecycle.js.map +1 -0
- package/dist/src/workspaces/planner.js +80 -0
- package/dist/src/workspaces/planner.js.map +1 -0
- package/dist/src/workspaces/store.js +25 -0
- package/dist/src/workspaces/store.js.map +1 -0
- package/dist/src/workspaces/types.js +4 -0
- package/dist/src/workspaces/types.js.map +1 -0
- package/dist/src/workspaces/utils.js +56 -0
- package/dist/src/workspaces/utils.js.map +1 -0
- package/docs/schemas/controller-runtime-manifest.schema.json +57 -0
- package/docs/schemas/controller-runtime-ref.schema.json +16 -0
- package/docs/schemas/eval-request.schema.json +2 -0
- package/docs/schemas/eval-result.schema.json +36 -1
- package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
- package/docs/schemas/message-feedback.schema.json +37 -0
- package/docs/schemas/result.schema.json +9 -0
- package/docs/schemas/run-context.schema.json +39 -0
- package/docs/schemas/run-manifest.schema.json +81 -0
- package/docs/schemas/run-request.schema.json +16 -1
- package/docs/schemas/trajectory-ref.schema.json +73 -0
- package/integrations/harbor/hitch_harbor_agent.py +551 -5
- package/package.json +37 -11
- package/bin/hitch.js +0 -9
- package/src/adapters.js +0 -435
- package/src/artifacts.js +0 -949
- package/src/cli.js +0 -505
- package/src/config.js +0 -51
- package/src/daemon.js +0 -416
- package/src/engine.js +0 -400
- package/src/errors.js +0 -12
- package/src/eval-tools.js +0 -334
- package/src/evals.js +0 -276
- package/src/events.js +0 -69
- package/src/fs.js +0 -43
- package/src/harbor-backend.js +0 -285
- package/src/harness-reference.js +0 -78
- package/src/line-stream.js +0 -17
- package/src/locks.js +0 -33
- package/src/process.js +0 -49
- package/src/registry.js +0 -84
- package/src/scheduler.js +0 -156
- package/src/workspaces.js +0 -893
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { defaultRoot, invalidInput, packageVersion as readPackageVersion } from "../foundation/index.js";
|
|
3
|
+
import { takeOption } from "./arguments.js";
|
|
4
|
+
import { helpText } from "./output.js";
|
|
5
|
+
import { runsCommand } from "./commands/runs.js";
|
|
6
|
+
import { compareCommand } from "./commands/compare.js";
|
|
7
|
+
import { listCommand } from "./commands/list.js";
|
|
8
|
+
import { inspectCommand } from "./commands/inspect.js";
|
|
9
|
+
import { resolveCommand } from "./commands/resolve.js";
|
|
10
|
+
import { prepareCommand } from "./commands/prepare.js";
|
|
11
|
+
import { runCommand } from "./commands/run.js";
|
|
12
|
+
import { evalCommand } from "./commands/eval.js";
|
|
13
|
+
import { workspaceCommand } from "./commands/workspace.js";
|
|
14
|
+
import { trajectoryCommand } from "./commands/trajectory.js";
|
|
15
|
+
import { feedbackCommand } from "./commands/feedback.js";
|
|
16
|
+
import { daemonCommand } from "./commands/daemon.js";
|
|
17
|
+
export async function main(argv) {
|
|
18
|
+
const args = [...argv];
|
|
19
|
+
const root = path.resolve(takeOption(args, "--root") || defaultRoot());
|
|
20
|
+
const command = args.shift();
|
|
21
|
+
switch (command) {
|
|
22
|
+
case "list": return listCommand(args);
|
|
23
|
+
case "inspect": return inspectCommand(args, root);
|
|
24
|
+
case "resolve": return resolveCommand(args, root);
|
|
25
|
+
case "prepare": return prepareCommand(args, root);
|
|
26
|
+
case "run": return runCommand(args, root);
|
|
27
|
+
case "runs": return runsCommand(args, root);
|
|
28
|
+
case "compare": return compareCommand(args, root);
|
|
29
|
+
case "eval": return evalCommand(args, root);
|
|
30
|
+
case "workspace": return workspaceCommand(args, root);
|
|
31
|
+
case "trajectory": return trajectoryCommand(args, root);
|
|
32
|
+
case "feedback": return feedbackCommand(args, root);
|
|
33
|
+
case "daemon": return daemonCommand(args, root);
|
|
34
|
+
case "help":
|
|
35
|
+
case "--help":
|
|
36
|
+
case "-h":
|
|
37
|
+
case undefined:
|
|
38
|
+
process.stdout.write(helpText());
|
|
39
|
+
return;
|
|
40
|
+
case "--version":
|
|
41
|
+
case "-V":
|
|
42
|
+
process.stdout.write(`hitch ${readPackageVersion()}\n`);
|
|
43
|
+
return;
|
|
44
|
+
default:
|
|
45
|
+
throw invalidInput(`unknown command: ${command}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { delay } from "../foundation/index.js";
|
|
2
|
+
export function revisionLabel(resolved) {
|
|
3
|
+
if (resolved.revision.type === "commit")
|
|
4
|
+
return resolved.revision.commit || "";
|
|
5
|
+
if (resolved.revision.type === "version")
|
|
6
|
+
return resolved.revision.version || "";
|
|
7
|
+
return resolved.revision.version || resolved.source.integrity || "";
|
|
8
|
+
}
|
|
9
|
+
export async function waitForDaemonRun(client, runId, output) {
|
|
10
|
+
let eventOffset = 0;
|
|
11
|
+
for (;;) {
|
|
12
|
+
const status = await client.request(`/v1/runs/${runId}`);
|
|
13
|
+
if (output === "jsonl") {
|
|
14
|
+
try {
|
|
15
|
+
const response = await client.requestWithMetadata(`/v1/runs/${runId}/events?offset=${eventOffset}`);
|
|
16
|
+
const raw = response.payload;
|
|
17
|
+
for (const line of String(raw).trim().split(/\r?\n/).filter(Boolean)) {
|
|
18
|
+
JSON.parse(line);
|
|
19
|
+
process.stdout.write(`${line}\n`);
|
|
20
|
+
}
|
|
21
|
+
eventOffset = Number(response.headers.get("x-hitch-next-offset") || eventOffset);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error.status !== 404)
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (status.result) {
|
|
29
|
+
if (output === "json")
|
|
30
|
+
process.stdout.write(`${JSON.stringify(status.result, null, 2)}\n`);
|
|
31
|
+
return status.result;
|
|
32
|
+
}
|
|
33
|
+
await delay(200);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function helpText() {
|
|
37
|
+
return `Hitch — content-addressed version control and evidence storage for agent harnesses
|
|
38
|
+
|
|
39
|
+
Usage:
|
|
40
|
+
hitch list [--json]
|
|
41
|
+
hitch inspect <harness> [--json]
|
|
42
|
+
hitch resolve <harness-ref> [--json]
|
|
43
|
+
hitch prepare <harness-ref> [--json]
|
|
44
|
+
hitch run --harness <ref> [--model <id>] [--context-file <json>] [--workspace-mode <mode>] --prompt <text> [--daemon]
|
|
45
|
+
hitch runs list [filters] [--json]
|
|
46
|
+
hitch runs inspect <run-id> [--json]
|
|
47
|
+
hitch runs rebuild-index [--json]
|
|
48
|
+
hitch compare model|harness [filters] [--reference-run <run-id>] [--json]
|
|
49
|
+
hitch eval setup harbor [--version <version>] [--python <path>] [--force] [--json]
|
|
50
|
+
hitch eval doctor [--harbor <path>] [--python <path>] [--docker <path>] [--json]
|
|
51
|
+
hitch eval run [--backend harbor] --dataset <ref> --harness <immutable-ref> [--model <id>] [--attempts <n>]
|
|
52
|
+
hitch eval list [--json]
|
|
53
|
+
hitch eval inspect <eval-id> [--json]
|
|
54
|
+
hitch workspace inspect <run-id> [--json]
|
|
55
|
+
hitch workspace path <run-id>
|
|
56
|
+
hitch workspace remove <run-id> [--force] [--json]
|
|
57
|
+
hitch trajectory inspect <run-id> [--json]
|
|
58
|
+
hitch feedback list <run-id> [--json]
|
|
59
|
+
hitch feedback put <run-id> --message <id> --rating positive|negative [--note <text>] [--if-version <v>] [--json]
|
|
60
|
+
hitch feedback delete <run-id> --message <id> [--if-version <v>] [--json]
|
|
61
|
+
hitch daemon start [--foreground] [--port <port>] [--max-concurrent <n>]
|
|
62
|
+
hitch daemon stop | status [--json] | logs [-n <lines>]
|
|
63
|
+
hitch daemon submit --harness <ref> --prompt <text> [--workspace-mode <mode>] [--wait]
|
|
64
|
+
hitch daemon cancel <run-id>
|
|
65
|
+
|
|
66
|
+
Eval:
|
|
67
|
+
Harbor runs each task in Docker; Hitch executes the selected harness inside that task container.
|
|
68
|
+
Use 'hitch eval setup harbor' for an isolated managed install and 'hitch eval doctor' to verify it.
|
|
69
|
+
Eval accepts exact version:, registered commit:, or full lowercase local git+file commit refs.
|
|
70
|
+
Local Git evals transport only committed Git objects; the source repository must be clean.
|
|
71
|
+
Use --pass-env NAME for extra credentials.
|
|
72
|
+
Every eval references a shared read-only controller runtime bundle by SHA-256 id
|
|
73
|
+
(see 'hitch eval inspect' for the runtime storage kind).
|
|
74
|
+
|
|
75
|
+
Trajectory and feedback:
|
|
76
|
+
Structured adapters preserve provider-native events plus a DSH-compatible canonical view
|
|
77
|
+
under runs/<run>/trajectory/, bound by trajectory.ref.json V2 checksums.
|
|
78
|
+
Message feedback is a lifecycle-bound sidecar.
|
|
79
|
+
|
|
80
|
+
Workspace modes:
|
|
81
|
+
shared Use the source directory directly (compatibility default)
|
|
82
|
+
worktree Create a detached worktree from a clean Git HEAD
|
|
83
|
+
copy Copy the current filesystem state into an independent workspace
|
|
84
|
+
|
|
85
|
+
Harness refs:
|
|
86
|
+
codex Installed executable (compatibility default)
|
|
87
|
+
codex@installed Installed executable
|
|
88
|
+
codex@version:0.42.1 Exact published version
|
|
89
|
+
codex@commit:abc1234 Commit from the registered Git source
|
|
90
|
+
codex@git+file:///src#abc1234 Commit from a clean local Git repository
|
|
91
|
+
|
|
92
|
+
Global:
|
|
93
|
+
--root <path> Relocate all Hitch state (default: ~/.hitch)
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,QAAkH;IAC9I,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IAC/E,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;IACjF,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA8O,EAAE,KAAa,EAAE,MAAc;IAClT,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,YAAY,KAAK,kBAAkB,WAAW,EAAE,CAAC,CAAC;gBACpG,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;gBAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBACrE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;gBACpC,CAAC;gBACD,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,WAAW,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA6B,CAAC,MAAM,KAAK,GAAG;oBAAE,MAAM,KAAK,CAAC;YACjE,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3F,OAAO,MAAM,CAAC,MAAiC,CAAC;QAClD,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controller runtime bundle: canonical hashing, manifest construction, and
|
|
3
|
+
* integrity verification (spec §4).
|
|
4
|
+
*
|
|
5
|
+
* The runtime identity is a content-addressed SHA-256 over an explicit
|
|
6
|
+
* allowlist of compiled payload files, excluding cache path, source path,
|
|
7
|
+
* mtime, uid/gid, creation time, and host-specific metadata. The executable
|
|
8
|
+
* bit is included.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { lstat, readdir } from "node:fs/promises";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
export const RUNTIME_SCHEMA_VERSION = "2";
|
|
14
|
+
export const RUNTIME_NODE_RANGE = ">=22";
|
|
15
|
+
/**
|
|
16
|
+
* Directories of the compiled payload that are part of every runtime. This is
|
|
17
|
+
* the execution closure the Harbor bridge actually runs — not a mechanical
|
|
18
|
+
* copy of the published package. Runtime tooling (`dist/scripts`, release
|
|
19
|
+
* checkers) is deliberately excluded so editing a release script never changes
|
|
20
|
+
* a controller `runtime_id` (spec §4.4).
|
|
21
|
+
*/
|
|
22
|
+
export const RUNTIME_PAYLOAD_DIRECTORIES = ["dist/bin", "dist/src"];
|
|
23
|
+
/**
|
|
24
|
+
* The declared CLI entrypoint, relative to the upload root (`/opt/hitch`).
|
|
25
|
+
* The bridge reads this from the manifest instead of hardcoding the TypeScript
|
|
26
|
+
* build layout (spec §4.3, §8.5).
|
|
27
|
+
*/
|
|
28
|
+
export const RUNTIME_CLI_ENTRYPOINT = "dist/bin/hitch.js";
|
|
29
|
+
/** The compiled payload allowlist. V1 keeps zero runtime npm dependencies. */
|
|
30
|
+
export const RUNTIME_PAYLOAD_RULES = [
|
|
31
|
+
{ path: "package.json" },
|
|
32
|
+
...RUNTIME_PAYLOAD_DIRECTORIES.map((directory) => ({ directory })),
|
|
33
|
+
];
|
|
34
|
+
export class ControllerRuntimeIntegrityError extends Error {
|
|
35
|
+
constructor(message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = "ControllerRuntimeIntegrityError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute the canonical runtime identity and manifest for a payload tree.
|
|
42
|
+
* Validates the allowlist, rejects undeclared/special files, and hashes each
|
|
43
|
+
* file's original bytes. The `entrypoints` declaration participates in the
|
|
44
|
+
* canonical `runtime_id` hash (spec §4.4).
|
|
45
|
+
*/
|
|
46
|
+
export async function hashRuntimePayload(input) {
|
|
47
|
+
const rules = input.rules || RUNTIME_PAYLOAD_RULES;
|
|
48
|
+
const declared = await enumerateAllowlist(input.payloadRoot, rules);
|
|
49
|
+
const files = await hashDeclaredFiles(input.payloadRoot, declared);
|
|
50
|
+
// Entrypoints are recorded as executable regardless of the build-time mode;
|
|
51
|
+
// promotion sets them to 0555 (spec §4.5). Any byte or executable-bit
|
|
52
|
+
// change after promotion then fails integrity verification (spec §11.1).
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
if (isEntrypointPath(file.path))
|
|
55
|
+
file.executable = true;
|
|
56
|
+
}
|
|
57
|
+
const entrypoints = {
|
|
58
|
+
cli: { path: RUNTIME_CLI_ENTRYPOINT, launcher: "node" },
|
|
59
|
+
};
|
|
60
|
+
const canonical = canonicalEncodeManifest({ entrypoints, files });
|
|
61
|
+
const runtimeId = createHash("sha256").update(canonical).digest("hex");
|
|
62
|
+
const created_at = new Date().toISOString();
|
|
63
|
+
const manifest = {
|
|
64
|
+
schema_version: RUNTIME_SCHEMA_VERSION,
|
|
65
|
+
runtime_id: `sha256:${runtimeId}`,
|
|
66
|
+
node_range: RUNTIME_NODE_RANGE,
|
|
67
|
+
entrypoints,
|
|
68
|
+
files,
|
|
69
|
+
created_at,
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
manifest,
|
|
73
|
+
runtimeId: `sha256:${runtimeId}`,
|
|
74
|
+
fileCount: files.length,
|
|
75
|
+
totalBytes: files.reduce((sum, file) => sum + file.size, 0),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* True when a payload path is THE declared CLI entrypoint. Only
|
|
80
|
+
* `entrypoints.cli.path` is marked executable after promotion; sibling files
|
|
81
|
+
* in the same directory (e.g. `.map` sources) stay non-executable (spec §4.5).
|
|
82
|
+
*/
|
|
83
|
+
export function isEntrypointPath(normalizedPath) {
|
|
84
|
+
return normalizedPath === RUNTIME_CLI_ENTRYPOINT;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Enumerate the explicit allowlist into normalized declared paths, rejecting
|
|
88
|
+
* symlinks, hardlinks, devices, FIFOs, sockets, path traversal, duplicate
|
|
89
|
+
* paths, and undeclared files (spec §4.4.2).
|
|
90
|
+
*/
|
|
91
|
+
export async function enumerateAllowlist(payloadRoot, rules) {
|
|
92
|
+
const root = path.resolve(payloadRoot);
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
const declared = [];
|
|
95
|
+
const push = (rawPath) => {
|
|
96
|
+
const normalized = normalizePath(rawPath);
|
|
97
|
+
if (!normalized || normalized === "." || normalized.startsWith("..") || normalized.startsWith("/")) {
|
|
98
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload path escapes the payload root: ${rawPath}`);
|
|
99
|
+
}
|
|
100
|
+
if (seen.has(normalized)) {
|
|
101
|
+
throw new ControllerRuntimeIntegrityError(`duplicate runtime payload path: ${normalized}`);
|
|
102
|
+
}
|
|
103
|
+
seen.add(normalized);
|
|
104
|
+
};
|
|
105
|
+
const infoByPath = new Map();
|
|
106
|
+
for (const rule of rules) {
|
|
107
|
+
const rulePath = rule.path || rule.directory || "";
|
|
108
|
+
const absolute = path.resolve(root, rulePath);
|
|
109
|
+
if (absolute !== root && !isWithin(root, absolute)) {
|
|
110
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload rule escapes the payload root: ${rulePath}`);
|
|
111
|
+
}
|
|
112
|
+
let info;
|
|
113
|
+
try {
|
|
114
|
+
info = await lstat(absolute);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload rule is missing: ${rulePath}`);
|
|
118
|
+
}
|
|
119
|
+
if (info.isDirectory()) {
|
|
120
|
+
await walkDirectory(root, absolute, rulePath, push, infoByPath, rule.executable === true);
|
|
121
|
+
}
|
|
122
|
+
else if (info.isFile()) {
|
|
123
|
+
push(rulePath);
|
|
124
|
+
infoByPath.set(normalizePath(rulePath), { size: info.size, executable: rule.executable === true || isExecutableMode(info.mode) });
|
|
125
|
+
}
|
|
126
|
+
else if (info.isSymbolicLink()) {
|
|
127
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain symlinks: ${rulePath}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain special files: ${rulePath}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Reject undeclared files inside the allowlisted payload trees. The payload
|
|
134
|
+
// root itself may contain non-payload files (docs, tests, tooling) that are
|
|
135
|
+
// not part of the runtime bundle, so only declared trees are scanned here;
|
|
136
|
+
// the staged payload (which contains only allowlisted content) is scanned
|
|
137
|
+
// again during verification (spec §4.4.2, §4.6).
|
|
138
|
+
for (const rule of rules) {
|
|
139
|
+
const rulePath = rule.path || rule.directory || "";
|
|
140
|
+
if (!rulePath)
|
|
141
|
+
continue;
|
|
142
|
+
const absolute = path.resolve(root, ...rulePath.split("/"));
|
|
143
|
+
const relative = normalizePath(rulePath);
|
|
144
|
+
const info = await lstat(absolute);
|
|
145
|
+
if (info.isDirectory()) {
|
|
146
|
+
await rejectUndeclaredFiles(root, absolute, relative, seen, new Set());
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
for (const normalized of [...seen].sort(compareUtf8)) {
|
|
150
|
+
const meta = infoByPath.get(normalized);
|
|
151
|
+
if (!meta)
|
|
152
|
+
throw new ControllerRuntimeIntegrityError(`declared payload file has no metadata: ${normalized}`);
|
|
153
|
+
declared.push({
|
|
154
|
+
path: normalized,
|
|
155
|
+
size: meta.size,
|
|
156
|
+
executable: meta.executable,
|
|
157
|
+
sha256: "",
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return declared;
|
|
161
|
+
}
|
|
162
|
+
async function walkDirectory(root, absolute, relative, push, infoByPath, forceExecutable) {
|
|
163
|
+
const entries = await readdir(absolute, { withFileTypes: true });
|
|
164
|
+
entries.sort((left, right) => compareUtf8(left.name, right.name));
|
|
165
|
+
for (const entry of entries) {
|
|
166
|
+
const childAbsolute = path.join(absolute, entry.name);
|
|
167
|
+
const childRelative = relative ? `${relative}/${entry.name}` : entry.name;
|
|
168
|
+
const info = await lstat(childAbsolute);
|
|
169
|
+
if (info.isDirectory()) {
|
|
170
|
+
await walkDirectory(root, childAbsolute, childRelative, push, infoByPath, forceExecutable);
|
|
171
|
+
}
|
|
172
|
+
else if (info.isFile()) {
|
|
173
|
+
push(childRelative);
|
|
174
|
+
infoByPath.set(normalizePath(childRelative), {
|
|
175
|
+
size: info.size,
|
|
176
|
+
executable: forceExecutable || isExecutableMode(info.mode),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else if (info.isSymbolicLink()) {
|
|
180
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain symlinks: ${childRelative}`);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain special files: ${childRelative}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async function rejectUndeclaredFiles(root, absolute, relative, declared, visited) {
|
|
188
|
+
const real = await realpathOrThrow(absolute);
|
|
189
|
+
if (visited.has(real))
|
|
190
|
+
return; // A symlink-free tree cannot alias, but guard anyway.
|
|
191
|
+
visited.add(real);
|
|
192
|
+
const entries = await readdir(absolute, { withFileTypes: true });
|
|
193
|
+
for (const entry of entries) {
|
|
194
|
+
const childAbsolute = path.join(absolute, entry.name);
|
|
195
|
+
const childRelative = relative ? `${relative}/${entry.name}` : entry.name;
|
|
196
|
+
const info = await lstat(childAbsolute);
|
|
197
|
+
if (info.isDirectory()) {
|
|
198
|
+
await rejectUndeclaredFiles(root, childAbsolute, childRelative, declared, visited);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const normalized = normalizePath(childRelative);
|
|
202
|
+
if (!declared.has(normalized)) {
|
|
203
|
+
throw new ControllerRuntimeIntegrityError(`undeclared file in runtime payload: ${childRelative}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function realpathOrThrow(file) {
|
|
209
|
+
const { realpath } = await import("node:fs/promises");
|
|
210
|
+
return realpath(file);
|
|
211
|
+
}
|
|
212
|
+
async function hashDeclaredFiles(payloadRoot, declared) {
|
|
213
|
+
const root = path.resolve(payloadRoot);
|
|
214
|
+
const files = [];
|
|
215
|
+
for (const entry of declared) {
|
|
216
|
+
const absolute = path.join(root, ...entry.path.split("/"));
|
|
217
|
+
let info;
|
|
218
|
+
try {
|
|
219
|
+
info = await lstat(absolute);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload file is not readable: ${entry.path}`);
|
|
223
|
+
}
|
|
224
|
+
if (info.isSymbolicLink()) {
|
|
225
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain symlinks: ${entry.path}`);
|
|
226
|
+
}
|
|
227
|
+
if (!info.isFile()) {
|
|
228
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload entry is not a regular file: ${entry.path}`);
|
|
229
|
+
}
|
|
230
|
+
if (info.nlink > 1) {
|
|
231
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain hardlinks: ${entry.path}`);
|
|
232
|
+
}
|
|
233
|
+
const digest = await hashFile(absolute);
|
|
234
|
+
files.push({
|
|
235
|
+
path: entry.path,
|
|
236
|
+
size: info.size,
|
|
237
|
+
executable: entry.executable,
|
|
238
|
+
sha256: `sha256:${digest}`,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return files;
|
|
242
|
+
}
|
|
243
|
+
async function hashFile(file) {
|
|
244
|
+
const { createReadStream } = await import("node:fs");
|
|
245
|
+
const hash = createHash("sha256");
|
|
246
|
+
for await (const chunk of createReadStream(file))
|
|
247
|
+
hash.update(chunk);
|
|
248
|
+
return hash.digest("hex");
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Verify a manifest against its payload tree: declared file set, sizes,
|
|
252
|
+
* executable bits, and SHA-256 digests (spec §4.6).
|
|
253
|
+
*/
|
|
254
|
+
export async function verifyRuntimePayload(payloadRoot, manifest) {
|
|
255
|
+
const root = path.resolve(payloadRoot);
|
|
256
|
+
const seen = new Set();
|
|
257
|
+
for (const file of manifest.files) {
|
|
258
|
+
if (seen.has(file.path)) {
|
|
259
|
+
throw new ControllerRuntimeIntegrityError(`duplicate manifest path: ${file.path}`);
|
|
260
|
+
}
|
|
261
|
+
seen.add(file.path);
|
|
262
|
+
const normalized = normalizePath(file.path);
|
|
263
|
+
if (normalized.startsWith("..") || normalized.startsWith("/")) {
|
|
264
|
+
throw new ControllerRuntimeIntegrityError(`manifest path escapes the payload root: ${file.path}`);
|
|
265
|
+
}
|
|
266
|
+
const absolute = path.join(root, ...normalized.split("/"));
|
|
267
|
+
let info;
|
|
268
|
+
try {
|
|
269
|
+
info = await lstat(absolute);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload file is missing: ${file.path}`);
|
|
273
|
+
}
|
|
274
|
+
if (info.isSymbolicLink()) {
|
|
275
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain symlinks: ${file.path}`);
|
|
276
|
+
}
|
|
277
|
+
if (!info.isFile()) {
|
|
278
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload entry is not a regular file: ${file.path}`);
|
|
279
|
+
}
|
|
280
|
+
if (info.nlink > 1) {
|
|
281
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload must not contain hardlinks: ${file.path}`);
|
|
282
|
+
}
|
|
283
|
+
if (info.size !== file.size) {
|
|
284
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload size mismatch for ${file.path}: expected ${file.size}, got ${info.size}`);
|
|
285
|
+
}
|
|
286
|
+
if (file.executable !== isExecutableMode(info.mode)) {
|
|
287
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload executable bit mismatch for ${file.path}`);
|
|
288
|
+
}
|
|
289
|
+
const digest = await hashFile(absolute);
|
|
290
|
+
if (`sha256:${digest}` !== file.sha256) {
|
|
291
|
+
throw new ControllerRuntimeIntegrityError(`runtime payload digest mismatch for ${file.path}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Reject undeclared files in the payload tree.
|
|
295
|
+
await rejectUndeclaredFiles(root, root, "", seen, new Set());
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Canonically encode the runtime identity `{ schema_version, node_range,
|
|
299
|
+
* entrypoints, files }` with sorted object keys and no insignificant
|
|
300
|
+
* whitespace (spec §4.4.6). The `entrypoints` declaration participates in the
|
|
301
|
+
* identity hash.
|
|
302
|
+
*/
|
|
303
|
+
export function canonicalEncodeManifest(input) {
|
|
304
|
+
const sortedFiles = [...input.files].sort((left, right) => compareUtf8(left.path, right.path));
|
|
305
|
+
const payload = {
|
|
306
|
+
schema_version: RUNTIME_SCHEMA_VERSION,
|
|
307
|
+
node_range: RUNTIME_NODE_RANGE,
|
|
308
|
+
entrypoints: {
|
|
309
|
+
cli: {
|
|
310
|
+
path: input.entrypoints.cli.path,
|
|
311
|
+
launcher: input.entrypoints.cli.launcher,
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
files: sortedFiles.map((file) => ({
|
|
315
|
+
path: file.path,
|
|
316
|
+
size: file.size,
|
|
317
|
+
executable: file.executable,
|
|
318
|
+
sha256: file.sha256,
|
|
319
|
+
})),
|
|
320
|
+
};
|
|
321
|
+
return canonicalStringify(payload);
|
|
322
|
+
}
|
|
323
|
+
/** Encode a full manifest (identity fields plus descriptive created_at) canonically. */
|
|
324
|
+
export function canonicalEncodeManifestWithCreatedAt(manifest) {
|
|
325
|
+
return canonicalEncodeManifest({ entrypoints: manifest.entrypoints, files: manifest.files });
|
|
326
|
+
}
|
|
327
|
+
function canonicalStringify(value) {
|
|
328
|
+
if (Array.isArray(value))
|
|
329
|
+
return `[${value.map(canonicalStringify).join(",")}]`;
|
|
330
|
+
if (value && typeof value === "object") {
|
|
331
|
+
const record = value;
|
|
332
|
+
const keys = Object.keys(record).sort(compareUtf8);
|
|
333
|
+
return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalStringify(record[key])}`).join(",")}}`;
|
|
334
|
+
}
|
|
335
|
+
return JSON.stringify(value);
|
|
336
|
+
}
|
|
337
|
+
/** Normalize a manifest path to NFC with `/` separators. */
|
|
338
|
+
export function normalizePath(rawPath) {
|
|
339
|
+
const withSeparators = rawPath.split("\\").join("/");
|
|
340
|
+
const nfc = withSeparators.normalize("NFC");
|
|
341
|
+
return path.posix.normalize(nfc).replace(/^\.\//, "");
|
|
342
|
+
}
|
|
343
|
+
function compareUtf8(left, right) {
|
|
344
|
+
return Buffer.compare(Buffer.from(left, "utf8"), Buffer.from(right, "utf8"));
|
|
345
|
+
}
|
|
346
|
+
function isExecutableMode(mode) {
|
|
347
|
+
return (mode & 0o111) !== 0;
|
|
348
|
+
}
|
|
349
|
+
function isWithin(parent, candidate) {
|
|
350
|
+
const relative = path.relative(parent, candidate);
|
|
351
|
+
return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== "..");
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/controller-runtime/hash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { ControllerRuntimeIntegrityError, RUNTIME_CLI_ENTRYPOINT, RUNTIME_NODE_RANGE, RUNTIME_PAYLOAD_DIRECTORIES, RUNTIME_PAYLOAD_RULES, RUNTIME_SCHEMA_VERSION, canonicalEncodeManifest, canonicalEncodeManifestWithCreatedAt, enumerateAllowlist, hashRuntimePayload, isEntrypointPath, normalizePath, verifyRuntimePayload } from "./hash.js";
|
|
2
|
+
export { PACKAGE_ROOT, ensureControllerRuntime, inspectEvalRuntimeKind, useControllerRuntimeById, writeRuntimeReference } from "./store.js";
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/controller-runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,oCAAoC,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAElV,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|