@yadsh/dsh-qa-surface 0.9.0 → 0.11.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 +269 -2
- package/lib/access/service.js +49 -10
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +41 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +140 -0
- package/lib/accounts/database.js.map +1 -1
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/service-token.js +103 -0
- package/lib/accounts/service-token.js.map +1 -0
- package/lib/accounts/store.js +291 -5
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/conversation-log.js +14 -8
- package/lib/admin/conversation-log.js.map +1 -1
- package/lib/admin/permissions.js +5 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +4 -0
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +180 -7
- package/lib/admin/service.js.map +1 -1
- package/lib/admin/session-log.js +39 -8
- package/lib/admin/session-log.js.map +1 -1
- package/lib/attachment-rules.js +39 -6
- package/lib/attachment-rules.js.map +1 -1
- package/lib/cli.js +83 -1
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +213 -4
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaSessionController.js +49 -21
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +51 -9
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaSurfaceGuard.js +12 -5
- package/lib/client/QaSurfaceGuard.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +14 -2
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/pages/SkillFiles.js +78 -0
- package/lib/client/admin/pages/SkillFiles.js.map +1 -0
- package/lib/client/admin/pages/Users.js +74 -3
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/routes.js +8 -1
- package/lib/client/admin/routes.js.map +1 -1
- package/lib/client/admin/shared.js +5 -1
- package/lib/client/admin/shared.js.map +1 -1
- package/lib/client/admin/styles.js +2 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/attachments.js +41 -11
- package/lib/client/attachments.js.map +1 -1
- package/lib/client/base64.js +22 -1
- package/lib/client/base64.js.map +1 -1
- package/lib/client/components/QaAgentsDrawer.js +9 -6
- package/lib/client/components/QaAgentsDrawer.js.map +1 -1
- package/lib/client/components/QaApproval.js +1 -1
- package/lib/client/components/QaApproval.js.map +1 -1
- package/lib/client/components/QaAuthGate.js +19 -10
- package/lib/client/components/QaAuthGate.js.map +1 -1
- package/lib/client/components/QaChangelog.js +56 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaFilesPanel.js +17 -11
- package/lib/client/components/QaFilesPanel.js.map +1 -1
- package/lib/client/components/QaHeader.js +3 -11
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaModal.js.map +1 -1
- package/lib/client/components/QaQuestions.js +4 -4
- package/lib/client/components/QaQuestions.js.map +1 -1
- package/lib/client/components/QaSidebar.js +10 -2
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaWidthHandle.js +111 -5
- package/lib/client/components/QaWidthHandle.js.map +1 -1
- package/lib/client/components/QaWorkspaceBrowser.js +231 -0
- package/lib/client/components/QaWorkspaceBrowser.js.map +1 -0
- package/lib/client/index.js +122 -53
- package/lib/client/index.js.map +1 -1
- package/lib/client/kiosk.js +51 -0
- package/lib/client/kiosk.js.map +1 -0
- package/lib/client/lineage.js +64 -0
- package/lib/client/lineage.js.map +1 -1
- package/lib/client/markdown/blocks.js +122 -7
- package/lib/client/markdown/blocks.js.map +1 -1
- package/lib/client/markdown/inline.js +108 -12
- package/lib/client/markdown/inline.js.map +1 -1
- package/lib/client/markdown/katex-css.js +12 -0
- package/lib/client/markdown/katex-css.js.map +1 -0
- package/lib/client/markdown/math.js +84 -0
- package/lib/client/markdown/math.js.map +1 -0
- package/lib/client/markdown/render.js +74 -5
- package/lib/client/markdown/render.js.map +1 -1
- package/lib/client/settings/card.js +2 -2
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/sections/attachments.js +6 -5
- package/lib/client/settings/sections/attachments.js.map +1 -1
- package/lib/client/settings/sections/notes.js +64 -0
- package/lib/client/settings/sections/notes.js.map +1 -0
- package/lib/client/settings/sections/sources.js +4 -1
- package/lib/client/settings/sections/sources.js.map +1 -1
- package/lib/client/settings/sections.js +1 -0
- package/lib/client/settings/sections.js.map +1 -1
- package/lib/client/settlement.js +1 -1
- package/lib/client/settlement.js.map +1 -1
- package/lib/client/source-preview.js +3 -0
- package/lib/client/source-preview.js.map +1 -1
- package/lib/client/styles.js +106 -18
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client/user-settings/IntegrationTokensPage.js +150 -0
- package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -0
- package/lib/client/user-settings/PasswordSettingsPage.js +48 -0
- package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -0
- package/lib/client/user-settings/SkillCatalog.js +2 -2
- package/lib/client/user-settings/SkillCatalog.js.map +1 -1
- package/lib/client/user-settings/UserSettingsDialog.js +17 -2
- package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
- package/lib/client/user-settings/copy.js +20 -0
- package/lib/client/user-settings/copy.js.map +1 -1
- package/lib/client.js +31007 -686
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/attachments.js +6 -5
- package/lib/config-resolvers/attachments.js.map +1 -1
- package/lib/config-resolvers/defaults.js +33 -2
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/integration.js +94 -0
- package/lib/config-resolvers/integration.js.map +1 -0
- package/lib/config-resolvers/notes.js +26 -0
- package/lib/config-resolvers/notes.js.map +1 -0
- package/lib/config-resolvers/sources.js +4 -0
- package/lib/config-resolvers/sources.js.map +1 -1
- package/lib/config.js +107 -0
- package/lib/config.js.map +1 -1
- package/lib/index.js +348 -12
- package/lib/index.js.map +1 -1
- package/lib/integration/answer.js +100 -0
- package/lib/integration/answer.js.map +1 -0
- package/lib/integration/attachments.js +231 -0
- package/lib/integration/attachments.js.map +1 -0
- package/lib/integration/contract.js +53 -0
- package/lib/integration/contract.js.map +1 -0
- package/lib/integration/host-runner.js +243 -0
- package/lib/integration/host-runner.js.map +1 -0
- package/lib/integration/http.js +538 -0
- package/lib/integration/http.js.map +1 -0
- package/lib/integration/service.js +331 -0
- package/lib/integration/service.js.map +1 -0
- package/lib/integration/transcript-reader.js +202 -0
- package/lib/integration/transcript-reader.js.map +1 -0
- package/lib/integration/transcript.js +148 -0
- package/lib/integration/transcript.js.map +1 -0
- package/lib/personal-skills/index.js +2 -2
- package/lib/personal-skills/index.js.map +1 -1
- package/lib/personal-skills/paths.js +14 -8
- package/lib/personal-skills/paths.js.map +1 -1
- package/lib/personal-skills/provider.js +16 -4
- package/lib/personal-skills/provider.js.map +1 -1
- package/lib/personal-skills/service.js +240 -30
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/prompt-notes.js +103 -6
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/document-preview.js +60 -0
- package/lib/provenance/document-preview.js.map +1 -0
- package/lib/provenance/file-preview.js +191 -19
- package/lib/provenance/file-preview.js.map +1 -1
- package/lib/qa-tools/catalog.js +18 -1
- package/lib/qa-tools/catalog.js.map +1 -1
- package/lib/qa-tools/docs-tools.js +563 -0
- package/lib/qa-tools/docs-tools.js.map +1 -0
- package/lib/qa-tools/file-delete-gate.js +60 -0
- package/lib/qa-tools/file-delete-gate.js.map +1 -0
- package/lib/qa-tools/file-delete.js +156 -0
- package/lib/qa-tools/file-delete.js.map +1 -0
- package/lib/resolve-config.js +6 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +83 -3
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/documents.js +22 -0
- package/lib/shared/documents.js.map +1 -0
- package/lib/shared/integration-tokens.js +23 -0
- package/lib/shared/integration-tokens.js.map +1 -0
- package/lib/typert.host.js +1320 -134
- package/lib/typert.remote-client.d.ts +33 -1
- package/lib/typert.remote-client.js +1102 -74
- package/lib/types/access/service.d.ts +33 -2
- package/lib/types/account-remotes.d.ts +30 -1
- package/lib/types/accounts/database.d.ts +53 -0
- package/lib/types/accounts/errors.d.ts +5 -1
- package/lib/types/accounts/service-token.d.ts +70 -0
- package/lib/types/accounts/store.d.ts +131 -1
- package/lib/types/admin/conversation-log.d.ts +12 -0
- package/lib/types/admin/service.d.ts +56 -1
- package/lib/types/admin/session-log.d.ts +21 -0
- package/lib/types/attachment-rules.d.ts +26 -3
- package/lib/types/client/QaAccountsController.d.ts +64 -5
- package/lib/types/client/QaSessionController.d.ts +24 -2
- package/lib/types/client/admin/pages/SkillFiles.d.ts +17 -0
- package/lib/types/client/admin/routes.d.ts +2 -0
- package/lib/types/client/admin/shared.d.ts +2 -0
- package/lib/types/client/attachments.d.ts +21 -4
- package/lib/types/client/base64.d.ts +13 -1
- package/lib/types/client/components/QaAgentsDrawer.d.ts +2 -1
- package/lib/types/client/components/QaFilesPanel.d.ts +16 -4
- package/lib/types/client/components/QaHeader.d.ts +9 -3
- package/lib/types/client/components/QaModal.d.ts +4 -3
- package/lib/types/client/components/QaWidthHandle.d.ts +48 -2
- package/lib/types/client/components/QaWorkspaceBrowser.d.ts +15 -0
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/kiosk.d.ts +34 -0
- package/lib/types/client/lineage.d.ts +42 -0
- package/lib/types/client/markdown/blocks.d.ts +14 -1
- package/lib/types/client/markdown/inline.d.ts +23 -7
- package/lib/types/client/markdown/katex-css.d.ts +11 -0
- package/lib/types/client/markdown/math.d.ts +23 -0
- package/lib/types/client/markdown/render.d.ts +2 -1
- package/lib/types/client/settings/sections/notes.d.ts +12 -0
- package/lib/types/client/settings/sections.d.ts +1 -0
- package/lib/types/client/settlement.d.ts +4 -1
- package/lib/types/client/styles.d.ts +15 -2
- package/lib/types/client/types.d.ts +120 -1
- package/lib/types/client/user-settings/IntegrationTokensPage.d.ts +21 -0
- package/lib/types/client/user-settings/PasswordSettingsPage.d.ts +19 -0
- package/lib/types/client/user-settings/UserSettingsDialog.d.ts +11 -2
- package/lib/types/client/user-settings/copy.d.ts +10 -1
- package/lib/types/config-resolvers/integration.d.ts +47 -0
- package/lib/types/config-resolvers/notes.d.ts +10 -0
- package/lib/types/config.d.ts +10 -0
- package/lib/types/index.d.ts +111 -1
- package/lib/types/integration/answer.d.ts +65 -0
- package/lib/types/integration/attachments.d.ts +85 -0
- package/lib/types/integration/contract.d.ts +196 -0
- package/lib/types/integration/host-runner.d.ts +44 -0
- package/lib/types/integration/http.d.ts +79 -0
- package/lib/types/integration/service.d.ts +120 -0
- package/lib/types/integration/transcript-reader.d.ts +100 -0
- package/lib/types/integration/transcript.d.ts +59 -0
- package/lib/types/personal-skills/index.d.ts +2 -2
- package/lib/types/personal-skills/paths.d.ts +15 -3
- package/lib/types/personal-skills/provider.d.ts +14 -2
- package/lib/types/personal-skills/service.d.ts +89 -14
- package/lib/types/prompt-notes.d.ts +37 -0
- package/lib/types/provenance/document-preview.d.ts +28 -0
- package/lib/types/provenance/file-preview.d.ts +69 -2
- package/lib/types/qa-tools/catalog.d.ts +1 -1
- package/lib/types/qa-tools/docs-tools.d.ts +160 -0
- package/lib/types/qa-tools/file-delete-gate.d.ts +42 -0
- package/lib/types/qa-tools/file-delete.d.ts +32 -0
- package/lib/types/secure-session.d.ts +52 -1
- package/lib/types/shared/documents.d.ts +20 -0
- package/lib/types/shared/integration-tokens.d.ts +24 -0
- package/lib/types/types.d.ts +263 -3
- package/lib/types/ui-mode.d.ts +18 -0
- package/lib/ui-mode.js +22 -0
- package/lib/ui-mode.js.map +1 -0
- package/package.json +12 -10
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { messageContentText } from "../admin/conversation-log.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reading a conversation back out of its durable log, for the application that
|
|
4
|
+
* started it.
|
|
5
|
+
*
|
|
6
|
+
* This is deliberately not the admin viewer's projection. That one answers a
|
|
7
|
+
* reviewer and carries what a review needs — tool calls, ratings, the redaction
|
|
8
|
+
* policy — none of which an external caller may see or has any use for. What
|
|
9
|
+
* this projector shares with the rest of the API is the flattening rule
|
|
10
|
+
* (`messageContentText`): the text a caller reads here is the same text it
|
|
11
|
+
* would have received as an answer, so the two never disagree about what a
|
|
12
|
+
* message says.
|
|
13
|
+
*
|
|
14
|
+
* Only human prompts and assistant messages are published. Injected context —
|
|
15
|
+
* identity notes, skill payloads, a slash command's expanded body — is model
|
|
16
|
+
* input recorded as a user message, and handing it back would show the caller
|
|
17
|
+
* instructions it never wrote. Tool traffic is model plumbing: the answer is
|
|
18
|
+
* already the result of it.
|
|
19
|
+
*/
|
|
20
|
+
/** Newest messages one read returns; more than a page is a different tool. */
|
|
21
|
+
export const QA_INTEGRATION_MAX_TRANSCRIPT_MESSAGES = 200;
|
|
22
|
+
function record(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
24
|
+
? value
|
|
25
|
+
: undefined;
|
|
26
|
+
}
|
|
27
|
+
/** Whether an `assistant/message` event's payload carries text worth publishing. */
|
|
28
|
+
function assistantTextOf(event) {
|
|
29
|
+
const data = record(event.data);
|
|
30
|
+
return messageContentText(record(data?.message)?.content).trim();
|
|
31
|
+
}
|
|
32
|
+
/** Whether a `user/message` event is something the person actually sent. */
|
|
33
|
+
function userTextOf(event) {
|
|
34
|
+
const data = record(event.data);
|
|
35
|
+
const source = record(data?.source);
|
|
36
|
+
if (source?.kind !== "user")
|
|
37
|
+
return undefined;
|
|
38
|
+
const text = messageContentText(data?.content).trim();
|
|
39
|
+
return text === "" ? undefined : text;
|
|
40
|
+
}
|
|
41
|
+
/** The ISO timestamp of an event the log gave a time, when it gave a usable one. */
|
|
42
|
+
function atOf(event) {
|
|
43
|
+
if (event.time === undefined || !Number.isFinite(event.time))
|
|
44
|
+
return undefined;
|
|
45
|
+
return new Date(event.time).toISOString();
|
|
46
|
+
}
|
|
47
|
+
/** Whether the events already arrive in ascending seq order. */
|
|
48
|
+
function isOrderedBySeq(events) {
|
|
49
|
+
for (let index = 1; index < events.length; index += 1) {
|
|
50
|
+
if (events[index].seq <
|
|
51
|
+
events[index - 1].seq) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/** One message's published form, or nothing when the event has none. */
|
|
58
|
+
function messageOf(event) {
|
|
59
|
+
const role = event.type === "user/message"
|
|
60
|
+
? "user"
|
|
61
|
+
: event.type === "assistant/message"
|
|
62
|
+
? "assistant"
|
|
63
|
+
: undefined;
|
|
64
|
+
if (role === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
const text = role === "user" ? userTextOf(event) : assistantTextOf(event);
|
|
67
|
+
if (text === undefined || text === "")
|
|
68
|
+
return undefined;
|
|
69
|
+
const at = atOf(event);
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
seq: event.seq,
|
|
72
|
+
role,
|
|
73
|
+
text,
|
|
74
|
+
...(at === undefined ? {} : { at }),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The newest published messages of a log, and what was left below them.
|
|
79
|
+
*
|
|
80
|
+
* This is the primitive both readers are built on, and it walks the events
|
|
81
|
+
* **newest first**: a page of a hundred-message conversation costs a hundred
|
|
82
|
+
* messages flattened, not the whole log, which is what makes a long chat's
|
|
83
|
+
* page cheap. Only the events below the cursor are considered, and the walk
|
|
84
|
+
* stops as soon as the window is full — the one message after that is enough
|
|
85
|
+
* to know that more exists, and `below` records its seq.
|
|
86
|
+
*
|
|
87
|
+
* @param chatId - the conversation being read; echoed back for correlation.
|
|
88
|
+
* @param events - the log's events, in any order.
|
|
89
|
+
* @param query - the cursor (exclusive) and how many messages to cover; the
|
|
90
|
+
* cursor is `undefined` for "from the end", which a warm window asks for.
|
|
91
|
+
* @returns the window, oldest first, and the newest seq left below it.
|
|
92
|
+
*/
|
|
93
|
+
export function integrationMessageWindow(chatId, events, query) {
|
|
94
|
+
// The order a log is written in is the order it is stored and read in, so
|
|
95
|
+
// sorting is the exception: a caller that handed over events from somewhere
|
|
96
|
+
// else (a test, a fixture) is the only one that pays for it. Checking costs
|
|
97
|
+
// one pass, and the walk below is the one that allocates.
|
|
98
|
+
const ordered = isOrderedBySeq(events)
|
|
99
|
+
? events
|
|
100
|
+
: [...events].sort((left, right) => left.seq - right.seq);
|
|
101
|
+
const messages = [];
|
|
102
|
+
let below;
|
|
103
|
+
for (let index = ordered.length - 1; index >= 0; index -= 1) {
|
|
104
|
+
const event = ordered[index];
|
|
105
|
+
if (query.after !== undefined && event.seq <= query.after)
|
|
106
|
+
break;
|
|
107
|
+
const message = messageOf(event);
|
|
108
|
+
if (message === undefined)
|
|
109
|
+
continue;
|
|
110
|
+
if (messages.length >= query.cover) {
|
|
111
|
+
// One message past the window is all the cursor needs to say "there is
|
|
112
|
+
// more below": it is the newest of the messages this window left out.
|
|
113
|
+
below = message.seq;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
messages.push(message);
|
|
117
|
+
}
|
|
118
|
+
messages.reverse();
|
|
119
|
+
return Object.freeze({
|
|
120
|
+
chatId,
|
|
121
|
+
messages: Object.freeze(messages),
|
|
122
|
+
below,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Project the log into one page of a caller's transcript.
|
|
127
|
+
*
|
|
128
|
+
* @param chatId - the conversation being read; echoed back for correlation.
|
|
129
|
+
* @param events - durable events, in any order.
|
|
130
|
+
* @param query - the caller's cursor and page size; both are already bounded.
|
|
131
|
+
* @returns the window with the caller's new cursor.
|
|
132
|
+
*/
|
|
133
|
+
export function projectIntegrationTranscript(chatId, events, query) {
|
|
134
|
+
// The window is the newest messages: a caller asking for history wants the
|
|
135
|
+
// end of the conversation, and the page it did not get is reported rather
|
|
136
|
+
// than silently dropped.
|
|
137
|
+
const window = integrationMessageWindow(chatId, events, {
|
|
138
|
+
after: query.after,
|
|
139
|
+
cover: query.limit,
|
|
140
|
+
});
|
|
141
|
+
return Object.freeze({
|
|
142
|
+
chatId,
|
|
143
|
+
messages: window.messages,
|
|
144
|
+
lastSeq: window.messages.at(-1)?.seq ?? query.after,
|
|
145
|
+
truncated: window.below !== undefined,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/integration/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ export { QaPersonalSkillError, } from "./errors.js";
|
|
|
2
2
|
export { QA_SKILL_TRASH_SUFFIX, resolveSkillRoots, skillDirectory, skillFilePath, } from "./paths.js";
|
|
3
3
|
export { normalizeAllowedTools, parseSkillFile, serializeSkillFile, skillFileBody, skillNameProblem, toJsonValue, } from "./skill-file.js";
|
|
4
4
|
export { skillFileBytes, skillRelativeRootProblem, skillRelativeRootSegments, validateSkillDraft, QA_SKILL_DEFAULT_RELATIVE_ROOT, QA_SKILL_DESCRIPTION_MAX, QA_SKILL_ENABLED_BY_DEFAULT, QA_SKILL_FILE_MAX_BYTES, QA_SKILL_MAX_BYTES_MAX, QA_SKILL_MAX_BYTES_MIN, QA_SKILL_MAX_TOOLS, QA_SKILL_NAME_MAX, QA_SKILL_NAME_PATTERN, QA_SKILL_WHEN_TO_USE_MAX, } from "./skill-format.js";
|
|
5
|
-
export { QA_USER_SKILLS_PROVIDER, QA_USER_SKILLS_RANK, QA_USER_SKILLS_SOURCE, createQaUserSkillProvider, } from "./provider.js";
|
|
6
|
-
export { QaPersonalSkills, } from "./service.js";
|
|
5
|
+
export { QA_SHARED_SKILLS_RANK, QA_SHARED_SKILLS_SOURCE, QA_USER_SKILLS_PROVIDER, QA_USER_SKILLS_RANK, QA_USER_SKILLS_SOURCE, createQaUserSkillProvider, } from "./provider.js";
|
|
6
|
+
export { QA_SKILL_ADMIN_EDITS_FILE, QaPersonalSkills, } from "./service.js";
|
|
7
7
|
export { createQaPersonalSkillRemotes, } from "./remotes.js";
|
|
8
8
|
export { QaPersonalSkillsHost } from "./host.js";
|
|
9
9
|
export { QaSkillWatcher } from "./watcher.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/personal-skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,aAAa,GAEd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,WAAW,GAIZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,8BAA8B,EAC9B,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/personal-skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,aAAa,GAEd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,WAAW,GAIZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,8BAA8B,EAC9B,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,GAOjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,GAE7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -44,24 +44,30 @@ function canonicalInside(parent, relative, reason, message, direct) {
|
|
|
44
44
|
return canonical;
|
|
45
45
|
}
|
|
46
46
|
/** Derive and verify every directory the feature touches for one account. */
|
|
47
|
-
export function resolveSkillRoots(personalRoot, relativeRoot
|
|
47
|
+
export function resolveSkillRoots(personalRoot, relativeRoot,
|
|
48
|
+
/**
|
|
49
|
+
* What the boundary refuses to leave, for the message an operator reads.
|
|
50
|
+
* The same resolution serves an account directory and the deployment-wide
|
|
51
|
+
* shared root, which have different owners but identical geometry.
|
|
52
|
+
*/
|
|
53
|
+
boundary = "this account's") {
|
|
48
54
|
const segments = [...skillRelativeRootSegments(relativeRoot)];
|
|
49
55
|
const last = segments.pop();
|
|
50
56
|
if (last === undefined) {
|
|
51
57
|
throw new QaPersonalSkillError("storage-unavailable", "the configured personal-skills root names no directory");
|
|
52
58
|
}
|
|
53
59
|
const canonicalPersonal = canonicalCandidate(personalRoot);
|
|
54
|
-
const skills = canonicalInside(canonicalPersonal, path.join(...segments, last), "storage-unavailable",
|
|
55
|
-
const trash = canonicalInside(canonicalPersonal, path.join(...segments, `${last}${QA_SKILL_TRASH_SUFFIX}`), "storage-unavailable",
|
|
56
|
-
return { personalRoot: canonicalPersonal, skills, trash };
|
|
60
|
+
const skills = canonicalInside(canonicalPersonal, path.join(...segments, last), "storage-unavailable", `the configured skills root escapes ${boundary} directory`, false);
|
|
61
|
+
const trash = canonicalInside(canonicalPersonal, path.join(...segments, `${last}${QA_SKILL_TRASH_SUFFIX}`), "storage-unavailable", `the skills trash directory escapes ${boundary} directory`, false);
|
|
62
|
+
return { personalRoot: canonicalPersonal, skills, trash, shared: false };
|
|
57
63
|
}
|
|
58
|
-
/** The directory of one skill, validated against the
|
|
59
|
-
export function skillDirectory(roots, name) {
|
|
64
|
+
/** The directory of one skill, validated against the scope's skills root. */
|
|
65
|
+
export function skillDirectory(roots, name, boundary = "this account's") {
|
|
60
66
|
const problem = skillNameProblem(name);
|
|
61
67
|
if (problem !== null) {
|
|
62
68
|
throw new QaPersonalSkillError("skill-name-invalid", `skill name is not usable: ${name}`);
|
|
63
69
|
}
|
|
64
|
-
return canonicalInside(roots.skills, name, "skill-name-invalid",
|
|
70
|
+
return canonicalInside(roots.skills, name, "skill-name-invalid", `the skill directory escapes ${boundary} skills root`, true);
|
|
65
71
|
}
|
|
66
72
|
export function skillFilePath(roots, name) {
|
|
67
73
|
return path.join(skillDirectory(roots, name), "SKILL.md");
|
|
@@ -105,7 +111,7 @@ export function ensureSkillRoots(roots) {
|
|
|
105
111
|
assertPlainDirectory(roots.skills);
|
|
106
112
|
const verified = realpathSync.native(roots.skills);
|
|
107
113
|
if (!pathIsInside(verified, roots.personalRoot)) {
|
|
108
|
-
throw new QaPersonalSkillError("storage-unavailable", "
|
|
114
|
+
throw new QaPersonalSkillError("storage-unavailable", "skill storage escapes the directory it was resolved against");
|
|
109
115
|
}
|
|
110
116
|
}
|
|
111
117
|
/** The skill subdirectories present for one account, sorted by name. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/personal-skills/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,GAEb,MAAM,SAAS,CAAC;AACjB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEhF;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/personal-skills/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,11 @@
|
|
|
5
5
|
* through the nearest `.git`, which for a personal QA directory inside a larger
|
|
6
6
|
* checkout would climb above the account and mix users together. This provider
|
|
7
7
|
* reads exactly one place — `<cwd>/.dsh/skills` where the cwd is a provisioned
|
|
8
|
-
* `.qa-users/<uuid>` directory — and
|
|
9
|
-
*
|
|
8
|
+
* `.qa-users/<uuid>` directory — and the deployment's shared root beside the
|
|
9
|
+
* registered workspace, replacing the filesystem layer inside the QA scope
|
|
10
|
+
* rather than adding a second one beside it. A shared skill is labelled and
|
|
11
|
+
* ranked distinctly, so a load can tell the deployment's own instructions from
|
|
12
|
+
* the account's.
|
|
10
13
|
*/
|
|
11
14
|
export const QA_USER_SKILLS_PROVIDER = "qa-user-skills";
|
|
12
15
|
/** Prompt-visible provenance label for a skill stored in an account directory. */
|
|
@@ -16,6 +19,15 @@ export const QA_USER_SKILLS_SOURCE = "qa-user";
|
|
|
16
19
|
* QA scope a personal skill wins a same-named duplicate from any other layer.
|
|
17
20
|
*/
|
|
18
21
|
export const QA_USER_SKILLS_RANK = 50;
|
|
22
|
+
/** Prompt-visible provenance label for a deployment-wide shared skill. */
|
|
23
|
+
export const QA_SHARED_SKILLS_SOURCE = "qa-shared";
|
|
24
|
+
/**
|
|
25
|
+
* Rank between the personal layer (50) and the project layer (100). A shared
|
|
26
|
+
* skill is curated for the whole deployment, so it outranks what a checkout
|
|
27
|
+
* happens to carry — but one account's own copy of the same name still wins,
|
|
28
|
+
* because that is the layer a person deliberately edited about themselves.
|
|
29
|
+
*/
|
|
30
|
+
export const QA_SHARED_SKILLS_RANK = 60;
|
|
19
31
|
function locatorOf(value) {
|
|
20
32
|
const directory = value?.directory;
|
|
21
33
|
return typeof directory === "string" && directory !== ""
|
|
@@ -47,10 +59,10 @@ function candidateOf(stored) {
|
|
|
47
59
|
modelInvocable: contents.modelInvocable,
|
|
48
60
|
userInvocable: contents.userInvocable,
|
|
49
61
|
},
|
|
50
|
-
source: QA_USER_SKILLS_SOURCE,
|
|
62
|
+
source: stored.shared ? QA_SHARED_SKILLS_SOURCE : QA_USER_SKILLS_SOURCE,
|
|
51
63
|
provider: QA_USER_SKILLS_PROVIDER,
|
|
52
64
|
resourceBase: { kind: "directory", path: stored.directory },
|
|
53
|
-
rank: QA_USER_SKILLS_RANK,
|
|
65
|
+
rank: stored.shared ? QA_SHARED_SKILLS_RANK : QA_USER_SKILLS_RANK,
|
|
54
66
|
locator: { directory: stored.directoryName },
|
|
55
67
|
path: stored.filePath,
|
|
56
68
|
// The registry drops metadata from its summaries, so `allowed-tools` is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/personal-skills/provider.ts"],"names":[],"mappings":"AASA
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/personal-skills/provider.ts"],"names":[],"mappings":"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"}
|