@yadsh/dsh-qa-surface 0.18.0 → 0.19.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 +20 -22
- package/lib/attachment-access.js +147 -0
- package/lib/attachment-access.js.map +1 -0
- package/lib/chat-sharing/search.js +89 -0
- package/lib/chat-sharing/search.js.map +1 -0
- package/lib/chat-sharing/transport.js +2 -7
- package/lib/chat-sharing/transport.js.map +1 -1
- package/lib/client/QaSessionController.js +51 -9
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +4 -3
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/components/QaChangelog.js +27 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaRequestWait.js +15 -0
- package/lib/client/components/QaRequestWait.js.map +1 -0
- package/lib/client/index.js +3 -1
- package/lib/client/index.js.map +1 -1
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/request-wait-styles.js +7 -0
- package/lib/client/request-wait-styles.js.map +1 -0
- package/lib/client/styles.js +2 -0
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client.js +14 -8
- package/lib/client.js.map +1 -1
- package/lib/filesystem-intent.js +39 -0
- package/lib/filesystem-intent.js.map +1 -0
- package/lib/forms/attachments.js +18 -2
- package/lib/forms/attachments.js.map +1 -1
- package/lib/index.js +46 -80
- package/lib/index.js.map +1 -1
- package/lib/qa-tools/catalog.js.map +1 -1
- package/lib/qa-tools/index.js.map +1 -1
- package/lib/qa-tools/request-user-form.js +1 -1
- package/lib/qa-tools/request-user-form.js.map +1 -1
- package/lib/request-scheduler.js +235 -0
- package/lib/request-scheduler.js.map +1 -0
- package/lib/secure-session.js +46 -52
- package/lib/secure-session.js.map +1 -1
- package/lib/session-create.js +125 -0
- package/lib/session-create.js.map +1 -0
- package/lib/typert.host.js +163 -116
- package/lib/typert.remote-client.d.ts +3 -3
- package/lib/typert.remote-client.js +159 -112
- package/lib/types/attachment-access.d.ts +29 -0
- package/lib/types/chat-sharing/search.d.ts +5 -0
- package/lib/types/client/QaSessionController.d.ts +12 -9
- package/lib/types/client/components/QaRequestWait.d.ts +6 -0
- package/lib/types/client/project-session-state.d.ts +2 -4
- package/lib/types/client/request-wait-styles.d.ts +2 -0
- package/lib/types/client/types.d.ts +3 -3
- package/lib/types/filesystem-intent.d.ts +12 -0
- package/lib/types/forms/attachments.d.ts +5 -2
- package/lib/types/index.d.ts +6 -13
- package/lib/types/qa-tools/catalog.d.ts +1 -1
- package/lib/types/qa-tools/index.d.ts +1 -1
- package/lib/types/qa-tools/request-user-form.d.ts +1 -1
- package/lib/types/request-scheduler.d.ts +28 -0
- package/lib/types/secure-session.d.ts +12 -26
- package/lib/types/session-create.d.ts +29 -0
- package/lib/types/types/session.d.ts +8 -0
- package/lib/types/user-workspace.d.ts +4 -6
- package/lib/user-workspace.js +13 -67
- package/lib/user-workspace.js.map +1 -1
- package/package.json +11 -9
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { SessionId } from "@deepseek-ai/dsh-session/types";
|
|
3
|
+
import { WorkspaceId } from "@deepseek-ai/dsh-workspace";
|
|
4
|
+
import { assertModelPairAvailable, projectModelCatalog, } from "./access/model-policy.js";
|
|
5
|
+
import { qaAttestationFailureMessage, QaAttestationError, } from "./attestation.js";
|
|
6
|
+
import { prepareQaUserWorkspace } from "./user-workspace.js";
|
|
7
|
+
import { applySessionModelPolicy } from "./session-model.js";
|
|
8
|
+
/** Preserve the original admission cause rather than the Host RPC wrapper. */
|
|
9
|
+
function creationFailure(error) {
|
|
10
|
+
return new Error(qaAttestationFailureMessage("Unable to create a QA session.", error), { cause: error });
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Admit inside the native factory's serial publication callback. A failure is
|
|
14
|
+
* rolled back by the Host's lifecycle owner before we erase this UUID's log;
|
|
15
|
+
* native preset composition and dynamic default-model hooks stay intact.
|
|
16
|
+
*/
|
|
17
|
+
export async function createQaSession(options) {
|
|
18
|
+
const { ctx, config, logger } = options;
|
|
19
|
+
if (config.session.policy === "fixed")
|
|
20
|
+
throw new Error("Fixed QA sessions cannot be created.");
|
|
21
|
+
const id = SessionId(`session-${randomUUID()}`);
|
|
22
|
+
const owner = options.reserve(id);
|
|
23
|
+
let creating = false;
|
|
24
|
+
let removeListener;
|
|
25
|
+
let callbackError;
|
|
26
|
+
let callbackFailed = false;
|
|
27
|
+
let attachmentAttempted = false;
|
|
28
|
+
let workspace;
|
|
29
|
+
try {
|
|
30
|
+
options.preflight();
|
|
31
|
+
workspace =
|
|
32
|
+
config.session.workspaceId === null
|
|
33
|
+
? undefined
|
|
34
|
+
: ctx.workspaceRegistry.get(WorkspaceId(config.session.workspaceId));
|
|
35
|
+
if (config.session.workspaceId !== null && workspace === undefined)
|
|
36
|
+
throw new Error("Configured QA workspace is unavailable.");
|
|
37
|
+
let cwd = workspace?.path ?? config.session.cwd ?? process.cwd();
|
|
38
|
+
if (config.accounts.perUserWorkspace) {
|
|
39
|
+
if (owner === undefined || workspace === undefined)
|
|
40
|
+
throw new Error("Per-user QA workspace configuration is unavailable.");
|
|
41
|
+
cwd = prepareQaUserWorkspace(workspace.path, owner.id);
|
|
42
|
+
}
|
|
43
|
+
const policy = options.modelPolicy(id);
|
|
44
|
+
if (policy.pair !== undefined)
|
|
45
|
+
assertModelPairAvailable(policy.pair, projectModelCatalog(await ctx.sessionController.modelCatalog()));
|
|
46
|
+
removeListener = ctx.on("agent/created", async ({ agent }) => {
|
|
47
|
+
if (String(agent.session.id) !== id)
|
|
48
|
+
return;
|
|
49
|
+
try {
|
|
50
|
+
if (!config.accounts.perUserWorkspace && workspace !== undefined) {
|
|
51
|
+
attachmentAttempted = true;
|
|
52
|
+
await workspace.attachSession(id);
|
|
53
|
+
}
|
|
54
|
+
await applySessionModelPolicy(ctx, id, policy, logger);
|
|
55
|
+
await options.admit(id);
|
|
56
|
+
options.attest(id, owner?.id);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
callbackError = error;
|
|
60
|
+
callbackFailed = true;
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}, { global: true });
|
|
64
|
+
creating = true;
|
|
65
|
+
await ctx.sessionController.create({
|
|
66
|
+
sessionId: id,
|
|
67
|
+
cwd,
|
|
68
|
+
...(config.session.agentPreset === null
|
|
69
|
+
? {}
|
|
70
|
+
: { agentPreset: config.session.agentPreset }),
|
|
71
|
+
});
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
catch (failure) {
|
|
75
|
+
const error = callbackFailed ? callbackError : failure;
|
|
76
|
+
options.reject(id);
|
|
77
|
+
let removed = !creating;
|
|
78
|
+
if (creating) {
|
|
79
|
+
try {
|
|
80
|
+
// Native create has already awaited its owned factory rollback. Never
|
|
81
|
+
// erase a journal if an incompatible/failing Host still has it live.
|
|
82
|
+
if (ctx.agents.get(id) !== undefined ||
|
|
83
|
+
ctx.sessions.get(id) !== undefined)
|
|
84
|
+
throw new Error("The failed QA session is still live.", {
|
|
85
|
+
cause: failure,
|
|
86
|
+
});
|
|
87
|
+
if (attachmentAttempted)
|
|
88
|
+
await workspace?.detachSession(id);
|
|
89
|
+
const erased = await options.sessionFiles.erase([id]);
|
|
90
|
+
removed = erased.removed.includes(id);
|
|
91
|
+
}
|
|
92
|
+
catch (cleanupError) {
|
|
93
|
+
logger.error("session.create-cleanup-rejected", {
|
|
94
|
+
sessionId: id,
|
|
95
|
+
error: String(cleanupError),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// A non-directory backend, failed disposal, or failed erasure retains the
|
|
100
|
+
// owner fence and the runtime refusal instead of leaving a claimable log.
|
|
101
|
+
if (removed) {
|
|
102
|
+
try {
|
|
103
|
+
if (owner !== undefined)
|
|
104
|
+
options.release(owner.id, id);
|
|
105
|
+
options.forget(id);
|
|
106
|
+
}
|
|
107
|
+
catch (cleanupError) {
|
|
108
|
+
logger.error("session.create-cleanup-rejected", {
|
|
109
|
+
sessionId: id,
|
|
110
|
+
error: String(cleanupError),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
logger.error("session.create-rejected", {
|
|
115
|
+
sessionId: id,
|
|
116
|
+
reason: error instanceof QaAttestationError ? error.reason : undefined,
|
|
117
|
+
error: error instanceof Error ? error.message : String(error),
|
|
118
|
+
});
|
|
119
|
+
throw creationFailure(error);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
removeListener?.();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=session-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-create.js","sourceRoot":"","sources":["../src/session-create.ts"],"names":[],"mappings":"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"}
|