@yadsh/dsh-qa-surface 0.15.2 → 0.15.3

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.
@@ -64,6 +64,19 @@ export declare function withdrawnSkillNames(config: QaCapabilityConfig): Readonl
64
64
  */
65
65
  export declare function personalUserSkillNames(config: QaCapabilityConfig, ownSkills: ReadonlySet<string> | undefined): readonly string[];
66
66
  export declare function resolveCapabilityPolicy({ config, subroleId, systemTools, systemSkills, available: installed, skillMetadata, revision, }: ResolveCapabilityPolicyInput): QaEffectiveCapabilityPolicy;
67
+ /**
68
+ * The skills a person may invoke under one policy — the whole of the
69
+ * user-facing allow-list, and the one place it is read.
70
+ *
71
+ * An empty `userSkills` means the role keeps no separate user list, not that it
72
+ * grants nothing, so the model-facing set stands in for it. A typed gesture is
73
+ * admitted or refused by this list and the palette is narrowed by it, so both
74
+ * have to derive it here: a name the palette offers but the line refuses, or
75
+ * one the palette hides while the line would accept, is one rule read two ways.
76
+ *
77
+ * @param policy - the effective capability policy of one session.
78
+ */
79
+ export declare function userInvocableSkillNames(policy: QaEffectiveCapabilityPolicy): readonly string[];
67
80
  export interface ResolveSkillAccessInput {
68
81
  readonly config: QaCapabilityConfig;
69
82
  /** Every discovered skill with its normalized metadata. */
@@ -158,6 +158,32 @@ export declare class QaAccessService {
158
158
  policyForSessionOwner(owner: {
159
159
  readonly id: string;
160
160
  } | undefined, sessionId: string, agent: Agent): Promise<QaResolvedSessionPolicy | undefined>;
161
+ /**
162
+ * The policy one session record answers with: the snapshot it froze, or the
163
+ * role as it is configured now when the chat has never frozen one.
164
+ *
165
+ * Every read of a session's capabilities goes through here, so a chat that is
166
+ * running and a chat nobody has woken cannot disagree about what its role
167
+ * grants.
168
+ */
169
+ private policyForRecord;
170
+ /**
171
+ * The policy of a chat this process holds no live agent for.
172
+ *
173
+ * A cold chat has an owner and a role, and the reads that name its
174
+ * capabilities must narrow it by the rule above — the same one a live chat is
175
+ * narrowed by — rather than answer "no role opinion" because the agent that
176
+ * carries the capability snapshot happens to be asleep. What a cold chat has
177
+ * no answer for is that snapshot: the catalog the deployment mounts for every
178
+ * chat stands in for the agent's own, which is why the project layer of this
179
+ * chat's workspace is missing from it, and why nothing is frozen onto the
180
+ * session record here — a palette read must not decide what a later turn may
181
+ * do.
182
+ *
183
+ * @returns the resolved policy; the ownership check is the refusal, so a
184
+ * foreign browser never reaches it.
185
+ */
186
+ policyForColdSession(token: string, sessionId: string): Promise<QaEffectiveCapabilityPolicy>;
161
187
  /** The browser's entry point: the token resolves the owning account. */
162
188
  policyForSession(token: string, sessionId: string, agent: Agent): Promise<QaResolvedSessionPolicy | undefined>;
163
189
  /** Activation history of one session, for review and quality analysis. */
@@ -107,10 +107,12 @@ export declare class QaSurface extends TypertRemoteService {
107
107
  * check and the deployment's lockdown is the boundary, exactly as it is for
108
108
  * every other remote.
109
109
  *
110
- * The grant mirrors `installQaSkillPolicy` to the letter — an empty
111
- * `userSkills` list means the role keeps no separate user list, not that it
112
- * grants nothing — so the palette can never offer a skill the typed gesture
113
- * would refuse, nor hide one it would accept.
110
+ * The grant is {@link userInvocableSkillNames} — the one list the typed
111
+ * gesture is admitted or refused by — for every chat that has a role, woken
112
+ * or not: the palette a visitor sees before the chat runs is narrowed by that
113
+ * same rule, so it can neither offer a name the line would refuse nor hide
114
+ * one it would accept. `undefined` is answered only where the deployment has
115
+ * no roles to consult at all.
114
116
  */
115
117
  private slashSessionGrant;
116
118
  /**
@@ -39,6 +39,11 @@ export interface BuildSlashCatalogOptions {
39
39
  * The session role's own user-skill grant, when the access system is on.
40
40
  * `undefined` means the role system has no opinion, which is its state on a
41
41
  * deployment that never enabled roles — not "grant nothing".
42
+ *
43
+ * This is the only grant a read may answer with, whatever the chat looks
44
+ * like: a chat that is running and a chat nobody has woken are narrowed by
45
+ * the same allow-list and the same role, because the palette that names a
46
+ * skill this chat may not invoke teaches the visitor a gesture that fails.
42
47
  */
43
48
  readonly grantedSkills?: readonly string[] | undefined;
44
49
  readonly commandSurface: QaSlashCommandSurface;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yadsh/dsh-qa-surface",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "description": "A focused end-user QA surface backed by native DeepSeek Harness sessions",
5
5
  "repository": {
6
6
  "type": "git",
@@ -135,10 +135,10 @@
135
135
  "dependencies": {
136
136
  "yaml": "^2.9.0",
137
137
  "zod": "^4.4.3",
138
- "@yadsh/dsh-audit-core": "^0.1.1",
139
138
  "@yadsh/dsh-audit-ui": "^0.1.2",
140
- "@yadsh/dsh-plugin-kit": "^0.5.0",
141
139
  "@yadsh/dsh-documents": "^0.6.2",
140
+ "@yadsh/dsh-plugin-kit": "^0.5.0",
141
+ "@yadsh/dsh-audit-core": "^0.1.1",
142
142
  "@yadsh/dsh-plugin-log": "^0.4.1"
143
143
  },
144
144
  "devDependencies": {