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,738 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.Diagnostics;
4
+ using System.IO;
5
+ using System.Runtime.InteropServices;
6
+ using System.Security.AccessControl;
7
+ using System.Security.Cryptography;
8
+ using System.Security.Principal;
9
+ using System.Text;
10
+ using System.Web.Script.Serialization;
11
+ using Microsoft.Win32.SafeHandles;
12
+
13
+ namespace CodexGPT.Phase4
14
+ {
15
+ public static class LocalControlSpike
16
+ {
17
+ private const uint PIPE_ACCESS_DUPLEX = 0x00000003;
18
+ private const uint FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000;
19
+ private const uint PIPE_TYPE_MESSAGE = 0x00000004;
20
+ private const uint PIPE_READMODE_MESSAGE = 0x00000002;
21
+ private const uint PIPE_WAIT = 0x00000000;
22
+ private const uint PIPE_REJECT_REMOTE_CLIENTS = 0x00000008;
23
+ private const uint PIPE_UNLIMITED_INSTANCES = 255;
24
+ private const uint ERROR_MORE_DATA = 234;
25
+ private const uint ERROR_PIPE_CONNECTED = 535;
26
+ private const uint TOKEN_QUERY = 0x0008;
27
+ private const uint PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
28
+ private const int TokenUser = 1;
29
+ private const int TokenIntegrityLevel = 25;
30
+ private const int TokenIsAppContainer = 29;
31
+ private const int SECURITY_MANDATORY_MEDIUM_RID = 0x2000;
32
+ private const int MAX_MESSAGE_BYTES = 65536;
33
+ private const uint OWNER_SECURITY_INFORMATION = 0x00000001;
34
+ private const uint GROUP_SECURITY_INFORMATION = 0x00000002;
35
+ private const uint DACL_SECURITY_INFORMATION = 0x00000004;
36
+ private const uint SACL_SECURITY_INFORMATION = 0x00000008;
37
+ private const uint LABEL_SECURITY_INFORMATION = 0x00000010;
38
+
39
+ [StructLayout(LayoutKind.Sequential)]
40
+ private struct SECURITY_ATTRIBUTES
41
+ {
42
+ public int nLength;
43
+ public IntPtr lpSecurityDescriptor;
44
+ [MarshalAs(UnmanagedType.Bool)] public bool bInheritHandle;
45
+ }
46
+
47
+ [StructLayout(LayoutKind.Sequential)]
48
+ private struct SID_AND_ATTRIBUTES
49
+ {
50
+ public IntPtr Sid;
51
+ public uint Attributes;
52
+ }
53
+
54
+ [StructLayout(LayoutKind.Sequential)]
55
+ private struct TOKEN_USER_STRUCT
56
+ {
57
+ public SID_AND_ATTRIBUTES User;
58
+ }
59
+
60
+ [StructLayout(LayoutKind.Sequential)]
61
+ private struct TOKEN_MANDATORY_LABEL_STRUCT
62
+ {
63
+ public SID_AND_ATTRIBUTES Label;
64
+ }
65
+
66
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
67
+ private static extern SafeFileHandle CreateNamedPipeW(
68
+ string lpName,
69
+ uint dwOpenMode,
70
+ uint dwPipeMode,
71
+ uint nMaxInstances,
72
+ uint nOutBufferSize,
73
+ uint nInBufferSize,
74
+ uint nDefaultTimeOut,
75
+ ref SECURITY_ATTRIBUTES lpSecurityAttributes);
76
+
77
+ [DllImport("kernel32.dll", SetLastError = true)]
78
+ [return: MarshalAs(UnmanagedType.Bool)]
79
+ private static extern bool ConnectNamedPipe(SafeFileHandle hNamedPipe, IntPtr lpOverlapped);
80
+
81
+ [DllImport("kernel32.dll", SetLastError = true)]
82
+ [return: MarshalAs(UnmanagedType.Bool)]
83
+ private static extern bool DisconnectNamedPipe(SafeFileHandle hNamedPipe);
84
+
85
+ [DllImport("kernel32.dll", SetLastError = true)]
86
+ [return: MarshalAs(UnmanagedType.Bool)]
87
+ private static extern bool FlushFileBuffers(SafeFileHandle hFile);
88
+
89
+ [DllImport("kernel32.dll", SetLastError = true)]
90
+ [return: MarshalAs(UnmanagedType.Bool)]
91
+ private static extern bool ReadFile(SafeFileHandle hFile, byte[] buffer, uint bytesToRead, out uint bytesRead, IntPtr overlapped);
92
+
93
+ [DllImport("kernel32.dll", SetLastError = true)]
94
+ [return: MarshalAs(UnmanagedType.Bool)]
95
+ private static extern bool WriteFile(SafeFileHandle hFile, byte[] buffer, uint bytesToWrite, out uint bytesWritten, IntPtr overlapped);
96
+
97
+ [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
98
+ [return: MarshalAs(UnmanagedType.Bool)]
99
+ private static extern bool ConvertStringSecurityDescriptorToSecurityDescriptorW(
100
+ string stringSecurityDescriptor,
101
+ uint stringSDRevision,
102
+ out IntPtr securityDescriptor,
103
+ out uint securityDescriptorSize);
104
+
105
+ [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
106
+ [return: MarshalAs(UnmanagedType.Bool)]
107
+ private static extern bool ConvertSecurityDescriptorToStringSecurityDescriptorW(
108
+ IntPtr securityDescriptor,
109
+ uint requestedStringSDRevision,
110
+ uint securityInformation,
111
+ out IntPtr stringSecurityDescriptor,
112
+ out uint stringSecurityDescriptorLength);
113
+
114
+ [DllImport("kernel32.dll")]
115
+ private static extern IntPtr LocalFree(IntPtr memory);
116
+
117
+ [DllImport("advapi32.dll", SetLastError = true)]
118
+ [return: MarshalAs(UnmanagedType.Bool)]
119
+ private static extern bool GetKernelObjectSecurity(
120
+ SafeFileHandle handle,
121
+ uint requestedInformation,
122
+ byte[] securityDescriptor,
123
+ uint length,
124
+ out uint lengthNeeded);
125
+
126
+ [DllImport("advapi32.dll", SetLastError = true)]
127
+ [return: MarshalAs(UnmanagedType.Bool)]
128
+ private static extern bool SetKernelObjectSecurity(
129
+ SafeFileHandle handle,
130
+ uint securityInformation,
131
+ IntPtr securityDescriptor);
132
+
133
+ [DllImport("advapi32.dll", SetLastError = true)]
134
+ [return: MarshalAs(UnmanagedType.Bool)]
135
+ private static extern bool ImpersonateNamedPipeClient(SafeFileHandle namedPipeHandle);
136
+
137
+ [DllImport("advapi32.dll", SetLastError = true)]
138
+ [return: MarshalAs(UnmanagedType.Bool)]
139
+ private static extern bool RevertToSelf();
140
+
141
+ [DllImport("advapi32.dll", SetLastError = true)]
142
+ [return: MarshalAs(UnmanagedType.Bool)]
143
+ private static extern bool OpenThreadToken(IntPtr threadHandle, uint desiredAccess, bool openAsSelf, out SafeFileHandle tokenHandle);
144
+
145
+ [DllImport("kernel32.dll")]
146
+ private static extern IntPtr GetCurrentThread();
147
+
148
+ [DllImport("advapi32.dll", SetLastError = true)]
149
+ [return: MarshalAs(UnmanagedType.Bool)]
150
+ private static extern bool GetTokenInformation(
151
+ SafeFileHandle tokenHandle,
152
+ int tokenInformationClass,
153
+ IntPtr tokenInformation,
154
+ int tokenInformationLength,
155
+ out int returnLength);
156
+
157
+ [DllImport("advapi32.dll", SetLastError = true)]
158
+ private static extern IntPtr GetSidSubAuthorityCount(IntPtr sid);
159
+
160
+ [DllImport("advapi32.dll", SetLastError = true)]
161
+ private static extern IntPtr GetSidSubAuthority(IntPtr sid, uint subAuthority);
162
+
163
+ [DllImport("kernel32.dll", SetLastError = true)]
164
+ [return: MarshalAs(UnmanagedType.Bool)]
165
+ private static extern bool GetNamedPipeClientProcessId(SafeFileHandle pipe, out uint clientProcessId);
166
+
167
+ [DllImport("kernel32.dll", SetLastError = true)]
168
+ private static extern SafeFileHandle OpenProcess(uint desiredAccess, bool inheritHandle, uint processId);
169
+
170
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
171
+ private static extern SafeFileHandle CreateJobObjectW(IntPtr jobAttributes, string name);
172
+
173
+ [DllImport("kernel32.dll", SetLastError = true)]
174
+ [return: MarshalAs(UnmanagedType.Bool)]
175
+ private static extern bool IsProcessInJob(SafeFileHandle processHandle, IntPtr jobHandle, out bool result);
176
+
177
+ private sealed class Bootstrap
178
+ {
179
+ public int schemaVersion { get; set; }
180
+ public string serverId { get; set; }
181
+ public string nonce { get; set; }
182
+ public string bootstrapKey { get; set; }
183
+ public string stateRoot { get; set; }
184
+ }
185
+
186
+ private sealed class ClientEvidence
187
+ {
188
+ public uint clientPid { get; set; }
189
+ public string userSid { get; set; }
190
+ public int integrityRid { get; set; }
191
+ public bool isAppContainer { get; set; }
192
+ public bool inAnyJob { get; set; }
193
+ public bool inOwnedJob { get; set; }
194
+ public string ownedJobCheck { get; set; }
195
+ public bool accepted { get; set; }
196
+ public string rejectionCode { get; set; }
197
+ }
198
+
199
+ private sealed class DescriptorEvidence
200
+ {
201
+ public string ownerDaclSddl { get; set; }
202
+ public int systemAclRevision { get; set; }
203
+ public int systemAclAceCount { get; set; }
204
+ public int mandatoryLabelAceCount { get; set; }
205
+ public string mandatoryLabelSid { get; set; }
206
+ public uint mandatoryPolicyMask { get; set; }
207
+ public bool mediumNoWriteUp { get; set; }
208
+ }
209
+
210
+ private static readonly JavaScriptSerializer Json = new JavaScriptSerializer { MaxJsonLength = MAX_MESSAGE_BYTES, RecursionLimit = 16 };
211
+
212
+ public static void Run()
213
+ {
214
+ Bootstrap bootstrap = ReadBootstrap();
215
+ ValidateBootstrap(bootstrap);
216
+ byte[] key = Convert.FromBase64String(bootstrap.bootstrapKey);
217
+ if (key.Length != 32) Fail("LOCAL_CONTROL_KEY_INVALID");
218
+ string currentSid = WindowsIdentity.GetCurrent().User.Value;
219
+ string pipeName = "codexgpt-control-" + bootstrap.serverId;
220
+ string pipePath = "\\\\.\\pipe\\" + pipeName;
221
+ string ownedJobName = "Local\\codexgpt-control-owned-" + bootstrap.serverId;
222
+ string stateRoot = Path.GetFullPath(bootstrap.stateRoot);
223
+ string statePath = Path.Combine(stateRoot, bootstrap.serverId + ".json");
224
+ PrepareStateRoot(stateRoot, currentSid);
225
+
226
+ IntPtr descriptor = IntPtr.Zero;
227
+ SafeFileHandle pipe = null;
228
+ SafeFileHandle ownedJob = null;
229
+ try
230
+ {
231
+ ownedJob = CreateJobObjectW(IntPtr.Zero, ownedJobName);
232
+ if (ownedJob == null || ownedJob.IsInvalid) Win32Fail("LOCAL_CONTROL_OWNED_JOB_CREATE_FAILED");
233
+ string requestedPipeSddl = "O:" + currentSid + "G:" + currentSid + "D:P(A;;GA;;;SY)(A;;GA;;;" + currentSid + ")S:(ML;;NW;;;ME)";
234
+ uint descriptorSize;
235
+ if (!ConvertStringSecurityDescriptorToSecurityDescriptorW(requestedPipeSddl, 1, out descriptor, out descriptorSize)) Win32Fail("LOCAL_CONTROL_DESCRIPTOR_CREATE_FAILED");
236
+ SECURITY_ATTRIBUTES securityAttributes = new SECURITY_ATTRIBUTES();
237
+ securityAttributes.nLength = Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES));
238
+ securityAttributes.lpSecurityDescriptor = descriptor;
239
+ securityAttributes.bInheritHandle = false;
240
+ pipe = CreateNamedPipeW(
241
+ pipePath,
242
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
243
+ PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT | PIPE_REJECT_REMOTE_CLIENTS,
244
+ PIPE_UNLIMITED_INSTANCES,
245
+ MAX_MESSAGE_BYTES,
246
+ MAX_MESSAGE_BYTES,
247
+ 5000,
248
+ ref securityAttributes);
249
+ if (pipe == null || pipe.IsInvalid) Win32Fail("LOCAL_CONTROL_PIPE_CREATE_FAILED");
250
+ if (!SetKernelObjectSecurity(pipe, LABEL_SECURITY_INFORMATION, descriptor)) Win32Fail("LOCAL_CONTROL_LABEL_SET_FAILED");
251
+
252
+ DescriptorEvidence actualPipeDescriptor = ReadKernelObjectDescriptor(pipe);
253
+ string stateRootSddl = Directory.GetAccessControl(stateRoot, AccessControlSections.Owner | AccessControlSections.Access).GetSecurityDescriptorSddlForm(AccessControlSections.Owner | AccessControlSections.Access);
254
+ string processCreationTime = Process.GetCurrentProcess().StartTime.ToUniversalTime().ToString("O");
255
+ Dictionary<string, object> state = new Dictionary<string, object>();
256
+ state["schemaVersion"] = 1;
257
+ state["serverId"] = bootstrap.serverId;
258
+ state["nonce"] = bootstrap.nonce;
259
+ state["keyDigest"] = Hex(SHA256.Create().ComputeHash(key));
260
+ state["pid"] = Process.GetCurrentProcess().Id;
261
+ state["processCreationTime"] = processCreationTime;
262
+ state["pipePath"] = pipePath;
263
+ state["ownedJobName"] = ownedJobName;
264
+ state["pipeOwnerSid"] = currentSid;
265
+ state["pipeSddl"] = actualPipeDescriptor.ownerDaclSddl;
266
+ state["pipeDescriptor"] = actualPipeDescriptor;
267
+ state["stateRootSddl"] = stateRootSddl;
268
+ state["pipeRejectRemoteClients"] = true;
269
+ WriteStateFile(statePath, Json.Serialize(state), currentSid);
270
+ string stateFileSddl = File.GetAccessControl(statePath, AccessControlSections.Owner | AccessControlSections.Access).GetSecurityDescriptorSddlForm(AccessControlSections.Owner | AccessControlSections.Access);
271
+
272
+ Dictionary<string, object> ready = new Dictionary<string, object>();
273
+ ready["schemaVersion"] = 1;
274
+ ready["code"] = "CONTROL_READY";
275
+ ready["serverId"] = bootstrap.serverId;
276
+ ready["nonce"] = bootstrap.nonce;
277
+ ready["pid"] = Process.GetCurrentProcess().Id;
278
+ ready["processCreationTime"] = processCreationTime;
279
+ ready["pipePath"] = pipePath;
280
+ ready["ownedJobName"] = ownedJobName;
281
+ ready["pipeSddl"] = actualPipeDescriptor.ownerDaclSddl;
282
+ ready["pipeDescriptor"] = actualPipeDescriptor;
283
+ ready["stateRootSddl"] = stateRootSddl;
284
+ ready["stateFileSddl"] = stateFileSddl;
285
+ ready["pipeRejectRemoteClients"] = true;
286
+ Console.Out.WriteLine(Json.Serialize(ready));
287
+ Console.Out.Flush();
288
+
289
+ bool stop = false;
290
+ while (!stop)
291
+ {
292
+ bool connected = ConnectNamedPipe(pipe, IntPtr.Zero);
293
+ if (!connected && Marshal.GetLastWin32Error() != ERROR_PIPE_CONNECTED) Win32Fail("LOCAL_CONTROL_CONNECT_FAILED");
294
+ try
295
+ {
296
+ byte[] requestHeader = ReadExact(pipe, 4);
297
+ ClientEvidence evidence = InspectClient(pipe, currentSid, ownedJob);
298
+ if (!evidence.accepted) throw new InvalidOperationException(evidence.rejectionCode);
299
+ Dictionary<string, object> request = ReadMessage(pipe, requestHeader);
300
+ Dictionary<string, object> response = HandleRequest(request, evidence, bootstrap, key, actualPipeDescriptor, stateRootSddl, stateFileSddl);
301
+ WriteMessage(pipe, response);
302
+ object operation;
303
+ stop = response.ContainsKey("ok") && (bool)response["ok"] && request.TryGetValue("operation", out operation) && Convert.ToString(operation) == "shutdown";
304
+ FlushFileBuffers(pipe);
305
+ }
306
+ catch (Exception error)
307
+ {
308
+ Dictionary<string, object> response = new Dictionary<string, object>();
309
+ response["schemaVersion"] = 1;
310
+ response["ok"] = false;
311
+ response["code"] = SafeCode(error.Message);
312
+ try
313
+ {
314
+ WriteMessage(pipe, response);
315
+ FlushFileBuffers(pipe);
316
+ }
317
+ catch { }
318
+ }
319
+ finally
320
+ {
321
+ DisconnectNamedPipe(pipe);
322
+ }
323
+ }
324
+ }
325
+ finally
326
+ {
327
+ if (pipe != null) pipe.Dispose();
328
+ if (ownedJob != null) ownedJob.Dispose();
329
+ if (descriptor != IntPtr.Zero) LocalFree(descriptor);
330
+ TryDelete(statePath);
331
+ TryDeleteDirectory(stateRoot);
332
+ Array.Clear(key, 0, key.Length);
333
+ }
334
+ }
335
+
336
+ private static Bootstrap ReadBootstrap()
337
+ {
338
+ string line = Console.In.ReadLine();
339
+ if (String.IsNullOrWhiteSpace(line) || line.Length > MAX_MESSAGE_BYTES) Fail("LOCAL_CONTROL_BOOTSTRAP_INVALID");
340
+ Bootstrap value = Json.Deserialize<Bootstrap>(line);
341
+ if (value == null) Fail("LOCAL_CONTROL_BOOTSTRAP_INVALID");
342
+ return value;
343
+ }
344
+
345
+ private static void ValidateBootstrap(Bootstrap value)
346
+ {
347
+ if (value.schemaVersion != 1 || !IsHex(value.serverId, 32) || !IsHex(value.nonce, 64) || String.IsNullOrWhiteSpace(value.bootstrapKey) || String.IsNullOrWhiteSpace(value.stateRoot)) Fail("LOCAL_CONTROL_BOOTSTRAP_INVALID");
348
+ }
349
+
350
+ private static void PrepareStateRoot(string root, string sidText)
351
+ {
352
+ Directory.CreateDirectory(root);
353
+ SecurityIdentifier sid = new SecurityIdentifier(sidText);
354
+ SecurityIdentifier system = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);
355
+ DirectorySecurity security = new DirectorySecurity();
356
+ security.SetOwner(sid);
357
+ security.SetAccessRuleProtection(true, false);
358
+ InheritanceFlags inheritance = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
359
+ security.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.FullControl, inheritance, PropagationFlags.None, AccessControlType.Allow));
360
+ security.AddAccessRule(new FileSystemAccessRule(system, FileSystemRights.FullControl, inheritance, PropagationFlags.None, AccessControlType.Allow));
361
+ Directory.SetAccessControl(root, security);
362
+ }
363
+
364
+ private static void WriteStateFile(string file, string content, string sidText)
365
+ {
366
+ byte[] bytes = new UTF8Encoding(false).GetBytes(content + "\n");
367
+ using (FileStream stream = new FileStream(file, FileMode.CreateNew, FileAccess.Write, FileShare.Read, 4096, FileOptions.WriteThrough))
368
+ {
369
+ stream.Write(bytes, 0, bytes.Length);
370
+ stream.Flush(true);
371
+ }
372
+ SecurityIdentifier sid = new SecurityIdentifier(sidText);
373
+ SecurityIdentifier system = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);
374
+ FileSecurity security = new FileSecurity();
375
+ security.SetOwner(sid);
376
+ security.SetAccessRuleProtection(true, false);
377
+ security.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.FullControl, AccessControlType.Allow));
378
+ security.AddAccessRule(new FileSystemAccessRule(system, FileSystemRights.FullControl, AccessControlType.Allow));
379
+ File.SetAccessControl(file, security);
380
+ }
381
+
382
+ private static string ConvertDescriptorToSddl(IntPtr descriptor, uint info)
383
+ {
384
+ IntPtr text = IntPtr.Zero;
385
+ uint length;
386
+ if (!ConvertSecurityDescriptorToStringSecurityDescriptorW(descriptor, 1, info, out text, out length)) Win32Fail("LOCAL_CONTROL_DESCRIPTOR_STRING_FAILED");
387
+ try
388
+ {
389
+ return Marshal.PtrToStringUni(text) ?? String.Empty;
390
+ }
391
+ finally
392
+ {
393
+ if (text != IntPtr.Zero) LocalFree(text);
394
+ }
395
+ }
396
+
397
+ private static DescriptorEvidence ReadKernelObjectDescriptor(SafeFileHandle handle)
398
+ {
399
+ uint basicInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
400
+ byte[] basicBytes = ReadKernelObjectSecurityBytes(handle, basicInfo);
401
+ byte[] labelBytes = ReadKernelObjectSecurityBytes(handle, LABEL_SECURITY_INFORMATION);
402
+ IntPtr descriptor = Marshal.AllocHGlobal(basicBytes.Length);
403
+ try
404
+ {
405
+ Marshal.Copy(basicBytes, 0, descriptor, basicBytes.Length);
406
+ DescriptorEvidence evidence = new DescriptorEvidence();
407
+ evidence.ownerDaclSddl = ConvertDescriptorToSddl(descriptor, basicInfo);
408
+ ParseMandatoryLabel(labelBytes, evidence);
409
+ return evidence;
410
+ }
411
+ finally
412
+ {
413
+ Marshal.FreeHGlobal(descriptor);
414
+ }
415
+ }
416
+
417
+ private static byte[] ReadKernelObjectSecurityBytes(SafeFileHandle handle, uint information)
418
+ {
419
+ uint needed;
420
+ GetKernelObjectSecurity(handle, information, null, 0, out needed);
421
+ if (needed == 0) Win32Fail("LOCAL_CONTROL_DESCRIPTOR_READ_FAILED");
422
+ byte[] bytes = new byte[needed];
423
+ if (!GetKernelObjectSecurity(handle, information, bytes, needed, out needed)) Win32Fail("LOCAL_CONTROL_DESCRIPTOR_READ_FAILED");
424
+ return bytes;
425
+ }
426
+
427
+ private static void ParseMandatoryLabel(byte[] descriptor, DescriptorEvidence evidence)
428
+ {
429
+ if (descriptor.Length < 20) Fail("LOCAL_CONTROL_DESCRIPTOR_INVALID");
430
+ int saclOffset = checked((int)BitConverter.ToUInt32(descriptor, 12));
431
+ if (saclOffset == 0) return;
432
+ if (saclOffset < 0 || saclOffset + 8 > descriptor.Length) Fail("LOCAL_CONTROL_DESCRIPTOR_INVALID");
433
+ evidence.systemAclRevision = descriptor[saclOffset];
434
+ int aclSize = BitConverter.ToUInt16(descriptor, saclOffset + 2);
435
+ evidence.systemAclAceCount = BitConverter.ToUInt16(descriptor, saclOffset + 4);
436
+ if (aclSize < 8 || saclOffset + aclSize > descriptor.Length) Fail("LOCAL_CONTROL_DESCRIPTOR_INVALID");
437
+ int cursor = saclOffset + 8;
438
+ for (int index = 0; index < evidence.systemAclAceCount; index++)
439
+ {
440
+ if (cursor + 4 > saclOffset + aclSize) Fail("LOCAL_CONTROL_DESCRIPTOR_INVALID");
441
+ byte aceType = descriptor[cursor];
442
+ int aceSize = BitConverter.ToUInt16(descriptor, cursor + 2);
443
+ if (aceSize < 4 || cursor + aceSize > saclOffset + aclSize) Fail("LOCAL_CONTROL_DESCRIPTOR_INVALID");
444
+ if (aceType == 0x11)
445
+ {
446
+ if (aceSize < 16) Fail("LOCAL_CONTROL_DESCRIPTOR_INVALID");
447
+ evidence.mandatoryLabelAceCount += 1;
448
+ evidence.mandatoryPolicyMask = BitConverter.ToUInt32(descriptor, cursor + 4);
449
+ GCHandle pinned = GCHandle.Alloc(descriptor, GCHandleType.Pinned);
450
+ try
451
+ {
452
+ IntPtr sidPointer = IntPtr.Add(pinned.AddrOfPinnedObject(), cursor + 8);
453
+ evidence.mandatoryLabelSid = new SecurityIdentifier(sidPointer).Value;
454
+ }
455
+ finally
456
+ {
457
+ pinned.Free();
458
+ }
459
+ }
460
+ cursor += aceSize;
461
+ }
462
+ evidence.mediumNoWriteUp = evidence.mandatoryLabelAceCount == 1 && evidence.mandatoryLabelSid == "S-1-16-8192" && (evidence.mandatoryPolicyMask & 0x1) == 0x1;
463
+ }
464
+
465
+ private static ClientEvidence InspectClient(SafeFileHandle pipe, string expectedSid, SafeFileHandle ownedJob)
466
+ {
467
+ ClientEvidence evidence = new ClientEvidence();
468
+ uint clientPid;
469
+ if (!GetNamedPipeClientProcessId(pipe, out clientPid)) Win32Fail("LOCAL_CONTROL_CLIENT_PID_UNAVAILABLE");
470
+ evidence.clientPid = clientPid;
471
+ SafeFileHandle process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, clientPid);
472
+ if (process == null || process.IsInvalid) Win32Fail("LOCAL_CONTROL_CLIENT_PROCESS_UNAVAILABLE");
473
+ using (process)
474
+ {
475
+ bool inJob;
476
+ if (!IsProcessInJob(process, IntPtr.Zero, out inJob)) Win32Fail("LOCAL_CONTROL_ANY_JOB_CHECK_FAILED");
477
+ evidence.inAnyJob = inJob;
478
+ bool inOwnedJob;
479
+ if (!IsProcessInJob(process, ownedJob.DangerousGetHandle(), out inOwnedJob)) Win32Fail("LOCAL_CONTROL_OWNED_JOB_CHECK_FAILED");
480
+ evidence.inOwnedJob = inOwnedJob;
481
+ evidence.ownedJobCheck = inOwnedJob ? "member" : "not_member";
482
+ }
483
+ if (!ImpersonateNamedPipeClient(pipe)) Win32Fail("LOCAL_CONTROL_IMPERSONATION_FAILED");
484
+ try
485
+ {
486
+ SafeFileHandle token;
487
+ if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, true, out token)) Win32Fail("LOCAL_CONTROL_CLIENT_TOKEN_FAILED");
488
+ using (token)
489
+ {
490
+ evidence.userSid = ReadTokenUserSid(token);
491
+ evidence.integrityRid = ReadIntegrityRid(token);
492
+ evidence.isAppContainer = ReadTokenInt(token, TokenIsAppContainer) != 0;
493
+ }
494
+ }
495
+ finally
496
+ {
497
+ RevertToSelf();
498
+ }
499
+ if (evidence.inOwnedJob) evidence.rejectionCode = "CONTROL_OWNED_JOB_CLIENT";
500
+ else if (!String.Equals(evidence.userSid, expectedSid, StringComparison.OrdinalIgnoreCase)) evidence.rejectionCode = "CONTROL_WRONG_USER";
501
+ else if (evidence.integrityRid < SECURITY_MANDATORY_MEDIUM_RID) evidence.rejectionCode = "CONTROL_LOW_INTEGRITY";
502
+ else if (evidence.isAppContainer) evidence.rejectionCode = "CONTROL_APPCONTAINER_REJECTED";
503
+ evidence.accepted = evidence.rejectionCode == null;
504
+ return evidence;
505
+ }
506
+
507
+ private static string ReadTokenUserSid(SafeFileHandle token)
508
+ {
509
+ IntPtr buffer = ReadTokenBuffer(token, TokenUser);
510
+ try
511
+ {
512
+ TOKEN_USER_STRUCT value = (TOKEN_USER_STRUCT)Marshal.PtrToStructure(buffer, typeof(TOKEN_USER_STRUCT));
513
+ return new SecurityIdentifier(value.User.Sid).Value;
514
+ }
515
+ finally { Marshal.FreeHGlobal(buffer); }
516
+ }
517
+
518
+ private static int ReadIntegrityRid(SafeFileHandle token)
519
+ {
520
+ IntPtr buffer = ReadTokenBuffer(token, TokenIntegrityLevel);
521
+ try
522
+ {
523
+ TOKEN_MANDATORY_LABEL_STRUCT value = (TOKEN_MANDATORY_LABEL_STRUCT)Marshal.PtrToStructure(buffer, typeof(TOKEN_MANDATORY_LABEL_STRUCT));
524
+ byte count = Marshal.ReadByte(GetSidSubAuthorityCount(value.Label.Sid));
525
+ return Marshal.ReadInt32(GetSidSubAuthority(value.Label.Sid, (uint)(count - 1)));
526
+ }
527
+ finally { Marshal.FreeHGlobal(buffer); }
528
+ }
529
+
530
+ private static int ReadTokenInt(SafeFileHandle token, int informationClass)
531
+ {
532
+ IntPtr buffer = ReadTokenBuffer(token, informationClass);
533
+ try { return Marshal.ReadInt32(buffer); }
534
+ finally { Marshal.FreeHGlobal(buffer); }
535
+ }
536
+
537
+ private static IntPtr ReadTokenBuffer(SafeFileHandle token, int informationClass)
538
+ {
539
+ int needed;
540
+ GetTokenInformation(token, informationClass, IntPtr.Zero, 0, out needed);
541
+ if (needed <= 0) Win32Fail("LOCAL_CONTROL_TOKEN_INFO_FAILED");
542
+ IntPtr buffer = Marshal.AllocHGlobal(needed);
543
+ if (!GetTokenInformation(token, informationClass, buffer, needed, out needed))
544
+ {
545
+ Marshal.FreeHGlobal(buffer);
546
+ Win32Fail("LOCAL_CONTROL_TOKEN_INFO_FAILED");
547
+ }
548
+ return buffer;
549
+ }
550
+
551
+ private static Dictionary<string, object> HandleRequest(Dictionary<string, object> request, ClientEvidence evidence, Bootstrap bootstrap, byte[] key, DescriptorEvidence pipeDescriptor, string rootSddl, string fileSddl)
552
+ {
553
+ if (!evidence.accepted) throw new InvalidOperationException(evidence.rejectionCode);
554
+ string requestId = RequireString(request, "requestId", 32, true);
555
+ object schemaRaw;
556
+ if (!request.TryGetValue("schemaVersion", out schemaRaw) || Convert.ToInt32(schemaRaw) != 1) Fail("CONTROL_REQUEST_INVALID");
557
+ if (!String.Equals(RequireString(request, "serverId", 32, true), bootstrap.serverId, StringComparison.Ordinal)) Fail("CONTROL_SERVER_MISMATCH");
558
+ if (!String.Equals(RequireString(request, "nonce", 64, true), bootstrap.nonce, StringComparison.Ordinal)) Fail("CONTROL_NONCE_MISMATCH");
559
+ string operation = RequireString(request, "operation", 64, false);
560
+ if (operation == "bootstrap")
561
+ {
562
+ Dictionary<string, object> bootstrapResponse = new Dictionary<string, object>();
563
+ bootstrapResponse["schemaVersion"] = 1;
564
+ bootstrapResponse["ok"] = true;
565
+ bootstrapResponse["code"] = "CONTROL_BOOTSTRAP";
566
+ bootstrapResponse["serverId"] = bootstrap.serverId;
567
+ bootstrapResponse["nonce"] = bootstrap.nonce;
568
+ bootstrapResponse["bootstrapKey"] = Convert.ToBase64String(key);
569
+ bootstrapResponse["bootstrapKeyTransport"] = "private_local_pipe";
570
+ return bootstrapResponse;
571
+ }
572
+ byte[] supplied;
573
+ try { supplied = Convert.FromBase64String(RequireString(request, "bootstrapKey", 128, false)); }
574
+ catch { Fail("CONTROL_KEY_MISMATCH"); return null; }
575
+ if (!FixedEquals(key, supplied)) Fail("CONTROL_KEY_MISMATCH");
576
+ if (operation == "dispatch") return ForwardToParent(request, requestId, bootstrap.serverId);
577
+ if (operation != "ping" && operation != "describe" && operation != "shutdown") Fail("CONTROL_OPERATION_UNKNOWN");
578
+ Dictionary<string, object> response = new Dictionary<string, object>();
579
+ response["schemaVersion"] = 1;
580
+ response["ok"] = true;
581
+ response["code"] = operation == "shutdown" ? "CONTROL_SHUTDOWN" : "CONTROL_OK";
582
+ response["serverId"] = bootstrap.serverId;
583
+ response["nonce"] = bootstrap.nonce;
584
+ response["client"] = evidence;
585
+ if (operation == "describe")
586
+ {
587
+ response["pipeSddl"] = pipeDescriptor.ownerDaclSddl;
588
+ response["pipeDescriptor"] = pipeDescriptor;
589
+ response["stateRootSddl"] = rootSddl;
590
+ response["stateFileSddl"] = fileSddl;
591
+ response["pipeRejectRemoteClients"] = true;
592
+ response["bootstrapKeyTransport"] = "private_parent_stdin";
593
+ }
594
+ return response;
595
+ }
596
+
597
+ private static Dictionary<string, object> ForwardToParent(Dictionary<string, object> request, string requestId, string serverId)
598
+ {
599
+ object input;
600
+ if (!request.TryGetValue("input", out input) || !(input is Dictionary<string, object>)) Fail("CONTROL_REQUEST_INVALID");
601
+ Dictionary<string, object> forwarded = new Dictionary<string, object>();
602
+ forwarded["schemaVersion"] = 1;
603
+ forwarded["code"] = "CONTROL_DISPATCH";
604
+ forwarded["requestId"] = requestId;
605
+ forwarded["serverId"] = serverId;
606
+ forwarded["request"] = input;
607
+ string serialized = Json.Serialize(forwarded);
608
+ if (new UTF8Encoding(false).GetByteCount(serialized) > MAX_MESSAGE_BYTES) Fail("CONTROL_REQUEST_TOO_LARGE");
609
+ Console.Out.WriteLine(serialized);
610
+ Console.Out.Flush();
611
+
612
+ string line = Console.In.ReadLine();
613
+ if (String.IsNullOrWhiteSpace(line) || new UTF8Encoding(false).GetByteCount(line) > MAX_MESSAGE_BYTES) Fail("CONTROL_PARENT_RESPONSE_INVALID");
614
+ Dictionary<string, object> parent = Json.Deserialize<Dictionary<string, object>>(line);
615
+ object schemaRaw;
616
+ if (parent == null || !parent.TryGetValue("schemaVersion", out schemaRaw) || Convert.ToInt32(schemaRaw) != 1) Fail("CONTROL_PARENT_RESPONSE_INVALID");
617
+ if (!String.Equals(RequireString(parent, "code", 64, false), "CONTROL_DISPATCH_RESULT", StringComparison.Ordinal)) Fail("CONTROL_PARENT_RESPONSE_INVALID");
618
+ if (!String.Equals(RequireString(parent, "requestId", 32, true), requestId, StringComparison.Ordinal)) Fail("CONTROL_PARENT_RESPONSE_MISMATCH");
619
+ object response;
620
+ if (!parent.TryGetValue("response", out response) || !(response is Dictionary<string, object>)) Fail("CONTROL_PARENT_RESPONSE_INVALID");
621
+ return (Dictionary<string, object>)response;
622
+ }
623
+
624
+ private static Dictionary<string, object> ReadMessage(SafeFileHandle pipe, byte[] header)
625
+ {
626
+ int length = BitConverter.ToInt32(header, 0);
627
+ if (length <= 0 || length > MAX_MESSAGE_BYTES) Fail("CONTROL_REQUEST_TOO_LARGE");
628
+ string json = new UTF8Encoding(false, true).GetString(ReadExact(pipe, length));
629
+ Dictionary<string, object> value = Json.Deserialize<Dictionary<string, object>>(json);
630
+ if (value == null) Fail("CONTROL_REQUEST_INVALID");
631
+ return value;
632
+ }
633
+
634
+ private static void WriteMessage(SafeFileHandle pipe, Dictionary<string, object> value)
635
+ {
636
+ byte[] payload = new UTF8Encoding(false).GetBytes(Json.Serialize(value));
637
+ if (payload.Length > MAX_MESSAGE_BYTES) Fail("CONTROL_RESPONSE_TOO_LARGE");
638
+ byte[] frame = new byte[4 + payload.Length];
639
+ Buffer.BlockCopy(BitConverter.GetBytes(payload.Length), 0, frame, 0, 4);
640
+ Buffer.BlockCopy(payload, 0, frame, 4, payload.Length);
641
+ int offset = 0;
642
+ while (offset < frame.Length)
643
+ {
644
+ byte[] slice = new byte[frame.Length - offset];
645
+ Buffer.BlockCopy(frame, offset, slice, 0, slice.Length);
646
+ uint written;
647
+ if (!WriteFile(pipe, slice, (uint)slice.Length, out written, IntPtr.Zero) || written == 0) Win32Fail("CONTROL_WRITE_FAILED");
648
+ offset += (int)written;
649
+ }
650
+ }
651
+
652
+ private static byte[] ReadExact(SafeFileHandle pipe, int length)
653
+ {
654
+ byte[] result = new byte[length];
655
+ int offset = 0;
656
+ while (offset < length)
657
+ {
658
+ byte[] chunk = new byte[length - offset];
659
+ uint read;
660
+ bool ok = ReadFile(pipe, chunk, (uint)chunk.Length, out read, IntPtr.Zero);
661
+ int error = ok ? 0 : Marshal.GetLastWin32Error();
662
+ if ((!ok && error != ERROR_MORE_DATA) || read == 0) Win32Fail("CONTROL_READ_FAILED");
663
+ Buffer.BlockCopy(chunk, 0, result, offset, (int)read);
664
+ offset += (int)read;
665
+ }
666
+ return result;
667
+ }
668
+
669
+ private static string RequireString(Dictionary<string, object> value, string key, int maximum, bool hex)
670
+ {
671
+ object raw;
672
+ if (!value.TryGetValue(key, out raw)) Fail("CONTROL_REQUEST_INVALID");
673
+ string text = Convert.ToString(raw);
674
+ if (String.IsNullOrEmpty(text) || text.Length > maximum || (hex && !IsHex(text, text.Length))) Fail("CONTROL_REQUEST_INVALID");
675
+ return text;
676
+ }
677
+
678
+ private static bool FixedEquals(byte[] left, byte[] right)
679
+ {
680
+ int difference = left.Length ^ right.Length;
681
+ int maximum = Math.Max(left.Length, right.Length);
682
+ for (int index = 0; index < maximum; index++)
683
+ {
684
+ byte a = index < left.Length ? left[index] : (byte)0;
685
+ byte b = index < right.Length ? right[index] : (byte)0;
686
+ difference |= a ^ b;
687
+ }
688
+ return difference == 0;
689
+ }
690
+
691
+ private static bool IsHex(string text, int length)
692
+ {
693
+ if (text == null || text.Length != length) return false;
694
+ for (int index = 0; index < text.Length; index++)
695
+ {
696
+ char value = text[index];
697
+ bool valid = (value >= '0' && value <= '9') || (value >= 'a' && value <= 'f') || (value >= 'A' && value <= 'F');
698
+ if (!valid) return false;
699
+ }
700
+ return true;
701
+ }
702
+
703
+ private static string Hex(byte[] bytes)
704
+ {
705
+ StringBuilder output = new StringBuilder(bytes.Length * 2);
706
+ for (int index = 0; index < bytes.Length; index++) output.Append(bytes[index].ToString("x2"));
707
+ return output.ToString();
708
+ }
709
+
710
+ private static string SafeCode(string value)
711
+ {
712
+ if (String.IsNullOrEmpty(value)) return "LOCAL_CONTROL_FAILED";
713
+ for (int index = 0; index < value.Length; index++)
714
+ {
715
+ char current = value[index];
716
+ if (!(current == '_' || (current >= 'A' && current <= 'Z') || (current >= '0' && current <= '9'))) return "LOCAL_CONTROL_FAILED";
717
+ }
718
+ return value.Length <= 64 ? value : "LOCAL_CONTROL_FAILED";
719
+ }
720
+
721
+ private static void TryDelete(string file)
722
+ {
723
+ try { if (!String.IsNullOrEmpty(file) && File.Exists(file)) File.Delete(file); } catch { }
724
+ }
725
+
726
+ private static void TryDeleteDirectory(string directory)
727
+ {
728
+ try { if (!String.IsNullOrEmpty(directory) && Directory.Exists(directory) && Directory.GetFileSystemEntries(directory).Length == 0) Directory.Delete(directory); } catch { }
729
+ }
730
+
731
+ private static void Fail(string code) { throw new InvalidOperationException(code); }
732
+
733
+ private static void Win32Fail(string code)
734
+ {
735
+ throw new InvalidOperationException(code + "_WIN32_" + Marshal.GetLastWin32Error().ToString());
736
+ }
737
+ }
738
+ }