@numa-tech/numa 1.12.7 → 1.12.10
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/README.md +266 -47
- package/dist/ai-registry/bridge.d.ts +8 -0
- package/dist/ai-registry/bridge.js +63 -0
- package/dist/ai-registry/bridge.js.map +1 -0
- package/dist/ai-registry/client.d.ts +29 -3
- package/dist/ai-registry/client.js +112 -8
- package/dist/ai-registry/client.js.map +1 -1
- package/dist/ai-registry/commands.js +367 -112
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/ai-registry/errors.d.ts +2 -1
- package/dist/ai-registry/errors.js +12 -1
- package/dist/ai-registry/errors.js.map +1 -1
- package/dist/ai-registry/mcp-installer.d.ts +1 -0
- package/dist/ai-registry/mcp-installer.js +4 -0
- package/dist/ai-registry/mcp-installer.js.map +1 -1
- package/dist/ai-registry/namespace.d.ts +17 -0
- package/dist/ai-registry/namespace.js +53 -0
- package/dist/ai-registry/namespace.js.map +1 -0
- package/dist/ai-registry/schemas.d.ts +127 -2
- package/dist/ai-registry/schemas.js +42 -2
- package/dist/ai-registry/schemas.js.map +1 -1
- package/dist/ai-registry/sync.d.ts +23 -0
- package/dist/ai-registry/sync.js +276 -0
- package/dist/ai-registry/sync.js.map +1 -0
- package/dist/ai-registry/tui.d.ts +2 -0
- package/dist/ai-registry/tui.js +140 -0
- package/dist/ai-registry/tui.js.map +1 -0
- package/dist/ai-registry/workspace.d.ts +191 -0
- package/dist/ai-registry/workspace.js +167 -0
- package/dist/ai-registry/workspace.js.map +1 -0
- package/dist/app-config.d.ts +3 -2
- package/dist/app-config.js +5 -3
- package/dist/app-config.js.map +1 -1
- package/dist/application-candidates/client.d.ts +167 -0
- package/dist/application-candidates/client.js +103 -0
- package/dist/application-candidates/client.js.map +1 -0
- package/dist/application-candidates/commands.d.ts +13 -0
- package/dist/application-candidates/commands.js +225 -0
- package/dist/application-candidates/commands.js.map +1 -0
- package/dist/application-candidates/schemas.d.ts +171 -0
- package/dist/application-candidates/schemas.js +80 -0
- package/dist/application-candidates/schemas.js.map +1 -0
- package/dist/application-onboarding/client.d.ts +256 -0
- package/dist/application-onboarding/client.js +213 -0
- package/dist/application-onboarding/client.js.map +1 -0
- package/dist/application-onboarding/commands.d.ts +64 -0
- package/dist/application-onboarding/commands.js +694 -0
- package/dist/application-onboarding/commands.js.map +1 -0
- package/dist/application-onboarding/errors.d.ts +11 -0
- package/dist/application-onboarding/errors.js +51 -0
- package/dist/application-onboarding/errors.js.map +1 -0
- package/dist/application-onboarding/schemas.d.ts +1167 -0
- package/dist/application-onboarding/schemas.js +459 -0
- package/dist/application-onboarding/schemas.js.map +1 -0
- package/dist/application-onboarding/scm-credentials.d.ts +8 -0
- package/dist/application-onboarding/scm-credentials.js +98 -0
- package/dist/application-onboarding/scm-credentials.js.map +1 -0
- package/dist/application-onboarding/tui-model.d.ts +131 -0
- package/dist/application-onboarding/tui-model.js +554 -0
- package/dist/application-onboarding/tui-model.js.map +1 -0
- package/dist/application-onboarding/tui.d.ts +14 -0
- package/dist/application-onboarding/tui.js +554 -0
- package/dist/application-onboarding/tui.js.map +1 -0
- package/dist/cli.js +43 -7
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.d.ts +1 -0
- package/dist/command-catalog.js +231 -10
- package/dist/command-catalog.js.map +1 -1
- package/dist/config-page.js +2 -0
- package/dist/config-page.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/pipeline/client.d.ts +10 -6
- package/dist/pipeline/client.js +7 -4
- package/dist/pipeline/client.js.map +1 -1
- package/dist/pipeline/commands.d.ts +5 -1
- package/dist/pipeline/commands.js +89 -18
- package/dist/pipeline/commands.js.map +1 -1
- package/dist/pipeline/schemas.d.ts +7 -7
- package/dist/pipeline/schemas.js +2 -2
- package/dist/pipeline/schemas.js.map +1 -1
- package/dist/platform-profile.d.ts +8 -2
- package/dist/platform-profile.js +5 -2
- package/dist/platform-profile.js.map +1 -1
- package/dist/web-console-page.d.ts +3 -3
- package/dist/web-console-page.js +75 -20
- package/dist/web-console-page.js.map +1 -1
- package/dist/web-console.d.ts +1 -1
- package/dist/web-console.js +50 -3
- package/dist/web-console.js.map +1 -1
- package/package.json +8 -5
- package/skills/numa-ai-registry/SKILL.md +25 -19
- package/skills/numa-ai-registry/evals/evals.json +10 -10
- package/skills/numa-ai-registry/references/command-contract.md +41 -6
- package/skills/numa-cli/SKILL.md +44 -0
- package/skills/numa-cli/agents/openai.yaml +4 -0
- package/skills/numa-cli/evals/evals.json +35 -0
- package/skills/numa-cli/references/pipeline-release.md +107 -0
package/dist/web-console-page.js
CHANGED
|
@@ -7,29 +7,40 @@ export const CONSOLE_HTML = `<!doctype html>
|
|
|
7
7
|
<link rel="stylesheet" href="/assets/console.css">
|
|
8
8
|
</head>
|
|
9
9
|
<body>
|
|
10
|
+
<!--
|
|
11
|
+
THESIS: A namespace-scoped operations ledger owns the release boundary and refuses a generic dashboard of disconnected cards.
|
|
12
|
+
OWN-WORLD: Deep navy frame, mist work surface, paper records, cyan state signals, compact operational type, and flat control-plane materials.
|
|
13
|
+
STORY: The operator sees their authorized boundary, understands resource and release state, then performs one capability-gated next action.
|
|
14
|
+
FIRST VIEWPORT: Persistent rail and header frame a wide registry hero, six visible workspaces, namespace context, then a list-detail operating board with actions beside their record.
|
|
15
|
+
FORM: Code-led control-room ledger, first choice; seed control-plane-ledger-v1.
|
|
16
|
+
FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review, the verdict, DESIGN.md, and every shipping raster carrying its provenance
|
|
17
|
+
-->
|
|
10
18
|
<div id="app" class="boot"><div class="boot-mark">N</div><p>正在连接本地控制台…</p></div>
|
|
11
19
|
<script type="module" src="/assets/console.js"></script>
|
|
12
20
|
</body>
|
|
13
21
|
</html>`;
|
|
14
22
|
export const CONSOLE_CSS = `
|
|
15
|
-
:root{color-scheme:light;--ink:#0b1728;--navy:#07182b;--navy-2:#102943;--cyan:#
|
|
23
|
+
:root{color-scheme:light;--ink:#0b1728;--navy:#07182b;--navy-2:#102943;--cyan:#0a9fa7;--cyan-soft:#d7f2f1;--mist:#eef4f8;--paper:#fbfdff;--line:#d7e2ea;--muted:#536b82;--amber:#e99a32;--red:#d94b58;--green:#147a5d;--shadow:0 18px 50px rgba(12,38,62,.1)}
|
|
16
24
|
*{box-sizing:border-box}html,body,#app{min-height:100%}body{min-height:100vh;margin:0;background:var(--mist);color:var(--ink);font-family:"Avenir Next","Segoe UI",system-ui,sans-serif}button,input,select,textarea{font:inherit}.mono,code,pre{font-family:"SFMono-Regular",Consolas,"Liberation Mono",monospace}.boot{min-height:100vh;display:grid;place-content:center;justify-items:center;gap:14px;color:var(--muted)}.boot-mark,.brand-mark{display:grid;place-items:center;background:var(--cyan);color:#00262a;font-weight:900}.boot-mark{width:50px;height:50px;border-radius:15px;box-shadow:0 0 0 8px rgba(14,183,191,.12)}
|
|
17
25
|
.shell{min-height:100vh;display:grid;grid-template-columns:260px 1fr}.rail{position:sticky;top:0;height:100vh;padding:24px 18px;background:var(--navy);color:#d7e6f3;display:flex;flex-direction:column}.brand{display:flex;align-items:center;gap:12px;padding:8px 8px 26px}.brand-mark{width:38px;height:38px;border-radius:12px}.brand strong{display:block;letter-spacing:.04em}.brand small{display:block;margin-top:4px;color:#708aa3;font-size:10px;letter-spacing:.18em;text-transform:uppercase}.nav{display:grid;gap:7px}.nav button{border:0;background:transparent;color:#8da4b8;border-radius:11px;text-align:left;padding:11px 13px;cursor:pointer;display:flex;justify-content:space-between}.nav button:hover,.nav button.active{background:var(--navy-2);color:white}.nav button.active{box-shadow:inset 3px 0 var(--cyan)}.rail-foot{margin-top:auto;border:1px solid #203b55;border-radius:14px;padding:14px}.rail-foot .pulse{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--cyan);box-shadow:0 0 12px var(--cyan);margin-right:7px}.rail-foot p{margin:7px 0 0;color:#7791a8;font-size:11px;line-height:1.5}
|
|
18
|
-
.main{min-width:0;min-height:100vh;display:flex;flex-direction:column}.topbar{height:76px;padding:0 34px;background:rgba(251,253,255,.94);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:3;backdrop-filter:blur(12px)}.topbar h1{font-size:17px;margin:0}.eyebrow{font:700 10px/1.2 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.16em;color:var(--cyan)}.user-chip{display:flex;align-items:center;gap:10px}.avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:var(--cyan-soft);color:#
|
|
19
|
-
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:18px;margin-top:20px}.card{grid-column:span 4;background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.card.wide{grid-column:span 8}.card.full{grid-column:1/-1}.card h3{margin:0;font-size:15px}.card p{color:var(--muted);font-size:12px;line-height:1.6}.metric{font-size:28px;font-weight:750;margin-top:16px}.metric small{font-size:11px;color:var(--muted);font-weight:500}.tag{display:inline-flex;border-radius:999px;padding:5px 8px;font:700 9px/1 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.05em;background:var(--cyan-soft);color:#
|
|
20
|
-
.sync-board{display:grid;grid-template-columns:1fr 56px 1fr;align-items:stretch;margin-top:20px}.sync-stage{background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:18px 20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.sync-stage strong{display:block;margin-top:8px;font-size:18px}.sync-stage p{margin:7px 0 0;color:var(--muted);font-size:11px}.sync-link{display:grid;place-items:center;color:var(--cyan);font-size:22px}.sync-link:before{content:"";height:2px;width:100%;background:linear-gradient(90deg,var(--cyan),#bad8dc)}.table-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:17px;box-shadow:0 10px 30px rgba(25,54,79,.05);overflow:hidden}.table-head{padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.table-head h3{margin:0}.table-head p{margin:5px 0 0;color:var(--muted);font-size:11px}.account-table-wrap{overflow:auto}.account-table{width:100%;border-collapse:collapse;min-width:920px}.account-table th,.account-table td{text-align:left;padding:14px 16px;border-bottom:1px solid #e7eef3;vertical-align:middle}.account-table th{background:#f5f9fb;color:#
|
|
21
|
-
.registry-hero{background:linear-gradient(118deg,#06172a 0%,#0b2d42 67%,#0a4c55 100%)}.lifecycle{display:grid;grid-template-columns:repeat(
|
|
26
|
+
.main{min-width:0;min-height:100vh;display:flex;flex-direction:column}.topbar{height:76px;padding:0 34px;background:rgba(251,253,255,.94);border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:3;backdrop-filter:blur(12px)}.topbar h1{font-size:17px;margin:0}.eyebrow{font:700 10px/1.2 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.16em;color:var(--cyan)}.user-chip{display:flex;align-items:center;gap:10px}.avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:var(--cyan-soft);color:#066b70;font-weight:800}.user-chip small{color:var(--muted)}.content{width:100%;max-width:1420px;flex:1;margin:0 auto;padding:30px 34px 56px}.hero{background:var(--navy);color:white;border-radius:22px;padding:28px 30px;display:grid;grid-template-columns:1fr auto;gap:24px;position:relative;overflow:hidden;box-shadow:var(--shadow)}.hero:after{content:"";position:absolute;right:-45px;top:-90px;width:320px;height:240px;border:34px solid rgba(14,183,191,.09);transform:rotate(-18deg);border-radius:48px}.hero h2{font-size:32px;line-height:1.08;margin:10px 0}.hero p{max-width:720px;color:#91aac0;margin:0;line-height:1.6}.session-track{align-self:center;display:flex;gap:0;position:relative;z-index:1}.track-node{min-width:112px;border:1px solid #2a4661;padding:13px 15px;background:#0b1e33}.track-node:first-child{border-radius:13px 0 0 13px}.track-node:last-child{border-radius:0 13px 13px 0}.track-node span{display:block;color:#7690a7;font-size:9px;text-transform:uppercase;letter-spacing:.12em}.track-node strong{display:block;margin-top:6px;font-size:13px}.track-node.live strong{color:#58e0df}
|
|
27
|
+
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:18px;margin-top:20px}.card{grid-column:span 4;background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.card.wide{grid-column:span 8}.card.full{grid-column:1/-1}.card h3{margin:0;font-size:15px}.card p{color:var(--muted);font-size:12px;line-height:1.6}.metric{font-size:28px;font-weight:750;margin-top:16px}.metric small{font-size:11px;color:var(--muted);font-weight:500}.tag{display:inline-flex;border-radius:999px;padding:5px 8px;font:700 9px/1 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.05em;background:var(--cyan-soft);color:#066b70}.tag.public{background:#edf1f5;color:#5d7082}.tag.role{background:#fff0d9;color:#9c5c09}.actions{display:flex;gap:8px;flex-wrap:wrap}.button{border:1px solid var(--line);border-radius:10px;background:white;color:var(--ink);padding:9px 12px;cursor:pointer;font-weight:700;font-size:12px}.button:hover{border-color:#9ab6c9;background:#f7fbfd}.button.primary{background:#0b949b;border-color:#0b949b;color:white}.button.danger{color:var(--red);border-color:#f0bec4}.button:disabled{opacity:.45;cursor:not-allowed}.field{display:grid;gap:6px}.field label{font-size:11px;color:var(--muted);font-weight:700}.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:10px;background:white;padding:10px 11px;color:var(--ink);outline:none}.field input:focus,.field textarea:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(14,183,191,.12)}.field textarea{min-height:110px;resize:vertical}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid .span-2{grid-column:1/-1}.command-toolbar{display:flex;gap:10px;margin-bottom:15px}.grow{flex:1}.mt-10{margin-top:10px}.mt-12{margin-top:12px}.mt-14{margin-top:14px}.command-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px}.command{border:1px solid var(--line);border-radius:13px;padding:14px;background:white}.command-head{display:flex;gap:8px;align-items:center;justify-content:space-between}.command code{font-size:11px;color:#0b6f76}.command p{margin:9px 0}.command small{display:block;color:#8a9bab;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.output{background:#071522;color:#b8d1e2;border-radius:13px;padding:15px;min-height:170px;max-height:420px;overflow:auto;white-space:pre-wrap;font-size:11px;line-height:1.65}.notice{margin-top:14px;border-radius:11px;padding:11px 13px;font-size:12px}.notice.error{background:#fff0f2;color:#a52c3b;border:1px solid #f1c4ca}.notice.success{background:#e8f7f1;color:#176c54;border:1px solid #bce4d5}.login-gate{min-height:calc(100vh - 76px);display:grid;place-content:center;padding:30px}.login-card{width:min(520px,90vw);background:white;border:1px solid var(--line);border-radius:22px;padding:32px;box-shadow:var(--shadow)}.login-card h2{font-size:28px;margin:14px 0 9px}.login-card p{color:var(--muted);line-height:1.65}.hidden{display:none!important}
|
|
28
|
+
.sync-board{display:grid;grid-template-columns:1fr 56px 1fr;align-items:stretch;margin-top:20px}.sync-stage{background:var(--paper);border:1px solid var(--line);border-radius:17px;padding:18px 20px;box-shadow:0 10px 30px rgba(25,54,79,.05)}.sync-stage strong{display:block;margin-top:8px;font-size:18px}.sync-stage p{margin:7px 0 0;color:var(--muted);font-size:11px}.sync-link{display:grid;place-items:center;color:var(--cyan);font-size:22px}.sync-link:before{content:"";height:2px;width:100%;background:linear-gradient(90deg,var(--cyan),#bad8dc)}.table-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:17px;box-shadow:0 10px 30px rgba(25,54,79,.05);overflow:hidden}.table-head{padding:18px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid var(--line)}.table-head h3{margin:0}.table-head p{margin:5px 0 0;color:var(--muted);font-size:11px}.account-table-wrap{overflow:auto}.account-table{width:100%;border-collapse:collapse;min-width:920px}.account-table th,.account-table td{text-align:left;padding:14px 16px;border-bottom:1px solid #e7eef3;vertical-align:middle}.account-table th{background:#f5f9fb;color:#536b82;font-size:10px;text-transform:uppercase;letter-spacing:.08em}.account-table tr:last-child td{border-bottom:0}.account-name strong{display:block;font-size:13px}.account-name small{display:block;margin-top:4px;color:var(--muted);font-size:10px}.quota-stack{min-width:210px;display:grid;gap:8px}.quota-line{display:grid;grid-template-columns:42px 1fr 38px;align-items:center;gap:7px;font-size:10px;color:var(--muted)}progress{width:100%;height:7px;border:0;border-radius:99px;overflow:hidden;background:#e7eef3}progress::-webkit-progress-bar{background:#e7eef3;border-radius:99px}progress::-webkit-progress-value{background:var(--cyan);border-radius:99px}progress::-moz-progress-bar{background:var(--cyan);border-radius:99px}.status-stack{display:flex;gap:6px;flex-wrap:wrap}.tag.success{background:#e8f7f1;color:var(--green)}.tag.failed{background:#fff0f2;color:var(--red)}.tag.waiting{background:#fff0d9;color:#8c5005}.tag.local{background:#e8f1fa;color:#32658f}.empty-state{padding:48px 20px;text-align:center;color:var(--muted)}.empty-state.account-request{margin:24px;border:2px solid #f0b5bd;border-radius:16px;background:#fff2f4;color:#8d2334;box-shadow:0 12px 30px rgba(167,44,64,.1)}.empty-state.account-request strong{display:block;margin-bottom:9px;font-size:16px}.empty-state.account-request span{display:block;font-size:13px;line-height:1.7}.table-meta{color:var(--muted);font-size:10px;line-height:1.55}.spin{animation:turn 1s linear infinite}.refresh-icon{display:inline-block;width:12px;height:12px;border:2px solid currentColor;border-left-color:transparent;border-radius:50%;vertical-align:-2px;position:relative}.refresh-icon:after{content:"";position:absolute;right:-3px;top:-2px;border-width:3px 0 3px 4px;border-style:solid;border-color:transparent transparent transparent currentColor;transform:rotate(-18deg)}@keyframes turn{to{transform:rotate(360deg)}}
|
|
29
|
+
.registry-hero{background:linear-gradient(118deg,#06172a 0%,#0b2d42 67%,#0a4c55 100%)}.lifecycle{display:grid;grid-template-columns:repeat(5,70px);align-items:center;position:relative;z-index:1;margin-top:12px}.life-node{position:relative;text-align:center;color:#8ba7b8;font:700 8px/1.2 "SFMono-Regular",monospace;text-transform:uppercase;letter-spacing:.05em}.life-node:before{content:"";display:block;width:10px;height:10px;margin:0 auto 9px;border:2px solid #58e0df;border-radius:50%;background:#0a2638;box-shadow:0 0 0 4px rgba(88,224,223,.08)}.life-node:not(:last-child):after{content:"";position:absolute;height:1px;width:calc(100% - 22px);top:6px;left:calc(50% + 11px);background:linear-gradient(90deg,#58e0df,#31546a)}.registry-toolbar{display:grid;grid-template-columns:minmax(190px,1fr) auto minmax(190px,1fr) auto;gap:10px;align-items:end;margin-top:20px}.segment{display:flex;padding:3px;background:#dfe9ef;border-radius:11px}.segment button{border:0;background:transparent;padding:8px 13px;border-radius:8px;color:var(--muted);font-weight:750;font-size:11px;cursor:pointer}.segment button.active{background:white;color:#087d84;box-shadow:0 3px 12px rgba(7,24,43,.1)}.registry-board{display:grid;grid-template-columns:minmax(260px,32%) 1fr;min-height:560px;margin-top:14px;background:var(--paper);border:1px solid var(--line);border-radius:18px;overflow:hidden;box-shadow:var(--shadow)}.registry-list{border-right:1px solid var(--line);background:#f4f8fa}.registry-list-head{padding:15px 17px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center}.registry-items{padding:9px;display:grid;gap:6px;max-height:680px;overflow:auto}.registry-item{width:100%;border:1px solid transparent;background:transparent;border-radius:12px;padding:12px;text-align:left;cursor:pointer;display:grid;grid-template-columns:12px 1fr;gap:10px;color:var(--ink)}.registry-item:hover,.registry-item.active{background:white;border-color:var(--line);box-shadow:0 6px 20px rgba(18,49,71,.07)}.registry-dot{width:8px;height:8px;margin-top:4px;border-radius:50%;background:var(--amber);box-shadow:0 0 0 4px rgba(233,154,50,.1)}.registry-dot.online{background:var(--green);box-shadow:0 0 0 4px rgba(25,138,104,.1)}.registry-item strong,.registry-item small{display:block}.registry-item strong{font-size:12px}.registry-item small{margin-top:5px;color:var(--muted);font-size:10px}.registry-detail{min-width:0;padding:22px;display:flex;flex-direction:column}.registry-detail-head{display:flex;justify-content:space-between;align-items:start;gap:16px}.registry-detail h3{margin:5px 0 3px;font-size:20px}.registry-detail pre{flex:1;margin:16px 0;min-height:270px}.registry-actions{border-top:1px solid var(--line);padding-top:15px;display:grid;gap:12px}.install-row{display:grid;grid-template-columns:1fr 1fr auto;gap:9px}.registry-error{margin-top:14px}.button:focus-visible,.nav button:focus-visible,.registry-item:focus-visible,.segment button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:3px solid rgba(14,183,191,.3);outline-offset:2px}
|
|
30
|
+
.registry-workspaces{display:flex;gap:2px;margin-top:22px;border-bottom:1px solid var(--line)}.registry-workspaces button{flex:1 1 auto;border:0;border-bottom:2px solid transparent;background:transparent;color:#536b82;padding:12px 10px;cursor:pointer;font-weight:720;font-size:12px}.registry-workspaces button:hover{color:var(--ink);background:#e4f0f3}.registry-workspaces button.active{color:#066f75;border-bottom-color:#0b949b}.registry-context{min-width:0;display:flex;flex-direction:column;justify-content:center;padding:7px 2px}.registry-context strong,.registry-context span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.registry-context span{margin-top:4px;color:var(--muted);font-size:11px}.registry-simple{margin-top:14px;min-height:430px;background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:26px;box-shadow:0 12px 34px rgba(25,54,79,.08)}.registry-simple>h3{margin:0 0 8px;font-size:20px}.registry-simple>p{max-width:72ch;color:var(--muted);line-height:1.65}.governance-strip{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:26px 0;border-block:1px solid var(--line)}.governance-strip>div{min-width:0;padding:20px}.governance-strip>div+div{border-inline-start:1px solid var(--line)}.governance-strip strong,.governance-strip span{display:block;overflow-wrap:anywhere}.governance-strip strong{font-size:13px}.governance-strip span{margin-top:7px;color:var(--muted);font-size:11px}.registry-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;margin:24px 0;background:var(--line)}.registry-facts>div{min-width:0;background:white;padding:18px}.registry-facts dt{color:var(--muted);font-size:11px}.registry-facts dd{margin:7px 0 0;overflow-wrap:anywhere;font-weight:700}.record-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:18px 0}.record-card{border:1px solid var(--line);border-radius:13px;background:white;padding:16px}.record-card h4{margin:0;font-size:14px}.record-card dl{display:grid;grid-template-columns:minmax(90px,.45fr) 1fr;gap:8px 12px;margin:14px 0 0;font-size:11px}.record-card dt{color:var(--muted)}.record-card dd{margin:0;overflow-wrap:anywhere;font-weight:650}.summary-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:16px 0}.summary-cell{border:1px solid var(--line);border-radius:12px;padding:14px;background:#f8fbfc}.summary-cell span,.summary-cell strong{display:block}.summary-cell span{color:var(--muted);font-size:10px}.summary-cell strong{margin-top:7px;overflow-wrap:anywhere;font-size:13px}.raw-disclosure{margin:14px 0}.raw-disclosure summary{cursor:pointer;color:#3e6078;font-size:11px;font-weight:700}.raw-disclosure .output{margin:9px 0 0;min-height:120px;max-height:280px}.permission-grid{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0 22px}.permission-grid .tag{font-size:10px;padding:7px 9px}.wrap{overflow-wrap:anywhere;white-space:pre-wrap}.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}::selection{background:#0b949b;color:white}*{scrollbar-color:#8eb5c0 #e7eef3}input,textarea{caret-color:#0b949b}.output{font-variant-numeric:tabular-nums}
|
|
22
31
|
@media(max-width:980px){.shell{grid-template-columns:78px 1fr}.rail{padding:18px 10px}.brand div:last-child,.nav button span:first-child,.rail-foot p,.rail-foot strong{display:none}.brand{justify-content:center}.nav button{justify-content:center}.card,.card.wide{grid-column:span 6}.hero{grid-template-columns:1fr}.session-track,.lifecycle{display:none}.registry-toolbar{grid-template-columns:1fr 1fr}.registry-board{grid-template-columns:1fr}.registry-list{border-right:0;border-bottom:1px solid var(--line)}.registry-items{max-height:260px}}
|
|
23
32
|
@media(max-width:680px){.shell{display:block}.rail{height:auto;position:static;flex-direction:row;align-items:center;padding:10px 14px;overflow-x:auto}.brand{padding:0;margin-right:auto;flex:0 0 auto}.nav{display:flex}.nav button{padding:9px;flex:0 0 auto}.rail-foot{display:none}.topbar{padding:0 18px}.content{padding:20px 14px}.hero{padding:23px}.hero h2{font-size:25px}.card,.card.wide{grid-column:1/-1}.form-grid,.command-list,.registry-toolbar,.install-row{grid-template-columns:1fr}.form-grid .span-2{grid-column:auto}.user-chip div:not(.avatar){display:none}.sync-board{grid-template-columns:1fr}.sync-link{height:32px;transform:rotate(90deg)}.table-head{align-items:flex-start;flex-direction:column}.registry-detail{padding:17px}}
|
|
33
|
+
@media(max-width:680px){.field input,.field select,.field textarea{font-size:16px}.governance-strip,.registry-facts,.record-grid,.summary-grid{grid-template-columns:1fr}.governance-strip>div+div{border-inline-start:0;border-block-start:1px solid var(--line)}.registry-simple{padding:19px}.registry-workspaces{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border:1px solid var(--line);border-radius:13px;overflow:hidden}.registry-workspaces button{width:100%;border-bottom:1px solid var(--line);border-radius:0;padding:11px 8px}.registry-workspaces button.active{box-shadow:inset 3px 0 #0b949b;border-bottom-color:var(--line)}}
|
|
34
|
+
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}}
|
|
24
35
|
@media(prefers-reduced-motion:no-preference){.card,.hero{animation:arrive .35s ease both}@keyframes arrive{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}}
|
|
25
36
|
`;
|
|
26
37
|
export const CONSOLE_JS = `
|
|
27
|
-
const app=document.getElementById('app');let state=null;let csrf='';let active='overview';let output='选择一条命令或输入参数后运行。';let chatgptLocal=null;let chatgptRemote=null;let chatgptLoading=false;let registryNamespaces=[];let registryItems=[];let registryDetail=null;let registryMode='skill';let registryNamespaceId=null;let registryName='';let registrySearch='';let registryLoading=false;let registryError='';const noAvailableAccountGuidance='当前用户没有绑定可用的 ChatGPT 账号。请前往 OA 系统提交 IT11 工单,申请独享或共享的 ChatGPT 个人账号。';
|
|
38
|
+
const app=document.getElementById('app');let state=null;let csrf='';let active='overview';let output='选择一条命令或输入参数后运行。';let chatgptLocal=null;let chatgptRemote=null;let chatgptLoading=false;let registryCapabilities=null;let registryNamespaces=[];let registryItems=[];let registryDetail=null;let registryAux=null;let registryMode='skill';let registryWorkspace='catalog';let registryNamespaceId=null;let registryName='';let registrySearch='';let registryLoading=false;let registryError='';let registryNotice='';const noAvailableAccountGuidance='当前用户没有绑定可用的 ChatGPT 账号。请前往 OA 系统提交 IT11 工单,申请独享或共享的 ChatGPT 个人账号。';
|
|
28
39
|
const esc=(v)=>String(v??'').replace(/[&<>"']/g,(c)=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
|
|
29
40
|
async function api(path,init={}){const headers={'Accept':'application/json',...(init.body?{'Content-Type':'application/json'}:{}),...(csrf?{'x-numa-console-csrf':csrf}:{})};const response=await fetch(path,{...init,headers:{...headers,...(init.headers||{})},credentials:'same-origin'});const body=await response.json().catch(()=>({error:{message:'响应不是 JSON'}}));if(!response.ok)throw new Error(body.error?.message||body.stderr||body.stdout||('HTTP '+response.status));return body}
|
|
30
41
|
async function bootstrap(attempt=0){try{state=await api('/api/bootstrap');csrf=state.csrfToken;const callbackState=new URLSearchParams(location.search).get('login');const waitingForSuccess=callbackState==='complete'&&!state.loggedIn&&attempt<40;const waitingForFailure=callbackState==='failed'&&!state.loginError&&attempt<8;if(waitingForSuccess||waitingForFailure){app.innerHTML='<div class="boot"><div class="boot-mark">N</div><p>'+(callbackState==='complete'?'登录成功,正在建立本机会话…':'正在读取登录失败信息…')+'</p></div>';setTimeout(()=>bootstrap(attempt+1),250);return}if(callbackState==='complete'&&!state.loggedIn&&!state.loginError)state.loginError='登录凭据交换尚未完成,请重试登录。';if(callbackState==='failed'&&!state.loginError)state.loginError='Keycloak 登录未完成,请重试。';if(callbackState)history.replaceState({},'',location.pathname);render()}catch(error){app.innerHTML='<div class="login-gate"><div class="login-card"><span class="tag role">连接失败</span><h2>本地控制台不可用</h2><p>'+esc(error.message)+'</p></div></div>'}}
|
|
31
42
|
function navButton(id,label,mark){return '<button data-nav="'+id+'" class="'+(active===id?'active':'')+'"><span>'+label+'</span><span class="mono">'+mark+'</span></button>'}
|
|
32
|
-
function shell(content){const user=state.user||{};const label=user.username||user.email||'未登录';return '<div class="shell"><aside class="rail"><div class="brand"><div class="brand-mark">N</div><div><strong>Numa CLI</strong><small>Local control plane</small></div></div><nav class="nav">'+navButton('overview','运行概览','01')+navButton('registry','AI Registry','02')+navButton('chatgpt','ChatGPT 账号','03')+navButton('config','基础配置','04')+navButton('commands','命令能力','05')+navButton('runner','执行器','06')+'</nav><div class="rail-foot"><strong><span class="pulse"></span>仅监听本机</strong><p>Token 不会发送给网页脚本,也不会出现在命令输出中。</p></div></aside><main class="main"><header class="topbar"><
|
|
43
|
+
function shell(content){const user=state.user||{};const label=user.username||user.email||'未登录';return '<div class="shell"><aside class="rail"><div class="brand"><div class="brand-mark">N</div><div><strong>Numa CLI</strong><small>Local control plane</small></div></div><nav class="nav">'+navButton('overview','运行概览','01')+navButton('registry','AI Registry','02')+navButton('chatgpt','ChatGPT 账号','03')+navButton('config','基础配置','04')+navButton('commands','命令能力','05')+navButton('runner','执行器','06')+'</nav><div class="rail-foot"><strong><span class="pulse"></span>仅监听本机</strong><p>Token 不会发送给网页脚本,也不会出现在命令输出中。</p></div></aside><main class="main"><header class="topbar"><h1>'+sectionTitle()+'</h1><div class="user-chip"><div class="avatar">'+esc(label.slice(0,1).toUpperCase())+'</div><div><strong>'+esc(label)+'</strong><br><small>'+esc(state.loggedIn?'Keycloak 会话有效':'需要登录')+'</small></div></div></header>'+content+'</main></div>'}
|
|
33
44
|
function sectionTitle(){return {overview:'运行概览',registry:'AI Registry',chatgpt:'ChatGPT 账号',config:'基础配置',commands:'命令能力',runner:'安全执行器'}[active]||'控制台'}
|
|
34
45
|
function loginGate(){const error=state?.loginError?'<div class="notice error">'+esc(state.loginError)+'</div>':'';return '<div class="login-gate"><div class="login-card"><span class="tag role">Keycloak PKCE</span><h2>登录后进入本地控制台</h2><p>浏览器只负责完成认证和操作本机 API。访问令牌保存在 CLI 的私有缓存中,不写入 localStorage,也不返回给页面。</p><div class="actions"><button class="button primary" data-action="login">使用 Keycloak 登录</button></div><div id="notice">'+error+'</div></div></div>'}
|
|
35
46
|
function overview(){const u=state.user||{};const roles=[...(u.realmRoles||[]),...Object.values(u.clientRoles||{}).flat()];return '<div class="content"><section class="hero"><div><div class="eyebrow">Authenticated workstation</div><h2>本机会话已接入研发控制面</h2><p>从同一处检查身份、调整 CLI 配置,并以结构化参数运行受支持命令。所有网络请求继续由 CLI 注入 Bearer Token。</p></div><div class="session-track"><div class="track-node live"><span>身份</span><strong>'+esc(u.username||'已登录')+'</strong></div><div class="track-node"><span>API</span><strong>'+esc(state.config.apiBaseUrl?'已配置':'未配置')+'</strong></div><div class="track-node"><span>角色</span><strong>'+roles.length+'</strong></div></div></section><section class="grid"><article class="card"><div class="eyebrow">Session</div><div class="metric">'+esc(state.expiresAt?new Date(state.expiresAt*1000).toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit'}):'—')+' <small>访问令牌到期</small></div><p>需要时由 CLI 使用 refresh token 自动续期。</p></article><article class="card"><div class="eyebrow">Commands</div><div class="metric">'+state.commands.length+' <small>条能力契约</small></div><p>网页执行器只接受目录中声明的命令。</p></article><article class="card"><div class="eyebrow">Endpoint</div><div class="metric">'+(state.config.apiBaseUrl?'READY':'SETUP')+'</div><p>'+esc(state.config.apiBaseUrl||'请在基础配置中填写平台 API 地址')+'</p></article><article class="card wide"><h3>当前身份</h3><p>'+esc(u.displayName||u.username||'-')+' · '+esc(u.email||'-')+'</p><div class="actions">'+roles.slice(0,8).map((r)=>'<span class="tag">'+esc(r)+'</span>').join('')+(roles.length>8?'<span class="tag public">+'+(roles.length-8)+'</span>':'')+'</div></article><article class="card"><h3>会话操作</h3><p>强制刷新身份资料,或清除本机 Keycloak 缓存。</p><div class="actions"><button class="button" data-action="reload">刷新状态</button><button class="button danger" data-action="logout">退出登录</button></div></article></section></div>'}
|
|
@@ -42,32 +53,76 @@ function quotaCell(quota){if(!quota)return '<span class="table-meta">暂无额
|
|
|
42
53
|
function newerQuota(localQuota,remoteQuota){if(!localQuota)return remoteQuota;if(!remoteQuota)return localQuota;return (instant(remoteQuota.updatedAt)||0)>=(instant(localQuota.updatedAt)||0)?remoteQuota:localQuota}
|
|
43
54
|
function mergedChatgptAccounts(){const local=chatgptLocal?.accounts||[];const remote=chatgptRemote?.accounts||[];const used=new Set();const rows=local.map((item)=>{const index=remote.findIndex((candidate,i)=>!used.has(i)&&item.accountId&&candidate.accountId===item.accountId);const match=index>=0?remote[index]:null;if(index>=0)used.add(index);return {key:item.id,local:item,remote:match,label:item.label,email:item.email,accountId:item.accountId||match?.accountId,enabled:item.enabled,selected:item.selected,quota:newerQuota(item.quota,match?.quota)}});remote.forEach((item,index)=>{if(!used.has(index))rows.push({key:'remote_'+item.id,local:null,remote:item,label:item.label,email:null,accountId:item.accountId,enabled:true,selected:item.isDefault,quota:item.quota})});return rows}
|
|
44
55
|
function syncTag(row){if(chatgptRemote?.status==='LOADING')return '<span class="tag waiting">正在同步</span>';if(chatgptRemote?.status==='FAILED')return '<span class="tag failed">远程同步失败</span>';if(chatgptRemote?.status==='NOT_CONFIGURED')return '<span class="tag waiting">未配置平台</span>';if(row.local&&row.remote)return '<span class="tag success">已同步</span>';if(row.local)return '<span class="tag local">仅本地</span>';return '<span class="tag success">平台可用</span>'}
|
|
45
|
-
function remoteStage(){const remote=chatgptRemote;if(!remote||remote.status==='LOADING')return {tag:'<span class="tag waiting"><span class="spin"
|
|
56
|
+
function remoteStage(){const remote=chatgptRemote;if(!remote||remote.status==='LOADING')return {tag:'<span class="tag waiting"><span class="refresh-icon spin" aria-hidden="true"></span> 连接中</span>',title:'正在连接平台',detail:'本地账号已经可见,正在读取远程可用账号。'};if(remote.status==='SUCCESS')return {tag:'<span class="tag success">同步成功</span>',title:remote.accounts.length+' 个平台账号',detail:'完成于 '+timeText(remote.syncedAt)};if(remote.status==='FAILED')return {tag:'<span class="tag failed">远程同步失败</span>',title:'保留本地结果',detail:remote.error?.message||'无法连接远程账号服务'};return {tag:'<span class="tag waiting">未配置</span>',title:'未配置平台地址',detail:'可在基础配置中填写平台 API 地址。'}}
|
|
46
57
|
function accountRows(rows){return rows.map((row)=>'<tr><td><div class="account-name"><strong>'+esc(row.label)+'</strong><small>'+esc(row.email||row.accountId||row.key)+'</small></div></td><td><div class="status-stack">'+(row.enabled?'<span class="tag success">可用</span>':'<span class="tag failed">已停用</span>')+(row.selected?'<span class="tag role">客户端已选</span>':'')+'</div></td><td>'+quotaCell(row.quota)+'</td><td><div class="table-meta">Token '+esc(row.local?'本地可用':'按需从平台获取')+'<br>到期 '+esc(timeText(row.local?.accessExpiresAt||row.remote?.accessExpiresAt))+'</div></td><td><div class="status-stack">'+syncTag(row)+'</div></td></tr>').join('')}
|
|
47
|
-
function chatgptPage(){const rows=mergedChatgptAccounts();const remote=remoteStage();const localReady=chatgptLocal?.status==='READY';const localCount=chatgptLocal?.available??0;const failure=chatgptRemote?.status==='FAILED'?'<div class="notice error"><strong>远程同步失败。</strong> '+esc(chatgptRemote.error?.message||'平台暂时不可用')+';本地账号数据仍可正常查看。</div>':'';return '<div class="content"><section class="hero"><div><div class="eyebrow">Local first / Remote second</div><h2>ChatGPT 账号运行视图</h2><p>先读取 codex-multi-auth 本地账号与额度缓存,再连接平台补充当前用户可用账号。页面永不接收 access token 或 refresh token。</p></div><div class="session-track"><div class="track-node live"><span>本地可用</span><strong>'+localCount+'</strong></div><div class="track-node"><span>汇总账号</span><strong>'+rows.length+'</strong></div><div class="track-node"><span>远程</span><strong>'+esc(chatgptRemote?.status||'WAITING')+'</strong></div></div></section><section class="sync-board"><article class="sync-stage"><div class="eyebrow">01 / Local pool</div><strong>'+(localReady?localCount+' 个本地可用账号':'正在读取本地账号')+'</strong><p>'+(localReady?'读取完成于 '+timeText(chatgptLocal.readAt):'优先读取 codex-multi-auth 安全摘要。')+'</p></article><div class="sync-link" aria-label="然后连接远程"></div><article class="sync-stage"><div class="eyebrow">02 / Platform service</div>'+remote.tag+'<strong>'+esc(remote.title)+'</strong><p>'+esc(remote.detail)+'</p></article></section>'+failure+'<section class="table-card"><header class="table-head"><div><h3>可用账号与剩余额度</h3><p>额度优先展示本地或服务器端更新较新的安全快照。</p></div><button class="button" data-action="chatgpt-refresh" '+(chatgptLoading?'disabled':'')+'
|
|
58
|
+
function chatgptPage(){const rows=mergedChatgptAccounts();const remote=remoteStage();const localReady=chatgptLocal?.status==='READY';const localCount=chatgptLocal?.available??0;const failure=chatgptRemote?.status==='FAILED'?'<div class="notice error"><strong>远程同步失败。</strong> '+esc(chatgptRemote.error?.message||'平台暂时不可用')+';本地账号数据仍可正常查看。</div>':'';return '<div class="content"><section class="hero"><div><div class="eyebrow">Local first / Remote second</div><h2>ChatGPT 账号运行视图</h2><p>先读取 codex-multi-auth 本地账号与额度缓存,再连接平台补充当前用户可用账号。页面永不接收 access token 或 refresh token。</p></div><div class="session-track"><div class="track-node live"><span>本地可用</span><strong>'+localCount+'</strong></div><div class="track-node"><span>汇总账号</span><strong>'+rows.length+'</strong></div><div class="track-node"><span>远程</span><strong>'+esc(chatgptRemote?.status||'WAITING')+'</strong></div></div></section><section class="sync-board"><article class="sync-stage"><div class="eyebrow">01 / Local pool</div><strong>'+(localReady?localCount+' 个本地可用账号':'正在读取本地账号')+'</strong><p>'+(localReady?'读取完成于 '+timeText(chatgptLocal.readAt):'优先读取 codex-multi-auth 安全摘要。')+'</p></article><div class="sync-link" aria-label="然后连接远程"></div><article class="sync-stage"><div class="eyebrow">02 / Platform service</div>'+remote.tag+'<strong>'+esc(remote.title)+'</strong><p>'+esc(remote.detail)+'</p></article></section>'+failure+'<section class="table-card"><header class="table-head"><div><h3>可用账号与剩余额度</h3><p>额度优先展示本地或服务器端更新较新的安全快照。</p></div><button class="button" data-action="chatgpt-refresh" '+(chatgptLoading?'disabled':'')+'><span class="refresh-icon '+(chatgptLoading?'spin':'')+'" aria-hidden="true"></span> '+(chatgptLoading?'同步中':'重新同步')+'</button></header>'+(rows.length?'<div class="account-table-wrap"><table class="account-table"><thead><tr><th>账号</th><th>可用状态</th><th>剩余 limit</th><th>凭据时效</th><th>同步状态</th></tr></thead><tbody>'+accountRows(rows)+'</tbody></table></div>':'<div class="empty-state'+(chatgptLoading?'':' account-request')+'">'+(chatgptLoading?'正在读取本地账号…':'<strong>需要申请 ChatGPT 账号</strong><span>'+esc(noAvailableAccountGuidance)+'</span>')+'</div>')+'</section></div>'}
|
|
48
59
|
function registryPageItems(payload){if(Array.isArray(payload))return payload.filter((item)=>item&&typeof item==='object');for(const key of ['pageItems','items','records','list','data']){const value=payload?.[key];if(Array.isArray(value))return value.filter((item)=>item&&typeof item==='object');if(value&&typeof value==='object'){const nested=registryPageItems(value);if(nested.length)return nested}}return []}
|
|
49
|
-
function registryItemName(item,index){return String(item?.name??item?.skillName??item?.mcpName??((registryMode==='skill'?'skill-':'mcp-')+(index+1)))}
|
|
60
|
+
function registryItemName(item,index){return String(item?.name??item?.skillName??item?.mcpName??item?.requestId??item?.eventType??item?.bindingId??((registryMode==='skill'?'skill-':'mcp-')+(index+1)))}
|
|
50
61
|
function registryItemStatus(item){return String(item?.status??item?.releaseStatus??item?.state??item?.version??'registered')}
|
|
51
|
-
function
|
|
62
|
+
function currentRegistryCapability(){const selected=registryNamespaces.find((namespace)=>Number(namespace.id)===Number(registryNamespaceId));return registryCapabilities?.namespaces?.find((candidate)=>candidate.namespaceKey===selected?.namespaceKey&&(!candidate.instanceCode||candidate.instanceCode===selected?.instanceCode))||null}
|
|
63
|
+
function registryCan(action){const actions=currentRegistryCapability()?.actions||[];return actions.some((value)=>value===action||value.endsWith(':'+action)||value.endsWith('.'+action))}
|
|
64
|
+
function registryWorkspaceTabs(){const tabs=[['catalog','目录'],['approvals','发布收件箱'],['instances','实例 / 凭据'],['namespace','Namespace / Profile'],['router','Router'],['audit','权限 / 审计']];return '<div class="registry-workspaces" role="tablist" aria-label="AI Registry 工作区">'+tabs.map(([id,label])=>'<button role="tab" aria-selected="'+(registryWorkspace===id)+'" data-registry-workspace="'+id+'" class="'+(registryWorkspace===id?'active':'')+'">'+label+'</button>').join('')+'</div>'}
|
|
52
65
|
function registryNamespaceOptions(){return registryNamespaces.map((namespace)=>'<option value="'+namespace.id+'" '+(Number(namespace.id)===Number(registryNamespaceId)?'selected':'')+'>'+esc(namespace.displayName)+' · '+esc(namespace.namespaceKey)+' · '+esc(namespace.instanceCode)+(namespace.isDefault?' · default':'')+'</option>').join('')}
|
|
53
66
|
function registryItemButtons(){return registryItems.map((item,index)=>{const name=registryItemName(item,index);const status=registryItemStatus(item);const online=/online|published|release/i.test(status);return '<button class="registry-item '+(name===registryName?'active':'')+'" data-registry-name="'+esc(name)+'"><span class="registry-dot '+(online?'online':'')+'"></span><span><strong>'+esc(name)+'</strong><small>'+esc(status)+(item.scope?' · '+esc(item.scope):'')+'</small></span></button>'}).join('')||'<div class="empty-state">没有匹配的 '+(registryMode==='skill'?'Skill':'MCP Server')+'</div>'}
|
|
54
67
|
function registryTargets(){const targets=registryMode==='skill'?['chatgpt','codex','claude','cursor','workbuddy','openclaw','agents']:['chatgpt','codex','claude','cursor','workbuddy','openclaw'];return targets.map((target)=>'<option value="'+target+'">'+target+'</option>').join('')}
|
|
55
|
-
function
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
function
|
|
68
|
+
function compactValue(value){if(value==null||value==='')return '—';if(Array.isArray(value))return value.length?value.map((item)=>typeof item==='object'?(item.name??item.id??'record'):item).join(', '):'—';if(typeof value==='object')return value.displayName??value.name??value.status??Object.keys(value).length+' fields';return String(value)}
|
|
69
|
+
function summaryCells(entries){return '<div class="summary-grid">'+entries.map(([label,value])=>'<div class="summary-cell"><span>'+esc(label)+'</span><strong>'+esc(compactValue(value))+'</strong></div>').join('')+'</div>'}
|
|
70
|
+
function rawDisclosure(value,label='查看原始响应'){return '<details class="raw-disclosure"><summary>'+esc(label)+'</summary><pre class="output wrap">'+esc(JSON.stringify(value??{},null,2))+'</pre></details>'}
|
|
71
|
+
function registryDetailSummary(detail){const tags=detail?.tags??detail?.labels;const owner=detail?.ownerTeamCode??detail?.ownerTeam??detail?.teamCode;const entries=registryMode==='skill'?[['精确版本',detail?.version??detail?.latestVersion],['治理状态',detail?.status??detail?.state],['可见性',detail?.visibility??detail?.scope],['责任团队',owner],['标签',tags],['扫描',detail?.scanStatus??detail?.pipelineStatus]]:[['精确版本',detail?.version??detail?.latestVersion],['治理状态',detail?.status??detail?.state],['协议',detail?.protocol??detail?.transport],['责任团队',owner],['工具数量',Array.isArray(detail?.tools)?detail.tools.length:detail?.toolCount],['Endpoint 健康',detail?.health??detail?.endpointStatus]];return summaryCells(entries)+rawDisclosure(detail)}
|
|
72
|
+
function registryDetailPanel(){if(registryLoading)return '<div class="empty-state" role="status"><span class="refresh-icon spin" aria-hidden="true"></span> 正在读取私有 Registry…</div>';if(!registryName)return '<div class="empty-state">从列表选择一项查看版本、标签和治理状态。</div>';const canSubmit=registryCan('submit');const mutating='<button class="button" data-registry-action="submit" '+(canSubmit?'':'disabled')+'>提交审核</button>';return '<div class="registry-detail-head"><div><h3>'+esc(registryName)+'</h3><span class="tag '+(canSubmit?'role':'public')+'">'+(canSubmit?'可提交草稿':'只读')+'</span></div><button class="button" data-action="registry-refresh"><span class="refresh-icon" aria-hidden="true"></span> 刷新详情</button></div>'+registryDetailSummary(registryDetail)+'<div class="registry-actions"><div class="install-row"><label class="field"><span>安装目标</span><select id="registry-target">'+registryTargets()+'</select></label><label class="field"><span>安装范围</span><select id="registry-scope"><option value="project">当前项目</option><option value="user">当前用户</option></select></label><button class="button primary" data-registry-action="install" '+(registryCan('install')||registryCan('use')?'':'disabled')+'>安装并锁定</button></div><div class="actions">'+mutating+'</div><small class="table-meta">目录只允许安装与提交 release request。批准和发布只在发布收件箱出现,最终授权和两人制校验由平台执行。</small><div id="registry-notice" aria-live="polite">'+registryNotice+'</div></div>'}
|
|
73
|
+
function instanceCards(){if(!registryItems.length)return '<div class="empty-state">没有可见的 Registry 实例。</div>';return '<div class="record-grid">'+registryItems.map((item)=>{const credentials=item.credentials||{};return '<article class="record-card"><div class="registry-detail-head"><h4>'+esc(item.displayName||item.code||'实例')+'</h4><span class="tag '+(item.status==='ACTIVE'?'success':'waiting')+'">'+esc(item.status||'UNKNOWN')+'</span></div><dl><dt>实例代码</dt><dd>'+esc(item.code||'—')+'</dd><dt>认证方式</dt><dd>'+esc(item.authenticationType||'—')+'</dd><dt>READER</dt><dd>'+esc(credentials.readerConfigured??item.credentialConfigured?'已验证':'未就绪')+'</dd><dt>MAINTAINER</dt><dd>'+esc(credentials.maintainerConfigured??item.credentialConfigured?'已验证':'未就绪')+'</dd><dt>LEGACY_BOTH</dt><dd>'+esc(credentials.legacyBothConfigured?'迁移中':'未启用')+'</dd><dt>乐观锁版本</dt><dd>'+esc(item.version??'—')+'</dd></dl></article>'}).join('')+'</div>'}
|
|
74
|
+
function registrySimplePanel(title,description){
|
|
75
|
+
if(registryLoading)return '<section class="registry-simple"><div class="empty-state" role="status">正在读取 '+esc(title)+'…</div></section>';
|
|
76
|
+
if(registryError)return '<section class="registry-simple"><div class="notice error" role="alert"><strong>'+esc(title)+'加载失败。</strong> '+esc(registryError)+' <button class="button" data-action="registry-retry">重试</button></div></section>';
|
|
77
|
+
if(registryWorkspace==='instances')return '<section class="registry-simple"><h3>'+esc(title)+'</h3><p>'+esc(description)+'</p>'+instanceCards()+'<small class="table-meta">浏览器只接收“是否已配置/验证”的布尔状态;Nacos 地址与 credential 永不进入 capability。</small></section>';
|
|
78
|
+
if(registryWorkspace==='namespace'){
|
|
79
|
+
const cap=currentRegistryCapability()||{};const selected=registryNamespaces.find((item)=>Number(item.id)===Number(registryNamespaceId));
|
|
80
|
+
return '<section class="registry-simple"><h3>'+esc(title)+'</h3><p>'+esc(description)+'</p><dl class="registry-facts"><div><dt>环境</dt><dd>'+esc(cap.environment||selected?.environment||'未声明')+'</dd></div><div><dt>访问策略</dt><dd>'+esc(selected?.accessPolicy||'由 capability 决定')+'</dd></div><div><dt>责任团队</dt><dd>'+esc(selected?.ownerTeamCode||'共享默认 namespace')+'</dd></div><div><dt>当前用户默认值</dt><dd>'+esc(state.config.aiRegistryDefaultNamespaceKey||'未设置')+'</dd></div><div><dt>Profile 默认值</dt><dd>'+esc(state.config.aiRegistryDefaultNamespaceKey?'被用户偏好覆盖':'解析时由 profile 提供')+'</dd></div><div><dt>Namespace 状态</dt><dd>'+esc(registryAux?.status||selected?.status||'UNKNOWN')+'</dd></div></dl><form id="registry-default-form" class="form-grid"><label class="field"><span>将授权 namespace 设为用户默认值</span><select name="namespaceKey">'+registryNamespaces.map((item)=>'<option value="'+esc(item.namespaceKey)+'" '+(item.namespaceKey===state.config.aiRegistryDefaultNamespaceKey?'selected':'')+'>'+esc(item.displayName)+' · '+esc(item.namespaceKey)+'</option>').join('')+'</select></label><div class="actions"><button class="button primary" type="submit">保存默认值</button><button class="button" type="button" data-registry-action="namespace-check">重新检查</button></div></form><small class="table-meta">解析顺序保持为命令参数 → 项目 manifest → 用户偏好 → profile 默认值;无效默认值会明确失败。</small><div id="registry-notice" aria-live="polite">'+registryNotice+'</div></section>';
|
|
81
|
+
}
|
|
82
|
+
if(registryWorkspace==='router'){
|
|
83
|
+
const router=registryDetail||currentRegistryCapability()?.router||{};const canConnect=registryCan('router.connect')||registryCan('connect');
|
|
84
|
+
return '<section class="registry-simple"><div class="registry-detail-head"><div><h3>'+esc(title)+'</h3><span class="tag '+(router.status==='READY'?'success':'waiting')+'">'+esc(router.status||'UNAVAILABLE')+'</span></div><button class="button" data-action="registry-refresh"><span class="refresh-icon" aria-hidden="true"></span> 刷新健康</button></div><p>'+esc(description)+'</p>'+summaryCells([['绑定',router.bindingId],['协议',router.protocol],['策略 revision',router.policyRevision],['健康',registryAux?.status??router.health],['Endpoint',router.endpoint],['OAuth resource',router.oauthResource]])+rawDisclosure({router:router,health:registryAux})+'<div class="actions"><button class="button" data-load="'+esc(JSON.stringify(['registry','router','connect']))+'" '+(canConnect?'':'disabled')+'>连接适配器</button></div></section>';
|
|
85
|
+
}
|
|
86
|
+
if(registryWorkspace==='audit'){const cap=currentRegistryCapability()||{};const detail=registryDetail?'<div class="registry-detail-head"><h3>'+esc(registryName)+'</h3><button class="button" data-action="registry-refresh"><span class="refresh-icon" aria-hidden="true"></span> 刷新</button></div>'+summaryCells([['事件',registryDetail.eventType??registryDetail.action],['Request ID',registryDetail.requestId],['操作者',registryDetail.actor??registryDetail.subject],['结果',registryDetail.result??registryDetail.status],['发生时间',registryDetail.createdAt??registryDetail.occurredAt],['策略 revision',registryDetail.policyRevision]])+rawDisclosure(registryDetail):'<div class="empty-state">选择审计事件查看关联 requestId 与结果。</div>';return '<section class="registry-simple"><h3>'+esc(title)+'</h3><p>'+esc(description)+'</p><div class="permission-grid">'+(cap.actions||[]).map((action)=>'<span class="tag role">'+esc(action)+'</span>').join('')+(!(cap.actions||[]).length?'<span class="tag public">只读</span>':'')+'</div>'+summaryCells([['Policy revision',registryCapabilities?.policyRevision],['环境',cap.environment],['Router',cap.router?.status],['可用动作',(cap.actions||[]).length]])+'<section class="registry-board"><aside class="registry-list"><div class="registry-list-head"><strong>追加式审计</strong><span class="tag public">'+registryItems.length+'</span></div><div class="registry-items">'+registryItemButtons()+'</div></aside><article class="registry-detail">'+detail+'</article></section></section>'}
|
|
87
|
+
const requestState=String(registryDetail?.state??registryDetail?.status??'').toUpperCase();const canReview=requestState==='SUBMITTED'&®istryCan('review');const canPublish=requestState==='APPROVED'&®istryCan('publish');const approvalActions=registryWorkspace==='approvals'&®istryDetail?'<div class="registry-actions"><div class="actions"><button class="button" data-registry-action="approval-approve" '+(canReview?'':'disabled')+'>批准</button><button class="button danger" data-registry-action="approval-reject" '+(canReview?'':'disabled')+'>拒绝</button><button class="button primary" data-registry-action="approval-publish" '+(canPublish?'':'disabled')+'>发布已批准申请</button></div><small class="table-meta">提交人不能审核或发布自己的申请;状态和 capability 必须同时允许,服务端会再次校验。</small><div id="registry-notice" aria-live="polite">'+registryNotice+'</div></div>':'';
|
|
88
|
+
const detail=registryDetail?'<div class="registry-detail-head"><h3>'+esc(registryName)+'</h3><button class="button" data-action="registry-refresh"><span class="refresh-icon" aria-hidden="true"></span> 刷新</button></div>'+summaryCells([['资源类型',registryDetail.resourceType],['资源',registryDetail.resourceName??registryDetail.name],['精确版本',registryDetail.resourceVersion],['状态',registryDetail.state??registryDetail.status],['提交人',registryDetail.submitter??registryDetail.createdBy],['乐观锁版本',registryDetail.version]])+rawDisclosure(registryDetail)+approvalActions:'<div class="empty-state">选择 release request 查看状态和可执行操作。</div>';
|
|
89
|
+
return '<section class="registry-board"><aside class="registry-list"><div class="registry-list-head"><strong>'+esc(title)+'</strong><span class="tag public">'+registryItems.length+'</span></div><div class="registry-items">'+registryItemButtons()+'</div></aside><article class="registry-detail">'+detail+'</article></section>';
|
|
90
|
+
}
|
|
91
|
+
function registryContent(){if(registryWorkspace==='catalog')return '<section class="registry-board"><aside class="registry-list"><div class="registry-list-head"><strong>'+(registryMode==='skill'?'Skills':'MCP Servers')+'</strong><span class="tag public">'+registryItems.length+'</span></div><div class="registry-items">'+registryItemButtons()+'</div></aside><article class="registry-detail">'+registryDetailPanel()+'</article></section>';const labels={approvals:['发布收件箱','审核者与发布者在这里处理两人制 release request。'],instances:['实例与双凭据','平台只显示凭据是否就绪,不把 secret 返回浏览器。'],namespace:['Namespace 与 Profile 默认值','当前环境、授权动作和 namespace 解析来源保持可见。'],router:['企业 Router','只有 READY 的 Streamable HTTP Endpoint 才会进入 capability。'],audit:['权限与追加式审计','按 requestId 追踪拒绝、审批、发布和对账事件。']};return registrySimplePanel(...labels[registryWorkspace])}
|
|
92
|
+
function registryPage(){const selected=registryNamespaces.find((namespace)=>Number(namespace.id)===Number(registryNamespaceId));const cap=currentRegistryCapability();const error=registryError&®istryWorkspace==='catalog'?'<div class="notice error registry-error" role="alert"><strong>目录加载失败。</strong> '+esc(registryError)+' <button class="button" data-action="registry-retry">重试</button></div>':'';return '<div class="content"><section class="hero registry-hero"><div><h2>团队能力的发布与运行边界</h2><p>目录、审批和 Router 共享一个 namespace 选择;Numa 只接收 capability 和治理元数据,不接触 Nacos 凭据。</p></div><div><small class="table-meta">生命周期契约 · rejected / failed / offline 为分支状态</small><div class="lifecycle" aria-label="生命周期图例,不表示当前状态"><div class="life-node">draft</div><div class="life-node">submitted</div><div class="life-node">approved</div><div class="life-node">publishing</div><div class="life-node">published</div></div></div></section>'+registryWorkspaceTabs()+'<section class="registry-toolbar"><label class="field"><span>Namespace</span><select id="registry-namespace">'+registryNamespaceOptions()+'</select></label>'+(registryWorkspace==='catalog'?'<div class="segment" role="group" aria-label="资源类型"><button data-registry-mode="skill" class="'+(registryMode==='skill'?'active':'')+'">Skills</button><button data-registry-mode="mcp" class="'+(registryMode==='mcp'?'active':'')+'">MCP</button></div><label class="field"><span>过滤</span><input id="registry-search" maxlength="80" value="'+esc(registrySearch)+'" placeholder="名称或描述"></label>':'<div class="registry-context"><strong>'+esc(selected?.displayName||'未选择')+'</strong><span>'+esc(cap?.environment||'unknown')+' · '+esc(cap?.router?.status||'NO ROUTER')+'</span></div>')+'<button class="button" data-action="registry-refresh" '+(registryLoading?'disabled':'')+'><span class="refresh-icon '+(registryLoading?'spin':'')+'" aria-hidden="true"></span> '+(registryLoading?'读取中…':'刷新')+'</button></section>'+error+registryContent()+'<div class="sr-only" aria-live="polite">'+esc(registryLoading?'正在加载':registryError||registryNotice||'加载完成')+'</div></div>'}
|
|
93
|
+
async function loadRegistry(resetNamespaces=false){if(registryLoading)return;registryLoading=true;registryError='';render();try{if(resetNamespaces||!registryNamespaces.length||!registryCapabilities){[registryCapabilities,registryNamespaces]=await Promise.all([api('/api/registry/capabilities'),api('/api/registry/namespaces')]);if(!Array.isArray(registryNamespaces)||!Array.isArray(registryCapabilities?.namespaces))throw new Error('capability 或 namespace 响应格式无效');const visible=registryNamespaces.filter((namespace)=>registryCapabilities.namespaces.some((candidate)=>candidate.namespaceKey===namespace.namespaceKey&&(!candidate.instanceCode||candidate.instanceCode===namespace.instanceCode)));registryNamespaces=visible;if(!registryNamespaceId||!registryNamespaces.some((namespace)=>Number(namespace.id)===Number(registryNamespaceId))){const preferred=state.config.aiRegistryDefaultNamespaceKey;const preferredNamespace=preferred?registryNamespaces.find((namespace)=>namespace.namespaceKey===preferred):null;if(preferred&&!preferredNamespace)throw new Error('用户默认 namespace '+preferred+' 不在 capability 授权列表中;请显式修改默认值。');registryNamespaceId=preferredNamespace?.id??registryNamespaces[0]?.id??null}}if(!registryNamespaceId){registryItems=[];registryDetail=null;throw new Error('当前用户没有可见的 Registry namespace。请联系责任团队或管理员授权。')}registryAux=null;if(registryWorkspace==='catalog'){const endpoint=registryMode==='skill'?'/api/registry/skills':'/api/registry/mcp';const payload=await api(endpoint+'?namespaceId='+encodeURIComponent(registryNamespaceId)+(registrySearch?'&search='+encodeURIComponent(registrySearch):''));registryItems=registryPageItems(payload);if(registryName&&!registryItems.some((item,index)=>registryItemName(item,index)===registryName)){registryName='';registryDetail=null}}else if(registryWorkspace==='approvals'||registryWorkspace==='audit'){const endpoint=registryWorkspace==='approvals'?'/api/registry/approvals':'/api/registry/audit';const payload=await api(endpoint+'?namespaceId='+encodeURIComponent(registryNamespaceId));registryItems=registryPageItems(payload);registryDetail=null;registryName=''}else if(registryWorkspace==='instances'){registryItems=registryPageItems(await api('/api/registry/instances'));registryDetail=null;registryName=''}else if(registryWorkspace==='namespace'){registryAux=await api('/api/registry/namespace-health?namespaceId='+encodeURIComponent(registryNamespaceId));registryItems=[];registryDetail=null;registryName=''}else if(registryWorkspace==='router'){[registryDetail,registryAux]=await Promise.all([api('/api/registry/router?namespaceId='+encodeURIComponent(registryNamespaceId)),api('/api/registry/router-health?namespaceId='+encodeURIComponent(registryNamespaceId))]);registryItems=[];registryName=''}else{registryItems=[];registryDetail=null;registryName=''}}catch(error){registryError=error.message;registryItems=[];registryDetail=null;registryAux=null}finally{registryLoading=false;render()}}
|
|
94
|
+
async function selectRegistryItem(name){registryName=name;if(registryWorkspace!=='catalog'){registryDetail=registryItems.find((item,index)=>registryItemName(item,index)===name)||null;render();return}registryLoading=true;registryError='';render();try{const endpoint=registryMode==='skill'?'/api/registry/skill':'/api/registry/mcp-detail';registryDetail=await api(endpoint+'?namespaceId='+encodeURIComponent(registryNamespaceId)+'&name='+encodeURIComponent(name))}catch(error){registryError=error.message;registryDetail=null}finally{registryLoading=false;render()}}
|
|
95
|
+
async function runRegistryCommand(argv,successMessage){const selectedName=registryName;registryNotice='<div class="notice success">正在执行…</div>';render();try{const result=await api('/api/commands/run',{method:'POST',body:JSON.stringify({argv,confirm:false})});if(result.exitCode!==0)throw new Error(result.stderr||result.stdout||'命令执行失败');await loadRegistry();if(selectedName&®istryItems.some((item,index)=>registryItemName(item,index)===selectedName))await selectRegistryItem(selectedName);registryNotice='<div class="notice success">'+esc(successMessage)+'</div>';render()}catch(error){registryNotice='<div class="notice error">'+esc(error.message)+'</div>';render()}}
|
|
96
|
+
async function registryAction(action){if(!registryNamespaceId)return;const selected=registryNamespaces.find((namespace)=>Number(namespace.id)===Number(registryNamespaceId));if(!selected)throw new Error('未选择 namespace');if(action==='namespace-check'){registryNotice='<div class="notice success">正在检查 namespace…</div>';render();try{registryAux=await api('/api/registry/namespace-health?namespaceId='+encodeURIComponent(registryNamespaceId));registryNotice='<div class="notice success">检查完成:'+esc(registryAux?.status||'已响应')+'</div>'}catch(error){registryNotice='<div class="notice error">'+esc(error.message)+'</div>'}render();return}if(!registryName)return;const targetArgs=['--namespace',String(selected.namespaceKey),'--instance',String(selected.instanceCode)];if(action==='install'){const agent=document.getElementById('registry-target').value;let scope=document.getElementById('registry-scope').value;if(registryMode==='mcp'&&(agent==='codex'||agent==='openclaw'))scope='user';const argv=['registry',registryMode,'install',registryName,...targetArgs,'--agent',agent,'--scope',scope];if(registryMode==='skill')argv.push('--label','latest');await runRegistryCommand(argv,'已完成本机安装');return}if(action==='submit'){const version=prompt('输入要提交审核的精确版本');if(!version)return;const reason=prompt('输入发布说明');if(!reason)return;await runRegistryCommand(['registry','approvals','submit',registryMode,registryName,...targetArgs,'--resource-version',version,'--reason',reason],'已提交发布申请');return}if(action.startsWith('approval-')){const operation=action.slice('approval-'.length);if(!confirm('确认对申请 '+registryName+' 执行 '+operation+'?'))return;const optimisticVersion=registryDetail?.version;const versionArgs=Number.isInteger(optimisticVersion)?['--version',String(optimisticVersion)]:[];if(operation==='publish'){await runRegistryCommand(['registry','approvals','publish',registryName,...versionArgs],'发布已开始');return}const reason=prompt(operation==='approve'?'输入批准原因':'输入拒绝原因');if(!reason)return;await runRegistryCommand(['registry','approvals','review',registryName,'--decision',operation==='approve'?'APPROVED':'REJECTED','--reason',reason,...versionArgs],operation==='approve'?'已批准':'已拒绝');return}}
|
|
97
|
+
function configPage(){const c=state.config;return '<div class="content"><section class="grid"><article class="card full"><h3>基础配置</h3><p>与 <code>numa config --set</code> 使用同一份配置和校验逻辑。</p><form id="config-form" class="form-grid"><div class="field"><label>界面语言</label><select name="locale"><option '+(c.locale==='zh-CN'?'selected':'')+'>zh-CN</option><option '+(c.locale==='en-US'?'selected':'')+'>en-US</option></select></div><div class="field"><label>默认输出</label><select name="output"><option '+(c.output==='text'?'selected':'')+'>text</option><option '+(c.output==='json'?'selected':'')+'>json</option></select></div><div class="field span-2"><label>平台 API 地址</label><input name="apiBaseUrl" value="'+esc(c.apiBaseUrl)+'" placeholder="https://platform.example/api"></div><div class="field"><label>AI Registry 用户默认 namespace</label><input name="aiRegistryDefaultNamespaceKey" maxlength="160" value="'+esc(c.aiRegistryDefaultNamespaceKey||'')+'" placeholder="由项目或 profile 提供时可留空"></div><div class="field"><label>npm registry</label><input name="registryUrl" value="'+esc(c.registryUrl)+'"></div><label class="field span-2"><span>更新检查</span><select name="checkUpdates"><option value="true" '+(c.checkUpdates?'selected':'')+'>启用</option><option value="false" '+(!c.checkUpdates?'selected':'')+'>关闭</option></select></label><div class="actions span-2"><button class="button primary" type="submit">保存配置</button></div></form><div id="notice" aria-live="polite"></div></article></section></div>'}
|
|
62
98
|
function commandsPage(){return '<div class="content"><section class="card full"><div class="command-toolbar"><div class="field grow"><label>过滤命令</label><input id="command-search" placeholder="例如 codex、media、auth"></div></div><div id="command-list" class="command-list">'+commandCards('')+'</div></section></div>'}
|
|
63
99
|
function commandCards(query){const q=query.toLowerCase();return state.commands.filter((c)=>(c.command+' '+c.summary).toLowerCase().includes(q)).map((c)=>'<article class="command"><div class="command-head"><code>'+esc(c.command)+'</code><span class="tag '+esc(c.access)+'">'+esc(c.access)+'</span></div><p>'+esc(c.summary)+'</p><small>'+esc(c.examples[0]||'')+'</small><div class="actions mt-10"><button class="button" data-load="'+esc(JSON.stringify(commandPrefix(c.command)))+'">载入执行器</button></div></article>').join('')||'<p>没有匹配命令。</p>'}
|
|
64
|
-
function commandPrefix(command){return command.split(
|
|
100
|
+
function commandPrefix(command){return command.split(/\\s+/).filter((part)=>!part.startsWith('[')&&!part.startsWith('<')&&!part.startsWith('--'))}
|
|
65
101
|
function runnerPage(){return '<div class="content"><section class="grid"><article class="card"><div class="eyebrow">Structured argv</div><h3>安全执行器</h3><p>使用 JSON 数组传入参数,不经过 shell。长驻或交互命令需要在终端运行。</p><form id="runner-form"><div class="field"><label>命令参数</label><textarea id="argv" class="mono">["doctor"]</textarea></div><label class="field mt-12"><span>危险操作确认</span><select id="confirm"><option value="false">未确认</option><option value="true">确认执行删除/重置</option></select></label><div class="actions mt-14"><button class="button primary" type="submit">运行命令</button></div></form></article><article class="card wide"><div class="eyebrow">Result stream</div><h3>结构化输出</h3><pre id="output" class="output">'+esc(output)+'</pre></article></section></div>'}
|
|
66
102
|
async function loadChatgpt(){if(chatgptLoading)return;chatgptLoading=true;chatgptLocal=null;chatgptRemote={status:'LOADING',accounts:[]};render();try{chatgptLocal=await api('/api/chatgpt/local')}catch(error){chatgptLocal={status:'FAILED',accounts:[],available:0,total:0,error:{message:error.message}}}render();try{chatgptRemote=await api('/api/chatgpt/remote')}catch(error){chatgptRemote={status:'FAILED',accounts:[],syncedAt:Date.now(),error:{message:error.message}}}finally{chatgptLoading=false;render()}}
|
|
67
103
|
function render(){if(!state.loggedIn){app.innerHTML=loginGate();bind();return}const page=active==='overview'?overview():active==='registry'?registryPage():active==='chatgpt'?chatgptPage():active==='config'?configPage():active==='commands'?commandsPage():runnerPage();app.innerHTML=shell(page);bind()}
|
|
68
104
|
function notice(message,type='success'){const target=document.getElementById('notice');if(target)target.innerHTML='<div class="notice '+type+'">'+esc(message)+'</div>'}
|
|
69
105
|
function bindCommandLoaders(){document.querySelectorAll('[data-load]').forEach((b)=>b.addEventListener('click',()=>{const argv=JSON.parse(b.dataset.load);active='runner';render();document.getElementById('argv').value=JSON.stringify(argv)}))}
|
|
70
|
-
function bind(){
|
|
106
|
+
function bind(){
|
|
107
|
+
document.querySelectorAll('[data-nav]').forEach((b)=>b.addEventListener('click',()=>{active=b.dataset.nav;render();if(active==='chatgpt'&&!chatgptLocal&&!chatgptLoading)void loadChatgpt();if(active==='registry'&&!registryNamespaces.length&&!registryLoading)void loadRegistry(true)}));
|
|
108
|
+
document.querySelector('[data-action="chatgpt-refresh"]')?.addEventListener('click',()=>void loadChatgpt());
|
|
109
|
+
document.querySelectorAll('[data-action="registry-refresh"],[data-action="registry-retry"]')?.forEach((button)=>button.addEventListener('click',()=>registryWorkspace==='catalog'&®istryName?void selectRegistryItem(registryName):void loadRegistry()));
|
|
110
|
+
document.querySelectorAll('[data-registry-workspace]').forEach((button)=>button.addEventListener('click',()=>{registryWorkspace=button.dataset.registryWorkspace;registryName='';registryDetail=null;registryAux=null;registryError='';registryNotice='';void loadRegistry()}));
|
|
111
|
+
document.querySelectorAll('[data-registry-mode]').forEach((button)=>button.addEventListener('click',()=>{registryMode=button.dataset.registryMode;registryName='';registryDetail=null;void loadRegistry()}));
|
|
112
|
+
document.querySelectorAll('[data-registry-name]').forEach((button)=>button.addEventListener('click',()=>void selectRegistryItem(button.dataset.registryName)));
|
|
113
|
+
document.querySelectorAll('[data-registry-action]').forEach((button)=>button.addEventListener('click',()=>void registryAction(button.dataset.registryAction)));
|
|
114
|
+
document.getElementById('registry-namespace')?.addEventListener('change',(event)=>{registryNamespaceId=Number(event.target.value);registryName='';registryDetail=null;registryAux=null;void loadRegistry()});
|
|
115
|
+
document.getElementById('registry-search')?.addEventListener('change',(event)=>{registrySearch=event.target.value.trim();registryName='';registryDetail=null;void loadRegistry()});
|
|
116
|
+
document.getElementById('registry-search')?.addEventListener('keydown',(event)=>{if(event.key==='Enter'){event.preventDefault();registrySearch=event.target.value.trim();registryName='';registryDetail=null;void loadRegistry()}});
|
|
117
|
+
document.getElementById('registry-default-form')?.addEventListener('submit',async(event)=>{event.preventDefault();const namespaceKey=String(new FormData(event.currentTarget).get('namespaceKey')||'');if(!registryNamespaces.some((item)=>item.namespaceKey===namespaceKey)){registryNotice='<div class="notice error">只能选择 capability 中授权的 namespace。</div>';render();return}registryNotice='<div class="notice success">正在保存默认值…</div>';render();try{const data={...state.config,aiRegistryDefaultNamespaceKey:namespaceKey};const result=await api('/api/config',{method:'PUT',body:JSON.stringify(data)});state.config=result.config;registryNotice='<div class="notice success">用户默认 namespace 已保存。</div>'}catch(error){registryNotice='<div class="notice error">'+esc(error.message)+'</div>'}render()});
|
|
118
|
+
document.querySelector('[data-action="login"]')?.addEventListener('click',async()=>{try{notice('正在启动登录…');const result=await api('/api/auth/login',{method:'POST',body:'{}'});location.href=result.authorizationUrl}catch(e){notice(e.message,'error')}});
|
|
119
|
+
document.querySelector('[data-action="reload"]')?.addEventListener('click',()=>bootstrap());
|
|
120
|
+
document.querySelector('[data-action="logout"]')?.addEventListener('click',async()=>{if(!confirm('清除本机 Keycloak 登录缓存?'))return;await api('/api/auth/logout',{method:'POST',body:'{}'});location.reload()});
|
|
121
|
+
document.getElementById('config-form')?.addEventListener('submit',async(e)=>{e.preventDefault();const submit=e.currentTarget.querySelector('button[type="submit"]');if(submit)submit.disabled=true;const data=Object.fromEntries(new FormData(e.currentTarget));data.checkUpdates=data.checkUpdates==='true';try{const result=await api('/api/config',{method:'PUT',body:JSON.stringify(data)});state.config=result.config;notice('配置已保存')}catch(err){notice(err.message,'error')}finally{if(submit)submit.disabled=false}});
|
|
122
|
+
document.getElementById('command-search')?.addEventListener('input',(e)=>{document.getElementById('command-list').innerHTML=commandCards(e.target.value);bindCommandLoaders()});
|
|
123
|
+
bindCommandLoaders();
|
|
124
|
+
document.getElementById('runner-form')?.addEventListener('submit',async(e)=>{e.preventDefault();try{const argv=JSON.parse(document.getElementById('argv').value);const confirmed=document.getElementById('confirm')?.value==='true';output='运行中…';render();const result=await api('/api/commands/run',{method:'POST',body:JSON.stringify({argv,confirm:confirmed})});output=result.stdout||result.stderr||JSON.stringify(result,null,2);render()}catch(err){output='错误: '+err.message;render()}})
|
|
125
|
+
}
|
|
71
126
|
bootstrap();
|
|
72
127
|
`;
|
|
73
128
|
//# sourceMappingURL=web-console-page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-console-page.js","sourceRoot":"","sources":["../src/web-console-page.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG
|
|
1
|
+
{"version":3,"file":"web-console-page.js","sourceRoot":"","sources":["../src/web-console-page.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;QAoBpB,CAAC;AAET,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;CAc1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0FzB,CAAC"}
|
package/dist/web-console.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export interface WebConsoleOptions {
|
|
|
24
24
|
localChatgptLoader?: () => Promise<LocalCodexConsoleState>;
|
|
25
25
|
/** @deprecated Use remoteCodexLoader. */
|
|
26
26
|
remoteChatgptLoader?: () => Promise<RemoteCodexConsoleState>;
|
|
27
|
-
registryClientFactory?: () => Pick<AiRegistryClient, "listNamespaces" | "listSkills" | "listMcpServers" | "getSkill" | "getMcpServer">;
|
|
27
|
+
registryClientFactory?: () => Pick<AiRegistryClient, "getCapabilities" | "listInstances" | "listNamespaces" | "checkNamespace" | "listSkills" | "listMcpServers" | "getSkill" | "getMcpServer" | "listReleaseRequests" | "getRouter" | "checkRouter" | "listAuditEvents" | "reconcileNamespace">;
|
|
28
28
|
}
|
|
29
29
|
export interface WebConsoleHandle {
|
|
30
30
|
url: string;
|
package/dist/web-console.js
CHANGED
|
@@ -62,17 +62,18 @@ export function validateConsoleCommand(input, confirmed = false) {
|
|
|
62
62
|
if (commandKey === "config" && argv.length === 1) {
|
|
63
63
|
throw new Error("基础配置请使用控制台配置页,或为 config 提供 --show/--set 参数。");
|
|
64
64
|
}
|
|
65
|
-
const
|
|
65
|
+
const protectedMutation = commandKey === "auth logout" ||
|
|
66
66
|
commandKey === "codex reset" ||
|
|
67
67
|
commandKey === "registry instances delete" ||
|
|
68
68
|
commandKey === "registry namespaces delete" ||
|
|
69
69
|
commandKey === "registry skill delete" ||
|
|
70
70
|
commandKey === "registry mcp delete" ||
|
|
71
|
+
commandKey === "app candidate adopt" ||
|
|
71
72
|
commandKey === "pipeline stop" ||
|
|
72
73
|
commandKey === "pipeline retry" ||
|
|
73
74
|
(commandKey === "config" && argv.includes("--reset"));
|
|
74
|
-
if (
|
|
75
|
-
throw new Error("
|
|
75
|
+
if (protectedMutation && !confirmed) {
|
|
76
|
+
throw new Error("该命令会修改本地或远端状态,请先启用危险操作确认。");
|
|
76
77
|
}
|
|
77
78
|
return argv.includes("--json") ? argv : [...argv, "--json"];
|
|
78
79
|
}
|
|
@@ -293,6 +294,19 @@ export async function startWebConsole(options = {}) {
|
|
|
293
294
|
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().listNamespaces()));
|
|
294
295
|
return;
|
|
295
296
|
}
|
|
297
|
+
if (request.method === "GET" && url.pathname === "/api/registry/instances") {
|
|
298
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().listInstances()));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if (request.method === "GET" && url.pathname === "/api/registry/capabilities") {
|
|
302
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().getCapabilities()));
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (request.method === "GET" && url.pathname === "/api/registry/namespace-health") {
|
|
306
|
+
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
307
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().checkNamespace(namespaceId)));
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
296
310
|
if (request.method === "GET" && url.pathname === "/api/registry/skills") {
|
|
297
311
|
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
298
312
|
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().listSkills(namespaceId, {
|
|
@@ -322,6 +336,39 @@ export async function startWebConsole(options = {}) {
|
|
|
322
336
|
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().getMcpServer(namespaceId, name, version)));
|
|
323
337
|
return;
|
|
324
338
|
}
|
|
339
|
+
if (request.method === "GET" && url.pathname === "/api/registry/approvals") {
|
|
340
|
+
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
341
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().listReleaseRequests({
|
|
342
|
+
namespaceId,
|
|
343
|
+
state: url.searchParams.get("state")?.trim() || undefined,
|
|
344
|
+
limit: 50
|
|
345
|
+
})));
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
if (request.method === "GET" && url.pathname === "/api/registry/router") {
|
|
349
|
+
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
350
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().getRouter(namespaceId)));
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (request.method === "GET" && url.pathname === "/api/registry/router-health") {
|
|
354
|
+
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
355
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().checkRouter(namespaceId)));
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (request.method === "GET" && url.pathname === "/api/registry/audit") {
|
|
359
|
+
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
360
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().listAuditEvents({
|
|
361
|
+
namespaceId,
|
|
362
|
+
cursor: url.searchParams.get("cursor")?.trim() || undefined,
|
|
363
|
+
limit: 50
|
|
364
|
+
})));
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (request.method === "GET" && url.pathname === "/api/registry/reconciliation") {
|
|
368
|
+
const namespaceId = positiveId(url.searchParams.get("namespaceId"), "namespaceId");
|
|
369
|
+
sendJson(response, 200, sanitizeRegistryOutput(await registryClientFactory().reconcileNamespace(namespaceId)));
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
325
372
|
if (request.method !== "GET" && request.headers["x-numa-console-csrf"] !== csrfToken) {
|
|
326
373
|
sendError(response, new Error("CSRF validation failed."), 403);
|
|
327
374
|
return;
|
package/dist/web-console.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-console.js","sourceRoot":"","sources":["../src/web-console.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web-console.js","sourceRoot":"","sources":["../src/web-console.ts"],"names":[],"mappings":"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"}
|