@yadsh/dsh-qa-surface 0.15.6 → 0.16.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.
Files changed (244) hide show
  1. package/README.md +8 -0
  2. package/lib/access/capability-catalog.js +11 -4
  3. package/lib/access/capability-catalog.js.map +1 -1
  4. package/lib/access/service.js +46 -5
  5. package/lib/access/service.js.map +1 -1
  6. package/lib/accounts/store.js +2 -2
  7. package/lib/accounts/store.js.map +1 -1
  8. package/lib/admin/service.js +4 -2
  9. package/lib/admin/service.js.map +1 -1
  10. package/lib/admin/session-log.js +3 -0
  11. package/lib/admin/session-log.js.map +1 -1
  12. package/lib/agent-scope.js +9 -0
  13. package/lib/agent-scope.js.map +1 -0
  14. package/lib/chat-sharing/native-fence.js +111 -0
  15. package/lib/chat-sharing/native-fence.js.map +1 -0
  16. package/lib/chat-sharing/resources.js +57 -0
  17. package/lib/chat-sharing/resources.js.map +1 -0
  18. package/lib/chat-sharing/store.js +193 -0
  19. package/lib/chat-sharing/store.js.map +1 -0
  20. package/lib/chat-sharing/transport.js +274 -0
  21. package/lib/chat-sharing/transport.js.map +1 -0
  22. package/lib/chat-sharing/turn-guard.js +154 -0
  23. package/lib/chat-sharing/turn-guard.js.map +1 -0
  24. package/lib/chat-sharing/types.js +2 -0
  25. package/lib/chat-sharing/types.js.map +1 -0
  26. package/lib/chat-sharing/uploads.js +55 -0
  27. package/lib/chat-sharing/uploads.js.map +1 -0
  28. package/lib/client/QaAccountsController.js +29 -2
  29. package/lib/client/QaAccountsController.js.map +1 -1
  30. package/lib/client/QaConfigController.js +7 -12
  31. package/lib/client/QaConfigController.js.map +1 -1
  32. package/lib/client/QaSessionController.js +186 -19
  33. package/lib/client/QaSessionController.js.map +1 -1
  34. package/lib/client/QaSurface.js +110 -9
  35. package/lib/client/QaSurface.js.map +1 -1
  36. package/lib/client/QaSurfaceGuard.js +6 -1
  37. package/lib/client/QaSurfaceGuard.js.map +1 -1
  38. package/lib/client/QaTranscriptAdapter.js +13 -3
  39. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  40. package/lib/client/account-conversation.js +33 -0
  41. package/lib/client/account-conversation.js.map +1 -0
  42. package/lib/client/account-sessions.js +106 -0
  43. package/lib/client/account-sessions.js.map +1 -0
  44. package/lib/client/account-upload.js +30 -0
  45. package/lib/client/account-upload.js.map +1 -0
  46. package/lib/client/chat-artifacts.js +17 -3
  47. package/lib/client/chat-artifacts.js.map +1 -1
  48. package/lib/client/chat-sharing-api.js +2 -0
  49. package/lib/client/chat-sharing-api.js.map +1 -0
  50. package/lib/client/components/QaChangelog.js +70 -3
  51. package/lib/client/components/QaChangelog.js.map +1 -1
  52. package/lib/client/components/QaChatSharing.js +92 -0
  53. package/lib/client/components/QaChatSharing.js.map +1 -0
  54. package/lib/client/components/QaComposer.js +8 -4
  55. package/lib/client/components/QaComposer.js.map +1 -1
  56. package/lib/client/components/QaFileAttachment.js +12 -3
  57. package/lib/client/components/QaFileAttachment.js.map +1 -1
  58. package/lib/client/components/QaFilesPanel.js +11 -4
  59. package/lib/client/components/QaFilesPanel.js.map +1 -1
  60. package/lib/client/components/QaHeader.js +3 -3
  61. package/lib/client/components/QaHeader.js.map +1 -1
  62. package/lib/client/components/QaMessage.js +34 -9
  63. package/lib/client/components/QaMessage.js.map +1 -1
  64. package/lib/client/components/QaSidebar.js +1 -1
  65. package/lib/client/components/QaSidebar.js.map +1 -1
  66. package/lib/client/components/QaSourcesPanel.js +12 -4
  67. package/lib/client/components/QaSourcesPanel.js.map +1 -1
  68. package/lib/client/components/QaWorkspaceBrowser.js +28 -7
  69. package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
  70. package/lib/client/components/source-refs.js +42 -23
  71. package/lib/client/components/source-refs.js.map +1 -1
  72. package/lib/client/index.js +60 -6
  73. package/lib/client/index.js.map +1 -1
  74. package/lib/client/lineage.js +4 -3
  75. package/lib/client/lineage.js.map +1 -1
  76. package/lib/client/markdown/katex-css.js +1 -1
  77. package/lib/client/markdown/render.js +3 -4
  78. package/lib/client/markdown/render.js.map +1 -1
  79. package/lib/client/markdown/source-chip.js +4 -1
  80. package/lib/client/markdown/source-chip.js.map +1 -1
  81. package/lib/client/notifications/notification-dispatcher.js +50 -11
  82. package/lib/client/notifications/notification-dispatcher.js.map +1 -1
  83. package/lib/client/notifications/use-turn-notifications.js +107 -18
  84. package/lib/client/notifications/use-turn-notifications.js.map +1 -1
  85. package/lib/client/project-session-state.js +28 -13
  86. package/lib/client/project-session-state.js.map +1 -1
  87. package/lib/client/session-admission.js +9 -1
  88. package/lib/client/session-admission.js.map +1 -1
  89. package/lib/client/session-sources.js +44 -3
  90. package/lib/client/session-sources.js.map +1 -1
  91. package/lib/client/slash/useSlashNavigation.js +8 -5
  92. package/lib/client/slash/useSlashNavigation.js.map +1 -1
  93. package/lib/client/source-preview.js +1 -1
  94. package/lib/client/source-preview.js.map +1 -1
  95. package/lib/client/styles.js +9 -2
  96. package/lib/client/styles.js.map +1 -1
  97. package/lib/client/turn-sources.js +2 -1
  98. package/lib/client/turn-sources.js.map +1 -1
  99. package/lib/client/types.js.map +1 -1
  100. package/lib/client/workspace-download.js +42 -2
  101. package/lib/client/workspace-download.js.map +1 -1
  102. package/lib/client.js +3337 -947
  103. package/lib/client.js.map +1 -1
  104. package/lib/enforcement/skill-policy.js +29 -4
  105. package/lib/enforcement/skill-policy.js.map +1 -1
  106. package/lib/enforcement/skill-resource-paths.js +32 -0
  107. package/lib/enforcement/skill-resource-paths.js.map +1 -0
  108. package/lib/enforcement/structured-result.js +38 -0
  109. package/lib/enforcement/structured-result.js.map +1 -0
  110. package/lib/enforcement/tool-grants.js +3 -1
  111. package/lib/enforcement/tool-grants.js.map +1 -1
  112. package/lib/index.js +403 -15
  113. package/lib/index.js.map +1 -1
  114. package/lib/prompt-notes.js +18 -1
  115. package/lib/prompt-notes.js.map +1 -1
  116. package/lib/provenance/collector.js +13 -1
  117. package/lib/provenance/collector.js.map +1 -1
  118. package/lib/provenance/connectors.js +32 -8
  119. package/lib/provenance/connectors.js.map +1 -1
  120. package/lib/provenance/dedupe.js +8 -1
  121. package/lib/provenance/dedupe.js.map +1 -1
  122. package/lib/provenance/document-preview.js +19 -1
  123. package/lib/provenance/document-preview.js.map +1 -1
  124. package/lib/provenance/extractors.js +67 -1
  125. package/lib/provenance/extractors.js.map +1 -1
  126. package/lib/provenance/file-download.js +56 -0
  127. package/lib/provenance/file-download.js.map +1 -0
  128. package/lib/provenance/file-preview.js +12 -1
  129. package/lib/provenance/file-preview.js.map +1 -1
  130. package/lib/provenance/host-store.js +59 -10
  131. package/lib/provenance/host-store.js.map +1 -1
  132. package/lib/provenance/integration-extractor.js +63 -0
  133. package/lib/provenance/integration-extractor.js.map +1 -0
  134. package/lib/qa-tools/docs-tools.js +14 -0
  135. package/lib/qa-tools/docs-tools.js.map +1 -1
  136. package/lib/secure-session.js +37 -5
  137. package/lib/secure-session.js.map +1 -1
  138. package/lib/session-fork-host.js +157 -0
  139. package/lib/session-fork-host.js.map +1 -0
  140. package/lib/session-fork.js +34 -0
  141. package/lib/session-fork.js.map +1 -0
  142. package/lib/session-ownership.js +5 -1
  143. package/lib/session-ownership.js.map +1 -1
  144. package/lib/shared/session-lineage.js +6 -0
  145. package/lib/shared/session-lineage.js.map +1 -0
  146. package/lib/slash/draft-target.js +21 -0
  147. package/lib/slash/draft-target.js.map +1 -0
  148. package/lib/slash/remotes.js +39 -4
  149. package/lib/slash/remotes.js.map +1 -1
  150. package/lib/typert.host.js +1628 -231
  151. package/lib/typert.remote-client.d.ts +48 -1
  152. package/lib/typert.remote-client.js +1436 -193
  153. package/lib/types/access/capability-catalog.d.ts +1 -1
  154. package/lib/types/access/service.d.ts +7 -0
  155. package/lib/types/access.js +2 -0
  156. package/lib/types/access.js.map +1 -0
  157. package/lib/types/accounts/store.d.ts +1 -1
  158. package/lib/types/accounts.js +2 -0
  159. package/lib/types/accounts.js.map +1 -0
  160. package/lib/types/admin/session-log.d.ts +2 -0
  161. package/lib/types/admin.js +2 -0
  162. package/lib/types/admin.js.map +1 -0
  163. package/lib/types/agent-scope.d.ts +4 -0
  164. package/lib/types/capability.js +2 -0
  165. package/lib/types/capability.js.map +1 -0
  166. package/lib/types/chat-sharing/native-fence.d.ts +11 -0
  167. package/lib/types/chat-sharing/resources.d.ts +5 -0
  168. package/lib/types/chat-sharing/store.d.ts +28 -0
  169. package/lib/types/chat-sharing/transport.d.ts +31 -0
  170. package/lib/types/chat-sharing/turn-guard.d.ts +21 -0
  171. package/lib/types/chat-sharing/types.d.ts +25 -0
  172. package/lib/types/chat-sharing/uploads.d.ts +5 -0
  173. package/lib/types/client/QaAccountsController.d.ts +3 -0
  174. package/lib/types/client/QaConfigController.d.ts +3 -2
  175. package/lib/types/client/QaSessionController.d.ts +17 -3
  176. package/lib/types/client/QaSurface.d.ts +6 -1
  177. package/lib/types/client/account-conversation.d.ts +6 -0
  178. package/lib/types/client/account-sessions.d.ts +7 -0
  179. package/lib/types/client/account-upload.d.ts +15 -0
  180. package/lib/types/client/chat-sharing-api.d.ts +35 -0
  181. package/lib/types/client/components/QaChatSharing.d.ts +10 -0
  182. package/lib/types/client/components/QaComposer.d.ts +2 -0
  183. package/lib/types/client/components/QaFileAttachment.d.ts +3 -2
  184. package/lib/types/client/components/QaFilesPanel.d.ts +4 -1
  185. package/lib/types/client/components/QaMessage.d.ts +5 -2
  186. package/lib/types/client/components/QaWorkspaceBrowser.d.ts +8 -1
  187. package/lib/types/client/components/source-refs.d.ts +1 -0
  188. package/lib/types/client/lineage.d.ts +2 -2
  189. package/lib/types/client/notifications/notification-dispatcher.d.ts +10 -6
  190. package/lib/types/client/notifications/use-turn-notifications.d.ts +4 -0
  191. package/lib/types/client/project-session-state.d.ts +1 -0
  192. package/lib/types/client/session-admission.d.ts +2 -0
  193. package/lib/types/client/session-sources.d.ts +1 -0
  194. package/lib/types/client/turn-sources.d.ts +1 -1
  195. package/lib/types/client/types.d.ts +8 -1
  196. package/lib/types/client/workspace-download.d.ts +9 -1
  197. package/lib/types/config.js +2 -0
  198. package/lib/types/config.js.map +1 -0
  199. package/lib/types/documents.js +2 -0
  200. package/lib/types/documents.js.map +1 -0
  201. package/lib/types/enforcement/skill-resource-paths.d.ts +5 -0
  202. package/lib/types/enforcement/structured-result.d.ts +11 -0
  203. package/lib/types/expert-memory.js +2 -0
  204. package/lib/types/expert-memory.js.map +1 -0
  205. package/lib/types/index.d.ts +35 -1
  206. package/lib/types/policy.js +2 -0
  207. package/lib/types/policy.js.map +1 -0
  208. package/lib/types/prompt-notes.d.ts +2 -0
  209. package/lib/types/provenance/connectors.d.ts +4 -1
  210. package/lib/types/provenance/document-preview.d.ts +2 -0
  211. package/lib/types/provenance/extractors.d.ts +2 -0
  212. package/lib/types/provenance/file-download.d.ts +10 -0
  213. package/lib/types/provenance/host-store.d.ts +2 -0
  214. package/lib/types/provenance/integration-extractor.d.ts +5 -0
  215. package/lib/types/provenance/types.d.ts +2 -0
  216. package/lib/types/qa-tools/docs-tools.d.ts +2 -0
  217. package/lib/types/quality.js +7 -0
  218. package/lib/types/quality.js.map +1 -0
  219. package/lib/types/secure-session.d.ts +20 -1
  220. package/lib/types/session-fork-host.d.ts +27 -0
  221. package/lib/types/session-fork.d.ts +7 -0
  222. package/lib/types/session.js +2 -0
  223. package/lib/types/session.js.map +1 -0
  224. package/lib/types/shared/session-lineage.d.ts +7 -0
  225. package/lib/types/skills.js +2 -0
  226. package/lib/types/skills.js.map +1 -0
  227. package/lib/types/slash/draft-target.d.ts +7 -0
  228. package/lib/types/slash/remotes.d.ts +7 -0
  229. package/lib/types/slash.js +2 -0
  230. package/lib/types/slash.js.map +1 -0
  231. package/lib/types/types/access.d.ts +43 -0
  232. package/lib/types/types/accounts.d.ts +173 -0
  233. package/lib/types/types/admin.d.ts +286 -0
  234. package/lib/types/types/capability.d.ts +230 -0
  235. package/lib/types/types/config.d.ts +594 -0
  236. package/lib/types/types/documents.d.ts +34 -0
  237. package/lib/types/types/expert-memory.d.ts +35 -0
  238. package/lib/types/types/policy.d.ts +54 -0
  239. package/lib/types/types/quality.d.ts +100 -0
  240. package/lib/types/types/session.d.ts +382 -0
  241. package/lib/types/types/skills.d.ts +143 -0
  242. package/lib/types/types/slash.d.ts +159 -0
  243. package/lib/types/types.d.ts +13 -2180
  244. package/package.json +8 -7
@@ -0,0 +1,193 @@
1
+ import { SqliteDatabase } from "@yadsh/dsh-plugin-kit/sqlite";
2
+ /** Separate schema: installing sharing does not upgrade the accounts CLI's DB. */
3
+ export class QaChatSharingStore {
4
+ accounts;
5
+ storage;
6
+ constructor(filePath, accounts) {
7
+ this.accounts = accounts;
8
+ this.storage = new SqliteDatabase(filePath, [
9
+ {
10
+ version: 1,
11
+ up: `
12
+ CREATE TABLE grants (session_id TEXT NOT NULL, owner_id TEXT NOT NULL,
13
+ user_id TEXT NOT NULL, mode TEXT NOT NULL CHECK(mode IN ('read','collaborate')),
14
+ revision INTEGER NOT NULL, PRIMARY KEY(session_id,user_id));
15
+ CREATE TABLE authors (session_id TEXT NOT NULL, request_id TEXT NOT NULL,
16
+ user_id TEXT NOT NULL, display_name TEXT NOT NULL, grant_revision INTEGER,
17
+ PRIMARY KEY(session_id,request_id));
18
+ CREATE TABLE revisions (session_id TEXT PRIMARY KEY, revision INTEGER NOT NULL);
19
+ `,
20
+ },
21
+ ]);
22
+ }
23
+ access(token, sessionId) {
24
+ const accounts = this.accounts();
25
+ const actor = accounts.currentUser(token);
26
+ const ownerId = accounts.ownerIdOf(sessionId);
27
+ const owner = ownerId === undefined ? undefined : accounts.accountById(ownerId);
28
+ if (owner === undefined)
29
+ throw new Error("Chat access is unavailable.");
30
+ if (actor.id === owner.id)
31
+ return {
32
+ sessionId,
33
+ ownerId: owner.id,
34
+ ownerName: owner.displayName,
35
+ actorId: actor.id,
36
+ mode: "owner",
37
+ revision: 0,
38
+ };
39
+ const grant = this.storage.db
40
+ .prepare("SELECT mode, revision FROM grants WHERE session_id=? AND owner_id=? AND user_id=?")
41
+ .get(sessionId, owner.id, actor.id);
42
+ if (grant === undefined)
43
+ throw new Error("Chat access is unavailable.");
44
+ return {
45
+ sessionId,
46
+ ownerId: owner.id,
47
+ ownerName: owner.displayName,
48
+ actorId: actor.id,
49
+ mode: grant.mode,
50
+ revision: grant.revision,
51
+ };
52
+ }
53
+ owner(token, sessionId) {
54
+ const access = this.access(token, sessionId);
55
+ if (access.mode !== "owner")
56
+ throw new Error("This action requires the chat owner.");
57
+ return access;
58
+ }
59
+ write(token, sessionId) {
60
+ const access = this.access(token, sessionId);
61
+ if (access.mode === "read")
62
+ throw new Error("This chat is read-only.");
63
+ return access;
64
+ }
65
+ /** Exact address lookup after ownership, never an account directory. */
66
+ set(token, sessionId, email, mode) {
67
+ this.storage.transaction(() => {
68
+ const access = this.owner(token, sessionId);
69
+ if (mode !== null && mode !== "read" && mode !== "collaborate")
70
+ throw new Error("Invalid chat access mode.");
71
+ const user = this.accounts().findUser(email);
72
+ if (user === undefined ||
73
+ (mode !== null && this.accounts().accountById(user.id) === undefined) ||
74
+ user.id === access.ownerId)
75
+ throw new Error("The recipient account is unavailable.");
76
+ this.storage.db
77
+ .prepare(`INSERT INTO revisions VALUES (?,1)
78
+ ON CONFLICT(session_id) DO UPDATE SET revision=revision+1`)
79
+ .run(sessionId);
80
+ const { revision } = this.storage.db
81
+ .prepare("SELECT revision FROM revisions WHERE session_id=?")
82
+ .get(sessionId);
83
+ if (mode === null)
84
+ this.storage.db
85
+ .prepare("DELETE FROM grants WHERE session_id=? AND user_id=?")
86
+ .run(sessionId, user.id);
87
+ else
88
+ this.storage.db
89
+ .prepare(`INSERT INTO grants VALUES (?,?,?,?,?)
90
+ ON CONFLICT(session_id,user_id) DO UPDATE SET owner_id=excluded.owner_id,
91
+ mode=excluded.mode, revision=excluded.revision`)
92
+ .run(sessionId, access.ownerId, user.id, mode, revision);
93
+ });
94
+ return this.grants(token, sessionId);
95
+ }
96
+ grants(token, sessionId) {
97
+ const owner = this.owner(token, sessionId);
98
+ const rows = this.storage.db
99
+ .prepare("SELECT user_id,mode FROM grants WHERE session_id=? AND owner_id=?")
100
+ .all(sessionId, owner.ownerId);
101
+ return rows.flatMap((row) => {
102
+ // Ownership was checked above. Disabled recipients stay in the owner's
103
+ // management list so their durable grants can still be revoked.
104
+ const user = this.accounts().accountById(row.user_id, true);
105
+ return user === undefined
106
+ ? []
107
+ : [
108
+ {
109
+ userId: user.id,
110
+ email: user.email,
111
+ displayName: user.displayName,
112
+ mode: row.mode,
113
+ },
114
+ ];
115
+ });
116
+ }
117
+ visible(token) {
118
+ const actor = this.accounts().currentUser(token);
119
+ const rows = this.storage.db
120
+ .prepare("SELECT session_id FROM grants WHERE user_id=?")
121
+ .all(actor.id);
122
+ const ids = new Set([
123
+ ...this.accounts().ownedSessionIds(token),
124
+ ...rows.map((row) => row.session_id),
125
+ ]);
126
+ return [...ids].flatMap((id) => {
127
+ try {
128
+ return [this.access(token, id)];
129
+ }
130
+ catch {
131
+ return [];
132
+ }
133
+ });
134
+ }
135
+ revalidate(token, previous) {
136
+ const current = this.access(token, previous.sessionId);
137
+ if (current.actorId !== previous.actorId ||
138
+ current.ownerId !== previous.ownerId ||
139
+ current.mode !== previous.mode ||
140
+ current.revision !== previous.revision)
141
+ throw new Error("Chat access changed during the operation.");
142
+ return current;
143
+ }
144
+ recordAuthor(token, access, requestId) {
145
+ this.revalidate(token, access);
146
+ const actor = this.accounts().currentUser(token);
147
+ this.storage.db
148
+ .prepare("INSERT INTO authors VALUES (?,?,?,?,?)")
149
+ .run(access.sessionId, requestId, actor.id, actor.displayName, access.mode === "owner" ? null : access.revision);
150
+ }
151
+ authors(token, sessionId) {
152
+ this.access(token, sessionId);
153
+ return this.storage.db
154
+ .prepare(`SELECT request_id AS requestId, user_id AS userId,
155
+ display_name AS displayName FROM authors WHERE session_id=?`)
156
+ .all(sessionId);
157
+ }
158
+ requestActor(sessionId, requestId) {
159
+ return this.storage.db
160
+ .prepare("SELECT user_id AS userId, grant_revision AS revision FROM authors WHERE session_id=? AND request_id=?")
161
+ .get(sessionId, requestId);
162
+ }
163
+ /** Copy only immutable attribution for the native prefix, never memberships. */
164
+ forkAuthors(sourceId, targetId, requests) {
165
+ this.storage.transaction(() => {
166
+ for (const request of new Set(requests))
167
+ this.storage.db
168
+ .prepare(`INSERT INTO authors
169
+ SELECT ?,request_id,user_id,display_name,NULL FROM authors WHERE session_id=? AND request_id=?`)
170
+ .run(targetId, sourceId, request);
171
+ });
172
+ }
173
+ dropSession(id) {
174
+ this.storage.transaction(() => {
175
+ this.storage.db.prepare("DELETE FROM grants WHERE session_id=?").run(id);
176
+ this.storage.db.prepare("DELETE FROM authors WHERE session_id=?").run(id);
177
+ this.storage.db
178
+ .prepare(`INSERT INTO revisions VALUES (?,1)
179
+ ON CONFLICT(session_id) DO UPDATE SET revision=revision+1`)
180
+ .run(id);
181
+ });
182
+ }
183
+ actorStillAllowed(sessionId, userId, revision) {
184
+ const ownerId = this.accounts().ownerIdOf(sessionId);
185
+ return (this.accounts().accountById(userId) !== undefined &&
186
+ ownerId !== undefined &&
187
+ this.accounts().accountById(ownerId) !== undefined &&
188
+ this.storage.db
189
+ .prepare("SELECT 1 FROM grants WHERE session_id=? AND owner_id=? AND user_id=? AND mode='collaborate' AND revision=?")
190
+ .get(sessionId, ownerId, userId, revision) !== undefined);
191
+ }
192
+ }
193
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/chat-sharing/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,274 @@
1
+ import { SessionId } from "@deepseek-ai/dsh-session/types";
2
+ /** Durable access is checked before and after asynchronous reads and per frame. */
3
+ export class QaChatTransport {
4
+ ctx;
5
+ store;
6
+ admit;
7
+ participantPolicy;
8
+ locks = new Map();
9
+ constructor(ctx, store, admit, participantPolicy) {
10
+ this.ctx = ctx;
11
+ this.store = store;
12
+ this.admit = admit;
13
+ this.participantPolicy = participantPolicy;
14
+ }
15
+ async list(token, signal) {
16
+ this.store().visible(token);
17
+ const value = await this.ctx.sessionController.list({}, signal);
18
+ const allowed = new Set(this.store()
19
+ .visible(token)
20
+ .map((item) => item.sessionId));
21
+ const owned = new Set(this.store()
22
+ .visible(token)
23
+ .filter((item) => item.mode === "owner")
24
+ .map((item) => item.sessionId));
25
+ for (let count = 0; count < value.items.length; count++) {
26
+ let changed = false;
27
+ for (const item of value.items)
28
+ if (item.origin === "subagent" &&
29
+ item.parentSessionId !== undefined &&
30
+ owned.has(String(item.parentSessionId)) &&
31
+ !owned.has(String(item.sessionId))) {
32
+ owned.add(String(item.sessionId));
33
+ allowed.add(String(item.sessionId));
34
+ changed = true;
35
+ }
36
+ if (!changed)
37
+ break;
38
+ }
39
+ return {
40
+ items: value.items.filter((item) => allowed.has(String(item.sessionId))),
41
+ };
42
+ }
43
+ async page(token, request, signal) {
44
+ const access = await this.addressAccess(token, request.address, signal);
45
+ const value = await this.ctx.sessionController.page(request, signal);
46
+ this.store().revalidate(token, access);
47
+ return {
48
+ ...value,
49
+ records: value.records.map((record) => this.signRecord(token, access.sessionId, record)),
50
+ };
51
+ }
52
+ async search(token, request, signal) {
53
+ await this.list(token, signal);
54
+ const value = await this.ctx.sessionController.search(request, signal);
55
+ const allowed = new Set((await this.list(token, signal)).items.map((item) => String(item.sessionId)));
56
+ return {
57
+ items: value.items.filter((item) => allowed.has(String(item.sessionId))),
58
+ hasMore: false,
59
+ };
60
+ }
61
+ async projections(token, id, signal) {
62
+ const access = await this.sessionAccess(token, id, signal);
63
+ const value = await this.ctx.sessionController.projections({ sessionId: SessionId(id) }, signal);
64
+ this.store().revalidate(token, access);
65
+ return value;
66
+ }
67
+ async *follow(token, request, signal) {
68
+ const access = await this.addressAccess(token, request.address, signal);
69
+ const id = access.sessionId;
70
+ const abort = new AbortController();
71
+ const onAbort = () => abort.abort(signal.reason);
72
+ signal.addEventListener("abort", onAbort, { once: true });
73
+ if (signal.aborted)
74
+ onAbort();
75
+ const poll = setInterval(() => {
76
+ try {
77
+ this.store().revalidate(token, access);
78
+ }
79
+ catch (error) {
80
+ abort.abort(error);
81
+ }
82
+ }, 250);
83
+ poll.unref();
84
+ try {
85
+ for await (const frame of this.ctx.sessionController.follow(request, abort.signal)) {
86
+ this.store().revalidate(token, access);
87
+ yield frame.type === "snapshot"
88
+ ? {
89
+ ...frame,
90
+ records: frame.records.map((record) => this.signRecord(token, id, record)),
91
+ }
92
+ : frame.type === "event"
93
+ ? this.signRecord(token, id, frame)
94
+ : frame;
95
+ }
96
+ }
97
+ finally {
98
+ clearInterval(poll);
99
+ signal.removeEventListener("abort", onAbort);
100
+ abort.abort();
101
+ }
102
+ }
103
+ async *control(token, signal) {
104
+ // Polling a bounded catalog also surfaces grants/revocations on idle chats.
105
+ // No native Host-wide baseline or delta is exposed to a QA account.
106
+ while (!signal.aborted) {
107
+ const listing = await this.list(token, signal);
108
+ const projections = {};
109
+ for (const item of listing.items) {
110
+ try {
111
+ const value = await this.projections(token, String(item.sessionId), signal);
112
+ if (value !== null)
113
+ projections[String(item.sessionId)] = value;
114
+ }
115
+ catch {
116
+ /* revoked between reads */
117
+ }
118
+ }
119
+ yield { type: "baseline", value: { projections } };
120
+ await new Promise((resolve) => {
121
+ const done = () => {
122
+ clearTimeout(timer);
123
+ signal.removeEventListener("abort", done);
124
+ resolve();
125
+ };
126
+ const timer = setTimeout(done, 1000);
127
+ timer.unref();
128
+ signal.addEventListener("abort", done, { once: true });
129
+ if (signal.aborted)
130
+ done();
131
+ });
132
+ }
133
+ }
134
+ /** Queue admission is serialized, rechecked after resume, and signed before insertion. */
135
+ async prompt(token, request, signal) {
136
+ return this.serial(String(request.sessionId), async () => {
137
+ const access = this.store().write(token, String(request.sessionId));
138
+ if (access.mode !== "owner" && request.mode !== "queue")
139
+ throw new Error("Only the owner may steer a chat.");
140
+ if (access.mode !== "owner" &&
141
+ request.content.some((part) => part.type === "text" && /^\s*\//u.test(part.text)))
142
+ throw new Error("Only the owner may run chat skills or commands.");
143
+ const prior = this.store().requestActor(access.sessionId, String(request.requestId));
144
+ if (prior !== undefined) {
145
+ if (prior.userId !== access.actorId)
146
+ throw new Error("Prompt identity belongs to another participant.");
147
+ if (prior.revision !== null && prior.revision !== access.revision)
148
+ throw new Error("Prompt access has changed.");
149
+ }
150
+ await this.admit(token, access.sessionId);
151
+ if (access.mode === "collaborate")
152
+ await this.participantPolicy?.(access.actorId, access.sessionId);
153
+ signal.throwIfAborted();
154
+ this.store().revalidate(token, access);
155
+ const session = this.ctx.sessions?.get(SessionId(access.sessionId));
156
+ const historicalRequest = session
157
+ ?.snapshotEvents()
158
+ .some((event) => event.type === "user/message" &&
159
+ "rpcId" in event.data.source &&
160
+ String(event.data.source.rpcId) === String(request.requestId));
161
+ const agent = this.ctx.agents?.get(SessionId(access.sessionId));
162
+ const pendingRequest = [
163
+ ...(agent?.inbox.nextTurn ?? []),
164
+ ...(agent?.inbox.nextStep ?? []),
165
+ ].some((message) => "rpcId" in message.source &&
166
+ String(message.source.rpcId) === String(request.requestId));
167
+ if (prior === undefined && (historicalRequest || pendingRequest)) {
168
+ if (access.mode !== "owner")
169
+ throw new Error("Prompt identity belongs to the original author.");
170
+ return this.ctx.sessionController.prompt(request, signal);
171
+ }
172
+ if (prior === undefined)
173
+ this.store().recordAuthor(token, access, String(request.requestId));
174
+ const value = await this.ctx.sessionController.prompt(request, signal);
175
+ this.store().revalidate(token, access);
176
+ return value;
177
+ });
178
+ }
179
+ async attachment(token, request) {
180
+ const access = await this.sessionAccess(token, String(request.sessionId), new AbortController().signal);
181
+ const value = await this.ctx.sessionController.attachment(request);
182
+ this.store().revalidate(token, access);
183
+ return value;
184
+ }
185
+ async rename(token, request) {
186
+ return this.ownerOperation(token, String(request.sessionId), () => this.ctx.sessionController.rename(request));
187
+ }
188
+ async selectModel(token, request) {
189
+ return this.ownerOperation(token, String(request.sessionId), () => this.ctx.sessionController.selectModel(request));
190
+ }
191
+ async cancel(token, id) {
192
+ return this.ownerOperation(token, id, () => this.ctx.sessionController.cancel({ sessionId: SessionId(id) }));
193
+ }
194
+ async updateQueue(token, request) {
195
+ return this.ownerOperation(token, String(request.sessionId), () => this.ctx.sessionController.updateQueue(request));
196
+ }
197
+ async ownerOperation(token, id, operation) {
198
+ return this.serial(id, async () => {
199
+ const access = this.store().owner(token, id);
200
+ await this.admit(token, id);
201
+ this.store().revalidate(token, access);
202
+ return operation();
203
+ });
204
+ }
205
+ async serial(id, operation) {
206
+ const previous = this.locks.get(id) ?? Promise.resolve();
207
+ const next = previous.catch(() => undefined).then(operation);
208
+ this.locks.set(id, next);
209
+ try {
210
+ return await next;
211
+ }
212
+ finally {
213
+ if (this.locks.get(id) === next)
214
+ this.locks.delete(id);
215
+ }
216
+ }
217
+ async sessionAccess(token, id, signal) {
218
+ try {
219
+ return this.store().access(token, id);
220
+ }
221
+ catch {
222
+ // A delegated child carries no membership of its own. Resolve its
223
+ // authoritative lineage and require the root owner, never a participant.
224
+ this.store().visible(token);
225
+ const listing = await this.ctx.sessionController.list({}, signal);
226
+ const rows = new Map(listing.items.map((item) => [String(item.sessionId), item]));
227
+ const seen = new Set();
228
+ let current = id;
229
+ while (true) {
230
+ if (seen.has(current))
231
+ throw new Error("Chat access is unavailable.");
232
+ seen.add(current);
233
+ const row = rows.get(current);
234
+ if (row?.origin !== "subagent" || row.parentSessionId === undefined)
235
+ break;
236
+ current = String(row.parentSessionId);
237
+ }
238
+ if (current === id)
239
+ throw new Error("Chat access is unavailable.");
240
+ return this.store().owner(token, current);
241
+ }
242
+ }
243
+ async addressAccess(token, address, signal) {
244
+ const access = await this.sessionAccess(token, String(address.kind === "session"
245
+ ? address.sessionId
246
+ : address.parentSessionId), signal);
247
+ if (address.kind === "subagent" && access.mode !== "owner")
248
+ throw new Error("Only the root owner may inspect a delegated session.");
249
+ return access;
250
+ }
251
+ signRecord(token, id, record) {
252
+ if (record.event.type !== "user/message")
253
+ return record;
254
+ const data = record.event.data;
255
+ const source = data.source;
256
+ const author = this.store()
257
+ .authors(token, id)
258
+ .find((item) => item.requestId === source?.rpcId)?.displayName ??
259
+ this.store().access(token, id).ownerName;
260
+ if (source === undefined)
261
+ return record;
262
+ return {
263
+ ...record,
264
+ event: {
265
+ ...record.event,
266
+ data: {
267
+ ...data,
268
+ source: { ...source, qaAuthor: author },
269
+ },
270
+ },
271
+ };
272
+ }
273
+ }
274
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/chat-sharing/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ import { SessionId } from "@deepseek-ai/dsh-session/types";
2
+ /** A mixed batch receives the intersection, never the union, of actor rights. */
3
+ export class QaChatTurnGuard {
4
+ ctx;
5
+ store;
6
+ policy;
7
+ enabled;
8
+ resourceSafe;
9
+ actors = new Map();
10
+ disposers = [];
11
+ constructor(ctx, store, policy, enabled = () => true, resourceSafe = () => false) {
12
+ this.ctx = ctx;
13
+ this.store = store;
14
+ this.policy = policy;
15
+ this.enabled = enabled;
16
+ this.resourceSafe = resourceSafe;
17
+ this.disposers.push(ctx.on("agent/inbox/inserted", ({ agent, message }) => {
18
+ if (!this.enabled())
19
+ return;
20
+ const requestId = message.source.rpcId;
21
+ if (requestId === undefined)
22
+ return;
23
+ const id = String(agent.session.id);
24
+ const actor = this.store().requestActor(id, requestId);
25
+ if (actor?.revision !== undefined &&
26
+ actor.revision !== null &&
27
+ !this.store().actorStillAllowed(id, actor.userId, actor.revision))
28
+ agent.inbox.remove(message.id);
29
+ }, { global: true }));
30
+ this.disposers.push(ctx.on("agent/pre-step", async ({ agent, turn }, next) => {
31
+ if (!this.enabled())
32
+ return next();
33
+ const decision = await next();
34
+ if (decision.kind === "reject")
35
+ return decision;
36
+ const id = String(agent.session.id);
37
+ const participants = this.actors.get(id)?.turn === turn
38
+ ? [...(this.actors.get(id)?.actors ?? [])]
39
+ : [];
40
+ const admitted = [...decision.messages];
41
+ for (const message of decision.messages) {
42
+ const source = message.source;
43
+ if (source.rpcId === undefined)
44
+ continue;
45
+ const actor = this.store().requestActor(id, String(source.rpcId));
46
+ if (actor?.revision === null || actor === undefined)
47
+ continue;
48
+ if (!this.store().actorStillAllowed(id, actor.userId, actor.revision)) {
49
+ admitted.splice(admitted.indexOf(message), 1);
50
+ continue;
51
+ }
52
+ if (participants.some((item) => item.userId === actor.userId &&
53
+ item.revision === actor.revision))
54
+ continue;
55
+ try {
56
+ const ceiling = await this.policy(actor.userId, id);
57
+ participants.push({
58
+ userId: actor.userId,
59
+ revision: actor.revision,
60
+ // Grantable tools require their own activation. Sharing grants none.
61
+ tools: new Set(ceiling.tools),
62
+ });
63
+ }
64
+ catch {
65
+ admitted.splice(admitted.indexOf(message), 1);
66
+ }
67
+ }
68
+ this.actors.set(id, { turn, actors: participants });
69
+ if (decision.messages.length > 0 && admitted.length === 0)
70
+ return { kind: "reject" };
71
+ if (participants.some((actor) => !this.store().actorStillAllowed(id, actor.userId, actor.revision)))
72
+ return { kind: "reject" };
73
+ return { ...decision, messages: admitted };
74
+ }, { global: true }));
75
+ this.disposers.push(ctx.tools.guard((execution) => {
76
+ if (execution.agent === undefined)
77
+ return undefined;
78
+ const actors = this.participants(execution.agent);
79
+ for (const actor of actors) {
80
+ const root = this.root(execution.agent);
81
+ if (!this.store().actorStillAllowed(root, actor.userId, actor.revision))
82
+ return "Shared chat access was revoked.";
83
+ if (!actor.tools.has(execution.name))
84
+ return "This tool is outside the participant's own permissions.";
85
+ // Personal filesystem, credentials and skill/command activation cannot
86
+ // be delegated just by typing a message into someone else's chat.
87
+ if (/^(?:read|write|edit|glob|grep|ls|bash|shell|exec|str_replace_editor|skill|skills_|command|delegate|subagent|agent_|document_|qa_file_delete)/u.test(execution.name))
88
+ return "Shared participation does not grant the owner's filesystem or agent capabilities.";
89
+ // A tool name's permission ceiling cannot confine an arbitrary plugin
90
+ // body to published files. Unknown implementations fail closed until
91
+ // an independently audited stateless/resource-scoped adapter exists.
92
+ if (!this.resourceSafe(execution.name))
93
+ return "This tool has no shared-chat resource boundary.";
94
+ }
95
+ return undefined;
96
+ }));
97
+ this.disposers.push(ctx.on("agent/request", async ({ agent }, next) => {
98
+ for (const actor of this.participants(agent)) {
99
+ if (!this.store().actorStillAllowed(this.root(agent), actor.userId, actor.revision))
100
+ throw new Error("Shared chat access was revoked.");
101
+ }
102
+ return next();
103
+ }, { global: true }));
104
+ this.disposers.push(ctx.on("agent/disposed", ({ agent }) => this.actors.delete(String(agent.session.id)), { global: true }));
105
+ }
106
+ root(agent) {
107
+ let session = agent.session;
108
+ const seen = new Set();
109
+ while (session.header.origin === "subagent" &&
110
+ session.header.parentSession !== undefined) {
111
+ const id = String(session.id);
112
+ if (seen.has(id))
113
+ break;
114
+ seen.add(id);
115
+ const parent = this.ctx.sessions.get(session.header.parentSession);
116
+ if (parent === undefined)
117
+ break;
118
+ session = parent;
119
+ }
120
+ return String(session.id);
121
+ }
122
+ participants(agent) {
123
+ return this.actors.get(this.root(agent))?.actors ?? [];
124
+ }
125
+ collaborative(sessionId) {
126
+ return (this.actors.get(sessionId)?.actors.length ?? 0) > 0;
127
+ }
128
+ /** Called after permission mutation. Only a turn carrying stale input stops. */
129
+ revoke(sessionId) {
130
+ const agent = this.ctx.agents.get(SessionId(sessionId));
131
+ for (const message of [
132
+ ...(agent?.inbox.nextTurn ?? []),
133
+ ...(agent?.inbox.nextStep ?? []),
134
+ ]) {
135
+ const requestId = message.source.rpcId;
136
+ const actor = requestId === undefined
137
+ ? undefined
138
+ : this.store().requestActor(sessionId, requestId);
139
+ if (actor !== undefined &&
140
+ actor.revision !== null &&
141
+ !this.store().actorStillAllowed(sessionId, actor.userId, actor.revision))
142
+ agent?.inbox.remove(message.id);
143
+ }
144
+ const current = this.actors.get(sessionId);
145
+ if (current?.actors.some((actor) => !this.store().actorStillAllowed(sessionId, actor.userId, actor.revision)))
146
+ this.ctx.sessionController.cancel({ sessionId: SessionId(sessionId) });
147
+ }
148
+ dispose() {
149
+ for (const dispose of this.disposers.splice(0).reverse())
150
+ dispose();
151
+ this.actors.clear();
152
+ }
153
+ }
154
+ //# sourceMappingURL=turn-guard.js.map