@yadsh/dsh-qa-surface 0.7.4 → 0.9.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 (247) hide show
  1. package/README.md +169 -12
  2. package/compatibility.json +5 -0
  3. package/lib/access/capability-catalog.js +32 -3
  4. package/lib/access/capability-catalog.js.map +1 -1
  5. package/lib/access/model.js +24 -4
  6. package/lib/access/model.js.map +1 -1
  7. package/lib/access/role-repository.js +199 -91
  8. package/lib/access/role-repository.js.map +1 -1
  9. package/lib/access/service.js +223 -7
  10. package/lib/access/service.js.map +1 -1
  11. package/lib/account-remotes.js +2 -4
  12. package/lib/account-remotes.js.map +1 -1
  13. package/lib/accounts/database.js +447 -0
  14. package/lib/accounts/database.js.map +1 -0
  15. package/lib/accounts/errors.js.map +1 -1
  16. package/lib/accounts/file.js +27 -90
  17. package/lib/accounts/file.js.map +1 -1
  18. package/lib/accounts/store.js +224 -59
  19. package/lib/accounts/store.js.map +1 -1
  20. package/lib/admin/permissions.js +4 -0
  21. package/lib/admin/permissions.js.map +1 -1
  22. package/lib/admin/quality-store.js +270 -54
  23. package/lib/admin/quality-store.js.map +1 -1
  24. package/lib/admin/service.js +145 -7
  25. package/lib/admin/service.js.map +1 -1
  26. package/lib/admin/session-log.js +66 -5
  27. package/lib/admin/session-log.js.map +1 -1
  28. package/lib/cli.js +2 -1
  29. package/lib/cli.js.map +1 -1
  30. package/lib/client/QaSessionController.js +379 -39
  31. package/lib/client/QaSessionController.js.map +1 -1
  32. package/lib/client/QaSurface.js +94 -34
  33. package/lib/client/QaSurface.js.map +1 -1
  34. package/lib/client/QaTranscriptAdapter.js +40 -0
  35. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  36. package/lib/client/admin/QaAdmin.js +26 -8
  37. package/lib/client/admin/QaAdmin.js.map +1 -1
  38. package/lib/client/admin/{format.js → copy.js} +1 -1
  39. package/lib/client/admin/copy.js.map +1 -0
  40. package/lib/client/admin/pages/Conversations.js +34 -8
  41. package/lib/client/admin/pages/Conversations.js.map +1 -1
  42. package/lib/client/admin/pages/Overview.js +1 -1
  43. package/lib/client/admin/pages/Overview.js.map +1 -1
  44. package/lib/client/admin/pages/Quality.js +1 -1
  45. package/lib/client/admin/pages/Quality.js.map +1 -1
  46. package/lib/client/admin/pages/Review.js +1 -1
  47. package/lib/client/admin/pages/Review.js.map +1 -1
  48. package/lib/client/admin/pages/Users.js +6 -2
  49. package/lib/client/admin/pages/Users.js.map +1 -1
  50. package/lib/client/admin/shared.js +10 -1
  51. package/lib/client/admin/shared.js.map +1 -1
  52. package/lib/client/admin/styles.js +2 -0
  53. package/lib/client/admin/styles.js.map +1 -1
  54. package/lib/client/audit/QaAuditDialog.js +74 -0
  55. package/lib/client/audit/QaAuditDialog.js.map +1 -0
  56. package/lib/client/audit/QaAuditRowBadge.js +17 -0
  57. package/lib/client/audit/QaAuditRowBadge.js.map +1 -0
  58. package/lib/client/audit/controller.js +39 -0
  59. package/lib/client/audit/controller.js.map +1 -0
  60. package/lib/client/audit/types.js +36 -0
  61. package/lib/client/audit/types.js.map +1 -0
  62. package/lib/client/audit/use-chat-audits.js +139 -0
  63. package/lib/client/audit/use-chat-audits.js.map +1 -0
  64. package/lib/client/components/Markdown.js +14 -206
  65. package/lib/client/components/Markdown.js.map +1 -1
  66. package/lib/client/components/QaChangelog.js +91 -0
  67. package/lib/client/components/QaChangelog.js.map +1 -1
  68. package/lib/client/components/QaComposer.js +63 -3
  69. package/lib/client/components/QaComposer.js.map +1 -1
  70. package/lib/client/components/QaHeader.js +1 -3
  71. package/lib/client/components/QaHeader.js.map +1 -1
  72. package/lib/client/components/QaMessage.js +25 -4
  73. package/lib/client/components/QaMessage.js.map +1 -1
  74. package/lib/client/components/QaQuestions.js +1 -1
  75. package/lib/client/components/QaQuestions.js.map +1 -1
  76. package/lib/client/components/QaSidebar.js +17 -3
  77. package/lib/client/components/QaSidebar.js.map +1 -1
  78. package/lib/client/components/QaSourcesPanel.js +3 -18
  79. package/lib/client/components/QaSourcesPanel.js.map +1 -1
  80. package/lib/client/components/QaWorkGroup.js +4 -8
  81. package/lib/client/components/QaWorkGroup.js.map +1 -1
  82. package/lib/client/components/source-icon.js +26 -0
  83. package/lib/client/components/source-icon.js.map +1 -0
  84. package/lib/client/components/thinking-phrases.js +2 -11
  85. package/lib/client/components/thinking-phrases.js.map +1 -1
  86. package/lib/client/components/use-now.js +21 -0
  87. package/lib/client/components/use-now.js.map +1 -0
  88. package/lib/client/index.js +33 -5
  89. package/lib/client/index.js.map +1 -1
  90. package/lib/client/lineage.js +18 -0
  91. package/lib/client/lineage.js.map +1 -0
  92. package/lib/client/markdown/CodeBlock.js +28 -0
  93. package/lib/client/markdown/CodeBlock.js.map +1 -0
  94. package/lib/client/markdown/blocks.js +342 -0
  95. package/lib/client/markdown/blocks.js.map +1 -0
  96. package/lib/client/markdown/highlight.js +1089 -0
  97. package/lib/client/markdown/highlight.js.map +1 -0
  98. package/lib/client/markdown/inline.js +377 -0
  99. package/lib/client/markdown/inline.js.map +1 -0
  100. package/lib/client/markdown/render.js +147 -0
  101. package/lib/client/markdown/render.js.map +1 -0
  102. package/lib/client/markdown/source-chip.js +55 -0
  103. package/lib/client/markdown/source-chip.js.map +1 -0
  104. package/lib/client/markdown/use-transient-flag.js +27 -0
  105. package/lib/client/markdown/use-transient-flag.js.map +1 -0
  106. package/lib/client/project-session-state.js +15 -2
  107. package/lib/client/project-session-state.js.map +1 -1
  108. package/lib/client/prompt-content.js +26 -0
  109. package/lib/client/prompt-content.js.map +1 -1
  110. package/lib/client/role/RoleSelector.js +11 -2
  111. package/lib/client/role/RoleSelector.js.map +1 -1
  112. package/lib/client/role/preview.js +123 -0
  113. package/lib/client/role/preview.js.map +1 -0
  114. package/lib/client/settings/card.js +2 -2
  115. package/lib/client/settings/card.js.map +1 -1
  116. package/lib/client/settings/sections/lockdown.js +1 -6
  117. package/lib/client/settings/sections/lockdown.js.map +1 -1
  118. package/lib/client/settings/sections/slash.js +57 -0
  119. package/lib/client/settings/sections/slash.js.map +1 -0
  120. package/lib/client/settings/sections/status.js +9 -1
  121. package/lib/client/settings/sections/status.js.map +1 -1
  122. package/lib/client/settings/sections.js +1 -0
  123. package/lib/client/settings/sections.js.map +1 -1
  124. package/lib/client/slash/SlashPalette.js +48 -0
  125. package/lib/client/slash/SlashPalette.js.map +1 -0
  126. package/lib/client/slash/copy.js +54 -0
  127. package/lib/client/slash/copy.js.map +1 -0
  128. package/lib/client/slash/slash-router.js +49 -0
  129. package/lib/client/slash/slash-router.js.map +1 -0
  130. package/lib/client/slash/useSlashNavigation.js +95 -0
  131. package/lib/client/slash/useSlashNavigation.js.map +1 -0
  132. package/lib/client/styles.js +124 -20
  133. package/lib/client/styles.js.map +1 -1
  134. package/lib/client/types.js +11 -0
  135. package/lib/client/types.js.map +1 -1
  136. package/lib/client.js +7615 -1567
  137. package/lib/client.js.map +1 -1
  138. package/lib/config-resolvers/accounts.js +15 -0
  139. package/lib/config-resolvers/accounts.js.map +1 -1
  140. package/lib/config-resolvers/basics.js +11 -2
  141. package/lib/config-resolvers/basics.js.map +1 -1
  142. package/lib/config-resolvers/defaults.js +30 -0
  143. package/lib/config-resolvers/defaults.js.map +1 -1
  144. package/lib/config-resolvers/lockdown.js +8 -2
  145. package/lib/config-resolvers/lockdown.js.map +1 -1
  146. package/lib/config-resolvers/slash-commands.js +60 -0
  147. package/lib/config-resolvers/slash-commands.js.map +1 -0
  148. package/lib/config-resolvers/sources.js +16 -0
  149. package/lib/config-resolvers/sources.js.map +1 -1
  150. package/lib/config.js +118 -2
  151. package/lib/config.js.map +1 -1
  152. package/lib/index.js +183 -11
  153. package/lib/index.js.map +1 -1
  154. package/lib/lockdown-policy.js +19 -0
  155. package/lib/lockdown-policy.js.map +1 -1
  156. package/lib/personal-skills/service.js +16 -3
  157. package/lib/personal-skills/service.js.map +1 -1
  158. package/lib/provenance/host-store.js +25 -4
  159. package/lib/provenance/host-store.js.map +1 -1
  160. package/lib/provenance/retention.js +25 -0
  161. package/lib/provenance/retention.js.map +1 -0
  162. package/lib/provenance/snapshot-store.js +290 -35
  163. package/lib/provenance/snapshot-store.js.map +1 -1
  164. package/lib/questions.js +98 -38
  165. package/lib/questions.js.map +1 -1
  166. package/lib/resolve-config.js +5 -0
  167. package/lib/resolve-config.js.map +1 -1
  168. package/lib/secure-session.js +139 -21
  169. package/lib/secure-session.js.map +1 -1
  170. package/lib/slash/catalog.js +77 -0
  171. package/lib/slash/catalog.js.map +1 -0
  172. package/lib/slash/matcher.js +100 -0
  173. package/lib/slash/matcher.js.map +1 -0
  174. package/lib/slash/parser.js +79 -0
  175. package/lib/slash/parser.js.map +1 -0
  176. package/lib/slash/policy.js +72 -0
  177. package/lib/slash/policy.js.map +1 -0
  178. package/lib/slash/remotes.js +272 -0
  179. package/lib/slash/remotes.js.map +1 -0
  180. package/lib/typert.host.js +348 -56
  181. package/lib/typert.remote-client.d.ts +7 -1
  182. package/lib/typert.remote-client.js +274 -51
  183. package/lib/types/access/capability-catalog.d.ts +28 -1
  184. package/lib/types/access/role-repository.d.ts +38 -7
  185. package/lib/types/access/service.d.ts +106 -3
  186. package/lib/types/account-remotes.d.ts +8 -4
  187. package/lib/types/accounts/database.d.ts +84 -0
  188. package/lib/types/accounts/errors.d.ts +7 -1
  189. package/lib/types/accounts/file.d.ts +17 -39
  190. package/lib/types/accounts/store.d.ts +110 -19
  191. package/lib/types/admin/quality-store.d.ts +38 -2
  192. package/lib/types/admin/service.d.ts +34 -2
  193. package/lib/types/admin/session-log.d.ts +65 -1
  194. package/lib/types/client/QaSessionController.d.ts +84 -2
  195. package/lib/types/client/QaSurface.d.ts +14 -1
  196. package/lib/types/client/admin/{format.d.ts → copy.d.ts} +1 -1
  197. package/lib/types/client/admin/pages/Conversations.d.ts +4 -0
  198. package/lib/types/client/audit/QaAuditDialog.d.ts +21 -0
  199. package/lib/types/client/audit/QaAuditRowBadge.d.ts +18 -0
  200. package/lib/types/client/audit/controller.d.ts +27 -0
  201. package/lib/types/client/audit/types.d.ts +72 -0
  202. package/lib/types/client/audit/use-chat-audits.d.ts +20 -0
  203. package/lib/types/client/components/Markdown.d.ts +7 -8
  204. package/lib/types/client/components/QaComposer.d.ts +12 -2
  205. package/lib/types/client/components/QaQuestions.d.ts +7 -0
  206. package/lib/types/client/components/QaSidebar.d.ts +11 -1
  207. package/lib/types/client/components/QaSourcesPanel.d.ts +1 -3
  208. package/lib/types/client/components/source-icon.d.ts +12 -0
  209. package/lib/types/client/components/use-now.d.ts +8 -0
  210. package/lib/types/client/lineage.d.ts +15 -0
  211. package/lib/types/client/markdown/CodeBlock.d.ts +14 -0
  212. package/lib/types/client/markdown/blocks.d.ts +74 -0
  213. package/lib/types/client/markdown/highlight.d.ts +29 -0
  214. package/lib/types/client/markdown/inline.d.ts +40 -0
  215. package/lib/types/client/markdown/render.d.ts +13 -0
  216. package/lib/types/client/markdown/source-chip.d.ts +32 -0
  217. package/lib/types/client/markdown/use-transient-flag.d.ts +12 -0
  218. package/lib/types/client/project-session-state.d.ts +3 -1
  219. package/lib/types/client/prompt-content.d.ts +9 -1
  220. package/lib/types/client/role/RoleSelector.d.ts +11 -1
  221. package/lib/types/client/role/preview.d.ts +109 -0
  222. package/lib/types/client/settings/sections/slash.d.ts +16 -0
  223. package/lib/types/client/settings/sections.d.ts +1 -0
  224. package/lib/types/client/slash/SlashPalette.d.ts +24 -0
  225. package/lib/types/client/slash/copy.d.ts +30 -0
  226. package/lib/types/client/slash/slash-router.d.ts +67 -0
  227. package/lib/types/client/slash/useSlashNavigation.d.ts +47 -0
  228. package/lib/types/client/styles.d.ts +9 -0
  229. package/lib/types/client/types.d.ts +16 -1
  230. package/lib/types/config-resolvers/slash-commands.d.ts +20 -0
  231. package/lib/types/index.d.ts +83 -2
  232. package/lib/types/lockdown-policy.d.ts +16 -0
  233. package/lib/types/personal-skills/service.d.ts +5 -0
  234. package/lib/types/provenance/host-store.d.ts +20 -3
  235. package/lib/types/provenance/retention.d.ts +46 -0
  236. package/lib/types/provenance/snapshot-store.d.ts +63 -7
  237. package/lib/types/questions.d.ts +13 -0
  238. package/lib/types/secure-session.d.ts +27 -1
  239. package/lib/types/slash/catalog.d.ts +56 -0
  240. package/lib/types/slash/matcher.d.ts +51 -0
  241. package/lib/types/slash/parser.d.ts +46 -0
  242. package/lib/types/slash/policy.d.ts +40 -0
  243. package/lib/types/slash/remotes.d.ts +35 -0
  244. package/lib/types/types.d.ts +254 -5
  245. package/package.json +9 -5
  246. package/scripts/attach-workspace-sessions.mjs +472 -0
  247. package/lib/client/admin/format.js.map +0 -1
@@ -0,0 +1,272 @@
1
+ import { SessionId } from "@deepseek-ai/dsh-session/types";
2
+ import { isUserInvocable } from "@deepseek-ai/dsh-skill";
3
+ import { buildSlashCatalog, } from "./catalog.js";
4
+ import { parseSlashLine } from "./parser.js";
5
+ import { allowsSlashName } from "./policy.js";
6
+ /**
7
+ * The reads below are bounded by the Remote transport and by the caller's own
8
+ * patience; an internal deadline would only cut off a slow filesystem scan.
9
+ */
10
+ const NO_CANCELLATION = new AbortController().signal;
11
+ const REFUSAL_COPY = Object.freeze({
12
+ "slash-disabled": "Slash actions are disabled on this deployment.",
13
+ "unknown-command": "No such command.",
14
+ "not-allowed": "This command is not allowed on this deployment.",
15
+ "attachments-unsupported": "This command does not accept attachments.",
16
+ "inactive-session": "The command surface needs a live chat.",
17
+ });
18
+ function refusal(reason, detail) {
19
+ return Object.freeze({
20
+ kind: "refused",
21
+ reason,
22
+ message: detail ?? REFUSAL_COPY[reason],
23
+ });
24
+ }
25
+ function policyOf(mode, allow) {
26
+ return { mode, allow };
27
+ }
28
+ /**
29
+ * User-invocable skills of this chat that no row of the palette represents.
30
+ * The list exists so the browser can say "this `/name` will not load" about a
31
+ * gesture typed inside a sentence, which it can only do if it can tell a real
32
+ * but withheld skill from a path that merely looks like one.
33
+ */
34
+ function withheldSkills(skills, entries) {
35
+ if (skills === undefined)
36
+ return Object.freeze([]);
37
+ const shown = new Set(entries
38
+ .filter((entry) => entry.kind === "skill")
39
+ .map((entry) => entry.name));
40
+ return Object.freeze(skills.map((skill) => skill.name).filter((name) => !shown.has(name)));
41
+ }
42
+ export function createQaSlashRemotes(options) {
43
+ const { ctx, getConfig, logger, sessionGrant } = options;
44
+ let skillCatalog;
45
+ let nativeCommands;
46
+ // Both surfaces are optional capabilities. The session-addressed catalog is
47
+ // preferred because it answers for a cold chat too; the registry below is
48
+ // the fallback for a composition that has skills but no session controller.
49
+ ctx.inject(["sessionSkillCatalog"], (catalogCtx) => {
50
+ skillCatalog =
51
+ catalogCtx.sessionSkillCatalog;
52
+ catalogCtx.effect(() => () => {
53
+ skillCatalog = undefined;
54
+ }, "dsh-qa-surface.slash-skill-catalog");
55
+ });
56
+ ctx.inject(["commands"], (commandsCtx) => {
57
+ nativeCommands = commandsCtx
58
+ .commands;
59
+ commandsCtx.effect(() => () => {
60
+ nativeCommands = undefined;
61
+ }, "dsh-qa-surface.slash-commands");
62
+ });
63
+ function agentOf(sessionId) {
64
+ return ctx.agents.get(SessionId(sessionId));
65
+ }
66
+ /** User-invocable skills of the session; `undefined` when unreadable. */
67
+ async function readSkills(sessionId, agent) {
68
+ if (skillCatalog !== undefined) {
69
+ try {
70
+ const value = await skillCatalog.list({ sessionId: SessionId(sessionId) }, NO_CANCELLATION);
71
+ return value.skills.map((skill) => ({
72
+ name: skill.name,
73
+ description: skill.description,
74
+ modelInvocable: skill.modelInvocable,
75
+ ...(skill.whenToUse === undefined
76
+ ? {}
77
+ : { whenToUse: skill.whenToUse }),
78
+ }));
79
+ }
80
+ catch (error) {
81
+ logger.warn("slash.catalog.skills-failed", {
82
+ sessionId,
83
+ message: error instanceof Error ? error.message : String(error),
84
+ });
85
+ return undefined;
86
+ }
87
+ }
88
+ if (agent === undefined)
89
+ return undefined;
90
+ try {
91
+ // Same view the session-addressed catalog builds: the agent is the
92
+ // scope, and its cwd decides which project layer contributes.
93
+ const live = agent;
94
+ const cwd = live.session.header.cwd;
95
+ const listed = await live.ctx.skills.list({
96
+ scope: agent,
97
+ ...(cwd === undefined ? {} : { cwd }),
98
+ });
99
+ return listed.filter(isUserInvocable).map((skill) => ({
100
+ name: skill.name,
101
+ description: skill.description,
102
+ modelInvocable: skill.invocation.modelInvocable,
103
+ ...(skill.whenToUse === undefined
104
+ ? {}
105
+ : { whenToUse: skill.whenToUse }),
106
+ }));
107
+ }
108
+ catch (error) {
109
+ logger.warn("slash.catalog.skills-failed", {
110
+ sessionId,
111
+ message: error instanceof Error ? error.message : String(error),
112
+ });
113
+ return undefined;
114
+ }
115
+ }
116
+ function readCommands(agent) {
117
+ if (nativeCommands === undefined || agent === undefined)
118
+ return undefined;
119
+ try {
120
+ return nativeCommands.list(agent).map((command) => ({
121
+ name: command.name,
122
+ description: command.description,
123
+ ...(command.input === undefined
124
+ ? {}
125
+ : { inputHint: command.input.hint }),
126
+ ...(command.input?.attachments === undefined
127
+ ? {}
128
+ : { acceptsAttachments: command.input.attachments }),
129
+ }));
130
+ }
131
+ catch (error) {
132
+ logger.warn("slash.catalog.commands-failed", {
133
+ message: error instanceof Error ? error.message : String(error),
134
+ });
135
+ return undefined;
136
+ }
137
+ }
138
+ function commandSurfaceOf(agent, commands) {
139
+ if (nativeCommands === undefined)
140
+ return "unavailable";
141
+ if (agent === undefined)
142
+ return "inactive";
143
+ return commands === undefined ? "unavailable" : "ready";
144
+ }
145
+ return {
146
+ async catalog(token, sessionId) {
147
+ const config = getConfig();
148
+ if (!config.slashCommands.enabled) {
149
+ return Object.freeze({
150
+ enabled: false,
151
+ entries: Object.freeze([]),
152
+ commandSurface: "unavailable",
153
+ deniedSkills: Object.freeze([]),
154
+ });
155
+ }
156
+ const agent = agentOf(sessionId);
157
+ // Ownership is checked before anything is read: the catalog names the
158
+ // session's skills and its operator's commands, which is exactly the
159
+ // kind of fact a foreign browser must not be able to enumerate.
160
+ const granted = await sessionGrant(token, sessionId, agent);
161
+ const [skills, commands] = [
162
+ await readSkills(sessionId, agent),
163
+ readCommands(agent),
164
+ ];
165
+ const commandSurface = commandSurfaceOf(agent, commands);
166
+ const entries = buildSlashCatalog({
167
+ skills: skills ?? [],
168
+ commands: commands ?? [],
169
+ skillPolicy: policyOf(config.slashCommands.skills.mode, config.slashCommands.skills.allow),
170
+ commandPolicy: policyOf(config.slashCommands.commands.mode, config.slashCommands.commands.allow),
171
+ grantedSkills: granted,
172
+ commandSurface,
173
+ });
174
+ const deniedSkills = withheldSkills(skills, entries);
175
+ logger.info("slash.catalog.load", {
176
+ sessionId,
177
+ skills: skills?.length ?? 0,
178
+ commands: commands?.length ?? 0,
179
+ entries: entries.length,
180
+ commandSurface,
181
+ });
182
+ return Object.freeze({
183
+ enabled: true,
184
+ entries,
185
+ commandSurface,
186
+ deniedSkills,
187
+ });
188
+ },
189
+ async execute(token, sessionId, line, attachments) {
190
+ const config = getConfig();
191
+ if (!config.slashCommands.enabled)
192
+ return refusal("slash-disabled");
193
+ const parsed = parseSlashLine(line);
194
+ if (parsed === undefined)
195
+ return refusal("unknown-command");
196
+ const name = parsed.name;
197
+ // Admission re-derives everything from the line. The browser's catalog is
198
+ // a presentation cache and never an authorization: a name the policy does
199
+ // not admit is refused here even though the palette never showed it.
200
+ if (!allowsSlashName(policyOf(config.slashCommands.commands.mode, config.slashCommands.commands.allow), name)) {
201
+ logger.warn("slash.denied", { sessionId, kind: "command", name });
202
+ return refusal("not-allowed");
203
+ }
204
+ // Ownership before execution, exactly as the catalog read does: a
205
+ // command mutates the chat it runs in, so a foreign browser must not be
206
+ // able to reach the native runtime through this surface at all.
207
+ const agent = agentOf(sessionId);
208
+ await sessionGrant(token, sessionId, agent);
209
+ if (nativeCommands === undefined || agent === undefined) {
210
+ return refusal("inactive-session");
211
+ }
212
+ const descriptor = nativeCommands
213
+ .list(agent)
214
+ .find((command) => command.name === name);
215
+ if (descriptor === undefined) {
216
+ logger.warn("slash.unknown", { sessionId, kind: "command", name });
217
+ return refusal("unknown-command");
218
+ }
219
+ if (attachments.length > 0 && descriptor.input?.attachments !== true) {
220
+ // Refused before the handler ran, so the composer keeps its draft and
221
+ // its attachments; the native runtime re-checks this as the authority.
222
+ return refusal("attachments-unsupported");
223
+ }
224
+ logger.info("slash.command.execute", {
225
+ sessionId,
226
+ name,
227
+ attachments: attachments.length,
228
+ });
229
+ let execution;
230
+ try {
231
+ execution = await nativeCommands.execute(agent, line, attachments, NO_CANCELLATION);
232
+ }
233
+ catch (error) {
234
+ // The handler threw: the runtime already wrote command/done with the
235
+ // failure into the session log, so the transcript row carries the
236
+ // outcome and this only tells the caller the submission was consumed.
237
+ const message = error instanceof Error ? error.message : String(error);
238
+ logger.warn("slash.command.error", { sessionId, name, message });
239
+ const failed = { kind: "error", text: message };
240
+ return Object.freeze({
241
+ kind: "executed",
242
+ commandId: "",
243
+ outcome: Object.freeze(failed),
244
+ });
245
+ }
246
+ if (execution === undefined) {
247
+ logger.warn("slash.unknown", { sessionId, kind: "command", name });
248
+ return refusal("unknown-command");
249
+ }
250
+ const outcome = execution.result.kind === "success"
251
+ ? {
252
+ kind: "success",
253
+ ...(execution.result.text === undefined
254
+ ? {}
255
+ : { text: execution.result.text }),
256
+ ...(execution.result.sourceEventSeq === undefined
257
+ ? {}
258
+ : { sourceEventSeq: execution.result.sourceEventSeq }),
259
+ }
260
+ : { kind: "error", text: execution.result.text };
261
+ logger.info(outcome.kind === "success"
262
+ ? "slash.command.success"
263
+ : "slash.command.error", { sessionId, name, commandId: execution.commandId });
264
+ return Object.freeze({
265
+ kind: "executed",
266
+ commandId: execution.commandId,
267
+ outcome: Object.freeze(outcome),
268
+ });
269
+ },
270
+ };
271
+ }
272
+ //# sourceMappingURL=remotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remotes.js","sourceRoot":"","sources":["../../src/slash/remotes.ts"],"names":[],"mappings":"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"}