pilotswarm 0.5.37 → 0.5.39
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/mcp/dist/src/tools/agent-packages.d.ts.map +1 -1
- package/mcp/dist/src/tools/agent-packages.js +34 -14
- package/mcp/dist/src/tools/agent-packages.js.map +1 -1
- package/package.json +3 -3
- package/tui/src/node-sdk-transport.js +113 -18
- package/ui/core/src/controller.js +196 -49
- package/ui/core/src/layout.js +10 -0
- package/ui/core/src/reducer.js +265 -20
- package/ui/core/src/selectors.js +132 -10
- package/ui/core/src/state.js +90 -2
- package/ui/core/src/themes/index.js +1 -1
- package/ui/react/src/web-app.js +1097 -220
- package/web/auth/config.js +3 -0
- package/web/auth/index.js +8 -1
- package/web/auth/normalize/proxy.js +48 -0
- package/web/auth/providers/proxy.js +141 -0
- package/web/dist/assets/{abnfDiagram-VRR7QNED-DlvPH-8O.js → abnfDiagram-VRR7QNED-Hsly1fgf.js} +1 -1
- package/web/dist/assets/{arc-r1liz5e5.js → arc-DiQLL9vM.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-Bci5dNH3.js → architectureDiagram-ZJ3FMSHR-B8ry8WNZ.js} +1 -1
- package/web/dist/assets/{blockDiagram-677ZJIJ3-Bug32AXp.js → blockDiagram-677ZJIJ3-Z4PcukIo.js} +1 -1
- package/web/dist/assets/{c4Diagram-LMCZKHZV-DwxSFqgE.js → c4Diagram-LMCZKHZV-Cahkc0gc.js} +1 -1
- package/web/dist/assets/channel-BHLBPE50.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-B_dbI_xg.js → chunk-2Q5K7J3B-CtZuWH4J.js} +1 -1
- package/web/dist/assets/{chunk-32BRIVSS-BkF68W-R.js → chunk-32BRIVSS-C0M390-k.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-BSbNIbJu.js → chunk-5VM5RSS4-ClvX9u5j.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-Blv_Iqa2.js → chunk-EX3LRPZG-BVAet5KG.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-Dk_dBFKd.js → chunk-JWPE2WC7-BccmZmrr.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-DqNFBrfw.js → chunk-MOJQB5TN-BN5MKe94.js} +1 -1
- package/web/dist/assets/{chunk-RYQCIY6F-Dlv7Svpb.js → chunk-RYQCIY6F-DfWw-ACP.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-DozGikwu.js → chunk-V7JOEXUC-BgUEoLnN.js} +1 -1
- package/web/dist/assets/{chunk-VR4S4FIN-CmkqvGT4.js → chunk-VR4S4FIN-k1eKfFNA.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-DyByai5N.js → chunk-XXDRQBXY-DPyV10yR.js} +1 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-rj9D2TSL.js +1 -0
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-rj9D2TSL.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-Bv-gRVvA.js → cose-bilkent-JH36ORCC-Bt_rpukK.js} +1 -1
- package/web/dist/assets/{cynefin-VYW2F7L2-DRnAsyZU.js → cynefin-VYW2F7L2-Z8eMzFMv.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-B1fnUtjo.js → cynefinDiagram-TSTJHNR4-BJSNawFi.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-DM6-QENB.js → dagre-VKFMJZFB-D6dNl8jc.js} +1 -1
- package/web/dist/assets/{diagram-FQU43EPY-BPxxnLdU.js → diagram-FQU43EPY-Cy1nbGsU.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-BgtJT3qF.js → diagram-G47NLZAW-CmrbuA_d.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-uekeIzsy.js → diagram-NH7WQ7WH-PoLNQE2j.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-BVy3JZWE.js → diagram-OA4YK3LP-BZwNFcSV.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-BWdjUr32.js → diagram-WEI45ONY-pKw0b_fN.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-DD4fwhNK.js → ebnfDiagram-CCIWWBDH-UNctuQCV.js} +1 -1
- package/web/dist/assets/{erDiagram-Q63AITRT-BllD_6Kh.js → erDiagram-Q63AITRT-DxIETMif.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-QEYKkAUN.js → flowDiagram-23GEKE2U-C06IdNKV.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-uZcfKTSW.js → ganttDiagram-NO4QXBWP-fU7aGyP1.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-XPdbPaH-.js → gitGraphDiagram-IHSO6WYX-9UKkPJm6.js} +1 -1
- package/web/dist/assets/index-B8nGlHwb.js +24 -0
- package/web/dist/assets/index-DtL0lbis.css +1 -0
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-DXCnQOJs.js → infoDiagram-FWYZ7A6U-C6F06SQJ.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-687_4FBy.js → ishikawaDiagram-FXEZZL3T-CB-O9NfO.js} +1 -1
- package/web/dist/assets/{journeyDiagram-5HDEW3XC-GXlKuda8.js → journeyDiagram-5HDEW3XC-B-8MOf-H.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-C38-2DvN.js → kanban-definition-HUTT4EX6-DX0XA3hI.js} +1 -1
- package/web/dist/assets/{linear-lGPXiBcz.js → linear-D60PrjTW.js} +1 -1
- package/web/dist/assets/{mermaid.core-C_neEtab.js → mermaid.core-bonzwapf.js} +4 -4
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-BaJ9tpEG.js → mindmap-definition-LN4V7U3C-Y-6Dum33.js} +1 -1
- package/web/dist/assets/{papaparse.min-rDwKYbBf.js → papaparse.min-Cas1JfRG.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-BdXJLYgY.js → pegDiagram-2B236MQR-_paO0yDw.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-DU19t6fM.js → pieDiagram-ENE6RG2P-xT1_Gpn4.js} +1 -1
- package/web/dist/assets/pilotswarm-BT6tOknQ.js +96 -0
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-CBkOdPp0.js → quadrantDiagram-ABIIQ3AL-1usdLFOF.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-D2DMcGDw.js → railroadDiagram-RFXS5EU6-R3lwHOz9.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-Bx9tF1pr.js → requirementDiagram-TGXJPOKE-BL8J1__Z.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-HTMAVEWB-DcLlRfsi.js → sankeyDiagram-HTMAVEWB-Dz6--0pl.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-xr6UVRBO.js → sequenceDiagram-DBY2YBRQ-CG2Xpkct.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-0fUkSXmg.js → sizeCapture-X5ZJPWSS-BPbYfjxj.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-BWgJGGpg.js → stateDiagram-2N3HPSRC-46x_y_aA.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-C2tnolSo.js +1 -0
- package/web/dist/assets/{swimlanes-5IMT3BWC-CZKya4_i.js → swimlanes-5IMT3BWC-SXdMo4zJ.js} +2 -2
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-Dh6Sn__t.js +8 -0
- package/web/dist/assets/{timeline-definition-FHXFAJF6-Df8BpeAu.js → timeline-definition-FHXFAJF6-CGgT-b38.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-ChX5bjT6.js → vennDiagram-L72KCM5P-BGS3xBa_.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-Dr48BgaJ.js → wardleyDiagram-EHGQE667-m2U3wEZJ.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG-Cia_MFfc.js → xychartDiagram-FW5EYKEG-DI6tQysg.js} +1 -1
- package/web/dist/index.html +3 -3
- package/web/runtime.js +30 -7
- package/web/dist/assets/channel-jVpSYat3.js +0 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-C78zSajE.js +0 -1
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-C78zSajE.js +0 -1
- package/web/dist/assets/index-BuDSoRIL.css +0 -1
- package/web/dist/assets/index-D1itTxvB.js +0 -24
- package/web/dist/assets/pilotswarm-BNKGG936.js +0 -96
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-DmAC8DdB.js +0 -1
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-CVYx20_X.js +0 -8
package/web/auth/config.js
CHANGED
package/web/auth/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createNoAuthProvider } from "./providers/none.js";
|
|
2
2
|
import { createEntraAuthProvider } from "./providers/entra.js";
|
|
3
3
|
import { createDevAuthProvider } from "./providers/dev.js";
|
|
4
|
+
import { createProxyAuthProvider } from "./providers/proxy.js";
|
|
4
5
|
import { authorizePrincipal } from "./authz/engine.js";
|
|
5
6
|
import { loadAuthorizationPolicy, resolveAuthProviderId, resolvePluginAuthConfigFromPluginDirs } from "./config.js";
|
|
6
7
|
|
|
@@ -11,6 +12,9 @@ const PROVIDERS = {
|
|
|
11
12
|
// PORTAL_AUTH_PROVIDER=dev selects it, and its factory throws without
|
|
12
13
|
// PORTAL_AUTH_DEV_ALLOW=true (see providers/dev.js).
|
|
13
14
|
dev: createDevAuthProvider,
|
|
15
|
+
// Identity established by an identity-aware proxy in front of the portal.
|
|
16
|
+
// Has no browser half: the proxy signs the user in before the SPA loads.
|
|
17
|
+
proxy: createProxyAuthProvider,
|
|
14
18
|
};
|
|
15
19
|
|
|
16
20
|
const NO_AUTH_UNKNOWN_PRINCIPAL = Object.freeze({
|
|
@@ -91,7 +95,10 @@ export async function authenticateToken(token, req) {
|
|
|
91
95
|
const policy = getAuthorizationPolicy();
|
|
92
96
|
|
|
93
97
|
if (provider.enabled) {
|
|
94
|
-
|
|
98
|
+
// A provider may establish identity from the request itself rather
|
|
99
|
+
// than from a bearer token — a proxy in front of the portal puts it in
|
|
100
|
+
// a header, and there is no token for the browser to send.
|
|
101
|
+
if (!token && !provider.authenticatesFromRequest) {
|
|
95
102
|
return buildDeniedResult({
|
|
96
103
|
status: 401,
|
|
97
104
|
error: "Unauthorized",
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function toStringArray(value) {
|
|
2
|
+
if (Array.isArray(value)) return value.map((entry) => String(entry).trim()).filter(Boolean);
|
|
3
|
+
if (typeof value === "string") {
|
|
4
|
+
return value.split(",").map((entry) => entry.trim()).filter(Boolean);
|
|
5
|
+
}
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function first(...values) {
|
|
10
|
+
for (const value of values) {
|
|
11
|
+
if (typeof value === "string" && value.trim()) return value.trim();
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Normalize a principal from whatever an identity-aware proxy put in front of
|
|
18
|
+
* us — either the claims of a signed assertion it minted, or plain headers.
|
|
19
|
+
*
|
|
20
|
+
* Claim and header names differ per proxy (Cloudflare Access, Google IAP, AWS
|
|
21
|
+
* ALB, Pomerium, oauth2-proxy, Authelia, Authentik), so every source is
|
|
22
|
+
* configurable and the defaults simply match the most common spelling.
|
|
23
|
+
*/
|
|
24
|
+
export function normalizeProxyPrincipal(claims = {}, opts = {}) {
|
|
25
|
+
const subjectClaim = opts.subjectClaim || "sub";
|
|
26
|
+
const emailClaim = opts.emailClaim || "email";
|
|
27
|
+
const nameClaim = opts.nameClaim || "name";
|
|
28
|
+
const rolesClaim = opts.rolesClaim || "roles";
|
|
29
|
+
const groupsClaim = opts.groupsClaim || "groups";
|
|
30
|
+
|
|
31
|
+
const email = first(claims[emailClaim], claims.email, claims.preferred_username, claims.upn);
|
|
32
|
+
// Fall back to the email when the proxy supplies no stable subject: an
|
|
33
|
+
// identity with no key at all cannot own sessions, and every downstream
|
|
34
|
+
// table is keyed on (provider, subject).
|
|
35
|
+
const subject = first(claims[subjectClaim], claims.sub, email);
|
|
36
|
+
if (!subject) return null;
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
provider: "proxy",
|
|
40
|
+
subject,
|
|
41
|
+
email,
|
|
42
|
+
displayName: first(claims[nameClaim], claims.name),
|
|
43
|
+
groups: toStringArray(claims[groupsClaim]),
|
|
44
|
+
roles: toStringArray(claims[rolesClaim]),
|
|
45
|
+
tenantId: null,
|
|
46
|
+
rawClaims: claims,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as jose from "jose";
|
|
2
|
+
import { normalizeProxyPrincipal } from "../normalize/proxy.js";
|
|
3
|
+
|
|
4
|
+
const JWKS_CACHE = new Map();
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Identity established by a proxy in front of the portal.
|
|
8
|
+
*
|
|
9
|
+
* Covers Cloudflare Access, Google IAP, AWS ALB, Pomerium, oauth2-proxy,
|
|
10
|
+
* Authelia and Authentik. They differ in only two ways — which header carries
|
|
11
|
+
* the identity, and whether it is signed — so both are configuration rather
|
|
12
|
+
* than separate providers.
|
|
13
|
+
*
|
|
14
|
+
* There is no browser half. The proxy completes the sign-in before the SPA
|
|
15
|
+
* loads, so the browser makes ordinary same-origin requests and PilotSwarm
|
|
16
|
+
* reads the identity off each one. That is the whole reason this provider is
|
|
17
|
+
* ~a tenth the size of an OIDC one: no PKCE, no token cache, no refresh.
|
|
18
|
+
*
|
|
19
|
+
* Two modes, with very different threat models:
|
|
20
|
+
*
|
|
21
|
+
* jwt (default) The proxy mints a signed assertion, verified here
|
|
22
|
+
* against its JWKS with issuer and audience checks. Safe no matter
|
|
23
|
+
* how the request arrived.
|
|
24
|
+
*
|
|
25
|
+
* header Plain, unsigned headers. ONLY safe when the portal is
|
|
26
|
+
* unreachable except through the proxy — otherwise anyone who can
|
|
27
|
+
* hit the origin sets the email header and becomes whoever they
|
|
28
|
+
* like. Opt-in via PORTAL_AUTH_PROXY_TRUST_HEADERS=true, and
|
|
29
|
+
* refuses to start without it.
|
|
30
|
+
*/
|
|
31
|
+
function getProxyConfig(env = process.env, pluginAuthConfig = {}) {
|
|
32
|
+
const mode = (env.PORTAL_AUTH_PROXY_MODE || "jwt").trim().toLowerCase();
|
|
33
|
+
const displayName = String(
|
|
34
|
+
pluginAuthConfig?.providers?.proxy?.displayName || pluginAuthConfig?.displayName || "Proxy",
|
|
35
|
+
).trim() || "Proxy";
|
|
36
|
+
|
|
37
|
+
const shared = {
|
|
38
|
+
mode,
|
|
39
|
+
displayName,
|
|
40
|
+
subjectClaim: env.PORTAL_AUTH_PROXY_SUBJECT_CLAIM,
|
|
41
|
+
emailClaim: env.PORTAL_AUTH_PROXY_EMAIL_CLAIM,
|
|
42
|
+
nameClaim: env.PORTAL_AUTH_PROXY_NAME_CLAIM,
|
|
43
|
+
rolesClaim: env.PORTAL_AUTH_PROXY_ROLES_CLAIM,
|
|
44
|
+
groupsClaim: env.PORTAL_AUTH_PROXY_GROUPS_CLAIM,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (mode === "header") {
|
|
48
|
+
const trusted = /^(1|true|yes|on)$/i.test(String(env.PORTAL_AUTH_PROXY_TRUST_HEADERS || "").trim());
|
|
49
|
+
if (!trusted) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
"PORTAL_AUTH_PROXY_MODE=header forwards identity in UNSIGNED headers, which anyone who can reach "
|
|
52
|
+
+ "the origin directly can forge. Set PORTAL_AUTH_PROXY_TRUST_HEADERS=true to confirm the portal is "
|
|
53
|
+
+ "reachable only through the proxy, or use the default signed-assertion mode.",
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
...shared,
|
|
58
|
+
subjectHeader: (env.PORTAL_AUTH_PROXY_SUBJECT_HEADER || "x-forwarded-user").toLowerCase(),
|
|
59
|
+
emailHeader: (env.PORTAL_AUTH_PROXY_EMAIL_HEADER || "x-forwarded-email").toLowerCase(),
|
|
60
|
+
nameHeader: (env.PORTAL_AUTH_PROXY_NAME_HEADER || "x-forwarded-preferred-username").toLowerCase(),
|
|
61
|
+
groupsHeader: (env.PORTAL_AUTH_PROXY_GROUPS_HEADER || "x-forwarded-groups").toLowerCase(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Default Cloudflare Access, the most common deployment.
|
|
66
|
+
const jwtHeader = (env.PORTAL_AUTH_PROXY_JWT_HEADER || "cf-access-jwt-assertion").toLowerCase();
|
|
67
|
+
const jwksUrl = (env.PORTAL_AUTH_PROXY_JWKS_URL || "").trim();
|
|
68
|
+
const issuer = (env.PORTAL_AUTH_PROXY_ISSUER || "").trim();
|
|
69
|
+
const audience = (env.PORTAL_AUTH_PROXY_AUDIENCE || "").trim();
|
|
70
|
+
if (!jwksUrl || !issuer || !audience) return null;
|
|
71
|
+
return { ...shared, jwtHeader, jwksUrl, issuer, audience };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function ensureJwks(jwksUrl) {
|
|
75
|
+
const cached = JWKS_CACHE.get(jwksUrl);
|
|
76
|
+
if (cached) return cached;
|
|
77
|
+
const jwks = jose.createRemoteJWKSet(new URL(jwksUrl));
|
|
78
|
+
JWKS_CACHE.set(jwksUrl, jwks);
|
|
79
|
+
return jwks;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function headerValue(req, name) {
|
|
83
|
+
const raw = req?.headers?.[name];
|
|
84
|
+
if (Array.isArray(raw)) return raw[0];
|
|
85
|
+
return typeof raw === "string" ? raw : undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function createProxyAuthProvider({ pluginAuthConfig, env = process.env } = {}) {
|
|
89
|
+
const config = getProxyConfig(env, pluginAuthConfig);
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
id: "proxy",
|
|
93
|
+
enabled: Boolean(config),
|
|
94
|
+
displayName: config?.displayName || "Proxy",
|
|
95
|
+
|
|
96
|
+
// The identity rides on the request, not on a bearer token, so the
|
|
97
|
+
// pipeline must not reject the call for having no token.
|
|
98
|
+
authenticatesFromRequest: true,
|
|
99
|
+
|
|
100
|
+
async authenticateRequest(_token, req) {
|
|
101
|
+
if (!config || !req) return null;
|
|
102
|
+
|
|
103
|
+
if (config.mode === "header") {
|
|
104
|
+
const subject = headerValue(req, config.subjectHeader);
|
|
105
|
+
const email = headerValue(req, config.emailHeader);
|
|
106
|
+
if (!subject && !email) return null;
|
|
107
|
+
return normalizeProxyPrincipal({
|
|
108
|
+
sub: subject,
|
|
109
|
+
email,
|
|
110
|
+
name: headerValue(req, config.nameHeader),
|
|
111
|
+
groups: headerValue(req, config.groupsHeader),
|
|
112
|
+
}, config);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const assertion = headerValue(req, config.jwtHeader);
|
|
116
|
+
if (!assertion) return null;
|
|
117
|
+
try {
|
|
118
|
+
const { payload } = await jose.jwtVerify(assertion, ensureJwks(config.jwksUrl), {
|
|
119
|
+
issuer: config.issuer,
|
|
120
|
+
audience: config.audience,
|
|
121
|
+
});
|
|
122
|
+
return normalizeProxyPrincipal(payload, config);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
console.error("[portal-auth:proxy] assertion validation failed:", error?.message || String(error));
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
async getPublicConfig() {
|
|
130
|
+
// No client-side configuration exists to hand out: the browser
|
|
131
|
+
// never talks to an identity provider, so `client` stays null and
|
|
132
|
+
// the SPA simply makes ordinary requests.
|
|
133
|
+
return {
|
|
134
|
+
enabled: Boolean(config),
|
|
135
|
+
provider: "proxy",
|
|
136
|
+
displayName: config?.displayName || "Proxy",
|
|
137
|
+
client: null,
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
package/web/dist/assets/{abnfDiagram-VRR7QNED-DlvPH-8O.js → abnfDiagram-VRR7QNED-Hsly1fgf.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-BN5MKe94.js";import{p as f}from"./chunk-JWPE2WC7-BccmZmrr.js";import{_ as n,l as o}from"./mermaid.core-bonzwapf.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-Z8eMzFMv.js";import"./pilotswarm-BT6tOknQ.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-
|
|
1
|
+
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-bonzwapf.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|