nawabari 0.7.1 → 0.9.2
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 +264 -29
- package/dist/cli-command-registry.d.ts +50 -0
- package/dist/cli-command-registry.js +509 -0
- package/dist/cli-command-registry.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.js +302 -583
- package/dist/cli.js.map +1 -1
- package/dist/contract.d.ts +6 -0
- package/dist/contract.js +296 -192
- package/dist/contract.js.map +1 -1
- package/dist/domain/cgroups-v2.d.ts +77 -0
- package/dist/domain/cgroups-v2.js +434 -0
- package/dist/domain/cgroups-v2.js.map +1 -0
- package/dist/domain/doctor.d.ts +4 -1
- package/dist/domain/doctor.js +64 -13
- package/dist/domain/doctor.js.map +1 -1
- package/dist/domain/errors.d.ts +1 -1
- package/dist/domain/errors.js.map +1 -1
- package/dist/domain/landlock.d.ts +55 -0
- package/dist/domain/landlock.js +279 -0
- package/dist/domain/landlock.js.map +1 -0
- package/dist/domain/runtime.d.ts +12 -0
- package/dist/domain/runtime.js +50 -0
- package/dist/domain/runtime.js.map +1 -0
- package/dist/domain/sandbox-launcher.d.ts +26 -0
- package/dist/domain/sandbox-launcher.js +312 -23
- package/dist/domain/sandbox-launcher.js.map +1 -1
- package/dist/domain/sandbox-seccomp.d.ts +46 -0
- package/dist/domain/sandbox-seccomp.js +302 -0
- package/dist/domain/sandbox-seccomp.js.map +1 -0
- package/dist/domain/sandbox.d.ts +45 -1
- package/dist/domain/sandbox.js +176 -25
- package/dist/domain/sandbox.js.map +1 -1
- package/dist/domain/session-backend.d.ts +4 -1
- package/dist/domain/session-backend.js +256 -3
- package/dist/domain/session-backend.js.map +1 -1
- package/dist/domain/session.d.ts +207 -3
- package/dist/domain/session.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/failure-code-vocabulary.d.ts +20 -0
- package/dist/failure-code-vocabulary.js +216 -0
- package/dist/failure-code-vocabulary.js.map +1 -0
- package/dist/git.js +92 -6
- package/dist/git.js.map +1 -1
- package/dist/operation-authorization.d.ts +1 -1
- package/dist/product-state-manifest.d.ts +152 -0
- package/dist/product-state-manifest.js +240 -0
- package/dist/product-state-manifest.js.map +1 -0
- package/dist/public-contract.d.ts +25 -0
- package/dist/public-contract.js +29 -0
- package/dist/public-contract.js.map +1 -0
- package/dist/public-state.d.ts +75 -0
- package/dist/public-state.js +60 -0
- package/dist/public-state.js.map +1 -0
- package/dist/registry/lock.d.ts +8 -0
- package/dist/registry/lock.js +38 -20
- package/dist/registry/lock.js.map +1 -1
- package/dist/repository-evidence.d.ts +16 -0
- package/dist/repository-evidence.js.map +1 -1
- package/dist/resource-claims.d.ts +2 -2
- package/dist/resource-claims.js +96 -27
- package/dist/resource-claims.js.map +1 -1
- package/dist/session-lifecycle-actions.d.ts +64 -0
- package/dist/session-lifecycle-actions.js +117 -0
- package/dist/session-lifecycle-actions.js.map +1 -0
- package/dist/session-lifecycle-classification.d.ts +120 -0
- package/dist/session-lifecycle-classification.js +88 -0
- package/dist/session-lifecycle-classification.js.map +1 -0
- package/dist/session-registry.d.ts +210 -2
- package/dist/session-registry.js +1330 -87
- package/dist/session-registry.js.map +1 -1
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/session/actors.d.ts +71 -0
- package/dist/state/session/actors.js +259 -0
- package/dist/state/session/actors.js.map +1 -0
- package/dist/state/session/guards.d.ts +25 -0
- package/dist/state/session/guards.js +108 -0
- package/dist/state/session/guards.js.map +1 -0
- package/dist/state/session/index.d.ts +6 -0
- package/dist/state/session/index.js +5 -0
- package/dist/state/session/index.js.map +1 -0
- package/dist/state/session/machine.d.ts +185 -0
- package/dist/state/session/machine.js +408 -0
- package/dist/state/session/machine.js.map +1 -0
- package/dist/state/session/types.d.ts +94 -0
- package/dist/state/session/types.js +14 -0
- package/dist/state/session/types.js.map +1 -0
- package/package.json +46 -26
package/dist/domain/doctor.js
CHANGED
|
@@ -4,13 +4,11 @@ import process from "node:process";
|
|
|
4
4
|
import { defaultGit, resolveRepositoryContext } from "../git.js";
|
|
5
5
|
import { isSessionRegistryError } from "../errors.js";
|
|
6
6
|
import { SessionRegistry } from "../session-registry.js";
|
|
7
|
+
import { projectSessionLifecycleActions } from "../session-lifecycle-actions.js";
|
|
8
|
+
import { availableLifecycleOperations } from "../session-lifecycle-classification.js";
|
|
7
9
|
import { success } from "./errors.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const major = Number(majorText);
|
|
11
|
-
const minor = Number(minorText);
|
|
12
|
-
return Number.isFinite(major) && Number.isFinite(minor) && (major > 22 || (major === 22 && minor >= 13));
|
|
13
|
-
}
|
|
10
|
+
import { supportsRuntime } from "./runtime.js";
|
|
11
|
+
import { defaultSandboxProbe, sandboxDoctorReport } from "./sandbox.js";
|
|
14
12
|
function check(name, status, code, message, details = {}) {
|
|
15
13
|
return { name, status, code, message, details };
|
|
16
14
|
}
|
|
@@ -50,7 +48,7 @@ async function inspectRegistry(repository, context) {
|
|
|
50
48
|
const code = doctorErrorCode(error, "REGISTRY_UNREADABLE");
|
|
51
49
|
return check("registry", "error", code, "The Nawabari registry failed authoritative validation.", {
|
|
52
50
|
path: repository.registry_path,
|
|
53
|
-
...(isSessionRegistryError(error) ? { reason: error.code } : {}),
|
|
51
|
+
...(isSessionRegistryError(error) ? { reason: error.code, ...error.details } : {}),
|
|
54
52
|
});
|
|
55
53
|
}
|
|
56
54
|
}
|
|
@@ -82,6 +80,54 @@ async function inspectReconciliation(context) {
|
|
|
82
80
|
: "Registry/Git ownership drift is present; no destructive repair was performed.", {
|
|
83
81
|
clean: result.clean,
|
|
84
82
|
sessions: result.sessions.length,
|
|
83
|
+
lifecycle_sessions: result.sessions.map((session) => ({
|
|
84
|
+
session_id: session.session.sessionId,
|
|
85
|
+
status: session.status,
|
|
86
|
+
physical_state: session.physicalState,
|
|
87
|
+
lifecycle_state: session.lifecycle?.state ?? null,
|
|
88
|
+
lifecycle: session.lifecycle === undefined
|
|
89
|
+
? null
|
|
90
|
+
: {
|
|
91
|
+
schema_version: session.lifecycle.schemaVersion,
|
|
92
|
+
state: session.lifecycle.state,
|
|
93
|
+
session_state: session.lifecycle.sessionState,
|
|
94
|
+
physical_state: session.lifecycle.physicalState,
|
|
95
|
+
close_readiness: session.lifecycle.closeReadiness,
|
|
96
|
+
blockers: session.lifecycle.blockers.map((blocker) => ({
|
|
97
|
+
code: blocker.code,
|
|
98
|
+
...(blocker.classification === undefined ? {} : { classification: blocker.classification }),
|
|
99
|
+
})),
|
|
100
|
+
recoverability: session.lifecycle.recoverability,
|
|
101
|
+
age_suspicious: session.lifecycle.ageSuspicious,
|
|
102
|
+
gc_authorized: session.lifecycle.gcAuthorized,
|
|
103
|
+
destructive_cleanup_eligible: session.lifecycle.destructiveCleanupEligible,
|
|
104
|
+
available_operations: [...availableLifecycleOperations(session.lifecycle)],
|
|
105
|
+
transitions: session.lifecycle.transitions.map((transition) => ({ ...transition })),
|
|
106
|
+
next_actions: projectSessionLifecycleActions({
|
|
107
|
+
classification: session.lifecycle,
|
|
108
|
+
sessionId: session.session.sessionId,
|
|
109
|
+
blockers: session.blockers.map((blocker) => ({ code: blocker.code, details: blocker.details })),
|
|
110
|
+
}).map((action) => ({
|
|
111
|
+
schema_version: action.schemaVersion,
|
|
112
|
+
action_id: action.actionId,
|
|
113
|
+
kind: action.kind,
|
|
114
|
+
command: action.command,
|
|
115
|
+
...(action.kind === "integrated-revision"
|
|
116
|
+
? { integrated_revision: action.integratedRevision }
|
|
117
|
+
: action.kind === "bounded-integration-fetch"
|
|
118
|
+
? {
|
|
119
|
+
integrated_revision: action.integratedRevision,
|
|
120
|
+
fetch_remote: action.fetchRemote,
|
|
121
|
+
fetch_branch: action.fetchBranch,
|
|
122
|
+
}
|
|
123
|
+
: action.kind === "explicit-discard"
|
|
124
|
+
? { session_id: action.sessionId, requires_explicit_intent: action.requiresExplicitIntent }
|
|
125
|
+
: action.kind === "reconcile"
|
|
126
|
+
? { session_id: action.sessionId, mutates: action.mutates }
|
|
127
|
+
: { reason: action.reason }),
|
|
128
|
+
})),
|
|
129
|
+
},
|
|
130
|
+
})),
|
|
85
131
|
worktrees: result.worktrees.length,
|
|
86
132
|
issues,
|
|
87
133
|
});
|
|
@@ -90,15 +136,18 @@ async function inspectReconciliation(context) {
|
|
|
90
136
|
return check("reconciliation", "error", doctorErrorCode(error, "REGISTRY_UNREADABLE"), "Authoritative registry/Git reconciliation could not be completed.", { ...(isSessionRegistryError(error) ? { reason: error.code, ...error.details } : {}) });
|
|
91
137
|
}
|
|
92
138
|
}
|
|
93
|
-
export async function runDoctor(cwd = process.cwd()) {
|
|
139
|
+
export async function runDoctor(cwd = process.cwd(), sandboxProbe = defaultSandboxProbe, runtimeVersion = process.versions.node) {
|
|
94
140
|
const checks = [];
|
|
95
|
-
const
|
|
141
|
+
const sandbox = sandboxDoctorReport(sandboxProbe);
|
|
142
|
+
const runtimeOk = supportsRuntime(runtimeVersion);
|
|
96
143
|
checks.push(runtimeOk
|
|
97
144
|
? check("runtime", "ok", null, "The Nawabari runtime meets the supported Node.js version.", {
|
|
98
|
-
node:
|
|
145
|
+
node: runtimeVersion,
|
|
146
|
+
sandbox: sandbox,
|
|
99
147
|
})
|
|
100
148
|
: check("runtime", "error", "UNSUPPORTED_RUNTIME", "The Node.js runtime is below the supported version.", {
|
|
101
|
-
node:
|
|
149
|
+
node: runtimeVersion,
|
|
150
|
+
sandbox: sandbox,
|
|
102
151
|
}));
|
|
103
152
|
try {
|
|
104
153
|
const version = defaultGit.run(["--version"], cwd);
|
|
@@ -111,7 +160,7 @@ export async function runDoctor(cwd = process.cwd()) {
|
|
|
111
160
|
}));
|
|
112
161
|
checks.push(check("repository", "not_applicable", null, "Repository resolution was skipped because Git is unavailable."));
|
|
113
162
|
checks.push(check("registry", "not_applicable", null, "Registry inspection was skipped because Git is unavailable."));
|
|
114
|
-
return success({ ok: false, checks, repository: null });
|
|
163
|
+
return success({ ok: false, checks, repository: null, sandbox });
|
|
115
164
|
}
|
|
116
165
|
let repository = null;
|
|
117
166
|
try {
|
|
@@ -134,7 +183,7 @@ export async function runDoctor(cwd = process.cwd()) {
|
|
|
134
183
|
checks.push(check("registry", "not_applicable", null, "Registry inspection was skipped outside a Git repository."));
|
|
135
184
|
}
|
|
136
185
|
const hasError = checks.some((item) => item.status === "error");
|
|
137
|
-
return success({ ok: !hasError, checks, repository });
|
|
186
|
+
return success({ ok: !hasError, checks, repository, sandbox });
|
|
138
187
|
}
|
|
139
188
|
function doctorErrorCode(error, fallback) {
|
|
140
189
|
if (!isSessionRegistryError(error))
|
|
@@ -158,6 +207,8 @@ function doctorErrorCode(error, fallback) {
|
|
|
158
207
|
return "GIT_STATE_AMBIGUOUS";
|
|
159
208
|
if (code === "REGISTRY_CORRUPT" || code === "UNSUPPORTED_SCHEMA_VERSION")
|
|
160
209
|
return "REGISTRY_CORRUPT";
|
|
210
|
+
if (code === "UNSUPPORTED_CLAIM_SCHEMA_VERSION")
|
|
211
|
+
return "UNSUPPORTED_CLAIM_SCHEMA_VERSION";
|
|
161
212
|
if (code === "REGISTRY_REPOSITORY_MISMATCH")
|
|
162
213
|
return "INVALID_REGISTRY";
|
|
163
214
|
if (code === "INVALID_BRANCH_ID")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/domain/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAA0B,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/domain/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAA0B,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,OAAO,EAAsD,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAA+C,MAAM,cAAc,CAAC;AA0BrH,SAAS,KAAK,CACZ,IAAyB,EACzB,MAAyB,EACzB,IAAsB,EACtB,OAAe,EACf,UAAsB,EAAE;IAExB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,cAAc,CAAC,OAA0B;IAChD,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,YAAY;QAC/B,UAAU,EAAE,OAAO,CAAC,kBAAkB;QACtC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,EAAE,uBAAuB,CAAC;KAC1F,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,UAA0B,EAAE,OAA0B;IACnF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,0CAA0C,EAAE;gBAChG,IAAI,EAAE,UAAU,CAAC,aAAa;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,mDAAmD,EAAE;gBACzG,IAAI,EAAE,UAAU,CAAC,aAAa;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,8CAA8C,EAAE;gBACnF,IAAI,EAAE,UAAU,CAAC,aAAa;gBAC9B,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,QAAQ,EAAE,QAAQ,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,wDAAwD,EAAE;gBAChG,IAAI,EAAE,UAAU,CAAC,aAAa;gBAC9B,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,mDAAmD,EAAE;gBACpG,IAAI,EAAE,UAAU,CAAC,aAAa;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,uCAAuC,EAAE;YAChG,IAAI,EAAE,UAAU,CAAC,aAAa;SAC/B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAA0B;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,SAAS;YAC3B,QAAQ,EAAE,KAAK,CAAC,YAAY;YAC5B,MAAM,EAAE,KAAK,CAAC,UAAU;YACxB,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;YAC7B,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;SACzC,CAAC,CAAC,CAAC;QACJ,OAAO,KAAK,CACV,gBAAgB,EAChB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,EAC5C,MAAM,CAAC,KAAK;YACV,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,+EAA+E,EACnF;YACE,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAChC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACpD,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;gBACrC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,cAAc,EAAE,OAAO,CAAC,aAAa;gBACrC,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,IAAI;gBACjD,SAAS,EACP,OAAO,CAAC,SAAS,KAAK,SAAS;oBAC7B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC;wBACE,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa;wBAC/C,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK;wBAC9B,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY;wBAC7C,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa;wBAC/C,eAAe,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc;wBACjD,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;4BACrD,IAAI,EAAE,OAAO,CAAC,IAAI;4BAClB,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;yBAC5F,CAAC,CAAC;wBACH,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc;wBAChD,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa;wBAC/C,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY;wBAC7C,4BAA4B,EAAE,OAAO,CAAC,SAAS,CAAC,0BAA0B;wBAC1E,oBAAoB,EAAE,CAAC,GAAG,4BAA4B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBAC1E,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;wBACnF,YAAY,EAAE,8BAA8B,CAAC;4BAC3C,cAAc,EAAE,OAAO,CAAC,SAAS;4BACjC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;4BACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;yBAChG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;4BAClB,cAAc,EAAE,MAAM,CAAC,aAAa;4BACpC,SAAS,EAAE,MAAM,CAAC,QAAQ;4BAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,qBAAqB;gCACvC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,kBAAkB,EAAE;gCACpD,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,2BAA2B;oCAC3C,CAAC,CAAC;wCACE,mBAAmB,EAAE,MAAM,CAAC,kBAAkB;wCAC9C,YAAY,EAAE,MAAM,CAAC,WAAW;wCAChC,YAAY,EAAE,MAAM,CAAC,WAAW;qCACjC;oCACH,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB;wCAClC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,wBAAwB,EAAE,MAAM,CAAC,sBAAsB,EAAE;wCAC3F,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;4CAC3B,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;4CAC3D,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;yBACrC,CAAC,CAAC;qBACJ;aACR,CAAC,CAAC;YACH,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;YAClC,MAAM;SACP,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,KAAK,CACV,gBAAgB,EAChB,OAAO,EACP,eAAe,CAAC,KAAK,EAAE,qBAAqB,CAAC,EAC7C,mEAAmE,EACnE,EAAE,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,eAA6B,mBAAmB,EAChD,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI;IAEtC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CACT,SAAS;QACP,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,2DAA2D,EAAE;YACxF,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAgC;SAC1C,CAAC;QACJ,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,qDAAqD,EAAE;YACtG,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAgC;SAC1C,CAAC,CACP,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,wCAAwC,EAAE;YACzG,OAAO,EAAE,eAAe;YACxB,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CACH,CAAC;QACF,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,+DAA+D,CAAC,CAC7G,CAAC;QACF,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,6DAA6D,CAAC,CACzG,CAAC;QACF,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,UAAU,GAA0B,IAAI,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,wBAAwB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QACnE,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,+CAA+C,EAAE;YAC/E,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;SAClC,CAAC,CACH,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CACT,aAAa,CAAC,MAAM,KAAK,IAAI;YAC3B,CAAC,CAAC,MAAM,qBAAqB,CAAC,OAAO,CAAC;YACtC,CAAC,CAAC,KAAK,CACH,gBAAgB,EAChB,gBAAgB,EAChB,IAAI,EACJ,6DAA6D,CAC9D,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,KAAK,CACH,YAAY,EACZ,OAAO,EACP,eAAe,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAC5C,8DAA8D,EAC9D;YACE,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CACF,CACF,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,2DAA2D,CAAC,CAAC,CAAC;IACtH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,QAAmB;IAC1D,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAC3D,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,aAAa,CAAC;IACjD,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAC3D,IAAI,IAAI,KAAK,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAC/D,IAAI,IAAI,KAAK,sBAAsB;QAAE,OAAO,oBAAoB,CAAC;IACjE,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,kBAAkB,CAAC;IAC3D,IAAI,IAAI,KAAK,kCAAkC;QAAE,OAAO,kCAAkC,CAAC;IAC3F,IAAI,IAAI,KAAK,+BAA+B;QAAE,OAAO,qBAAqB,CAAC;IAC3E,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,4BAA4B;QAAE,OAAO,kBAAkB,CAAC;IACpG,IAAI,IAAI,KAAK,kCAAkC;QAAE,OAAO,kCAAkC,CAAC;IAC3F,IAAI,IAAI,KAAK,8BAA8B;QAAE,OAAO,kBAAkB,CAAC;IACvE,IAAI,IAAI,KAAK,mBAAmB;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,IAAI,KAAK,uBAAuB;QAAE,OAAO,kBAAkB,CAAC;IAChE,IAAI,IAAI,KAAK,6BAA6B;QAAE,OAAO,qBAAqB,CAAC;IACzE,IAAI,IAAI,KAAK,sBAAsB;QAAE,OAAO,sBAAsB,CAAC;IACnE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC"}
|
package/dist/domain/errors.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
|
3
3
|
export interface JsonObject {
|
|
4
4
|
[key: string]: JsonValue;
|
|
5
5
|
}
|
|
6
|
-
export type ErrorCode = "BACKEND_UNAVAILABLE" | "BRANCH_OWNED_BY_OTHER_SESSION" | "BRANCH_ALREADY_EXISTS" | "DOCTOR_FAILED" | "DIRTY_WORKTREE" | "NESTED_REPOSITORY" | "GIT_COMMAND_FAILED" | "GIT_OPERATION_FAILED" | "GIT_SPAWN_FAILED" | "GIT_TIMEOUT" | "GIT_OUTPUT_LIMIT" | "GIT_UNAVAILABLE" | "INVALID_ARGUMENT" | "INVALID_BRANCH" | "INVALID_BASE_REF" | "INVALID_REGISTRY" | "INVALID_SESSION_ID" | "INVALID_WORKTREE" | "DETACHED_HEAD" | "MISSING_WORKTREE" | "REPOSITORY_MISMATCH" | "WORKTREE_MISMATCH" | "BRANCH_MISMATCH" | "STALE_REGISTRY" | "STALE_CLAIM_SET" | "GIT_STATE_AMBIGUOUS" | "PHYSICAL_OBSERVATION_UNAVAILABLE" | "LOCK_CONTENTION" | "MISSING_ARGUMENT" | "NO_COMMAND" | "NO_CURRENT_SESSION" | "NOT_GIT_REPOSITORY" | "OPERATION_REJECTED" | "OWNERSHIP_MISMATCH" | "PROTECTED_BRANCH" | "PROTECTED_WORKTREE" | "RECOVERABLE_COMMITS" | "RECOVERABLE_STASHES" | "RECONCILIATION_DRIFT" | "REGISTRY_CORRUPT" | "REGISTRY_UNREADABLE" | "REGISTRY_DURABILITY_UNCERTAIN" | "SANDBOX_UNSUPPORTED_PLATFORM" | "SANDBOX_CAPABILITY_UNAVAILABLE" | "SANDBOX_TOPOLOGY_INVALID" | "SANDBOX_EXECUTION_FAILED" | "SANDBOX_EXECUTION_TIMEOUT" | "SANDBOX_OUTPUT_LIMIT" | "SESSION_NOT_FOUND" | "STALE_SESSION" | "UNSUPPORTED_RUNTIME" | "UNKNOWN_COMMAND" | "WORKTREE_OWNED_BY_OTHER_SESSION" | "WORKTREE_ALREADY_EXISTS" | "INVALID_CLAIM" | "INVALID_OPERATION" | "INVALID_RESOURCE" | "MISSING_RESOURCE_CLAIM" | "INSUFFICIENT_CLAIM_MODE" | "INVALID_CLAIM_RESOURCE" | "CLAIM_PATH_TRAVERSAL" | "CLAIM_SYMLINK_ESCAPE" | "CLAIM_AMBIGUOUS_PATH" | "UNSUPPORTED_CLAIM_GLOB" | "CLAIM_REPOSITORY_MISMATCH" | "CLAIM_SESSION_MISMATCH" | "DUPLICATE_CLAIM" | "CONTRADICTORY_CLAIM" | "RESOURCE_CLAIM_CONFLICT" | "CLAIM_NOT_FOUND" | "SESSION_NOT_ACTIVE" | "UNSUPPORTED_CLAIM_SCHEMA_VERSION" | "INVALID_COMMIT_MESSAGE" | "COMMIT_EMPTY_DIFF" | "UNEXPECTED_CHANGED_PATHS" | "COMMIT_STAGING_FAILED" | "COMMIT_FAILED" | "COMMIT_RESULT_UNAVAILABLE" | "COMMIT_RESULT_DIVERGED" | "INVALID_REMOTE" | "INVALID_REMOTE_BRANCH" | "PUSH_TARGET_MISMATCH" | "PUSH_REMOTE_INSPECTION_FAILED" | "INTEGRATION_FETCH_FAILED" | "PUSH_NO_UPSTREAM" | "PUSH_BEHIND" | "PUSH_DIVERGED" | "PUSH_DIRTY_WORKTREE" | "PUSH_FAILED" | "INTERNAL_ERROR";
|
|
6
|
+
export type ErrorCode = "BACKEND_UNAVAILABLE" | "BRANCH_OWNED_BY_OTHER_SESSION" | "BRANCH_ALREADY_EXISTS" | "DOCTOR_FAILED" | "DIRTY_WORKTREE" | "NESTED_REPOSITORY" | "GIT_COMMAND_FAILED" | "GIT_OPERATION_FAILED" | "GIT_SPAWN_FAILED" | "GIT_TIMEOUT" | "GIT_OUTPUT_LIMIT" | "GIT_UNAVAILABLE" | "INVALID_ARGUMENT" | "INVALID_BRANCH" | "INVALID_BASE_REF" | "INVALID_REGISTRY" | "INVALID_SESSION_ID" | "INVALID_WORKTREE" | "DETACHED_HEAD" | "MISSING_WORKTREE" | "REPOSITORY_MISMATCH" | "WORKTREE_MISMATCH" | "BRANCH_MISMATCH" | "STALE_REGISTRY" | "STALE_CLAIM_SET" | "GIT_STATE_AMBIGUOUS" | "PHYSICAL_OBSERVATION_UNAVAILABLE" | "LOCK_CONTENTION" | "MISSING_ARGUMENT" | "NO_COMMAND" | "NO_CURRENT_SESSION" | "NOT_GIT_REPOSITORY" | "OPERATION_REJECTED" | "OWNERSHIP_MISMATCH" | "PROTECTED_BRANCH" | "PROTECTED_WORKTREE" | "RECOVERABLE_COMMITS" | "RECOVERABLE_STASHES" | "RECONCILIATION_DRIFT" | "REGISTRY_CORRUPT" | "REGISTRY_UNREADABLE" | "REGISTRY_DURABILITY_UNCERTAIN" | "SANDBOX_UNSUPPORTED_PLATFORM" | "SANDBOX_CAPABILITY_UNAVAILABLE" | "SANDBOX_TOPOLOGY_INVALID" | "SANDBOX_EXECUTION_FAILED" | "SANDBOX_EXECUTION_TIMEOUT" | "SANDBOX_OUTPUT_LIMIT" | "SANDBOX_CGROUP_SCOPE_CONFLICT" | "SANDBOX_CGROUP_SETUP_FAILED" | "SANDBOX_CGROUP_CLEANUP_FAILED" | "SANDBOX_CGROUP_LIMIT" | "SESSION_NOT_FOUND" | "STALE_SESSION" | "UNSUPPORTED_RUNTIME" | "UNKNOWN_COMMAND" | "WORKTREE_OWNED_BY_OTHER_SESSION" | "WORKTREE_ALREADY_EXISTS" | "INVALID_CLAIM" | "INVALID_OPERATION" | "INVALID_RESOURCE" | "MISSING_RESOURCE_CLAIM" | "INSUFFICIENT_CLAIM_MODE" | "INVALID_CLAIM_RESOURCE" | "CLAIM_PATH_TRAVERSAL" | "CLAIM_SYMLINK_ESCAPE" | "CLAIM_AMBIGUOUS_PATH" | "UNSUPPORTED_CLAIM_GLOB" | "CLAIM_REPOSITORY_MISMATCH" | "CLAIM_SESSION_MISMATCH" | "DUPLICATE_CLAIM" | "CONTRADICTORY_CLAIM" | "RESOURCE_CLAIM_CONFLICT" | "CLAIM_NOT_FOUND" | "SESSION_NOT_ACTIVE" | "UNSUPPORTED_CLAIM_SCHEMA_VERSION" | "INVALID_COMMIT_MESSAGE" | "COMMIT_EMPTY_DIFF" | "UNEXPECTED_CHANGED_PATHS" | "COMMIT_STAGING_FAILED" | "COMMIT_FAILED" | "COMMIT_RESULT_UNAVAILABLE" | "COMMIT_RESULT_DIVERGED" | "INVALID_REMOTE" | "INVALID_REMOTE_BRANCH" | "PUSH_TARGET_MISMATCH" | "PUSH_REMOTE_INSPECTION_FAILED" | "INTEGRATION_FETCH_FAILED" | "PUSH_NO_UPSTREAM" | "PUSH_BEHIND" | "PUSH_DIVERGED" | "PUSH_DIRTY_WORKTREE" | "PUSH_FAILED" | "INTERNAL_ERROR";
|
|
7
7
|
/**
|
|
8
8
|
* Implementation-owned stable failures reachable from the public resource
|
|
9
9
|
* claim lifecycle. Contract discovery consumes this vocabulary rather than
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAwGA;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,CAAC;IACxD,qBAAqB;IACrB,kBAAkB;IAClB,kBAAkB;IAClB,eAAe;IACf,oBAAoB;IACpB,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,wBAAwB;IACxB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,wBAAwB;IACxB,2BAA2B;IAC3B,wBAAwB;IACxB,iBAAiB;IACjB,qBAAqB;IACrB,yBAAyB;IACzB,iBAAiB;IACjB,oBAAoB;IACpB,iBAAiB;IACjB,kCAAkC;IAClC,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,iCAAiC;IACjC,+BAA+B;IAC/B,oBAAoB;IACpB,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;IACrB,+BAA+B;IAC/B,iBAAiB;CACsB,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;IACd,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,IAAe;IACtC,IACE,IAAI,KAAK,qBAAqB;QAC9B,IAAI,KAAK,8BAA8B;QACvC,IAAI,KAAK,gCAAgC,EACzC,CAAC;QACD,OAAO,UAAU,CAAC,WAAW,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,UAAU,CAAC,MAAM,CAAC;IACvD,IACE,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,kBAAkB;QAC3B,IAAI,KAAK,kBAAkB;QAC3B,IAAI,KAAK,mBAAmB;QAC5B,IAAI,KAAK,wBAAwB;QACjC,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,uBAAuB,EAChC,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,IAAI,KAAK,gBAAgB;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAC;IAC1D,OAAO,UAAU,CAAC,QAAQ,CAAC;AAC7B,CAAC;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAY;IAChB,QAAQ,CAAS;IACjB,OAAO,CAAoB;IAEpC,YACE,IAAe,EACf,OAAe,EACf,UAA6B,IAAI,EACjC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,EAChC,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAID,MAAM,UAAU,OAAO,CAAI,KAAQ;IACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO,CAAY,KAAkB;IACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { SandboxFilesystemTopology } from "./sandbox.js";
|
|
2
|
+
/**
|
|
3
|
+
* Landlock is an optional second filesystem boundary. The bubblewrap
|
|
4
|
+
* topology remains authoritative: this module only compiles that topology
|
|
5
|
+
* into a fixed set of namespace paths and never accepts source/destination
|
|
6
|
+
* grants from a caller.
|
|
7
|
+
*/
|
|
8
|
+
export declare const LANDLOCK_ABI_MINIMUM: 1;
|
|
9
|
+
export declare const LANDLOCK_CREATE_RULESET_VERSION: 1;
|
|
10
|
+
export declare const LANDLOCK_RULE_TYPE_PATH_BENEATH: 1;
|
|
11
|
+
export declare const LANDLOCK_ACCESS_FS: Readonly<{
|
|
12
|
+
execute: number;
|
|
13
|
+
write_file: number;
|
|
14
|
+
read_file: number;
|
|
15
|
+
read_dir: number;
|
|
16
|
+
remove_dir: number;
|
|
17
|
+
remove_file: number;
|
|
18
|
+
make_char: number;
|
|
19
|
+
make_dir: number;
|
|
20
|
+
make_reg: number;
|
|
21
|
+
make_sock: number;
|
|
22
|
+
make_fifo: number;
|
|
23
|
+
make_block: number;
|
|
24
|
+
make_sym: number;
|
|
25
|
+
refer: number;
|
|
26
|
+
truncate: number;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const LANDLOCK_ACCESS_FS_ABI1: number;
|
|
29
|
+
export type LandlockRule = {
|
|
30
|
+
readonly path: string;
|
|
31
|
+
readonly allowed_access: number;
|
|
32
|
+
};
|
|
33
|
+
/** State before/after applying the optional defense-in-depth policy. */
|
|
34
|
+
export type LandlockEffectiveState = "available" | "enforced" | "reduced-defense" | "incompatible" | "error" | "not-applicable";
|
|
35
|
+
export type LandlockCapability = {
|
|
36
|
+
readonly abi: number | null;
|
|
37
|
+
readonly supported: boolean;
|
|
38
|
+
readonly effective_state: LandlockEffectiveState;
|
|
39
|
+
};
|
|
40
|
+
/** Marker kept short so setup diagnostics remain bounded at every boundary. */
|
|
41
|
+
export declare const LANDLOCK_SETUP_FAILURE_PREFIX = "nawabari-landlock: ";
|
|
42
|
+
/**
|
|
43
|
+
* Compile only namespace-visible paths from the canonical topology. Host
|
|
44
|
+
* paths that are mounted at a fixed destination are translated to that
|
|
45
|
+
* destination; the host HOME, sibling worktrees, and arbitrary grants never
|
|
46
|
+
* become Landlock rules.
|
|
47
|
+
*/
|
|
48
|
+
export declare function deriveLandlockRules(topology: SandboxFilesystemTopology): readonly LandlockRule[];
|
|
49
|
+
/**
|
|
50
|
+
* Small in-namespace adapter. It is passed through argv to the selected
|
|
51
|
+
* runtime executable, never through a shell. Any setup failure exits before
|
|
52
|
+
* the requested command is exec'd and emits only a bounded marker/diagnostic.
|
|
53
|
+
*/
|
|
54
|
+
export declare const LANDLOCK_TRAMPOLINE: string;
|
|
55
|
+
export declare function landlockHandledAccessForAbi(abi: number): number;
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Landlock is an optional second filesystem boundary. The bubblewrap
|
|
4
|
+
* topology remains authoritative: this module only compiles that topology
|
|
5
|
+
* into a fixed set of namespace paths and never accepts source/destination
|
|
6
|
+
* grants from a caller.
|
|
7
|
+
*/
|
|
8
|
+
export const LANDLOCK_ABI_MINIMUM = 1;
|
|
9
|
+
export const LANDLOCK_CREATE_RULESET_VERSION = 1;
|
|
10
|
+
export const LANDLOCK_RULE_TYPE_PATH_BENEATH = 1;
|
|
11
|
+
export const LANDLOCK_ACCESS_FS = Object.freeze({
|
|
12
|
+
execute: 1 << 0,
|
|
13
|
+
write_file: 1 << 1,
|
|
14
|
+
read_file: 1 << 2,
|
|
15
|
+
read_dir: 1 << 3,
|
|
16
|
+
remove_dir: 1 << 4,
|
|
17
|
+
remove_file: 1 << 5,
|
|
18
|
+
make_char: 1 << 6,
|
|
19
|
+
make_dir: 1 << 7,
|
|
20
|
+
make_reg: 1 << 8,
|
|
21
|
+
make_sock: 1 << 9,
|
|
22
|
+
make_fifo: 1 << 10,
|
|
23
|
+
make_block: 1 << 11,
|
|
24
|
+
make_sym: 1 << 12,
|
|
25
|
+
refer: 1 << 13,
|
|
26
|
+
truncate: 1 << 14,
|
|
27
|
+
});
|
|
28
|
+
export const LANDLOCK_ACCESS_FS_ABI1 = LANDLOCK_ACCESS_FS.execute |
|
|
29
|
+
LANDLOCK_ACCESS_FS.write_file |
|
|
30
|
+
LANDLOCK_ACCESS_FS.read_file |
|
|
31
|
+
LANDLOCK_ACCESS_FS.read_dir |
|
|
32
|
+
LANDLOCK_ACCESS_FS.remove_dir |
|
|
33
|
+
LANDLOCK_ACCESS_FS.remove_file |
|
|
34
|
+
LANDLOCK_ACCESS_FS.make_char |
|
|
35
|
+
LANDLOCK_ACCESS_FS.make_dir |
|
|
36
|
+
LANDLOCK_ACCESS_FS.make_reg |
|
|
37
|
+
LANDLOCK_ACCESS_FS.make_sock |
|
|
38
|
+
LANDLOCK_ACCESS_FS.make_fifo |
|
|
39
|
+
LANDLOCK_ACCESS_FS.make_block |
|
|
40
|
+
LANDLOCK_ACCESS_FS.make_sym;
|
|
41
|
+
const LANDLOCK_ACCESS_FS_ABI2 = LANDLOCK_ACCESS_FS_ABI1 | LANDLOCK_ACCESS_FS.refer;
|
|
42
|
+
const LANDLOCK_ACCESS_FS_ABI3 = LANDLOCK_ACCESS_FS_ABI2 | LANDLOCK_ACCESS_FS.truncate;
|
|
43
|
+
const READ_ACCESS = LANDLOCK_ACCESS_FS.execute | LANDLOCK_ACCESS_FS.read_file | LANDLOCK_ACCESS_FS.read_dir;
|
|
44
|
+
const WRITE_ACCESS = LANDLOCK_ACCESS_FS_ABI3;
|
|
45
|
+
/** Marker kept short so setup diagnostics remain bounded at every boundary. */
|
|
46
|
+
export const LANDLOCK_SETUP_FAILURE_PREFIX = "nawabari-landlock: ";
|
|
47
|
+
function addRule(rules, candidate, allowedAccess) {
|
|
48
|
+
if (!path.isAbsolute(candidate) || candidate.includes("\0"))
|
|
49
|
+
return;
|
|
50
|
+
const normalized = path.posix.normalize(candidate);
|
|
51
|
+
// A root rule would turn this into a second broad policy authority. The
|
|
52
|
+
// canonical profile always supplies narrower mounted paths instead.
|
|
53
|
+
if (normalized === "/")
|
|
54
|
+
return;
|
|
55
|
+
rules.set(normalized, (rules.get(normalized) ?? 0) | allowedAccess);
|
|
56
|
+
}
|
|
57
|
+
function addParentRules(rules, candidate) {
|
|
58
|
+
let parent = path.posix.dirname(candidate);
|
|
59
|
+
while (parent !== "/" && parent !== ".") {
|
|
60
|
+
addRule(rules, parent, LANDLOCK_ACCESS_FS.execute | LANDLOCK_ACCESS_FS.read_dir);
|
|
61
|
+
parent = path.posix.dirname(parent);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function addDirectoryRule(rules, candidate, allowedAccess) {
|
|
65
|
+
if (!path.isAbsolute(candidate) || candidate.includes("\0"))
|
|
66
|
+
return;
|
|
67
|
+
addParentRules(rules, candidate);
|
|
68
|
+
addRule(rules, candidate, allowedAccess);
|
|
69
|
+
}
|
|
70
|
+
function addFileRule(rules, candidate) {
|
|
71
|
+
if (!path.isAbsolute(candidate) || candidate.includes("\0"))
|
|
72
|
+
return;
|
|
73
|
+
addParentRules(rules, candidate);
|
|
74
|
+
addRule(rules, candidate, LANDLOCK_ACCESS_FS.execute | LANDLOCK_ACCESS_FS.read_file);
|
|
75
|
+
}
|
|
76
|
+
function isKnownFile(candidate) {
|
|
77
|
+
return new Set(["/etc/passwd", "/etc/group", "/etc/nsswitch.conf", "/etc/hosts", "/etc/resolv.conf"]).has(path.posix.normalize(candidate));
|
|
78
|
+
}
|
|
79
|
+
function isKnownDirectory(candidate) {
|
|
80
|
+
const normalized = path.posix.normalize(candidate);
|
|
81
|
+
return (normalized === "/dev" ||
|
|
82
|
+
normalized === "/proc" ||
|
|
83
|
+
normalized === "/tmp" ||
|
|
84
|
+
normalized === "/usr" ||
|
|
85
|
+
normalized === "/bin" ||
|
|
86
|
+
normalized === "/lib" ||
|
|
87
|
+
normalized === "/lib64" ||
|
|
88
|
+
normalized === "/nix/store" ||
|
|
89
|
+
normalized === "/run/current-system" ||
|
|
90
|
+
normalized === "/run/wrappers" ||
|
|
91
|
+
normalized === "/etc/profiles" ||
|
|
92
|
+
normalized === "/etc/alternatives" ||
|
|
93
|
+
normalized === "/etc/ssl" ||
|
|
94
|
+
normalized === "/etc/pki" ||
|
|
95
|
+
normalized === "/etc/ca-certificates" ||
|
|
96
|
+
normalized === "/run/systemd/resolve" ||
|
|
97
|
+
normalized === "/run/NetworkManager" ||
|
|
98
|
+
normalized === "/mnt/wsl" ||
|
|
99
|
+
normalized.startsWith("/usr/") ||
|
|
100
|
+
normalized.startsWith("/bin/") ||
|
|
101
|
+
normalized.startsWith("/lib/") ||
|
|
102
|
+
normalized.startsWith("/lib64/") ||
|
|
103
|
+
normalized.startsWith("/nix/store/") ||
|
|
104
|
+
normalized.startsWith("/run/current-system/") ||
|
|
105
|
+
normalized.startsWith("/run/wrappers/") ||
|
|
106
|
+
normalized.startsWith("/etc/profiles/") ||
|
|
107
|
+
normalized.startsWith("/etc/alternatives/") ||
|
|
108
|
+
normalized.startsWith("/etc/ssl/") ||
|
|
109
|
+
normalized.startsWith("/etc/pki/") ||
|
|
110
|
+
normalized.startsWith("/etc/ca-certificates/") ||
|
|
111
|
+
normalized.startsWith("/run/systemd/resolve/") ||
|
|
112
|
+
normalized.startsWith("/run/NetworkManager/") ||
|
|
113
|
+
normalized.startsWith("/mnt/wsl/"));
|
|
114
|
+
}
|
|
115
|
+
function isCanonicalSystemPath(candidate) {
|
|
116
|
+
const normalized = path.posix.normalize(candidate);
|
|
117
|
+
return isKnownFile(normalized) || isKnownDirectory(normalized);
|
|
118
|
+
}
|
|
119
|
+
function userToolDestination(source, userHome) {
|
|
120
|
+
if (userHome === null || userHome === undefined || !path.isAbsolute(userHome) || userHome.includes("\0")) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const normalizedSource = path.posix.normalize(source);
|
|
124
|
+
const normalizedHome = path.posix.normalize(userHome);
|
|
125
|
+
const localBin = path.posix.join(normalizedHome, ".local", "bin");
|
|
126
|
+
const localLib = path.posix.join(normalizedHome, ".local", "lib");
|
|
127
|
+
const pnpmBin = path.posix.join(normalizedHome, ".local", "share", "pnpm");
|
|
128
|
+
if (normalizedSource === localBin || normalizedSource.startsWith(`${localBin}/`))
|
|
129
|
+
return "/home/nawabari/.local/bin";
|
|
130
|
+
if (normalizedSource === localLib || normalizedSource.startsWith(`${localLib}/`))
|
|
131
|
+
return "/home/nawabari/.local/lib";
|
|
132
|
+
if (normalizedSource === pnpmBin || normalizedSource.startsWith(`${pnpmBin}/`)) {
|
|
133
|
+
return "/home/nawabari/.local/share/pnpm";
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Compile only namespace-visible paths from the canonical topology. Host
|
|
139
|
+
* paths that are mounted at a fixed destination are translated to that
|
|
140
|
+
* destination; the host HOME, sibling worktrees, and arbitrary grants never
|
|
141
|
+
* become Landlock rules.
|
|
142
|
+
*/
|
|
143
|
+
export function deriveLandlockRules(topology) {
|
|
144
|
+
const rules = new Map();
|
|
145
|
+
addDirectoryRule(rules, topology.owned_worktree, WRITE_ACCESS);
|
|
146
|
+
addDirectoryRule(rules, "/home/nawabari", WRITE_ACCESS);
|
|
147
|
+
addDirectoryRule(rules, "/home/nawabari/.cache", WRITE_ACCESS);
|
|
148
|
+
addDirectoryRule(rules, "/home/nawabari/.nawabari", WRITE_ACCESS);
|
|
149
|
+
addDirectoryRule(rules, "/nawabari/git", WRITE_ACCESS);
|
|
150
|
+
addDirectoryRule(rules, "/nawabari/git/objects", READ_ACCESS);
|
|
151
|
+
// `/dev` already grants execute/read_file/read_dir. Only write_file is
|
|
152
|
+
// needed for subprocesses that open the canonical null device for output.
|
|
153
|
+
addRule(rules, "/dev/null", LANDLOCK_ACCESS_FS.write_file);
|
|
154
|
+
addDirectoryRule(rules, "/tmp", WRITE_ACCESS);
|
|
155
|
+
for (const source of topology.user_tool_paths) {
|
|
156
|
+
const destination = userToolDestination(source, topology.user_tool_home);
|
|
157
|
+
if (destination !== null)
|
|
158
|
+
addDirectoryRule(rules, destination, READ_ACCESS);
|
|
159
|
+
}
|
|
160
|
+
for (const source of topology.runtime_paths) {
|
|
161
|
+
if (isKnownFile(source))
|
|
162
|
+
addFileRule(rules, source);
|
|
163
|
+
else if (isKnownDirectory(source))
|
|
164
|
+
addDirectoryRule(rules, source, READ_ACCESS);
|
|
165
|
+
}
|
|
166
|
+
for (const source of topology.system_paths) {
|
|
167
|
+
if (!isCanonicalSystemPath(source))
|
|
168
|
+
continue;
|
|
169
|
+
if (isKnownFile(source))
|
|
170
|
+
addFileRule(rules, source);
|
|
171
|
+
else
|
|
172
|
+
addDirectoryRule(rules, source, READ_ACCESS);
|
|
173
|
+
}
|
|
174
|
+
return [...rules.entries()]
|
|
175
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
176
|
+
.map(([rulePath, allowedAccess]) => ({ path: rulePath, allowed_access: allowedAccess }));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Small in-namespace adapter. It is passed through argv to the selected
|
|
180
|
+
* runtime executable, never through a shell. Any setup failure exits before
|
|
181
|
+
* the requested command is exec'd and emits only a bounded marker/diagnostic.
|
|
182
|
+
*/
|
|
183
|
+
export const LANDLOCK_TRAMPOLINE = String.raw `
|
|
184
|
+
import ctypes, json, os, sys
|
|
185
|
+
|
|
186
|
+
SYS_LANDLOCK_CREATE_RULESET = 444
|
|
187
|
+
SYS_LANDLOCK_ADD_RULE = 445
|
|
188
|
+
SYS_LANDLOCK_RESTRICT_SELF = 446
|
|
189
|
+
LANDLOCK_CREATE_RULESET_VERSION = 1
|
|
190
|
+
LANDLOCK_RULE_TYPE_PATH_BENEATH = 1
|
|
191
|
+
PR_SET_NO_NEW_PRIVS = 38
|
|
192
|
+
O_PATH = getattr(os, "O_PATH", 0o10000000)
|
|
193
|
+
O_CLOEXEC = getattr(os, "O_CLOEXEC", 0o2000000)
|
|
194
|
+
LANDLOCK_ACCESS_FS_ABI1 = (1 << 13) - 1
|
|
195
|
+
LANDLOCK_ACCESS_FS_ABI2 = LANDLOCK_ACCESS_FS_ABI1 | (1 << 13)
|
|
196
|
+
LANDLOCK_ACCESS_FS_ABI3 = LANDLOCK_ACCESS_FS_ABI2 | (1 << 14)
|
|
197
|
+
|
|
198
|
+
class RulesetAttr(ctypes.Structure):
|
|
199
|
+
_fields_ = [("handled_access_fs", ctypes.c_uint64)]
|
|
200
|
+
|
|
201
|
+
class PathBeneath(ctypes.Structure):
|
|
202
|
+
_fields_ = [("allowed_access", ctypes.c_uint64), ("parent_fd", ctypes.c_int32)]
|
|
203
|
+
|
|
204
|
+
def fail(message):
|
|
205
|
+
bounded = str(message).replace("\n", " ")[:240]
|
|
206
|
+
sys.stderr.write("nawabari-landlock: " + bounded + "\n")
|
|
207
|
+
raise SystemExit(125)
|
|
208
|
+
|
|
209
|
+
def main():
|
|
210
|
+
if len(sys.argv) < 4 or sys.argv[2] != "--":
|
|
211
|
+
fail("invalid trampoline arguments")
|
|
212
|
+
try:
|
|
213
|
+
rules = json.loads(sys.argv[1])
|
|
214
|
+
except Exception as error:
|
|
215
|
+
fail("invalid derived rules: " + str(error))
|
|
216
|
+
if not isinstance(rules, list):
|
|
217
|
+
fail("invalid derived rules")
|
|
218
|
+
command = sys.argv[3:]
|
|
219
|
+
if not command or any("\x00" in item for item in command):
|
|
220
|
+
fail("invalid command arguments")
|
|
221
|
+
|
|
222
|
+
try:
|
|
223
|
+
libc = ctypes.CDLL(None, use_errno=True)
|
|
224
|
+
libc.syscall.restype = ctypes.c_long
|
|
225
|
+
version = libc.syscall(SYS_LANDLOCK_CREATE_RULESET, None, 0, LANDLOCK_CREATE_RULESET_VERSION)
|
|
226
|
+
if version < 1:
|
|
227
|
+
fail("Landlock ABI is unavailable")
|
|
228
|
+
abi = int(version)
|
|
229
|
+
handled = LANDLOCK_ACCESS_FS_ABI3 if abi >= 3 else LANDLOCK_ACCESS_FS_ABI2 if abi >= 2 else LANDLOCK_ACCESS_FS_ABI1
|
|
230
|
+
ruleset = RulesetAttr(handled_access_fs=handled)
|
|
231
|
+
ruleset_fd = libc.syscall(SYS_LANDLOCK_CREATE_RULESET, ctypes.byref(ruleset), ctypes.sizeof(ruleset), 0)
|
|
232
|
+
if ruleset_fd < 0:
|
|
233
|
+
fail("landlock_create_ruleset failed: " + os.strerror(ctypes.get_errno()))
|
|
234
|
+
opened = []
|
|
235
|
+
try:
|
|
236
|
+
for item in rules:
|
|
237
|
+
if not isinstance(item, dict) or not isinstance(item.get("path"), str):
|
|
238
|
+
fail("invalid derived rule")
|
|
239
|
+
rule_path = item["path"]
|
|
240
|
+
if not rule_path.startswith("/"):
|
|
241
|
+
fail("derived rule path is not absolute")
|
|
242
|
+
fd = os.open(rule_path, O_PATH | O_CLOEXEC)
|
|
243
|
+
opened.append(fd)
|
|
244
|
+
rule = PathBeneath(allowed_access=int(item.get("allowed_access", 0)) & handled, parent_fd=fd)
|
|
245
|
+
if libc.syscall(SYS_LANDLOCK_ADD_RULE, ruleset_fd, LANDLOCK_RULE_TYPE_PATH_BENEATH, ctypes.byref(rule), 0) < 0:
|
|
246
|
+
fail("landlock_add_rule failed: " + os.strerror(ctypes.get_errno()))
|
|
247
|
+
if libc.prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0:
|
|
248
|
+
fail("PR_SET_NO_NEW_PRIVS failed: " + os.strerror(ctypes.get_errno()))
|
|
249
|
+
if libc.syscall(SYS_LANDLOCK_RESTRICT_SELF, ruleset_fd, 0) < 0:
|
|
250
|
+
fail("landlock_restrict_self failed: " + os.strerror(ctypes.get_errno()))
|
|
251
|
+
finally:
|
|
252
|
+
for fd in opened:
|
|
253
|
+
try:
|
|
254
|
+
os.close(fd)
|
|
255
|
+
except OSError:
|
|
256
|
+
pass
|
|
257
|
+
os.close(ruleset_fd)
|
|
258
|
+
except SystemExit:
|
|
259
|
+
raise
|
|
260
|
+
except Exception as error:
|
|
261
|
+
fail("Landlock setup failed: " + str(error))
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
os.execvp(command[0], command)
|
|
265
|
+
except Exception as error:
|
|
266
|
+
fail("command execution failed: " + str(error))
|
|
267
|
+
|
|
268
|
+
main()
|
|
269
|
+
`;
|
|
270
|
+
export function landlockHandledAccessForAbi(abi) {
|
|
271
|
+
if (!Number.isSafeInteger(abi) || abi < LANDLOCK_ABI_MINIMUM)
|
|
272
|
+
return 0;
|
|
273
|
+
if (abi >= 3)
|
|
274
|
+
return LANDLOCK_ACCESS_FS_ABI3;
|
|
275
|
+
if (abi >= 2)
|
|
276
|
+
return LANDLOCK_ACCESS_FS_ABI2;
|
|
277
|
+
return LANDLOCK_ACCESS_FS_ABI1;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=landlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"landlock.js","sourceRoot":"","sources":["../../src/domain/landlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type NodeVersion = {
|
|
2
|
+
major: number;
|
|
3
|
+
minor: number;
|
|
4
|
+
patch: number;
|
|
5
|
+
};
|
|
6
|
+
/** The package manifest is the sole authority for the supported Node.js baseline. */
|
|
7
|
+
export declare const NODE_RUNTIME_POLICY: Readonly<{
|
|
8
|
+
engine: string;
|
|
9
|
+
minimum: Readonly<NodeVersion>;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function supportsRuntime(version: string): boolean;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
const packageMetadata = createRequire(import.meta.url)("../../package.json");
|
|
3
|
+
const nodeEngine = readNodeEngine(packageMetadata);
|
|
4
|
+
const minimumNodeVersion = parseNodeEngine(nodeEngine);
|
|
5
|
+
/** The package manifest is the sole authority for the supported Node.js baseline. */
|
|
6
|
+
export const NODE_RUNTIME_POLICY = Object.freeze({
|
|
7
|
+
engine: nodeEngine,
|
|
8
|
+
minimum: Object.freeze(minimumNodeVersion),
|
|
9
|
+
});
|
|
10
|
+
export function supportsRuntime(version) {
|
|
11
|
+
const parsedVersion = parseNodeVersion(version);
|
|
12
|
+
if (parsedVersion === null)
|
|
13
|
+
return false;
|
|
14
|
+
return compareVersions(parsedVersion, minimumNodeVersion) >= 0;
|
|
15
|
+
}
|
|
16
|
+
function readNodeEngine(metadata) {
|
|
17
|
+
if (typeof metadata.engines?.node !== "string") {
|
|
18
|
+
throw new Error("package.json must define engines.node as a string");
|
|
19
|
+
}
|
|
20
|
+
return metadata.engines.node;
|
|
21
|
+
}
|
|
22
|
+
function parseNodeEngine(engine) {
|
|
23
|
+
const match = engine.match(/^>=(\d+)(?:\.(\d+))?(?:\.(\d+))?$/u);
|
|
24
|
+
if (match === null) {
|
|
25
|
+
throw new Error(`package.json engines.node must be a lower-bound-only range, got ${engine}`);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
major: Number(match[1]),
|
|
29
|
+
minor: Number(match[2] ?? 0),
|
|
30
|
+
patch: Number(match[3] ?? 0),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function parseNodeVersion(version) {
|
|
34
|
+
const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/u);
|
|
35
|
+
if (match === null)
|
|
36
|
+
return null;
|
|
37
|
+
return {
|
|
38
|
+
major: Number(match[1]),
|
|
39
|
+
minor: Number(match[2]),
|
|
40
|
+
patch: Number(match[3]),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function compareVersions(left, right) {
|
|
44
|
+
if (left.major !== right.major)
|
|
45
|
+
return left.major - right.major;
|
|
46
|
+
if (left.minor !== right.minor)
|
|
47
|
+
return left.minor - right.minor;
|
|
48
|
+
return left.patch - right.patch;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/domain/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAc5C,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAoB,CAAC;AAChG,MAAM,UAAU,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AACnD,MAAM,kBAAkB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;AAEvD,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,eAAe,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,QAAyB;IAC/C,IAAI,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACjE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mEAAmE,MAAM,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB,EAAE,KAAkB;IAC5D,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAChE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAChE,OAAO,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AAClC,CAAC"}
|