apexrest 0.4.0-beta.1
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.
- package/LICENSE +202 -0
- package/NOTICE +18 -0
- package/README.md +201 -0
- package/README.uk.md +201 -0
- package/dist/codex-compat/.agents/plugins/marketplace.json +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/.codex-plugin/plugin.json +32 -0
- package/dist/codex-compat/plugins/apexrest-apex/.mcp.json +11 -0
- package/dist/codex-compat/plugins/apexrest-apex/LICENSE +202 -0
- package/dist/codex-compat/plugins/apexrest-apex/NOTICE +18 -0
- package/dist/codex-compat/plugins/apexrest-apex/assets/apexrest-icon.svg +27 -0
- package/dist/codex-compat/plugins/apexrest-apex/assets/apexrest-logo.svg +27 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/ords/OrdsBridge.java +323 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/LICENCE.txt +118 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/bulbasaur.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/charmander.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/mewtwo.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/pikachu.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/sources.json +36 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/squirtle.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/index.html +68 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.css +805 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.js +951 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/playwright/auth.mjs +17 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/playwright/package-lock.json +57 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/playwright/package.json +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/references/ORACLE-LICENSE.txt +35 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/references/index.json +54432 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/references/oracle-snapshot.json +648 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/references/search.json +1 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/deploy-plan.schema.json +210 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/operations.schema.json +1721 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/policy.schema.json +63 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/project.schema.json +250 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/toolchain-lock.schema.json +118 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/vendor/mcp.schema.json +120 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/vendor/plugin.schema.json +65 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.md +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.uk.md +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/.apex/apexlang.json +3 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/application.apx +51 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/deployments/default.json +2 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/page-groups.apx +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/pages/p00000-global-page.apx +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/pages/p00001-home.apx +35 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/pages/p09999-login.apx +254 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/authentications.apx +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/authorizations.apx +11 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/breadcrumbs.apx +18 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/build-options.apx +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/component-settings.apx +92 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/lists.apx +81 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/lovs.apx +20 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-144-rounded.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-192.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-256-rounded.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-32.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-512.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/static-files.apx +25 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/shared-components/themes/universal-theme/theme.apx +57 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/supporting-objects/deinstall-script.sql +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/application/supporting-objects/supporting-objects.apx +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.md +7 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.uk.md +7 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/apex-overlay/pages/p00010-customers.apx +164 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/apex-overlay/pages/p00020-dashboard.apx +54 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/apex-overlay/pages/p00080-customer.apx +332 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/project/src/database/migrations/0001__customers.sql +10 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/project/src/database/packages/0010__customer_api.sql +28 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/project/src/database/packages/0020__customer_validation_trigger.sql +10 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/project/tests/e2e/customer-crud.spec.mjs +25 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/project/tests/sql/test_customers.sql +49 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/database-control/install.sql +17 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.md +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.uk.md +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/testkit/apex.mjs +58 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@hono__node-server__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@isaacs__fs-minipass__LICENSE +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@modelcontextprotocol__sdk__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__LICENSE +202 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__NOTICE +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__node__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__yauzl__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +55 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +436 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__accepts__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__ajv-formats__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__ajv__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__body-parser__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__body-parser__node_modules__content-type__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__bytes__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__call-bind-apply-helpers__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__call-bound__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__chownr__LICENSE.md +63 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__content-disposition__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__content-type__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__cookie-signature__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__cookie__LICENSE +24 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__cors__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__cross-spawn__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__debug__LICENSE +20 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__depd__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__dunder-proto__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__ee-first__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__encodeurl__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__es-define-property__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__es-errors__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__es-object-atoms__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__esbuild__LICENSE.md +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__escape-html__LICENSE +24 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__etag__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__eventsource-parser__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__eventsource__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__express-rate-limit__license +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__express__LICENSE +24 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fast-deep-equal__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fast-uri__LICENSE +30 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fflate__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__finalhandler__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__forwarded__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fresh__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__function-bind__LICENSE +20 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__get-intrinsic__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__get-proto__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__gopd__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__has-symbols__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__hasown__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__hono__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__http-errors__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__iconv-lite__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__inherits__LICENSE +16 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__ip-address__LICENSE +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__ipaddr.js__LICENSE +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__is-promise__LICENSE +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__isexe__LICENSE +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__jose__LICENSE.md +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__json-schema-traverse__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__json-schema-typed__LICENSE.md +57 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__marked__LICENSE +44 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__math-intrinsics__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__media-typer__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__merge-descriptors__license +11 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__mime-db__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__mime-types__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__minipass__LICENSE.md +55 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__minizlib__LICENSE +26 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__ms__license.md +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__negotiator__LICENSE +24 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__negotiator__node_modules__content-type__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__object-assign__license +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__object-inspect__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__on-finished__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__once__LICENSE +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__parseurl__LICENSE +24 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__path-key__license +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__path-to-regexp__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__pend__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__pkce-challenge__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__LICENSE +202 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__NOTICE +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__LICENSE +202 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__NOTICE +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__prettier__LICENSE +7 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__proxy-addr__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__qs__LICENSE.md +29 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__range-parser__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__raw-body__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__require-from-string__license +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__router__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__safer-buffer__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__send__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__serve-static__LICENSE +25 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__setprototypeof__LICENSE +13 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__shebang-command__license +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__shebang-regex__license +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__side-channel-list__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__side-channel-map__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__side-channel-weakmap__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__side-channel__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__statuses__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__tar__LICENSE.md +55 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__toidentifier__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__type-is__LICENSE +23 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__type-is__node_modules__content-type__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__LICENSE +55 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__NOTICE.txt +436 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__undici-types__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__unpipe__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__vary__LICENSE +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__which__LICENSE +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__wrappy__LICENSE +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__yallist__LICENSE.md +63 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__yauzl__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__zod-to-json-schema__LICENSE +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__zod__LICENSE +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/toolchains/compatibility.json +50 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/toolchains/sources.lock.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/toolchains/toolchain.lock.json +204 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/apexrest.mjs +226 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-2SZCZZ3J.mjs +37111 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-2VGE5Y5J.mjs +994 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-3GSS6SJH.mjs +1424 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-5GOWABKB.mjs +409 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-ARMO5ZAQ.mjs +25 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-ED2YPDPS.mjs +1123 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-FPOEB42H.mjs +100 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-GFRSRK3K.mjs +16 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-ICWYSHJ7.mjs +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-IPU64TJI.mjs +291 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-JWX4UQAZ.mjs +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-K3KT6RZY.mjs +1064 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-QLRGI23I.mjs +1307 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-RF4XQO6I.mjs +13 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-VPCUV5QA.mjs +237 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-WMJTK7ZB.mjs +201 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-WROK6RQH.mjs +200 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-XDJEGHUX.mjs +1179 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-YK34QNHH.mjs +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-Z6Y72JVG.mjs +37 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-ZQFJ2BNZ.mjs +329 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/mcp.mjs +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/SKILL.md +32 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/assets/p00020-filtered-components.apx +152 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/references/component-routes.md +35 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/references/native-dashboard.md +11 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/SKILL.md +11 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/SKILL.md +11 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/SKILL.md +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/SKILL.md +38 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/SKILL.md +27 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/references/cli-catalog.md +22 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/SKILL.md +20 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/SKILL.md +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/SKILL.md +9 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/SKILL.md +15 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/references/ords.md +3 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-team/SKILL.md +24 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-team/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/SKILL.md +27 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/SKILL.md +17 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/agents/openai.yaml +7 -0
- package/dist/resources/ords/OrdsBridge.java +323 -0
- package/dist/resources/panel/assets/LICENCE.txt +118 -0
- package/dist/resources/panel/assets/bulbasaur.png +0 -0
- package/dist/resources/panel/assets/charmander.png +0 -0
- package/dist/resources/panel/assets/mewtwo.png +0 -0
- package/dist/resources/panel/assets/pikachu.png +0 -0
- package/dist/resources/panel/assets/sources.json +36 -0
- package/dist/resources/panel/assets/squirtle.png +0 -0
- package/dist/resources/panel/index.html +68 -0
- package/dist/resources/panel/panel.css +805 -0
- package/dist/resources/panel/panel.js +951 -0
- package/dist/resources/playwright/auth.mjs +17 -0
- package/dist/resources/playwright/package-lock.json +57 -0
- package/dist/resources/playwright/package.json +9 -0
- package/dist/resources/references/ORACLE-LICENSE.txt +35 -0
- package/dist/resources/references/index.json +54432 -0
- package/dist/resources/references/oracle-snapshot.json +648 -0
- package/dist/resources/references/search.json +1 -0
- package/dist/resources/schemas/deploy-plan.schema.json +210 -0
- package/dist/resources/schemas/operations.schema.json +1721 -0
- package/dist/resources/schemas/policy.schema.json +63 -0
- package/dist/resources/schemas/project.schema.json +250 -0
- package/dist/resources/schemas/toolchain-lock.schema.json +118 -0
- package/dist/resources/schemas/vendor/mcp.schema.json +120 -0
- package/dist/resources/schemas/vendor/plugin.schema.json +65 -0
- package/dist/resources/templates/blank-app/README.md +5 -0
- package/dist/resources/templates/blank-app/README.uk.md +5 -0
- package/dist/resources/templates/blank-app/application/.apex/apexlang.json +3 -0
- package/dist/resources/templates/blank-app/application/application.apx +51 -0
- package/dist/resources/templates/blank-app/application/deployments/default.json +2 -0
- package/dist/resources/templates/blank-app/application/page-groups.apx +4 -0
- package/dist/resources/templates/blank-app/application/pages/p00000-global-page.apx +4 -0
- package/dist/resources/templates/blank-app/application/pages/p00001-home.apx +35 -0
- package/dist/resources/templates/blank-app/application/pages/p09999-login.apx +254 -0
- package/dist/resources/templates/blank-app/application/shared-components/authentications.apx +5 -0
- package/dist/resources/templates/blank-app/application/shared-components/authorizations.apx +11 -0
- package/dist/resources/templates/blank-app/application/shared-components/breadcrumbs.apx +18 -0
- package/dist/resources/templates/blank-app/application/shared-components/build-options.apx +4 -0
- package/dist/resources/templates/blank-app/application/shared-components/component-settings.apx +92 -0
- package/dist/resources/templates/blank-app/application/shared-components/lists.apx +81 -0
- package/dist/resources/templates/blank-app/application/shared-components/lovs.apx +20 -0
- package/dist/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-144-rounded.png +0 -0
- package/dist/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-192.png +0 -0
- package/dist/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-256-rounded.png +0 -0
- package/dist/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-32.png +0 -0
- package/dist/resources/templates/blank-app/application/shared-components/static-files/icons/app-icon-512.png +0 -0
- package/dist/resources/templates/blank-app/application/shared-components/static-files.apx +25 -0
- package/dist/resources/templates/blank-app/application/shared-components/themes/universal-theme/theme.apx +57 -0
- package/dist/resources/templates/blank-app/application/supporting-objects/deinstall-script.sql +0 -0
- package/dist/resources/templates/blank-app/application/supporting-objects/supporting-objects.apx +9 -0
- package/dist/resources/templates/customer-crm/README.md +7 -0
- package/dist/resources/templates/customer-crm/README.uk.md +7 -0
- package/dist/resources/templates/customer-crm/apex-overlay/pages/p00010-customers.apx +164 -0
- package/dist/resources/templates/customer-crm/apex-overlay/pages/p00020-dashboard.apx +54 -0
- package/dist/resources/templates/customer-crm/apex-overlay/pages/p00080-customer.apx +332 -0
- package/dist/resources/templates/customer-crm/project/src/database/migrations/0001__customers.sql +10 -0
- package/dist/resources/templates/customer-crm/project/src/database/packages/0010__customer_api.sql +28 -0
- package/dist/resources/templates/customer-crm/project/src/database/packages/0020__customer_validation_trigger.sql +10 -0
- package/dist/resources/templates/customer-crm/project/tests/e2e/customer-crud.spec.mjs +25 -0
- package/dist/resources/templates/customer-crm/project/tests/sql/test_customers.sql +49 -0
- package/dist/resources/templates/database-control/install.sql +17 -0
- package/dist/resources/templates/existing-app/README.md +9 -0
- package/dist/resources/templates/existing-app/README.uk.md +9 -0
- package/dist/resources/testkit/apex.mjs +58 -0
- package/dist/resources/third-party/node_modules__@hono__node-server__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__@isaacs__fs-minipass__LICENSE +15 -0
- package/dist/resources/third-party/node_modules__@modelcontextprotocol__sdk__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__@playwright__test__LICENSE +202 -0
- package/dist/resources/third-party/node_modules__@playwright__test__NOTICE +5 -0
- package/dist/resources/third-party/node_modules__@types__node__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__@types__yauzl__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +55 -0
- package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +436 -0
- package/dist/resources/third-party/node_modules__accepts__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__ajv-formats__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__ajv__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__body-parser__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__body-parser__node_modules__content-type__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__bytes__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__call-bind-apply-helpers__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__call-bound__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__chownr__LICENSE.md +63 -0
- package/dist/resources/third-party/node_modules__content-disposition__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__content-type__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__cookie-signature__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__cookie__LICENSE +24 -0
- package/dist/resources/third-party/node_modules__cors__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__cross-spawn__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__debug__LICENSE +20 -0
- package/dist/resources/third-party/node_modules__depd__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__dunder-proto__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__ee-first__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__encodeurl__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__es-define-property__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__es-errors__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__es-object-atoms__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__esbuild__LICENSE.md +21 -0
- package/dist/resources/third-party/node_modules__escape-html__LICENSE +24 -0
- package/dist/resources/third-party/node_modules__etag__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__eventsource-parser__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__eventsource__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__express-rate-limit__license +21 -0
- package/dist/resources/third-party/node_modules__express__LICENSE +24 -0
- package/dist/resources/third-party/node_modules__fast-deep-equal__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__fast-uri__LICENSE +30 -0
- package/dist/resources/third-party/node_modules__fflate__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__finalhandler__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__forwarded__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__fresh__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__function-bind__LICENSE +20 -0
- package/dist/resources/third-party/node_modules__get-intrinsic__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__get-proto__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__gopd__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__has-symbols__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__hasown__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__hono__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__http-errors__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__iconv-lite__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__inherits__LICENSE +16 -0
- package/dist/resources/third-party/node_modules__ip-address__LICENSE +19 -0
- package/dist/resources/third-party/node_modules__ipaddr.js__LICENSE +19 -0
- package/dist/resources/third-party/node_modules__is-promise__LICENSE +19 -0
- package/dist/resources/third-party/node_modules__isexe__LICENSE +15 -0
- package/dist/resources/third-party/node_modules__jose__LICENSE.md +21 -0
- package/dist/resources/third-party/node_modules__json-schema-traverse__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__json-schema-typed__LICENSE.md +57 -0
- package/dist/resources/third-party/node_modules__marked__LICENSE +44 -0
- package/dist/resources/third-party/node_modules__math-intrinsics__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__media-typer__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__merge-descriptors__license +11 -0
- package/dist/resources/third-party/node_modules__mime-db__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__mime-types__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__minipass__LICENSE.md +55 -0
- package/dist/resources/third-party/node_modules__minizlib__LICENSE +26 -0
- package/dist/resources/third-party/node_modules__ms__license.md +21 -0
- package/dist/resources/third-party/node_modules__negotiator__LICENSE +24 -0
- package/dist/resources/third-party/node_modules__negotiator__node_modules__content-type__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__object-assign__license +21 -0
- package/dist/resources/third-party/node_modules__object-inspect__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__on-finished__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__once__LICENSE +15 -0
- package/dist/resources/third-party/node_modules__parseurl__LICENSE +24 -0
- package/dist/resources/third-party/node_modules__path-key__license +9 -0
- package/dist/resources/third-party/node_modules__path-to-regexp__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__pend__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__pkce-challenge__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__playwright-core__LICENSE +202 -0
- package/dist/resources/third-party/node_modules__playwright-core__NOTICE +5 -0
- package/dist/resources/third-party/node_modules__playwright__LICENSE +202 -0
- package/dist/resources/third-party/node_modules__playwright__NOTICE +5 -0
- package/dist/resources/third-party/node_modules__prettier__LICENSE +7 -0
- package/dist/resources/third-party/node_modules__proxy-addr__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__qs__LICENSE.md +29 -0
- package/dist/resources/third-party/node_modules__range-parser__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__raw-body__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__require-from-string__license +21 -0
- package/dist/resources/third-party/node_modules__router__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__safer-buffer__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__send__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__serve-static__LICENSE +25 -0
- package/dist/resources/third-party/node_modules__setprototypeof__LICENSE +13 -0
- package/dist/resources/third-party/node_modules__shebang-command__license +9 -0
- package/dist/resources/third-party/node_modules__shebang-regex__license +9 -0
- package/dist/resources/third-party/node_modules__side-channel-list__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__side-channel-map__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__side-channel-weakmap__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__side-channel__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__statuses__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__tar__LICENSE.md +55 -0
- package/dist/resources/third-party/node_modules__toidentifier__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__type-is__LICENSE +23 -0
- package/dist/resources/third-party/node_modules__type-is__node_modules__content-type__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__typescript__LICENSE +55 -0
- package/dist/resources/third-party/node_modules__typescript__NOTICE.txt +436 -0
- package/dist/resources/third-party/node_modules__undici-types__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__unpipe__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__vary__LICENSE +22 -0
- package/dist/resources/third-party/node_modules__which__LICENSE +15 -0
- package/dist/resources/third-party/node_modules__wrappy__LICENSE +15 -0
- package/dist/resources/third-party/node_modules__yallist__LICENSE.md +63 -0
- package/dist/resources/third-party/node_modules__yauzl__LICENSE +21 -0
- package/dist/resources/third-party/node_modules__zod-to-json-schema__LICENSE +15 -0
- package/dist/resources/third-party/node_modules__zod__LICENSE +21 -0
- package/dist/resources/toolchains/compatibility.json +50 -0
- package/dist/resources/toolchains/sources.lock.json +14 -0
- package/dist/resources/toolchains/toolchain.lock.json +204 -0
- package/dist/runtime/apexrest.mjs +226 -0
- package/dist/runtime/chunk-2SZCZZ3J.mjs +37111 -0
- package/dist/runtime/chunk-2VGE5Y5J.mjs +994 -0
- package/dist/runtime/chunk-3GSS6SJH.mjs +1424 -0
- package/dist/runtime/chunk-5GOWABKB.mjs +409 -0
- package/dist/runtime/chunk-ARMO5ZAQ.mjs +25 -0
- package/dist/runtime/chunk-ED2YPDPS.mjs +1123 -0
- package/dist/runtime/chunk-FPOEB42H.mjs +100 -0
- package/dist/runtime/chunk-GFRSRK3K.mjs +16 -0
- package/dist/runtime/chunk-ICWYSHJ7.mjs +19 -0
- package/dist/runtime/chunk-IPU64TJI.mjs +291 -0
- package/dist/runtime/chunk-JWX4UQAZ.mjs +14 -0
- package/dist/runtime/chunk-K3KT6RZY.mjs +1064 -0
- package/dist/runtime/chunk-QLRGI23I.mjs +1307 -0
- package/dist/runtime/chunk-RF4XQO6I.mjs +13 -0
- package/dist/runtime/chunk-VPCUV5QA.mjs +237 -0
- package/dist/runtime/chunk-WMJTK7ZB.mjs +201 -0
- package/dist/runtime/chunk-WROK6RQH.mjs +200 -0
- package/dist/runtime/chunk-XDJEGHUX.mjs +1179 -0
- package/dist/runtime/chunk-YK34QNHH.mjs +15 -0
- package/dist/runtime/chunk-Z6Y72JVG.mjs +37 -0
- package/dist/runtime/chunk-ZQFJ2BNZ.mjs +329 -0
- package/dist/runtime/mcp.mjs +15 -0
- package/package.json +70 -0
|
@@ -0,0 +1,951 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
// packages/core/src/team-identity.ts
|
|
3
|
+
var teamIdentities = {
|
|
4
|
+
manager: { name: "Mewtwo", pokemon: 150, label: "Project manager" },
|
|
5
|
+
"developer-1": { name: "Pikachu", pokemon: 25, label: "Developer 1" },
|
|
6
|
+
"developer-2": { name: "Charmander", pokemon: 4, label: "Developer 2" },
|
|
7
|
+
"developer-3": { name: "Bulbasaur", pokemon: 1, label: "Developer 3" },
|
|
8
|
+
qa: { name: "Squirtle", pokemon: 7, label: "Independent QA" }
|
|
9
|
+
};
|
|
10
|
+
var teamLabel = (role) => role === "user" ? "You" : teamIdentities[role].name + " \xB7 " + teamIdentities[role].label;
|
|
11
|
+
|
|
12
|
+
// packages/panel/assets/mewtwo.png
|
|
13
|
+
var mewtwo_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAJFBMVEUAAAAAAAA5IFI5OVJqMZyDe5yUQb20Su60rMXe1ebu5u7////IHWIfAAAAAXRSTlMAQObYZgAAAytJREFUWMPtlrFu2zAQhqmoKjpKsQXIY42gswMmhYUuMSo4HaOqBKysdfUIzWyoBKhugSuA17VL7Vfoy/VIKXYLWBQ9FF18i5T4Pt79pzuShJzsZCf7r/aCM/Xw2J0l4MFaPXKo238kSdIDwJ0GeOtfFEVyYwYmChAN8KxIgqRYmkIA1Ixeg2g0zJcBIcPCNwA5sA3UUkyaADP1GM5MQL3dQi6FXvR5s7ZjBO4RgBaYLxsgMeTEtgoQLdAuPewGvHy73SggVH+9sgDuQZkQK6X5KRUTgPl83zAEsExnO6BbtYvA9keNQLkHnMQA/ISvmze/hCgXEzuAQ/74WgHsT8BQ12lVpZ9Q9CXjCMz6gWtVIiH4JMx2wNAEONq/pCRMCbmwAQTnjDLfYehz0TgaAS9kA8pSEv4FmLrPGfguS50AM2pFoGYTQHB+eBqJwBbwcOQqKbiK0ORkrKoaOTRZBraAG4NE4JoFDTDrGVEnjKECKBnLw70IQ1EjHkuMUGYsf/TJ7lt3+o8ki+saREhpDo8BOQs6088mxMtiENStueChT4IRgB/LrmFjgtMYYE2x/Rilqe4qWMdwdRjIqK7mCv1JJDhTAB2tp0IeBjxVGZAD/SPqUH3kQTlF9HBKblVjPo9NYSsEMIKLuxnP6GHRriizXLbz+CXhKgQC+LzqqBKdUMn1T+7lvHjHKPcdkYbdAK7HqX6Jvz0Uy6ySKcnOX2aLdRfgQNDKv30oChTEz8dJElRw2TmZfturLVCneLq97QZI8NTct5+Lj9ACybSc9R2iMC8agA1ViKsbW4BrwDxrO2CmAZ3TrO9gzyUCyQjU17YIgJ3HP6BbKFgD9AbAS8Z75ccaYNYbgLiMjVUIDQT9/mp82PhCh0gDq+sMhvDPxuMB00NhB+BxqAk7gERMXzNw+04tAd4AjiWAw9e+hUcDdiKm+tLQ5GQDuJXMjgLwOtnOHqr3LToJN+4WcIToVe0tKpCrtiMcLrJewWUOTwkRJxLtJzQAuN2v9vuI4H0ALip2PhGIat2XkxMMdq8VLPBEsb/mIxCBPAIg0crZC7IKgcfcMQFOdrJ/ar8BJycwp3/4ZdUAAAAASUVORK5CYII=";
|
|
14
|
+
|
|
15
|
+
// packages/panel/assets/pikachu.png
|
|
16
|
+
var pikachu_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAKlBMVEUAAAAAAAApKSlBQUpiMQhzc4OcUgDFIBjelADmWkH2vSD25lL/9qT////Vai+KAAAAAXRSTlMAQObYZgAAAdlJREFUWMPtlsFqwkAQhjclhB6ztRRReqiHXnoSbz0piLX2JcwliD6A0JsgEuoDlNJTQKzsnkJpSDN9A3PpG3U2ST12J4dCKftjNML/MTObndkwZmRkZPTX5Vb0Wxe/DrQq5nRSHehWBK4PQKtFAWpiU9wctTodygI0SsCZQqfTJgK+P3ZmgAClfltsJ9k+Qf8bKQACQZZlgHptqwC+lhh+ZNleAVz5HRjrAEwGUi4Tr/wX61JaSMzm8wrygo9BD5wjENVKYI3hNDnZbRiqlHJfAHrAuVQmeH9eqooJwB3AABN5egyL+rVF3MrldDtJ5/OwDKADbkSuHJAVgJf7kE1FTmg2lCNKheoOCa7froU2OSo5owLSHeG33s+aJQCuTfKzJhQBsNjRlpEAJHZSrY4tKBNkHeNSqk3XZXUKYEFSApH18D1BfgYAmwZ7CKJhsOsRgHUB7CAMgj5lGM9AIfgJ6wtGA2Ko45UK7lPmUjPGmRThlQr3zCMAM/BxhXz1MLhPAKyiBwCkEH2PkJIlCn+apiKklGDlPQBCYoSQdKBMxUG0o6hx8O9oh53VEAHnqndIj42x/kotpjWYrGgB7Djp5c6R8GgR+Gn5G0cVXwl41bcUIyMjo/+qLw92FGczGN4XAAAAAElFTkSuQmCC";
|
|
17
|
+
|
|
18
|
+
// packages/panel/assets/charmander.png
|
|
19
|
+
var charmander_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAALVBMVEUAAAAIOYsQEBAYi7QxrO6LKQDeUjnmOQDmrFr2pAD/lEH/xWL/1Qj/1Xv///8NIPGPAAAAAXRSTlMAQObYZgAAAchJREFUWMPtlb9Lw0AUx49A7FwQB6dyYggdOol/h8ulpaDDQY4QF7dQ6FSwHILgFgouFsxwgoOj/gFFyCwi3CJ08a/wXX6s3ouTyH2HJMP75N67+753hDg5OTk5/UntxKxbfKpUJ+JcgQYdFnh5/g2wxgPpg1JFJwD+n6oCn9OeAfoCDxwDcNeP8MAXAI8HHYChAXZb4MIa7+8DcH/U1jC3A9UxiC6A2dS4AXq39hqmsEAccfgCB/bKGytAwasjwQlj3KywsWV0QijNIhEzpQywebUAXsyCmIkADFJAHVlWWjbWSxUfFlQI2ChKSJbP85+BACI5xINM3fNNaSnCC0QjbjZ2VtoAQ8SJFIJVBzFblTmxErGUy7TuoF6+yqwH4UVav7ctl43t9iMTrXXbcv4YYfBTAzRzw39CA3VOPmIa+NcAXDXAFANAvP6oAWYMZRMzwJspwmeYceMXJqUlmJVBayQIQCVaS3DrGhyYLDBTYyKlAQqwlRxggHUNiEDIBWouFaGUEfRPKBeYceZBQ4QyAoOHlyeo0Qepc3oID4aLB8D0TiQ4crZ6dXNOFRYYnVVTL0LfKR6l1Wu7/ex2vVM6IE5OTk7/Ud/V9spBc5Q2fAAAAABJRU5ErkJggg==";
|
|
20
|
+
|
|
21
|
+
// packages/panel/assets/bulbasaur.png
|
|
22
|
+
var bulbasaur_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAMFBMVEUAAAAQEBAYSkoxc3M5lJRSYili1bRzrDGD7sWk1UGsADG9/3PNzc3uIDn/amL///87EAzGAAAAAXRSTlMAQObYZgAAAZ1JREFUWMPtlL9Lw0AUx9NUce1JwMGlLUfbrdAGcVAkl0fI5iSloxiOrg4hiJuWcP+AlPwLASm4lWzB0dG9/0HAunbwpbjfq6PcZ/5+8n5weZZlMBgMhv/F4b75KaOHj5L4ZppMWuT8Y1Gssge6gPmiSLKYINjtukBRvJ0kK5IQPrXHyGhwWxTZyz1BUGOlUjlQOyHRlwhDpSCUKq2FBWFqX6k5hKmU0Wkt6Hs6xwKgdsIqW8Q0IVQpoJBlSawdojmYKRz6+aMHXrYgCPZnqubh7HJZgtdPiALUwmYnTLTCxTpUoObrfAtCUISrZYAzRMtqCz7040S7pbM8kLjSvHoHANHXCx35C/Da0D8NfiyDO8yPGLjQhY7+dV/nUt512DdgiS4X+tfK/bzGBYEdcWhrhYbjv1aVC54D2BRBQAOnBeaAK7CKR/hHPYagwz0cgiAcyAg3KiQIhyZYrsQoD6I9BPAYh1oQQDlMgYw8K0Ch4bouRWhGtSCjll2WJeXqDYe8ZfUC7IYx0qlsMGbZm83Xfqee+HGDwWAwGP7KD5Vqm0oTWykbAAAAAElFTkSuQmCC";
|
|
23
|
+
|
|
24
|
+
// packages/panel/assets/squirtle.png
|
|
25
|
+
var squirtle_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAMFBMVEUAAAAQEBApc4NanKRiKQCDKQCLxc205u69agDNeynVlFLVzc3mrFr/1Wr/5pz///8R5ETqAAAAAXRSTlMAQObYZgAAAb1JREFUWMPtlL9KxEAQxi/JC2QvnihaeAkXCwtNBheus7eUPIBZXLGy82ohnZVi4cIl76A2h1ZqJaz2Bxd7C1PoCzgr9jcpBIv9uoX5sfPnm+l0rKysrKz+pwDCdvGjkWxDeBgv5RodWB+dIJCT491D80GLL1wMFm2ACIM5cJlSgYH5YeVWJFRgk0u5z26ADAwM0PukA31M6bgF4JqmHvS+yIBzwjEnAfSUumZqEIHvhZRRbG05iyIMB3uwxkmdjVOW9JTKIOEy8glOxWyC7SyDtCtzCmCMtB9hxcu3kjZrdJJIGVvVsaT1yQWAcV3rRy7AJ3U1hGFZT9UFprWDL8KqsuG7GtfTCJaKTigFYRbVx2vzMX1gk8LFmRPWomoQ0Hp3UkS03f4BSgROgeexmF+6equaaa3PJgsAcU4AqmelVT27uisg5ZLQ3Kqpmlk5u7w/hYTicq80NTw/pRtEgB/VL9glvDPXAMH8jDx5pJXWT+gpY0JGMTjWrB8RCCjxxuDbWqsLBPqMYj8HbZppfc4l9QwEmHnGWES+GxjJfjnaIRNxYlJ3cJNoG8ScnzhHLPb9Thv9glZWVlZWf69vfHii3k2wjfUAAAAASUVORK5CYII=";
|
|
26
|
+
|
|
27
|
+
// packages/panel/src/avatars.ts
|
|
28
|
+
var avatars = {
|
|
29
|
+
manager: mewtwo_default,
|
|
30
|
+
"developer-1": pikachu_default,
|
|
31
|
+
"developer-2": charmander_default,
|
|
32
|
+
"developer-3": bulbasaur_default,
|
|
33
|
+
qa: squirtle_default
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// plugins/apexrest-apex/assets/apexrest-logo.svg
|
|
37
|
+
var apexrest_logo_default = `data:image/svg+xml,<?xml version='1.0' encoding='utf-8'?>%0A<svg xmlns="http://www.w3.org/2000/svg" version="1.1" x="0px" y="0px" viewBox="100 66 98 98" xml:space="preserve" width="98" height="98" role="img" aria-labelledby="logo-title">%0A <title id="logo-title">APEXREST pencil and ruler symbol</title>%0A <style type="text/css">%0A%09.st0{fill:%2331BEF9;}%0A%09.st1{fill:%23FFD541;}%0A%09.st2{fill:%23FF4141;}%0A%09.st3{fill:%231E1E1E;}%0A</style>%0A <g id="\u0421\u043B\u043E\u0439_2">%0A <polygon class="st0" points="133,149 177,106 160,89 116,132 " />%0A </g>%0A <g id="\u0421\u043B\u043E\u0439_3">%0A <polygon class="st1" points="128,114 147,95 128,76 126,75 123,76 108,91 107,93 110,97 127,114 " />%0A <polygon class="st1" points="151,137 170,118 189,137 190,140 189,142 186,146 173,157 170,157 " />%0A </g>%0A <g id="\u0421\u043B\u043E\u0439_4">%0A <path class="st2" d="M166,83l16,16l4-3l2-5v-4c0,0-1-2-1-3s-3-4-3-4l-5-3h-3h-3l-3,2l-2,2L166,83L166,83z" />%0A </g>%0A <g id="\u0421\u043B\u043E\u0439_1">%0A <g>%0A <path class="st3" d="M126.7,115.5l1.7-1.7l-2.2-2.2l4.3-4.3c0.5-0.5,0.4-1.3-0.1-1.7c-0.5-0.4-1.2-0.4-1.7,0l-4.3,4.3l-4.1-4.1 l4.3-4.3c0.5-0.5,0.4-1.3-0.1-1.7c-0.5-0.4-1.2-0.4-1.7,0l-4.3,4.3l-4.1-4.1l9.4-9.5c0.5-0.5,0.4-1.3-0.1-1.7 c-0.5-0.4-1.2-0.4-1.7,0l-9.5,9.5l-3.6-3.6c-0.8-0.8-0.8-2,0-2.8L123.9,77c0.8-0.8,2-0.8,2.8,0L146,96.2l1.7-1.7l-19.2-19.2 c-1.7-1.7-4.6-1.7-6.3,0L107.5,90c-1.7,1.7-1.7,4.6,0,6.3L126.7,115.5z" />%0A <path class="st3" d="M182.7,100.8l3-3c5-5.1,4.9-13.3-0.2-18.3c-5-5-13.1-5-18.2,0l-51.9,51.9c-0.1,0.1-0.2,0.2-0.2,0.4v0.1 l-7.2,23.8c-0.2,0.6,0.2,1.3,0.8,1.5c0.2,0.1,0.5,0.1,0.7,0l23.8-7.2h0.1c0.1-0.1,0.2-0.1,0.4-0.2L182.7,100.8L182.7,100.8z M159.3,91l6.6,6.6l-41.3,41.3l-6.6-6.6L159.3,91z M110.9,154.2l1-3.5c1.1,0.5,2,1.3,2.5,2.4L110.9,154.2z M116.9,152.4 c-0.8-1.8-2.4-3.2-4.2-4l4.2-13.9l13.7,13.7L116.9,152.4z M132.9,147.1l-6.6-6.6l41.3-41.3l6.6,6.6L132.9,147.1z M175.9,104.1 l-7.4-7.4l-7.4-7.4l4.2-4.2l14.9,14.9L175.9,104.1z M167,83.3l2.1-2.1c4.3-4,10.9-3.7,14.9,0.6c3.7,4,3.7,10.3,0,14.3l-2.1,2.1 L167,83.3z" />%0A <path class="st3" d="M189.9,136.7l-19.2-19.2l-1.7,1.7l19.2,19.2c0.8,0.8,0.8,2,0,2.8l-14.7,14.7c-0.8,0.8-2.1,0.8-2.8,0l-3.6-3.6 l9.5-9.5c0.5-0.4,0.6-1.2,0.2-1.7c-0.4-0.5-1.2-0.6-1.7-0.2c-0.1,0.1-0.1,0.1-0.2,0.2l-9.5,9.5l-4.1-4.1l4.3-4.3 c0.5-0.5,0.5-1.2,0.1-1.7c-0.5-0.5-1.2-0.5-1.7-0.1c0,0,0,0-0.1,0.1l-4.3,4.3l-4.1-4.1l4.3-4.3c0.5-0.5,0.4-1.3-0.1-1.7 c-0.5-0.4-1.2-0.4-1.7,0l-4.3,4.3l-2.2-2.2l-1.8,1.7l19.2,19.2c1.7,1.7,4.6,1.7,6.3,0l14.7-14.7 C191.6,141.3,191.6,138.4,189.9,136.7C189.9,136.7,189.9,136.7,189.9,136.7z" />%0A </g>%0A </g>%0A</svg>%0A`;
|
|
38
|
+
|
|
39
|
+
// packages/panel/src/panel.ts
|
|
40
|
+
var $ = (id) => document.getElementById(id);
|
|
41
|
+
var input = (id) => $(id);
|
|
42
|
+
var node = (tag, cls = "", text = "") => {
|
|
43
|
+
const element = document.createElement(tag);
|
|
44
|
+
element.className = cls;
|
|
45
|
+
element.textContent = text;
|
|
46
|
+
return element;
|
|
47
|
+
};
|
|
48
|
+
var human = (value) => value === "qa" ? "QA" : value === "inProgress" ? "Working" : value.replaceAll("_", " ").replaceAll("-", " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
49
|
+
var active = (s) => ["running", "queued", "inProgress", "cancelling"].includes(s);
|
|
50
|
+
var badge = (value) => node(
|
|
51
|
+
"span",
|
|
52
|
+
"badge " + (["completed", "pass", "passed", "approve", "succeeded", "live"].includes(value) ? "good" : active(value) ? "running" : [
|
|
53
|
+
"failed",
|
|
54
|
+
"fail",
|
|
55
|
+
"blocked",
|
|
56
|
+
"review_failed",
|
|
57
|
+
"verification_failed",
|
|
58
|
+
"outcome_unknown",
|
|
59
|
+
"unavailable"
|
|
60
|
+
].includes(value) ? "bad" : ["revise", "review_stale", "result_stale", "not_run", "cancelled"].includes(value) ? "warn" : ""),
|
|
61
|
+
human(value)
|
|
62
|
+
);
|
|
63
|
+
var empty = (message) => node("div", "empty", message);
|
|
64
|
+
var card = (title, content, subtitle) => {
|
|
65
|
+
const box = node("div", "card"), heading = node("div", "section-heading"), label = node("div");
|
|
66
|
+
label.append(node("h2", "", title));
|
|
67
|
+
if (subtitle) label.append(node("p", "subtle", subtitle));
|
|
68
|
+
heading.append(label);
|
|
69
|
+
box.append(heading, content);
|
|
70
|
+
return box;
|
|
71
|
+
};
|
|
72
|
+
var kv = (items) => {
|
|
73
|
+
const dl = node("dl");
|
|
74
|
+
for (const [key, value] of items) {
|
|
75
|
+
const row = node("div", "kv");
|
|
76
|
+
row.append(node("dt", "", key), node("dd", "", value == null ? "Not available" : String(value)));
|
|
77
|
+
dl.append(row);
|
|
78
|
+
}
|
|
79
|
+
return dl;
|
|
80
|
+
};
|
|
81
|
+
var codeDetails = (title, value) => {
|
|
82
|
+
const d = node("details");
|
|
83
|
+
d.append(node("summary", "", title), node("pre", "", JSON.stringify(value, null, 2)));
|
|
84
|
+
return d;
|
|
85
|
+
};
|
|
86
|
+
var notice = (message, error = false) => {
|
|
87
|
+
const box = $("notice");
|
|
88
|
+
box.hidden = !message;
|
|
89
|
+
box.classList.toggle("error", error);
|
|
90
|
+
box.textContent = message;
|
|
91
|
+
};
|
|
92
|
+
var launch = new URLSearchParams(location.hash.slice(1));
|
|
93
|
+
var snapshot;
|
|
94
|
+
var chosenTeam = launch.get("team") ?? void 0;
|
|
95
|
+
var busy = false;
|
|
96
|
+
var connected = false;
|
|
97
|
+
var initialized = false;
|
|
98
|
+
var sqlclDirty = false;
|
|
99
|
+
var sqlclSignature = "";
|
|
100
|
+
var preferencesDirty = false;
|
|
101
|
+
var preferencesSignature = "";
|
|
102
|
+
var bridgeProject;
|
|
103
|
+
var bridgeReady = false;
|
|
104
|
+
var requestId = 0;
|
|
105
|
+
var currentView = "overview";
|
|
106
|
+
var savedConnectionsState = "idle";
|
|
107
|
+
var savedConnectionNames = [];
|
|
108
|
+
var savedConnectionsError = "";
|
|
109
|
+
var embedded = window.parent !== window;
|
|
110
|
+
var token = launch.get("session") ?? "";
|
|
111
|
+
var pending = /* @__PURE__ */ new Map();
|
|
112
|
+
function bridge(method, params) {
|
|
113
|
+
const id = ++requestId;
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const timer = setTimeout(() => {
|
|
116
|
+
pending.delete(id);
|
|
117
|
+
reject(new Error("Codex did not answer the panel request."));
|
|
118
|
+
}, 2e4);
|
|
119
|
+
pending.set(id, { resolve, reject, timer });
|
|
120
|
+
window.parent.postMessage({ jsonrpc: "2.0", id, method, params }, "*");
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
window.addEventListener("message", (event) => {
|
|
124
|
+
if (event.source !== window.parent || !embedded || !event.data || event.data.jsonrpc !== "2.0") return;
|
|
125
|
+
const message = event.data;
|
|
126
|
+
const waiter = pending.get(message.id);
|
|
127
|
+
if (waiter) {
|
|
128
|
+
clearTimeout(waiter.timer);
|
|
129
|
+
pending.delete(message.id);
|
|
130
|
+
if (message.error) waiter.reject(new Error(String(message.error.message)));
|
|
131
|
+
else waiter.resolve(message.result);
|
|
132
|
+
}
|
|
133
|
+
if (message.method === "ui/notifications/tool-input" && typeof message.params?.arguments?.project === "string")
|
|
134
|
+
bridgeProject = message.params.arguments.project;
|
|
135
|
+
if (message.method === "ui/notifications/tool-result") {
|
|
136
|
+
const result = message.params?._meta?.["apexrest/panelResult"] ?? message.params?.structuredContent;
|
|
137
|
+
if (typeof result?.data?.project === "string") bridgeProject = result.data.project;
|
|
138
|
+
if (bridgeProject) void refresh();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
async function api(action) {
|
|
142
|
+
if (embedded) {
|
|
143
|
+
if (action?.kind === "connection" && action.password)
|
|
144
|
+
throw new Error("Enter the password in the local dashboard or use CLI --password-file.");
|
|
145
|
+
if (!bridgeReady || !bridgeProject) throw new Error("Waiting for the Codex workspace context.");
|
|
146
|
+
const response2 = await bridge("tools/call", {
|
|
147
|
+
name: action ? "apexrest_panel_action" : "apexrest_panel_status",
|
|
148
|
+
arguments: {
|
|
149
|
+
project: bridgeProject,
|
|
150
|
+
...action ? { action } : chosenTeam ? { team: chosenTeam } : {}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
const envelope = response2._meta?.["apexrest/panelResult"] ?? response2.structuredContent ?? JSON.parse(response2.content?.find((c) => c.type === "text")?.text ?? "{}");
|
|
154
|
+
if (!envelope.ok) throw new Error(envelope.summary ?? "Codex rejected this panel action.");
|
|
155
|
+
return envelope.data;
|
|
156
|
+
}
|
|
157
|
+
const response = await fetch(
|
|
158
|
+
action ? "/api/action" : "/api/status" + (chosenTeam ? "?team=" + encodeURIComponent(chosenTeam) : ""),
|
|
159
|
+
{
|
|
160
|
+
method: action ? "POST" : "GET",
|
|
161
|
+
headers: {
|
|
162
|
+
Authorization: "Bearer " + token,
|
|
163
|
+
...action ? { "Content-Type": "application/json" } : {}
|
|
164
|
+
},
|
|
165
|
+
...action ? { body: JSON.stringify(action) } : {},
|
|
166
|
+
signal: AbortSignal.timeout(action?.kind === "saved-connections" ? 6e4 : 15e3)
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
const result = await response.json();
|
|
170
|
+
if (!response.ok) throw new Error(result.summary ?? result.error ?? "The local panel request failed.");
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
function renderSavedConnections(selected = input("connection-direct").value) {
|
|
174
|
+
const select = $("connection-direct"), current = snapshot?.connections[input("connection-ref").value.trim()]?.name, selectedCurrent = !!current && selected === current, names = [
|
|
175
|
+
.../* @__PURE__ */ new Set([...savedConnectionNames, ...current ? [current] : [], ...selected ? [selected] : []])
|
|
176
|
+
];
|
|
177
|
+
const placeholder = node("option", "", "Choose a saved connection");
|
|
178
|
+
placeholder.value = "";
|
|
179
|
+
select.replaceChildren(
|
|
180
|
+
placeholder,
|
|
181
|
+
...names.map((name) => {
|
|
182
|
+
const retained = !savedConnectionNames.includes(name);
|
|
183
|
+
const label = retained && savedConnectionsState === "loaded" ? `${name} \xB7 ${name === current ? "current mapping" : "previous selection"} (not in SQLcl list)` : retained && name === current ? `${name} \xB7 current mapping` : name;
|
|
184
|
+
const option = node("option", "", label);
|
|
185
|
+
option.value = name;
|
|
186
|
+
return option;
|
|
187
|
+
})
|
|
188
|
+
);
|
|
189
|
+
select.value = selected;
|
|
190
|
+
select.disabled = savedConnectionsState === "loading";
|
|
191
|
+
const status = $("saved-connections-status");
|
|
192
|
+
status.dataset.state = savedConnectionsState;
|
|
193
|
+
status.textContent = savedConnectionsState === "loading" ? "Loading saved connections from SQLcl\u2026" : savedConnectionsState === "error" ? "Could not load saved SQLcl connections. " + savedConnectionsError + " Use Retry to try again." : savedConnectionsState === "loaded" ? savedConnectionNames.length ? `${savedConnectionNames.length} saved SQLcl connection${savedConnectionNames.length === 1 ? "" : "s"} loaded.${selectedCurrent && !savedConnectionNames.includes(current) ? " The current mapping is retained even though SQLcl did not list it." : ""}` : "No saved SQLcl connections found. Save a direct connection in SQLcl, then refresh." + (selectedCurrent ? " The current mapping is retained." : "") : snapshot && !snapshot.trusted ? "Trust this project before loading saved SQLcl connections." : "Saved connections load when you open Direct connection settings.";
|
|
194
|
+
$("saved-connections-refresh").textContent = savedConnectionsState === "loading" ? "Loading\u2026" : savedConnectionsState === "error" ? "Retry" : savedConnectionsState === "idle" ? "Load saved connections" : "Refresh saved connections";
|
|
195
|
+
controls();
|
|
196
|
+
}
|
|
197
|
+
async function loadSavedConnections(force = false) {
|
|
198
|
+
if (!connected || !snapshot?.trusted || busy || savedConnectionsState === "loading" || !force && savedConnectionsState === "loaded")
|
|
199
|
+
return;
|
|
200
|
+
savedConnectionsState = "loading";
|
|
201
|
+
savedConnectionsError = "";
|
|
202
|
+
renderSavedConnections();
|
|
203
|
+
try {
|
|
204
|
+
const result = await api({ kind: "saved-connections" });
|
|
205
|
+
if (result.source !== "sqlcl-store" || !Array.isArray(result.connections) || result.connections.some((connection) => typeof connection?.name !== "string" || !connection.name))
|
|
206
|
+
throw new Error("SQLcl returned an invalid connection list.");
|
|
207
|
+
savedConnectionNames = result.connections.map((connection) => connection.name);
|
|
208
|
+
savedConnectionsState = "loaded";
|
|
209
|
+
} catch (error) {
|
|
210
|
+
savedConnectionsState = "error";
|
|
211
|
+
savedConnectionsError = error instanceof Error ? error.message : String(error);
|
|
212
|
+
}
|
|
213
|
+
renderSavedConnections();
|
|
214
|
+
}
|
|
215
|
+
function controls() {
|
|
216
|
+
const canAct = connected && !!snapshot?.trusted && !busy;
|
|
217
|
+
for (const id of ["new-task", "validate", "run-tests", "plan"])
|
|
218
|
+
$(id).disabled = !canAct || !snapshot?.configured;
|
|
219
|
+
for (const form of ["sqlcl-form", "connection-form", "preferences-form", "task-form"])
|
|
220
|
+
$(form).querySelectorAll("button[type=submit]").forEach((button) => {
|
|
221
|
+
button.disabled = !canAct;
|
|
222
|
+
});
|
|
223
|
+
$("saved-connections-refresh").disabled = !canAct || savedConnectionsState === "loading";
|
|
224
|
+
$("connection-save").disabled = !canAct || input("sqlcl-transport").value === "direct" && savedConnectionsState === "loading";
|
|
225
|
+
$("message-form").querySelectorAll("button").forEach((b) => {
|
|
226
|
+
b.disabled = !canAct || !snapshot?.team || !active(snapshot.team.status);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async function act(action) {
|
|
230
|
+
if (busy || !connected) return;
|
|
231
|
+
busy = true;
|
|
232
|
+
controls();
|
|
233
|
+
try {
|
|
234
|
+
const result = await api(action);
|
|
235
|
+
if (action.kind === "start" && result.teamId) {
|
|
236
|
+
chosenTeam = result.teamId;
|
|
237
|
+
$("task-dialog").close();
|
|
238
|
+
view("team");
|
|
239
|
+
}
|
|
240
|
+
notice(
|
|
241
|
+
result.executionHost === "current_session" ? "Continue this task in your current Codex chat. No background agent was started." : ["sqlcl", "connection", "preferences"].includes(action.kind) ? "Settings saved for future runs." : action.kind === "message" ? "Task update queued for the active workflow." : action.kind.startsWith("cancel") ? "Stop requested. Existing changes are not rolled back." : "Operation accepted. Follow its actual status below."
|
|
242
|
+
);
|
|
243
|
+
if (action.kind === "message") input("message").value = "";
|
|
244
|
+
if (action.kind === "preferences") preferencesDirty = false;
|
|
245
|
+
if (action.kind === "sqlcl") sqlclDirty = false;
|
|
246
|
+
if (action.kind === "connection") input("connection-ords-password").value = "";
|
|
247
|
+
await refresh();
|
|
248
|
+
} catch (error) {
|
|
249
|
+
notice(error instanceof Error ? error.message : String(error), true);
|
|
250
|
+
} finally {
|
|
251
|
+
busy = false;
|
|
252
|
+
controls();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
var rendered = /* @__PURE__ */ new Map();
|
|
256
|
+
function draw(id, data, render2) {
|
|
257
|
+
const key = JSON.stringify(data);
|
|
258
|
+
if (rendered.get(id) === key) return;
|
|
259
|
+
if ($(id).contains(document.activeElement) && document.activeElement !== document.body) return;
|
|
260
|
+
$(id).replaceChildren(...render2());
|
|
261
|
+
rendered.set(id, key);
|
|
262
|
+
}
|
|
263
|
+
function pipeline(data) {
|
|
264
|
+
const team = data.team, box = node("div");
|
|
265
|
+
if (!team) {
|
|
266
|
+
box.append(empty("No run yet. Start a task to follow its agents, tools and verification here."));
|
|
267
|
+
return card("Development workflow", box);
|
|
268
|
+
}
|
|
269
|
+
const head = node("div", "section-heading");
|
|
270
|
+
if (data.task) box.append(node("p", "task-summary", data.task));
|
|
271
|
+
if (team.executionHost === "current_session") {
|
|
272
|
+
box.append(
|
|
273
|
+
node(
|
|
274
|
+
"p",
|
|
275
|
+
"",
|
|
276
|
+
"Continue in your current Codex chat. This is a task receipt, not a completed result. Progress, verification, steering and cancellation stay in that conversation."
|
|
277
|
+
)
|
|
278
|
+
);
|
|
279
|
+
return card("Current Codex session", box);
|
|
280
|
+
}
|
|
281
|
+
head.append(node("h3", "", "Revision " + team.revision), badge(team.status));
|
|
282
|
+
box.append(head);
|
|
283
|
+
if (team.modelPolicy)
|
|
284
|
+
box.append(
|
|
285
|
+
node(
|
|
286
|
+
"p",
|
|
287
|
+
"subtle",
|
|
288
|
+
"Auto models \xB7 " + team.modelPolicy.complexity + " task \xB7 " + team.modelPolicy.reason
|
|
289
|
+
)
|
|
290
|
+
);
|
|
291
|
+
if (team.limits)
|
|
292
|
+
box.append(
|
|
293
|
+
node(
|
|
294
|
+
"p",
|
|
295
|
+
"subtle",
|
|
296
|
+
"Task time limit: " + team.limits.timeoutSeconds + " seconds. Token counts are cumulative, including cached input; they are not a cost estimate."
|
|
297
|
+
)
|
|
298
|
+
);
|
|
299
|
+
const stages = team.executionMode === "single" ? ["planning", "development", "verification"] : ["planning", "development", "code_review", "qa", "final_review"], index = stages.indexOf(team.phase);
|
|
300
|
+
const bar = node("div", "steps");
|
|
301
|
+
stages.forEach(
|
|
302
|
+
(phase, i) => bar.append(
|
|
303
|
+
node(
|
|
304
|
+
"div",
|
|
305
|
+
"step " + (team.status === "completed" || i < index ? "done" : i === index ? "active" : ""),
|
|
306
|
+
human(phase)
|
|
307
|
+
)
|
|
308
|
+
)
|
|
309
|
+
);
|
|
310
|
+
box.append(bar);
|
|
311
|
+
const agents = node("div", "agents");
|
|
312
|
+
for (const member of team.members) {
|
|
313
|
+
const cell = node("article", "agent"), title = node("div", "agent-title"), label = node("h3"), avatar = node("img", "avatar"), identity = teamIdentities[member.role];
|
|
314
|
+
avatar.src = avatars[member.role];
|
|
315
|
+
avatar.alt = identity.name;
|
|
316
|
+
avatar.width = 64;
|
|
317
|
+
avatar.height = 64;
|
|
318
|
+
label.append(
|
|
319
|
+
node("span", "", member.name ?? identity.name),
|
|
320
|
+
node("small", "subtle", team.executionMode === "single" ? "Single agent" : identity.label)
|
|
321
|
+
);
|
|
322
|
+
title.append(avatar);
|
|
323
|
+
title.append(label);
|
|
324
|
+
cell.append(
|
|
325
|
+
title,
|
|
326
|
+
badge(member.status),
|
|
327
|
+
node(
|
|
328
|
+
"p",
|
|
329
|
+
"agent-action",
|
|
330
|
+
member.currentAction?.title ?? (member.status === "completed" ? "Assigned step completed" : member.status === "inProgress" ? "Working on the current phase" : "Waiting for the scheduled step")
|
|
331
|
+
)
|
|
332
|
+
);
|
|
333
|
+
const meta = node("div", "agent-meta");
|
|
334
|
+
meta.append(
|
|
335
|
+
node("span", "", member.configuration?.model ?? "Model not reported"),
|
|
336
|
+
node(
|
|
337
|
+
"span",
|
|
338
|
+
"",
|
|
339
|
+
[
|
|
340
|
+
member.configuration?.reasoningEffort,
|
|
341
|
+
member.configuration?.sandbox,
|
|
342
|
+
member.totalTokens == null ? "" : member.totalTokens.toLocaleString() + " cumulative tokens"
|
|
343
|
+
].filter(Boolean).join(" \xB7 ")
|
|
344
|
+
)
|
|
345
|
+
);
|
|
346
|
+
if (member.selection)
|
|
347
|
+
meta.append(node("span", "", "Auto \xB7 " + member.selection.tier + " \xB7 " + member.selection.reason));
|
|
348
|
+
if (member.tokenUsage)
|
|
349
|
+
meta.append(
|
|
350
|
+
node(
|
|
351
|
+
"span",
|
|
352
|
+
"",
|
|
353
|
+
[
|
|
354
|
+
member.tokenUsage.inputTokens == null ? "" : "Input " + member.tokenUsage.inputTokens.toLocaleString(),
|
|
355
|
+
member.tokenUsage.cachedInputTokens == null ? "" : "Cached input " + member.tokenUsage.cachedInputTokens.toLocaleString(),
|
|
356
|
+
member.tokenUsage.outputTokens == null ? "" : "Output " + member.tokenUsage.outputTokens.toLocaleString(),
|
|
357
|
+
member.tokenUsage.reasoningOutputTokens == null ? "" : "Reasoning output " + member.tokenUsage.reasoningOutputTokens.toLocaleString()
|
|
358
|
+
].filter(Boolean).join(" \xB7 ")
|
|
359
|
+
)
|
|
360
|
+
);
|
|
361
|
+
cell.append(meta);
|
|
362
|
+
agents.append(cell);
|
|
363
|
+
}
|
|
364
|
+
box.append(agents);
|
|
365
|
+
if (team.diagnostics.length) box.append(node("p", "notice error", team.diagnostics.join("\n")));
|
|
366
|
+
if (team.result) box.append(node("p", "notice", team.result));
|
|
367
|
+
return card(
|
|
368
|
+
"Development workflow",
|
|
369
|
+
box,
|
|
370
|
+
(team.executionMode === "single" ? "Single agent \xB7 implementation and self-verification" : "Agent team \xB7 mandatory manager and QA reviews") + " \xB7 Browser: " + (team.browserMode === "external" ? "External" : "Codex in-app")
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
function reviews(data) {
|
|
374
|
+
const box = node("div"), team = data.team;
|
|
375
|
+
if (team?.executionMode === "single")
|
|
376
|
+
box.append(
|
|
377
|
+
node(
|
|
378
|
+
"p",
|
|
379
|
+
"subtle",
|
|
380
|
+
"Checks performed by the implementation agent. Independent manager review and QA are not part of this run."
|
|
381
|
+
)
|
|
382
|
+
);
|
|
383
|
+
if (!team?.reviews.length && !team?.qa.length && !team?.verification?.length)
|
|
384
|
+
box.append(empty("Review evidence appears after development."));
|
|
385
|
+
for (const item of team?.reviews ?? []) {
|
|
386
|
+
const row = node("div", "review"), head = node("div", "section-heading");
|
|
387
|
+
head.append(
|
|
388
|
+
node("h3", "", human(item.phase) + " \xB7 revision " + item.revision),
|
|
389
|
+
badge(item.report.decision)
|
|
390
|
+
);
|
|
391
|
+
row.append(head, node("p", "", item.report.summary));
|
|
392
|
+
const list = node("ul");
|
|
393
|
+
item.report.findings.forEach((finding) => list.append(node("li", "", finding)));
|
|
394
|
+
if (list.childNodes.length) row.append(list);
|
|
395
|
+
box.append(row);
|
|
396
|
+
}
|
|
397
|
+
for (const item of team?.executionMode === "single" ? team.verification ?? [] : team?.qa ?? []) {
|
|
398
|
+
const row = node("div", "review"), head = node("div", "section-heading");
|
|
399
|
+
head.append(
|
|
400
|
+
node(
|
|
401
|
+
"h3",
|
|
402
|
+
"",
|
|
403
|
+
(team?.executionMode === "single" ? "Agent verification \xB7 revision " : "Independent QA \xB7 revision ") + item.revision
|
|
404
|
+
),
|
|
405
|
+
badge(item.report.decision)
|
|
406
|
+
);
|
|
407
|
+
row.append(head, node("p", "", item.report.summary));
|
|
408
|
+
for (const check of item.report.checks) {
|
|
409
|
+
const checkRow = node("div", "review");
|
|
410
|
+
checkRow.append(badge(check.status), node("p", "", check.name), node("p", "subtle", check.evidence));
|
|
411
|
+
row.append(checkRow);
|
|
412
|
+
}
|
|
413
|
+
box.append(row);
|
|
414
|
+
}
|
|
415
|
+
return card("Reviews & verification", box);
|
|
416
|
+
}
|
|
417
|
+
function activity(data) {
|
|
418
|
+
const box = node("div"), records = data.team?.observations ?? [];
|
|
419
|
+
if (!records.length) box.append(empty("Observed tool activity will appear here."));
|
|
420
|
+
for (const item of [...records].reverse()) {
|
|
421
|
+
const row = node("div", "activity");
|
|
422
|
+
row.append(
|
|
423
|
+
node("h3", "", teamLabel(item.role) + " \xB7 " + human(item.kind)),
|
|
424
|
+
node("span", "subtle", "Revision " + item.revision + " \xB7 " + human(item.phase)),
|
|
425
|
+
node("p", "", item.detail)
|
|
426
|
+
);
|
|
427
|
+
box.append(row);
|
|
428
|
+
}
|
|
429
|
+
return card("Observed activity", box, "From Codex events, not estimated progress");
|
|
430
|
+
}
|
|
431
|
+
function messages(data) {
|
|
432
|
+
const box = node("div");
|
|
433
|
+
if (!data.team?.messages.length) box.append(empty("Task updates and agent messages will appear here."));
|
|
434
|
+
for (const message of data.team?.messages ?? []) {
|
|
435
|
+
const row = node("div", "activity");
|
|
436
|
+
row.append(
|
|
437
|
+
node("h3", "", teamLabel(message.from) + " \u2192 " + teamLabel(message.to)),
|
|
438
|
+
badge(message.status),
|
|
439
|
+
node("p", "", message.text)
|
|
440
|
+
);
|
|
441
|
+
box.append(row);
|
|
442
|
+
}
|
|
443
|
+
return card("Communication", box);
|
|
444
|
+
}
|
|
445
|
+
function operations(data) {
|
|
446
|
+
const box = node("div", "table-wrap");
|
|
447
|
+
if (!data.jobs.length) box.append(empty("No APEX operation jobs recorded for this project."));
|
|
448
|
+
else {
|
|
449
|
+
const table = node("table"), head = node("tr");
|
|
450
|
+
["Operation", "Status", "Result", ""].forEach((s) => head.append(node("th", "", s)));
|
|
451
|
+
const thead = node("thead");
|
|
452
|
+
thead.append(head);
|
|
453
|
+
table.append(thead);
|
|
454
|
+
const body = node("tbody");
|
|
455
|
+
for (const job of data.jobs) {
|
|
456
|
+
const row = node("tr"), state = node("td"), summary = node("td"), action = node("td");
|
|
457
|
+
state.append(badge(job.status));
|
|
458
|
+
summary.append(node("p", "", job.summary || "Awaiting a result"));
|
|
459
|
+
if (job.diagnostics.length || job.artifacts.length)
|
|
460
|
+
summary.append(
|
|
461
|
+
codeDetails("Diagnostics & artifacts", { diagnostics: job.diagnostics, artifacts: job.artifacts })
|
|
462
|
+
);
|
|
463
|
+
if (active(job.status)) {
|
|
464
|
+
const stop = node("button", "danger", "Stop");
|
|
465
|
+
stop.disabled = !connected || busy || !data.trusted;
|
|
466
|
+
stop.onclick = () => {
|
|
467
|
+
void act({ kind: "cancel-job", id: job.id });
|
|
468
|
+
};
|
|
469
|
+
action.append(stop);
|
|
470
|
+
}
|
|
471
|
+
row.append(node("td", "", job.operation), state, summary, action);
|
|
472
|
+
body.append(row);
|
|
473
|
+
}
|
|
474
|
+
table.append(body);
|
|
475
|
+
box.append(table);
|
|
476
|
+
}
|
|
477
|
+
const output = [card("Operation jobs", box, "Compile, export, tests and deployment work")];
|
|
478
|
+
const deployments = node("div");
|
|
479
|
+
if (!data.deployments.length) deployments.append(empty("No deployment runs recorded."));
|
|
480
|
+
for (const deployment of data.deployments) {
|
|
481
|
+
const row = node("div", "review");
|
|
482
|
+
row.append(
|
|
483
|
+
badge(deployment.status),
|
|
484
|
+
node("p", "subtle", new Date(deployment.at).toLocaleString()),
|
|
485
|
+
node("pre", "", deployment.details)
|
|
486
|
+
);
|
|
487
|
+
deployments.append(row);
|
|
488
|
+
}
|
|
489
|
+
output.push(
|
|
490
|
+
card(
|
|
491
|
+
"Deployment & import journal",
|
|
492
|
+
deployments,
|
|
493
|
+
"Actual durable runtime state; an unknown outcome remains unknown"
|
|
494
|
+
)
|
|
495
|
+
);
|
|
496
|
+
return output;
|
|
497
|
+
}
|
|
498
|
+
function render(data) {
|
|
499
|
+
const connectionsChanged = JSON.stringify(snapshot?.connections) !== JSON.stringify(data.connections);
|
|
500
|
+
snapshot = data;
|
|
501
|
+
connected = true;
|
|
502
|
+
$("project-name").textContent = data.configuration?.application.alias ?? "Unconfigured workspace";
|
|
503
|
+
$("project-path").textContent = data.project;
|
|
504
|
+
$("version").textContent = data.version;
|
|
505
|
+
$("connection").className = "badge good";
|
|
506
|
+
$("connection").textContent = "Live";
|
|
507
|
+
$("updated").textContent = "Updated " + new Date(data.updatedAt).toLocaleTimeString();
|
|
508
|
+
$("connection-error").hidden = true;
|
|
509
|
+
document.body.dataset.disconnected = "false";
|
|
510
|
+
const nextPreferences = JSON.stringify(data.preferences);
|
|
511
|
+
const nextSqlcl = JSON.stringify(data.sqlcl);
|
|
512
|
+
if (!sqlclDirty && nextSqlcl !== sqlclSignature) {
|
|
513
|
+
input("sqlcl-mode").value = data.sqlcl.mode;
|
|
514
|
+
input("sqlcl-level").value = data.sqlcl.mcpRestrictLevel;
|
|
515
|
+
input("sqlcl-transport").value = data.sqlcl.databaseTransport ?? "direct";
|
|
516
|
+
sqlclControls();
|
|
517
|
+
sqlclSignature = nextSqlcl;
|
|
518
|
+
}
|
|
519
|
+
if (!preferencesDirty && nextPreferences !== preferencesSignature) {
|
|
520
|
+
for (const prefix of ["default", "task"]) {
|
|
521
|
+
input(prefix + "-execution-mode").value = data.preferences.executionMode;
|
|
522
|
+
input(prefix + "-browser-mode").value = data.preferences.browserMode;
|
|
523
|
+
input(prefix + "-developers").value = String(data.preferences.developers);
|
|
524
|
+
modeControls(prefix);
|
|
525
|
+
input(prefix + "-sandbox").value = data.preferences.sandbox;
|
|
526
|
+
input(prefix + "-timeout").value = String(data.preferences.timeoutSeconds);
|
|
527
|
+
}
|
|
528
|
+
preferencesSignature = nextPreferences;
|
|
529
|
+
}
|
|
530
|
+
if (!initialized) {
|
|
531
|
+
initialized = true;
|
|
532
|
+
if (embedded) {
|
|
533
|
+
input("connection-ords-password").disabled = true;
|
|
534
|
+
$("connection-password-note").textContent = "Set the password in the local dashboard opened by apexrest panel open, or use CLI --password-file. Passwords are never sent through the embedded Codex panel.";
|
|
535
|
+
}
|
|
536
|
+
const environment = $("environment");
|
|
537
|
+
for (const [name, env] of Object.entries(data.configuration?.environments ?? {})) {
|
|
538
|
+
const option = node("option", "", name + " \xB7 " + env.kind);
|
|
539
|
+
option.value = name;
|
|
540
|
+
environment.append(option);
|
|
541
|
+
}
|
|
542
|
+
if (!data.configured)
|
|
543
|
+
notice(
|
|
544
|
+
"This folder has no apexrest.json. Initialize or open an APEXREST application project to run development tasks."
|
|
545
|
+
);
|
|
546
|
+
else if (!data.trusted)
|
|
547
|
+
notice(
|
|
548
|
+
"This project is not trusted in APEXREST. The panel can display its state; actions require the existing project trust setup."
|
|
549
|
+
);
|
|
550
|
+
}
|
|
551
|
+
draw(
|
|
552
|
+
"connection-refs",
|
|
553
|
+
[data.connections, data.configuration?.environments],
|
|
554
|
+
() => Array.from(
|
|
555
|
+
/* @__PURE__ */ new Set([
|
|
556
|
+
...Object.keys(data.connections),
|
|
557
|
+
...Object.values(data.configuration?.environments ?? {}).flatMap((env) => [
|
|
558
|
+
env.readConnectionRef,
|
|
559
|
+
env.deployConnectionRef
|
|
560
|
+
])
|
|
561
|
+
])
|
|
562
|
+
).map((name) => {
|
|
563
|
+
const option = node("option");
|
|
564
|
+
option.value = name;
|
|
565
|
+
return option;
|
|
566
|
+
})
|
|
567
|
+
);
|
|
568
|
+
const teamSelect = $("team-select");
|
|
569
|
+
if (document.activeElement !== teamSelect) {
|
|
570
|
+
const options = data.teams.map((team) => {
|
|
571
|
+
const option = node(
|
|
572
|
+
"option",
|
|
573
|
+
"",
|
|
574
|
+
human(team.status) + " \xB7 revision " + team.revision + " \xB7 " + new Date(team.updatedAt).toLocaleTimeString()
|
|
575
|
+
);
|
|
576
|
+
option.value = team.id;
|
|
577
|
+
return option;
|
|
578
|
+
});
|
|
579
|
+
teamSelect.replaceChildren(...options);
|
|
580
|
+
teamSelect.value = data.team?.id ?? "";
|
|
581
|
+
teamSelect.disabled = !options.length;
|
|
582
|
+
}
|
|
583
|
+
draw(
|
|
584
|
+
"metrics",
|
|
585
|
+
[
|
|
586
|
+
data.teams,
|
|
587
|
+
data.sqlcl,
|
|
588
|
+
data.jobs,
|
|
589
|
+
data.team?.status,
|
|
590
|
+
data.team?.executionMode,
|
|
591
|
+
data.preferences.executionMode
|
|
592
|
+
],
|
|
593
|
+
() => [
|
|
594
|
+
[
|
|
595
|
+
"Active runs",
|
|
596
|
+
String(data.teams.filter((team) => active(team.status)).length),
|
|
597
|
+
data.team ? human(data.team.phase) : "Ready for a new task"
|
|
598
|
+
],
|
|
599
|
+
[
|
|
600
|
+
(data.team?.executionMode ?? data.preferences.executionMode) === "single" ? "Verification" : "Review gate",
|
|
601
|
+
data.team ? human(data.team.status) : "No result",
|
|
602
|
+
(data.team?.executionMode ?? data.preferences.executionMode) === "single" ? "Single-agent checks" : "Manager + independent QA"
|
|
603
|
+
],
|
|
604
|
+
[
|
|
605
|
+
"APEX operations",
|
|
606
|
+
String(data.jobs.filter((job) => active(job.status)).length),
|
|
607
|
+
"Running or queued"
|
|
608
|
+
],
|
|
609
|
+
[
|
|
610
|
+
"Database connectivity",
|
|
611
|
+
data.sqlcl.databaseTransport === "ords" ? "ORDS HTTP(S)" : "Direct Oracle",
|
|
612
|
+
data.sqlcl.mode === "mcp" ? "SQLcl MCP \xB7 restriction " + data.sqlcl.mcpRestrictLevel : "SQLcl CLI"
|
|
613
|
+
]
|
|
614
|
+
].map(([label, value, sub]) => {
|
|
615
|
+
const box = node("div", "metric");
|
|
616
|
+
box.append(node("div", "subtle", label), node("div", "value", value), node("div", "subtle", sub));
|
|
617
|
+
return box;
|
|
618
|
+
})
|
|
619
|
+
);
|
|
620
|
+
const stableTeam = data.team ? { ...data.team, updatedAt: "" } : null;
|
|
621
|
+
draw("overview-live", [stableTeam, data.changes, data.configuration, data.trusted], () => {
|
|
622
|
+
const columns = node("div", "two-columns"), changeBox = node("div");
|
|
623
|
+
changeBox.append(
|
|
624
|
+
data.changes.files.length ? node("pre", "", data.changes.files.join("\n")) : empty(
|
|
625
|
+
data.changes.status === "available" ? "No uncommitted Git changes." : "Git status is unavailable for this folder."
|
|
626
|
+
)
|
|
627
|
+
);
|
|
628
|
+
columns.append(
|
|
629
|
+
card(
|
|
630
|
+
"Project context",
|
|
631
|
+
kv([
|
|
632
|
+
["Application", data.configuration?.application.alias],
|
|
633
|
+
["Source", data.configuration?.application.sourceDir],
|
|
634
|
+
[
|
|
635
|
+
"Environments",
|
|
636
|
+
Object.keys(data.configuration?.environments ?? {}).join(", ") || "None configured"
|
|
637
|
+
],
|
|
638
|
+
["Required suites", data.configuration?.tests.requiredSuites.join(", ") || "None declared"],
|
|
639
|
+
["Trust", data.trusted ? "Trusted project" : "Not granted"]
|
|
640
|
+
])
|
|
641
|
+
),
|
|
642
|
+
card("Working changes", changeBox)
|
|
643
|
+
);
|
|
644
|
+
return [pipeline(data), columns, activity(data)];
|
|
645
|
+
});
|
|
646
|
+
draw("team-live", stableTeam, () => {
|
|
647
|
+
const columns = node("div", "two-columns");
|
|
648
|
+
columns.append(reviews(data), messages(data));
|
|
649
|
+
return [pipeline(data), columns, activity(data)];
|
|
650
|
+
});
|
|
651
|
+
draw("operations-live", [data.jobs, data.deployments, busy], () => operations(data));
|
|
652
|
+
draw(
|
|
653
|
+
"settings-live",
|
|
654
|
+
[
|
|
655
|
+
data.preferences,
|
|
656
|
+
data.configuration,
|
|
657
|
+
data.connections,
|
|
658
|
+
data.toolchain,
|
|
659
|
+
data.permissions,
|
|
660
|
+
stableTeam?.members.map((m) => m.configuration)
|
|
661
|
+
],
|
|
662
|
+
() => {
|
|
663
|
+
const box = node("div");
|
|
664
|
+
box.append(
|
|
665
|
+
card(
|
|
666
|
+
"Project & target settings",
|
|
667
|
+
kv([
|
|
668
|
+
["Project", data.project],
|
|
669
|
+
["Source directory", data.configuration?.application.sourceDir],
|
|
670
|
+
["Artifacts", data.configuration?.artifacts.directory],
|
|
671
|
+
[
|
|
672
|
+
"Artifact retention",
|
|
673
|
+
data.configuration ? data.configuration.artifacts.retentionDays + " days" : null
|
|
674
|
+
],
|
|
675
|
+
["Required suites", data.configuration?.tests.requiredSuites.join(", ") || "None declared"],
|
|
676
|
+
["Automated browser", data.configuration?.tests.defaultBrowser],
|
|
677
|
+
[
|
|
678
|
+
"Verification browser",
|
|
679
|
+
data.preferences.browserMode === "external" ? "External system browser" : "Codex in-app browser"
|
|
680
|
+
],
|
|
681
|
+
["Execution mode", data.preferences.executionMode === "single" ? "Single agent" : "Agent team"],
|
|
682
|
+
["Active deploy/test grants", data.permissions.activeGrants.length]
|
|
683
|
+
])
|
|
684
|
+
)
|
|
685
|
+
);
|
|
686
|
+
for (const [name, env] of Object.entries(data.configuration?.environments ?? {}))
|
|
687
|
+
box.append(
|
|
688
|
+
card(
|
|
689
|
+
name + " \xB7 " + human(env.kind),
|
|
690
|
+
kv([
|
|
691
|
+
["Application ID", env.applicationId],
|
|
692
|
+
["Workspace", env.workspace],
|
|
693
|
+
["Parsing schema", env.parsingSchema],
|
|
694
|
+
["Database", env.databaseIdentity.dbUniqueName],
|
|
695
|
+
["Service", env.databaseIdentity.serviceName],
|
|
696
|
+
["Read connection", env.readConnectionRef],
|
|
697
|
+
["Deploy connection", env.deployConnectionRef],
|
|
698
|
+
["Control mode", env.deploymentControl ?? "local"],
|
|
699
|
+
["Application URL", env.baseUrl]
|
|
700
|
+
])
|
|
701
|
+
)
|
|
702
|
+
);
|
|
703
|
+
box.append(
|
|
704
|
+
card(
|
|
705
|
+
"Configuration details",
|
|
706
|
+
codeDetails("Project, toolchain and connection references", {
|
|
707
|
+
configuration: data.configuration,
|
|
708
|
+
toolchain: data.toolchain,
|
|
709
|
+
connectionReferences: data.connections,
|
|
710
|
+
authorization: data.permissions
|
|
711
|
+
})
|
|
712
|
+
)
|
|
713
|
+
);
|
|
714
|
+
return [box];
|
|
715
|
+
}
|
|
716
|
+
);
|
|
717
|
+
if (connectionsChanged) renderSavedConnections();
|
|
718
|
+
controls();
|
|
719
|
+
if (currentView === "settings" && input("sqlcl-transport").value === "direct" && savedConnectionsState === "idle")
|
|
720
|
+
void loadSavedConnections();
|
|
721
|
+
}
|
|
722
|
+
var refreshing = false;
|
|
723
|
+
async function refresh() {
|
|
724
|
+
if (refreshing) return;
|
|
725
|
+
refreshing = true;
|
|
726
|
+
try {
|
|
727
|
+
render(await api());
|
|
728
|
+
} catch (error) {
|
|
729
|
+
connected = false;
|
|
730
|
+
$("connection").textContent = "Disconnected";
|
|
731
|
+
$("connection").className = "badge bad";
|
|
732
|
+
$("connection-error").hidden = false;
|
|
733
|
+
$("connection-error").textContent = (error instanceof Error ? error.message : String(error)) + (snapshot ? " Showing the last received state." : "");
|
|
734
|
+
document.body.dataset.disconnected = "true";
|
|
735
|
+
controls();
|
|
736
|
+
} finally {
|
|
737
|
+
refreshing = false;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
var views = {
|
|
741
|
+
overview: ["Workspace overview", "Your team, settings and APEX work in one place."],
|
|
742
|
+
team: ["Agents", "Follow implementation, communication and verification."],
|
|
743
|
+
operations: ["APEX operations", "Compile, verify and follow deployment state."],
|
|
744
|
+
settings: ["Workspace settings", "Inspect effective configuration and choose defaults for future work."]
|
|
745
|
+
};
|
|
746
|
+
function view(name) {
|
|
747
|
+
currentView = name;
|
|
748
|
+
document.querySelectorAll("[data-page]").forEach((page) => {
|
|
749
|
+
page.hidden = page.dataset.page !== name;
|
|
750
|
+
});
|
|
751
|
+
document.querySelectorAll("[data-view]").forEach((button) => {
|
|
752
|
+
if (button.dataset.view === name) button.setAttribute("aria-current", "page");
|
|
753
|
+
else button.removeAttribute("aria-current");
|
|
754
|
+
});
|
|
755
|
+
const titles = views[name];
|
|
756
|
+
$("view-title").textContent = titles[0];
|
|
757
|
+
$("view-subtitle").textContent = titles[1];
|
|
758
|
+
if (name === "settings" && input("sqlcl-transport").value === "direct") void loadSavedConnections();
|
|
759
|
+
}
|
|
760
|
+
document.querySelectorAll("[data-view]").forEach((button) => {
|
|
761
|
+
button.onclick = () => view(button.dataset.view);
|
|
762
|
+
});
|
|
763
|
+
$("refresh").onclick = () => {
|
|
764
|
+
void refresh();
|
|
765
|
+
};
|
|
766
|
+
$("new-task").onclick = () => {
|
|
767
|
+
if (snapshot) {
|
|
768
|
+
input("task-execution-mode").value = snapshot.preferences.executionMode;
|
|
769
|
+
input("task-browser-mode").value = snapshot.preferences.browserMode;
|
|
770
|
+
input("task-developers").value = String(snapshot.preferences.developers);
|
|
771
|
+
modeControls("task");
|
|
772
|
+
input("task-sandbox").value = snapshot.preferences.sandbox;
|
|
773
|
+
input("task-timeout").value = String(snapshot.preferences.timeoutSeconds);
|
|
774
|
+
}
|
|
775
|
+
$("task-dialog").showModal();
|
|
776
|
+
input("task").focus();
|
|
777
|
+
};
|
|
778
|
+
$("close-task").onclick = () => $("task-dialog").close();
|
|
779
|
+
$("team-select").onchange = () => {
|
|
780
|
+
chosenTeam = input("team-select").value || void 0;
|
|
781
|
+
void refresh();
|
|
782
|
+
};
|
|
783
|
+
$("task-form").onsubmit = (event) => {
|
|
784
|
+
event.preventDefault();
|
|
785
|
+
void act({
|
|
786
|
+
kind: "start",
|
|
787
|
+
request: {
|
|
788
|
+
task: input("task").value,
|
|
789
|
+
executionMode: input("task-execution-mode").value,
|
|
790
|
+
browserMode: input("task-browser-mode").value,
|
|
791
|
+
developers: Number(input("task-developers").value),
|
|
792
|
+
sandbox: input("task-sandbox").value,
|
|
793
|
+
timeoutSeconds: Number(input("task-timeout").value)
|
|
794
|
+
}
|
|
795
|
+
});
|
|
796
|
+
};
|
|
797
|
+
function modeControls(prefix) {
|
|
798
|
+
if (prefix === "task") {
|
|
799
|
+
const teamOption = $("task-execution-mode").querySelector("option[value=team]");
|
|
800
|
+
teamOption.disabled = !snapshot?.preferences.multiAgentEnabled;
|
|
801
|
+
if (teamOption.disabled) input("task-execution-mode").value = "single";
|
|
802
|
+
}
|
|
803
|
+
const single = input(prefix + "-execution-mode").value === "single";
|
|
804
|
+
input(prefix + "-developers").disabled = single;
|
|
805
|
+
if (prefix === "task")
|
|
806
|
+
input("task-developers").value = single ? "1" : String(snapshot?.preferences.developers ?? 1);
|
|
807
|
+
$(prefix + "-workflow-note").textContent = single ? "Single agent uses your current Codex chat. No new agent starts. Continue tasks and view results in that conversation." : "Plan \u2192 developers \u2192 manager review \u2192 independent QA \u2192 final manager review. Reviewers remain read only.";
|
|
808
|
+
}
|
|
809
|
+
for (const prefix of ["default", "task"])
|
|
810
|
+
input(prefix + "-execution-mode").onchange = () => modeControls(prefix);
|
|
811
|
+
$("preferences-form").oninput = () => {
|
|
812
|
+
preferencesDirty = true;
|
|
813
|
+
};
|
|
814
|
+
$("preferences-form").onsubmit = (event) => {
|
|
815
|
+
event.preventDefault();
|
|
816
|
+
void act({
|
|
817
|
+
kind: "preferences",
|
|
818
|
+
settings: {
|
|
819
|
+
executionMode: input("default-execution-mode").value,
|
|
820
|
+
multiAgentEnabled: input("default-execution-mode").value === "team",
|
|
821
|
+
browserMode: input("default-browser-mode").value,
|
|
822
|
+
developers: Number(input("default-developers").value),
|
|
823
|
+
sandbox: input("default-sandbox").value,
|
|
824
|
+
timeoutSeconds: Number(input("default-timeout").value)
|
|
825
|
+
}
|
|
826
|
+
});
|
|
827
|
+
};
|
|
828
|
+
$("sqlcl-form").onsubmit = (event) => {
|
|
829
|
+
event.preventDefault();
|
|
830
|
+
void act({
|
|
831
|
+
kind: "sqlcl",
|
|
832
|
+
settings: {
|
|
833
|
+
schemaVersion: 1,
|
|
834
|
+
mode: input("sqlcl-mode").value,
|
|
835
|
+
mcpRestrictLevel: input("sqlcl-level").value,
|
|
836
|
+
databaseTransport: input("sqlcl-transport").value
|
|
837
|
+
}
|
|
838
|
+
});
|
|
839
|
+
};
|
|
840
|
+
function sqlclControls() {
|
|
841
|
+
const ords = input("sqlcl-transport").value === "ords";
|
|
842
|
+
if (ords) input("sqlcl-mode").value = "cli";
|
|
843
|
+
$("sqlcl-mode").querySelector("option[value=mcp]").disabled = ords;
|
|
844
|
+
input("sqlcl-level").disabled = input("sqlcl-mode").value !== "mcp";
|
|
845
|
+
$("sqlcl-transport-note").textContent = ords ? "Connect through ORDS over HTTP(S) when the Oracle listener is unavailable. Uses SQLcl CLI and the ORDS settings for each connection reference below." : "Connect through the Oracle listener using saved SQLcl connections.";
|
|
846
|
+
for (const [id, enabled] of [
|
|
847
|
+
["connection-direct-group", !ords],
|
|
848
|
+
["connection-ords-group", ords]
|
|
849
|
+
]) {
|
|
850
|
+
const group = $(id);
|
|
851
|
+
group.hidden = !enabled;
|
|
852
|
+
group.disabled = !enabled;
|
|
853
|
+
}
|
|
854
|
+
input("connection-ords-password").disabled = embedded;
|
|
855
|
+
$("connection-mode-note").textContent = ords ? "Editing ORDS HTTP(S) settings for the selected connection reference." : "Editing the direct Oracle connection for the selected connection reference.";
|
|
856
|
+
$("connection-save").textContent = ords ? "Save ORDS connection" : "Save direct connection";
|
|
857
|
+
controls();
|
|
858
|
+
}
|
|
859
|
+
$("sqlcl-form").oninput = (event) => {
|
|
860
|
+
sqlclDirty = true;
|
|
861
|
+
sqlclControls();
|
|
862
|
+
if (event.target.id === "sqlcl-transport" && input("sqlcl-transport").value === "direct" && currentView === "settings")
|
|
863
|
+
void loadSavedConnections();
|
|
864
|
+
};
|
|
865
|
+
$("saved-connections-refresh").onclick = () => {
|
|
866
|
+
void loadSavedConnections(true);
|
|
867
|
+
};
|
|
868
|
+
input("connection-direct").onchange = () => renderSavedConnections();
|
|
869
|
+
input("connection-ref").onchange = () => {
|
|
870
|
+
const connection = snapshot?.connections[input("connection-ref").value.trim()];
|
|
871
|
+
renderSavedConnections(connection?.name ?? "");
|
|
872
|
+
input("connection-ords-url").value = connection?.ords?.url ?? "";
|
|
873
|
+
input("connection-ords-user").value = connection?.ords?.username ?? "";
|
|
874
|
+
input("connection-ords-password").value = "";
|
|
875
|
+
};
|
|
876
|
+
$("connection-form").onsubmit = (event) => {
|
|
877
|
+
event.preventDefault();
|
|
878
|
+
const ords = input("sqlcl-transport").value === "ords", sqlclName = input("connection-direct").value, ordsUrl = input("connection-ords-url").value.trim(), ordsUsername = input("connection-ords-user").value.trim(), password = input("connection-ords-password").value;
|
|
879
|
+
if (ords && embedded && password) {
|
|
880
|
+
notice("Enter the password in the local dashboard or use CLI --password-file.", true);
|
|
881
|
+
return;
|
|
882
|
+
}
|
|
883
|
+
if (!ords && !sqlclName) {
|
|
884
|
+
notice("Choose a saved SQLcl connection for this reference.", true);
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
887
|
+
if (ords && (!ordsUrl || !ordsUsername)) {
|
|
888
|
+
notice("Enter the ORDS schema URL and your database username.", true);
|
|
889
|
+
return;
|
|
890
|
+
}
|
|
891
|
+
void act({
|
|
892
|
+
kind: "connection",
|
|
893
|
+
name: input("connection-ref").value.trim(),
|
|
894
|
+
...!ords ? { sqlclName } : { ordsUrl, ordsUsername, ...password ? { password } : {} }
|
|
895
|
+
});
|
|
896
|
+
};
|
|
897
|
+
$("message-form").onsubmit = (event) => {
|
|
898
|
+
event.preventDefault();
|
|
899
|
+
if (snapshot?.team) void act({ kind: "message", id: snapshot.team.id, message: input("message").value });
|
|
900
|
+
};
|
|
901
|
+
$("cancel-team").onclick = () => {
|
|
902
|
+
if (snapshot?.team) void act({ kind: "cancel-team", id: snapshot.team.id });
|
|
903
|
+
};
|
|
904
|
+
$("validate").onclick = () => {
|
|
905
|
+
void act({ kind: "validate" });
|
|
906
|
+
};
|
|
907
|
+
$("plan").onclick = () => {
|
|
908
|
+
const env = input("environment").value;
|
|
909
|
+
if (!env) {
|
|
910
|
+
notice("Choose an explicit environment before planning a deployment.", true);
|
|
911
|
+
return;
|
|
912
|
+
}
|
|
913
|
+
void act({ kind: "plan", env });
|
|
914
|
+
};
|
|
915
|
+
$("run-tests").onclick = () => {
|
|
916
|
+
const suite = input("suite").value, env = input("environment").value;
|
|
917
|
+
if (suite !== "unit" && !env) {
|
|
918
|
+
notice("Choose an explicit environment for this test suite.", true);
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
void act({ kind: "test", suite, ...env ? { env } : {} });
|
|
922
|
+
};
|
|
923
|
+
controls();
|
|
924
|
+
if (launch.get("view") === "team") view("team");
|
|
925
|
+
var mark = document.querySelector(".brand-mark");
|
|
926
|
+
if (mark) {
|
|
927
|
+
const icon = node("img");
|
|
928
|
+
icon.src = apexrest_logo_default;
|
|
929
|
+
icon.alt = "";
|
|
930
|
+
icon.width = 38;
|
|
931
|
+
icon.height = 38;
|
|
932
|
+
mark.replaceChildren(icon);
|
|
933
|
+
}
|
|
934
|
+
if (embedded) {
|
|
935
|
+
void bridge("ui/initialize", {
|
|
936
|
+
protocolVersion: "2026-01-26",
|
|
937
|
+
appInfo: { name: "apexrest-panel", version: "1.0.0" },
|
|
938
|
+
appCapabilities: {}
|
|
939
|
+
}).then(() => {
|
|
940
|
+
bridgeReady = true;
|
|
941
|
+
window.parent.postMessage({ jsonrpc: "2.0", method: "ui/notifications/initialized", params: {} }, "*");
|
|
942
|
+
void refresh();
|
|
943
|
+
}).catch((error) => notice(String(error), true));
|
|
944
|
+
} else void refresh();
|
|
945
|
+
setInterval(() => {
|
|
946
|
+
if (!document.hidden) void refresh();
|
|
947
|
+
}, 2e3);
|
|
948
|
+
document.addEventListener("visibilitychange", () => {
|
|
949
|
+
if (!document.hidden) void refresh();
|
|
950
|
+
});
|
|
951
|
+
})();
|