@lesliechan721/aw 0.1.0-beta.6 → 0.1.0-beta.8

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 (237) hide show
  1. package/dist/authoring/scripts/init-plugin.mjs +4 -33
  2. package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
  3. package/dist/authoring/scripts/lib/plugin-version-check.mjs +1 -1
  4. package/dist/authoring/scripts/plugin-status.mjs +8 -11
  5. package/dist/authoring/scripts/plugin-status.mjs.map +1 -1
  6. package/dist/authoring/scripts/remove-plugin.mjs +1 -0
  7. package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
  8. package/dist/authoring/scripts/validate-plugin.mjs +104 -54
  9. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
  10. package/dist/scripts/codex-eval-app-server.d.ts +2 -0
  11. package/dist/scripts/codex-eval-app-server.js +107 -1
  12. package/dist/scripts/codex-eval-app-server.js.map +1 -1
  13. package/dist/scripts/eval-plugin-skills.js +5 -2
  14. package/dist/scripts/eval-plugin-skills.js.map +1 -1
  15. package/dist/scripts/plugin-eval-contract.d.ts +5 -1
  16. package/dist/scripts/plugin-eval-contract.js +54 -4
  17. package/dist/scripts/plugin-eval-contract.js.map +1 -1
  18. package/dist/scripts/plugin-staging.d.ts +6 -7
  19. package/dist/scripts/plugin-staging.js +11 -23
  20. package/dist/scripts/plugin-staging.js.map +1 -1
  21. package/dist/scripts/test-plugin-scripts.js +2 -33
  22. package/dist/scripts/test-plugin-scripts.js.map +1 -1
  23. package/dist/src/adapters/helpers.js +2 -2
  24. package/dist/src/adapters/helpers.js.map +1 -1
  25. package/dist/src/authoring/workspace-commands.d.ts +17 -2
  26. package/dist/src/authoring/workspace-commands.js +21 -4
  27. package/dist/src/authoring/workspace-commands.js.map +1 -1
  28. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  29. package/dist/src/commands/aw-capabilities.js +259 -0
  30. package/dist/src/commands/aw-capabilities.js.map +1 -0
  31. package/dist/src/commands/catalog-context.d.ts +52 -0
  32. package/dist/src/commands/catalog-context.js +156 -0
  33. package/dist/src/commands/catalog-context.js.map +1 -0
  34. package/dist/src/commands/catalog-dev-source.d.ts +112 -0
  35. package/dist/src/commands/catalog-dev-source.js +481 -0
  36. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  37. package/dist/src/commands/catalog-generation.d.ts +26 -0
  38. package/dist/src/commands/catalog-generation.js +14 -0
  39. package/dist/src/commands/catalog-generation.js.map +1 -0
  40. package/dist/src/commands/catalog-publication-inspection.d.ts +1 -1
  41. package/dist/src/commands/catalog-publication-inspection.js +4 -5
  42. package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
  43. package/dist/src/commands/catalog-publication-target.d.ts +17 -0
  44. package/dist/src/commands/catalog-publication-target.js +60 -0
  45. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  46. package/dist/src/commands/catalog-publish.d.ts +8 -1
  47. package/dist/src/commands/catalog-publish.js +25 -2
  48. package/dist/src/commands/catalog-publish.js.map +1 -1
  49. package/dist/src/commands/catalog-source.d.ts +23 -1
  50. package/dist/src/commands/catalog-source.js +126 -40
  51. package/dist/src/commands/catalog-source.js.map +1 -1
  52. package/dist/src/commands/catalog-status.d.ts +18 -2
  53. package/dist/src/commands/catalog-status.js +122 -18
  54. package/dist/src/commands/catalog-status.js.map +1 -1
  55. package/dist/src/commands/init.js +1 -1
  56. package/dist/src/commands/init.js.map +1 -1
  57. package/dist/src/commands/offline-cleanup-evidence.d.ts +23 -0
  58. package/dist/src/commands/offline-cleanup-evidence.js +38 -0
  59. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  60. package/dist/src/commands/options.d.ts +1 -0
  61. package/dist/src/commands/options.js +1 -0
  62. package/dist/src/commands/options.js.map +1 -1
  63. package/dist/src/commands/plugin-capabilities.js +1 -1
  64. package/dist/src/commands/plugin-capabilities.js.map +1 -1
  65. package/dist/src/commands/rebuild-command.d.ts +19 -7
  66. package/dist/src/commands/rebuild-command.js +415 -205
  67. package/dist/src/commands/rebuild-command.js.map +1 -1
  68. package/dist/src/commands/rebuild-integration.d.ts +10 -3
  69. package/dist/src/commands/rebuild-integration.js +73 -76
  70. package/dist/src/commands/rebuild-integration.js.map +1 -1
  71. package/dist/src/commands/rebuild-operations.d.ts +0 -8
  72. package/dist/src/commands/rebuild-operations.js +17 -115
  73. package/dist/src/commands/rebuild-operations.js.map +1 -1
  74. package/dist/src/commands/runtime.js +21 -34
  75. package/dist/src/commands/runtime.js.map +1 -1
  76. package/dist/src/commands/{status-v4.d.ts → status-v5.d.ts} +67 -21
  77. package/dist/src/commands/{status-v4.js → status-v5.js} +260 -30
  78. package/dist/src/commands/status-v5.js.map +1 -0
  79. package/dist/src/commands/wizard.d.ts +2 -2
  80. package/dist/src/commands/wizard.js +2 -2
  81. package/dist/src/commands/wizard.js.map +1 -1
  82. package/dist/src/commands/write-commands.js +73 -17
  83. package/dist/src/commands/write-commands.js.map +1 -1
  84. package/dist/src/constants.d.ts +6 -1
  85. package/dist/src/constants.js +6 -1
  86. package/dist/src/constants.js.map +1 -1
  87. package/dist/src/generators/local-plugin.js +57 -3
  88. package/dist/src/generators/local-plugin.js.map +1 -1
  89. package/dist/src/index.d.ts +4 -1
  90. package/dist/src/index.js +562 -85
  91. package/dist/src/index.js.map +1 -1
  92. package/dist/src/output/model.d.ts +1 -34
  93. package/dist/src/output/model.js +1 -144
  94. package/dist/src/output/model.js.map +1 -1
  95. package/dist/src/output/rebuild-progress.js +0 -3
  96. package/dist/src/output/rebuild-progress.js.map +1 -1
  97. package/dist/src/portable/commands.d.ts +4 -0
  98. package/dist/src/portable/commands.js +61 -4
  99. package/dist/src/portable/commands.js.map +1 -1
  100. package/dist/src/portable/materializer.d.ts +3 -0
  101. package/dist/src/portable/materializer.js +61 -10
  102. package/dist/src/portable/materializer.js.map +1 -1
  103. package/dist/src/tui/catalog-generation.d.ts +56 -0
  104. package/dist/src/tui/catalog-generation.js +244 -0
  105. package/dist/src/tui/catalog-generation.js.map +1 -0
  106. package/dist/src/tui/console-app-v4.d.ts +1 -1
  107. package/dist/src/tui/console-app-v4.js +446 -126
  108. package/dist/src/tui/console-app-v4.js.map +1 -1
  109. package/dist/src/tui/controller-runtime.d.ts +8 -2
  110. package/dist/src/tui/controller-runtime.js +606 -92
  111. package/dist/src/tui/controller-runtime.js.map +1 -1
  112. package/dist/src/tui/controller.d.ts +71 -6
  113. package/dist/src/tui/controller.js +377 -83
  114. package/dist/src/tui/controller.js.map +1 -1
  115. package/dist/src/tui/index.d.ts +1 -0
  116. package/dist/src/tui/index.js +1 -0
  117. package/dist/src/tui/index.js.map +1 -1
  118. package/dist/src/tui/input-display.d.ts +8 -0
  119. package/dist/src/tui/input-display.js +36 -0
  120. package/dist/src/tui/input-display.js.map +1 -0
  121. package/dist/src/tui/model.d.ts +27 -7
  122. package/dist/src/tui/model.js +273 -65
  123. package/dist/src/tui/model.js.map +1 -1
  124. package/dist/src/tui/router.d.ts +26 -0
  125. package/dist/src/tui/router.js.map +1 -1
  126. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  127. package/dist/src/tui/source-ref-presets.js +11 -0
  128. package/dist/src/tui/source-ref-presets.js.map +1 -0
  129. package/dist/src/tui/views.js +31 -3
  130. package/dist/src/tui/views.js.map +1 -1
  131. package/dist/src/types.d.ts +90 -6
  132. package/dist/src/types.js.map +1 -1
  133. package/dist/src/utils/agent-version.d.ts +3 -0
  134. package/dist/src/utils/agent-version.js +13 -5
  135. package/dist/src/utils/agent-version.js.map +1 -1
  136. package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
  137. package/dist/src/utils/aw-home-mutation-lock.js +32 -4
  138. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
  139. package/dist/src/utils/bundle-integrity.d.ts +0 -1
  140. package/dist/src/utils/bundle-integrity.js +0 -25
  141. package/dist/src/utils/bundle-integrity.js.map +1 -1
  142. package/dist/src/utils/bundle-layout.js +8 -6
  143. package/dist/src/utils/bundle-layout.js.map +1 -1
  144. package/dist/src/utils/catalog-digests.js +13 -2
  145. package/dist/src/utils/catalog-digests.js.map +1 -1
  146. package/dist/src/utils/catalog-generation-error.d.ts +12 -0
  147. package/dist/src/utils/catalog-generation-error.js +16 -0
  148. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  149. package/dist/src/utils/catalog-generation-resolver.d.ts +13 -0
  150. package/dist/src/utils/catalog-generation-resolver.js +129 -0
  151. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  152. package/dist/src/utils/catalog-generation-service.d.ts +52 -0
  153. package/dist/src/utils/catalog-generation-service.js +620 -0
  154. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  155. package/dist/src/utils/catalog-generation-state.d.ts +13 -0
  156. package/dist/src/utils/catalog-generation-state.js +201 -0
  157. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  158. package/dist/src/utils/catalog-generation-store.d.ts +44 -0
  159. package/dist/src/utils/catalog-generation-store.js +387 -0
  160. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  161. package/dist/src/utils/catalog-manifest-v5.d.ts +5 -0
  162. package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v5.js} +39 -35
  163. package/dist/src/utils/{catalog-manifest-v4.js.map → catalog-manifest-v5.js.map} +1 -1
  164. package/dist/src/utils/catalog-operation-context.d.ts +28 -0
  165. package/dist/src/utils/catalog-operation-context.js +242 -0
  166. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  167. package/dist/src/utils/catalog-public-error.d.ts +7 -3
  168. package/dist/src/utils/catalog-public-error.js +20 -4
  169. package/dist/src/utils/catalog-public-error.js.map +1 -1
  170. package/dist/src/utils/catalog-snapshot.d.ts +5 -3
  171. package/dist/src/utils/catalog-snapshot.js +11 -3
  172. package/dist/src/utils/catalog-snapshot.js.map +1 -1
  173. package/dist/src/utils/catalog-source-cache.d.ts +1 -1
  174. package/dist/src/utils/catalog-source-cache.js +37 -12
  175. package/dist/src/utils/catalog-source-cache.js.map +1 -1
  176. package/dist/src/utils/catalog-source-identity.d.ts +1 -0
  177. package/dist/src/utils/catalog-source-identity.js +21 -2
  178. package/dist/src/utils/catalog-source-identity.js.map +1 -1
  179. package/dist/src/utils/catalog-sources.d.ts +1 -0
  180. package/dist/src/utils/catalog-sources.js +30 -11
  181. package/dist/src/utils/catalog-sources.js.map +1 -1
  182. package/dist/src/utils/codex-config.js +4 -4
  183. package/dist/src/utils/codex-config.js.map +1 -1
  184. package/dist/src/utils/codex-manager.d.ts +33 -0
  185. package/dist/src/utils/codex-manager.js +656 -0
  186. package/dist/src/utils/codex-manager.js.map +1 -0
  187. package/dist/src/utils/codex-skill-staging.d.ts +2 -0
  188. package/dist/src/utils/codex-skill-staging.js.map +1 -1
  189. package/dist/src/utils/dynamic-skill-tree.d.ts +4 -0
  190. package/dist/src/utils/dynamic-skill-tree.js +35 -5
  191. package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
  192. package/dist/src/utils/git-catalog-provider.js +10 -25
  193. package/dist/src/utils/git-catalog-provider.js.map +1 -1
  194. package/dist/src/utils/lifecycle-active-store.d.ts +0 -28
  195. package/dist/src/utils/lifecycle-active-store.js +35 -247
  196. package/dist/src/utils/lifecycle-active-store.js.map +1 -1
  197. package/dist/src/utils/multi-source-catalog.d.ts +3 -0
  198. package/dist/src/utils/multi-source-catalog.js +120 -10
  199. package/dist/src/utils/multi-source-catalog.js.map +1 -1
  200. package/dist/src/utils/native-cli.d.ts +15 -6
  201. package/dist/src/utils/native-cli.js +31 -39
  202. package/dist/src/utils/native-cli.js.map +1 -1
  203. package/dist/src/utils/orphan-marketplace-cleanup.js +0 -3
  204. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
  205. package/dist/src/utils/ownership.d.ts +10 -1
  206. package/dist/src/utils/ownership.js +52 -24
  207. package/dist/src/utils/ownership.js.map +1 -1
  208. package/dist/src/utils/path-catalog-provider.js +12 -8
  209. package/dist/src/utils/path-catalog-provider.js.map +1 -1
  210. package/dist/src/utils/plugin-config-write.js +18 -35
  211. package/dist/src/utils/plugin-config-write.js.map +1 -1
  212. package/dist/src/utils/plugin-config.d.ts +1 -12
  213. package/dist/src/utils/plugin-config.js +107 -226
  214. package/dist/src/utils/plugin-config.js.map +1 -1
  215. package/dist/src/utils/plugin-scripts.d.ts +1 -1
  216. package/dist/src/utils/plugin-scripts.js +1 -1
  217. package/dist/src/utils/plugin-scripts.js.map +1 -1
  218. package/dist/src/utils/state-paths.js +7 -2
  219. package/dist/src/utils/state-paths.js.map +1 -1
  220. package/dist/src/utils/target-eligibility.d.ts +7 -2
  221. package/dist/src/utils/target-eligibility.js +6 -3
  222. package/dist/src/utils/target-eligibility.js.map +1 -1
  223. package/package.json +4 -3
  224. package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
  225. package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
  226. package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
  227. package/dist/src/commands/status-v4.js.map +0 -1
  228. package/dist/src/commands/status.d.ts +0 -93
  229. package/dist/src/commands/status.js +0 -442
  230. package/dist/src/commands/status.js.map +0 -1
  231. package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
  232. package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
  233. package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
  234. package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
  235. package/dist/src/utils/catalog-manifest-v3.js +0 -3
  236. package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
  237. package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
@@ -0,0 +1,656 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { constants as fsConstants } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import path from 'node:path';
5
+ import fs from 'fs-extra';
6
+ import { extractStrictSemVerTokenFromVersionOutput, probeAgentVersion, } from './agent-version.js';
7
+ import { tryParseStrictSemVer } from './manifest.js';
8
+ import { getDefaultNativeCliRunner, runNativeCli, } from './native-cli.js';
9
+ import { getCodexHome, resolveAwHome } from './state-paths.js';
10
+ export const MANAGED_CODEX_PACKAGE_NAME = '@openai/codex';
11
+ export const MANAGED_CODEX_VERSION = '0.150.1';
12
+ export const MANAGED_CODEX_REGISTRY = 'https://registry.npmjs.org/';
13
+ export const MANAGED_CODEX_MARKER_FILE = '.aw-managed-runtime.json';
14
+ export class CodexManagerError extends Error {
15
+ code;
16
+ constructor(code, detail) {
17
+ super(`${code}: ${detail}`);
18
+ this.name = 'CodexManagerError';
19
+ this.code = code;
20
+ }
21
+ }
22
+ const requireFromCli = createRequire(import.meta.url);
23
+ function managedRuntimeRoot(options) {
24
+ const env = options.env ?? process.env;
25
+ const platform = options.platform ?? process.platform;
26
+ const arch = options.arch ?? process.arch;
27
+ return path.join(path.resolve(resolveAwHome(env)), 'runtimes', 'codex', MANAGED_CODEX_VERSION, `${platform}-${arch}`);
28
+ }
29
+ function managedRuntimeAncestors(options) {
30
+ const awHome = path.resolve(resolveAwHome(options.env ?? process.env));
31
+ return [
32
+ awHome,
33
+ path.join(awHome, 'runtimes'),
34
+ path.join(awHome, 'runtimes', 'codex'),
35
+ path.join(awHome, 'runtimes', 'codex', MANAGED_CODEX_VERSION),
36
+ ];
37
+ }
38
+ function managedRuntimeMarker(options) {
39
+ return {
40
+ schemaVersion: 1,
41
+ owner: 'aw',
42
+ packageName: MANAGED_CODEX_PACKAGE_NAME,
43
+ version: MANAGED_CODEX_VERSION,
44
+ platform: options.platform ?? process.platform,
45
+ arch: options.arch ?? process.arch,
46
+ };
47
+ }
48
+ function managedLauncher(runtimeRoot) {
49
+ return path.join(runtimeRoot, 'node_modules', '@openai', 'codex', 'bin', 'codex.js');
50
+ }
51
+ function managedPackageRoot(runtimeRoot) {
52
+ return path.join(runtimeRoot, 'node_modules', '@openai', 'codex');
53
+ }
54
+ function managedPackageJson(runtimeRoot) {
55
+ return path.join(runtimeRoot, 'node_modules', '@openai', 'codex', 'package.json');
56
+ }
57
+ function managerForRuntime(runtimeRoot, launcher, execPath) {
58
+ return {
59
+ kind: 'aw-managed',
60
+ version: MANAGED_CODEX_VERSION,
61
+ command: execPath,
62
+ argsPrefix: [launcher],
63
+ runtimeRoot,
64
+ };
65
+ }
66
+ function isPathWithin(rootPath, targetPath) {
67
+ const relative = path.relative(rootPath, targetPath);
68
+ return relative === '' || (!path.isAbsolute(relative) && relative !== '..'
69
+ && !relative.startsWith(`..${path.sep}`));
70
+ }
71
+ async function inspectCanonicalManagedPackagePaths(runtimeRoot) {
72
+ const runtimeStats = await lstatOrUndefined(runtimeRoot);
73
+ if (!runtimeStats?.isDirectory() || runtimeStats.isSymbolicLink()) {
74
+ return { state: 'unsafe', diagnostic: 'The managed runtime root is not a regular directory.' };
75
+ }
76
+ let canonicalRuntimeRoot;
77
+ try {
78
+ canonicalRuntimeRoot = await fs.realpath(runtimeRoot);
79
+ }
80
+ catch {
81
+ return { state: 'incomplete' };
82
+ }
83
+ const candidates = [
84
+ ['package root', managedPackageRoot(runtimeRoot), 'directory'],
85
+ ['package.json', managedPackageJson(runtimeRoot), 'file'],
86
+ ['launcher', managedLauncher(runtimeRoot), 'file'],
87
+ ];
88
+ const canonicalPaths = [];
89
+ let canonicalPackageRoot;
90
+ for (const [label, candidatePath, expectedKind] of candidates) {
91
+ let canonicalPath;
92
+ try {
93
+ canonicalPath = await fs.realpath(candidatePath);
94
+ }
95
+ catch (error) {
96
+ if (error.code === 'ENOENT')
97
+ return { state: 'incomplete' };
98
+ throw error;
99
+ }
100
+ const containmentRoot = canonicalPackageRoot ?? canonicalRuntimeRoot;
101
+ if (!isPathWithin(containmentRoot, canonicalPath)) {
102
+ return {
103
+ state: 'unsafe',
104
+ diagnostic: `The managed Codex ${label} resolves outside its managed ${canonicalPackageRoot ? 'package root' : 'runtime'}.`,
105
+ };
106
+ }
107
+ const stats = await fs.stat(canonicalPath);
108
+ if (expectedKind === 'directory' ? !stats.isDirectory() : !stats.isFile()) {
109
+ return { state: 'incomplete' };
110
+ }
111
+ if (label === 'package root')
112
+ canonicalPackageRoot = canonicalPath;
113
+ canonicalPaths.push(canonicalPath);
114
+ }
115
+ return {
116
+ state: 'complete',
117
+ paths: {
118
+ packageJson: canonicalPaths[1],
119
+ launcher: canonicalPaths[2],
120
+ },
121
+ };
122
+ }
123
+ async function lstatOrUndefined(targetPath) {
124
+ try {
125
+ return await fs.lstat(targetPath);
126
+ }
127
+ catch (error) {
128
+ if (error.code === 'ENOENT')
129
+ return undefined;
130
+ throw error;
131
+ }
132
+ }
133
+ async function inspectRegularDirectoryChain(paths) {
134
+ for (const targetPath of paths) {
135
+ const stats = await lstatOrUndefined(targetPath);
136
+ if (!stats)
137
+ return { state: 'missing' };
138
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
139
+ return {
140
+ state: 'blocked',
141
+ diagnostic: `The managed runtime path chain contains a non-directory or symbolic link: ${targetPath}.`,
142
+ };
143
+ }
144
+ }
145
+ return { state: 'complete' };
146
+ }
147
+ async function ensureRegularManagedRuntimeAncestors(options) {
148
+ for (const targetPath of managedRuntimeAncestors(options)) {
149
+ const stats = await lstatOrUndefined(targetPath);
150
+ if (!stats)
151
+ await fs.mkdir(targetPath);
152
+ const current = await lstatOrUndefined(targetPath);
153
+ if (!current?.isDirectory() || current.isSymbolicLink()) {
154
+ throw new Error(`The managed runtime path chain is not a regular directory: ${targetPath}.`);
155
+ }
156
+ }
157
+ }
158
+ async function assertManagedStoreDirectory(options) {
159
+ const storeRoot = path.join(path.resolve(resolveAwHome(options.env ?? process.env)), 'runtimes', '.pnpm-store');
160
+ const stats = await lstatOrUndefined(storeRoot);
161
+ if (!stats) {
162
+ await fs.mkdir(storeRoot);
163
+ }
164
+ else if (!stats.isDirectory() || stats.isSymbolicLink()) {
165
+ throw new Error('The AW-managed pnpm store path is not a regular directory.');
166
+ }
167
+ const current = await lstatOrUndefined(storeRoot);
168
+ if (!current?.isDirectory() || current.isSymbolicLink()) {
169
+ throw new Error('The AW-managed pnpm store path is not a regular directory.');
170
+ }
171
+ return storeRoot;
172
+ }
173
+ function isExpectedMarker(value, expected) {
174
+ if (!value || typeof value !== 'object' || Array.isArray(value))
175
+ return false;
176
+ const marker = value;
177
+ return marker.schemaVersion === expected.schemaVersion
178
+ && marker.owner === expected.owner
179
+ && marker.packageName === expected.packageName
180
+ && marker.version === expected.version
181
+ && marker.platform === expected.platform
182
+ && marker.arch === expected.arch;
183
+ }
184
+ async function runManagedVersionCheck(launcher, options) {
185
+ const runner = options.runner ?? getDefaultNativeCliRunner();
186
+ const execPath = options.execPath ?? process.execPath;
187
+ const env = options.env ?? process.env;
188
+ try {
189
+ const result = await runNativeCli({
190
+ command: execPath,
191
+ args: [launcher, '--version'],
192
+ agentKind: 'codex',
193
+ cwd: options.cwd,
194
+ env: { ...env, CODEX_HOME: getCodexHome(env) },
195
+ }, runner);
196
+ if (result.exitCode !== 0)
197
+ return undefined;
198
+ return extractStrictSemVerTokenFromVersionOutput(`${result.stdout}\n${result.stderr}`)
199
+ ?? undefined;
200
+ }
201
+ catch {
202
+ return undefined;
203
+ }
204
+ }
205
+ async function inspectManagedCodexRuntime(options) {
206
+ const runtimeRoot = managedRuntimeRoot(options);
207
+ try {
208
+ const pathChain = await inspectRegularDirectoryChain([
209
+ ...managedRuntimeAncestors(options),
210
+ runtimeRoot,
211
+ ]);
212
+ if (pathChain.state === 'missing')
213
+ return { state: 'absent' };
214
+ if (pathChain.state === 'blocked')
215
+ return pathChain;
216
+ const markerPath = path.join(runtimeRoot, MANAGED_CODEX_MARKER_FILE);
217
+ const markerStats = await lstatOrUndefined(markerPath);
218
+ if (!markerStats?.isFile() || markerStats.isSymbolicLink()) {
219
+ return { state: 'blocked', diagnostic: 'The managed runtime has no valid AW owner marker.' };
220
+ }
221
+ const marker = await fs.readJson(markerPath).catch(() => undefined);
222
+ if (!isExpectedMarker(marker, managedRuntimeMarker(options))) {
223
+ return { state: 'blocked', diagnostic: 'The managed runtime has an invalid AW owner marker.' };
224
+ }
225
+ const packagePaths = await inspectCanonicalManagedPackagePaths(runtimeRoot);
226
+ if (packagePaths.state === 'incomplete') {
227
+ return { state: 'rebuildable', diagnostic: 'The AW-owned managed runtime is incomplete.' };
228
+ }
229
+ if (packagePaths.state === 'unsafe') {
230
+ return { state: 'blocked', diagnostic: packagePaths.diagnostic };
231
+ }
232
+ const packageJson = await fs.readJson(packagePaths.paths.packageJson).catch(() => undefined);
233
+ if (packageJson?.name !== MANAGED_CODEX_PACKAGE_NAME
234
+ || packageJson.version !== MANAGED_CODEX_VERSION) {
235
+ return { state: 'rebuildable', diagnostic: 'The AW-owned managed runtime package does not match the pinned package.' };
236
+ }
237
+ const detectedVersion = await runManagedVersionCheck(packagePaths.paths.launcher, options);
238
+ if (detectedVersion !== MANAGED_CODEX_VERSION) {
239
+ return { state: 'rebuildable', diagnostic: 'The AW-owned managed runtime failed its version self-check.' };
240
+ }
241
+ return {
242
+ state: 'valid',
243
+ manager: managerForRuntime(runtimeRoot, packagePaths.paths.launcher, options.execPath ?? process.execPath),
244
+ };
245
+ }
246
+ catch (error) {
247
+ return {
248
+ state: 'blocked',
249
+ diagnostic: `The managed runtime cannot be inspected: ${error instanceof Error ? error.message : String(error)}`,
250
+ };
251
+ }
252
+ }
253
+ async function assertAwOwnedRuntimeBeforeReplacement(runtimeRoot, options) {
254
+ const chain = await inspectRegularDirectoryChain([
255
+ ...managedRuntimeAncestors(options),
256
+ runtimeRoot,
257
+ ]);
258
+ if (chain.state !== 'complete') {
259
+ throw new Error(chain.state === 'blocked' ? chain.diagnostic : 'The managed runtime disappeared before replacement.');
260
+ }
261
+ const markerPath = path.join(runtimeRoot, MANAGED_CODEX_MARKER_FILE);
262
+ const markerStats = await lstatOrUndefined(markerPath);
263
+ const marker = markerStats?.isFile() && !markerStats.isSymbolicLink()
264
+ ? await fs.readJson(markerPath).catch(() => undefined)
265
+ : undefined;
266
+ if (!isExpectedMarker(marker, managedRuntimeMarker(options))) {
267
+ throw new Error('The managed runtime owner marker changed before replacement.');
268
+ }
269
+ }
270
+ async function resolveBundledPnpmEntry() {
271
+ let packageJsonPath;
272
+ try {
273
+ packageJsonPath = requireFromCli.resolve('pnpm');
274
+ }
275
+ catch {
276
+ return undefined;
277
+ }
278
+ const packageJson = await fs.readJson(packageJsonPath).catch(() => undefined);
279
+ if (packageJson?.name !== 'pnpm' || packageJson.version !== '10.33.0')
280
+ return undefined;
281
+ const entry = path.join(path.dirname(packageJsonPath), 'bin', 'pnpm.cjs');
282
+ const stats = await lstatOrUndefined(entry);
283
+ return stats?.isFile() && !stats.isSymbolicLink() ? entry : undefined;
284
+ }
285
+ function neutralPnpmEnv(env, userConfigPath) {
286
+ const result = {};
287
+ for (const [key, value] of Object.entries(env)) {
288
+ if (!key.toLowerCase().startsWith('npm_config_'))
289
+ result[key] = value;
290
+ }
291
+ result.npm_config_userconfig = userConfigPath;
292
+ result.NPM_CONFIG_USERCONFIG = userConfigPath;
293
+ return result;
294
+ }
295
+ async function validateAcquiredRuntime(stagingRoot, options) {
296
+ const packagePaths = await inspectCanonicalManagedPackagePaths(stagingRoot);
297
+ const packageJson = packagePaths.state === 'complete'
298
+ ? await fs.readJson(packagePaths.paths.packageJson).catch(() => undefined)
299
+ : undefined;
300
+ if (packagePaths.state !== 'complete'
301
+ || packageJson?.name !== MANAGED_CODEX_PACKAGE_NAME
302
+ || packageJson.version !== MANAGED_CODEX_VERSION) {
303
+ throw new Error('The installed Codex package does not match the pinned package and launcher contract.');
304
+ }
305
+ const runner = options.runner ?? getDefaultNativeCliRunner();
306
+ const execPath = options.execPath ?? process.execPath;
307
+ const env = options.env ?? process.env;
308
+ const invocationBase = {
309
+ command: execPath,
310
+ agentKind: 'codex',
311
+ cwd: options.cwd,
312
+ env: { ...env, CODEX_HOME: getCodexHome(env) },
313
+ };
314
+ const versionResult = await runNativeCli({
315
+ ...invocationBase,
316
+ args: [packagePaths.paths.launcher, '--version'],
317
+ }, runner);
318
+ const detectedVersion = extractStrictSemVerTokenFromVersionOutput(`${versionResult.stdout}\n${versionResult.stderr}`);
319
+ if (versionResult.exitCode !== 0 || detectedVersion !== MANAGED_CODEX_VERSION) {
320
+ throw new Error('The installed Codex package failed its version self-check.');
321
+ }
322
+ const helpResult = await runNativeCli({
323
+ ...invocationBase,
324
+ args: [packagePaths.paths.launcher, 'plugin', '--help'],
325
+ }, runner);
326
+ if (helpResult.exitCode !== 0) {
327
+ throw new Error('The installed Codex package failed its plugin help self-check.');
328
+ }
329
+ }
330
+ async function adoptManagedRuntime(stagingRoot, options) {
331
+ const runtimeRoot = managedRuntimeRoot(options);
332
+ const current = await inspectManagedCodexRuntime(options);
333
+ if (current.state === 'valid')
334
+ return current.manager;
335
+ if (current.state === 'blocked')
336
+ throw new Error(current.diagnostic);
337
+ if (current.state === 'absent') {
338
+ const parentChain = await inspectRegularDirectoryChain(managedRuntimeAncestors(options));
339
+ if (parentChain.state !== 'complete' || await lstatOrUndefined(runtimeRoot)) {
340
+ throw new Error('The managed runtime path changed before adoption.');
341
+ }
342
+ await fs.rename(stagingRoot, runtimeRoot);
343
+ const packagePaths = await inspectCanonicalManagedPackagePaths(runtimeRoot);
344
+ if (packagePaths.state !== 'complete') {
345
+ throw new Error('The managed runtime changed during adoption.');
346
+ }
347
+ return managerForRuntime(runtimeRoot, packagePaths.paths.launcher, options.execPath ?? process.execPath);
348
+ }
349
+ const backupRoot = path.join(path.dirname(runtimeRoot), `.${path.basename(runtimeRoot)}.replaced-${randomUUID()}`);
350
+ await assertAwOwnedRuntimeBeforeReplacement(runtimeRoot, options);
351
+ await fs.rename(runtimeRoot, backupRoot);
352
+ try {
353
+ await fs.rename(stagingRoot, runtimeRoot);
354
+ }
355
+ catch (error) {
356
+ await assertAwOwnedRuntimeBeforeReplacement(backupRoot, options);
357
+ await fs.rename(backupRoot, runtimeRoot).catch(() => undefined);
358
+ throw error;
359
+ }
360
+ await assertAwOwnedRuntimeBeforeReplacement(backupRoot, options);
361
+ await fs.remove(backupRoot).catch(() => undefined);
362
+ const packagePaths = await inspectCanonicalManagedPackagePaths(runtimeRoot);
363
+ if (packagePaths.state !== 'complete') {
364
+ throw new Error('The managed runtime changed during adoption.');
365
+ }
366
+ return managerForRuntime(runtimeRoot, packagePaths.paths.launcher, options.execPath ?? process.execPath);
367
+ }
368
+ async function acquireManagedCodexRuntime(options) {
369
+ const runtimeRoot = managedRuntimeRoot(options);
370
+ const runtimeParent = path.dirname(runtimeRoot);
371
+ const pnpmEntry = options.pnpmEntry ?? await resolveBundledPnpmEntry();
372
+ if (!pnpmEntry)
373
+ throw new Error('The bundled pnpm@10.33.0 entry is unavailable.');
374
+ await ensureRegularManagedRuntimeAncestors(options);
375
+ const storeRoot = await assertManagedStoreDirectory(options);
376
+ const stagingRoot = await fs.mkdtemp(path.join(runtimeParent, `.${path.basename(runtimeRoot)}.staging-`));
377
+ try {
378
+ await fs.writeJson(path.join(stagingRoot, 'package.json'), {
379
+ private: true,
380
+ dependencies: { [MANAGED_CODEX_PACKAGE_NAME]: MANAGED_CODEX_VERSION },
381
+ }, { spaces: 2 });
382
+ const neutralUserConfig = path.join(stagingRoot, '.npmrc');
383
+ const runner = options.runner ?? getDefaultNativeCliRunner();
384
+ const env = options.env ?? process.env;
385
+ const installResult = await runNativeCli({
386
+ command: options.execPath ?? process.execPath,
387
+ args: [
388
+ pnpmEntry,
389
+ 'install',
390
+ '--prod',
391
+ '--ignore-scripts',
392
+ '--ignore-workspace',
393
+ `--registry=${MANAGED_CODEX_REGISTRY}`,
394
+ `--store-dir=${storeRoot}`,
395
+ `--config.userconfig=${neutralUserConfig}`,
396
+ ],
397
+ cwd: stagingRoot,
398
+ env: neutralPnpmEnv(env, neutralUserConfig),
399
+ }, runner);
400
+ if (installResult.exitCode !== 0) {
401
+ throw new Error('pnpm could not install the pinned Codex package.');
402
+ }
403
+ await validateAcquiredRuntime(stagingRoot, options);
404
+ await fs.writeJson(path.join(stagingRoot, MANAGED_CODEX_MARKER_FILE), managedRuntimeMarker(options), { spaces: 2 });
405
+ return await adoptManagedRuntime(stagingRoot, options);
406
+ }
407
+ finally {
408
+ await fs.remove(stagingRoot).catch(() => undefined);
409
+ }
410
+ }
411
+ function readPathEnvironment(env, platform) {
412
+ if (platform !== 'win32')
413
+ return env.PATH;
414
+ const pathEntry = Object.entries(env).find(([key]) => key.toLowerCase() === 'path');
415
+ return pathEntry?.[1];
416
+ }
417
+ function executableNames(command, env, platform) {
418
+ if (platform !== 'win32')
419
+ return [command];
420
+ const pathExt = Object.entries(env)
421
+ .find(([key]) => key.toLowerCase() === 'pathext')?.[1]
422
+ ?? '.COM;.EXE;.BAT;.CMD';
423
+ const supportedExtensions = new Set(['.com', '.exe', '.bat', '.cmd']);
424
+ const extensions = pathExt.split(';')
425
+ .map((extension) => extension.trim())
426
+ .filter((extension) => supportedExtensions.has(extension.toLowerCase()));
427
+ const orderedExtensions = [
428
+ ...extensions.filter((extension) => ['.com', '.exe'].includes(extension.toLowerCase())),
429
+ ...extensions.filter((extension) => ['.bat', '.cmd'].includes(extension.toLowerCase())),
430
+ ];
431
+ return [...orderedExtensions.map((extension) => `${command}${extension}`), command];
432
+ }
433
+ function unsupportedSystemResolution(reason) {
434
+ return {
435
+ state: 'unsupported',
436
+ diagnostic: `The installed system Codex CLI is not supported. ${reason} Install or upgrade the official Codex CLI, or remove the invalid shim and retry; AW does not use managed fallback for this installation.`,
437
+ };
438
+ }
439
+ async function resolveWindowsNpmCodexManager(shimPath) {
440
+ try {
441
+ const shimStats = await fs.lstat(shimPath);
442
+ if (!shimStats.isFile() || shimStats.isSymbolicLink()) {
443
+ return unsupportedSystemResolution('The Windows npm shim is not a regular file.');
444
+ }
445
+ const prefixRoot = path.dirname(shimPath);
446
+ const packageRoot = path.join(prefixRoot, 'node_modules', '@openai', 'codex');
447
+ const packageJsonPath = path.join(packageRoot, 'package.json');
448
+ const launcherPath = path.join(packageRoot, 'bin', 'codex.js');
449
+ const [packageStats, packageJsonStats, launcherStats] = await Promise.all([
450
+ fs.lstat(packageRoot),
451
+ fs.lstat(packageJsonPath),
452
+ fs.lstat(launcherPath),
453
+ ]);
454
+ if (!packageStats.isDirectory()
455
+ || packageStats.isSymbolicLink()
456
+ || !packageJsonStats.isFile()
457
+ || packageJsonStats.isSymbolicLink()
458
+ || !launcherStats.isFile()
459
+ || launcherStats.isSymbolicLink()) {
460
+ return unsupportedSystemResolution('The npm package or launcher is not a regular file tree.');
461
+ }
462
+ const [canonicalPrefix, canonicalPackageRoot, canonicalLauncher] = await Promise.all([
463
+ fs.realpath(prefixRoot),
464
+ fs.realpath(packageRoot),
465
+ fs.realpath(launcherPath),
466
+ ]);
467
+ if (!isPathWithin(canonicalPrefix, canonicalPackageRoot)
468
+ || !isPathWithin(canonicalPackageRoot, canonicalLauncher)) {
469
+ return unsupportedSystemResolution('The npm package or launcher resolves outside its npm prefix.');
470
+ }
471
+ const packageJson = await fs.readJson(packageJsonPath).catch(() => undefined);
472
+ const bin = packageJson?.bin;
473
+ if (packageJson?.name !== MANAGED_CODEX_PACKAGE_NAME
474
+ || typeof packageJson.version !== 'string'
475
+ || !tryParseStrictSemVer(packageJson.version)
476
+ || !bin
477
+ || typeof bin !== 'object'
478
+ || Array.isArray(bin)
479
+ || bin.codex !== 'bin/codex.js') {
480
+ return unsupportedSystemResolution('The npm package identity, version, or launcher contract is invalid.');
481
+ }
482
+ return {
483
+ state: 'supported',
484
+ expectedVersion: packageJson.version,
485
+ manager: {
486
+ kind: 'system',
487
+ version: packageJson.version,
488
+ command: process.execPath,
489
+ argsPrefix: [canonicalLauncher],
490
+ },
491
+ };
492
+ }
493
+ catch {
494
+ return unsupportedSystemResolution('The Windows npm package is missing or unreadable.');
495
+ }
496
+ }
497
+ async function resolveSystemCommandManager(command, options) {
498
+ const platform = options.platform ?? process.platform;
499
+ const extension = path.extname(command).toLowerCase();
500
+ if (platform !== 'win32' || (extension !== '.cmd' && extension !== '.bat')) {
501
+ return {
502
+ state: 'supported',
503
+ manager: {
504
+ kind: 'system',
505
+ version: 'unknown',
506
+ command,
507
+ argsPrefix: [],
508
+ },
509
+ };
510
+ }
511
+ if (extension === '.bat') {
512
+ return unsupportedSystemResolution('Only the official Windows npm .cmd launcher is supported.');
513
+ }
514
+ return resolveWindowsNpmCodexManager(command);
515
+ }
516
+ async function resolvePathExecutable(command, options) {
517
+ const env = options.env ?? process.env;
518
+ const platform = options.platform ?? process.platform;
519
+ const cwd = options.cwd ?? process.cwd();
520
+ const delimiter = platform === 'win32' ? ';' : ':';
521
+ const pathEnvironment = readPathEnvironment(env, platform);
522
+ if (pathEnvironment === undefined)
523
+ return undefined;
524
+ for (const rawEntry of pathEnvironment.split(delimiter)) {
525
+ const entry = rawEntry.replace(/^"|"$/gu, '');
526
+ const directory = path.resolve(cwd, entry || '.');
527
+ for (const executableName of executableNames(command, env, platform)) {
528
+ const candidate = path.join(directory, executableName);
529
+ try {
530
+ if (!(await fs.stat(candidate)).isFile())
531
+ continue;
532
+ if (platform === 'win32')
533
+ return candidate;
534
+ await fs.access(candidate, fsConstants.X_OK);
535
+ return await fs.realpath(candidate);
536
+ }
537
+ catch (error) {
538
+ const code = error.code;
539
+ if (code === 'ENOENT' || code === 'EACCES' || code === 'ENOTDIR')
540
+ continue;
541
+ throw error;
542
+ }
543
+ }
544
+ }
545
+ return undefined;
546
+ }
547
+ async function probeSystemCodex(options) {
548
+ const command = await resolvePathExecutable('codex', options);
549
+ if (!command)
550
+ return { state: 'missing' };
551
+ const resolution = await resolveSystemCommandManager(command, options);
552
+ if (resolution.state === 'unsupported')
553
+ return resolution;
554
+ const { manager } = resolution;
555
+ const result = await probeAgentVersion('codex', {
556
+ argsPrefix: manager.argsPrefix,
557
+ cache: false,
558
+ command: manager.command,
559
+ cwd: options.cwd,
560
+ env: options.env,
561
+ runner: options.runner,
562
+ });
563
+ if (resolution.expectedVersion
564
+ && result.status === 'supported'
565
+ && result.detectedVersion !== resolution.expectedVersion) {
566
+ return {
567
+ state: 'unsupported',
568
+ diagnostic: 'The installed system Codex CLI is not supported. The npm package version does not match its launcher output. Reinstall or upgrade the official Codex CLI and retry; AW does not use managed fallback for this installation.',
569
+ };
570
+ }
571
+ return { state: 'probed', manager, result };
572
+ }
573
+ function unsupportedSystemDiagnostic(system) {
574
+ const detected = system.detectedVersion ? ` Detected ${system.detectedVersion}.` : '';
575
+ return `The installed system Codex CLI is not supported.${detected} Required minimum: ${system.requiredMinVersion}. Upgrade the official Codex CLI and retry; AW does not bypass an installed but unsupported system CLI.`;
576
+ }
577
+ const MANAGED_AUTHORIZATION_DIAGNOSTIC = 'This operation must acquire or rebuild the pinned AW-managed Codex runtime. Retry with --allow-managed-codex-install, or approve the interactive prompt.';
578
+ const MANAGED_UNAVAILABLE_DIAGNOSTIC = 'The AW-managed Codex runtime is unavailable. Retry the command, upgrade AW, or install a compatible official Codex CLI.';
579
+ export async function previewCodexManager(options = {}) {
580
+ const system = await probeSystemCodex(options);
581
+ if (system.state === 'probed' && system.result.status === 'supported') {
582
+ return {
583
+ state: 'system',
584
+ manager: {
585
+ ...system.manager,
586
+ version: system.result.detectedVersion,
587
+ },
588
+ };
589
+ }
590
+ if (system.state === 'unsupported') {
591
+ return {
592
+ state: 'blocked',
593
+ code: 'codexSystemCliUnsupported',
594
+ diagnostic: system.diagnostic,
595
+ };
596
+ }
597
+ if (system.state === 'probed') {
598
+ return {
599
+ state: 'blocked',
600
+ code: 'codexSystemCliUnsupported',
601
+ diagnostic: unsupportedSystemDiagnostic(system.result),
602
+ };
603
+ }
604
+ const managed = await inspectManagedCodexRuntime(options);
605
+ if (managed.state === 'valid')
606
+ return { state: 'cached', manager: managed.manager };
607
+ if (managed.state === 'absent' || managed.state === 'rebuildable') {
608
+ return { state: 'requires-install' };
609
+ }
610
+ return {
611
+ state: 'blocked',
612
+ code: 'managedCodexUnavailable',
613
+ diagnostic: MANAGED_UNAVAILABLE_DIAGNOSTIC,
614
+ };
615
+ }
616
+ export async function resolveCodexManager(options = {}) {
617
+ const system = await probeSystemCodex(options);
618
+ if (system.state === 'probed' && system.result.status === 'supported') {
619
+ return {
620
+ ...system.manager,
621
+ version: system.result.detectedVersion,
622
+ };
623
+ }
624
+ if (system.state === 'unsupported') {
625
+ throw new CodexManagerError('codexSystemCliUnsupported', system.diagnostic);
626
+ }
627
+ if (system.state === 'probed') {
628
+ throw new CodexManagerError('codexSystemCliUnsupported', unsupportedSystemDiagnostic(system.result));
629
+ }
630
+ const managed = await inspectManagedCodexRuntime(options);
631
+ if (managed.state === 'valid')
632
+ return managed.manager;
633
+ if (managed.state === 'blocked') {
634
+ throw new CodexManagerError('managedCodexUnavailable', MANAGED_UNAVAILABLE_DIAGNOSTIC);
635
+ }
636
+ if (!options.authorizer) {
637
+ throw new CodexManagerError('managedCodexAuthorizationRequired', MANAGED_AUTHORIZATION_DIAGNOSTIC);
638
+ }
639
+ let authorized;
640
+ try {
641
+ authorized = await options.authorizer();
642
+ }
643
+ catch (error) {
644
+ throw new CodexManagerError('managedCodexUnavailable', MANAGED_UNAVAILABLE_DIAGNOSTIC);
645
+ }
646
+ if (!authorized) {
647
+ throw new CodexManagerError('managedCodexAuthorizationRequired', MANAGED_AUTHORIZATION_DIAGNOSTIC);
648
+ }
649
+ try {
650
+ return await acquireManagedCodexRuntime(options);
651
+ }
652
+ catch (error) {
653
+ throw new CodexManagerError('managedCodexUnavailable', MANAGED_UNAVAILABLE_DIAGNOSTIC);
654
+ }
655
+ }
656
+ //# sourceMappingURL=codex-manager.js.map