apexrest 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +90 -134
  2. package/dist/codex-compat/.claude-plugin/marketplace.json +20 -0
  3. package/dist/codex-compat/plugins/apexrest-apex/.claude-plugin/plugin.json +28 -0
  4. package/dist/codex-compat/plugins/apexrest-apex/.codex-plugin/plugin.json +7 -7
  5. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aanalytics%2Fstatus-summary%401.0.0.json +19 -0
  6. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Acrud%2Freport-dialog%401.0.0.json +19 -0
  7. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fdetail%401.0.0.json +19 -0
  8. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Ffiltered-list%401.0.0.json +19 -0
  9. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fhistory%401.0.0.json +19 -0
  10. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fmaster-detail%401.0.0.json +19 -0
  11. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/generator.json +5 -0
  12. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/manifest.json +29 -0
  13. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/analytics/status-summary/1.0.0/block.yaml +59 -0
  14. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/analytics/status-summary/1.0.0/renderer.json +14 -0
  15. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/crud/report-dialog/1.0.0/block.yaml +66 -0
  16. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/crud/report-dialog/1.0.0/renderer.json +14 -0
  17. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/detail/1.0.0/block.yaml +59 -0
  18. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/detail/1.0.0/renderer.json +14 -0
  19. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/filtered-list/1.0.0/block.yaml +59 -0
  20. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/filtered-list/1.0.0/renderer.json +14 -0
  21. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/history/1.0.0/block.yaml +59 -0
  22. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/history/1.0.0/renderer.json +14 -0
  23. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/master-detail/1.0.0/block.yaml +59 -0
  24. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/master-detail/1.0.0/renderer.json +14 -0
  25. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/profiles.json +10 -0
  26. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/revocations.json +1 -0
  27. package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/crm.yaml +172 -0
  28. package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/index.json +12 -0
  29. package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/service-desk.yaml +120 -0
  30. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-allocation.schema.json +33 -0
  31. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-block.schema.json +208 -0
  32. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-blueprint.schema.json +665 -0
  33. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-command.schema.json +106 -0
  34. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-contract.schema.json +174 -0
  35. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-diagnostic.schema.json +26 -0
  36. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-entity.schema.json +142 -0
  37. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-evidence.schema.json +95 -0
  38. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-field.schema.json +54 -0
  39. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-instance.schema.json +117 -0
  40. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-lock.schema.json +54 -0
  41. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-operation.schema.json +55 -0
  42. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-owner.schema.json +105 -0
  43. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-parameters.schema.json +61 -0
  44. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-plan.schema.json +1011 -0
  45. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-renderer.schema.json +69 -0
  46. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-state.schema.json +146 -0
  47. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/deploy-plan.schema.json +754 -169
  48. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/operations.schema.json +525 -256
  49. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/policy.schema.json +21 -0
  50. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/project.schema.json +17 -7
  51. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/sync-state.schema.json +238 -0
  52. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.md +0 -2
  53. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.md +1 -3
  54. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.md +0 -2
  55. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__yaml__LICENSE +13 -0
  56. package/dist/codex-compat/plugins/apexrest-apex/runtime/apexrest.mjs +81 -45
  57. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-5PCC7GZM.mjs +4090 -0
  58. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-BVPAS3TD.mjs +18 -0
  59. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-CVMECW6D.mjs +65 -0
  60. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-3MDDJFXN.mjs → chunk-JYN3YHP3.mjs} +4220 -10616
  61. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-KGTE7Q5Y.mjs +23 -0
  62. package/dist/{runtime/chunk-HOKFFGSZ.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-KKRFM7Q7.mjs} +21 -4
  63. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2VBZESVC.mjs → chunk-MNU54A7W.mjs} +7 -1
  64. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-N4C2SKCN.mjs +6912 -0
  65. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-WK5GP4ES.mjs → chunk-P3CVQAZW.mjs} +822 -102
  66. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2ZUNLCLK.mjs → chunk-QKYF6N6U.mjs} +210 -112
  67. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-S24BD6PY.mjs → chunk-RBJJNQ5O.mjs} +7 -7
  68. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TMSMKVRP.mjs +10367 -0
  69. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs} +124 -11
  70. package/dist/codex-compat/plugins/apexrest-apex/runtime/mcp.mjs +5 -10
  71. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/SKILL.md +22 -25
  72. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/agents/openai.yaml +3 -3
  73. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/references/component-routes.md +1 -5
  74. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/SKILL.md +4 -4
  75. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/agents/openai.yaml +1 -1
  76. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/references/capture-and-curation.md +2 -2
  77. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-safety/SKILL.md +18 -0
  78. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-safety/agents/openai.yaml +4 -0
  79. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/SKILL.md +20 -10
  80. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/agents/openai.yaml +3 -3
  81. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/SKILL.md +11 -6
  82. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/agents/openai.yaml +3 -3
  83. package/dist/resources/blocks/evidence/block%3Aanalytics%2Fstatus-summary%401.0.0.json +19 -0
  84. package/dist/resources/blocks/evidence/block%3Acrud%2Freport-dialog%401.0.0.json +19 -0
  85. package/dist/resources/blocks/evidence/block%3Aread%2Fdetail%401.0.0.json +19 -0
  86. package/dist/resources/blocks/evidence/block%3Aread%2Ffiltered-list%401.0.0.json +19 -0
  87. package/dist/resources/blocks/evidence/block%3Aread%2Fhistory%401.0.0.json +19 -0
  88. package/dist/resources/blocks/evidence/block%3Aread%2Fmaster-detail%401.0.0.json +19 -0
  89. package/dist/resources/blocks/generator.json +5 -0
  90. package/dist/resources/blocks/manifest.json +29 -0
  91. package/dist/resources/blocks/packages/analytics/status-summary/1.0.0/block.yaml +59 -0
  92. package/dist/resources/blocks/packages/analytics/status-summary/1.0.0/renderer.json +14 -0
  93. package/dist/resources/blocks/packages/crud/report-dialog/1.0.0/block.yaml +66 -0
  94. package/dist/resources/blocks/packages/crud/report-dialog/1.0.0/renderer.json +14 -0
  95. package/dist/resources/blocks/packages/read/detail/1.0.0/block.yaml +59 -0
  96. package/dist/resources/blocks/packages/read/detail/1.0.0/renderer.json +14 -0
  97. package/dist/resources/blocks/packages/read/filtered-list/1.0.0/block.yaml +59 -0
  98. package/dist/resources/blocks/packages/read/filtered-list/1.0.0/renderer.json +14 -0
  99. package/dist/resources/blocks/packages/read/history/1.0.0/block.yaml +59 -0
  100. package/dist/resources/blocks/packages/read/history/1.0.0/renderer.json +14 -0
  101. package/dist/resources/blocks/packages/read/master-detail/1.0.0/block.yaml +59 -0
  102. package/dist/resources/blocks/packages/read/master-detail/1.0.0/renderer.json +14 -0
  103. package/dist/resources/blocks/profiles.json +10 -0
  104. package/dist/resources/blocks/revocations.json +1 -0
  105. package/dist/resources/blueprints/crm.yaml +172 -0
  106. package/dist/resources/blueprints/index.json +12 -0
  107. package/dist/resources/blueprints/service-desk.yaml +120 -0
  108. package/dist/resources/schemas/composer-allocation.schema.json +33 -0
  109. package/dist/resources/schemas/composer-block.schema.json +208 -0
  110. package/dist/resources/schemas/composer-blueprint.schema.json +665 -0
  111. package/dist/resources/schemas/composer-command.schema.json +106 -0
  112. package/dist/resources/schemas/composer-contract.schema.json +174 -0
  113. package/dist/resources/schemas/composer-diagnostic.schema.json +26 -0
  114. package/dist/resources/schemas/composer-entity.schema.json +142 -0
  115. package/dist/resources/schemas/composer-evidence.schema.json +95 -0
  116. package/dist/resources/schemas/composer-field.schema.json +54 -0
  117. package/dist/resources/schemas/composer-instance.schema.json +117 -0
  118. package/dist/resources/schemas/composer-lock.schema.json +54 -0
  119. package/dist/resources/schemas/composer-operation.schema.json +55 -0
  120. package/dist/resources/schemas/composer-owner.schema.json +105 -0
  121. package/dist/resources/schemas/composer-parameters.schema.json +61 -0
  122. package/dist/resources/schemas/composer-plan.schema.json +1011 -0
  123. package/dist/resources/schemas/composer-renderer.schema.json +69 -0
  124. package/dist/resources/schemas/composer-state.schema.json +146 -0
  125. package/dist/resources/schemas/deploy-plan.schema.json +754 -169
  126. package/dist/resources/schemas/operations.schema.json +525 -256
  127. package/dist/resources/schemas/policy.schema.json +21 -0
  128. package/dist/resources/schemas/project.schema.json +17 -7
  129. package/dist/resources/schemas/sync-state.schema.json +238 -0
  130. package/dist/resources/templates/blank-app/README.md +0 -2
  131. package/dist/resources/templates/customer-crm/README.md +1 -3
  132. package/dist/resources/templates/existing-app/README.md +0 -2
  133. package/dist/resources/third-party/node_modules__yaml__LICENSE +13 -0
  134. package/dist/runtime/apexrest.mjs +81 -45
  135. package/dist/runtime/chunk-5PCC7GZM.mjs +4090 -0
  136. package/dist/runtime/chunk-BVPAS3TD.mjs +18 -0
  137. package/dist/runtime/chunk-CVMECW6D.mjs +65 -0
  138. package/dist/runtime/{chunk-3MDDJFXN.mjs → chunk-JYN3YHP3.mjs} +4220 -10616
  139. package/dist/runtime/chunk-KGTE7Q5Y.mjs +23 -0
  140. package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-HOKFFGSZ.mjs → runtime/chunk-KKRFM7Q7.mjs} +21 -4
  141. package/dist/runtime/{chunk-2VBZESVC.mjs → chunk-MNU54A7W.mjs} +7 -1
  142. package/dist/runtime/chunk-N4C2SKCN.mjs +6912 -0
  143. package/dist/runtime/{chunk-WK5GP4ES.mjs → chunk-P3CVQAZW.mjs} +822 -102
  144. package/dist/runtime/{chunk-2ZUNLCLK.mjs → chunk-QKYF6N6U.mjs} +210 -112
  145. package/dist/runtime/{chunk-S24BD6PY.mjs → chunk-RBJJNQ5O.mjs} +7 -7
  146. package/dist/runtime/chunk-TMSMKVRP.mjs +10367 -0
  147. package/dist/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs} +124 -11
  148. package/dist/runtime/mcp.mjs +5 -10
  149. package/package.json +14 -7
  150. package/README.uk.md +0 -206
  151. package/dist/codex-compat/plugins/apexrest-apex/resources/panel/index.html +0 -61
  152. package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.css +0 -627
  153. package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.js +0 -629
  154. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.uk.md +0 -5
  155. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.uk.md +0 -7
  156. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/database-control/install.sql +0 -17
  157. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.uk.md +0 -9
  158. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__LICENSE +0 -202
  159. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__NOTICE +0 -5
  160. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__node__LICENSE +0 -21
  161. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__yauzl__LICENSE +0 -21
  162. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +0 -55
  163. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +0 -436
  164. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__esbuild__LICENSE.md +0 -21
  165. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fflate__LICENSE +0 -21
  166. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__marked__LICENSE +0 -44
  167. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__LICENSE +0 -202
  168. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__NOTICE +0 -5
  169. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__LICENSE +0 -202
  170. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__NOTICE +0 -5
  171. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__prettier__LICENSE +0 -7
  172. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__LICENSE +0 -55
  173. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__NOTICE.txt +0 -436
  174. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__undici-types__LICENSE +0 -21
  175. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-4MYHJ2IU.mjs +0 -1208
  176. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-7RZW5QV2.mjs +0 -992
  177. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-AQZLLQ3D.mjs +0 -203
  178. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-BD2AVCFU.mjs +0 -367
  179. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-IX6V6ZGW.mjs +0 -18
  180. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-NDZ2RWQU.mjs +0 -13
  181. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-QIVPMPU3.mjs +0 -14
  182. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-SPZVXAM5.mjs +0 -147
  183. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TLYYCRQA.mjs +0 -329
  184. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TXVQLYTH.mjs +0 -1271
  185. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-YLXJ6H4J.mjs +0 -14
  186. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/SKILL.md +0 -9
  187. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/agents/openai.yaml +0 -4
  188. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/SKILL.md +0 -9
  189. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/agents/openai.yaml +0 -4
  190. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/SKILL.md +0 -19
  191. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/agents/openai.yaml +0 -4
  192. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/SKILL.md +0 -38
  193. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/agents/openai.yaml +0 -4
  194. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/SKILL.md +0 -28
  195. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/agents/openai.yaml +0 -4
  196. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/references/cli-catalog.md +0 -23
  197. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/SKILL.md +0 -14
  198. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/agents/openai.yaml +0 -4
  199. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/SKILL.md +0 -9
  200. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/agents/openai.yaml +0 -4
  201. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/SKILL.md +0 -11
  202. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/agents/openai.yaml +0 -4
  203. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/SKILL.md +0 -29
  204. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/agents/openai.yaml +0 -4
  205. package/dist/resources/panel/index.html +0 -61
  206. package/dist/resources/panel/panel.css +0 -627
  207. package/dist/resources/panel/panel.js +0 -629
  208. package/dist/resources/templates/blank-app/README.uk.md +0 -5
  209. package/dist/resources/templates/customer-crm/README.uk.md +0 -7
  210. package/dist/resources/templates/database-control/install.sql +0 -17
  211. package/dist/resources/templates/existing-app/README.uk.md +0 -9
  212. package/dist/resources/third-party/node_modules__@playwright__test__LICENSE +0 -202
  213. package/dist/resources/third-party/node_modules__@playwright__test__NOTICE +0 -5
  214. package/dist/resources/third-party/node_modules__@types__node__LICENSE +0 -21
  215. package/dist/resources/third-party/node_modules__@types__yauzl__LICENSE +0 -21
  216. package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +0 -55
  217. package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +0 -436
  218. package/dist/resources/third-party/node_modules__esbuild__LICENSE.md +0 -21
  219. package/dist/resources/third-party/node_modules__fflate__LICENSE +0 -21
  220. package/dist/resources/third-party/node_modules__marked__LICENSE +0 -44
  221. package/dist/resources/third-party/node_modules__playwright-core__LICENSE +0 -202
  222. package/dist/resources/third-party/node_modules__playwright-core__NOTICE +0 -5
  223. package/dist/resources/third-party/node_modules__playwright__LICENSE +0 -202
  224. package/dist/resources/third-party/node_modules__playwright__NOTICE +0 -5
  225. package/dist/resources/third-party/node_modules__prettier__LICENSE +0 -7
  226. package/dist/resources/third-party/node_modules__typescript__LICENSE +0 -55
  227. package/dist/resources/third-party/node_modules__typescript__NOTICE.txt +0 -436
  228. package/dist/resources/third-party/node_modules__undici-types__LICENSE +0 -21
  229. package/dist/runtime/chunk-4MYHJ2IU.mjs +0 -1208
  230. package/dist/runtime/chunk-7RZW5QV2.mjs +0 -992
  231. package/dist/runtime/chunk-AQZLLQ3D.mjs +0 -203
  232. package/dist/runtime/chunk-BD2AVCFU.mjs +0 -367
  233. package/dist/runtime/chunk-IX6V6ZGW.mjs +0 -18
  234. package/dist/runtime/chunk-NDZ2RWQU.mjs +0 -13
  235. package/dist/runtime/chunk-QIVPMPU3.mjs +0 -14
  236. package/dist/runtime/chunk-SPZVXAM5.mjs +0 -147
  237. package/dist/runtime/chunk-TLYYCRQA.mjs +0 -329
  238. package/dist/runtime/chunk-TXVQLYTH.mjs +0 -1271
  239. package/dist/runtime/chunk-YLXJ6H4J.mjs +0 -14
@@ -1,1271 +0,0 @@
1
- import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
- import {
3
- JobService,
4
- PanelService,
5
- panelActionSchema,
6
- panelReadSchema,
7
- publicPanelActionSchema
8
- } from "./chunk-BD2AVCFU.mjs";
9
- import {
10
- ArtifactService,
11
- DeploymentService,
12
- TestService
13
- } from "./chunk-4MYHJ2IU.mjs";
14
- import {
15
- VERSION
16
- } from "./chunk-S24BD6PY.mjs";
17
- import {
18
- OracleAdapter,
19
- configureConnection,
20
- configureSqlcl,
21
- connections,
22
- databaseTransport,
23
- editConnection,
24
- environment,
25
- external_exports,
26
- identifier,
27
- installSources,
28
- loadProject,
29
- managedHome,
30
- ordsUrl,
31
- ordsUsername,
32
- parse,
33
- projectInit,
34
- projectInspect,
35
- refName,
36
- relativePath,
37
- requireTrust,
38
- resolveConnection,
39
- resourceRoot,
40
- runProcess,
41
- runtimeState,
42
- savedConnectionName,
43
- sqlclConfig,
44
- sqlclMode,
45
- sqlclRestriction
46
- } from "./chunk-3MDDJFXN.mjs";
47
- import {
48
- Fault,
49
- artifactPage,
50
- canonical,
51
- contained,
52
- exists,
53
- failure,
54
- hash,
55
- readJson,
56
- redact,
57
- sanitized,
58
- success,
59
- writeJson
60
- } from "./chunk-2Z3BZF66.mjs";
61
-
62
- // packages/core/src/metadata.ts
63
- var metadataOffset = external_exports.number().int().min(0).max(1e5);
64
- var metadataLimit = external_exports.number().int().min(1).max(100);
65
- var metadataRequest = external_exports.strictObject({
66
- kind: external_exports.enum(["objects", "columns", "constraints", "signatures", "applications", "pages"]),
67
- schema: identifier,
68
- name: identifier.optional(),
69
- offset: metadataOffset.default(0),
70
- limit: metadataLimit.default(30)
71
- });
72
- var metadataRequests = external_exports.array(metadataRequest).min(1).max(8);
73
- var metadataBatchRequest = external_exports.strictObject({ requests: metadataRequests });
74
- var metadataInputSchema = external_exports.strictObject({
75
- kind: metadataRequest.shape.kind.optional(),
76
- schema: metadataRequest.shape.schema.optional(),
77
- name: metadataRequest.shape.name,
78
- offset: metadataOffset.optional(),
79
- limit: metadataLimit.optional(),
80
- requests: metadataRequests.optional()
81
- });
82
- var queries = {
83
- objects: "select object_name, object_type from all_objects where owner=:p_owner and object_type in ('TABLE','VIEW','PACKAGE') and (:p_name is null or object_name=:p_name) order by object_name, object_type",
84
- columns: "select table_name,column_name,data_type,nullable,column_id from all_tab_columns where owner=:p_owner and table_name=:p_name order by column_id",
85
- constraints: "select table_name,constraint_name,constraint_type,r_owner,r_constraint_name,status from all_constraints where owner=:p_owner and table_name=:p_name order by constraint_name",
86
- signatures: "select package_name,object_name,argument_name,position,in_out,data_type,overload from all_arguments where owner=:p_owner and package_name=:p_name order by object_name,overload,sequence",
87
- applications: "select application_id,application_name,alias from apex_applications where owner=:p_owner and application_id=:p_app_id order by application_id",
88
- pages: "select application_id,page_id,page_name,page_alias from apex_application_pages where application_id=:p_app_id and workspace=:p_workspace order by page_id"
89
- };
90
- async function metadataRead(adapter, env2, connection, value) {
91
- const input = parse(external_exports.union([metadataRequest, metadataBatchRequest]), value);
92
- const batch = "requests" in input;
93
- const requests = batch ? input.requests : [input];
94
- for (const r of requests) {
95
- if (r.schema !== env2.parsingSchema)
96
- throw new Fault("SCHEMA_DENIED", "Metadata is restricted to the configured parsing schema.", 4);
97
- if (["columns", "constraints", "signatures"].includes(r.kind) && !r.name)
98
- throw new Fault("OBJECT_REQUIRED", "Select a specific object first.", 2);
99
- }
100
- await adapter.verifyTarget(env2, connection);
101
- const read = async (r) => {
102
- const rows = await adapter.jsonQuery(
103
- queries[r.kind] + " offset :p_offset rows fetch next :p_limit rows only",
104
- connection,
105
- {
106
- p_owner: r.schema,
107
- p_name: r.name ?? "",
108
- p_app_id: env2.applicationId,
109
- p_workspace: env2.workspace,
110
- p_offset: r.offset,
111
- p_limit: r.limit
112
- }
113
- );
114
- return {
115
- dataClassification: "untrusted_database_content",
116
- rows,
117
- offset: r.offset,
118
- nextOffset: rows.length === r.limit ? r.offset + r.limit : null
119
- };
120
- };
121
- if (!batch) return read(input);
122
- const results = [];
123
- for (const [index, r] of requests.entries())
124
- results.push({ index, kind: r.kind, ...r.name ? { name: r.name } : {}, ...await read(r) });
125
- return { results, targetVerifiedOnce: true };
126
- }
127
-
128
- // packages/core/src/operations.ts
129
- var project = external_exports.string().min(1).max(4096).optional();
130
- var env = refName;
131
- var base = { project };
132
- var dependencies = {
133
- home: external_exports.string().optional(),
134
- yes: external_exports.boolean().default(false),
135
- nonInteractive: external_exports.boolean().default(false),
136
- offline: external_exports.boolean().default(false),
137
- cacheDir: external_exports.string().optional(),
138
- dryRun: external_exports.boolean().default(false),
139
- acceptOracleLicense: external_exports.boolean().default(false),
140
- skipBrowser: external_exports.boolean().default(false),
141
- installOsDeps: external_exports.boolean().default(false)
142
- };
143
- var setup = {
144
- ...base,
145
- ...dependencies,
146
- from: external_exports.string().optional(),
147
- codexHome: external_exports.string().optional(),
148
- scope: external_exports.enum(["user", "project"]).default("user"),
149
- version: external_exports.string().optional(),
150
- nativeOnly: external_exports.boolean().default(false)
151
- };
152
- var schemas = {
153
- version: external_exports.strictObject({}),
154
- doctor: external_exports.strictObject(base),
155
- "sqlcl.status": external_exports.strictObject({}),
156
- "sqlcl.configure": external_exports.strictObject({
157
- mode: sqlclMode,
158
- mcpRestrictLevel: sqlclRestriction.optional(),
159
- databaseTransport: databaseTransport.optional()
160
- }),
161
- "panel.open": panelReadSchema,
162
- "panel.status": panelReadSchema,
163
- "panel.action": publicPanelActionSchema,
164
- setup: external_exports.strictObject(setup),
165
- "dependencies.install": external_exports.strictObject(dependencies),
166
- "dependencies.uninstall": external_exports.strictObject({
167
- home: external_exports.string().optional(),
168
- dryRun: external_exports.boolean().default(false),
169
- yes: external_exports.boolean().default(false)
170
- }),
171
- "plugin.validate": external_exports.strictObject({ ...base, from: external_exports.string().optional() }),
172
- "plugin.install": external_exports.strictObject(setup),
173
- "plugin.update": external_exports.strictObject({ ...setup, version: external_exports.string().min(1) }),
174
- "plugin.uninstall": external_exports.strictObject({
175
- ...base,
176
- home: external_exports.string().optional(),
177
- keepRuntime: external_exports.boolean().default(false)
178
- }),
179
- "project.init": external_exports.strictObject({
180
- ...base,
181
- directory: external_exports.string().min(1),
182
- template: external_exports.enum(["blank-app", "customer-crm", "existing-app"]).default("blank-app"),
183
- alias: refName.optional()
184
- }),
185
- "project.adopt": external_exports.strictObject({ ...base, env, appId: external_exports.number().int().positive() }),
186
- "project.inspect": external_exports.strictObject({ ...base, detail: external_exports.enum(["full", "summary"]).default("full") }),
187
- "connection.add": external_exports.strictObject({
188
- ...base,
189
- name: refName,
190
- sqlclName: savedConnectionName.optional(),
191
- ordsUrl: ordsUrl.optional(),
192
- ordsUsername: ordsUsername.optional(),
193
- passwordFile: external_exports.string().min(1).max(4096).optional()
194
- }).refine(
195
- (value) => !!value.sqlclName || !!(value.ordsUrl && value.ordsUsername),
196
- "Supply a direct SQLcl name or ORDS URL and username."
197
- ),
198
- "connection.list": external_exports.strictObject({ ...base, saved: external_exports.boolean().default(false) }),
199
- "connection.test": external_exports.strictObject({
200
- ...base,
201
- name: savedConnectionName,
202
- saved: external_exports.boolean().default(false)
203
- }),
204
- "connection.remove": external_exports.strictObject({ ...base, name: refName }),
205
- "docs.search": external_exports.strictObject({
206
- query: external_exports.string().min(1).max(256),
207
- corpus: external_exports.enum(["apexlang", "components", "patterns"]).default("apexlang"),
208
- version: external_exports.string().optional(),
209
- kind: external_exports.enum(["grammar", "template", "contract", "guide"]).optional(),
210
- family: external_exports.string().min(1).max(200).optional(),
211
- offset: external_exports.number().int().min(0).max(1e4).default(0),
212
- limit: external_exports.number().int().min(1).max(8).default(3)
213
- }),
214
- "docs.read": external_exports.strictObject({
215
- id: external_exports.string().max(200),
216
- offset: external_exports.number().int().min(0).default(0),
217
- limit: external_exports.number().int().min(1).max(8192).default(4096)
218
- }),
219
- "docs.sync": external_exports.strictObject({ version: external_exports.string().min(1), dryRun: external_exports.boolean().default(false) }),
220
- "metadata.read": metadataInputSchema.extend({ ...base, env }).strict(),
221
- "apex.generate": external_exports.strictObject({
222
- ...base,
223
- name: external_exports.string().min(1).max(120),
224
- output: relativePath,
225
- alias: refName.optional()
226
- }),
227
- "apex.export": external_exports.strictObject({ ...base, env, output: relativePath }),
228
- "apex.validate": external_exports.strictObject({ ...base, env: env.optional() }),
229
- "apex.diff": external_exports.strictObject({ ...base, env }),
230
- "db.plan": external_exports.strictObject({ ...base, env }),
231
- "deploy.plan": external_exports.strictObject({ ...base, env, out: relativePath }),
232
- "deploy.apply": external_exports.strictObject({ ...base, plan: relativePath }),
233
- "deploy.status": external_exports.strictObject({ ...base, run: external_exports.uuid() }),
234
- "deploy.restore-plan": external_exports.strictObject({ ...base, backup: external_exports.uuid(), out: relativePath }),
235
- "test.run": external_exports.strictObject({
236
- ...base,
237
- suite: external_exports.enum(["unit", "sql", "api", "e2e", "all"]),
238
- env: env.optional(),
239
- headed: external_exports.boolean().default(false)
240
- }),
241
- "test.report": external_exports.strictObject({ ...base, run: external_exports.uuid() }),
242
- "test.auth": external_exports.strictObject({ ...base, env }),
243
- "browser.open": external_exports.strictObject({ ...base, env, browserMode: external_exports.enum(["codex", "external"]).optional() }),
244
- "jobs.status": external_exports.strictObject({
245
- ...base,
246
- id: external_exports.uuid(),
247
- waitSeconds: external_exports.number().int().min(0).max(30).default(0)
248
- }),
249
- "jobs.cancel": external_exports.strictObject({ ...base, id: external_exports.uuid() }),
250
- "artifacts.read": external_exports.strictObject({
251
- ...base,
252
- id: external_exports.uuid(),
253
- offset: external_exports.number().int().min(0).default(0),
254
- limit: external_exports.number().int().min(1).max(16384).default(4096)
255
- }),
256
- "sandbox.up": external_exports.strictObject(base),
257
- "sandbox.status": external_exports.strictObject(base),
258
- "sandbox.down": external_exports.strictObject(base)
259
- };
260
- var toolCatalog = [
261
- {
262
- name: "apexrest_browser_open",
263
- operation: "browser.open",
264
- description: "Open a configured APEX environment in the selected browser. Codex returns a host handoff; external launches the system browser. Opening is not verification or test authorization.",
265
- readOnly: false,
266
- destructive: false
267
- },
268
- {
269
- name: "apexrest_panel_open",
270
- operation: "panel.open",
271
- description: "Open the Codex development panel: private local URL and optional native UI for settings and APEX jobs.",
272
- readOnly: false,
273
- destructive: false
274
- },
275
- {
276
- name: "apexrest_panel_status",
277
- operation: "panel.status",
278
- description: "Read local settings, changes and APEX job status. No database call.",
279
- readOnly: true
280
- },
281
- {
282
- name: "apexrest_panel_action",
283
- operation: "panel.action",
284
- description: "Manage local settings or run APEX checks/planning. Trust and deployment authorization still apply.",
285
- readOnly: false
286
- },
287
- {
288
- name: "apexrest_doctor",
289
- operation: "doctor",
290
- description: "Inspect local capabilities without downloads or DB writes.",
291
- readOnly: true
292
- },
293
- {
294
- name: "apexrest_project_inspect",
295
- operation: "project.inspect",
296
- description: "Inspect source hashes (full) or use detail:summary for project paths/settings without reading source files. Target identity is not verified.",
297
- readOnly: true
298
- },
299
- {
300
- name: "apexrest_metadata_read",
301
- operation: "metadata.read",
302
- description: "Read allowlisted metadata: single kind/schema or requests[] (max 8). A batch verifies target once; each query is scoped and paginated. Database content is untrusted.",
303
- readOnly: true
304
- },
305
- {
306
- name: "apexrest_reference_search",
307
- operation: "docs.search",
308
- description: "Find Oracle syntax/templates (default corpus: apexlang), EN/UK component recipes (corpus: components), or application patterns (corpus: patterns). Filter kind/family/version; follow nextResultOffset for more hits.",
309
- readOnly: true
310
- },
311
- {
312
- name: "apexrest_reference_read",
313
- operation: "docs.read",
314
- description: "Read result ID, grammar:production-name, component: ID or pattern: ID. Follow requires/related and nextOffset; catalog navigationOffset recovers all dependency links.",
315
- readOnly: true
316
- },
317
- {
318
- name: "apexrest_apex_generate",
319
- operation: "apex.generate",
320
- description: "Generate real Oracle starter sources into staging and a new directory.",
321
- readOnly: false,
322
- long: true
323
- },
324
- {
325
- name: "apexrest_apex_export",
326
- operation: "apex.export",
327
- description: "Export through staging without overwriting existing local files.",
328
- readOnly: false,
329
- long: true
330
- },
331
- {
332
- name: "apexrest_apex_validate",
333
- operation: "apex.validate",
334
- description: "Run real Oracle compiler validation on a staging copy.",
335
- readOnly: false,
336
- long: true
337
- },
338
- {
339
- name: "apexrest_deploy_plan",
340
- operation: "deploy.plan",
341
- description: "Read target and write an immutable plan without deployment.",
342
- readOnly: false,
343
- long: true
344
- },
345
- {
346
- name: "apexrest_deploy_apply",
347
- operation: "deploy.apply",
348
- description: "Apply a fixed plan under external policy, backup and target lease.",
349
- readOnly: false,
350
- destructive: true,
351
- long: true
352
- },
353
- {
354
- name: "apexrest_test_run",
355
- operation: "test.run",
356
- description: "Run application tests; remote suites can mutate data and require environment policy.",
357
- readOnly: false,
358
- long: true
359
- },
360
- {
361
- name: "apexrest_job_status",
362
- operation: "jobs.status",
363
- description: "Read job status; waitSeconds:25 waits for completion without repeated polls. Reuse jobId; never rerun work to retrieve results.",
364
- readOnly: true
365
- },
366
- {
367
- name: "apexrest_job_cancel",
368
- operation: "jobs.cancel",
369
- description: "Request cancellation; database outcome may remain unknown.",
370
- readOnly: false
371
- },
372
- {
373
- name: "apexrest_artifact_read",
374
- operation: "artifacts.read",
375
- description: "Read registered sanitized text by opaque ID and bounded range.",
376
- readOnly: true
377
- }
378
- ];
379
-
380
- // packages/core/src/service.ts
381
- import path4 from "node:path";
382
-
383
- // packages/core/src/doctor.ts
384
- import path from "node:path";
385
- async function doctor() {
386
- const state = await runtimeState();
387
- const java = process.env.APEXREST_JAVA_HOME ? path.join(process.env.APEXREST_JAVA_HOME, "bin", process.platform === "win32" ? "java.exe" : "java") : state.java ?? "java";
388
- const probes = await Promise.all(
389
- [
390
- ["codex", ["--version"]],
391
- [process.env.APEXREST_SQLCL ?? state.sqlcl ?? "sql", ["-version"]],
392
- [java, ["-version"]]
393
- ].map(async ([exe, args]) => {
394
- try {
395
- const r = await runProcess({
396
- executable: exe,
397
- args,
398
- cwd: process.env.TMPDIR ?? process.cwd(),
399
- timeoutMs: 1e4,
400
- env: {
401
- ...process.env,
402
- JAVA_HOME: path.isAbsolute(java) ? path.dirname(path.dirname(java)) : process.env.JAVA_HOME
403
- }
404
- });
405
- return {
406
- command: exe,
407
- state: r.code === 0 ? "detected" : "unavailable",
408
- version: (r.stdout + r.stderr).trim().slice(0, 500)
409
- };
410
- } catch {
411
- return { command: exe, state: "missing" };
412
- }
413
- })
414
- );
415
- return {
416
- platform: process.platform,
417
- architecture: process.arch,
418
- runtime: {
419
- executable: process.execPath,
420
- version: process.version,
421
- baseline: process.versions.node.split(".")[0] === "24"
422
- },
423
- managedComponents: state.components,
424
- sqlcl: await sqlclConfig(),
425
- probes,
426
- database: "not-configured",
427
- nativeHost: "requires-host-verification",
428
- telemetry: false
429
- };
430
- }
431
-
432
- // packages/core/src/references.ts
433
- import path3 from "node:path";
434
- import { stat as stat2, readFile as readFile2 } from "node:fs/promises";
435
-
436
- // packages/core/src/reference-index.ts
437
- var referenceWords = (text) => text.replace(/([a-z\d])([A-Z])/g, "$1 $2").toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
438
- var normalizeReference = (text) => referenceWords(text).join(" ");
439
- function buildReferencePostings(entries) {
440
- const postings = /* @__PURE__ */ Object.create(null);
441
- entries.forEach((entry, position) => {
442
- for (const word of new Set(referenceWords(entry.id + " " + (entry.title ?? "") + " " + entry.text)))
443
- (postings[word] ??= []).push(position);
444
- });
445
- return postings;
446
- }
447
-
448
- // packages/core/src/reference-catalog.ts
449
- import path2 from "node:path";
450
- import { readFile, realpath, stat } from "node:fs/promises";
451
- var digest = external_exports.string().regex(/^[a-f0-9]{64}$/);
452
- var ascii = (max) => external_exports.string().min(1).max(max).regex(/^[\x20-\x7e]+$/);
453
- var referenceId = ascii(200);
454
- var compatibilitySchema = external_exports.object({
455
- apexVersion: ascii(64),
456
- themeVersion: ascii(64),
457
- mmdVersion: ascii(64)
458
- });
459
- var entrySchema = external_exports.object({
460
- id: referenceId,
461
- title: external_exports.string().min(1).max(240),
462
- kind: external_exports.enum(["contract", "template", "guide"]),
463
- family: ascii(200),
464
- version: ascii(120),
465
- source: ascii(2048),
466
- document: ascii(240),
467
- sha256: digest,
468
- searchText: external_exports.string().max(2e5),
469
- requires: external_exports.array(referenceId),
470
- related: external_exports.array(referenceId),
471
- readiness: external_exports.enum(["ready", "reference", "unresolved"]),
472
- compatibility: compatibilitySchema,
473
- length: external_exports.number().int().nonnegative().optional()
474
- });
475
- var manifestSchema = external_exports.object({
476
- schemaVersion: external_exports.literal(1),
477
- catalogVersion: ascii(120),
478
- source: external_exports.object({ apexVersion: ascii(64), themeVersion: ascii(64), mmdVersion: ascii(64) }).passthrough(),
479
- indexSha256: digest,
480
- files: external_exports.record(external_exports.string(), digest),
481
- counts: external_exports.record(external_exports.string(), external_exports.unknown())
482
- });
483
- function createReferenceCatalog(definition) {
484
- function invalid(message) {
485
- throw new Fault(`${definition.faultPrefix}_CATALOG_INVALID`, message, 3);
486
- }
487
- function relativeFile(file) {
488
- if (!/^[A-Za-z0-9_./-]+$/.test(file) || path2.isAbsolute(file) || file.split("/").some((part) => !part || part === "." || part === ".."))
489
- invalid(`${definition.label} catalog contains an unsafe file path.`);
490
- return file;
491
- }
492
- async function containedFile(root, file) {
493
- const resolved = await realpath(path2.join(root, relativeFile(file)));
494
- const relative = path2.relative(root, resolved);
495
- if (!relative || relative.startsWith(".." + path2.sep) || relative === ".." || path2.isAbsolute(relative))
496
- invalid(`${definition.label} catalog file resolves outside its resource directory.`);
497
- return resolved;
498
- }
499
- async function stamp(file) {
500
- const info = await stat(file, { bigint: true });
501
- return `${info.dev}:${info.ino}:${info.size}:${info.mtimeNs}:${info.ctimeNs}`;
502
- }
503
- async function loadIndex(root, manifestFile, indexFile) {
504
- try {
505
- const manifest = manifestSchema.parse(JSON.parse(await readFile(manifestFile, "utf8")));
506
- for (const file of Object.keys(manifest.files)) relativeFile(file);
507
- if (manifest.files["index.json"] !== manifest.indexSha256)
508
- invalid(`${definition.label} catalog manifest index hashes disagree.`);
509
- const raw = await readFile(indexFile, "utf8");
510
- if (hash(raw) !== manifest.indexSha256)
511
- invalid(`${definition.label} catalog index checksum does not match its manifest.`);
512
- const entries = external_exports.array(entrySchema).parse(JSON.parse(raw));
513
- const byId = /* @__PURE__ */ new Map();
514
- const searchable = entries.map((entry) => {
515
- if (!entry.id.startsWith(definition.prefix))
516
- invalid(`${definition.label} catalog contains a reference ID with an invalid prefix.`);
517
- relativeFile(entry.document);
518
- if (!entry.document.startsWith(definition.documentDirectory + "/") || !entry.document.endsWith(".md"))
519
- invalid(
520
- `${definition.label} documents must be Markdown files inside ${definition.documentDirectory}/.`
521
- );
522
- if (manifest.files[entry.document] !== entry.sha256)
523
- invalid(`${definition.label} document checksum is missing or disagrees with its manifest.`);
524
- if (byId.has(entry.id)) invalid(`${definition.label} catalog contains duplicate reference IDs.`);
525
- byId.set(entry.id, entry);
526
- return {
527
- entry,
528
- words: new Set(referenceWords(`${entry.id} ${entry.title} ${entry.searchText}`)),
529
- title: normalizeReference(entry.title),
530
- body: normalizeReference(entry.searchText)
531
- };
532
- });
533
- for (const entry of entries)
534
- for (const id of [...entry.requires, ...entry.related])
535
- if (id.startsWith(definition.prefix) && !byId.has(id))
536
- invalid(
537
- `${definition.label} catalog contains an unresolved ${definition.label.toLowerCase()} reference.`
538
- );
539
- return { root, manifest, byId, searchable };
540
- } catch (error) {
541
- if (error instanceof Fault) throw error;
542
- invalid(`${definition.label} catalog manifest or index cannot be read or has an invalid format.`);
543
- }
544
- }
545
- let cached2;
546
- async function catalogIndex() {
547
- let root, manifestFile, indexFile, revision;
548
- try {
549
- root = await realpath(path2.join(resourceRoot(), definition.directory));
550
- manifestFile = await containedFile(root, "manifest.json");
551
- indexFile = await containedFile(root, "index.json");
552
- revision = await stamp(manifestFile) + ":" + await stamp(indexFile);
553
- } catch (error) {
554
- cached2 = void 0;
555
- if (error instanceof Fault) throw error;
556
- throw new Fault(
557
- `${definition.faultPrefix}_CATALOG_UNAVAILABLE`,
558
- `Install a reviewed release containing the ${definition.label.toLowerCase()} catalog.`,
559
- 3
560
- );
561
- }
562
- if (cached2?.root === root && cached2.stamp === revision) return cached2.pending;
563
- const pending = loadIndex(root, manifestFile, indexFile);
564
- cached2 = { root, stamp: revision, pending };
565
- try {
566
- return await pending;
567
- } catch (error) {
568
- if (cached2?.pending === pending) cached2 = void 0;
569
- throw error;
570
- }
571
- }
572
- const stopwords2 = /* @__PURE__ */ new Set(["a", "an", "the", "for", "with", "and", "of", "to", "in"]);
573
- const bytes = (value) => Buffer.byteLength(JSON.stringify(sanitized(value)), "utf8");
574
- function metadata(entry) {
575
- return {
576
- id: entry.id,
577
- title: entry.title,
578
- kind: entry.kind,
579
- family: entry.family,
580
- version: entry.version,
581
- source: entry.source,
582
- readiness: entry.readiness,
583
- compatibility: entry.compatibility,
584
- classification: definition.classification
585
- };
586
- }
587
- function links(entry, count) {
588
- return {
589
- requires: entry.requires.slice(0, count),
590
- requiresCount: entry.requires.length,
591
- requiresOmittedCount: Math.max(0, entry.requires.length - count),
592
- related: entry.related.slice(0, count),
593
- relatedCount: entry.related.length,
594
- relatedOmittedCount: Math.max(0, entry.related.length - count)
595
- };
596
- }
597
- function window(text, start, length) {
598
- let end = Math.min(text.length, start + length);
599
- if (end > start && /[\uD800-\uDBFF]/.test(text[end - 1]) && /[\uDC00-\uDFFF]/.test(text[end] ?? ""))
600
- end += end - start === 1 ? 1 : -1;
601
- return text.slice(start, end);
602
- }
603
- async function search(query, version, options = {}) {
604
- const terms = [...new Set(referenceWords(query).filter((term) => !stopwords2.has(term)))];
605
- if (!terms.length) return [];
606
- const index = await catalogIndex();
607
- const normalized = normalizeReference(query);
608
- const ranked = index.searchable.filter(
609
- ({ entry, words }) => (entry.id === query.trim() || terms.every((term) => words.has(term))) && (!version || entry.version === version || !version.includes("@") && entry.version.split("@")[0] === version) && (!options.kind || entry.kind === options.kind) && (!options.family || entry.family === options.family || entry.family.startsWith(options.family + "/"))
610
- ).map(({ entry, title, body }) => ({
611
- entry,
612
- score: (entry.id === query.trim() ? 1e4 : 0) + (title === normalized ? 2e3 : 0) + (title.includes(normalized) ? 400 : 0) + terms.filter((term) => [...referenceWords(title)].includes(term)).length * 50 + (body.includes(normalized) ? 80 : 0) + (entry.readiness === "ready" ? 10 : 0) + (entry.kind === "contract" ? 5 : 0)
613
- })).sort((a, b) => b.score - a.score || (a.entry.id < b.entry.id ? -1 : a.entry.id > b.entry.id ? 1 : 0));
614
- const offset = Math.max(0, options.offset ?? 0), limit = Math.max(1, Math.min(8, options.limit ?? 3));
615
- const candidates = ranked.slice(offset, offset + limit).map(({ entry }) => {
616
- const first = terms.map((term) => entry.searchText.toLowerCase().indexOf(term)).filter((n) => n >= 0);
617
- const matchOffset = first.length ? Math.min(...first) : null;
618
- let snippetOffset = Math.max(0, (matchOffset ?? 0) - 80);
619
- if (snippetOffset && /[\uDC00-\uDFFF]/.test(entry.searchText[snippetOffset] ?? "") && /[\uD800-\uDBFF]/.test(entry.searchText[snippetOffset - 1] ?? ""))
620
- snippetOffset--;
621
- const text = window(entry.searchText, snippetOffset, 600);
622
- return {
623
- ...metadata(entry),
624
- ...links(entry, 2),
625
- text,
626
- // Index summaries are intentionally independent of documents; read a result at offset 0.
627
- snippetSource: "index",
628
- readOffset: 0,
629
- offset: snippetOffset,
630
- matchOffset,
631
- length: entry.searchText.length,
632
- nextOffset: null,
633
- totalMatches: ranked.length,
634
- nextResultOffset: null
635
- };
636
- });
637
- const results = [];
638
- for (const hit of candidates) {
639
- while (bytes([...results, hit]) > 7e3 && hit.text.length) {
640
- const remaining = Math.floor(hit.text.length / 2);
641
- hit.text = remaining < 2 ? "" : window(hit.text, 0, remaining);
642
- }
643
- if (bytes([...results, hit]) > 7e3) break;
644
- results.push(hit);
645
- }
646
- if (!results.length && candidates.length)
647
- invalid(`${definition.label} result metadata exceeds the response budget.`);
648
- const next = offset + results.length < ranked.length ? offset + results.length : null;
649
- for (const result of results) result.nextResultOffset = next;
650
- return results;
651
- }
652
- async function read(id, offset, limit) {
653
- const index = await catalogIndex();
654
- const entry = index.byId.get(id);
655
- if (!entry)
656
- throw new Fault(
657
- "REFERENCE_NOT_FOUND",
658
- `No registered ${definition.label.toLowerCase()} reference with this ID.`,
659
- 2
660
- );
661
- let raw;
662
- try {
663
- raw = await readFile(await containedFile(index.root, entry.document), "utf8");
664
- } catch (error) {
665
- if (error instanceof Fault) throw error;
666
- invalid(`${definition.label} document cannot be read.`);
667
- }
668
- if (hash(raw) !== entry.sha256)
669
- invalid(`${definition.label} document checksum does not match the catalog.`);
670
- if (entry.length !== void 0 && entry.length !== raw.length)
671
- invalid(`${definition.label} document length does not match the catalog.`);
672
- const navigation = "\n\n## Catalog navigation\n\n" + entry.requires.map((target) => `- requires: ${target}
673
- `).join("") + entry.related.map((target) => `- related: ${target}
674
- `).join("");
675
- const safeRaw = redact(raw);
676
- const document = safeRaw + redact(navigation);
677
- const start = Math.max(0, offset);
678
- let count = Math.max(1, Math.min(8192, limit));
679
- const create = () => artifactPage(document, "text", id, start, count, {
680
- ...metadata(entry),
681
- ...links(entry, 16),
682
- length: document.length,
683
- documentLength: safeRaw.length,
684
- sourceDocumentLength: raw.length,
685
- contentSanitized: true,
686
- navigationOffset: safeRaw.length,
687
- sha256: entry.sha256
688
- });
689
- let result = create();
690
- while (bytes(result) > 3e4 && count > 1) {
691
- count = Math.max(1, Math.floor(count / 2));
692
- result = create();
693
- }
694
- if (bytes(result) > 3e4) invalid(`${definition.label} document metadata exceeds the response budget.`);
695
- return result;
696
- }
697
- return { search, read };
698
- }
699
-
700
- // packages/core/src/components.ts
701
- var catalog = createReferenceCatalog({
702
- directory: "components",
703
- prefix: "component:",
704
- documentDirectory: "documents",
705
- label: "Component",
706
- faultPrefix: "COMPONENT",
707
- classification: "component-reference-data"
708
- });
709
- var componentSearch = catalog.search;
710
- var componentRead = catalog.read;
711
-
712
- // packages/core/src/patterns.ts
713
- var catalog2 = createReferenceCatalog({
714
- directory: "patterns",
715
- prefix: "pattern:",
716
- documentDirectory: "docs",
717
- label: "Pattern",
718
- faultPrefix: "PATTERN",
719
- classification: "pattern-reference-data"
720
- });
721
- var patternSearch = catalog2.search;
722
- var patternRead = catalog2.read;
723
-
724
- // packages/core/src/references.ts
725
- var references = [
726
- {
727
- id: "apexlang-lifecycle",
728
- version: "26.1",
729
- source: "https://docs.oracle.com/en/database/oracle/sql-developer-command-line/26.1/sqcug/apexlang.html",
730
- text: 'Generate starter files using apex generate -name "Name" -dir ./fresh. Validate with apex validate -input ./application. Export requires a connection and always uses fresh staging. Import deploys the full application and requires a reviewed plan. Preserve .apex/apexlang.json and its compiler metadata.'
731
- },
732
- {
733
- id: "deployment-safety",
734
- version: "1.0.0",
735
- source: "docs/adr/007-clean-apex-deployment.md",
736
- text: "Use an explicit environment. Plans bind source hashes and target identity. Recheck drift, acquire local coordination by default and create an export backup before writes. Clean APEX deployment needs no service tables. Local runners must share one managed home; independent machines need external serialization or explicitly selected database coordination. DDL cannot be generally rolled back. Interrupted writes require reconciliation. Production requires an external approval boundary."
737
- }
738
- ];
739
- var stopwords = /* @__PURE__ */ new Set(["a", "an", "the", "for", "with", "and", "of", "to", "in"]);
740
- var termsFor = (text) => [...new Set(referenceWords(text).filter((word) => !stopwords.has(word)))];
741
- function versionMatches(actual, requested) {
742
- if (!requested) return true;
743
- return actual === requested || !requested.includes("@") && actual.split("@")[0] === requested;
744
- }
745
- function indexReferences(upstream, file, digest2) {
746
- const entries = [...references, ...upstream];
747
- const byId = /* @__PURE__ */ new Map();
748
- const bySymbol = /* @__PURE__ */ new Map();
749
- const searchable = entries.map((reference) => {
750
- if (!byId.has(reference.id)) byId.set(reference.id, reference);
751
- const symbol = reference.text.match(/^<([^>\n]+)>\s*::=/)?.[1];
752
- if (symbol) bySymbol.set(symbol, reference.id);
753
- const title = reference.title ?? symbol ?? reference.id;
754
- return {
755
- reference,
756
- title,
757
- titleText: normalizeReference(title),
758
- ranking: void 0
759
- };
760
- });
761
- let pendingPostings;
762
- const postings = () => pendingPostings ??= (async () => {
763
- if (file) {
764
- try {
765
- const prebuilt = await readJson(path3.join(path3.dirname(file), "search.json"));
766
- if (prebuilt && prebuilt.schemaVersion === 1 && prebuilt.indexSha256 === digest2 && prebuilt.postings && Object.values(prebuilt.postings).every(
767
- (list) => Array.isArray(list) && list.every(
768
- (n) => Number.isInteger(n) && Number(n) >= 0 && Number(n) < upstream.length
769
- )
770
- )) {
771
- const result = buildReferencePostings(references);
772
- for (const [term, list] of Object.entries(prebuilt.postings))
773
- result[term] = [
774
- ...result[term] ?? [],
775
- ...list.map((position) => position + references.length)
776
- ];
777
- return result;
778
- }
779
- } catch {
780
- }
781
- }
782
- return buildReferencePostings(entries);
783
- })();
784
- return { upstream, byId, bySymbol, searchable, postings, queries: /* @__PURE__ */ new Map() };
785
- }
786
- var cached;
787
- async function referenceIndex() {
788
- const file = path3.join(resourceRoot(), "references/index.json");
789
- let info;
790
- try {
791
- info = await stat2(file, { bigint: true });
792
- } catch (error) {
793
- if (error.code !== "ENOENT") throw error;
794
- cached = void 0;
795
- return indexReferences([]);
796
- }
797
- const stamp = `${info.dev}:${info.ino}:${info.size}:${info.mtimeNs}:${info.ctimeNs}`;
798
- if (cached?.file === file && cached.stamp === stamp) return cached.pending;
799
- const pending = readFile2(file, "utf8").then(
800
- (raw) => indexReferences(JSON.parse(raw), file, hash(raw))
801
- );
802
- cached = { file, stamp, pending };
803
- try {
804
- return await pending;
805
- } catch (error) {
806
- if (cached?.pending === pending) cached = void 0;
807
- throw error;
808
- }
809
- }
810
- function snippet(text, query, terms) {
811
- const lower = text.toLowerCase();
812
- let matchOffset = lower.indexOf(query.trim().toLowerCase());
813
- if (matchOffset < 0) {
814
- const pattern = referenceWords(query).join("[\\s._:-]*");
815
- if (pattern) matchOffset = lower.search(new RegExp(pattern, "u"));
816
- }
817
- if (matchOffset < 0) {
818
- const locations = terms.map((term) => lower.indexOf(term)).filter((offset2) => offset2 >= 0);
819
- matchOffset = locations.length ? Math.min(...locations) : -1;
820
- }
821
- const offset = Math.max(0, Math.min(matchOffset - 160, text.length - 1200));
822
- return {
823
- text: text.slice(offset, offset + 1200),
824
- offset,
825
- matchOffset: matchOffset < 0 ? null : matchOffset,
826
- length: text.length,
827
- nextOffset: offset + 1200 < text.length ? offset + 1200 : null
828
- };
829
- }
830
- async function referenceSearch(query, version, options = {}) {
831
- if (options.corpus === "components") return componentSearch(query, version, options);
832
- if (options.corpus === "patterns") return patternSearch(query, version, options);
833
- const terms = termsFor(query);
834
- if (!terms.length) return [];
835
- const index = await referenceIndex();
836
- const normalized = normalizeReference(query);
837
- const key = JSON.stringify([query.trim(), version, options.kind, options.family]);
838
- let ranked = index.queries.get(key);
839
- if (!ranked) {
840
- const postings = await index.postings();
841
- const lists = terms.map((term) => postings[term] ?? []).sort((a, b) => a.length - b.length);
842
- const membership = lists.slice(1).map((list) => new Set(list));
843
- const candidates = (lists[0] ?? []).filter((position) => membership.every((list) => list.has(position)));
844
- const exactId = index.byId.get(query) ?? index.byId.get(index.bySymbol.get(query.replace(/^grammar:/, "")) ?? "");
845
- if (exactId) {
846
- const position = index.searchable.findIndex(({ reference }) => reference === exactId);
847
- if (!candidates.includes(position)) candidates.push(position);
848
- }
849
- ranked = candidates.filter((position) => {
850
- const r = index.searchable[position].reference;
851
- return versionMatches(r.version, version) && (!options.kind || r.kind === options.kind) && (!options.family || r.family === options.family || r.family?.startsWith(options.family + "/"));
852
- }).map((position) => {
853
- const entry = index.searchable[position];
854
- const { reference, titleText } = entry;
855
- const exact = reference === exactId;
856
- const { titleTerms, bodyText } = entry.ranking ??= {
857
- titleTerms: termsFor(titleText),
858
- bodyText: normalizeReference(reference.text)
859
- };
860
- const adjacentHits = terms.slice(1).filter((term, i) => bodyText.includes(terms[i] + " " + term)).length;
861
- const titleHits = terms.filter((term) => titleTerms.includes(term)).length;
862
- const score = (exact ? 1e4 : 0) + (titleText === normalized ? 2e3 : 0) + (titleText.includes(normalized) ? 400 : 0) + titleHits * 50 + (titleHits === terms.length ? 200 : 0) + (bodyText.includes(normalized) ? 40 : 0) + adjacentHits * 60 + (reference.text.includes('"' + query.trim() + '"') ? 80 : 0) + (reference.kind === "contract" ? 5 : 0) + 1 / (1 + reference.text.length / 1e3);
863
- return { position, score };
864
- }).sort((a, b) => b.score - a.score || a.position - b.position).map(({ position }) => position);
865
- if (index.queries.size >= 64) index.queries.delete(index.queries.keys().next().value);
866
- index.queries.set(key, ranked);
867
- }
868
- const offset = options.offset ?? 0;
869
- const limit = options.limit ?? 3;
870
- return ranked.slice(offset, offset + limit).map((position) => {
871
- const { reference: r, title } = index.searchable[position];
872
- return {
873
- id: r.id,
874
- title,
875
- version: r.version,
876
- source: r.source,
877
- kind: r.kind ?? "guide",
878
- family: r.family ?? "workflow",
879
- ...snippet(r.text, query, terms),
880
- requires: r.requires ?? [],
881
- totalMatches: ranked.length,
882
- nextResultOffset: offset + limit < ranked.length ? offset + limit : null
883
- };
884
- });
885
- }
886
- async function referenceRead(id, offset, limit) {
887
- if (id.startsWith("component:")) return componentRead(id, offset, limit);
888
- if (id.startsWith("pattern:")) return patternRead(id, offset, limit);
889
- const index = await referenceIndex();
890
- const item = index.byId.get(id) ?? index.byId.get(index.bySymbol.get(id.replace(/^grammar:/, "")) ?? "");
891
- if (!item)
892
- throw new Fault("REFERENCE_NOT_FOUND", "No registered reference with this ID or grammar symbol.", 2);
893
- const content = item.text.slice(offset, offset + limit);
894
- const symbols = [...content.matchAll(/<([^>\n]+)>/g)].map((match) => index.bySymbol.get(match[1]));
895
- const related = [
896
- ...new Set(
897
- [...item.related ?? [], ...symbols].filter(
898
- (target) => Boolean(target) && target !== item.id
899
- )
900
- )
901
- ];
902
- return {
903
- id: item.id,
904
- title: item.title ?? item.id,
905
- version: item.version,
906
- source: item.source,
907
- content,
908
- offset,
909
- length: item.text.length,
910
- nextOffset: offset + limit < item.text.length ? offset + limit : null,
911
- requires: item.requires ?? [],
912
- related: related.slice(0, 16),
913
- relatedCount: related.length,
914
- relatedOmittedCount: Math.max(0, related.length - 16),
915
- classification: "vendor-reference-data"
916
- };
917
- }
918
- async function referenceSync(version, dryRun) {
919
- const entries = (await referenceIndex()).upstream.filter((r) => versionMatches(r.version, version));
920
- if (!entries.length)
921
- throw new Fault(
922
- "REFERENCE_VERSION_UNAVAILABLE",
923
- "Requested version is not in this reviewed release snapshot. Install a reviewed release containing it.",
924
- 3
925
- );
926
- const destination = path3.join(managedHome(), "references", version + ".json");
927
- const before = await exists(destination) ? hash(canonical(await readJson(destination))) : null, after = hash(canonical(entries));
928
- if (!dryRun && before !== after) await writeJson(destination, entries);
929
- return {
930
- status: dryRun ? "planned" : before === after ? "unchanged" : "synced",
931
- version,
932
- before,
933
- after,
934
- count: entries.length
935
- };
936
- }
937
-
938
- // packages/core/src/sandbox.ts
939
- async function sandboxAction(action) {
940
- const engines = await Promise.all(
941
- ["docker", "podman"].map(async (executable) => {
942
- try {
943
- const r = await runProcess({
944
- executable,
945
- args: ["info", "--format", "{{json .}}"],
946
- cwd: process.cwd(),
947
- timeoutMs: 1e4
948
- });
949
- return { engine: executable, available: r.code === 0 };
950
- } catch {
951
- return { engine: executable, available: false };
952
- }
953
- })
954
- );
955
- const state = {
956
- profile: "optional",
957
- platform: `${process.platform}/${process.arch}`,
958
- engines,
959
- supported: false,
960
- reason: "No provisioned Oracle DB Free + APEX 26.1 + ORDS artifact tuple has been verified on this host.",
961
- volumesRemoved: false
962
- };
963
- if (action === "status") return state;
964
- if (action === "down") return { ...state, status: "not-configured", changed: false };
965
- throw new Fault(
966
- "SANDBOX_PROFILE_UNVERIFIED",
967
- state.reason + " Remote APEX targets remain independent.",
968
- 3,
969
- "blocked"
970
- );
971
- }
972
-
973
- // packages/core/src/service.ts
974
- import { realpath as realpath2 } from "node:fs/promises";
975
- async function dispatch(operation, input = {}, signal) {
976
- try {
977
- if (signal?.aborted)
978
- throw new Fault("CANCELLED", "Operation cancelled before execution.", 6, "cancelled");
979
- if (!(operation in schemas)) throw new Fault("INVALID_INPUT", `Unknown operation: ${operation}`, 2);
980
- const parsed = parse(
981
- schemas[operation],
982
- input
983
- );
984
- const text = (key) => parsed[key];
985
- const root = text("project") ?? process.cwd();
986
- const oracle = new OracleAdapter(), tests = new TestService(oracle), deployment = new DeploymentService(oracle, (ctx, env2) => tests.all(ctx, env2));
987
- let data;
988
- switch (operation) {
989
- case "panel.open": {
990
- const { openPanel } = await import("./chunk-IX6V6ZGW.mjs");
991
- data = await openPanel(await realpath2(root));
992
- break;
993
- }
994
- case "panel.status":
995
- data = await new PanelService(root).snapshot();
996
- break;
997
- case "panel.action":
998
- {
999
- const action = panelActionSchema.parse(parsed).action;
1000
- if (action.kind === "connection" && action.password !== void 0)
1001
- throw new Fault(
1002
- "LOCAL_CREDENTIAL_ENTRY_REQUIRED",
1003
- "Enter the ORDS password only in the local browser settings form, or supply a local password file to connection.add.",
1004
- 3,
1005
- "blocked"
1006
- );
1007
- data = await new PanelService(root).act(action);
1008
- }
1009
- break;
1010
- case "version":
1011
- data = { version: VERSION, node: process.version };
1012
- break;
1013
- case "doctor":
1014
- data = await doctor();
1015
- break;
1016
- case "sqlcl.status":
1017
- data = await sqlclConfig();
1018
- break;
1019
- case "sqlcl.configure":
1020
- data = await configureSqlcl(
1021
- text("mode"),
1022
- parsed.mcpRestrictLevel,
1023
- parsed.databaseTransport
1024
- );
1025
- break;
1026
- case "dependencies.install": {
1027
- const { ToolchainService } = await import("./chunk-QIVPMPU3.mjs");
1028
- data = await new ToolchainService().apply(parsed);
1029
- break;
1030
- }
1031
- case "dependencies.uninstall": {
1032
- const { uninstallTools } = await import("./chunk-HOKFFGSZ.mjs");
1033
- data = await uninstallTools(parsed);
1034
- break;
1035
- }
1036
- case "setup":
1037
- case "plugin.install":
1038
- case "plugin.update": {
1039
- const { setup: setup2 } = await import("./chunk-WK5GP4ES.mjs");
1040
- data = await setup2(parsed);
1041
- break;
1042
- }
1043
- case "plugin.validate": {
1044
- const { validateNative } = await import("./chunk-WK5GP4ES.mjs");
1045
- data = await validateNative(text("from"));
1046
- break;
1047
- }
1048
- case "plugin.uninstall": {
1049
- const { uninstallNative } = await import("./chunk-WK5GP4ES.mjs");
1050
- data = await uninstallNative(text("home") ?? managedHome(), Boolean(parsed.keepRuntime));
1051
- break;
1052
- }
1053
- case "project.init":
1054
- data = await projectInit(
1055
- text("directory"),
1056
- text("template"),
1057
- text("alias") ?? path4.basename(path4.resolve(text("directory"))).toLowerCase().replace(/[^a-z0-9-]/g, "-")
1058
- );
1059
- break;
1060
- case "connection.add":
1061
- data = await configureConnection(text("name"), {
1062
- sqlclName: text("sqlclName"),
1063
- ordsUrl: text("ordsUrl"),
1064
- ordsUsername: text("ordsUsername"),
1065
- passwordFile: text("passwordFile")
1066
- });
1067
- break;
1068
- case "connection.remove":
1069
- data = await editConnection(text("name"));
1070
- break;
1071
- case "connection.list":
1072
- data = parsed.saved ? await oracle.savedConnections(signal) : await connections();
1073
- break;
1074
- case "connection.test":
1075
- if (parsed.saved && (await oracle.settings()).databaseTransport === "ords")
1076
- throw new Fault(
1077
- "ORDS_SAVED_CONNECTION_UNSUPPORTED",
1078
- "ORDS uses plugin connection references. Test the configured reference without --saved.",
1079
- 3,
1080
- "blocked"
1081
- );
1082
- data = await oracle.identity(
1083
- parsed.saved ? { kind: "sqlcl-store", name: text("name") } : await resolveConnection(text("name")),
1084
- signal
1085
- );
1086
- if (parsed.saved) data = { name: text("name"), ...data };
1087
- break;
1088
- case "docs.search":
1089
- data = await referenceSearch(text("query"), text("version"), schemas["docs.search"].parse(parsed));
1090
- break;
1091
- case "docs.read":
1092
- data = await referenceRead(text("id"), Number(parsed.offset), Number(parsed.limit));
1093
- break;
1094
- case "docs.sync":
1095
- data = await referenceSync(text("version"), Boolean(parsed.dryRun));
1096
- break;
1097
- case "sandbox.up":
1098
- case "sandbox.status":
1099
- case "sandbox.down":
1100
- data = await sandboxAction(operation.split(".")[1]);
1101
- break;
1102
- default: {
1103
- const ctx = await loadProject(root);
1104
- switch (operation) {
1105
- case "project.inspect":
1106
- data = await projectInspect(ctx, parsed.detail);
1107
- break;
1108
- case "metadata.read": {
1109
- const env2 = environment(ctx, text("env"));
1110
- const { project: _p, env: _e, ...request } = parsed;
1111
- data = await metadataRead(oracle, env2, await resolveConnection(env2.readConnectionRef), request);
1112
- break;
1113
- }
1114
- case "apex.generate": {
1115
- await requireTrust(ctx.root);
1116
- const generated = await oracle.generate(
1117
- text("name"),
1118
- text("alias") ?? ctx.config.application.alias
1119
- );
1120
- data = {
1121
- ...await installSources(generated.directory, ctx.root, text("output")),
1122
- compiler: generated.compiler
1123
- };
1124
- break;
1125
- }
1126
- case "project.adopt":
1127
- case "apex.export": {
1128
- await requireTrust(ctx.root);
1129
- const env2 = environment(ctx, text("env"));
1130
- if (operation === "project.adopt" && env2.applicationId !== parsed.appId)
1131
- throw new Fault(
1132
- "APPLICATION_TARGET_MISMATCH",
1133
- "Requested app ID differs from the environment mapping.",
1134
- 5
1135
- );
1136
- const connection = await resolveConnection(env2.readConnectionRef);
1137
- await oracle.verifyTarget(env2, connection);
1138
- const exported = await oracle.exportApplication(env2, connection);
1139
- data = await installSources(
1140
- exported.directory,
1141
- ctx.root,
1142
- operation === "project.adopt" ? ctx.config.application.sourceDir : text("output")
1143
- );
1144
- break;
1145
- }
1146
- case "apex.validate":
1147
- await requireTrust(ctx.root);
1148
- data = await oracle.validate(await contained(ctx.root, ctx.config.application.sourceDir), signal);
1149
- break;
1150
- case "apex.diff": {
1151
- await requireTrust(ctx.root);
1152
- const env2 = environment(ctx, text("env")), connection = await resolveConnection(env2.readConnectionRef);
1153
- await oracle.verifyTarget(env2, connection);
1154
- const exported = await oracle.exportApplication(env2, connection), local = (await projectInspect(ctx)).sources.apex;
1155
- data = {
1156
- scope: "full-application-import",
1157
- completeness: "textual-file-hashes-only",
1158
- changes: [.../* @__PURE__ */ new Set([...Object.keys(exported.files), ...Object.keys(local ?? {})])].filter((f) => exported.files[f] !== local?.[f]).map((file) => ({
1159
- file,
1160
- before: exported.files[file] ?? null,
1161
- after: local?.[file] ?? null
1162
- }))
1163
- };
1164
- break;
1165
- }
1166
- case "db.plan":
1167
- data = await deployment.plan(ctx, text("env"));
1168
- break;
1169
- case "deploy.plan": {
1170
- const plan = await deployment.plan(ctx, text("env"));
1171
- await writeJson(await contained(ctx.root, text("out")), plan);
1172
- data = plan;
1173
- break;
1174
- }
1175
- case "deploy.apply":
1176
- data = await deployment.apply(
1177
- ctx,
1178
- await readJson(await contained(ctx.root, text("plan"))),
1179
- signal
1180
- );
1181
- break;
1182
- case "deploy.status":
1183
- data = await deployment.reconcile(ctx, text("run"));
1184
- break;
1185
- case "deploy.restore-plan": {
1186
- const plan = await deployment.restorePlan(ctx, text("backup"));
1187
- await writeJson(await contained(ctx.root, text("out")), plan);
1188
- data = plan;
1189
- break;
1190
- }
1191
- case "test.run": {
1192
- const suite = text("suite");
1193
- if (suite === "all") {
1194
- if (!parsed.env) throw new Fault("ENVIRONMENT_REQUIRED", "test all requires --env.", 2);
1195
- const result = await tests.all(ctx, text("env"), signal);
1196
- data = result.data;
1197
- if (!result.ok)
1198
- return {
1199
- ...failure(operation, new Fault("QUALITY_GATE_FAILED", "Required suites did not pass.", 1)),
1200
- data
1201
- };
1202
- } else {
1203
- const result = await tests.run(
1204
- ctx,
1205
- suite,
1206
- text("env"),
1207
- signal,
1208
- Boolean(parsed.headed)
1209
- );
1210
- data = result;
1211
- if (result.status !== "passed")
1212
- return {
1213
- ...failure(
1214
- operation,
1215
- new Fault(
1216
- "TEST_" + result.status.toUpperCase(),
1217
- result.diagnostic ?? `Suite is ${result.status}.`,
1218
- result.status === "failed" ? 1 : 3,
1219
- result.status
1220
- )
1221
- ),
1222
- data
1223
- };
1224
- }
1225
- break;
1226
- }
1227
- case "test.report":
1228
- data = await readJson(await contained(ctx.root, ".apexrest/test-runs/" + text("run") + ".json"));
1229
- break;
1230
- case "test.auth":
1231
- data = await tests.auth(ctx, text("env"));
1232
- break;
1233
- case "browser.open": {
1234
- const { openVerificationBrowser } = await import("./chunk-NDZ2RWQU.mjs");
1235
- data = await openVerificationBrowser(
1236
- ctx,
1237
- text("env"),
1238
- void 0,
1239
- parsed.browserMode
1240
- );
1241
- break;
1242
- }
1243
- case "jobs.status":
1244
- data = await new JobService(ctx).status(text("id"), Number(parsed.waitSeconds), signal);
1245
- break;
1246
- case "jobs.cancel":
1247
- data = await new JobService(ctx).cancel(text("id"));
1248
- break;
1249
- case "artifacts.read":
1250
- data = await new ArtifactService(ctx).read(
1251
- text("id"),
1252
- Number(parsed.offset),
1253
- Number(parsed.limit)
1254
- );
1255
- break;
1256
- default:
1257
- throw new Fault("INVALID_INPUT", "Unknown operation.", 2);
1258
- }
1259
- }
1260
- }
1261
- return success(operation, data);
1262
- } catch (error) {
1263
- return failure(operation, error);
1264
- }
1265
- }
1266
-
1267
- export {
1268
- schemas,
1269
- toolCatalog,
1270
- dispatch
1271
- };