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.
Files changed (90) hide show
  1. package/README.md +264 -29
  2. package/dist/cli-command-registry.d.ts +50 -0
  3. package/dist/cli-command-registry.js +509 -0
  4. package/dist/cli-command-registry.js.map +1 -0
  5. package/dist/cli.d.ts +18 -0
  6. package/dist/cli.js +302 -583
  7. package/dist/cli.js.map +1 -1
  8. package/dist/contract.d.ts +6 -0
  9. package/dist/contract.js +296 -192
  10. package/dist/contract.js.map +1 -1
  11. package/dist/domain/cgroups-v2.d.ts +77 -0
  12. package/dist/domain/cgroups-v2.js +434 -0
  13. package/dist/domain/cgroups-v2.js.map +1 -0
  14. package/dist/domain/doctor.d.ts +4 -1
  15. package/dist/domain/doctor.js +64 -13
  16. package/dist/domain/doctor.js.map +1 -1
  17. package/dist/domain/errors.d.ts +1 -1
  18. package/dist/domain/errors.js.map +1 -1
  19. package/dist/domain/landlock.d.ts +55 -0
  20. package/dist/domain/landlock.js +279 -0
  21. package/dist/domain/landlock.js.map +1 -0
  22. package/dist/domain/runtime.d.ts +12 -0
  23. package/dist/domain/runtime.js +50 -0
  24. package/dist/domain/runtime.js.map +1 -0
  25. package/dist/domain/sandbox-launcher.d.ts +26 -0
  26. package/dist/domain/sandbox-launcher.js +312 -23
  27. package/dist/domain/sandbox-launcher.js.map +1 -1
  28. package/dist/domain/sandbox-seccomp.d.ts +46 -0
  29. package/dist/domain/sandbox-seccomp.js +302 -0
  30. package/dist/domain/sandbox-seccomp.js.map +1 -0
  31. package/dist/domain/sandbox.d.ts +45 -1
  32. package/dist/domain/sandbox.js +176 -25
  33. package/dist/domain/sandbox.js.map +1 -1
  34. package/dist/domain/session-backend.d.ts +4 -1
  35. package/dist/domain/session-backend.js +256 -3
  36. package/dist/domain/session-backend.js.map +1 -1
  37. package/dist/domain/session.d.ts +207 -3
  38. package/dist/domain/session.js.map +1 -1
  39. package/dist/errors.d.ts +1 -1
  40. package/dist/failure-code-vocabulary.d.ts +20 -0
  41. package/dist/failure-code-vocabulary.js +216 -0
  42. package/dist/failure-code-vocabulary.js.map +1 -0
  43. package/dist/git.js +92 -6
  44. package/dist/git.js.map +1 -1
  45. package/dist/operation-authorization.d.ts +1 -1
  46. package/dist/product-state-manifest.d.ts +152 -0
  47. package/dist/product-state-manifest.js +240 -0
  48. package/dist/product-state-manifest.js.map +1 -0
  49. package/dist/public-contract.d.ts +25 -0
  50. package/dist/public-contract.js +29 -0
  51. package/dist/public-contract.js.map +1 -0
  52. package/dist/public-state.d.ts +75 -0
  53. package/dist/public-state.js +60 -0
  54. package/dist/public-state.js.map +1 -0
  55. package/dist/registry/lock.d.ts +8 -0
  56. package/dist/registry/lock.js +38 -20
  57. package/dist/registry/lock.js.map +1 -1
  58. package/dist/repository-evidence.d.ts +16 -0
  59. package/dist/repository-evidence.js.map +1 -1
  60. package/dist/resource-claims.d.ts +2 -2
  61. package/dist/resource-claims.js +96 -27
  62. package/dist/resource-claims.js.map +1 -1
  63. package/dist/session-lifecycle-actions.d.ts +64 -0
  64. package/dist/session-lifecycle-actions.js +117 -0
  65. package/dist/session-lifecycle-actions.js.map +1 -0
  66. package/dist/session-lifecycle-classification.d.ts +120 -0
  67. package/dist/session-lifecycle-classification.js +88 -0
  68. package/dist/session-lifecycle-classification.js.map +1 -0
  69. package/dist/session-registry.d.ts +210 -2
  70. package/dist/session-registry.js +1330 -87
  71. package/dist/session-registry.js.map +1 -1
  72. package/dist/state/index.d.ts +5 -0
  73. package/dist/state/index.js +4 -0
  74. package/dist/state/index.js.map +1 -0
  75. package/dist/state/session/actors.d.ts +71 -0
  76. package/dist/state/session/actors.js +259 -0
  77. package/dist/state/session/actors.js.map +1 -0
  78. package/dist/state/session/guards.d.ts +25 -0
  79. package/dist/state/session/guards.js +108 -0
  80. package/dist/state/session/guards.js.map +1 -0
  81. package/dist/state/session/index.d.ts +6 -0
  82. package/dist/state/session/index.js +5 -0
  83. package/dist/state/session/index.js.map +1 -0
  84. package/dist/state/session/machine.d.ts +185 -0
  85. package/dist/state/session/machine.js +408 -0
  86. package/dist/state/session/machine.js.map +1 -0
  87. package/dist/state/session/types.d.ts +94 -0
  88. package/dist/state/session/types.js +14 -0
  89. package/dist/state/session/types.js.map +1 -0
  90. package/package.json +46 -26
@@ -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
- function supportsRuntime(version) {
9
- const [majorText, minorText] = version.split(".");
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 runtimeOk = supportsRuntime(process.versions.node);
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: process.versions.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: process.versions.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":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/domain/doctor.ts"],"names":[],"mappings":"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"}
@@ -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":"AAoGA;;;;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"}
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAU,CAAC;AAC/C,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAU,CAAC;AAC1D,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAU,CAAC;AAE1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,UAAU,EAAE,CAAC,IAAI,CAAC;IAClB,SAAS,EAAE,CAAC,IAAI,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,UAAU,EAAE,CAAC,IAAI,CAAC;IAClB,WAAW,EAAE,CAAC,IAAI,CAAC;IACnB,SAAS,EAAE,CAAC,IAAI,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,SAAS,EAAE,CAAC,IAAI,CAAC;IACjB,SAAS,EAAE,CAAC,IAAI,EAAE;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE;IACjB,KAAK,EAAE,CAAC,IAAI,EAAE;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAClC,kBAAkB,CAAC,OAAO;IAC1B,kBAAkB,CAAC,UAAU;IAC7B,kBAAkB,CAAC,SAAS;IAC5B,kBAAkB,CAAC,QAAQ;IAC3B,kBAAkB,CAAC,UAAU;IAC7B,kBAAkB,CAAC,WAAW;IAC9B,kBAAkB,CAAC,SAAS;IAC5B,kBAAkB,CAAC,QAAQ;IAC3B,kBAAkB,CAAC,QAAQ;IAC3B,kBAAkB,CAAC,SAAS;IAC5B,kBAAkB,CAAC,SAAS;IAC5B,kBAAkB,CAAC,UAAU;IAC7B,kBAAkB,CAAC,QAAQ,CAAC;AAE9B,MAAM,uBAAuB,GAAG,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,CAAC;AACnF,MAAM,uBAAuB,GAAG,uBAAuB,GAAG,kBAAkB,CAAC,QAAQ,CAAC;AAEtF,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC;AAC5G,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAiB7C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,qBAAqB,CAAC;AAEnE,SAAS,OAAO,CAAC,KAA0B,EAAE,SAAiB,EAAE,aAAqB;IACnF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,yEAAyE;IACzE,oEAAoE;IACpE,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO;IAC/B,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,cAAc,CAAC,KAA0B,EAAE,SAAiB;IACnE,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjF,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA0B,EAAE,SAAiB,EAAE,aAAqB;IAC5F,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO;IACpE,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,KAA0B,EAAE,SAAiB;IAChE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO;IACpE,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,OAAO,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CACvG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,CACL,UAAU,KAAK,MAAM;QACrB,UAAU,KAAK,OAAO;QACtB,UAAU,KAAK,MAAM;QACrB,UAAU,KAAK,MAAM;QACrB,UAAU,KAAK,MAAM;QACrB,UAAU,KAAK,MAAM;QACrB,UAAU,KAAK,QAAQ;QACvB,UAAU,KAAK,YAAY;QAC3B,UAAU,KAAK,qBAAqB;QACpC,UAAU,KAAK,eAAe;QAC9B,UAAU,KAAK,eAAe;QAC9B,UAAU,KAAK,mBAAmB;QAClC,UAAU,KAAK,UAAU;QACzB,UAAU,KAAK,UAAU;QACzB,UAAU,KAAK,sBAAsB;QACrC,UAAU,KAAK,sBAAsB;QACrC,UAAU,KAAK,qBAAqB;QACpC,UAAU,KAAK,UAAU;QACzB,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;QAChC,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC;QACpC,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAC7C,UAAU,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACvC,UAAU,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACvC,UAAU,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAC3C,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC;QAClC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC;QAClC,UAAU,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAC9C,UAAU,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAC9C,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAC7C,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,QAAmC;IAC9E,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3E,IAAI,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC;QAAE,OAAO,2BAA2B,CAAC;IACrH,IAAI,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC;QAAE,OAAO,2BAA2B,CAAC;IACrH,IAAI,gBAAgB,KAAK,OAAO,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;QAC/E,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAmC;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC/D,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACxD,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,EAAE,YAAY,CAAC,CAAC;IAC/D,gBAAgB,CAAC,KAAK,EAAE,0BAA0B,EAAE,YAAY,CAAC,CAAC;IAClE,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACvD,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,EAAE,WAAW,CAAC,CAAC;IAC9D,wEAAwE;IACxE,0EAA0E;IAC1E,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC3D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAE9C,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;QACzE,IAAI,WAAW,KAAK,IAAI;YAAE,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,MAAM,CAAC;YAAE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aAC/C,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAAE,SAAS;QAC7C,IAAI,WAAW,CAAC,MAAM,CAAC;YAAE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;;YAC/C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsF5C,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,oBAAoB;QAAE,OAAO,CAAC,CAAC;IACvE,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC;IAC7C,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC;IAC7C,OAAO,uBAAuB,CAAC;AACjC,CAAC"}
@@ -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"}