nawabari 0.1.0 → 0.2.0
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 +213 -5
- package/dist/cli.js +320 -6
- package/dist/cli.js.map +1 -1
- package/dist/contract.d.ts +9 -0
- package/dist/contract.js +172 -0
- package/dist/contract.js.map +1 -0
- package/dist/domain/doctor.d.ts +1 -1
- package/dist/domain/doctor.js +99 -90
- package/dist/domain/doctor.js.map +1 -1
- package/dist/domain/errors.d.ts +1 -1
- package/dist/domain/errors.js +5 -1
- package/dist/domain/errors.js.map +1 -1
- package/dist/domain/session-backend.d.ts +11 -1
- package/dist/domain/session-backend.js +247 -3
- package/dist/domain/session-backend.js.map +1 -1
- package/dist/domain/session.d.ts +131 -0
- package/dist/domain/session.js +6 -0
- package/dist/domain/session.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/git.d.ts +40 -0
- package/dist/git.js +415 -30
- package/dist/git.js.map +1 -1
- package/dist/operation-authorization.d.ts +73 -0
- package/dist/operation-authorization.js +42 -0
- package/dist/operation-authorization.js.map +1 -0
- package/dist/presentation.js +49 -19
- package/dist/presentation.js.map +1 -1
- package/dist/resource-claims.d.ts +65 -0
- package/dist/resource-claims.js +398 -0
- package/dist/resource-claims.js.map +1 -0
- package/dist/session-registry.d.ts +215 -1
- package/dist/session-registry.js +1749 -185
- package/dist/session-registry.js.map +1 -1
- package/package.json +1 -1
package/dist/contract.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/** Stable discovery identifier for the standalone local execution contract. */
|
|
2
|
+
export const MACHINE_CONTRACT_ID = "nawabari.standalone-execution.v1";
|
|
3
|
+
export const MACHINE_CONTRACT_SCHEMA_VERSION = 1;
|
|
4
|
+
const MACHINE_CONTRACT_CAPABILITIES = Object.freeze([
|
|
5
|
+
{
|
|
6
|
+
id: "session-lifecycle",
|
|
7
|
+
commands: ["session create", "session id", "session show", "session list", "status", "session close"],
|
|
8
|
+
result_schema: "session.v1",
|
|
9
|
+
identities: ["session_id", "repository", "worktree", "branch", "state"],
|
|
10
|
+
failure_codes: [
|
|
11
|
+
"NOT_GIT_REPOSITORY",
|
|
12
|
+
"PROTECTED_WORKTREE",
|
|
13
|
+
"PROTECTED_BRANCH",
|
|
14
|
+
"WORKTREE_ALREADY_EXISTS",
|
|
15
|
+
"BRANCH_ALREADY_EXISTS",
|
|
16
|
+
"WORKTREE_OWNED_BY_OTHER_SESSION",
|
|
17
|
+
"BRANCH_OWNED_BY_OTHER_SESSION",
|
|
18
|
+
"SESSION_NOT_FOUND",
|
|
19
|
+
"NO_CURRENT_SESSION",
|
|
20
|
+
"DIRTY_WORKTREE",
|
|
21
|
+
"RECOVERABLE_COMMITS",
|
|
22
|
+
"RECOVERABLE_STASHES",
|
|
23
|
+
"MISSING_WORKTREE",
|
|
24
|
+
"REGISTRY_CORRUPT",
|
|
25
|
+
"LOCK_CONTENTION",
|
|
26
|
+
"GIT_COMMAND_FAILED",
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "resource-claims",
|
|
31
|
+
commands: ["session claim", "session update", "session claims", "session release"],
|
|
32
|
+
result_schema: "claim.v1",
|
|
33
|
+
identities: ["claim_id", "session_id", "repository", "worktree", "resource", "mode"],
|
|
34
|
+
failure_codes: [
|
|
35
|
+
"INVALID_CLAIM",
|
|
36
|
+
"INVALID_RESOURCE",
|
|
37
|
+
"INVALID_CLAIM_RESOURCE",
|
|
38
|
+
"CLAIM_PATH_TRAVERSAL",
|
|
39
|
+
"CLAIM_SYMLINK_ESCAPE",
|
|
40
|
+
"CLAIM_AMBIGUOUS_PATH",
|
|
41
|
+
"UNSUPPORTED_CLAIM_GLOB",
|
|
42
|
+
"CLAIM_REPOSITORY_MISMATCH",
|
|
43
|
+
"CLAIM_SESSION_MISMATCH",
|
|
44
|
+
"DUPLICATE_CLAIM",
|
|
45
|
+
"CONTRADICTORY_CLAIM",
|
|
46
|
+
"RESOURCE_CLAIM_CONFLICT",
|
|
47
|
+
"CLAIM_NOT_FOUND",
|
|
48
|
+
"SESSION_NOT_ACTIVE",
|
|
49
|
+
"LOCK_CONTENTION",
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "authorization-and-evidence",
|
|
54
|
+
commands: ["guard", "authorize", "checkpoint"],
|
|
55
|
+
result_schema: "decision.v1 / evidence.v1",
|
|
56
|
+
identities: ["operation", "allowed", "code", "claim_ids", "head", "in_claim", "out_of_claim"],
|
|
57
|
+
failure_codes: [
|
|
58
|
+
"INVALID_OPERATION",
|
|
59
|
+
"INVALID_RESOURCE",
|
|
60
|
+
"MISSING_RESOURCE_CLAIM",
|
|
61
|
+
"RESOURCE_CLAIM_CONFLICT",
|
|
62
|
+
"OWNERSHIP_MISMATCH",
|
|
63
|
+
"WORKTREE_MISMATCH",
|
|
64
|
+
"BRANCH_MISMATCH",
|
|
65
|
+
"DETACHED_HEAD",
|
|
66
|
+
"STALE_REGISTRY",
|
|
67
|
+
"GIT_STATE_AMBIGUOUS",
|
|
68
|
+
"PHYSICAL_OBSERVATION_UNAVAILABLE",
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "governed-git-mutation",
|
|
73
|
+
commands: ["commit", "push"],
|
|
74
|
+
result_schema: "commit.v1 / push.v1",
|
|
75
|
+
identities: ["commit_sha", "remote", "branch", "target", "relation"],
|
|
76
|
+
failure_codes: [
|
|
77
|
+
"INVALID_COMMIT_MESSAGE",
|
|
78
|
+
"COMMIT_EMPTY_DIFF",
|
|
79
|
+
"UNEXPECTED_CHANGED_PATHS",
|
|
80
|
+
"COMMIT_STAGING_FAILED",
|
|
81
|
+
"COMMIT_FAILED",
|
|
82
|
+
"COMMIT_RESULT_UNAVAILABLE",
|
|
83
|
+
"INVALID_REMOTE",
|
|
84
|
+
"INVALID_REMOTE_BRANCH",
|
|
85
|
+
"PUSH_TARGET_MISMATCH",
|
|
86
|
+
"PUSH_REMOTE_INSPECTION_FAILED",
|
|
87
|
+
"PUSH_NO_UPSTREAM",
|
|
88
|
+
"PUSH_BEHIND",
|
|
89
|
+
"PUSH_DIVERGED",
|
|
90
|
+
"PUSH_DIRTY_WORKTREE",
|
|
91
|
+
"PUSH_FAILED",
|
|
92
|
+
"GIT_SPAWN_FAILED",
|
|
93
|
+
"GIT_TIMEOUT",
|
|
94
|
+
"GIT_OUTPUT_LIMIT",
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: "reconciliation-and-cleanup",
|
|
99
|
+
commands: ["doctor", "gc"],
|
|
100
|
+
result_schema: "reconciliation.v1 / cleanup.v1",
|
|
101
|
+
identities: ["clean", "issues", "candidates", "cleaned", "blocked", "recovery_hints"],
|
|
102
|
+
failure_codes: [
|
|
103
|
+
"RECONCILIATION_DRIFT",
|
|
104
|
+
"MISSING_WORKTREE",
|
|
105
|
+
"OWNERSHIP_MISMATCH",
|
|
106
|
+
"DIRTY_WORKTREE",
|
|
107
|
+
"RECOVERABLE_COMMITS",
|
|
108
|
+
"RECOVERABLE_STASHES",
|
|
109
|
+
"NESTED_REPOSITORY",
|
|
110
|
+
"STALE_SESSION",
|
|
111
|
+
"REGISTRY_CORRUPT",
|
|
112
|
+
"LOCK_CONTENTION",
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
/**
|
|
117
|
+
* Return a JSON-safe description of the installed machine contract.
|
|
118
|
+
* Discovery intentionally has no repository or network precondition.
|
|
119
|
+
*/
|
|
120
|
+
export function machineContract(packageVersion) {
|
|
121
|
+
return {
|
|
122
|
+
schema_version: MACHINE_CONTRACT_SCHEMA_VERSION,
|
|
123
|
+
contract_id: MACHINE_CONTRACT_ID,
|
|
124
|
+
capability_id: MACHINE_CONTRACT_ID,
|
|
125
|
+
package: "nawabari",
|
|
126
|
+
package_version: packageVersion,
|
|
127
|
+
capabilities: MACHINE_CONTRACT_CAPABILITIES.map((capability) => ({
|
|
128
|
+
id: capability.id,
|
|
129
|
+
commands: [...capability.commands],
|
|
130
|
+
result_schema: capability.result_schema,
|
|
131
|
+
identities: [...capability.identities],
|
|
132
|
+
failure_codes: [...capability.failure_codes],
|
|
133
|
+
})),
|
|
134
|
+
json: {
|
|
135
|
+
schema_version: 1,
|
|
136
|
+
success: {
|
|
137
|
+
required: ["ok", "command"],
|
|
138
|
+
ok: true,
|
|
139
|
+
exit_code: 0,
|
|
140
|
+
},
|
|
141
|
+
failure: {
|
|
142
|
+
required: ["ok", "command", "code", "message"],
|
|
143
|
+
ok: false,
|
|
144
|
+
exit_codes: {
|
|
145
|
+
usage: 2,
|
|
146
|
+
rejected: 3,
|
|
147
|
+
unavailable: 4,
|
|
148
|
+
doctor: 5,
|
|
149
|
+
internal: 70,
|
|
150
|
+
},
|
|
151
|
+
stderr: "empty",
|
|
152
|
+
},
|
|
153
|
+
one_document: true,
|
|
154
|
+
human_output_is_not_contract: true,
|
|
155
|
+
},
|
|
156
|
+
bounded_local_execution: {
|
|
157
|
+
git_timeout_ms: 10_000,
|
|
158
|
+
git_max_output_bytes: 65_536,
|
|
159
|
+
checkpoint_max_paths: 4_096,
|
|
160
|
+
},
|
|
161
|
+
dependencies: {
|
|
162
|
+
local_git: true,
|
|
163
|
+
network: false,
|
|
164
|
+
github: false,
|
|
165
|
+
gh: false,
|
|
166
|
+
mottainai: false,
|
|
167
|
+
llm: false,
|
|
168
|
+
agent_runtime: false,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/doctor.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type DomainResult, type ErrorCode, type JsonObject } from "./errors.js";
|
|
2
2
|
export type DoctorCheckStatus = "ok" | "warning" | "error" | "not_configured" | "not_applicable";
|
|
3
3
|
export type DoctorCheck = {
|
|
4
|
-
name: "git" | "repository" | "registry" | "runtime";
|
|
4
|
+
name: "git" | "repository" | "registry" | "reconciliation" | "runtime";
|
|
5
5
|
status: DoctorCheckStatus;
|
|
6
6
|
code: ErrorCode | null;
|
|
7
7
|
message: string;
|
package/dist/domain/doctor.js
CHANGED
|
@@ -1,51 +1,10 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
1
|
import { readFile } from "node:fs/promises";
|
|
3
2
|
import path from "node:path";
|
|
4
3
|
import process from "node:process";
|
|
5
|
-
import {
|
|
4
|
+
import { defaultGit, resolveRepositoryContext } from "../git.js";
|
|
6
5
|
import { isSessionRegistryError } from "../errors.js";
|
|
6
|
+
import { SessionRegistry } from "../session-registry.js";
|
|
7
7
|
import { success } from "./errors.js";
|
|
8
|
-
function runGit(args, cwd) {
|
|
9
|
-
return new Promise((resolve) => {
|
|
10
|
-
const child = spawn("git", args, {
|
|
11
|
-
cwd,
|
|
12
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
13
|
-
env: { ...process.env, GIT_TERMINAL_PROMPT: "0", GIT_OPTIONAL_LOCKS: "0" },
|
|
14
|
-
});
|
|
15
|
-
let stdout = "";
|
|
16
|
-
let stderr = "";
|
|
17
|
-
let settled = false;
|
|
18
|
-
const timer = setTimeout(() => {
|
|
19
|
-
if (settled)
|
|
20
|
-
return;
|
|
21
|
-
settled = true;
|
|
22
|
-
child.kill("SIGKILL");
|
|
23
|
-
resolve({ exit_code: null, stdout, stderr, error: "git command timed out" });
|
|
24
|
-
}, 10_000);
|
|
25
|
-
child.stdout.setEncoding("utf8");
|
|
26
|
-
child.stderr.setEncoding("utf8");
|
|
27
|
-
child.stdout.on("data", (chunk) => {
|
|
28
|
-
stdout += chunk;
|
|
29
|
-
});
|
|
30
|
-
child.stderr.on("data", (chunk) => {
|
|
31
|
-
stderr += chunk;
|
|
32
|
-
});
|
|
33
|
-
child.on("error", (error) => {
|
|
34
|
-
if (settled)
|
|
35
|
-
return;
|
|
36
|
-
settled = true;
|
|
37
|
-
clearTimeout(timer);
|
|
38
|
-
resolve({ exit_code: null, stdout, stderr, error: error.message });
|
|
39
|
-
});
|
|
40
|
-
child.on("close", (exitCode) => {
|
|
41
|
-
if (settled)
|
|
42
|
-
return;
|
|
43
|
-
settled = true;
|
|
44
|
-
clearTimeout(timer);
|
|
45
|
-
resolve({ exit_code: exitCode, stdout, stderr, error: null });
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
8
|
function supportsRuntime(version) {
|
|
50
9
|
const [majorText, minorText] = version.split(".");
|
|
51
10
|
const major = Number(majorText);
|
|
@@ -55,22 +14,14 @@ function supportsRuntime(version) {
|
|
|
55
14
|
function check(name, status, code, message, details = {}) {
|
|
56
15
|
return { name, status, code, message, details };
|
|
57
16
|
}
|
|
58
|
-
function
|
|
59
|
-
const lines = stdout
|
|
60
|
-
.trim()
|
|
61
|
-
.split(/\r?\n/u)
|
|
62
|
-
.map((line) => line.trim());
|
|
63
|
-
if (lines.length < 2 || lines[0] === "" || lines[1] === "")
|
|
64
|
-
return null;
|
|
65
|
-
const topLevel = path.resolve(cwd, lines[0]);
|
|
66
|
-
const commonDir = path.resolve(cwd, lines[1]);
|
|
17
|
+
function repositoryInfo(context) {
|
|
67
18
|
return {
|
|
68
|
-
top_level:
|
|
69
|
-
common_dir:
|
|
70
|
-
registry_path: path.join(
|
|
19
|
+
top_level: context.worktreePath,
|
|
20
|
+
common_dir: context.commonGitDirectory,
|
|
21
|
+
registry_path: path.join(context.commonGitDirectory, "nawabari", "session-registry.json"),
|
|
71
22
|
};
|
|
72
23
|
}
|
|
73
|
-
async function inspectRegistry(repository) {
|
|
24
|
+
async function inspectRegistry(repository, context) {
|
|
74
25
|
try {
|
|
75
26
|
const contents = await readFile(repository.registry_path, "utf8");
|
|
76
27
|
let parsed;
|
|
@@ -88,8 +39,7 @@ async function inspectRegistry(repository) {
|
|
|
88
39
|
});
|
|
89
40
|
}
|
|
90
41
|
try {
|
|
91
|
-
const
|
|
92
|
-
const sessions = registry.list();
|
|
42
|
+
const sessions = new SessionRegistry({ repository: context, git: defaultGit }).list();
|
|
93
43
|
return check("registry", "ok", null, "The Nawabari registry is readable and valid.", {
|
|
94
44
|
path: repository.registry_path,
|
|
95
45
|
bytes: contents.length,
|
|
@@ -97,13 +47,10 @@ async function inspectRegistry(repository) {
|
|
|
97
47
|
});
|
|
98
48
|
}
|
|
99
49
|
catch (error) {
|
|
100
|
-
const code =
|
|
101
|
-
? "REGISTRY_CORRUPT"
|
|
102
|
-
: isSessionRegistryError(error) && error.code === "REGISTRY_REPOSITORY_MISMATCH"
|
|
103
|
-
? "INVALID_REGISTRY"
|
|
104
|
-
: "REGISTRY_UNREADABLE";
|
|
50
|
+
const code = doctorErrorCode(error, "REGISTRY_UNREADABLE");
|
|
105
51
|
return check("registry", "error", code, "The Nawabari registry failed authoritative validation.", {
|
|
106
52
|
path: repository.registry_path,
|
|
53
|
+
...(isSessionRegistryError(error) ? { reason: error.code } : {}),
|
|
107
54
|
});
|
|
108
55
|
}
|
|
109
56
|
}
|
|
@@ -118,8 +65,30 @@ async function inspectRegistry(repository) {
|
|
|
118
65
|
});
|
|
119
66
|
}
|
|
120
67
|
}
|
|
121
|
-
function
|
|
122
|
-
|
|
68
|
+
async function inspectReconciliation(context) {
|
|
69
|
+
try {
|
|
70
|
+
const result = new SessionRegistry({ repository: context, git: defaultGit }).reconcile();
|
|
71
|
+
const issues = result.issues.map((issue) => ({
|
|
72
|
+
code: issue.code,
|
|
73
|
+
message: issue.message,
|
|
74
|
+
session_id: issue.sessionId,
|
|
75
|
+
worktree: issue.worktreePath,
|
|
76
|
+
branch: issue.branchName,
|
|
77
|
+
details: { ...issue.details },
|
|
78
|
+
recovery_hints: [...issue.recoveryHints],
|
|
79
|
+
}));
|
|
80
|
+
return check("reconciliation", result.clean ? "ok" : "warning", result.clean ? null : "RECONCILIATION_DRIFT", result.clean
|
|
81
|
+
? "Registry session ownership matches the observed Git worktree state."
|
|
82
|
+
: "Registry/Git ownership drift is present; no destructive repair was performed.", {
|
|
83
|
+
clean: result.clean,
|
|
84
|
+
sessions: result.sessions.length,
|
|
85
|
+
worktrees: result.worktrees.length,
|
|
86
|
+
issues,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return check("reconciliation", "error", doctorErrorCode(error, "REGISTRY_UNREADABLE"), "Authoritative registry/Git reconciliation could not be completed.", { ...(isSessionRegistryError(error) ? { reason: error.code, ...error.details } : {}) });
|
|
91
|
+
}
|
|
123
92
|
}
|
|
124
93
|
export async function runDoctor(cwd = process.cwd()) {
|
|
125
94
|
const checks = [];
|
|
@@ -131,37 +100,77 @@ export async function runDoctor(cwd = process.cwd()) {
|
|
|
131
100
|
: check("runtime", "error", "UNSUPPORTED_RUNTIME", "The Node.js runtime is below the supported version.", {
|
|
132
101
|
node: process.versions.node,
|
|
133
102
|
}));
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
checks.push(check("git", "
|
|
103
|
+
try {
|
|
104
|
+
const version = defaultGit.run(["--version"], cwd);
|
|
105
|
+
checks.push(check("git", "ok", null, "Git is available.", { version }));
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
checks.push(check("git", "error", doctorErrorCode(error, "GIT_UNAVAILABLE"), "Git is not available to the local CLI.", {
|
|
137
109
|
command: "git --version",
|
|
138
|
-
reason:
|
|
110
|
+
...(isSessionRegistryError(error) ? { reason: error.code } : {}),
|
|
139
111
|
}));
|
|
140
112
|
checks.push(check("repository", "not_applicable", null, "Repository resolution was skipped because Git is unavailable."));
|
|
141
113
|
checks.push(check("registry", "not_applicable", null, "Registry inspection was skipped because Git is unavailable."));
|
|
114
|
+
return success({ ok: false, checks, repository: null });
|
|
142
115
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return success({ ok: !hasError, checks, repository });
|
|
116
|
+
let repository = null;
|
|
117
|
+
try {
|
|
118
|
+
const context = resolveRepositoryContext({ cwd, git: defaultGit });
|
|
119
|
+
repository = repositoryInfo(context);
|
|
120
|
+
checks.push(check("repository", "ok", null, "Repository and common Git directory resolved.", {
|
|
121
|
+
top_level: repository.top_level,
|
|
122
|
+
common_dir: repository.common_dir,
|
|
123
|
+
}));
|
|
124
|
+
const registryCheck = await inspectRegistry(repository, context);
|
|
125
|
+
checks.push(registryCheck);
|
|
126
|
+
checks.push(registryCheck.status === "ok"
|
|
127
|
+
? await inspectReconciliation(context)
|
|
128
|
+
: check("reconciliation", "not_applicable", null, "Reconciliation was skipped because the registry is invalid."));
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
checks.push(check("repository", "error", doctorErrorCode(error, "NOT_GIT_REPOSITORY"), "The current directory is not a valid Git repository context.", {
|
|
132
|
+
...(isSessionRegistryError(error) ? { reason: error.code, ...error.details } : {}),
|
|
133
|
+
}));
|
|
134
|
+
checks.push(check("registry", "not_applicable", null, "Registry inspection was skipped outside a Git repository."));
|
|
163
135
|
}
|
|
164
136
|
const hasError = checks.some((item) => item.status === "error");
|
|
165
|
-
return success({ ok: !hasError, checks, repository
|
|
137
|
+
return success({ ok: !hasError, checks, repository });
|
|
138
|
+
}
|
|
139
|
+
function doctorErrorCode(error, fallback) {
|
|
140
|
+
if (!isSessionRegistryError(error))
|
|
141
|
+
return fallback;
|
|
142
|
+
const code = error.code;
|
|
143
|
+
if (code === "GIT_SPAWN_FAILED")
|
|
144
|
+
return "GIT_SPAWN_FAILED";
|
|
145
|
+
if (code === "GIT_TIMEOUT")
|
|
146
|
+
return "GIT_TIMEOUT";
|
|
147
|
+
if (code === "GIT_OUTPUT_LIMIT")
|
|
148
|
+
return "GIT_OUTPUT_LIMIT";
|
|
149
|
+
if (code === "GIT_COMMAND_FAILED")
|
|
150
|
+
return "GIT_COMMAND_FAILED";
|
|
151
|
+
if (code === "NOT_A_GIT_REPOSITORY")
|
|
152
|
+
return "NOT_GIT_REPOSITORY";
|
|
153
|
+
if (code === "MISSING_WORKTREE")
|
|
154
|
+
return "MISSING_WORKTREE";
|
|
155
|
+
if (code === "PHYSICAL_OBSERVATION_UNAVAILABLE")
|
|
156
|
+
return "PHYSICAL_OBSERVATION_UNAVAILABLE";
|
|
157
|
+
if (code === "REPOSITORY_IDENTITY_AMBIGUOUS")
|
|
158
|
+
return "GIT_STATE_AMBIGUOUS";
|
|
159
|
+
if (code === "REGISTRY_CORRUPT" || code === "UNSUPPORTED_SCHEMA_VERSION")
|
|
160
|
+
return "REGISTRY_CORRUPT";
|
|
161
|
+
if (code === "REGISTRY_REPOSITORY_MISMATCH")
|
|
162
|
+
return "INVALID_REGISTRY";
|
|
163
|
+
if (code === "INVALID_BRANCH_ID")
|
|
164
|
+
return "INVALID_BRANCH";
|
|
165
|
+
if (code === "INVALID_WORKTREE_PATH")
|
|
166
|
+
return "INVALID_WORKTREE";
|
|
167
|
+
if (code === "WORKTREE_IDENTITY_AMBIGUOUS")
|
|
168
|
+
return "GIT_STATE_AMBIGUOUS";
|
|
169
|
+
if (code === "RECONCILIATION_DRIFT")
|
|
170
|
+
return "RECONCILIATION_DRIFT";
|
|
171
|
+
return fallback;
|
|
172
|
+
}
|
|
173
|
+
function isFileNotFound(error) {
|
|
174
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
166
175
|
}
|
|
167
176
|
//# sourceMappingURL=doctor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/domain/doctor.ts"],"names":[],"mappings":"AAAA,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,OAAO,EAAsD,MAAM,aAAa,CAAC;AAwB1F,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,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,CAAC,CAAC,CAAC,EAAE,CAAC;aACjE,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,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,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CACT,SAAS;QACP,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,2DAA2D,EAAE;YACxF,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;SAC5B,CAAC;QACJ,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,qDAAqD,EAAE;YACtG,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;SAC5B,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,CAAC,CAAC;IAC1D,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,CAAC,CAAC;AACxD,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,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" | "GIT_OPERATION_FAILED" | "GIT_UNAVAILABLE" | "INVALID_ARGUMENT" | "INVALID_BRANCH" | "INVALID_BASE_REF" | "INVALID_REGISTRY" | "INVALID_SESSION_ID" | "INVALID_WORKTREE" | "LOCK_CONTENTION" | "MISSING_ARGUMENT" | "NO_COMMAND" | "NO_CURRENT_SESSION" | "NOT_GIT_REPOSITORY" | "OPERATION_REJECTED" | "OWNERSHIP_MISMATCH" | "PROTECTED_BRANCH" | "PROTECTED_WORKTREE" | "RECOVERABLE_COMMITS" | "REGISTRY_CORRUPT" | "REGISTRY_UNREADABLE" | "SESSION_NOT_FOUND" | "STALE_SESSION" | "UNSUPPORTED_RUNTIME" | "UNKNOWN_COMMAND" | "WORKTREE_OWNED_BY_OTHER_SESSION" | "WORKTREE_ALREADY_EXISTS" | "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" | "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" | "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" | "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" | "INVALID_REMOTE" | "INVALID_REMOTE_BRANCH" | "PUSH_TARGET_MISMATCH" | "PUSH_REMOTE_INSPECTION_FAILED" | "PUSH_NO_UPSTREAM" | "PUSH_BEHIND" | "PUSH_DIVERGED" | "PUSH_DIRTY_WORKTREE" | "PUSH_FAILED" | "INTERNAL_ERROR";
|
|
7
7
|
export declare const EXIT_CODES: Readonly<{
|
|
8
8
|
success: 0;
|
|
9
9
|
usage: 2;
|
package/dist/domain/errors.js
CHANGED
|
@@ -14,7 +14,11 @@ function defaultExitCode(code) {
|
|
|
14
14
|
if (code === "UNKNOWN_COMMAND" ||
|
|
15
15
|
code === "NO_COMMAND" ||
|
|
16
16
|
code === "INVALID_ARGUMENT" ||
|
|
17
|
-
code === "MISSING_ARGUMENT"
|
|
17
|
+
code === "MISSING_ARGUMENT" ||
|
|
18
|
+
code === "INVALID_OPERATION" ||
|
|
19
|
+
code === "INVALID_COMMIT_MESSAGE" ||
|
|
20
|
+
code === "INVALID_REMOTE" ||
|
|
21
|
+
code === "INVALID_REMOTE_BRANCH") {
|
|
18
22
|
return EXIT_CODES.usage;
|
|
19
23
|
}
|
|
20
24
|
if (code === "INTERNAL_ERROR")
|
|
@@ -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":"AAyFA,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,IAAI,IAAI,KAAK,qBAAqB;QAAE,OAAO,UAAU,CAAC,WAAW,CAAC;IAClE,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,6 +1,6 @@
|
|
|
1
1
|
import { type SessionRegistryOptions } from "../session-registry.js";
|
|
2
2
|
import { type DomainResult } from "./errors.js";
|
|
3
|
-
import { type BackendCapabilities, type GarbageCollectOptions, type GarbageCollectResult, type GuardDecision, type GuardOptions, type SessionBackend, type SessionCloseOptions, type SessionCloseResult, type SessionContext, type SessionCreateOptions, type SessionListResult, type SessionRecord, type StatusResult } from "./session.js";
|
|
3
|
+
import { type BackendCapabilities, type CheckpointEvidence, type CheckpointOptions, type CommitOptions, type CommitResult, type ClaimResourcesOptions, type ClaimResourcesResult, type GarbageCollectOptions, type GarbageCollectResult, type GuardDecision, type GuardOptions, type OperationAuthorizationDecision, type OperationAuthorizationOptions, type PushOptions, type PushResult, type SessionBackend, type SessionCloseOptions, type SessionCloseResult, type SessionContext, type SessionCreateOptions, type SessionListResult, type SessionRecord, type ReleaseClaimsOptions, type ReleaseClaimsResult, type ResourceClaim, type StatusResult, type UpdateClaimsOptions } from "./session.js";
|
|
4
4
|
export interface LocalSessionBackendOptions {
|
|
5
5
|
readonly git?: SessionRegistryOptions["git"];
|
|
6
6
|
readonly registry?: Omit<SessionRegistryOptions, "cwd" | "git">;
|
|
@@ -15,10 +15,20 @@ export declare class LocalSessionBackend implements SessionBackend {
|
|
|
15
15
|
resolveCurrentSession(context: SessionContext): Promise<DomainResult<SessionRecord>>;
|
|
16
16
|
getSession(context: SessionContext, sessionId: string): Promise<DomainResult<SessionRecord>>;
|
|
17
17
|
guard(context: SessionContext, options: GuardOptions): Promise<DomainResult<GuardDecision>>;
|
|
18
|
+
authorizeOperation(context: SessionContext, options: OperationAuthorizationOptions): Promise<DomainResult<OperationAuthorizationDecision>>;
|
|
19
|
+
checkpoint(context: SessionContext, options: CheckpointOptions): Promise<DomainResult<CheckpointEvidence>>;
|
|
20
|
+
commit(context: SessionContext, options: CommitOptions): Promise<DomainResult<CommitResult>>;
|
|
21
|
+
push(context: SessionContext, options: PushOptions): Promise<DomainResult<PushResult>>;
|
|
18
22
|
listSessions(context: SessionContext): Promise<DomainResult<SessionListResult>>;
|
|
19
23
|
status(context: SessionContext): Promise<DomainResult<StatusResult>>;
|
|
20
24
|
closeSession(context: SessionContext, options: SessionCloseOptions): Promise<DomainResult<SessionCloseResult>>;
|
|
21
25
|
garbageCollect(context: SessionContext, options: GarbageCollectOptions): Promise<DomainResult<GarbageCollectResult>>;
|
|
26
|
+
claimResources(context: SessionContext, options: ClaimResourcesOptions): Promise<DomainResult<ClaimResourcesResult>>;
|
|
27
|
+
updateClaims(context: SessionContext, options: UpdateClaimsOptions): Promise<DomainResult<ClaimResourcesResult>>;
|
|
28
|
+
releaseClaims(context: SessionContext, options: ReleaseClaimsOptions): Promise<DomainResult<ReleaseClaimsResult>>;
|
|
29
|
+
listClaims(context: SessionContext, sessionId: string | null): Promise<DomainResult<{
|
|
30
|
+
claims: ResourceClaim[];
|
|
31
|
+
}>>;
|
|
22
32
|
private registryFor;
|
|
23
33
|
}
|
|
24
34
|
export declare function createLocalSessionBackend(options?: LocalSessionBackendOptions): SessionBackend;
|