@yadsh/dsh-qa-surface 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +151 -0
- package/README.md +239 -16
- package/SPEC-dsh-qa-surface.md +600 -96
- package/capability-policy.json +5 -0
- package/compatibility.json +18 -4
- package/cordis.patch.yml +11 -0
- package/docs/ARCHITECTURE.md +50 -8
- package/docs/COMPATIBILITY.md +5 -4
- package/docs/CONFIGURATION.md +184 -3
- package/docs/SOURCES-MIGRATION.md +28 -0
- package/docs/SOURCES-PROVENANCE-AUDIT.md +88 -0
- package/docs/SPEC-dsh-qa-surface-accounts.md +219 -0
- package/docs/SPEC-dsh-qa-surface-sources-provenance.md +1692 -0
- package/lib/accounts/index.js +2 -0
- package/lib/accounts/index.js.map +1 -0
- package/lib/accounts/store.js +478 -0
- package/lib/accounts/store.js.map +1 -0
- package/lib/attestation.js +10 -0
- package/lib/attestation.js.map +1 -0
- package/lib/cli.js +143 -0
- package/lib/cli.js.map +1 -0
- package/lib/client/QaAccountsController.js +329 -0
- package/lib/client/QaAccountsController.js.map +1 -0
- package/lib/client/QaConfigController.js +111 -4
- package/lib/client/QaConfigController.js.map +1 -1
- package/lib/client/QaSessionController.js +621 -163
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +303 -24
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +324 -49
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/attestation.js +66 -0
- package/lib/client/attestation.js.map +1 -0
- package/lib/client/chat-index.js +86 -0
- package/lib/client/chat-index.js.map +1 -0
- package/lib/client/components/Markdown.js +124 -13
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaAgentsDrawer.js +40 -0
- package/lib/client/components/QaAgentsDrawer.js.map +1 -0
- package/lib/client/components/QaAuthGate.js +40 -0
- package/lib/client/components/QaAuthGate.js.map +1 -0
- package/lib/client/components/QaChangelog.js +112 -0
- package/lib/client/components/QaChangelog.js.map +1 -0
- package/lib/client/components/QaComposer.js +132 -15
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaMessage.js +214 -10
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaSidebar.js +167 -0
- package/lib/client/components/QaSidebar.js.map +1 -0
- package/lib/client/components/QaSourcesDrawer.js +127 -0
- package/lib/client/components/QaSourcesDrawer.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +281 -0
- package/lib/client/components/QaTurnRail.js.map +1 -0
- package/lib/client/components/QaWelcomeNotice.js +125 -0
- package/lib/client/components/QaWelcomeNotice.js.map +1 -0
- package/lib/client/components/QaWidthHandle.js +142 -0
- package/lib/client/components/QaWidthHandle.js.map +1 -0
- package/lib/client/components/QaWorkGroup.js +135 -0
- package/lib/client/components/QaWorkGroup.js.map +1 -0
- package/lib/client/components/VariantSwitcher.js +29 -0
- package/lib/client/components/VariantSwitcher.js.map +1 -0
- package/lib/client/components/format.js +48 -0
- package/lib/client/components/format.js.map +1 -0
- package/lib/client/components/source-refs.js +78 -0
- package/lib/client/components/source-refs.js.map +1 -0
- package/lib/client/create-session.js +51 -0
- package/lib/client/create-session.js.map +1 -0
- package/lib/client/index.js +166 -35
- package/lib/client/index.js.map +1 -1
- package/lib/client/project-session-state.js +78 -0
- package/lib/client/project-session-state.js.map +1 -0
- package/lib/client/session-admission.js +38 -0
- package/lib/client/session-admission.js.map +1 -0
- package/lib/client/session-assets.js +52 -0
- package/lib/client/session-assets.js.map +1 -0
- package/lib/client/session-sources.js +61 -0
- package/lib/client/session-sources.js.map +1 -0
- package/lib/client/settlement.js +24 -0
- package/lib/client/settlement.js.map +1 -0
- package/lib/client/styles.js +450 -43
- package/lib/client/styles.js.map +1 -1
- package/lib/client/tool-presentation.js +102 -0
- package/lib/client/tool-presentation.js.map +1 -0
- package/lib/client/turn-sources.js +98 -0
- package/lib/client/turn-sources.js.map +1 -0
- package/lib/client/types.js +15 -0
- package/lib/client/types.js.map +1 -0
- package/lib/client/use-session-ui-state.js +68 -0
- package/lib/client/use-session-ui-state.js.map +1 -0
- package/lib/client/use-transcript-view.js +44 -0
- package/lib/client/use-transcript-view.js.map +1 -0
- package/lib/client/wait-for.js +49 -0
- package/lib/client/wait-for.js.map +1 -0
- package/lib/client.js +12551 -918
- package/lib/client.js.map +1 -1
- package/lib/config.js +226 -58
- package/lib/config.js.map +1 -1
- package/lib/entry-redirect.js +44 -0
- package/lib/entry-redirect.js.map +1 -0
- package/lib/host-route.js +25 -1
- package/lib/host-route.js.map +1 -1
- package/lib/index.js +354 -72
- package/lib/index.js.map +1 -1
- package/lib/launch-token.js +42 -0
- package/lib/launch-token.js.map +1 -0
- package/lib/lockdown-policy.js +20 -0
- package/lib/lockdown-policy.js.map +1 -0
- package/lib/provenance/collector.js +40 -0
- package/lib/provenance/collector.js.map +1 -0
- package/lib/provenance/connectors.js +147 -0
- package/lib/provenance/connectors.js.map +1 -0
- package/lib/provenance/dedupe.js +89 -0
- package/lib/provenance/dedupe.js.map +1 -0
- package/lib/provenance/extractors.js +340 -0
- package/lib/provenance/extractors.js.map +1 -0
- package/lib/provenance/file-preview.js +39 -0
- package/lib/provenance/file-preview.js.map +1 -0
- package/lib/provenance/host-store.js +387 -0
- package/lib/provenance/host-store.js.map +1 -0
- package/lib/provenance/index.js +9 -0
- package/lib/provenance/index.js.map +1 -0
- package/lib/provenance/normalize.js +128 -0
- package/lib/provenance/normalize.js.map +1 -0
- package/lib/provenance/reported.js +53 -0
- package/lib/provenance/reported.js.map +1 -0
- package/lib/provenance/types.js +2 -0
- package/lib/provenance/types.js.map +1 -0
- package/lib/resolve-config.js +283 -10
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +212 -0
- package/lib/secure-session.js.map +1 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +784 -0
- package/lib/typert.remote-client.d.ts +40 -0
- package/lib/typert.remote-client.js +597 -0
- package/lib/types/accounts/index.d.ts +2 -0
- package/lib/types/accounts/store.d.ts +121 -0
- package/lib/types/attestation.d.ts +17 -0
- package/lib/types/cli.d.ts +9 -0
- package/lib/types/client/QaAccountsController.d.ts +95 -0
- package/lib/types/client/QaConfigController.d.ts +35 -3
- package/lib/types/client/QaSessionController.d.ts +146 -20
- package/lib/types/client/QaSurface.d.ts +11 -5
- package/lib/types/client/QaTranscriptAdapter.d.ts +13 -3
- package/lib/types/client/attestation.d.ts +25 -0
- package/lib/types/client/chat-index.d.ts +28 -0
- package/lib/types/client/components/Markdown.d.ts +17 -3
- package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
- package/lib/types/client/components/QaAuthGate.d.ts +15 -0
- package/lib/types/client/components/QaChangelog.d.ts +21 -0
- package/lib/types/client/components/QaComposer.d.ts +12 -2
- package/lib/types/client/components/QaMessage.d.ts +22 -2
- package/lib/types/client/components/QaSidebar.d.ts +69 -0
- package/lib/types/client/components/QaSourcesDrawer.d.ts +20 -0
- package/lib/types/client/components/QaTurnRail.d.ts +59 -0
- package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
- package/lib/types/client/components/QaWidthHandle.d.ts +36 -0
- package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
- package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
- package/lib/types/client/components/format.d.ts +9 -0
- package/lib/types/client/components/source-refs.d.ts +16 -0
- package/lib/types/client/create-session.d.ts +16 -0
- package/lib/types/client/index.d.ts +2 -5
- package/lib/types/client/project-session-state.d.ts +30 -0
- package/lib/types/client/session-admission.d.ts +23 -0
- package/lib/types/client/session-assets.d.ts +20 -0
- package/lib/types/client/session-sources.d.ts +28 -0
- package/lib/types/client/settlement.d.ts +6 -0
- package/lib/types/client/tool-presentation.d.ts +6 -0
- package/lib/types/client/turn-sources.d.ts +14 -0
- package/lib/types/client/types.d.ts +93 -0
- package/lib/types/client/use-session-ui-state.d.ts +35 -0
- package/lib/types/client/use-transcript-view.d.ts +20 -0
- package/lib/types/client/wait-for.d.ts +11 -0
- package/lib/types/entry-redirect.d.ts +20 -0
- package/lib/types/host-route.d.ts +14 -1
- package/lib/types/index.d.ts +67 -7
- package/lib/types/launch-token.d.ts +21 -0
- package/lib/types/lockdown-policy.d.ts +18 -0
- package/lib/types/provenance/collector.d.ts +26 -0
- package/lib/types/provenance/connectors.d.ts +11 -0
- package/lib/types/provenance/dedupe.d.ts +6 -0
- package/lib/types/provenance/extractors.d.ts +14 -0
- package/lib/types/provenance/file-preview.d.ts +10 -0
- package/lib/types/provenance/host-store.d.ts +54 -0
- package/lib/types/provenance/index.d.ts +10 -0
- package/lib/types/provenance/normalize.d.ts +13 -0
- package/lib/types/provenance/reported.d.ts +5 -0
- package/lib/types/provenance/types.d.ts +78 -0
- package/lib/types/secure-session.d.ts +31 -0
- package/lib/types/types.d.ts +304 -1
- package/package.json +70 -27
package/lib/index.js
CHANGED
|
@@ -1,83 +1,365 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
2
|
+
var useValue = arguments.length > 2;
|
|
3
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
4
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
5
|
+
}
|
|
6
|
+
return useValue ? value : void 0;
|
|
7
|
+
};
|
|
8
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
9
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
10
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
11
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
12
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
13
|
+
var _, done = false;
|
|
14
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
15
|
+
var context = {};
|
|
16
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
17
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
18
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
19
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
20
|
+
if (kind === "accessor") {
|
|
21
|
+
if (result === void 0) continue;
|
|
22
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
23
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
24
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
25
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
26
|
+
}
|
|
27
|
+
else if (_ = accept(result)) {
|
|
28
|
+
if (kind === "field") initializers.unshift(_);
|
|
29
|
+
else descriptor[key] = _;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
33
|
+
done = true;
|
|
34
|
+
};
|
|
35
|
+
import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
|
|
3
36
|
import { createHostLoggerSink, getPluginLogger, } from "@yadsh/dsh-plugin-log";
|
|
4
37
|
import { ConfigSchema, resolveConfig } from "./config.js";
|
|
38
|
+
import { QaAccounts, QaAccountsError, defaultAccountsFilePath, } from "./accounts/store.js";
|
|
39
|
+
import { QaAttestationError } from "./attestation.js";
|
|
40
|
+
import { entryRedirectRow } from "./entry-redirect.js";
|
|
5
41
|
import { registerQaNavigationRoute } from "./host-route.js";
|
|
42
|
+
import { makeLaunchTokenSource } from "./launch-token.js";
|
|
43
|
+
import { QaPolicyAdmission } from "./secure-session.js";
|
|
44
|
+
import { QaProvenanceHost } from "./provenance/host-store.js";
|
|
45
|
+
import { readSourceFilePreview } from "./provenance/file-preview.js";
|
|
6
46
|
export const name = "qa-surface";
|
|
7
|
-
export const inject = [
|
|
8
|
-
|
|
47
|
+
export const inject = [
|
|
48
|
+
"agents",
|
|
49
|
+
"sessions",
|
|
50
|
+
"agentPresets",
|
|
51
|
+
"permissionPresets",
|
|
52
|
+
"tools",
|
|
53
|
+
"systemPrompt",
|
|
54
|
+
"workspaceRegistry",
|
|
55
|
+
];
|
|
56
|
+
export const QA_SURFACE_SETTINGS_NAMESPACE = "qa-surface";
|
|
9
57
|
export const Config = ConfigSchema;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
58
|
+
const CONFIGURATION_ERROR = "Assistant configuration is unavailable.";
|
|
59
|
+
const ACCOUNTS_DISABLED_ERROR = "QA accounts are not enabled on this deployment.";
|
|
60
|
+
/** The `(reason: <code>)` marker contract shared with the attestation path. */
|
|
61
|
+
const ACCOUNTS_REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
|
|
62
|
+
/** Host companion: validates config, owns the admission boundary and the route. */
|
|
63
|
+
let QaSurface = (() => {
|
|
64
|
+
let _classSuper = TypertRemoteService;
|
|
65
|
+
let _instanceExtraInitializers = [];
|
|
66
|
+
let _accountsRegister_decorators;
|
|
67
|
+
let _accountsLogin_decorators;
|
|
68
|
+
let _accountsWhoami_decorators;
|
|
69
|
+
let _accountsClaimSessions_decorators;
|
|
70
|
+
let _accountsOwnedSessions_decorators;
|
|
71
|
+
let _accountsListOwnership_decorators;
|
|
72
|
+
let _describe_decorators;
|
|
73
|
+
let _secureSession_decorators;
|
|
74
|
+
let _sources_decorators;
|
|
75
|
+
let _readSourceFile_decorators;
|
|
76
|
+
return class QaSurface extends _classSuper {
|
|
77
|
+
static {
|
|
78
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
79
|
+
_accountsRegister_decorators = [Remote("accountsRegister")];
|
|
80
|
+
_accountsLogin_decorators = [Remote("accountsLogin")];
|
|
81
|
+
_accountsWhoami_decorators = [Remote("accountsWhoami")];
|
|
82
|
+
_accountsClaimSessions_decorators = [Remote("accountsClaimSessions")];
|
|
83
|
+
_accountsOwnedSessions_decorators = [Remote("accountsOwnedSessions")];
|
|
84
|
+
_accountsListOwnership_decorators = [Remote("accountsListOwnership")];
|
|
85
|
+
_describe_decorators = [Remote("describe")];
|
|
86
|
+
_secureSession_decorators = [Remote("secureSession")];
|
|
87
|
+
_sources_decorators = [Remote("sources")];
|
|
88
|
+
_readSourceFile_decorators = [Remote("readSourceFile")];
|
|
89
|
+
__esDecorate(this, null, _accountsRegister_decorators, { kind: "method", name: "accountsRegister", static: false, private: false, access: { has: obj => "accountsRegister" in obj, get: obj => obj.accountsRegister }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
90
|
+
__esDecorate(this, null, _accountsLogin_decorators, { kind: "method", name: "accountsLogin", static: false, private: false, access: { has: obj => "accountsLogin" in obj, get: obj => obj.accountsLogin }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
91
|
+
__esDecorate(this, null, _accountsWhoami_decorators, { kind: "method", name: "accountsWhoami", static: false, private: false, access: { has: obj => "accountsWhoami" in obj, get: obj => obj.accountsWhoami }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
92
|
+
__esDecorate(this, null, _accountsClaimSessions_decorators, { kind: "method", name: "accountsClaimSessions", static: false, private: false, access: { has: obj => "accountsClaimSessions" in obj, get: obj => obj.accountsClaimSessions }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
93
|
+
__esDecorate(this, null, _accountsOwnedSessions_decorators, { kind: "method", name: "accountsOwnedSessions", static: false, private: false, access: { has: obj => "accountsOwnedSessions" in obj, get: obj => obj.accountsOwnedSessions }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
94
|
+
__esDecorate(this, null, _accountsListOwnership_decorators, { kind: "method", name: "accountsListOwnership", static: false, private: false, access: { has: obj => "accountsListOwnership" in obj, get: obj => obj.accountsListOwnership }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
95
|
+
__esDecorate(this, null, _describe_decorators, { kind: "method", name: "describe", static: false, private: false, access: { has: obj => "describe" in obj, get: obj => obj.describe }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
96
|
+
__esDecorate(this, null, _secureSession_decorators, { kind: "method", name: "secureSession", static: false, private: false, access: { has: obj => "secureSession" in obj, get: obj => obj.secureSession }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
97
|
+
__esDecorate(this, null, _sources_decorators, { kind: "method", name: "sources", static: false, private: false, access: { has: obj => "sources" in obj, get: obj => obj.sources }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
98
|
+
__esDecorate(this, null, _readSourceFile_decorators, { kind: "method", name: "readSourceFile", static: false, private: false, access: { has: obj => "readSourceFile" in obj, get: obj => obj.readSourceFile }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
99
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
100
|
+
}
|
|
101
|
+
static inject = inject;
|
|
102
|
+
static Config = ConfigSchema;
|
|
103
|
+
source = __runInitializers(this, _instanceExtraInitializers);
|
|
104
|
+
logger;
|
|
105
|
+
admission;
|
|
106
|
+
provenance;
|
|
107
|
+
accounts;
|
|
108
|
+
accountsOptions;
|
|
109
|
+
launchToken;
|
|
110
|
+
webServer;
|
|
111
|
+
disposeRoute;
|
|
112
|
+
routeKey;
|
|
113
|
+
constructor(ctx, entry = {}) {
|
|
114
|
+
super(ctx, "qaSurface", { namespace: "qaSurface" });
|
|
115
|
+
const resolvedEntry = resolveConfig(entry);
|
|
116
|
+
this.source = () => resolvedEntry;
|
|
117
|
+
this.logger = getPluginLogger({
|
|
118
|
+
pluginId: "dsh-qa-surface",
|
|
119
|
+
consoleSink: createHostLoggerSink(ctx.logger),
|
|
120
|
+
});
|
|
121
|
+
this.admission = new QaPolicyAdmission(ctx, () => this.getConfig(), this.logger,
|
|
122
|
+
// Identity half of admission; no-ops while accounts stay disabled.
|
|
123
|
+
{
|
|
124
|
+
enforceSessionAccess: (token, sessionId) => {
|
|
125
|
+
this.accountsFor(this.getConfig())?.ensureSessionAccess(token, sessionId);
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
this.provenance = new QaProvenanceHost(ctx, () => this.getConfig());
|
|
129
|
+
// The /qa route hands cookie-less browsers to the one-time host token
|
|
130
|
+
// exchange; the proxy in the deploy kit does the same and either alone
|
|
131
|
+
// suffices. Resolved lazily and once per process; unavailable bridges
|
|
132
|
+
// warn once and leave the old marker hand-off in place.
|
|
133
|
+
this.launchToken = makeLaunchTokenSource(() => ctx.get("connection"), (message) => this.logger.warn("entry.token-bridge", { message }));
|
|
134
|
+
ctx.effect(() => async () => this.logger.close(), "dsh-qa-surface.logger");
|
|
135
|
+
ctx.effect(() => () => this.admission.dispose(), "dsh-qa-surface.lockdown-policies");
|
|
136
|
+
ctx.effect(() => () => this.provenance.dispose(), "dsh-qa-surface.provenance");
|
|
137
|
+
// The root index gains one head script: non-loopback hostnames continue
|
|
138
|
+
// into /qa, the loopback operator keeps the full harness UI.
|
|
139
|
+
ctx.on("webserver/index-inject", (table) => {
|
|
140
|
+
const row = entryRedirectRow(this.getConfig());
|
|
141
|
+
if (row !== undefined)
|
|
142
|
+
table.push(row);
|
|
143
|
+
});
|
|
144
|
+
ctx.inject(["settings"], (settingsCtx) => {
|
|
145
|
+
settingsCtx.settings.installSection(ctx, QA_SURFACE_SETTINGS_NAMESPACE, ConfigSchema, entry, {
|
|
146
|
+
setSource: (source) => {
|
|
147
|
+
this.source = source;
|
|
148
|
+
},
|
|
149
|
+
onChange: () => {
|
|
150
|
+
const config = this.getConfig();
|
|
151
|
+
this.refreshRoute();
|
|
152
|
+
this.logger.info("config.updated", {
|
|
153
|
+
enabled: config.enabled,
|
|
154
|
+
route: config.route.path,
|
|
155
|
+
sessionPolicy: config.session.policy,
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
validate: (value) => {
|
|
159
|
+
resolveConfig(value);
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
ctx.inject(["webServer"], (webContext) => {
|
|
164
|
+
this.webServer = webContext.webServer;
|
|
34
165
|
this.refreshRoute();
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
166
|
+
webContext.effect(() => () => {
|
|
167
|
+
this.disposeRoute?.();
|
|
168
|
+
this.disposeRoute = undefined;
|
|
169
|
+
this.routeKey = undefined;
|
|
170
|
+
this.webServer = undefined;
|
|
171
|
+
}, "dsh-qa-surface.navigation-route");
|
|
172
|
+
});
|
|
173
|
+
this.logger.info("plugin.ready", {
|
|
174
|
+
enabled: resolvedEntry.enabled,
|
|
175
|
+
route: resolvedEntry.route.path,
|
|
176
|
+
sessionPolicy: resolvedEntry.session.policy,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
getConfig() {
|
|
180
|
+
return resolveConfig(this.source());
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The accounts store behind the runtime toggle. Rebuilt only when the
|
|
184
|
+
* account-affecting options change; the file is shared across rebuilds.
|
|
185
|
+
*/
|
|
186
|
+
accountsFor(config) {
|
|
187
|
+
if (!config.accounts.enabled)
|
|
188
|
+
return undefined;
|
|
189
|
+
const options = JSON.stringify([
|
|
190
|
+
config.accounts.sessionTtlDays,
|
|
191
|
+
config.accounts.allowRegistration,
|
|
192
|
+
]);
|
|
193
|
+
if (this.accounts === undefined || this.accountsOptions !== options) {
|
|
194
|
+
this.accounts = new QaAccounts(defaultAccountsFilePath(), {
|
|
195
|
+
sessionTtlDays: config.accounts.sessionTtlDays,
|
|
196
|
+
allowRegistration: config.accounts.allowRegistration,
|
|
39
197
|
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
198
|
+
this.accountsOptions = options;
|
|
199
|
+
}
|
|
200
|
+
return this.accounts;
|
|
201
|
+
}
|
|
202
|
+
/** The accounts store, or the disabled refusal the browser maps to copy. */
|
|
203
|
+
requireAccounts() {
|
|
204
|
+
const accounts = this.accountsFor(this.getConfig());
|
|
205
|
+
if (accounts === undefined) {
|
|
206
|
+
throw new Error(ACCOUNTS_DISABLED_ERROR);
|
|
207
|
+
}
|
|
208
|
+
return accounts;
|
|
209
|
+
}
|
|
210
|
+
/** Account failures ride the shared `(reason: <code>)` wire marker. */
|
|
211
|
+
accountsRemote(operation, sessionIdForLog) {
|
|
212
|
+
try {
|
|
213
|
+
return operation();
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (error instanceof QaAccountsError) {
|
|
217
|
+
this.logger.warn("accounts.rejected", {
|
|
218
|
+
reason: error.reason,
|
|
219
|
+
sessionId: sessionIdForLog,
|
|
220
|
+
});
|
|
221
|
+
throw new Error(`QA accounts refused the request (reason: ${error.reason})`, {
|
|
222
|
+
cause: error,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Self-service signup; the first account ever created becomes admin. The
|
|
230
|
+
* display name derives from the email: the generated client enforces exact
|
|
231
|
+
* wire arity, so an optional name parameter would still be required.
|
|
232
|
+
*/
|
|
233
|
+
accountsRegister(email, password) {
|
|
234
|
+
const accounts = this.requireAccounts();
|
|
235
|
+
return this.accountsRemote(() => accounts.register(email, password));
|
|
236
|
+
}
|
|
237
|
+
accountsLogin(email, password) {
|
|
238
|
+
const accounts = this.requireAccounts();
|
|
239
|
+
return this.accountsRemote(() => accounts.login(email, password));
|
|
240
|
+
}
|
|
241
|
+
/** Identity probe; safe to call with an empty or expired token. */
|
|
242
|
+
accountsWhoami(token) {
|
|
243
|
+
if (!this.getConfig().accounts.enabled)
|
|
244
|
+
return { authenticated: false };
|
|
245
|
+
const accounts = this.requireAccounts();
|
|
246
|
+
return this.accountsRemote(() => accounts.whoami(token));
|
|
247
|
+
}
|
|
248
|
+
/** Migrate a browser's local chat index into server-side ownership. */
|
|
249
|
+
accountsClaimSessions(token, sessionIds) {
|
|
250
|
+
const accounts = this.requireAccounts();
|
|
251
|
+
return this.accountsRemote(() => accounts.claimSessions(token, sessionIds));
|
|
252
|
+
}
|
|
253
|
+
/** The token user's owned session ids; the sidebar list authority. */
|
|
254
|
+
accountsOwnedSessions(token) {
|
|
255
|
+
if (!this.getConfig().accounts.enabled)
|
|
256
|
+
return { ids: [] };
|
|
257
|
+
const accounts = this.requireAccounts();
|
|
258
|
+
return this.accountsRemote(() => ({
|
|
259
|
+
ids: accounts.ownedSessionIds(token),
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Every chat-ownership entry with owner display names; the cross-user view
|
|
264
|
+
* admin browsers group the sidebar by. Ordinary accounts are refused with
|
|
265
|
+
* the dedicated reason, anonymous ones with auth-required.
|
|
266
|
+
*/
|
|
267
|
+
accountsListOwnership(token) {
|
|
268
|
+
if (!this.getConfig().accounts.enabled)
|
|
269
|
+
return { entries: [] };
|
|
270
|
+
const accounts = this.requireAccounts();
|
|
271
|
+
return this.accountsRemote(() => ({
|
|
272
|
+
entries: accounts.listOwnership(token),
|
|
273
|
+
}));
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Serve the effective QA configuration to the browser. The DSH gateway pins
|
|
277
|
+
* settings RPCs to loopback, so a browser served over the LAN always sees
|
|
278
|
+
* the settings namespace as unavailable; this method is the config channel
|
|
279
|
+
* such a browser falls back to. It is read-only projection — the admission
|
|
280
|
+
* boundary stays in {@link secureSession}.
|
|
281
|
+
*/
|
|
282
|
+
describe() {
|
|
283
|
+
return this.getConfig();
|
|
284
|
+
}
|
|
285
|
+
/** Pin and attest the effective policy. The browser supplies identity only. */
|
|
286
|
+
secureSession(token, sessionId) {
|
|
287
|
+
try {
|
|
288
|
+
return this.admission.secureSession(token, sessionId);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
// The carrier empties error.details, so the coarse reason rides the
|
|
292
|
+
// wire message for the browser console; the specific mismatch facts
|
|
293
|
+
// stay in this log only.
|
|
294
|
+
const reason = error instanceof QaAttestationError
|
|
295
|
+
? error.reason
|
|
296
|
+
: (ACCOUNTS_REASON_MARKER.exec(error instanceof Error ? error.message : "")?.at(1) ?? "attestation-failed");
|
|
297
|
+
this.logger.error("lockdown.rejected", {
|
|
298
|
+
sessionId,
|
|
299
|
+
reason,
|
|
300
|
+
error: error instanceof Error ? error.message : String(error),
|
|
301
|
+
});
|
|
302
|
+
throw new Error(`${CONFIGURATION_ERROR} (reason: ${reason})`, {
|
|
303
|
+
cause: error,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/** Return canonical Host snapshots; replay is rebuilt from qa/sources events. */
|
|
308
|
+
sources(token, sessionId) {
|
|
309
|
+
this.admission.secureSession(token, sessionId);
|
|
310
|
+
return this.provenance.bundles(sessionId);
|
|
311
|
+
}
|
|
312
|
+
/** Narrow read-only preview capability for files already present as sources. */
|
|
313
|
+
async readSourceFile(token, sessionId, sourcePath) {
|
|
314
|
+
this.admission.secureSession(token, sessionId);
|
|
315
|
+
const config = this.getConfig().sources.filePreview;
|
|
316
|
+
if (!config.enabled ||
|
|
317
|
+
!this.provenance.sourceAllowed(sessionId, sourcePath)) {
|
|
318
|
+
throw new Error("Source preview is unavailable.");
|
|
319
|
+
}
|
|
320
|
+
const agent = this.ctx.agents.get((await import("@deepseek-ai/dsh-session/types")).SessionId(sessionId));
|
|
321
|
+
const root = agent?.session.header.cwd;
|
|
322
|
+
if (root === undefined)
|
|
323
|
+
throw new Error("Source preview is unavailable.");
|
|
324
|
+
try {
|
|
325
|
+
return await readSourceFilePreview({
|
|
326
|
+
root,
|
|
327
|
+
sourcePath,
|
|
328
|
+
maxBytes: config.maxBytes,
|
|
329
|
+
maxMarkdownRenderBytes: config.maxMarkdownRenderBytes,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
throw new Error("Source preview is unavailable.");
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
refreshRoute() {
|
|
337
|
+
const config = this.getConfig();
|
|
338
|
+
const key = config.enabled
|
|
339
|
+
? `${config.route.path}:${config.route.matchChildren}`
|
|
340
|
+
: undefined;
|
|
341
|
+
if (key === this.routeKey)
|
|
342
|
+
return;
|
|
343
|
+
this.disposeRoute?.();
|
|
344
|
+
this.disposeRoute = undefined;
|
|
345
|
+
this.routeKey = undefined;
|
|
346
|
+
if (key === undefined || this.webServer === undefined)
|
|
347
|
+
return;
|
|
348
|
+
this.disposeRoute = registerQaNavigationRoute(this.webServer, config, {
|
|
349
|
+
launchToken: this.launchToken,
|
|
350
|
+
});
|
|
351
|
+
this.routeKey = key;
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
})();
|
|
355
|
+
export { QaSurface };
|
|
80
356
|
export { ConfigSchema, DEFAULT_QA_SURFACE_CONFIG, normalizeRoutePath, resolveConfig, } from "./config.js";
|
|
357
|
+
export { QaAttestationError } from "./attestation.js";
|
|
358
|
+
export { QaAccounts, QaAccountsError } from "./accounts/store.js";
|
|
359
|
+
export { entryRedirectRow, entryRedirectScript } from "./entry-redirect.js";
|
|
81
360
|
export { registerQaNavigationRoute } from "./host-route.js";
|
|
361
|
+
export { qaToolDenial, qaToolPolicyPlan } from "./lockdown-policy.js";
|
|
362
|
+
export { QaPolicyAdmission } from "./secure-session.js";
|
|
363
|
+
export * from "./provenance/index.js";
|
|
82
364
|
export default QaSurface;
|
|
83
365
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the launch token once per process (it is stable for the process
|
|
3
|
+
* lifetime); a missing connection service or an unusable answer warns once
|
|
4
|
+
* and permanently disables the bridge instead of retrying per request.
|
|
5
|
+
*/
|
|
6
|
+
export function makeLaunchTokenSource(getConnection, warn) {
|
|
7
|
+
let cached = null;
|
|
8
|
+
let warned = false;
|
|
9
|
+
const warnOnce = (message) => {
|
|
10
|
+
if (warned)
|
|
11
|
+
return;
|
|
12
|
+
warned = true;
|
|
13
|
+
warn(message);
|
|
14
|
+
};
|
|
15
|
+
return () => {
|
|
16
|
+
if (cached !== null)
|
|
17
|
+
return cached;
|
|
18
|
+
try {
|
|
19
|
+
const connection = getConnection();
|
|
20
|
+
if (connection === undefined ||
|
|
21
|
+
typeof connection.authenticatedUrl !== "function") {
|
|
22
|
+
warnOnce("launch-token bridge inactive: no connection.authenticatedUrl on the host");
|
|
23
|
+
cached = undefined;
|
|
24
|
+
return cached;
|
|
25
|
+
}
|
|
26
|
+
// The loopback base only feeds the URL parsing; host/scheme are dropped.
|
|
27
|
+
const token = new URL(connection.authenticatedUrl("http://127.0.0.1")).searchParams.get("token");
|
|
28
|
+
if (token === null || token === "") {
|
|
29
|
+
warnOnce("launch-token bridge inactive: authenticatedUrl carries no token");
|
|
30
|
+
cached = undefined;
|
|
31
|
+
return cached;
|
|
32
|
+
}
|
|
33
|
+
cached = token;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
warnOnce(`launch-token bridge failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
37
|
+
cached = undefined;
|
|
38
|
+
}
|
|
39
|
+
return cached;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=launch-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-token.js","sourceRoot":"","sources":["../src/launch-token.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,aAAqD,EACrD,IAA+B;IAE/B,IAAI,MAAM,GAA8B,IAAI,CAAC;IAC7C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAQ,EAAE;QACzC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,GAAG,EAAE;QACV,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YACnC,IACE,UAAU,KAAK,SAAS;gBACxB,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EACjD,CAAC;gBACD,QAAQ,CACN,0EAA0E,CAC3E,CAAC;gBACF,MAAM,GAAG,SAAS,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,yEAAyE;YACzE,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAChD,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACnC,QAAQ,CACN,iEAAiE,CAClE,CAAC;gBACF,MAAM,GAAG,SAAS,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CACN,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxF,CAAC;YACF,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const TOOL_DENIAL = "This tool is not available in the QA execution profile.";
|
|
2
|
+
/**
|
|
3
|
+
* Validate an allow-list against the complete agent-scoped view.
|
|
4
|
+
*
|
|
5
|
+
* Preset tools live on an ancestor scope, not necessarily in the global tool
|
|
6
|
+
* layer. The restriction must therefore retain the configured names verbatim;
|
|
7
|
+
* deriving it from the global view would hide every preset-owned tool after a
|
|
8
|
+
* successful first attestation and make the next attestation fail.
|
|
9
|
+
*/
|
|
10
|
+
export function qaToolPolicyPlan(allow, isMounted) {
|
|
11
|
+
return {
|
|
12
|
+
allow: [...allow],
|
|
13
|
+
unknown: allow.filter((toolName) => !isMounted(toolName)),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Monotonic execution decision shared by inherited, scoped and transport tools. */
|
|
17
|
+
export function qaToolDenial(allowed, toolName) {
|
|
18
|
+
return allowed.has(toolName) ? undefined : TOOL_DENIAL;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=lockdown-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockdown-policy.js","sourceRoot":"","sources":["../src/lockdown-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,yDAAyD,CAAC;AAS9E;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAwB,EACxB,SAAwC;IAExC,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAC1B,OAA4B,EAC5B,QAAgB;IAEhB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { dedupeAndRankSources } from "./dedupe.js";
|
|
2
|
+
/** Mutable turn-local accumulator; snapshots are immutable plain data. */
|
|
3
|
+
export class QaSourceCollector {
|
|
4
|
+
options;
|
|
5
|
+
collected = [];
|
|
6
|
+
incompleteOrigins = [];
|
|
7
|
+
threshold;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
this.threshold = options.displayScoreThreshold ?? 50;
|
|
11
|
+
}
|
|
12
|
+
observe(context) {
|
|
13
|
+
this.collected.push(...this.options.registry.extract(context));
|
|
14
|
+
}
|
|
15
|
+
add(sources) {
|
|
16
|
+
this.collected.push(...sources);
|
|
17
|
+
}
|
|
18
|
+
markIncomplete(origin) {
|
|
19
|
+
this.incompleteOrigins.push({ ...origin });
|
|
20
|
+
}
|
|
21
|
+
snapshot() {
|
|
22
|
+
const ranked = dedupeAndRankSources(this.collected, this.options.mergeFileRanges === undefined
|
|
23
|
+
? {}
|
|
24
|
+
: { mergeFileRanges: this.options.mergeFileRanges });
|
|
25
|
+
const sources = ranked.filter((source) => source.evidence !== "discovered" && source.score >= this.threshold);
|
|
26
|
+
const discovered = ranked.filter((source) => !sources.includes(source));
|
|
27
|
+
return {
|
|
28
|
+
version: 1,
|
|
29
|
+
sessionId: this.options.sessionId,
|
|
30
|
+
turn: this.options.turn,
|
|
31
|
+
sources,
|
|
32
|
+
...(discovered.length === 0 ? {} : { discovered }),
|
|
33
|
+
complete: this.incompleteOrigins.length === 0,
|
|
34
|
+
...(this.incompleteOrigins.length === 0
|
|
35
|
+
? {}
|
|
36
|
+
: { incompleteOrigins: [...this.incompleteOrigins] }),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/provenance/collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAgBnD,0EAA0E;AAC1E,MAAM,OAAO,iBAAiB;IASC,OAAO;IARnB,SAAS,GAAwB,EAAE,CAAC;IACpC,iBAAiB,GAI5B,EAAE,CAAC;IACQ,SAAS,CAAS;IAEnC,YAA6B,OAAiC;uBAAjC,OAAO;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,OAA+B;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,GAAG,CAAC,OAAqC;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,cAAc,CAAC,MAId;QACC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG,oBAAoB,CACjC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CACtD,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CACrE,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,OAAO;YACP,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YAClD,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;gBACrC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;CACF"}
|