offrouter-adapter-codex 0.2.1 → 0.3.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.
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Rollback for profile-scoped Codex install state.
3
+ * Restores the profile's config.toml to its previous content (or removes the
4
+ * OffRouter-created file) and drops the install-state metadata.
5
+ */
6
+ import { access, mkdir, readFile, rmdir, unlink, writeFile } from "node:fs/promises";
7
+ import { constants } from "node:fs";
8
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
9
+ import { homedir as osHomedir } from "node:os";
10
+ import { CODEX_CONFIG_REL, CODEX_INSTALL_STATE_REL, CodexInstallStateSchema, } from "./install.js";
11
+ import { resolveCodexProfileDir } from "./profile.js";
12
+ async function pathExists(path) {
13
+ try {
14
+ await access(path, constants.F_OK);
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ function changeSummary(kind, relativePath) {
22
+ switch (kind) {
23
+ case "create":
24
+ return `+ ${relativePath}`;
25
+ case "update":
26
+ return `~ ${relativePath}`;
27
+ case "unchanged":
28
+ return `= ${relativePath}`;
29
+ case "remove":
30
+ return `- ${relativePath}`;
31
+ default:
32
+ return `? ${relativePath}`;
33
+ }
34
+ }
35
+ async function loadState(statePath) {
36
+ if (!(await pathExists(statePath))) {
37
+ return {
38
+ ok: false,
39
+ errorCode: "no_install_state",
40
+ message: `No install state at ${statePath}. Nothing to uninstall.`,
41
+ };
42
+ }
43
+ try {
44
+ const raw = await readFile(statePath, "utf8");
45
+ const state = CodexInstallStateSchema.parse(JSON.parse(raw));
46
+ return { ok: true, state };
47
+ }
48
+ catch (err) {
49
+ const detail = err instanceof Error ? err.message : String(err);
50
+ return {
51
+ ok: false,
52
+ errorCode: "invalid_install_state",
53
+ message: `Invalid install state at ${statePath}: ${detail}`,
54
+ };
55
+ }
56
+ }
57
+ function isWindowsAbsolutePath(path) {
58
+ return /^[A-Za-z]:[\\/]/.test(path);
59
+ }
60
+ function isInsideOrSame(root, candidate) {
61
+ const rel = relative(root, candidate);
62
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
63
+ }
64
+ function resolveProfileRelativePath(profileDir, relativePath) {
65
+ if (relativePath.trim() === "" ||
66
+ relativePath.includes("\0") ||
67
+ isAbsolute(relativePath) ||
68
+ isWindowsAbsolutePath(relativePath)) {
69
+ return null;
70
+ }
71
+ const parts = relativePath.split(/[\\/]+/);
72
+ if (parts.some((part) => part === "" || part === "." || part === "..")) {
73
+ return null;
74
+ }
75
+ const root = resolve(profileDir);
76
+ const candidate = resolve(root, ...parts);
77
+ if (!isInsideOrSame(root, candidate)) {
78
+ return null;
79
+ }
80
+ return candidate;
81
+ }
82
+ function validateRollbackState(profileDir, state) {
83
+ if (state.configRelative !== CODEX_CONFIG_REL) {
84
+ return {
85
+ ok: false,
86
+ message: `Invalid config relative path in install state: ${state.configRelative}`,
87
+ };
88
+ }
89
+ const configPath = resolveProfileRelativePath(profileDir, state.configRelative);
90
+ if (!configPath) {
91
+ return {
92
+ ok: false,
93
+ message: `Invalid config relative path in install state: ${state.configRelative}`,
94
+ };
95
+ }
96
+ for (const relativePath of Object.keys(state.files)) {
97
+ if (relativePath !== CODEX_CONFIG_REL) {
98
+ return {
99
+ ok: false,
100
+ message: `Install state path is outside config root: ${relativePath}`,
101
+ };
102
+ }
103
+ const abs = resolveProfileRelativePath(profileDir, relativePath);
104
+ if (!abs) {
105
+ return {
106
+ ok: false,
107
+ message: `Invalid install state path: ${relativePath}`,
108
+ };
109
+ }
110
+ }
111
+ return { ok: true, configPath };
112
+ }
113
+ /**
114
+ * Restore files tracked by codex-install-state.json for a profile.
115
+ */
116
+ export async function rollbackCodexProfile(options) {
117
+ const { profile, dryRun = false, env = process.env, homedir = osHomedir, } = options;
118
+ const profileDir = options.profileDir ?? resolveCodexProfileDir(profile, { env, homedir });
119
+ const statePath = join(profileDir, CODEX_INSTALL_STATE_REL);
120
+ const loaded = await loadState(statePath);
121
+ if (!loaded.ok) {
122
+ return {
123
+ ok: false,
124
+ dryRun,
125
+ profile,
126
+ profileDir,
127
+ changes: [],
128
+ message: loaded.message,
129
+ errorCode: loaded.errorCode,
130
+ };
131
+ }
132
+ const { state } = loaded;
133
+ const validated = validateRollbackState(profileDir, state);
134
+ if (!validated.ok) {
135
+ return {
136
+ ok: false,
137
+ dryRun,
138
+ profile,
139
+ profileDir,
140
+ changes: [],
141
+ message: validated.message,
142
+ errorCode: "invalid_install_state",
143
+ };
144
+ }
145
+ const changes = [];
146
+ const configPath = validated.configPath;
147
+ const fileState = state.files[CODEX_CONFIG_REL];
148
+ const previous = fileState?.previous ?? null;
149
+ if (previous === null) {
150
+ // File was created by install; remove it on rollback.
151
+ const existed = await pathExists(configPath);
152
+ const kind = existed ? "remove" : "unchanged";
153
+ changes.push({
154
+ path: configPath,
155
+ relativePath: CODEX_CONFIG_REL,
156
+ kind,
157
+ summary: changeSummary(kind, CODEX_CONFIG_REL),
158
+ });
159
+ if (!dryRun && existed) {
160
+ await unlink(configPath);
161
+ }
162
+ }
163
+ else {
164
+ let current = null;
165
+ if (await pathExists(configPath)) {
166
+ current = await readFile(configPath, "utf8");
167
+ }
168
+ let kind;
169
+ if (current === previous) {
170
+ kind = "unchanged";
171
+ }
172
+ else if (current === null) {
173
+ kind = "create"; // restore missing prior content
174
+ }
175
+ else {
176
+ kind = "update";
177
+ }
178
+ changes.push({
179
+ path: configPath,
180
+ relativePath: CODEX_CONFIG_REL,
181
+ kind,
182
+ summary: changeSummary(kind, CODEX_CONFIG_REL),
183
+ });
184
+ if (!dryRun && kind !== "unchanged") {
185
+ await mkdir(dirname(configPath), { recursive: true });
186
+ await writeFile(configPath, previous, "utf8");
187
+ }
188
+ }
189
+ // Drop install state last
190
+ const stateChangeKind = "remove";
191
+ changes.push({
192
+ path: statePath,
193
+ relativePath: CODEX_INSTALL_STATE_REL,
194
+ kind: stateChangeKind,
195
+ summary: changeSummary(stateChangeKind, CODEX_INSTALL_STATE_REL),
196
+ });
197
+ if (!dryRun) {
198
+ await unlink(statePath);
199
+ // Best-effort remove only the empty install-state directory.
200
+ try {
201
+ await rmdir(join(profileDir, ".offrouter"));
202
+ }
203
+ catch {
204
+ // ignore
205
+ }
206
+ }
207
+ const applied = changes.filter((c) => c.kind !== "unchanged");
208
+ return {
209
+ ok: true,
210
+ dryRun,
211
+ profile,
212
+ profileDir,
213
+ changes,
214
+ message: dryRun
215
+ ? `Dry run: would roll back ${applied.length} change(s) for profile ${profile}.`
216
+ : `Rolled back OffRouter Codex install for profile ${profile} (${applied.length} change(s)).`,
217
+ };
218
+ }
219
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../src/rollback.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "offrouter-adapter-codex",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -9,8 +9,13 @@
9
9
  "test": "vitest run --root ../.. packages/adapter-codex/src"
10
10
  },
11
11
  "dependencies": {
12
- "offrouter-core": "0.2.1",
12
+ "offrouter-core": "0.3.0",
13
13
  "smol-toml": "^1.7.0",
14
14
  "zod": "^3.23.0"
15
- }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ]
16
21
  }
package/src/index.ts DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * offrouter-adapter-codex public surface.
3
- * Install / rollback for Codex personal profiles (MCP config entry).
4
- */
5
-
6
- export const ADAPTER_CODEX_PACKAGE = "offrouter-adapter-codex" as const;
7
-
8
- export {
9
- isCodexHarnessProfile,
10
- isSafeProfileId,
11
- isWorkLikeProfile,
12
- listAllowlistedPersonalCodexProfiles,
13
- resolveCodexProfileDir,
14
- SAFE_PROFILE_ID_RE,
15
- } from "./profile.js";
16
- export type { ResolveCodexProfileDirOptions } from "./profile.js";
17
-
18
- export {
19
- CODEX_CONFIG_REL,
20
- CODEX_INSTALL_STATE_REL,
21
- CodexInstallStateSchema,
22
- evaluateInstallProfilePolicy,
23
- formatInstallDiffText,
24
- installCodexProfile,
25
- } from "./install.js";
26
- export type {
27
- CodexInstallOptions,
28
- CodexInstallResult,
29
- CodexInstallState,
30
- InstallChangeKind,
31
- InstallFileChange,
32
- } from "./install.js";
33
-
34
- export { rollbackCodexProfile } from "./rollback.js";
35
- export type { CodexRollbackOptions, CodexRollbackResult } from "./rollback.js";