codexgpt 1.0.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.
Files changed (654) hide show
  1. package/AGENTS.example.md +20 -0
  2. package/CHANGELOG.md +342 -0
  3. package/CHATGPT_PROMPT.md +12 -0
  4. package/CLOUDFLARED_VERIFIED_INSTALL.md +94 -0
  5. package/CODEX_PROMPT.md +12 -0
  6. package/CONTRIBUTING.md +62 -0
  7. package/DOMAIN_SETUP.md +275 -0
  8. package/FAQ.md +366 -0
  9. package/FAQ_ZH.md +329 -0
  10. package/LICENSE +21 -0
  11. package/PUBLIC_LAUNCH_CHECKLIST.md +111 -0
  12. package/README.md +490 -0
  13. package/README_ZH.md +747 -0
  14. package/SECURITY.md +295 -0
  15. package/config.example.env +103 -0
  16. package/dist/access/fullAccessLease.js +148 -0
  17. package/dist/access/fullAccessLease.js.map +1 -0
  18. package/dist/access/protectedRoots.js +122 -0
  19. package/dist/access/protectedRoots.js.map +1 -0
  20. package/dist/access/rootAdmission.js +347 -0
  21. package/dist/access/rootAdmission.js.map +1 -0
  22. package/dist/analysis/cache.js +27 -0
  23. package/dist/analysis/cache.js.map +1 -0
  24. package/dist/analysis/classify.js +102 -0
  25. package/dist/analysis/classify.js.map +1 -0
  26. package/dist/analysis/extract.js +139 -0
  27. package/dist/analysis/extract.js.map +1 -0
  28. package/dist/analysis/graph.js +22 -0
  29. package/dist/analysis/graph.js.map +1 -0
  30. package/dist/analysis/impact.js +167 -0
  31. package/dist/analysis/impact.js.map +1 -0
  32. package/dist/analysis/index.js +215 -0
  33. package/dist/analysis/index.js.map +1 -0
  34. package/dist/analysis/inventory.js +51 -0
  35. package/dist/analysis/inventory.js.map +1 -0
  36. package/dist/analysis/providers.js +24 -0
  37. package/dist/analysis/providers.js.map +1 -0
  38. package/dist/analysis/rank.js +27 -0
  39. package/dist/analysis/rank.js.map +1 -0
  40. package/dist/analysis/types.js +8 -0
  41. package/dist/analysis/types.js.map +1 -0
  42. package/dist/audit/canonicalJson.js +79 -0
  43. package/dist/audit/canonicalJson.js.map +1 -0
  44. package/dist/audit/diagnostics.js +128 -0
  45. package/dist/audit/diagnostics.js.map +1 -0
  46. package/dist/audit/index.js +12 -0
  47. package/dist/audit/index.js.map +1 -0
  48. package/dist/audit/lifecycleV3.js +53 -0
  49. package/dist/audit/lifecycleV3.js.map +1 -0
  50. package/dist/audit/lifecycleV4.js +70 -0
  51. package/dist/audit/lifecycleV4.js.map +1 -0
  52. package/dist/audit/lock.js +195 -0
  53. package/dist/audit/lock.js.map +1 -0
  54. package/dist/audit/queryTool.js +120 -0
  55. package/dist/audit/queryTool.js.map +1 -0
  56. package/dist/audit/runtime.js +48 -0
  57. package/dist/audit/runtime.js.map +1 -0
  58. package/dist/audit/schemas.js +640 -0
  59. package/dist/audit/schemas.js.map +1 -0
  60. package/dist/audit/store.js +1309 -0
  61. package/dist/audit/store.js.map +1 -0
  62. package/dist/audit/transactionParticipant.js +45 -0
  63. package/dist/audit/transactionParticipant.js.map +1 -0
  64. package/dist/audit/types.js +11 -0
  65. package/dist/audit/types.js.map +1 -0
  66. package/dist/auth/audit.js +44 -0
  67. package/dist/auth/audit.js.map +1 -0
  68. package/dist/auth/authorizationStore.js +333 -0
  69. package/dist/auth/authorizationStore.js.map +1 -0
  70. package/dist/auth/challenges.js +25 -0
  71. package/dist/auth/challenges.js.map +1 -0
  72. package/dist/auth/clientStore.js +469 -0
  73. package/dist/auth/clientStore.js.map +1 -0
  74. package/dist/auth/cloudflareConfig.js +112 -0
  75. package/dist/auth/cloudflareConfig.js.map +1 -0
  76. package/dist/auth/configuration.js +167 -0
  77. package/dist/auth/configuration.js.map +1 -0
  78. package/dist/auth/credentialStore.js +65 -0
  79. package/dist/auth/credentialStore.js.map +1 -0
  80. package/dist/auth/deploymentLock.js +220 -0
  81. package/dist/auth/deploymentLock.js.map +1 -0
  82. package/dist/auth/deploymentRegistry.js +149 -0
  83. package/dist/auth/deploymentRegistry.js.map +1 -0
  84. package/dist/auth/errors.js +26 -0
  85. package/dist/auth/errors.js.map +1 -0
  86. package/dist/auth/grantStore.js +307 -0
  87. package/dist/auth/grantStore.js.map +1 -0
  88. package/dist/auth/index.js +39 -0
  89. package/dist/auth/index.js.map +1 -0
  90. package/dist/auth/keyManager.js +148 -0
  91. package/dist/auth/keyManager.js.map +1 -0
  92. package/dist/auth/localAdminSession.js +173 -0
  93. package/dist/auth/localAdminSession.js.map +1 -0
  94. package/dist/auth/metadata.js +69 -0
  95. package/dist/auth/metadata.js.map +1 -0
  96. package/dist/auth/oauthProvider.js +589 -0
  97. package/dist/auth/oauthProvider.js.map +1 -0
  98. package/dist/auth/ownerApproval.js +51 -0
  99. package/dist/auth/ownerApproval.js.map +1 -0
  100. package/dist/auth/policyIdentity.js +189 -0
  101. package/dist/auth/policyIdentity.js.map +1 -0
  102. package/dist/auth/rateLimits.js +66 -0
  103. package/dist/auth/rateLimits.js.map +1 -0
  104. package/dist/auth/recovery.js +275 -0
  105. package/dist/auth/recovery.js.map +1 -0
  106. package/dist/auth/requestContext.js +34 -0
  107. package/dist/auth/requestContext.js.map +1 -0
  108. package/dist/auth/resourceMiddleware.js +147 -0
  109. package/dist/auth/resourceMiddleware.js.map +1 -0
  110. package/dist/auth/runtimeStatus.js +51 -0
  111. package/dist/auth/runtimeStatus.js.map +1 -0
  112. package/dist/auth/schemas.js +84 -0
  113. package/dist/auth/schemas.js.map +1 -0
  114. package/dist/auth/stateStore.js +468 -0
  115. package/dist/auth/stateStore.js.map +1 -0
  116. package/dist/auth/tokenService.js +631 -0
  117. package/dist/auth/tokenService.js.map +1 -0
  118. package/dist/auth/toolSecurity.js +108 -0
  119. package/dist/auth/toolSecurity.js.map +1 -0
  120. package/dist/auth/types.js +6 -0
  121. package/dist/auth/types.js.map +1 -0
  122. package/dist/auth/windowsDpapi.js +193 -0
  123. package/dist/auth/windowsDpapi.js.map +1 -0
  124. package/dist/bashOps.js +292 -0
  125. package/dist/bashOps.js.map +1 -0
  126. package/dist/capabilitiesOps.js +412 -0
  127. package/dist/capabilitiesOps.js.map +1 -0
  128. package/dist/changesets/crypto.js +92 -0
  129. package/dist/changesets/crypto.js.map +1 -0
  130. package/dist/changesets/index.js +9 -0
  131. package/dist/changesets/index.js.map +1 -0
  132. package/dist/changesets/moveStore.js +237 -0
  133. package/dist/changesets/moveStore.js.map +1 -0
  134. package/dist/changesets/moveUndo.js +386 -0
  135. package/dist/changesets/moveUndo.js.map +1 -0
  136. package/dist/changesets/schemas.js +234 -0
  137. package/dist/changesets/schemas.js.map +1 -0
  138. package/dist/changesets/store.js +573 -0
  139. package/dist/changesets/store.js.map +1 -0
  140. package/dist/changesets/types.js +9 -0
  141. package/dist/changesets/types.js.map +1 -0
  142. package/dist/changesets/undo.js +525 -0
  143. package/dist/changesets/undo.js.map +1 -0
  144. package/dist/changesets/unifiedUndo.js +31 -0
  145. package/dist/changesets/unifiedUndo.js.map +1 -0
  146. package/dist/cliEnvironment.js +85 -0
  147. package/dist/cliEnvironment.js.map +1 -0
  148. package/dist/codexSessions.js +733 -0
  149. package/dist/codexSessions.js.map +1 -0
  150. package/dist/codexgptSupertool.js +216 -0
  151. package/dist/codexgptSupertool.js.map +1 -0
  152. package/dist/codexproSupertool.js +204 -0
  153. package/dist/codexproSupertool.js.map +1 -0
  154. package/dist/config.js +733 -0
  155. package/dist/config.js.map +1 -0
  156. package/dist/control/localApprovalClient.js +287 -0
  157. package/dist/control/localApprovalClient.js.map +1 -0
  158. package/dist/control/localApprovalServer.js +466 -0
  159. package/dist/control/localApprovalServer.js.map +1 -0
  160. package/dist/control/runtime.js +178 -0
  161. package/dist/control/runtime.js.map +1 -0
  162. package/dist/control/schemas.js +184 -0
  163. package/dist/control/schemas.js.map +1 -0
  164. package/dist/control/windowsLocalControl.js +348 -0
  165. package/dist/control/windowsLocalControl.js.map +1 -0
  166. package/dist/fsOps.js +541 -0
  167. package/dist/fsOps.js.map +1 -0
  168. package/dist/git/admission.js +26 -0
  169. package/dist/git/admission.js.map +1 -0
  170. package/dist/git/branchService.js +51 -0
  171. package/dist/git/branchService.js.map +1 -0
  172. package/dist/git/capabilities.js +143 -0
  173. package/dist/git/capabilities.js.map +1 -0
  174. package/dist/git/commitService.js +344 -0
  175. package/dist/git/commitService.js.map +1 -0
  176. package/dist/git/durableState.js +151 -0
  177. package/dist/git/durableState.js.map +1 -0
  178. package/dist/git/execution.js +451 -0
  179. package/dist/git/execution.js.map +1 -0
  180. package/dist/git/fileTransaction.js +50 -0
  181. package/dist/git/fileTransaction.js.map +1 -0
  182. package/dist/git/indexService.js +421 -0
  183. package/dist/git/indexService.js.map +1 -0
  184. package/dist/git/integrations.js +653 -0
  185. package/dist/git/integrations.js.map +1 -0
  186. package/dist/git/locks.js +287 -0
  187. package/dist/git/locks.js.map +1 -0
  188. package/dist/git/mutationContext.js +92 -0
  189. package/dist/git/mutationContext.js.map +1 -0
  190. package/dist/git/mutationJournal.js +91 -0
  191. package/dist/git/mutationJournal.js.map +1 -0
  192. package/dist/git/mutationService.js +352 -0
  193. package/dist/git/mutationService.js.map +1 -0
  194. package/dist/git/normalization.js +57 -0
  195. package/dist/git/normalization.js.map +1 -0
  196. package/dist/git/objectQuarantine.js +243 -0
  197. package/dist/git/objectQuarantine.js.map +1 -0
  198. package/dist/git/opaqueRecordStore.js +187 -0
  199. package/dist/git/opaqueRecordStore.js.map +1 -0
  200. package/dist/git/operationStore.js +287 -0
  201. package/dist/git/operationStore.js.map +1 -0
  202. package/dist/git/parsers.js +311 -0
  203. package/dist/git/parsers.js.map +1 -0
  204. package/dist/git/privateIndex.js +79 -0
  205. package/dist/git/privateIndex.js.map +1 -0
  206. package/dist/git/productionBootstrap.js +39 -0
  207. package/dist/git/productionBootstrap.js.map +1 -0
  208. package/dist/git/readService.js +846 -0
  209. package/dist/git/readService.js.map +1 -0
  210. package/dist/git/recovery.js +417 -0
  211. package/dist/git/recovery.js.map +1 -0
  212. package/dist/git/repositoryIdentity.js +611 -0
  213. package/dist/git/repositoryIdentity.js.map +1 -0
  214. package/dist/git/repositoryStore.js +237 -0
  215. package/dist/git/repositoryStore.js.map +1 -0
  216. package/dist/git/resources.js +113 -0
  217. package/dist/git/resources.js.map +1 -0
  218. package/dist/git/restoreService.js +178 -0
  219. package/dist/git/restoreService.js.map +1 -0
  220. package/dist/git/reviewToken.js +86 -0
  221. package/dist/git/reviewToken.js.map +1 -0
  222. package/dist/git/stashService.js +566 -0
  223. package/dist/git/stashService.js.map +1 -0
  224. package/dist/git/stateToken.js +139 -0
  225. package/dist/git/stateToken.js.map +1 -0
  226. package/dist/gitOps.js +147 -0
  227. package/dist/gitOps.js.map +1 -0
  228. package/dist/guard.js +608 -0
  229. package/dist/guard.js.map +1 -0
  230. package/dist/guidance/diagnostics.js +14 -0
  231. package/dist/guidance/diagnostics.js.map +1 -0
  232. package/dist/guidance/instructions.js +167 -0
  233. package/dist/guidance/instructions.js.map +1 -0
  234. package/dist/guidance/mode.js +18 -0
  235. package/dist/guidance/mode.js.map +1 -0
  236. package/dist/guidance/openaiSkillMetadata.js +29 -0
  237. package/dist/guidance/openaiSkillMetadata.js.map +1 -0
  238. package/dist/guidance/safeTextReader.js +171 -0
  239. package/dist/guidance/safeTextReader.js.map +1 -0
  240. package/dist/guidance/skillCatalog.js +70 -0
  241. package/dist/guidance/skillCatalog.js.map +1 -0
  242. package/dist/guidance/skillDiscovery.js +353 -0
  243. package/dist/guidance/skillDiscovery.js.map +1 -0
  244. package/dist/guidance/skillMetadata.js +115 -0
  245. package/dist/guidance/skillMetadata.js.map +1 -0
  246. package/dist/guidance/skillResources.js +146 -0
  247. package/dist/guidance/skillResources.js.map +1 -0
  248. package/dist/handoffOps.js +449 -0
  249. package/dist/handoffOps.js.map +1 -0
  250. package/dist/http/localAdminApp.js +203 -0
  251. package/dist/http/localAdminApp.js.map +1 -0
  252. package/dist/http/oauthMcpRuntime.js +294 -0
  253. package/dist/http/oauthMcpRuntime.js.map +1 -0
  254. package/dist/http/publicApp.js +350 -0
  255. package/dist/http/publicApp.js.map +1 -0
  256. package/dist/http/securityHeaders.js +11 -0
  257. package/dist/http/securityHeaders.js.map +1 -0
  258. package/dist/http.js +2076 -0
  259. package/dist/http.js.map +1 -0
  260. package/dist/moves/engine.js +1079 -0
  261. package/dist/moves/engine.js.map +1 -0
  262. package/dist/moves/index.js +6 -0
  263. package/dist/moves/index.js.map +1 -0
  264. package/dist/moves/planner.js +270 -0
  265. package/dist/moves/planner.js.map +1 -0
  266. package/dist/moves/recovery.js +557 -0
  267. package/dist/moves/recovery.js.map +1 -0
  268. package/dist/moves/service.js +300 -0
  269. package/dist/moves/service.js.map +1 -0
  270. package/dist/moves/types.js +11 -0
  271. package/dist/moves/types.js.map +1 -0
  272. package/dist/mutations/index.js +4 -0
  273. package/dist/mutations/index.js.map +1 -0
  274. package/dist/mutations/lifecycle.js +165 -0
  275. package/dist/mutations/lifecycle.js.map +1 -0
  276. package/dist/mutations/localService.js +163 -0
  277. package/dist/mutations/localService.js.map +1 -0
  278. package/dist/mutations/runtime.js +322 -0
  279. package/dist/mutations/runtime.js.map +1 -0
  280. package/dist/mutations/types.js +2 -0
  281. package/dist/mutations/types.js.map +1 -0
  282. package/dist/mutations/writers.js +360 -0
  283. package/dist/mutations/writers.js.map +1 -0
  284. package/dist/patchOps.js +420 -0
  285. package/dist/patchOps.js.map +1 -0
  286. package/dist/policy/approval.js +306 -0
  287. package/dist/policy/approval.js.map +1 -0
  288. package/dist/policy/audit.js +88 -0
  289. package/dist/policy/audit.js.map +1 -0
  290. package/dist/policy/authorizationFacts.js +187 -0
  291. package/dist/policy/authorizationFacts.js.map +1 -0
  292. package/dist/policy/compat.js +104 -0
  293. package/dist/policy/compat.js.map +1 -0
  294. package/dist/policy/context.js +31 -0
  295. package/dist/policy/context.js.map +1 -0
  296. package/dist/policy/enforcement.js +46 -0
  297. package/dist/policy/enforcement.js.map +1 -0
  298. package/dist/policy/evaluator.js +338 -0
  299. package/dist/policy/evaluator.js.map +1 -0
  300. package/dist/policy/executionCapabilities.js +80 -0
  301. package/dist/policy/executionCapabilities.js.map +1 -0
  302. package/dist/policy/executionResources.js +192 -0
  303. package/dist/policy/executionResources.js.map +1 -0
  304. package/dist/policy/fullAccessResources.js +23 -0
  305. package/dist/policy/fullAccessResources.js.map +1 -0
  306. package/dist/policy/hardPolicy.js +50 -0
  307. package/dist/policy/hardPolicy.js.map +1 -0
  308. package/dist/policy/identity.js +142 -0
  309. package/dist/policy/identity.js.map +1 -0
  310. package/dist/policy/integration.js +331 -0
  311. package/dist/policy/integration.js.map +1 -0
  312. package/dist/policy/pendingApprovals.js +301 -0
  313. package/dist/policy/pendingApprovals.js.map +1 -0
  314. package/dist/policy/profileStore.js +367 -0
  315. package/dist/policy/profileStore.js.map +1 -0
  316. package/dist/policy/resources.js +249 -0
  317. package/dist/policy/resources.js.map +1 -0
  318. package/dist/policy/runtime.js +713 -0
  319. package/dist/policy/runtime.js.map +1 -0
  320. package/dist/policy/schemas.js +625 -0
  321. package/dist/policy/schemas.js.map +1 -0
  322. package/dist/policy/toolPolicy.js +141 -0
  323. package/dist/policy/toolPolicy.js.map +1 -0
  324. package/dist/policy/transport.js +10 -0
  325. package/dist/policy/transport.js.map +1 -0
  326. package/dist/policy/types.js +31 -0
  327. package/dist/policy/types.js.map +1 -0
  328. package/dist/proContext.js +675 -0
  329. package/dist/proContext.js.map +1 -0
  330. package/dist/process/authority.js +18 -0
  331. package/dist/process/authority.js.map +1 -0
  332. package/dist/process/backendDiscovery.js +83 -0
  333. package/dist/process/backendDiscovery.js.map +1 -0
  334. package/dist/process/commandCompiler.js +71 -0
  335. package/dist/process/commandCompiler.js.map +1 -0
  336. package/dist/process/outputCursor.js +67 -0
  337. package/dist/process/outputCursor.js.map +1 -0
  338. package/dist/process/outputQuota.js +94 -0
  339. package/dist/process/outputQuota.js.map +1 -0
  340. package/dist/process/outputRing.js +138 -0
  341. package/dist/process/outputRing.js.map +1 -0
  342. package/dist/process/processAuditCoordinator.js +52 -0
  343. package/dist/process/processAuditCoordinator.js.map +1 -0
  344. package/dist/process/processManager.js +311 -0
  345. package/dist/process/processManager.js.map +1 -0
  346. package/dist/process/runCommand.js +332 -0
  347. package/dist/process/runCommand.js.map +1 -0
  348. package/dist/process/streamingRedactor.js +105 -0
  349. package/dist/process/streamingRedactor.js.map +1 -0
  350. package/dist/process/types.js +2 -0
  351. package/dist/process/types.js.map +1 -0
  352. package/dist/process/windowsHostClient.js +604 -0
  353. package/dist/process/windowsHostClient.js.map +1 -0
  354. package/dist/process/windowsHostProtocol.js +270 -0
  355. package/dist/process/windowsHostProtocol.js.map +1 -0
  356. package/dist/process/windowsPersistentBackend.js +263 -0
  357. package/dist/process/windowsPersistentBackend.js.map +1 -0
  358. package/dist/productionRuntime.js +907 -0
  359. package/dist/productionRuntime.js.map +1 -0
  360. package/dist/profileStore.js +231 -0
  361. package/dist/profileStore.js.map +1 -0
  362. package/dist/redact.js +124 -0
  363. package/dist/redact.js.map +1 -0
  364. package/dist/searchOps.js +186 -0
  365. package/dist/searchOps.js.map +1 -0
  366. package/dist/selfTestOps.js +786 -0
  367. package/dist/selfTestOps.js.map +1 -0
  368. package/dist/semantic/budgets.js +12 -0
  369. package/dist/semantic/budgets.js.map +1 -0
  370. package/dist/semantic/builtin/typescriptAssets.js +68 -0
  371. package/dist/semantic/builtin/typescriptAssets.js.map +1 -0
  372. package/dist/semantic/builtin/typescriptProvider.js +211 -0
  373. package/dist/semantic/builtin/typescriptProvider.js.map +1 -0
  374. package/dist/semantic/builtin/typescriptWorker.js +365 -0
  375. package/dist/semantic/builtin/typescriptWorker.js.map +1 -0
  376. package/dist/semantic/diffPreview.js +36 -0
  377. package/dist/semantic/diffPreview.js.map +1 -0
  378. package/dist/semantic/index.js +11 -0
  379. package/dist/semantic/index.js.map +1 -0
  380. package/dist/semantic/manager.js +522 -0
  381. package/dist/semantic/manager.js.map +1 -0
  382. package/dist/semantic/positions.js +86 -0
  383. package/dist/semantic/positions.js.map +1 -0
  384. package/dist/semantic/previewStore.js +276 -0
  385. package/dist/semantic/previewStore.js.map +1 -0
  386. package/dist/semantic/projectResolver.js +309 -0
  387. package/dist/semantic/projectResolver.js.map +1 -0
  388. package/dist/semantic/sourceSnapshot.js +54 -0
  389. package/dist/semantic/sourceSnapshot.js.map +1 -0
  390. package/dist/semantic/status.js +46 -0
  391. package/dist/semantic/status.js.map +1 -0
  392. package/dist/semantic/types.js +2 -0
  393. package/dist/semantic/types.js.map +1 -0
  394. package/dist/server.js +8676 -0
  395. package/dist/server.js.map +1 -0
  396. package/dist/stdio.js +64 -0
  397. package/dist/stdio.js.map +1 -0
  398. package/dist/toolCardWidget.js +2000 -0
  399. package/dist/toolCardWidget.js.map +1 -0
  400. package/dist/tools/contracts/catalog.js +111 -0
  401. package/dist/tools/contracts/catalog.js.map +1 -0
  402. package/dist/tools/contracts/index.js +8 -0
  403. package/dist/tools/contracts/index.js.map +1 -0
  404. package/dist/tools/contracts/registration.js +27 -0
  405. package/dist/tools/contracts/registration.js.map +1 -0
  406. package/dist/tools/contracts/schemas.js +11 -0
  407. package/dist/tools/contracts/schemas.js.map +1 -0
  408. package/dist/tools/contracts/types.js +2 -0
  409. package/dist/tools/contracts/types.js.map +1 -0
  410. package/dist/tools/contracts/v3.js +76 -0
  411. package/dist/tools/contracts/v3.js.map +1 -0
  412. package/dist/tools/contracts/v4.js +39 -0
  413. package/dist/tools/contracts/v4.js.map +1 -0
  414. package/dist/tools/contracts/v5.js +20 -0
  415. package/dist/tools/contracts/v5.js.map +1 -0
  416. package/dist/tools/phase3dServer.js +350 -0
  417. package/dist/tools/phase3dServer.js.map +1 -0
  418. package/dist/tools/schemas/applyPatch.js +388 -0
  419. package/dist/tools/schemas/applyPatch.js.map +1 -0
  420. package/dist/tools/schemas/bash.js +202 -0
  421. package/dist/tools/schemas/bash.js.map +1 -0
  422. package/dist/tools/schemas/closeWorkspace.js +105 -0
  423. package/dist/tools/schemas/closeWorkspace.js.map +1 -0
  424. package/dist/tools/schemas/codexContext.js +402 -0
  425. package/dist/tools/schemas/codexContext.js.map +1 -0
  426. package/dist/tools/schemas/codexSessions.js +328 -0
  427. package/dist/tools/schemas/codexSessions.js.map +1 -0
  428. package/dist/tools/schemas/codexgpt.js +1068 -0
  429. package/dist/tools/schemas/codexgpt.js.map +1 -0
  430. package/dist/tools/schemas/codexgptInventory.js +359 -0
  431. package/dist/tools/schemas/codexgptInventory.js.map +1 -0
  432. package/dist/tools/schemas/codexgptSelfTest.js +563 -0
  433. package/dist/tools/schemas/codexgptSelfTest.js.map +1 -0
  434. package/dist/tools/schemas/codexpro.js +917 -0
  435. package/dist/tools/schemas/codexpro.js.map +1 -0
  436. package/dist/tools/schemas/codexproInventory.js +352 -0
  437. package/dist/tools/schemas/codexproInventory.js.map +1 -0
  438. package/dist/tools/schemas/codexproSelfTest.js +546 -0
  439. package/dist/tools/schemas/codexproSelfTest.js.map +1 -0
  440. package/dist/tools/schemas/common.js +21 -0
  441. package/dist/tools/schemas/common.js.map +1 -0
  442. package/dist/tools/schemas/createTaskWorktree.js +51 -0
  443. package/dist/tools/schemas/createTaskWorktree.js.map +1 -0
  444. package/dist/tools/schemas/edit.js +321 -0
  445. package/dist/tools/schemas/edit.js.map +1 -0
  446. package/dist/tools/schemas/execution.js +330 -0
  447. package/dist/tools/schemas/execution.js.map +1 -0
  448. package/dist/tools/schemas/exportProContext.js +370 -0
  449. package/dist/tools/schemas/exportProContext.js.map +1 -0
  450. package/dist/tools/schemas/getTaskWorktree.js +19 -0
  451. package/dist/tools/schemas/getTaskWorktree.js.map +1 -0
  452. package/dist/tools/schemas/gitBranch.js +42 -0
  453. package/dist/tools/schemas/gitBranch.js.map +1 -0
  454. package/dist/tools/schemas/gitCommit.js +40 -0
  455. package/dist/tools/schemas/gitCommit.js.map +1 -0
  456. package/dist/tools/schemas/gitCreateBranch.js +22 -0
  457. package/dist/tools/schemas/gitCreateBranch.js.map +1 -0
  458. package/dist/tools/schemas/gitDiff.js +222 -0
  459. package/dist/tools/schemas/gitDiff.js.map +1 -0
  460. package/dist/tools/schemas/gitLog.js +41 -0
  461. package/dist/tools/schemas/gitLog.js.map +1 -0
  462. package/dist/tools/schemas/gitRestore.js +47 -0
  463. package/dist/tools/schemas/gitRestore.js.map +1 -0
  464. package/dist/tools/schemas/gitStage.js +33 -0
  465. package/dist/tools/schemas/gitStage.js.map +1 -0
  466. package/dist/tools/schemas/gitStash.js +102 -0
  467. package/dist/tools/schemas/gitStash.js.map +1 -0
  468. package/dist/tools/schemas/gitStatus.js +226 -0
  469. package/dist/tools/schemas/gitStatus.js.map +1 -0
  470. package/dist/tools/schemas/gitV4Common.js +205 -0
  471. package/dist/tools/schemas/gitV4Common.js.map +1 -0
  472. package/dist/tools/schemas/guidance.js +40 -0
  473. package/dist/tools/schemas/guidance.js.map +1 -0
  474. package/dist/tools/schemas/handoffToAgent.js +276 -0
  475. package/dist/tools/schemas/handoffToAgent.js.map +1 -0
  476. package/dist/tools/schemas/handoffToCodex.js +137 -0
  477. package/dist/tools/schemas/handoffToCodex.js.map +1 -0
  478. package/dist/tools/schemas/inspectWorkspace.js +379 -0
  479. package/dist/tools/schemas/inspectWorkspace.js.map +1 -0
  480. package/dist/tools/schemas/listTaskWorktrees.js +21 -0
  481. package/dist/tools/schemas/listTaskWorktrees.js.map +1 -0
  482. package/dist/tools/schemas/listWorkspaces.js +134 -0
  483. package/dist/tools/schemas/listWorkspaces.js.map +1 -0
  484. package/dist/tools/schemas/loadSkill.js +619 -0
  485. package/dist/tools/schemas/loadSkill.js.map +1 -0
  486. package/dist/tools/schemas/mergeTaskWorktree.js +105 -0
  487. package/dist/tools/schemas/mergeTaskWorktree.js.map +1 -0
  488. package/dist/tools/schemas/movePaths.js +175 -0
  489. package/dist/tools/schemas/movePaths.js.map +1 -0
  490. package/dist/tools/schemas/openCurrentWorkspace.js +174 -0
  491. package/dist/tools/schemas/openCurrentWorkspace.js.map +1 -0
  492. package/dist/tools/schemas/openFullAccessWorkspace.js +81 -0
  493. package/dist/tools/schemas/openFullAccessWorkspace.js.map +1 -0
  494. package/dist/tools/schemas/openWorkspace.js +193 -0
  495. package/dist/tools/schemas/openWorkspace.js.map +1 -0
  496. package/dist/tools/schemas/queryAuditEvents.js +193 -0
  497. package/dist/tools/schemas/queryAuditEvents.js.map +1 -0
  498. package/dist/tools/schemas/read.js +199 -0
  499. package/dist/tools/schemas/read.js.map +1 -0
  500. package/dist/tools/schemas/readCodexSession.js +353 -0
  501. package/dist/tools/schemas/readCodexSession.js.map +1 -0
  502. package/dist/tools/schemas/readHandoff.js +446 -0
  503. package/dist/tools/schemas/readHandoff.js.map +1 -0
  504. package/dist/tools/schemas/removeTaskWorktree.js +40 -0
  505. package/dist/tools/schemas/removeTaskWorktree.js.map +1 -0
  506. package/dist/tools/schemas/search.js +235 -0
  507. package/dist/tools/schemas/search.js.map +1 -0
  508. package/dist/tools/schemas/semantic.js +195 -0
  509. package/dist/tools/schemas/semantic.js.map +1 -0
  510. package/dist/tools/schemas/serverConfig.js +157 -0
  511. package/dist/tools/schemas/serverConfig.js.map +1 -0
  512. package/dist/tools/schemas/showChanges.js +283 -0
  513. package/dist/tools/schemas/showChanges.js.map +1 -0
  514. package/dist/tools/schemas/transactionResult.js +11 -0
  515. package/dist/tools/schemas/transactionResult.js.map +1 -0
  516. package/dist/tools/schemas/tree.js +136 -0
  517. package/dist/tools/schemas/tree.js.map +1 -0
  518. package/dist/tools/schemas/undoChangeSet.js +152 -0
  519. package/dist/tools/schemas/undoChangeSet.js.map +1 -0
  520. package/dist/tools/schemas/waitForHandoff.js +462 -0
  521. package/dist/tools/schemas/waitForHandoff.js.map +1 -0
  522. package/dist/tools/schemas/workspaceSnapshot.js +145 -0
  523. package/dist/tools/schemas/workspaceSnapshot.js.map +1 -0
  524. package/dist/tools/schemas/write.js +285 -0
  525. package/dist/tools/schemas/write.js.map +1 -0
  526. package/dist/transactions/atomicFs.js +438 -0
  527. package/dist/transactions/atomicFs.js.map +1 -0
  528. package/dist/transactions/atomicStateFile.js +190 -0
  529. package/dist/transactions/atomicStateFile.js.map +1 -0
  530. package/dist/transactions/engine.js +574 -0
  531. package/dist/transactions/engine.js.map +1 -0
  532. package/dist/transactions/index.js +12 -0
  533. package/dist/transactions/index.js.map +1 -0
  534. package/dist/transactions/installation.js +158 -0
  535. package/dist/transactions/installation.js.map +1 -0
  536. package/dist/transactions/manifestV2Store.js +96 -0
  537. package/dist/transactions/manifestV2Store.js.map +1 -0
  538. package/dist/transactions/participantRecovery.js +98 -0
  539. package/dist/transactions/participantRecovery.js.map +1 -0
  540. package/dist/transactions/recovery.js +513 -0
  541. package/dist/transactions/recovery.js.map +1 -0
  542. package/dist/transactions/schemas.js +365 -0
  543. package/dist/transactions/schemas.js.map +1 -0
  544. package/dist/transactions/stateRoot.js +63 -0
  545. package/dist/transactions/stateRoot.js.map +1 -0
  546. package/dist/transactions/types.js +11 -0
  547. package/dist/transactions/types.js.map +1 -0
  548. package/dist/transactions/workspaceLock.js +201 -0
  549. package/dist/transactions/workspaceLock.js.map +1 -0
  550. package/dist/workspaceOps.js +924 -0
  551. package/dist/workspaceOps.js.map +1 -0
  552. package/dist/worktrees/candidateWorkspace.js +566 -0
  553. package/dist/worktrees/candidateWorkspace.js.map +1 -0
  554. package/dist/worktrees/manager.js +258 -0
  555. package/dist/worktrees/manager.js.map +1 -0
  556. package/dist/worktrees/materializer.js +60 -0
  557. package/dist/worktrees/materializer.js.map +1 -0
  558. package/dist/worktrees/mergeExecute.js +498 -0
  559. package/dist/worktrees/mergeExecute.js.map +1 -0
  560. package/dist/worktrees/mergePlanStore.js +247 -0
  561. package/dist/worktrees/mergePlanStore.js.map +1 -0
  562. package/dist/worktrees/mergePrepare.js +709 -0
  563. package/dist/worktrees/mergePrepare.js.map +1 -0
  564. package/dist/worktrees/recovery.js +294 -0
  565. package/dist/worktrees/recovery.js.map +1 -0
  566. package/dist/worktrees/remove.js +296 -0
  567. package/dist/worktrees/remove.js.map +1 -0
  568. package/dist/worktrees/remover.js +57 -0
  569. package/dist/worktrees/remover.js.map +1 -0
  570. package/dist/worktrees/root.js +47 -0
  571. package/dist/worktrees/root.js.map +1 -0
  572. package/dist/worktrees/service.js +245 -0
  573. package/dist/worktrees/service.js.map +1 -0
  574. package/dist/worktrees/store.js +156 -0
  575. package/dist/worktrees/store.js.map +1 -0
  576. package/dist/worktrees/treeManifest.js +106 -0
  577. package/dist/worktrees/treeManifest.js.map +1 -0
  578. package/dist/worktrees/verificationReceipts.js +215 -0
  579. package/dist/worktrees/verificationReceipts.js.map +1 -0
  580. package/dist/worktrees/verificationTerminal.js +23 -0
  581. package/dist/worktrees/verificationTerminal.js.map +1 -0
  582. package/dist/worktrees/workspaceAuthority.js +64 -0
  583. package/dist/worktrees/workspaceAuthority.js.map +1 -0
  584. package/docs/favicon.svg +5 -0
  585. package/docs/index.html +624 -0
  586. package/docs/og.svg +52 -0
  587. package/docs/script.js +33 -0
  588. package/docs/star.svg +11 -0
  589. package/docs/styles.css +1571 -0
  590. package/docs/zh.html +428 -0
  591. package/package.json +121 -0
  592. package/scripts/analysis-cli-smoke.mjs +81 -0
  593. package/scripts/analysis-smoke.mjs +179 -0
  594. package/scripts/atomic-file.mjs +137 -0
  595. package/scripts/ci-change-classifier.mjs +59 -0
  596. package/scripts/ci-failure-summary.mjs +92 -0
  597. package/scripts/cloudflared-installer.mjs +215 -0
  598. package/scripts/cloudflared-release.mjs +63 -0
  599. package/scripts/codexgpt-entry.mjs +235 -0
  600. package/scripts/codexgpt.mjs +4987 -0
  601. package/scripts/connector-auth-output-shim.cjs +66 -0
  602. package/scripts/doctor-smoke.mjs +90 -0
  603. package/scripts/doctor.mjs +165 -0
  604. package/scripts/exact-head-ci.mjs +126 -0
  605. package/scripts/execute-handoff-smoke-platform-compat.mjs +38 -0
  606. package/scripts/execute-handoff-smoke.mjs +1117 -0
  607. package/scripts/g8-u-live-probe.mjs +208 -0
  608. package/scripts/http-smoke-compat.mjs +151 -0
  609. package/scripts/http-smoke.mjs +776 -0
  610. package/scripts/long-task-runner.mjs +1037 -0
  611. package/scripts/oauth-admin.mjs +1608 -0
  612. package/scripts/output-bounds.mjs +29 -0
  613. package/scripts/owned-temp-root.d.mts +50 -0
  614. package/scripts/owned-temp-root.mjs +567 -0
  615. package/scripts/phase-4a-smoke.mjs +36 -0
  616. package/scripts/policy-windows-spike.mjs +135 -0
  617. package/scripts/pro-apply.mjs +152 -0
  618. package/scripts/pro-bundle.mjs +121 -0
  619. package/scripts/pro-smoke.mjs +97 -0
  620. package/scripts/process-identity.mjs +67 -0
  621. package/scripts/repository-policy.mjs +166 -0
  622. package/scripts/run-and-summarize.mjs +134 -0
  623. package/scripts/run-smoke.mjs +52 -0
  624. package/scripts/run-with-cleanup.mjs +98 -0
  625. package/scripts/settings-smoke-platform-compat.mjs +85 -0
  626. package/scripts/settings-smoke.mjs +769 -0
  627. package/scripts/smoke-platform-compat.mjs +302 -0
  628. package/scripts/smoke.mjs +1180 -0
  629. package/scripts/stress-contract-compat.mjs +94 -0
  630. package/scripts/stress.mjs +882 -0
  631. package/scripts/test-domains.mjs +247 -0
  632. package/scripts/test-execution-profile-manifest.mjs +273 -0
  633. package/scripts/test-execution-profiles.mjs +147 -0
  634. package/scripts/test-performance-reporter.mjs +291 -0
  635. package/scripts/toolchain-manager.mjs +266 -0
  636. package/scripts/toolchains.json +19 -0
  637. package/scripts/windows-conpty-probe-child.mjs +82 -0
  638. package/scripts/windows-conpty-worker.ps1 +24 -0
  639. package/scripts/windows-credential-host-manifest.json +16 -0
  640. package/scripts/windows-credential-host-protocol-v1.json +16 -0
  641. package/scripts/windows-credential-host.cs +256 -0
  642. package/scripts/windows-credential-host.ps1 +26 -0
  643. package/scripts/windows-local-control-manifest.json +23 -0
  644. package/scripts/windows-local-control-spike.cs +738 -0
  645. package/scripts/windows-local-control-spike.mjs +415 -0
  646. package/scripts/windows-local-control-spike.ps1 +35 -0
  647. package/scripts/windows-local-control.cs +738 -0
  648. package/scripts/windows-local-control.ps1 +35 -0
  649. package/scripts/windows-native-api-inventory-v1.json +90 -0
  650. package/scripts/windows-process-host-manifest.json +20 -0
  651. package/scripts/windows-process-host-protocol-v1.json +59 -0
  652. package/scripts/windows-process-host.cs +2385 -0
  653. package/scripts/windows-process-host.ps1 +59 -0
  654. package/scripts/windows-realpath-shim.cjs +78 -0
@@ -0,0 +1,631 @@
1
+ import { createHmac, randomBytes as nodeRandomBytes, timingSafeEqual } from "node:crypto";
2
+ import { SignJWT, createLocalJWKSet, jwtVerify } from "jose";
3
+ import { clientRefForId } from "./clientStore.js";
4
+ import { OAuthProtocolError, authConfigurationError } from "./errors.js";
5
+ import { KNOWN_OAUTH_SCOPES } from "./types.js";
6
+ export const OAUTH_ACCESS_TOKEN_TTL_SECONDS = 10 * 60;
7
+ export const OAUTH_ACCESS_TOKEN_CLOCK_SKEW_SECONDS = 60;
8
+ export const OAUTH_BEARER_MAX_BYTES = 8 * 1024;
9
+ export const OAUTH_REFRESH_TOKEN_MAX_BYTES = 512;
10
+ export const OAUTH_REFRESH_ENVELOPE_BYTES = 89;
11
+ export const OAUTH_ES256_ACTIVE_LIMIT = 8;
12
+ export const OAUTH_ES256_QUEUE_LIMIT = 32;
13
+ export const OAUTH_ES256_RESERVED_ACTIVE = 2;
14
+ export const OAUTH_ES256_RESERVED_QUEUE = 8;
15
+ export const OAUTH_FAILED_BEARER_RATE_PER_MINUTE = 120;
16
+ export const OAUTH_FAILED_BEARER_BURST = 30;
17
+ const REFRESH_VERSION = 1;
18
+ const REFRESH_PAYLOAD_BYTES = 1 + 16 + 8 + 32;
19
+ const TOKEN_ID_PATTERN = /^token_[A-Za-z0-9_-]{43}$/;
20
+ const GRANT_ID_PATTERN = /^grant_[a-f0-9]{32}$/;
21
+ const CLIENT_ID_PATTERN = /^client_[A-Za-z0-9_-]{43}$/;
22
+ const KID_PATTERN = /^kid_[a-f0-9]{32}$/;
23
+ const BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;
24
+ const ACCESS_PAYLOAD_KEYS = Object.freeze([
25
+ "aud", "client_id", "exp", "grant_id", "grant_rev", "iat",
26
+ "iss", "jti", "nbf", "scope", "sub"
27
+ ]);
28
+ export class OAuthBearerCapacityError extends Error {
29
+ retryAfterSeconds = 1;
30
+ constructor() {
31
+ super("OAuth bearer verification capacity is temporarily full.");
32
+ this.name = "OAuthBearerCapacityError";
33
+ }
34
+ }
35
+ export class OAuthEs256Admission {
36
+ #active = 0;
37
+ #ordinaryActive = 0;
38
+ #ordinaryQueued = 0;
39
+ #queue = [];
40
+ run(reserved, action) {
41
+ if (this.#canStart(reserved))
42
+ return this.#start(reserved, action);
43
+ if (this.#queue.length >= OAUTH_ES256_QUEUE_LIMIT ||
44
+ (!reserved && this.#ordinaryQueued >= OAUTH_ES256_QUEUE_LIMIT - OAUTH_ES256_RESERVED_QUEUE)) {
45
+ throw new OAuthBearerCapacityError();
46
+ }
47
+ if (!reserved)
48
+ this.#ordinaryQueued += 1;
49
+ return new Promise((resolve, reject) => {
50
+ this.#queue.push({
51
+ reserved,
52
+ action,
53
+ resolve: resolve,
54
+ reject
55
+ });
56
+ });
57
+ }
58
+ #canStart(reserved) {
59
+ if (this.#active >= OAUTH_ES256_ACTIVE_LIMIT)
60
+ return false;
61
+ return reserved || this.#ordinaryActive < OAUTH_ES256_ACTIVE_LIMIT - OAUTH_ES256_RESERVED_ACTIVE;
62
+ }
63
+ #start(reserved, action) {
64
+ this.#active += 1;
65
+ if (!reserved)
66
+ this.#ordinaryActive += 1;
67
+ return action().finally(() => {
68
+ this.#active -= 1;
69
+ if (!reserved)
70
+ this.#ordinaryActive -= 1;
71
+ this.#drain();
72
+ });
73
+ }
74
+ #drain() {
75
+ let progress = true;
76
+ while (progress && this.#queue.length > 0) {
77
+ progress = false;
78
+ const index = this.#queue.findIndex((entry) => this.#canStart(entry.reserved));
79
+ if (index < 0)
80
+ return;
81
+ const [entry] = this.#queue.splice(index, 1);
82
+ if (!entry.reserved)
83
+ this.#ordinaryQueued -= 1;
84
+ progress = true;
85
+ void this.#start(entry.reserved, entry.action).then(entry.resolve, entry.reject);
86
+ }
87
+ }
88
+ }
89
+ class FailedBearerBudget {
90
+ now;
91
+ #tokens = OAUTH_FAILED_BEARER_BURST;
92
+ #updatedAt;
93
+ constructor(now) {
94
+ this.now = now;
95
+ this.#updatedAt = now();
96
+ }
97
+ reserve() {
98
+ this.#refill();
99
+ if (this.#tokens < 1)
100
+ return false;
101
+ this.#tokens -= 1;
102
+ return true;
103
+ }
104
+ refund() {
105
+ this.#refill();
106
+ this.#tokens = Math.min(OAUTH_FAILED_BEARER_BURST, this.#tokens + 1);
107
+ }
108
+ #refill() {
109
+ const current = this.now();
110
+ const elapsed = Math.max(0, current - this.#updatedAt);
111
+ this.#updatedAt = current;
112
+ this.#tokens = Math.min(OAUTH_FAILED_BEARER_BURST, this.#tokens + elapsed * (OAUTH_FAILED_BEARER_RATE_PER_MINUTE / 60_000));
113
+ }
114
+ }
115
+ function deriveKey(root, purpose) {
116
+ return createHmac("sha256", root).update(purpose, "utf8").digest();
117
+ }
118
+ function fixedEqual(left, right) {
119
+ return left.length === right.length && timingSafeEqual(left, right);
120
+ }
121
+ function oauthInvalidGrant() {
122
+ return new OAuthProtocolError("invalid_grant", "The OAuth grant is invalid.");
123
+ }
124
+ function accessInvalid() {
125
+ return new OAuthProtocolError("invalid_grant", "The access token is invalid.", 401);
126
+ }
127
+ function parseScopes(scope) {
128
+ if (typeof scope !== "string" || scope.length < 1 || scope.length > 256 || /\s{2,}|[^\x20-\x7e]/.test(scope)) {
129
+ throw accessInvalid();
130
+ }
131
+ const values = scope.split(" ");
132
+ if (new Set(values).size !== values.length || values.some((value) => !KNOWN_OAUTH_SCOPES.includes(value))) {
133
+ throw accessInvalid();
134
+ }
135
+ const normalized = KNOWN_OAUTH_SCOPES.filter((value) => values.includes(value));
136
+ if (normalized.length !== values.length || normalized.some((value, index) => value !== values[index])) {
137
+ throw accessInvalid();
138
+ }
139
+ return Object.freeze([...normalized]);
140
+ }
141
+ function numericClaim(payload, name) {
142
+ const value = payload[name];
143
+ if (!Number.isSafeInteger(value) || value < 0)
144
+ throw accessInvalid();
145
+ return value;
146
+ }
147
+ function stringClaim(payload, name) {
148
+ const value = payload[name];
149
+ if (typeof value !== "string")
150
+ throw accessInvalid();
151
+ return value;
152
+ }
153
+ export class OAuthTokenService {
154
+ #identity;
155
+ #ownerSubject;
156
+ #ownerRef;
157
+ #store;
158
+ #grants;
159
+ #privateKey;
160
+ #activeKid;
161
+ #refreshEnvelopeKey;
162
+ #refreshStoreKey;
163
+ #authorizationCodeKey;
164
+ #bearerCacheKey;
165
+ #now;
166
+ #randomBytes;
167
+ #admission = new OAuthEs256Admission();
168
+ #failedBudget;
169
+ #positiveCache = new Map();
170
+ #negativeCache = new Map();
171
+ #validatedFingerprints = new Map();
172
+ constructor(input) {
173
+ this.#identity = Object.freeze({ ...input.identity });
174
+ this.#ownerSubject = input.ownerSubject;
175
+ this.#ownerRef = input.ownerRef;
176
+ this.#store = input.store;
177
+ this.#grants = input.grants;
178
+ this.#privateKey = input.privateKey;
179
+ this.#activeKid = input.state.activePublicJwk.kid;
180
+ this.#refreshEnvelopeKey = deriveKey(input.refreshPepper, "refresh-envelope-v1");
181
+ this.#refreshStoreKey = deriveKey(input.refreshPepper, "refresh-store-v1");
182
+ this.#authorizationCodeKey = deriveKey(input.refreshPepper, "authorization-code-store-v1");
183
+ this.#bearerCacheKey = this.#random(32, input.randomBytes ?? nodeRandomBytes);
184
+ input.refreshPepper.fill(0);
185
+ this.#now = input.now ?? Date.now;
186
+ this.#randomBytes = input.randomBytes ?? nodeRandomBytes;
187
+ this.#failedBudget = new FailedBearerBudget(this.#now);
188
+ }
189
+ static async create(options) {
190
+ if (options.state.bindingId !== options.identity.bindingId ||
191
+ options.state.incarnationId !== options.identity.incarnationId ||
192
+ options.state.ownerRef !== options.ownerRef ||
193
+ options.state.issuer !== options.identity.issuer ||
194
+ options.state.resource !== options.identity.resource) {
195
+ throw authConfigurationError("OAUTH_STATE_RECOVERY_REQUIRED", "OAuth token service identity does not match durable state.");
196
+ }
197
+ const [privateKey, refreshPepper] = await Promise.all([
198
+ options.keyManager.loadPrivateKey(options.state),
199
+ options.keyManager.loadRefreshPepper(options.state)
200
+ ]);
201
+ return new OAuthTokenService({ ...options, privateKey, refreshPepper });
202
+ }
203
+ async exchangeAuthorizationCode(input) {
204
+ if (input.resource !== this.#identity.resource)
205
+ throw new OAuthProtocolError("invalid_target", "The OAuth resource is invalid.");
206
+ const familyHandle = `family_${this.#randomBytesExact(16).toString("hex")}`;
207
+ const grantId = `grant_${this.#randomBytesExact(16).toString("hex")}`;
208
+ const refreshToken = this.#createRefreshToken(familyHandle, 0n);
209
+ const accessToken = await this.#signAccessToken({
210
+ grantId,
211
+ clientId: input.clientId,
212
+ scopes: input.scopes,
213
+ grantRevision: 0
214
+ });
215
+ const grant = await this.#grants.create({
216
+ grantId,
217
+ clientId: input.clientId,
218
+ clientRef: clientRefForId(input.clientId),
219
+ scopes: input.scopes,
220
+ familyHandle,
221
+ refreshTokenHash: this.#refreshHash(refreshToken),
222
+ authorizationCodeHash: this.authorizationCodeHash(input.authorizationCode)
223
+ });
224
+ return await this.#tokensForGrant(grant, refreshToken, accessToken);
225
+ }
226
+ async exchangeRefreshToken(input) {
227
+ if (input.resource !== this.#identity.resource)
228
+ throw new OAuthProtocolError("invalid_target", "The OAuth resource is invalid.");
229
+ const envelope = this.#parseRefreshToken(input.refreshToken);
230
+ const current = this.#grants.getByFamily(envelope.familyHandle);
231
+ if (!current || current.clientId !== input.clientId || current.resource !== input.resource)
232
+ throw oauthInvalidGrant();
233
+ const scopes = input.scopes ?? current.scopes;
234
+ const nextToken = this.#createRefreshToken(envelope.familyHandle, envelope.generation + 1n);
235
+ const mutation = await this.#grants.rotateRefresh({
236
+ familyHandle: envelope.familyHandle,
237
+ generation: envelope.generation,
238
+ presentedTokenHash: envelope.tokenHash,
239
+ nextTokenHash: this.#refreshHash(nextToken),
240
+ clientId: input.clientId,
241
+ clientRef: clientRefForId(input.clientId),
242
+ resource: input.resource,
243
+ scopes
244
+ });
245
+ if (mutation.kind !== "rotated")
246
+ throw oauthInvalidGrant();
247
+ return await this.#tokensForGrant(mutation.grant, nextToken);
248
+ }
249
+ async verifyAccessToken(token, options = {}) {
250
+ const now = this.#now();
251
+ let header;
252
+ try {
253
+ header = this.#cheapBearerHeader(token);
254
+ }
255
+ catch (error) {
256
+ if (!this.#failedBudget.reserve())
257
+ throw new OAuthBearerCapacityError();
258
+ if (error instanceof OAuthProtocolError)
259
+ throw error;
260
+ throw accessInvalid();
261
+ }
262
+ const fingerprint = this.#tokenFingerprint(token);
263
+ this.#pruneCaches(now);
264
+ const negativeUntil = this.#negativeCache.get(fingerprint);
265
+ if (negativeUntil !== undefined && negativeUntil > now)
266
+ throw accessInvalid();
267
+ const cached = this.#positiveCache.get(fingerprint);
268
+ try {
269
+ let base;
270
+ const state = this.#currentState();
271
+ const keyRetained = header.kid === state.activePublicJwk.kid ||
272
+ state.previousPublicJwks.some((key) => key.kid === header.kid);
273
+ if (cached && cached.expiresAtMs > now && keyRetained) {
274
+ base = cached.verified;
275
+ }
276
+ else {
277
+ if (!this.#failedBudget.reserve())
278
+ throw new OAuthBearerCapacityError();
279
+ const reserved = this.#validatedFingerprints.has(fingerprint) &&
280
+ options.isEstablishedSession?.(fingerprint) === true;
281
+ try {
282
+ base = await this.#admission.run(reserved, () => this.#verifyCryptographic(token, fingerprint, header));
283
+ this.#failedBudget.refund();
284
+ }
285
+ catch (error) {
286
+ if (error instanceof OAuthBearerCapacityError)
287
+ this.#failedBudget.refund();
288
+ throw error;
289
+ }
290
+ }
291
+ const grant = await this.#grants.validateAccess({
292
+ grantId: base.grantId,
293
+ clientId: base.clientId,
294
+ ownerRef: base.ownerRef,
295
+ resource: base.resource,
296
+ grantRevision: base.grantRevision,
297
+ scopes: base.scopes
298
+ });
299
+ if (grant.familyHandle.length === 0)
300
+ throw accessInvalid();
301
+ const authInfo = {
302
+ token,
303
+ clientId: base.clientId,
304
+ scopes: [...base.scopes],
305
+ expiresAt: base.expiresAt,
306
+ resource: new URL(base.resource),
307
+ extra: {
308
+ ownerSubject: base.ownerSubject,
309
+ ownerRef: base.ownerRef,
310
+ bindingId: base.bindingId,
311
+ incarnationId: base.incarnationId,
312
+ grantId: base.grantId,
313
+ grantRevision: base.grantRevision,
314
+ tokenId: base.tokenId,
315
+ tokenFingerprint: base.fingerprint
316
+ }
317
+ };
318
+ return Object.freeze({ ...base, authInfo });
319
+ }
320
+ catch (error) {
321
+ if (error instanceof OAuthBearerCapacityError)
322
+ throw error;
323
+ this.#rememberNegative(fingerprint, now);
324
+ if (error instanceof OAuthProtocolError)
325
+ throw error;
326
+ throw accessInvalid();
327
+ }
328
+ }
329
+ async revoke(input) {
330
+ let familyHandle;
331
+ try {
332
+ familyHandle = this.#parseRefreshToken(input.token).familyHandle;
333
+ }
334
+ catch {
335
+ try {
336
+ const header = this.#cheapBearerHeader(input.token);
337
+ const verified = await this.#verifyCryptographic(input.token, this.#tokenFingerprint(input.token), header);
338
+ const grant = this.#grants.getByGrantId(verified.grantId);
339
+ if (grant && verified.clientId === input.clientId)
340
+ familyHandle = grant.familyHandle;
341
+ }
342
+ catch {
343
+ return;
344
+ }
345
+ }
346
+ if (!familyHandle)
347
+ return;
348
+ await this.#grants.revokeFamily({
349
+ familyHandle,
350
+ clientRef: clientRefForId(input.clientId),
351
+ reason: "public"
352
+ });
353
+ }
354
+ authorizationCodeHash(code) {
355
+ if (!/^[A-Za-z0-9_-]{43}$/.test(code))
356
+ throw oauthInvalidGrant();
357
+ return `hmac-sha256:${createHmac("sha256", this.#authorizationCodeKey).update(code, "utf8").digest("hex")}`;
358
+ }
359
+ refreshTokenFamily(token) {
360
+ return this.#parseRefreshToken(token).familyHandle;
361
+ }
362
+ dispose() {
363
+ this.#refreshEnvelopeKey.fill(0);
364
+ this.#refreshStoreKey.fill(0);
365
+ this.#authorizationCodeKey.fill(0);
366
+ this.#bearerCacheKey.fill(0);
367
+ this.#positiveCache.clear();
368
+ this.#negativeCache.clear();
369
+ this.#validatedFingerprints.clear();
370
+ }
371
+ async #tokensForGrant(grant, refreshToken, preSignedAccessToken) {
372
+ const accessToken = preSignedAccessToken ?? await this.#signAccessToken(grant);
373
+ return Object.freeze({
374
+ access_token: accessToken,
375
+ token_type: "Bearer",
376
+ expires_in: OAUTH_ACCESS_TOKEN_TTL_SECONDS,
377
+ refresh_token: refreshToken,
378
+ scope: grant.scopes.join(" ")
379
+ });
380
+ }
381
+ async #signAccessToken(grant) {
382
+ const current = this.#currentState();
383
+ if (current.activePublicJwk.kid !== this.#activeKid) {
384
+ throw authConfigurationError("OAUTH_STATE_RECOVERY_REQUIRED", "OAuth signing authority changed during the current token-service lifecycle.");
385
+ }
386
+ const issuedAt = Math.floor(this.#now() / 1000);
387
+ const tokenId = `token_${this.#randomBytesExact(32).toString("base64url")}`;
388
+ return await new SignJWT({
389
+ client_id: grant.clientId,
390
+ scope: grant.scopes.join(" "),
391
+ grant_id: grant.grantId,
392
+ grant_rev: grant.grantRevision
393
+ })
394
+ .setProtectedHeader({ alg: "ES256", typ: "at+jwt", kid: this.#activeKid })
395
+ .setIssuer(this.#identity.issuer)
396
+ .setAudience(this.#identity.resource)
397
+ .setSubject(this.#ownerSubject)
398
+ .setIssuedAt(issuedAt)
399
+ .setNotBefore(issuedAt)
400
+ .setExpirationTime(issuedAt + OAUTH_ACCESS_TOKEN_TTL_SECONDS)
401
+ .setJti(tokenId)
402
+ .sign(this.#privateKey);
403
+ }
404
+ async #verifyCryptographic(token, fingerprint, header = this.#cheapBearerHeader(token)) {
405
+ const state = this.#currentState();
406
+ if (header.kid !== state.activePublicJwk.kid && !state.previousPublicJwks.some((key) => key.kid === header.kid)) {
407
+ throw accessInvalid();
408
+ }
409
+ const jwks = createLocalJWKSet({ keys: [state.activePublicJwk, ...state.previousPublicJwks] });
410
+ let verified;
411
+ try {
412
+ verified = await jwtVerify(token, jwks, {
413
+ algorithms: ["ES256"],
414
+ issuer: this.#identity.issuer,
415
+ audience: this.#identity.resource,
416
+ clockTolerance: OAUTH_ACCESS_TOKEN_CLOCK_SKEW_SECONDS,
417
+ currentDate: new Date(this.#now())
418
+ });
419
+ }
420
+ catch {
421
+ throw accessInvalid();
422
+ }
423
+ if (verified.protectedHeader.alg !== "ES256" || verified.protectedHeader.typ !== "at+jwt" || verified.protectedHeader.kid !== header.kid) {
424
+ throw accessInvalid();
425
+ }
426
+ const payload = verified.payload;
427
+ const payloadKeys = Object.keys(payload).sort();
428
+ if (payloadKeys.length !== ACCESS_PAYLOAD_KEYS.length ||
429
+ payloadKeys.some((key, index) => key !== ACCESS_PAYLOAD_KEYS[index])) {
430
+ throw accessInvalid();
431
+ }
432
+ const subject = stringClaim(payload, "sub");
433
+ const clientId = stringClaim(payload, "client_id");
434
+ const tokenId = stringClaim(payload, "jti");
435
+ const grantId = stringClaim(payload, "grant_id");
436
+ const grantRevision = numericClaim(payload, "grant_rev");
437
+ const issuedAt = numericClaim(payload, "iat");
438
+ const notBefore = numericClaim(payload, "nbf");
439
+ const expiresAt = numericClaim(payload, "exp");
440
+ const scopes = parseScopes(payload.scope);
441
+ const nowSeconds = Math.floor(this.#now() / 1000);
442
+ if (payload.iss !== this.#identity.issuer ||
443
+ payload.aud !== this.#identity.resource ||
444
+ subject !== this.#ownerSubject ||
445
+ !CLIENT_ID_PATTERN.test(clientId) ||
446
+ !TOKEN_ID_PATTERN.test(tokenId) ||
447
+ !GRANT_ID_PATTERN.test(grantId) ||
448
+ notBefore !== issuedAt ||
449
+ notBefore > nowSeconds ||
450
+ issuedAt > nowSeconds + OAUTH_ACCESS_TOKEN_CLOCK_SKEW_SECONDS ||
451
+ nowSeconds - issuedAt > OAUTH_ACCESS_TOKEN_TTL_SECONDS + OAUTH_ACCESS_TOKEN_CLOCK_SKEW_SECONDS ||
452
+ expiresAt !== issuedAt + OAUTH_ACCESS_TOKEN_TTL_SECONDS ||
453
+ expiresAt <= nowSeconds - OAUTH_ACCESS_TOKEN_CLOCK_SKEW_SECONDS ||
454
+ state.bindingId !== this.#identity.bindingId ||
455
+ state.incarnationId !== this.#identity.incarnationId) {
456
+ throw accessInvalid();
457
+ }
458
+ const base = Object.freeze({
459
+ ownerSubject: subject,
460
+ ownerRef: this.#ownerRef,
461
+ clientId,
462
+ clientRef: clientRefForId(clientId),
463
+ resource: this.#identity.resource,
464
+ bindingId: this.#identity.bindingId,
465
+ incarnationId: this.#identity.incarnationId,
466
+ grantId,
467
+ grantRevision,
468
+ scopes,
469
+ tokenId,
470
+ expiresAt,
471
+ fingerprint
472
+ });
473
+ this.#rememberPositive(fingerprint, base, expiresAt * 1000);
474
+ return base;
475
+ }
476
+ #cheapBearerHeader(token) {
477
+ if (typeof token !== "string" || token.length < 32 || Buffer.byteLength(token, "utf8") > OAUTH_BEARER_MAX_BYTES ||
478
+ /[^\x21-\x7e]/.test(token)) {
479
+ throw accessInvalid();
480
+ }
481
+ const parts = token.split(".");
482
+ if (parts.length !== 3 || parts.some((part) => part.length === 0 || !BASE64URL_PATTERN.test(part)))
483
+ throw accessInvalid();
484
+ let parsed;
485
+ try {
486
+ const decoded = parts.map((part) => Buffer.from(part, "base64url"));
487
+ if (decoded.some((bytes, index) => bytes.toString("base64url") !== parts[index]))
488
+ throw new Error("non-canonical");
489
+ if (decoded[0].length < 2 || decoded[0].length > 1024)
490
+ throw new Error("header-size");
491
+ if (decoded[1].length < 2 || decoded[1].length > 4096)
492
+ throw new Error("payload-size");
493
+ if (decoded[2].length !== 64)
494
+ throw new Error("signature-size");
495
+ const rawHeader = decoded[0].toString("utf8");
496
+ const rawPayload = decoded[1].toString("utf8");
497
+ parsed = JSON.parse(rawHeader);
498
+ const parsedPayload = JSON.parse(rawPayload);
499
+ const serializedKeys = [...rawHeader.matchAll(/"([^"\\]+)"\s*:/g)].map((match) => match[1]);
500
+ if (serializedKeys.length !== 3 || new Set(serializedKeys).size !== 3)
501
+ throw new Error("header-keys");
502
+ if (!parsedPayload || Array.isArray(parsedPayload) || typeof parsedPayload !== "object")
503
+ throw new Error("payload-object");
504
+ const serializedPayloadKeys = [...rawPayload.matchAll(/"([^"\\]+)"\s*:/g)].map((match) => match[1]);
505
+ const parsedPayloadKeys = Object.keys(parsedPayload).sort();
506
+ if (serializedPayloadKeys.length !== ACCESS_PAYLOAD_KEYS.length ||
507
+ new Set(serializedPayloadKeys).size !== ACCESS_PAYLOAD_KEYS.length ||
508
+ parsedPayloadKeys.length !== ACCESS_PAYLOAD_KEYS.length ||
509
+ parsedPayloadKeys.some((key, index) => key !== ACCESS_PAYLOAD_KEYS[index])) {
510
+ throw new Error("payload-keys");
511
+ }
512
+ }
513
+ catch {
514
+ throw accessInvalid();
515
+ }
516
+ if (!parsed || Array.isArray(parsed) || typeof parsed !== "object")
517
+ throw accessInvalid();
518
+ const header = parsed;
519
+ const headerKeys = Object.keys(header).sort();
520
+ if (headerKeys.length !== 3 || headerKeys[0] !== "alg" || headerKeys[1] !== "kid" || headerKeys[2] !== "typ" ||
521
+ header.alg !== "ES256" || header.typ !== "at+jwt" || typeof header.kid !== "string" || !KID_PATTERN.test(header.kid)) {
522
+ throw accessInvalid();
523
+ }
524
+ return { kid: header.kid };
525
+ }
526
+ #createRefreshToken(familyHandle, generation) {
527
+ if (!/^family_[a-f0-9]{32}$/.test(familyHandle) || generation < 0n || generation > 0xffffffffffffffffn) {
528
+ throw authConfigurationError("OAUTH_STATE_INVALID", "OAuth refresh envelope input is invalid.");
529
+ }
530
+ const payload = Buffer.alloc(REFRESH_PAYLOAD_BYTES);
531
+ payload[0] = REFRESH_VERSION;
532
+ Buffer.from(familyHandle.slice("family_".length), "hex").copy(payload, 1);
533
+ payload.writeBigUInt64BE(generation, 17);
534
+ this.#randomBytesExact(32).copy(payload, 25);
535
+ const mac = createHmac("sha256", this.#refreshEnvelopeKey).update(payload).digest();
536
+ return Buffer.concat([payload, mac]).toString("base64url");
537
+ }
538
+ #parseRefreshToken(token) {
539
+ if (typeof token !== "string" || token.length < 1 || Buffer.byteLength(token, "utf8") > OAUTH_REFRESH_TOKEN_MAX_BYTES ||
540
+ !BASE64URL_PATTERN.test(token)) {
541
+ throw oauthInvalidGrant();
542
+ }
543
+ let decoded;
544
+ try {
545
+ decoded = Buffer.from(token, "base64url");
546
+ }
547
+ catch {
548
+ throw oauthInvalidGrant();
549
+ }
550
+ if (decoded.toString("base64url") !== token ||
551
+ decoded.length !== OAUTH_REFRESH_ENVELOPE_BYTES ||
552
+ decoded[0] !== REFRESH_VERSION) {
553
+ throw oauthInvalidGrant();
554
+ }
555
+ const payload = decoded.subarray(0, REFRESH_PAYLOAD_BYTES);
556
+ const suppliedMac = decoded.subarray(REFRESH_PAYLOAD_BYTES);
557
+ const expectedMac = createHmac("sha256", this.#refreshEnvelopeKey).update(payload).digest();
558
+ if (!fixedEqual(suppliedMac, expectedMac))
559
+ throw oauthInvalidGrant();
560
+ const familyHandle = `family_${payload.subarray(1, 17).toString("hex")}`;
561
+ const generation = payload.readBigUInt64BE(17);
562
+ return Object.freeze({ familyHandle, generation, tokenHash: this.#refreshHash(token) });
563
+ }
564
+ #refreshHash(token) {
565
+ return `hmac-sha256:${createHmac("sha256", this.#refreshStoreKey).update(token, "utf8").digest("hex")}`;
566
+ }
567
+ #tokenFingerprint(token) {
568
+ return createHmac("sha256", this.#bearerCacheKey).update(token, "utf8").digest("hex");
569
+ }
570
+ #rememberPositive(fingerprint, verified, expiresAtMs) {
571
+ const boundedExpiry = Math.min(expiresAtMs, this.#now() + OAUTH_ACCESS_TOKEN_TTL_SECONDS * 1000);
572
+ this.#positiveCache.delete(fingerprint);
573
+ this.#positiveCache.set(fingerprint, {
574
+ verified,
575
+ expiresAtMs: boundedExpiry
576
+ });
577
+ this.#validatedFingerprints.delete(fingerprint);
578
+ this.#validatedFingerprints.set(fingerprint, boundedExpiry);
579
+ while (this.#positiveCache.size > 128) {
580
+ const oldest = this.#positiveCache.keys().next().value;
581
+ if (!oldest)
582
+ break;
583
+ this.#positiveCache.delete(oldest);
584
+ }
585
+ while (this.#validatedFingerprints.size > 128) {
586
+ const oldest = this.#validatedFingerprints.keys().next().value;
587
+ if (!oldest)
588
+ break;
589
+ this.#validatedFingerprints.delete(oldest);
590
+ }
591
+ }
592
+ #rememberNegative(fingerprint, now) {
593
+ this.#negativeCache.delete(fingerprint);
594
+ this.#negativeCache.set(fingerprint, now + 60_000);
595
+ while (this.#negativeCache.size > 256) {
596
+ const oldest = this.#negativeCache.keys().next().value;
597
+ if (!oldest)
598
+ break;
599
+ this.#negativeCache.delete(oldest);
600
+ }
601
+ }
602
+ #pruneCaches(now) {
603
+ for (const [key, value] of this.#positiveCache)
604
+ if (value.expiresAtMs <= now)
605
+ this.#positiveCache.delete(key);
606
+ for (const [key, until] of this.#negativeCache)
607
+ if (until <= now)
608
+ this.#negativeCache.delete(key);
609
+ for (const [key, until] of this.#validatedFingerprints)
610
+ if (until <= now)
611
+ this.#validatedFingerprints.delete(key);
612
+ }
613
+ #currentState() {
614
+ const state = this.#store.readDeployment(this.#identity.bindingId, this.#identity.incarnationId);
615
+ if (state.bindingId !== this.#identity.bindingId || state.incarnationId !== this.#identity.incarnationId) {
616
+ throw authConfigurationError("OAUTH_STATE_RECOVERY_REQUIRED", "OAuth token state identity changed.");
617
+ }
618
+ return state;
619
+ }
620
+ #randomBytesExact(size) {
621
+ return this.#random(size, this.#randomBytes);
622
+ }
623
+ #random(size, source) {
624
+ const value = source(size);
625
+ if (!Buffer.isBuffer(value) || value.length !== size) {
626
+ throw authConfigurationError("OAUTH_STATE_INVALID", "OAuth token random source is invalid.");
627
+ }
628
+ return value;
629
+ }
630
+ }
631
+ //# sourceMappingURL=tokenService.js.map