apexrest 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +0 -6
- package/README.md +13 -36
- package/README.uk.md +13 -36
- package/dist/codex-compat/plugins/apexrest-apex/.codex-plugin/plugin.json +4 -4
- package/dist/codex-compat/plugins/apexrest-apex/NOTICE +0 -6
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/index.html +4 -11
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.css +4 -182
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.js +61 -383
- package/dist/codex-compat/plugins/apexrest-apex/resources/playwright/package.json +1 -1
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/operations.schema.json +0 -327
- package/dist/codex-compat/plugins/apexrest-apex/runtime/apexrest.mjs +12 -43
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-QDAKHEPF.mjs → chunk-3XRCAA5S.mjs} +4 -4
- package/dist/{runtime/chunk-HYOURJBW.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-4GIV3RLJ.mjs} +2 -2
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-RF4XQO6I.mjs → chunk-CJC3ESO4.mjs} +2 -2
- package/dist/{runtime/chunk-XKBZJ36H.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-DLUIX7FA.mjs} +20 -62
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-JWX4UQAZ.mjs → chunk-EG2NPDAF.mjs} +1 -1
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-EMRXOSVH.mjs +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-FPOEB42H.mjs → chunk-JN3KZCDI.mjs} +1 -1
- package/dist/{runtime/chunk-QLRGI23I.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-K5BV3TBZ.mjs} +9 -108
- package/dist/{runtime/chunk-QWQVXUVG.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-MNYOWIHJ.mjs} +24 -77
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-TTVGX5LP.mjs → chunk-NHYXXMBY.mjs} +21 -213
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2SZCZZ3J.mjs → chunk-R6MER5QH.mjs} +0 -1
- package/dist/{runtime/chunk-XEK2R5AU.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-SVB7G3KQ.mjs} +5 -7
- package/dist/{runtime/chunk-L7BXN3LU.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-SWW7SKB4.mjs} +19 -42
- package/dist/{runtime/chunk-KJOSAKHX.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-XZNIV6UL.mjs} +5 -6
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-DNJL7OYO.mjs → chunk-YXHLPFQX.mjs} +15 -13
- package/dist/codex-compat/plugins/apexrest-apex/runtime/mcp.mjs +7 -8
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/SKILL.md +1 -1
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/SKILL.md +0 -2
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/SKILL.md +0 -2
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/SKILL.md +13 -14
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/references/cli-catalog.md +14 -15
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/SKILL.md +4 -10
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/agents/openai.yaml +3 -3
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/SKILL.md +1 -1
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/SKILL.md +5 -8
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/agents/openai.yaml +3 -3
- package/dist/resources/panel/index.html +4 -11
- package/dist/resources/panel/panel.css +4 -182
- package/dist/resources/panel/panel.js +61 -383
- package/dist/resources/playwright/package.json +1 -1
- package/dist/resources/schemas/operations.schema.json +0 -327
- package/dist/runtime/apexrest.mjs +12 -43
- package/dist/runtime/{chunk-QDAKHEPF.mjs → chunk-3XRCAA5S.mjs} +4 -4
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-HYOURJBW.mjs → runtime/chunk-4GIV3RLJ.mjs} +2 -2
- package/dist/runtime/{chunk-RF4XQO6I.mjs → chunk-CJC3ESO4.mjs} +2 -2
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-XKBZJ36H.mjs → runtime/chunk-DLUIX7FA.mjs} +20 -62
- package/dist/runtime/{chunk-JWX4UQAZ.mjs → chunk-EG2NPDAF.mjs} +1 -1
- package/dist/runtime/chunk-EMRXOSVH.mjs +14 -0
- package/dist/runtime/{chunk-FPOEB42H.mjs → chunk-JN3KZCDI.mjs} +1 -1
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-QLRGI23I.mjs → runtime/chunk-K5BV3TBZ.mjs} +9 -108
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-QWQVXUVG.mjs → runtime/chunk-MNYOWIHJ.mjs} +24 -77
- package/dist/runtime/{chunk-TTVGX5LP.mjs → chunk-NHYXXMBY.mjs} +21 -213
- package/dist/runtime/{chunk-2SZCZZ3J.mjs → chunk-R6MER5QH.mjs} +0 -1
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-XEK2R5AU.mjs → runtime/chunk-SVB7G3KQ.mjs} +5 -7
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-L7BXN3LU.mjs → runtime/chunk-SWW7SKB4.mjs} +19 -42
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-KJOSAKHX.mjs → runtime/chunk-XZNIV6UL.mjs} +5 -6
- package/dist/runtime/{chunk-DNJL7OYO.mjs → chunk-YXHLPFQX.mjs} +15 -13
- package/dist/runtime/mcp.mjs +7 -8
- package/package.json +1 -2
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/LICENCE.txt +0 -118
- 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 +0 -36
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/assets/squirtle.png +0 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-ED2YPDPS.mjs +0 -1123
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-GFRSRK3K.mjs +0 -16
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-N5G4ADI7.mjs +0 -15
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-VPCUV5QA.mjs +0 -237
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-team/SKILL.md +0 -24
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-team/agents/openai.yaml +0 -4
- package/dist/resources/panel/assets/LICENCE.txt +0 -118
- 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 +0 -36
- package/dist/resources/panel/assets/squirtle.png +0 -0
- package/dist/runtime/chunk-ED2YPDPS.mjs +0 -1123
- package/dist/runtime/chunk-GFRSRK3K.mjs +0 -16
- package/dist/runtime/chunk-N5G4ADI7.mjs +0 -15
- package/dist/runtime/chunk-VPCUV5QA.mjs +0 -237
|
@@ -1,38 +1,4 @@
|
|
|
1
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
2
|
// plugins/apexrest-apex/assets/apexrest-logo.svg
|
|
37
3
|
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
4
|
|
|
@@ -45,19 +11,13 @@
|
|
|
45
11
|
element.textContent = text;
|
|
46
12
|
return element;
|
|
47
13
|
};
|
|
48
|
-
var human = (value) => value
|
|
49
|
-
var active = (
|
|
14
|
+
var human = (value) => value.replaceAll("_", " ").replaceAll("-", " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
15
|
+
var active = (status) => ["running", "queued", "cancelling"].includes(status);
|
|
50
16
|
var badge = (value) => node(
|
|
51
17
|
"span",
|
|
52
|
-
"badge " + (["completed", "pass", "passed", "approve", "succeeded", "live"].includes(value) ? "good" : active(value) ? "running" : [
|
|
53
|
-
|
|
54
|
-
|
|
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" : ""),
|
|
18
|
+
"badge " + (["completed", "pass", "passed", "approve", "succeeded", "live"].includes(value) ? "good" : active(value) ? "running" : ["failed", "fail", "blocked", "verification_failed", "outcome_unknown", "unavailable"].includes(
|
|
19
|
+
value
|
|
20
|
+
) ? "bad" : ["not_run", "cancelled"].includes(value) ? "warn" : ""),
|
|
61
21
|
human(value)
|
|
62
22
|
);
|
|
63
23
|
var empty = (message) => node("div", "empty", message);
|
|
@@ -91,7 +51,6 @@
|
|
|
91
51
|
};
|
|
92
52
|
var launch = new URLSearchParams(location.hash.slice(1));
|
|
93
53
|
var snapshot;
|
|
94
|
-
var chosenTeam = launch.get("team") ?? void 0;
|
|
95
54
|
var busy = false;
|
|
96
55
|
var connected = false;
|
|
97
56
|
var initialized = false;
|
|
@@ -147,25 +106,22 @@
|
|
|
147
106
|
name: action ? "apexrest_panel_action" : "apexrest_panel_status",
|
|
148
107
|
arguments: {
|
|
149
108
|
project: bridgeProject,
|
|
150
|
-
...action ? { action } :
|
|
109
|
+
...action ? { action } : {}
|
|
151
110
|
}
|
|
152
111
|
});
|
|
153
112
|
const envelope = response2._meta?.["apexrest/panelResult"] ?? response2.structuredContent ?? JSON.parse(response2.content?.find((c) => c.type === "text")?.text ?? "{}");
|
|
154
113
|
if (!envelope.ok) throw new Error(envelope.summary ?? "Codex rejected this panel action.");
|
|
155
114
|
return envelope.data;
|
|
156
115
|
}
|
|
157
|
-
const response = await fetch(
|
|
158
|
-
|
|
159
|
-
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
signal: AbortSignal.timeout(action?.kind === "saved-connections" ? 6e4 : 15e3)
|
|
167
|
-
}
|
|
168
|
-
);
|
|
116
|
+
const response = await fetch(action ? "/api/action" : "/api/status", {
|
|
117
|
+
method: action ? "POST" : "GET",
|
|
118
|
+
headers: {
|
|
119
|
+
Authorization: "Bearer " + token,
|
|
120
|
+
...action ? { "Content-Type": "application/json" } : {}
|
|
121
|
+
},
|
|
122
|
+
...action ? { body: JSON.stringify(action) } : {},
|
|
123
|
+
signal: AbortSignal.timeout(action?.kind === "saved-connections" ? 6e4 : 15e3)
|
|
124
|
+
});
|
|
169
125
|
const result = await response.json();
|
|
170
126
|
if (!response.ok) throw new Error(result.summary ?? result.error ?? "The local panel request failed.");
|
|
171
127
|
return result;
|
|
@@ -214,17 +170,14 @@
|
|
|
214
170
|
}
|
|
215
171
|
function controls() {
|
|
216
172
|
const canAct = connected && !!snapshot?.trusted && !busy;
|
|
217
|
-
for (const id of ["
|
|
173
|
+
for (const id of ["validate", "run-tests", "plan", "open-browser"])
|
|
218
174
|
$(id).disabled = !canAct || !snapshot?.configured;
|
|
219
|
-
for (const form of ["sqlcl-form", "connection-form", "preferences-form"
|
|
175
|
+
for (const form of ["sqlcl-form", "connection-form", "preferences-form"])
|
|
220
176
|
$(form).querySelectorAll("button[type=submit]").forEach((button) => {
|
|
221
177
|
button.disabled = !canAct;
|
|
222
178
|
});
|
|
223
179
|
$("saved-connections-refresh").disabled = !canAct || savedConnectionsState === "loading";
|
|
224
180
|
$("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
181
|
}
|
|
229
182
|
async function act(action) {
|
|
230
183
|
if (busy || !connected) return;
|
|
@@ -232,15 +185,9 @@
|
|
|
232
185
|
controls();
|
|
233
186
|
try {
|
|
234
187
|
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
188
|
notice(
|
|
241
|
-
result.
|
|
189
|
+
action.kind === "browser" ? result.status === "host_action_required" ? "Open this application in the Codex in-app browser: " + result.url + ". Opening it does not verify the application." : "Verification browser opened. Inspect the affected behavior; opening it does not verify the application." : ["sqlcl", "connection", "preferences"].includes(action.kind) ? "Settings saved." : action.kind === "cancel-job" ? "Stop requested. Existing changes are not rolled back." : "Operation accepted. Follow its actual status below."
|
|
242
190
|
);
|
|
243
|
-
if (action.kind === "message") input("message").value = "";
|
|
244
191
|
if (action.kind === "preferences") preferencesDirty = false;
|
|
245
192
|
if (action.kind === "sqlcl") sqlclDirty = false;
|
|
246
193
|
if (action.kind === "connection") input("connection-ords-password").value = "";
|
|
@@ -260,188 +207,6 @@
|
|
|
260
207
|
$(id).replaceChildren(...render2());
|
|
261
208
|
rendered.set(id, key);
|
|
262
209
|
}
|
|
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
210
|
function operations(data) {
|
|
446
211
|
const box = node("div", "table-wrap");
|
|
447
212
|
if (!data.jobs.length) box.append(empty("No APEX operation jobs recorded for this project."));
|
|
@@ -478,7 +243,7 @@
|
|
|
478
243
|
const deployments = node("div");
|
|
479
244
|
if (!data.deployments.length) deployments.append(empty("No deployment runs recorded."));
|
|
480
245
|
for (const deployment of data.deployments) {
|
|
481
|
-
const row = node("div", "
|
|
246
|
+
const row = node("div", "journal-entry");
|
|
482
247
|
row.append(
|
|
483
248
|
badge(deployment.status),
|
|
484
249
|
node("p", "subtle", new Date(deployment.at).toLocaleString()),
|
|
@@ -517,14 +282,7 @@
|
|
|
517
282
|
sqlclSignature = nextSqlcl;
|
|
518
283
|
}
|
|
519
284
|
if (!preferencesDirty && nextPreferences !== preferencesSignature) {
|
|
520
|
-
|
|
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
|
-
}
|
|
285
|
+
input("default-browser-mode").value = data.preferences.browserMode;
|
|
528
286
|
preferencesSignature = nextPreferences;
|
|
529
287
|
}
|
|
530
288
|
if (!initialized) {
|
|
@@ -541,7 +299,7 @@
|
|
|
541
299
|
}
|
|
542
300
|
if (!data.configured)
|
|
543
301
|
notice(
|
|
544
|
-
"This folder has no apexrest.json. Initialize or open an APEXREST application project to run
|
|
302
|
+
"This folder has no apexrest.json. Initialize or open an APEXREST application project to run APEX operations."
|
|
545
303
|
);
|
|
546
304
|
else if (!data.trusted)
|
|
547
305
|
notice(
|
|
@@ -565,47 +323,13 @@
|
|
|
565
323
|
return option;
|
|
566
324
|
})
|
|
567
325
|
);
|
|
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
326
|
draw(
|
|
584
327
|
"metrics",
|
|
585
|
-
[
|
|
586
|
-
data.teams,
|
|
587
|
-
data.sqlcl,
|
|
588
|
-
data.jobs,
|
|
589
|
-
data.team?.status,
|
|
590
|
-
data.team?.executionMode,
|
|
591
|
-
data.preferences.executionMode
|
|
592
|
-
],
|
|
328
|
+
[data.sqlcl, data.jobs, data.deployments, data.trusted],
|
|
593
329
|
() => [
|
|
594
|
-
[
|
|
595
|
-
|
|
596
|
-
|
|
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
|
-
],
|
|
330
|
+
["APEX operations", String(data.jobs.filter((job) => active(job.status)).length), "Running or queued"],
|
|
331
|
+
["Recorded deployments", String(data.deployments.length), "Recent deployment journal entries"],
|
|
332
|
+
["Project access", data.trusted ? "Trusted" : "Read only", "Existing authorization gates apply"],
|
|
609
333
|
[
|
|
610
334
|
"Database connectivity",
|
|
611
335
|
data.sqlcl.databaseTransport === "ords" ? "ORDS HTTP(S)" : "Direct Oracle",
|
|
@@ -617,8 +341,7 @@
|
|
|
617
341
|
return box;
|
|
618
342
|
})
|
|
619
343
|
);
|
|
620
|
-
|
|
621
|
-
draw("overview-live", [stableTeam, data.changes, data.configuration, data.trusted], () => {
|
|
344
|
+
draw("overview-live", [data.changes, data.configuration, data.trusted], () => {
|
|
622
345
|
const columns = node("div", "two-columns"), changeBox = node("div");
|
|
623
346
|
changeBox.append(
|
|
624
347
|
data.changes.files.length ? node("pre", "", data.changes.files.join("\n")) : empty(
|
|
@@ -641,24 +364,22 @@
|
|
|
641
364
|
),
|
|
642
365
|
card("Working changes", changeBox)
|
|
643
366
|
);
|
|
644
|
-
return [
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
367
|
+
return [
|
|
368
|
+
card(
|
|
369
|
+
"Current Codex session",
|
|
370
|
+
node(
|
|
371
|
+
"p",
|
|
372
|
+
"subtle",
|
|
373
|
+
"Describe changes and review results in your open Codex conversation. This panel runs APEX operations and manages project settings."
|
|
374
|
+
)
|
|
375
|
+
),
|
|
376
|
+
columns
|
|
377
|
+
];
|
|
650
378
|
});
|
|
651
379
|
draw("operations-live", [data.jobs, data.deployments, busy], () => operations(data));
|
|
652
380
|
draw(
|
|
653
381
|
"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
|
-
],
|
|
382
|
+
[data.preferences, data.configuration, data.connections, data.toolchain, data.permissions],
|
|
662
383
|
() => {
|
|
663
384
|
const box = node("div");
|
|
664
385
|
box.append(
|
|
@@ -678,7 +399,6 @@
|
|
|
678
399
|
"Verification browser",
|
|
679
400
|
data.preferences.browserMode === "external" ? "External system browser" : "Codex in-app browser"
|
|
680
401
|
],
|
|
681
|
-
["Execution mode", data.preferences.executionMode === "single" ? "Single agent" : "Agent team"],
|
|
682
402
|
["Active deploy/test grants", data.permissions.activeGrants.length]
|
|
683
403
|
])
|
|
684
404
|
)
|
|
@@ -738,10 +458,9 @@
|
|
|
738
458
|
}
|
|
739
459
|
}
|
|
740
460
|
var views = {
|
|
741
|
-
overview: ["Workspace overview", "
|
|
742
|
-
team: ["Agents", "Follow implementation, communication and verification."],
|
|
461
|
+
overview: ["Workspace overview", "Project settings and APEX operations for your current Codex session."],
|
|
743
462
|
operations: ["APEX operations", "Compile, verify and follow deployment state."],
|
|
744
|
-
settings: ["Workspace settings", "Inspect
|
|
463
|
+
settings: ["Workspace settings", "Inspect configuration, database connections and browser preferences."]
|
|
745
464
|
};
|
|
746
465
|
function view(name) {
|
|
747
466
|
currentView = name;
|
|
@@ -763,51 +482,6 @@
|
|
|
763
482
|
$("refresh").onclick = () => {
|
|
764
483
|
void refresh();
|
|
765
484
|
};
|
|
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
485
|
$("preferences-form").oninput = () => {
|
|
812
486
|
preferencesDirty = true;
|
|
813
487
|
};
|
|
@@ -816,12 +490,7 @@
|
|
|
816
490
|
void act({
|
|
817
491
|
kind: "preferences",
|
|
818
492
|
settings: {
|
|
819
|
-
|
|
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)
|
|
493
|
+
browserMode: input("default-browser-mode").value
|
|
825
494
|
}
|
|
826
495
|
});
|
|
827
496
|
};
|
|
@@ -894,16 +563,17 @@
|
|
|
894
563
|
...!ords ? { sqlclName } : { ordsUrl, ordsUsername, ...password ? { password } : {} }
|
|
895
564
|
});
|
|
896
565
|
};
|
|
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
566
|
$("validate").onclick = () => {
|
|
905
567
|
void act({ kind: "validate" });
|
|
906
568
|
};
|
|
569
|
+
$("open-browser").onclick = () => {
|
|
570
|
+
const env = input("environment").value;
|
|
571
|
+
if (!env) {
|
|
572
|
+
notice("Choose an explicit environment before opening its application.", true);
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
void act({ kind: "browser", env });
|
|
576
|
+
};
|
|
907
577
|
$("plan").onclick = () => {
|
|
908
578
|
const env = input("environment").value;
|
|
909
579
|
if (!env) {
|
|
@@ -921,7 +591,8 @@
|
|
|
921
591
|
void act({ kind: "test", suite, ...env ? { env } : {} });
|
|
922
592
|
};
|
|
923
593
|
controls();
|
|
924
|
-
|
|
594
|
+
var initialView = launch.get("view");
|
|
595
|
+
if (initialView && views[initialView]) view(initialView);
|
|
925
596
|
var mark = document.querySelector(".brand-mark");
|
|
926
597
|
if (mark) {
|
|
927
598
|
const icon = node("img");
|
|
@@ -942,9 +613,16 @@
|
|
|
942
613
|
void refresh();
|
|
943
614
|
}).catch((error) => notice(String(error), true));
|
|
944
615
|
} else void refresh();
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
616
|
+
function scheduleRefresh() {
|
|
617
|
+
setTimeout(
|
|
618
|
+
() => {
|
|
619
|
+
if (!document.hidden) void refresh();
|
|
620
|
+
scheduleRefresh();
|
|
621
|
+
},
|
|
622
|
+
snapshot?.jobs.some((job) => active(job.status)) ? 2e3 : 1e4
|
|
623
|
+
);
|
|
624
|
+
}
|
|
625
|
+
scheduleRefresh();
|
|
948
626
|
document.addEventListener("visibilitychange", () => {
|
|
949
627
|
if (!document.hidden) void refresh();
|
|
950
628
|
});
|