@yadsh/dsh-qa-surface 0.3.0 → 0.4.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/README.md +153 -12
- package/lib/account-remotes.js +100 -0
- package/lib/account-remotes.js.map +1 -0
- package/lib/accounts/credentials.js +27 -0
- package/lib/accounts/credentials.js.map +1 -0
- package/lib/accounts/errors.js +9 -0
- package/lib/accounts/errors.js.map +1 -0
- package/lib/accounts/file.js +101 -0
- package/lib/accounts/file.js.map +1 -0
- package/lib/accounts/store.js +144 -161
- package/lib/accounts/store.js.map +1 -1
- package/lib/accounts/token.js +61 -0
- package/lib/accounts/token.js.map +1 -0
- package/lib/attachment-rules.js +111 -0
- package/lib/attachment-rules.js.map +1 -0
- package/lib/cli.js +122 -9
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +32 -2
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaSessionController.js +47 -65
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +121 -107
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +71 -6
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/attachments.js +150 -0
- package/lib/client/attachments.js.map +1 -0
- package/lib/client/attestation.js +1 -1
- package/lib/client/attestation.js.map +1 -1
- package/lib/client/base64.js +16 -0
- package/lib/client/base64.js.map +1 -0
- package/lib/client/chat-files.js +48 -0
- package/lib/client/chat-files.js.map +1 -0
- package/lib/client/components/Markdown.js +1 -1
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaChangelog.js +38 -19
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +56 -74
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaFileAttachment.js +19 -0
- package/lib/client/components/QaFileAttachment.js.map +1 -0
- package/lib/client/components/QaFilesPanel.js +45 -0
- package/lib/client/components/QaFilesPanel.js.map +1 -0
- package/lib/client/components/QaHeader.js +34 -0
- package/lib/client/components/QaHeader.js.map +1 -0
- package/lib/client/components/QaMessage.js +17 -4
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaModal.js +31 -0
- package/lib/client/components/QaModal.js.map +1 -0
- package/lib/client/components/QaProfile.js +64 -0
- package/lib/client/components/QaProfile.js.map +1 -0
- package/lib/client/components/QaRightRail.js +15 -0
- package/lib/client/components/QaRightRail.js.map +1 -0
- package/lib/client/components/QaSidebar.js +6 -1
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/{QaSourcesDrawer.js → QaSourcesPanel.js} +3 -3
- package/lib/client/components/QaSourcesPanel.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +15 -0
- package/lib/client/components/QaTurnRail.js.map +1 -1
- package/lib/client/components/QaWidthHandle.js +25 -20
- package/lib/client/components/QaWidthHandle.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +19 -20
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/surface-utils.js +28 -0
- package/lib/client/components/surface-utils.js.map +1 -0
- package/lib/client/components/thinking-phrases.js +24 -0
- package/lib/client/components/thinking-phrases.js.map +1 -0
- package/lib/client/create-session.js +7 -32
- package/lib/client/create-session.js.map +1 -1
- package/lib/client/failure-copy.js +63 -0
- package/lib/client/failure-copy.js.map +1 -0
- package/lib/client/index.js +38 -7
- package/lib/client/index.js.map +1 -1
- package/lib/client/prompt-content.js +54 -0
- package/lib/client/prompt-content.js.map +1 -0
- package/lib/client/settings/card.js +143 -0
- package/lib/client/settings/card.js.map +1 -0
- package/lib/client/settings/fields.js +145 -0
- package/lib/client/settings/fields.js.map +1 -0
- package/lib/client/settings/format.js +255 -0
- package/lib/client/settings/format.js.map +1 -0
- package/lib/client/settings/sections/access.js +25 -0
- package/lib/client/settings/sections/access.js.map +1 -0
- package/lib/client/settings/sections/accounts.js +47 -0
- package/lib/client/settings/sections/accounts.js.map +1 -0
- package/lib/client/settings/sections/attachments.js +46 -0
- package/lib/client/settings/sections/attachments.js.map +1 -0
- package/lib/client/settings/sections/branding.js +28 -0
- package/lib/client/settings/sections/branding.js.map +1 -0
- package/lib/client/settings/sections/common.js +20 -0
- package/lib/client/settings/sections/common.js.map +1 -0
- package/lib/client/settings/sections/embedding.js +19 -0
- package/lib/client/settings/sections/embedding.js.map +1 -0
- package/lib/client/settings/sections/interface.js +60 -0
- package/lib/client/settings/sections/interface.js.map +1 -0
- package/lib/client/settings/sections/lockdown.js +82 -0
- package/lib/client/settings/sections/lockdown.js.map +1 -0
- package/lib/client/settings/sections/session.js +53 -0
- package/lib/client/settings/sections/session.js.map +1 -0
- package/lib/client/settings/sections/sources.js +72 -0
- package/lib/client/settings/sections/sources.js.map +1 -0
- package/lib/client/settings/sections/status.js +37 -0
- package/lib/client/settings/sections/status.js.map +1 -0
- package/lib/client/settings/sections.js +23 -0
- package/lib/client/settings/sections.js.map +1 -0
- package/lib/client/settings/styles.js +57 -0
- package/lib/client/settings/styles.js.map +1 -0
- package/lib/client/stream-publisher.js +47 -0
- package/lib/client/stream-publisher.js.map +1 -0
- package/lib/client/styles.js +85 -19
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client/use-right-rail.js +96 -0
- package/lib/client/use-right-rail.js.map +1 -0
- package/lib/client/use-session-ui-state.js +26 -19
- package/lib/client/use-session-ui-state.js.map +1 -1
- package/lib/client.js +4788 -869
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/accounts.js +60 -0
- package/lib/config-resolvers/accounts.js.map +1 -0
- package/lib/config-resolvers/attachments.js +28 -0
- package/lib/config-resolvers/attachments.js.map +1 -0
- package/lib/config-resolvers/basics.js +59 -0
- package/lib/config-resolvers/basics.js.map +1 -0
- package/lib/config-resolvers/defaults.js +132 -0
- package/lib/config-resolvers/defaults.js.map +1 -0
- package/lib/config-resolvers/lockdown.js +79 -0
- package/lib/config-resolvers/lockdown.js.map +1 -0
- package/lib/config-resolvers/session.js +42 -0
- package/lib/config-resolvers/session.js.map +1 -0
- package/lib/config-resolvers/shared.js +42 -0
- package/lib/config-resolvers/shared.js.map +1 -0
- package/lib/config-resolvers/sources.js +81 -0
- package/lib/config-resolvers/sources.js.map +1 -0
- package/lib/config-resolvers/ui.js +20 -0
- package/lib/config-resolvers/ui.js.map +1 -0
- package/lib/config.js +65 -4
- package/lib/config.js.map +1 -1
- package/lib/entry-redirect.js +2 -1
- package/lib/entry-redirect.js.map +1 -1
- package/lib/index.js +123 -74
- package/lib/index.js.map +1 -1
- package/lib/profile.js +214 -0
- package/lib/profile.js.map +1 -0
- package/lib/prompt-notes.js +231 -0
- package/lib/prompt-notes.js.map +1 -0
- package/lib/resolve-config.js +35 -410
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +82 -16
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/session-key.js +18 -0
- package/lib/shared/session-key.js.map +1 -0
- package/lib/shared/settings.js +10 -0
- package/lib/shared/settings.js.map +1 -0
- package/lib/thinking-phrases.js +68 -0
- package/lib/thinking-phrases.js.map +1 -0
- package/lib/typert.host.js +162 -17
- package/lib/typert.remote-client.d.ts +5 -1
- package/lib/typert.remote-client.js +132 -13
- package/lib/types/account-remotes.d.ts +42 -0
- package/lib/types/accounts/credentials.d.ts +14 -0
- package/lib/types/accounts/errors.d.ts +11 -0
- package/lib/types/accounts/file.d.ts +82 -0
- package/lib/types/accounts/store.d.ts +66 -43
- package/lib/types/accounts/token.d.ts +31 -0
- package/lib/types/attachment-rules.d.ts +44 -0
- package/lib/types/cli.d.ts +2 -2
- package/lib/types/client/QaAccountsController.d.ts +8 -1
- package/lib/types/client/QaSessionController.d.ts +16 -16
- package/lib/types/client/QaSurface.d.ts +7 -1
- package/lib/types/client/attachments.d.ts +54 -0
- package/lib/types/client/base64.d.ts +10 -0
- package/lib/types/client/chat-files.d.ts +30 -0
- package/lib/types/client/components/QaChangelog.d.ts +1 -1
- package/lib/types/client/components/QaComposer.d.ts +8 -4
- package/lib/types/client/components/QaFileAttachment.d.ts +14 -0
- package/lib/types/client/components/QaFilesPanel.d.ts +15 -0
- package/lib/types/client/components/QaHeader.d.ts +41 -0
- package/lib/types/client/components/QaMessage.d.ts +3 -1
- package/lib/types/client/components/QaModal.d.ts +26 -0
- package/lib/types/client/components/QaProfile.d.ts +25 -0
- package/lib/types/client/components/QaRightRail.d.ts +23 -0
- package/lib/types/client/components/QaSidebar.d.ts +14 -0
- package/lib/types/client/components/{QaSourcesDrawer.d.ts → QaSourcesPanel.d.ts} +7 -4
- package/lib/types/client/components/QaTurnRail.d.ts +6 -0
- package/lib/types/client/components/QaWidthHandle.d.ts +14 -7
- package/lib/types/client/components/QaWorkGroup.d.ts +5 -3
- package/lib/types/client/components/surface-utils.d.ts +11 -0
- package/lib/types/client/components/thinking-phrases.d.ts +9 -0
- package/lib/types/client/create-session.d.ts +6 -9
- package/lib/types/client/failure-copy.d.ts +19 -0
- package/lib/types/client/prompt-content.d.ts +30 -0
- package/lib/types/client/settings/card.d.ts +23 -0
- package/lib/types/client/settings/fields.d.ts +139 -0
- package/lib/types/client/settings/format.d.ts +108 -0
- package/lib/types/client/settings/sections/access.d.ts +9 -0
- package/lib/types/client/settings/sections/accounts.d.ts +9 -0
- package/lib/types/client/settings/sections/attachments.d.ts +15 -0
- package/lib/types/client/settings/sections/branding.d.ts +8 -0
- package/lib/types/client/settings/sections/common.d.ts +28 -0
- package/lib/types/client/settings/sections/embedding.d.ts +8 -0
- package/lib/types/client/settings/sections/interface.d.ts +9 -0
- package/lib/types/client/settings/sections/lockdown.d.ts +9 -0
- package/lib/types/client/settings/sections/session.d.ts +9 -0
- package/lib/types/client/settings/sections/sources.d.ts +9 -0
- package/lib/types/client/settings/sections/status.d.ts +22 -0
- package/lib/types/client/settings/sections.d.ts +25 -0
- package/lib/types/client/settings/styles.d.ts +8 -0
- package/lib/types/client/stream-publisher.d.ts +28 -0
- package/lib/types/client/types.d.ts +29 -1
- package/lib/types/client/use-right-rail.d.ts +56 -0
- package/lib/types/client/use-session-ui-state.d.ts +13 -7
- package/lib/types/config-resolvers/accounts.d.ts +15 -0
- package/lib/types/config-resolvers/attachments.d.ts +6 -0
- package/lib/types/config-resolvers/basics.d.ts +8 -0
- package/lib/types/config-resolvers/defaults.d.ts +4 -0
- package/lib/types/config-resolvers/lockdown.d.ts +10 -0
- package/lib/types/config-resolvers/session.d.ts +6 -0
- package/lib/types/config-resolvers/shared.d.ts +16 -0
- package/lib/types/config-resolvers/sources.d.ts +6 -0
- package/lib/types/config-resolvers/ui.d.ts +6 -0
- package/lib/types/index.d.ts +20 -13
- package/lib/types/profile.d.ts +76 -0
- package/lib/types/prompt-notes.d.ts +110 -0
- package/lib/types/resolve-config.d.ts +8 -3
- package/lib/types/secure-session.d.ts +26 -1
- package/lib/types/shared/session-key.d.ts +23 -0
- package/lib/types/shared/settings.d.ts +10 -0
- package/lib/types/thinking-phrases.d.ts +17 -0
- package/lib/types/types.d.ts +123 -5
- package/lib/types/user-workspace.d.ts +38 -0
- package/lib/user-workspace.js +231 -0
- package/lib/user-workspace.js.map +1 -0
- package/package.json +14 -7
- package/CHANGELOG.md +0 -176
- package/SPEC-dsh-qa-surface.md +0 -2425
- package/docs/ARCHITECTURE.md +0 -66
- package/docs/COMPATIBILITY.md +0 -14
- package/docs/CONFIGURATION.md +0 -199
- package/docs/EMBEDDING.md +0 -13
- package/docs/SOURCES-MIGRATION.md +0 -28
- package/docs/SOURCES-PROVENANCE-AUDIT.md +0 -88
- package/docs/SPEC-dsh-qa-surface-accounts.md +0 -219
- package/docs/SPEC-dsh-qa-surface-sources-provenance.md +0 -1692
- package/lib/client/components/QaSourcesDrawer.js.map +0 -1
package/lib/secure-session.js
CHANGED
|
@@ -6,6 +6,7 @@ import { QaAccountsError } from "./accounts/store.js";
|
|
|
6
6
|
import { QaAttestationError } from "./attestation.js";
|
|
7
7
|
import { qaToolDenial, qaToolPolicyPlan } from "./lockdown-policy.js";
|
|
8
8
|
import { QA_REPORT_SOURCES_TOOL } from "./provenance/host-store.js";
|
|
9
|
+
import { qaUserWorkspaceDenial } from "./user-workspace.js";
|
|
9
10
|
/** Grace period in which a fresh session may still be pinned to the QA preset. */
|
|
10
11
|
const FRESH_SESSION_BOOTSTRAP_WINDOW_MS = 120_000;
|
|
11
12
|
/**
|
|
@@ -37,15 +38,55 @@ export class QaPolicyAdmission {
|
|
|
37
38
|
logger;
|
|
38
39
|
accounts;
|
|
39
40
|
appliedPolicies = new Map();
|
|
41
|
+
/**
|
|
42
|
+
* Sessions the QA surface has attested. The provenance note is written for
|
|
43
|
+
* exactly these, and a delegated child resolves through its root session, so
|
|
44
|
+
* one set answers for the whole chat.
|
|
45
|
+
*/
|
|
46
|
+
attested = new Set();
|
|
47
|
+
workspaceRoots = new Map();
|
|
48
|
+
disposeWorkspaceGuard;
|
|
40
49
|
constructor(ctx, config, logger, accounts) {
|
|
41
50
|
this.ctx = ctx;
|
|
42
51
|
this.config = config;
|
|
43
52
|
this.logger = logger;
|
|
44
53
|
this.accounts = accounts;
|
|
54
|
+
this.disposeWorkspaceGuard = ctx.tools.guard((execution) => {
|
|
55
|
+
const session = execution.agent?.session;
|
|
56
|
+
if (session === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
const root = this.workspaceRoots.get(String(session.id));
|
|
59
|
+
if (root === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
if (!cwdMatches(session.header.cwd, root)) {
|
|
62
|
+
return "QA workspace boundary: session cwd is outside this user's directory.";
|
|
63
|
+
}
|
|
64
|
+
return qaUserWorkspaceDenial(execution, root, this.attachmentRoot());
|
|
65
|
+
});
|
|
66
|
+
ctx.on("session/created", (session) => {
|
|
67
|
+
const parent = session.header.parentSession;
|
|
68
|
+
if (parent === undefined)
|
|
69
|
+
return;
|
|
70
|
+
const root = this.workspaceRoots.get(String(parent));
|
|
71
|
+
if (root !== undefined)
|
|
72
|
+
this.workspaceRoots.set(String(session.id), root);
|
|
73
|
+
});
|
|
45
74
|
ctx.on("agent/disposed", ({ agent }) => {
|
|
46
75
|
this.appliedPolicies.delete(agent);
|
|
76
|
+
this.workspaceRoots.delete(String(agent.session.id));
|
|
47
77
|
});
|
|
48
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* The mounted attachment store's verbatim root, when the backend exposes
|
|
81
|
+
* one. It sits outside every workspace, so the per-user fence would
|
|
82
|
+
* otherwise deny the model the exact file an upload produced and the prompt
|
|
83
|
+
* points it at. A backend without a resolvable root simply keeps the fence
|
|
84
|
+
* closed — attachments then only work where reads are not fenced per user.
|
|
85
|
+
*/
|
|
86
|
+
attachmentRoot() {
|
|
87
|
+
const store = this.ctx.get("attachments");
|
|
88
|
+
return typeof store?.root === "string" ? store.root : undefined;
|
|
89
|
+
}
|
|
49
90
|
secureSession(token, sessionId) {
|
|
50
91
|
const config = this.config();
|
|
51
92
|
const lockdown = config.lockdown;
|
|
@@ -53,9 +94,10 @@ export class QaPolicyAdmission {
|
|
|
53
94
|
// must not learn whether a session exists or how the deployment composes.
|
|
54
95
|
// Independent of lockdown — a deployment may gate users without pinning
|
|
55
96
|
// the policy, and the gate itself no-ops while accounts are disabled.
|
|
97
|
+
let sessionOwner;
|
|
56
98
|
if (this.accounts !== undefined) {
|
|
57
99
|
try {
|
|
58
|
-
this.accounts.enforceSessionAccess(token, sessionId);
|
|
100
|
+
sessionOwner = this.accounts.enforceSessionAccess(token, sessionId);
|
|
59
101
|
}
|
|
60
102
|
catch (error) {
|
|
61
103
|
if (error instanceof QaAccountsError) {
|
|
@@ -70,6 +112,7 @@ export class QaPolicyAdmission {
|
|
|
70
112
|
if (agent === undefined) {
|
|
71
113
|
throw new QaAttestationError("agent-unavailable", "agent is unavailable");
|
|
72
114
|
}
|
|
115
|
+
this.attested.add(sessionId);
|
|
73
116
|
if (!lockdown.enabled) {
|
|
74
117
|
return {
|
|
75
118
|
sessionId,
|
|
@@ -77,7 +120,7 @@ export class QaPolicyAdmission {
|
|
|
77
120
|
agentPresetMatches: true,
|
|
78
121
|
workspaceMatches: true,
|
|
79
122
|
modelMatches: true,
|
|
80
|
-
|
|
123
|
+
sandboxModeMatches: false,
|
|
81
124
|
approvalIsNever: false,
|
|
82
125
|
permissionPreset: "",
|
|
83
126
|
toolPolicyLoaded: false,
|
|
@@ -94,13 +137,28 @@ export class QaPolicyAdmission {
|
|
|
94
137
|
if (expectedWorkspace !== null && pinnedWorkspace === undefined) {
|
|
95
138
|
throw new QaAttestationError("workspace-unavailable", `workspace ${expectedWorkspace} is not registered`);
|
|
96
139
|
}
|
|
140
|
+
let expectedUserRoot;
|
|
141
|
+
if (config.accounts.perUserWorkspace) {
|
|
142
|
+
if (sessionOwner === undefined || pinnedWorkspace === undefined) {
|
|
143
|
+
throw new QaAttestationError("workspace-unavailable", "per-user workspace identity is unavailable");
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
expectedUserRoot = this.accounts?.userWorkspace(sessionOwner.id, pinnedWorkspace.path);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new QaAttestationError("workspace-unavailable", error instanceof Error ? error.message : String(error));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
97
152
|
const expectedPreset = config.session.agentPreset;
|
|
98
153
|
const agentPresetMatches = !lockdown.enforceFixedAgentPreset ||
|
|
99
154
|
expectedPreset === null ||
|
|
100
155
|
this.ctx.agentPresets.composedPreset(agent.ctx) === expectedPreset;
|
|
101
156
|
const workspaceMatches = !lockdown.enforceFixedWorkspace ||
|
|
102
157
|
(expectedWorkspace === null && config.session.cwd === null) ||
|
|
103
|
-
(
|
|
158
|
+
(expectedUserRoot !== undefined &&
|
|
159
|
+
cwdMatches(agent.session.header.cwd, expectedUserRoot)) ||
|
|
160
|
+
(!config.accounts.perUserWorkspace &&
|
|
161
|
+
pinnedWorkspace !== undefined &&
|
|
104
162
|
cwdMatches(agent.session.header.cwd, pinnedWorkspace.path)) ||
|
|
105
163
|
(expectedWorkspace === null &&
|
|
106
164
|
config.session.cwd !== null &&
|
|
@@ -118,7 +176,7 @@ export class QaPolicyAdmission {
|
|
|
118
176
|
const permission = this.ctx.permissionPresets.resolve(lockdown.permissionPreset);
|
|
119
177
|
if (permission.sandbox !== lockdown.sandboxMode ||
|
|
120
178
|
permission.approval !== lockdown.approvalPolicy) {
|
|
121
|
-
throw new QaAttestationError("permission-preset", `permission preset ${lockdown.permissionPreset} does not resolve to
|
|
179
|
+
throw new QaAttestationError("permission-preset", `permission preset ${lockdown.permissionPreset} does not resolve to ${lockdown.sandboxMode}/never`);
|
|
122
180
|
}
|
|
123
181
|
const currentPermission = this.ctx.permissionPresets.current(agent.session);
|
|
124
182
|
// History check over the model-visible surface: `user/message` is a
|
|
@@ -145,11 +203,6 @@ export class QaPolicyAdmission {
|
|
|
145
203
|
if (prior?.fingerprint !== fingerprint) {
|
|
146
204
|
const allowed = new Set(policy.allow);
|
|
147
205
|
const disposeGuard = agent.ctx.tools.guard((execution) => qaToolDenial(allowed, execution.name));
|
|
148
|
-
const disposeGuidance = agent.ctx.systemPrompt.section({
|
|
149
|
-
name: "dsh-qa-surface:structured-sources",
|
|
150
|
-
order: 950,
|
|
151
|
-
text: "Source provenance is collected automatically from tools. Do not append a manual Sources/Источники bibliography to the answer. Delegated providers that cannot expose tool events should call qa_report_sources before finishing.",
|
|
152
|
-
});
|
|
153
206
|
try {
|
|
154
207
|
const disposeRestriction = agent.ctx.tools.restrict({
|
|
155
208
|
allow: policy.allow,
|
|
@@ -158,27 +211,30 @@ export class QaPolicyAdmission {
|
|
|
158
211
|
fingerprint,
|
|
159
212
|
disposeGuard,
|
|
160
213
|
disposeRestriction,
|
|
161
|
-
disposeGuidance,
|
|
162
214
|
});
|
|
163
215
|
prior?.disposeRestriction();
|
|
164
216
|
prior?.disposeGuard();
|
|
165
|
-
prior?.disposeGuidance();
|
|
166
217
|
}
|
|
167
218
|
catch (error) {
|
|
168
219
|
disposeGuard();
|
|
169
|
-
disposeGuidance();
|
|
170
220
|
throw error;
|
|
171
221
|
}
|
|
172
222
|
}
|
|
173
223
|
this.ctx.permissionPresets.set(agent.session, lockdown.permissionPreset);
|
|
174
224
|
const effectivePermission = this.ctx.permissionPresets.current(agent.session);
|
|
175
|
-
const
|
|
225
|
+
const sandboxModeMatches = permission.sandbox === lockdown.sandboxMode;
|
|
176
226
|
const approvalIsNever = permission.approval === "never";
|
|
177
227
|
if (effectivePermission !== lockdown.permissionPreset ||
|
|
178
|
-
!
|
|
228
|
+
!sandboxModeMatches ||
|
|
179
229
|
!approvalIsNever) {
|
|
180
230
|
throw new QaAttestationError("attestation-failed", "permission attestation failed");
|
|
181
231
|
}
|
|
232
|
+
if (expectedUserRoot !== undefined) {
|
|
233
|
+
this.workspaceRoots.set(sessionId, expectedUserRoot);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.workspaceRoots.delete(sessionId);
|
|
237
|
+
}
|
|
182
238
|
this.logger.debug("lockdown.attested", {
|
|
183
239
|
sessionId,
|
|
184
240
|
permissionPreset: lockdown.permissionPreset,
|
|
@@ -190,7 +246,7 @@ export class QaPolicyAdmission {
|
|
|
190
246
|
agentPresetMatches,
|
|
191
247
|
workspaceMatches,
|
|
192
248
|
modelMatches,
|
|
193
|
-
|
|
249
|
+
sandboxModeMatches,
|
|
194
250
|
approvalIsNever,
|
|
195
251
|
permissionPreset: lockdown.permissionPreset,
|
|
196
252
|
toolPolicyLoaded: true,
|
|
@@ -199,14 +255,24 @@ export class QaPolicyAdmission {
|
|
|
199
255
|
toolAllowList: lockdown.toolPolicy.allow,
|
|
200
256
|
};
|
|
201
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Whether one session went through this boundary. The provenance note is
|
|
260
|
+
* written only for attested sessions, which is what keeps a deployment's
|
|
261
|
+
* source rules out of unrelated chats served by the same process.
|
|
262
|
+
*/
|
|
263
|
+
knowsSession(sessionId) {
|
|
264
|
+
return this.attested.has(sessionId);
|
|
265
|
+
}
|
|
202
266
|
/** Detach every pinned tool policy; wired as a disposal effect by the entry. */
|
|
203
267
|
dispose() {
|
|
204
268
|
for (const policy of this.appliedPolicies.values()) {
|
|
205
269
|
policy.disposeRestriction();
|
|
206
270
|
policy.disposeGuard();
|
|
207
|
-
policy.disposeGuidance();
|
|
208
271
|
}
|
|
209
272
|
this.appliedPolicies.clear();
|
|
273
|
+
this.attested.clear();
|
|
274
|
+
this.workspaceRoots.clear();
|
|
275
|
+
this.disposeWorkspaceGuard();
|
|
210
276
|
}
|
|
211
277
|
}
|
|
212
278
|
//# sourceMappingURL=secure-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secure-session.js","sourceRoot":"","sources":["../src/secure-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"secure-session.js","sourceRoot":"","sources":["../src/secure-session.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,sEAAsE;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAqB5D,kFAAkF;AAClF,MAAM,iCAAiC,GAAG,OAAO,CAAC;AAElD;;;;GAIG;AACH,SAAS,UAAU,CAAC,SAA6B,EAAE,MAAc;IAC/D,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAClC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO;QACjC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;QAC5C,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAiB;IAYT,GAAG;IACH,MAAM;IACN,MAAM;IACN,QAAQ;IAdV,eAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IACnE;;;;OAIG;IACc,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7B,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,qBAAqB,CAAa;IAEnD,YACmB,GAAY,EACZ,MAAqC,EACrC,MAAoB,EACpB,QAAyB;mBAHzB,GAAG;sBACH,MAAM;sBACN,MAAM;wBACN,QAAQ;QAEzB,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;YACzC,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC1C,OAAO,sEAAsE,CAAC;YAChF,CAAC;YACD,OAAO,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAC5C,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACrC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,cAAc;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CACC,CAAC;QAC1C,OAAO,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,SAAiB;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,sEAAsE;QACtE,IAAI,YAAiD,CAAC;QACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;oBACrC,MAAM,IAAI,kBAAkB,CAC1B,KAAK,CAAC,MAAM,KAAK,yBAAyB;wBACxC,CAAC,CAAC,yBAAyB;wBAC3B,CAAC,CAAC,eAAe,EACnB,KAAK,CAAC,OAAO,CACd,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,kBAAkB,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO;gBACL,SAAS;gBACT,OAAO,EAAE,KAAK;gBACd,kBAAkB,EAAE,IAAI;gBACxB,gBAAgB,EAAE,IAAI;gBACtB,YAAY,EAAE,IAAI;gBAClB,kBAAkB,EAAE,KAAK;gBACzB,eAAe,EAAE,KAAK;gBACtB,gBAAgB,EAAE,EAAE;gBACpB,gBAAgB,EAAE,KAAK;gBACvB,aAAa,EAAE,EAAE;aAClB,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrD,MAAM,eAAe,GACnB,iBAAiB,KAAK,IAAI;YACxB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrE,yEAAyE;QACzE,qEAAqE;QACrE,8DAA8D;QAC9D,IAAI,iBAAiB,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAChE,MAAM,IAAI,kBAAkB,CAC1B,uBAAuB,EACvB,aAAa,iBAAiB,oBAAoB,CACnD,CAAC;QACJ,CAAC;QACD,IAAI,gBAAoC,CAAC;QACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACrC,IAAI,YAAY,KAAK,SAAS,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBAChE,MAAM,IAAI,kBAAkB,CAC1B,uBAAuB,EACvB,4CAA4C,CAC7C,CAAC;YACJ,CAAC;YACD,IAAI,CAAC;gBACH,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAC7C,YAAY,CAAC,EAAE,EACf,eAAe,CAAC,IAAI,CACrB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAkB,CAC1B,uBAAuB,EACvB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAClD,MAAM,kBAAkB,GACtB,CAAC,QAAQ,CAAC,uBAAuB;YACjC,cAAc,KAAK,IAAI;YACvB,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,cAAc,CAAC;QAErE,MAAM,gBAAgB,GACpB,CAAC,QAAQ,CAAC,qBAAqB;YAC/B,CAAC,iBAAiB,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC;YAC3D,CAAC,gBAAgB,KAAK,SAAS;gBAC7B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACzD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB;gBAChC,eAAe,KAAK,SAAS;gBAC7B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7D,CAAC,iBAAiB,KAAK,IAAI;gBACzB,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI;gBAC3B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAErB,CAAC;QACF,MAAM,YAAY,GAChB,CAAC,QAAQ,CAAC,iBAAiB;YAC3B,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI;YAChC,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,OAAO,CAAC,QAAQ;gBAC3C,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK;gBACtC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI;oBACtC,OAAO,CAAC,eAAe,KAAK,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC,kBAAkB,IAAI,CAAC,gBAAgB,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9D,MAAM,IAAI,kBAAkB,CAC1B,sBAAsB,EACtB,+BAA+B,kBAAkB,cAAc,gBAAgB,UAAU,YAAY,EAAE,CACxG,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CACnD,QAAQ,CAAC,gBAAgB,CAC1B,CAAC;QACF,IACE,UAAU,CAAC,OAAO,KAAK,QAAQ,CAAC,WAAW;YAC3C,UAAU,CAAC,QAAQ,KAAK,QAAQ,CAAC,cAAc,EAC/C,CAAC;YACD,MAAM,IAAI,kBAAkB,CAC1B,mBAAmB,EACnB,qBAAqB,QAAQ,CAAC,gBAAgB,wBAAwB,QAAQ,CAAC,WAAW,QAAQ,CACnG,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5E,oEAAoE;QACpE,yEAAyE;QACzE,qBAAqB;QACrB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CACrD,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,cAAc,CAC7D,CAAC;QACF,IACE,iBAAiB,KAAK,QAAQ,CAAC,gBAAgB;YAC/C,CAAC,cAAc;gBACb,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;oBACzC,iCAAiC,CAAC,EACtC,CAAC;YACD,MAAM,IAAI,kBAAkB,CAC1B,kBAAkB,EAClB,2CAA2C,CAC5C,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GACf,MAAM,CAAC,OAAO,CAAC,OAAO;YACtB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,wBAAwB;YACjD,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACzD,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,sBAAsB,CAAC;YACxD,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QAChC,MAAM,MAAM,GAAG,gBAAgB,CAC7B,WAAW,EACX,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,SAAS,CAChE,CAAC;QACF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,kBAAkB,CAC1B,eAAe,EACf,uBAAuB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,WAAW,KAAK,WAAW,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CACvD,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CACtC,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAClD,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC,CAAC;gBACH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE;oBAC9B,WAAW;oBACX,YAAY;oBACZ,kBAAkB;iBACnB,CAAC,CAAC;gBACH,KAAK,EAAE,kBAAkB,EAAE,CAAC;gBAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACzE,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAC5D,KAAK,CAAC,OAAO,CACd,CAAC;QACF,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,KAAK,QAAQ,CAAC,WAAW,CAAC;QACvE,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC;QACxD,IACE,mBAAmB,KAAK,QAAQ,CAAC,gBAAgB;YACjD,CAAC,kBAAkB;YACnB,CAAC,eAAe,EAChB,CAAC;YACD,MAAM,IAAI,kBAAkB,CAC1B,oBAAoB,EACpB,+BAA+B,CAChC,CAAC;QACJ,CAAC;QACD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;YACrC,SAAS;YACT,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,aAAa,EAAE,MAAM,CAAC,KAAK;SAC5B,CAAC,CAAC;QACH,OAAO;YACL,SAAS;YACT,OAAO,EAAE,IAAI;YACb,kBAAkB;YAClB,gBAAgB;YAChB,YAAY;YACZ,kBAAkB;YAClB,eAAe;YACf,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,gBAAgB,EAAE,IAAI;YACtB,wEAAwE;YACxE,4CAA4C;YAC5C,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK;SACzC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,gFAAgF;IAChF,OAAO;QACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The browser-local key namespace every QA-side index derives from: the
|
|
3
|
+
* configured storage key pinned to the served route, versioned once so the
|
|
4
|
+
* Host's head-script injection and the client bundle cannot drift apart.
|
|
5
|
+
*
|
|
6
|
+
* Dependency-free like every `src/shared` module: both bundles inline it.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* The versioned key prefix for browser-local QA state of one deployment.
|
|
10
|
+
* Callers append their own scope suffix (`:account-token`, `:welcome-notice`,
|
|
11
|
+
* `:chat:<id>`, …).
|
|
12
|
+
* @param config - configuration holding the storage key and the route path.
|
|
13
|
+
* @returns the versioned prefix, e.g. `dsh-qa-surface.session:v1:/qa`.
|
|
14
|
+
*/
|
|
15
|
+
export function qaStorageNamespace(config) {
|
|
16
|
+
return `${config.session.storageKey}:v1:${config.route.path}`;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=session-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-key.js","sourceRoot":"","sources":["../../src/shared/session-key.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAGE;IAEF,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity shared by the Host plugin and its browser settings card.
|
|
3
|
+
*
|
|
4
|
+
* This module must stay dependency-free: the card bundle inlines it, and a
|
|
5
|
+
* browser build must not pull the Host config surface (schemastery) into the
|
|
6
|
+
* page just to learn the namespace name.
|
|
7
|
+
*/
|
|
8
|
+
/** Settings namespace the QA surface owns and its card binds to. */
|
|
9
|
+
export const QA_SURFACE_SETTINGS_NAMESPACE = "qa-surface";
|
|
10
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/shared/settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,6BAA6B,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phrases the running indicator cycles through. The list deliberately mixes
|
|
3
|
+
* Russian idiom with workshop imagery: a turn that keeps reshuffling the same
|
|
4
|
+
* thought in new words reads as alive, while a frozen one reads as stuck.
|
|
5
|
+
*
|
|
6
|
+
* Operators replace the list through `thinkingPhrases`; this module holds the
|
|
7
|
+
* canonical default so the config schema, the resolver and the browser all
|
|
8
|
+
* read one list.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_THINKING_PHRASES = Object.freeze([
|
|
11
|
+
"Скребу по сусекам…",
|
|
12
|
+
"Кумекаю…",
|
|
13
|
+
"Навожу резкость…",
|
|
14
|
+
"Собираю мысли в кучку…",
|
|
15
|
+
"Раскладываю по полочкам…",
|
|
16
|
+
"Сверяю приметы…",
|
|
17
|
+
"Шлифую мысли…",
|
|
18
|
+
"Раскидываю умом…",
|
|
19
|
+
"Обтачиваю формулировки…",
|
|
20
|
+
"Ломаю голову…",
|
|
21
|
+
"Затачиваю аргументы…",
|
|
22
|
+
"Шевелю извилинами…",
|
|
23
|
+
"Правлю напильником…",
|
|
24
|
+
"Разматываю клубок…",
|
|
25
|
+
"Снимаю стружку…",
|
|
26
|
+
"Вяжу концы с концами…",
|
|
27
|
+
"Фрезерую крайние случаи…",
|
|
28
|
+
"Меряю семь раз…",
|
|
29
|
+
"Прокаливаю гипотезы…",
|
|
30
|
+
"Смотрю в корень…",
|
|
31
|
+
"Отливаю форму решения…",
|
|
32
|
+
"Ставлю точки над i…",
|
|
33
|
+
"Кую версию…",
|
|
34
|
+
"Разбираю по косточкам…",
|
|
35
|
+
"Калибрую допуски…",
|
|
36
|
+
"Прикидываю так и эдак…",
|
|
37
|
+
"Считаю допуски и посадки…",
|
|
38
|
+
"Взвешиваю за и против…",
|
|
39
|
+
"Меряю штангенциркулем…",
|
|
40
|
+
"Читаю между строк…",
|
|
41
|
+
"Сверяю по чертежу…",
|
|
42
|
+
"Тяну за ниточку…",
|
|
43
|
+
"Проверяю биение…",
|
|
44
|
+
"Перебираю варианты…",
|
|
45
|
+
"Зачищаю заусенцы…",
|
|
46
|
+
"Жонглирую версиями…",
|
|
47
|
+
"Центрую заготовку…",
|
|
48
|
+
"Подшиваю факты к делу…",
|
|
49
|
+
"Обкатываю механизм…",
|
|
50
|
+
"Плету сеть доводов…",
|
|
51
|
+
"Собираю узел…",
|
|
52
|
+
"Думаю думу…",
|
|
53
|
+
"Гну по шаблону…",
|
|
54
|
+
"Сверяю с ГОСТом…",
|
|
55
|
+
]);
|
|
56
|
+
/** How long one phrase stays on screen before the next one takes over. */
|
|
57
|
+
const PHRASE_INTERVAL_MS = 4_000;
|
|
58
|
+
/**
|
|
59
|
+
* Phrase shown `elapsedMs` into a running turn. The list is operator supplied,
|
|
60
|
+
* so an empty one falls back to the default: the indicator always needs a
|
|
61
|
+
* label.
|
|
62
|
+
*/
|
|
63
|
+
export function thinkingPhrase(elapsedMs, phrases = DEFAULT_THINKING_PHRASES) {
|
|
64
|
+
const pool = phrases.length === 0 ? DEFAULT_THINKING_PHRASES : phrases;
|
|
65
|
+
const index = Math.floor(Math.max(0, elapsedMs) / PHRASE_INTERVAL_MS) % pool.length;
|
|
66
|
+
return pool[index];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=thinking-phrases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-phrases.js","sourceRoot":"","sources":["../src/thinking-phrases.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsB,MAAM,CAAC,MAAM,CAAC;IACvE,oBAAoB;IACpB,UAAU;IACV,kBAAkB;IAClB,wBAAwB;IACxB,0BAA0B;IAC1B,iBAAiB;IACjB,eAAe;IACf,kBAAkB;IAClB,yBAAyB;IACzB,eAAe;IACf,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,uBAAuB;IACvB,0BAA0B;IAC1B,iBAAiB;IACjB,sBAAsB;IACtB,kBAAkB;IAClB,wBAAwB;IACxB,qBAAqB;IACrB,aAAa;IACb,wBAAwB;IACxB,mBAAmB;IACnB,wBAAwB;IACxB,2BAA2B;IAC3B,wBAAwB;IACxB,wBAAwB;IACxB,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,wBAAwB;IACxB,qBAAqB;IACrB,qBAAqB;IACrB,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,kBAAkB;CACnB,CAAC,CAAC;AAEH,0EAA0E;AAC1E,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,OAAO,GAAsB,wBAAwB;IAErD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,kBAAkB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACxE,OAAO,IAAI,CAAC,KAAK,CAAW,CAAC;AAC/B,CAAC"}
|