dsh-auto-review 0.4.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 (84) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +201 -0
  3. package/README.es.md +226 -0
  4. package/README.hi.md +226 -0
  5. package/README.md +226 -0
  6. package/README.pt.md +226 -0
  7. package/README.zh.md +226 -0
  8. package/cordis.patch.yml +27 -0
  9. package/lib/client.js +494 -0
  10. package/lib/client.js.map +1 -0
  11. package/lib/events-CFl6CHZi.js +344 -0
  12. package/lib/index.js +5305 -0
  13. package/lib/invariant.js +223 -0
  14. package/lib/types/client/ReviewPanel.d.ts +29 -0
  15. package/lib/types/client/ReviewPanel.d.ts.map +1 -0
  16. package/lib/types/client/ReviewPanel.js +63 -0
  17. package/lib/types/client/ReviewPanel.js.map +1 -0
  18. package/lib/types/client/index.d.ts +31 -0
  19. package/lib/types/client/index.d.ts.map +1 -0
  20. package/lib/types/client/index.js +51 -0
  21. package/lib/types/client/index.js.map +1 -0
  22. package/lib/types/client/locales.d.ts +49 -0
  23. package/lib/types/client/locales.d.ts.map +1 -0
  24. package/lib/types/client/locales.js +82 -0
  25. package/lib/types/client/locales.js.map +1 -0
  26. package/lib/types/client/present.d.ts +25 -0
  27. package/lib/types/client/present.d.ts.map +1 -0
  28. package/lib/types/client/present.js +36 -0
  29. package/lib/types/client/present.js.map +1 -0
  30. package/lib/types/client/styles.d.ts +9 -0
  31. package/lib/types/client/styles.d.ts.map +1 -0
  32. package/lib/types/client/styles.js +130 -0
  33. package/lib/types/client/styles.js.map +1 -0
  34. package/lib/types/config.d.ts +200 -0
  35. package/lib/types/config.d.ts.map +1 -0
  36. package/lib/types/config.js +154 -0
  37. package/lib/types/config.js.map +1 -0
  38. package/lib/types/events.d.ts +347 -0
  39. package/lib/types/events.d.ts.map +1 -0
  40. package/lib/types/events.js +369 -0
  41. package/lib/types/events.js.map +1 -0
  42. package/lib/types/index.d.ts +26 -0
  43. package/lib/types/index.d.ts.map +1 -0
  44. package/lib/types/index.js +26 -0
  45. package/lib/types/index.js.map +1 -0
  46. package/lib/types/invariant.d.ts +28 -0
  47. package/lib/types/invariant.d.ts.map +1 -0
  48. package/lib/types/invariant.js +306 -0
  49. package/lib/types/invariant.js.map +1 -0
  50. package/lib/types/messages.d.ts +38 -0
  51. package/lib/types/messages.d.ts.map +1 -0
  52. package/lib/types/messages.js +65 -0
  53. package/lib/types/messages.js.map +1 -0
  54. package/lib/types/projection-types.d.ts +61 -0
  55. package/lib/types/projection-types.d.ts.map +1 -0
  56. package/lib/types/projection-types.js +8 -0
  57. package/lib/types/projection-types.js.map +1 -0
  58. package/lib/types/projection.d.ts +93 -0
  59. package/lib/types/projection.d.ts.map +1 -0
  60. package/lib/types/projection.js +197 -0
  61. package/lib/types/projection.js.map +1 -0
  62. package/lib/types/review.d.ts +141 -0
  63. package/lib/types/review.d.ts.map +1 -0
  64. package/lib/types/review.js +389 -0
  65. package/lib/types/review.js.map +1 -0
  66. package/lib/types/runtime.d.ts +160 -0
  67. package/lib/types/runtime.d.ts.map +1 -0
  68. package/lib/types/runtime.js +486 -0
  69. package/lib/types/runtime.js.map +1 -0
  70. package/package.json +132 -0
  71. package/src/client/ReviewPanel.tsx +164 -0
  72. package/src/client/index.ts +72 -0
  73. package/src/client/locales.ts +87 -0
  74. package/src/client/present.ts +58 -0
  75. package/src/client/styles.ts +131 -0
  76. package/src/config.ts +346 -0
  77. package/src/events.ts +553 -0
  78. package/src/index.ts +28 -0
  79. package/src/invariant.ts +326 -0
  80. package/src/messages.ts +91 -0
  81. package/src/projection-types.ts +61 -0
  82. package/src/projection.ts +224 -0
  83. package/src/review.ts +428 -0
  84. package/src/runtime.ts +562 -0
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Package-owned invariant companion for `dsh-auto-review`:
3
+ *
4
+ * 1. Every `autoReview/verdict` audit event references an `approval/asked`
5
+ * event that precedes it in the same session, at most one verdict exists
6
+ * per asked event, and payload fields obey the closed vocabularies
7
+ * (decision/reason/riskLevel/outcome/fallback). The same chain holds for
8
+ * `autoReview/rejection` events (hard-disable rejections).
9
+ * 2. Model-visible ⟺ logged: every `tool/result` carrying the deny marker
10
+ * links to a recorded `deny` verdict with a matching call id, every
11
+ * `tool/result` carrying the fallback marker links to a recorded fallback
12
+ * verdict that was rejected, and every `tool/result` carrying the never
13
+ * marker links to a recorded rejection that settled rejected.
14
+ *
15
+ * @module dsh-auto-review/invariant
16
+ */
17
+ import { AUTO_REVIEW_FALLBACKS, CIRCUIT_MARKER_PATTERN, DENY_MARKER_PATTERN, FALLBACK_MARKER_PATTERN, NEVER_MARKER_PATTERN } from "./events.js";
18
+ const PACKAGE_NAME = 'dsh-auto-review';
19
+ /** Cordis companion plugin name. */
20
+ export const name = 'auto-review-invariant';
21
+ /** Service required before the companion can reserve package ownership. */
22
+ export const inject = ['invariants'];
23
+ const DECISIONS = ['allow', 'deny'];
24
+ const RISK_LEVELS = ['low', 'medium', 'high'];
25
+ const OUTCOMES = ['allowed-once', 'rejected', 'cancelled', 'unavailable'];
26
+ const TRIP_KINDS = ['consecutive', 'window'];
27
+ const CIRCUIT_ACTIONS = ['delegate', 'reject', 'abort-turn'];
28
+ /* jscpd:ignore-start -- package companions share replay and dispatch plumbing */
29
+ /** Install verdict-chain and deny-marker validation over loaded logs and newly appended events. */
30
+ const install = Object.assign((ctx, fail) => {
31
+ // Install-scoped so a dispose/re-register cycle re-sweeps from a clean slate.
32
+ const askedIds = new WeakMap();
33
+ const verdicts = new WeakMap();
34
+ const verdictByApproval = new WeakMap();
35
+ const circuits = new WeakMap();
36
+ const rejections = new WeakMap();
37
+ const validateEvent = (session, event) => {
38
+ if (event.type === 'approval/asked') {
39
+ let ids = askedIds.get(session);
40
+ if (ids === undefined) {
41
+ ids = new Map();
42
+ askedIds.set(session, ids);
43
+ }
44
+ ids.set(event.data.id, (ids.get(event.data.id) ?? 0) + 1);
45
+ return;
46
+ }
47
+ if (event.type === 'autoReview/verdict') {
48
+ const data = event.data;
49
+ const fallback = data.fallback;
50
+ if (fallback === undefined) {
51
+ if (data.decision === undefined || !DECISIONS.includes(data.decision)) {
52
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has invalid decision ${JSON.stringify(data.decision)}`);
53
+ }
54
+ if (typeof data.reason !== 'string' || data.reason.length === 0) {
55
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has no reviewer reason`);
56
+ }
57
+ if (data.riskLevel !== undefined && !RISK_LEVELS.includes(data.riskLevel)) {
58
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has invalid riskLevel ${JSON.stringify(data.riskLevel)}`);
59
+ }
60
+ }
61
+ else {
62
+ if (!AUTO_REVIEW_FALLBACKS.includes(fallback)) {
63
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has invalid fallback ${JSON.stringify(fallback)}`);
64
+ }
65
+ if (data.decision !== undefined || data.reason !== undefined || data.riskLevel !== undefined) {
66
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} carries verdict fields alongside fallback ${JSON.stringify(fallback)}`);
67
+ }
68
+ }
69
+ if (data.outcome !== undefined && !OUTCOMES.includes(data.outcome)) {
70
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has invalid outcome ${JSON.stringify(data.outcome)}`);
71
+ }
72
+ if (data.escalation !== undefined) {
73
+ // The only escalation today: the risk policy overrode an allow. It
74
+ // must reference an allow verdict and can never settle allowed-once.
75
+ if (data.escalation !== 'risk-policy') {
76
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has invalid escalation ${JSON.stringify(data.escalation)}`);
77
+ }
78
+ if (data.decision !== 'allow') {
79
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} escalates a non-allow verdict`);
80
+ }
81
+ if (data.outcome === 'allowed-once') {
82
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} escalates yet settles allowed-once`);
83
+ }
84
+ }
85
+ if (!Number.isSafeInteger(data.durationMs) || data.durationMs < 0) {
86
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} has invalid durationMs ${String(data.durationMs)}`);
87
+ }
88
+ const count = askedIds.get(session)?.get(data.approvalId) ?? 0;
89
+ if (count < 1) {
90
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} references no prior approval/asked ${JSON.stringify(data.approvalId)}`);
91
+ }
92
+ let verdictsForSession = verdicts.get(session);
93
+ if (verdictsForSession === undefined) {
94
+ verdictsForSession = new Map();
95
+ verdicts.set(session, verdictsForSession);
96
+ }
97
+ if (verdictsForSession.has(data.reviewId)) {
98
+ fail(`autoReview/verdict repeats reviewId ${JSON.stringify(data.reviewId)}`);
99
+ }
100
+ const record = {
101
+ callId: data.callId,
102
+ decision: data.decision,
103
+ outcome: data.outcome,
104
+ fallback: data.fallback,
105
+ escalation: data.escalation,
106
+ };
107
+ verdictsForSession.set(data.reviewId, record);
108
+ let byApproval = verdictByApproval.get(session);
109
+ if (byApproval === undefined) {
110
+ byApproval = new Map();
111
+ verdictByApproval.set(session, byApproval);
112
+ }
113
+ if (byApproval.has(data.approvalId)) {
114
+ fail(`autoReview/verdict ${JSON.stringify(data.reviewId)} is the second verdict for approval/asked ${JSON.stringify(data.approvalId)}`);
115
+ }
116
+ byApproval.set(data.approvalId, record);
117
+ return;
118
+ }
119
+ if (event.type === 'autoReview/circuit') {
120
+ const data = event.data;
121
+ if (!TRIP_KINDS.includes(data.trip.kind)) {
122
+ fail(`autoReview/circuit ${JSON.stringify(data.circuitId)} has invalid trip kind ${JSON.stringify(data.trip.kind)}`);
123
+ }
124
+ if (!CIRCUIT_ACTIONS.includes(data.action)) {
125
+ fail(`autoReview/circuit ${JSON.stringify(data.circuitId)} has invalid action ${JSON.stringify(data.action)}`);
126
+ }
127
+ if (!Number.isSafeInteger(data.trip.count) || data.trip.count < 1) {
128
+ fail(`autoReview/circuit ${JSON.stringify(data.circuitId)} has invalid trip count ${String(data.trip.count)}`);
129
+ }
130
+ let circuitIds = circuits.get(session);
131
+ if (circuitIds === undefined) {
132
+ circuitIds = new Map();
133
+ circuits.set(session, circuitIds);
134
+ }
135
+ if (circuitIds.has(data.circuitId)) {
136
+ fail(`autoReview/circuit repeats circuitId ${JSON.stringify(data.circuitId)}`);
137
+ }
138
+ circuitIds.set(data.circuitId, data.action);
139
+ return;
140
+ }
141
+ if (event.type === 'autoReview/override') {
142
+ const verdict = verdicts.get(session)?.get(event.data.reviewId);
143
+ if (verdict === undefined || (verdict.decision !== 'deny' && verdict.escalation !== 'risk-policy')) {
144
+ fail(`autoReview/override references reviewId ${JSON.stringify(event.data.reviewId)} without a prior denial verdict`);
145
+ }
146
+ return;
147
+ }
148
+ if (event.type === 'autoReview/rejection') {
149
+ const data = event.data;
150
+ if (typeof data.reason !== 'string' || data.reason.length === 0) {
151
+ fail(`autoReview/rejection ${JSON.stringify(data.rejectionId)} has no hard-disable reason`);
152
+ }
153
+ if (data.outcome !== 'rejected') {
154
+ fail(`autoReview/rejection ${JSON.stringify(data.rejectionId)} has invalid outcome ${JSON.stringify(data.outcome)}`);
155
+ }
156
+ if (data.approvalId !== undefined) {
157
+ const count = askedIds.get(session)?.get(data.approvalId) ?? 0;
158
+ if (count < 1) {
159
+ fail(`autoReview/rejection ${JSON.stringify(data.rejectionId)} references no prior approval/asked ${JSON.stringify(data.approvalId)}`);
160
+ }
161
+ let byApproval = verdictByApproval.get(session);
162
+ if (byApproval === undefined) {
163
+ byApproval = new Map();
164
+ verdictByApproval.set(session, byApproval);
165
+ }
166
+ if (byApproval.has(data.approvalId)) {
167
+ fail(`autoReview/rejection ${JSON.stringify(data.rejectionId)} is the second decision for approval/asked ${JSON.stringify(data.approvalId)}`);
168
+ }
169
+ byApproval.set(data.approvalId, {
170
+ callId: data.callId,
171
+ decision: undefined,
172
+ outcome: data.outcome,
173
+ fallback: undefined,
174
+ escalation: undefined,
175
+ });
176
+ }
177
+ let rejectionIds = rejections.get(session);
178
+ if (rejectionIds === undefined) {
179
+ rejectionIds = new Map();
180
+ rejections.set(session, rejectionIds);
181
+ }
182
+ if (rejectionIds.has(data.rejectionId)) {
183
+ fail(`autoReview/rejection repeats rejectionId ${JSON.stringify(data.rejectionId)}`);
184
+ }
185
+ rejectionIds.set(data.rejectionId, { callId: data.callId, outcome: data.outcome });
186
+ return;
187
+ }
188
+ if (event.type === 'approval/decided') {
189
+ // The answerer claims a request by appending its verdict BEFORE the
190
+ // service settles the decided pair; a claimed verdict must therefore
191
+ // agree with the recorded outcome (a `delegate` fallback omits its
192
+ // outcome because the downstream answerer owns the decision).
193
+ const claimed = verdictByApproval.get(session)?.get(event.data.id);
194
+ if (claimed?.outcome !== undefined && claimed.outcome !== event.data.outcome) {
195
+ fail(`approval/decided ${JSON.stringify(event.data.id)} outcome ${JSON.stringify(event.data.outcome)} contradicts the autoReview/verdict outcome ${JSON.stringify(claimed.outcome)}`);
196
+ }
197
+ return;
198
+ }
199
+ if (event.type === 'tool/result') {
200
+ const block = event.data.message.content[0];
201
+ if (block === undefined || block.type !== 'tool-result') {
202
+ // Not a tool-result projection this invariant owns; skip.
203
+ return;
204
+ }
205
+ const text = block.content
206
+ .filter(item => item.type === 'text')
207
+ .map(item => item.text)
208
+ .join('\n');
209
+ const denyMatch = DENY_MARKER_PATTERN.exec(text);
210
+ if (denyMatch !== null) {
211
+ const reviewId = denyMatch[1];
212
+ if (reviewId === undefined) {
213
+ fail(`tool/result carries an unparseable deny marker: ${JSON.stringify(denyMatch[0])}`);
214
+ return;
215
+ }
216
+ const verdict = verdicts.get(session)?.get(reviewId);
217
+ if (verdict === undefined) {
218
+ fail(`tool/result deny marker references unknown reviewId ${JSON.stringify(reviewId)}`);
219
+ return;
220
+ }
221
+ if (verdict.decision !== 'deny' && !(verdict.escalation === 'risk-policy' && verdict.outcome === 'rejected')) {
222
+ fail(`tool/result deny marker references a non-deny verdict ${JSON.stringify(reviewId)}`);
223
+ }
224
+ if (verdict.callId !== undefined && verdict.callId !== block.toolCallId) {
225
+ fail(`tool/result deny marker for review ${JSON.stringify(reviewId)} has call id ${JSON.stringify(block.toolCallId)}, expected ${JSON.stringify(verdict.callId)}`);
226
+ }
227
+ return;
228
+ }
229
+ const fallbackMatch = FALLBACK_MARKER_PATTERN.exec(text);
230
+ if (fallbackMatch !== null) {
231
+ const reviewId = fallbackMatch[1];
232
+ if (reviewId === undefined) {
233
+ fail(`tool/result carries an unparseable fallback marker: ${JSON.stringify(fallbackMatch[0])}`);
234
+ return;
235
+ }
236
+ const verdict = verdicts.get(session)?.get(reviewId);
237
+ if (verdict === undefined) {
238
+ fail(`tool/result fallback marker references unknown reviewId ${JSON.stringify(reviewId)}`);
239
+ return;
240
+ }
241
+ if (verdict.fallback === undefined || verdict.outcome !== 'rejected') {
242
+ fail(`tool/result fallback marker references a verdict that was not rejected by fallback ${JSON.stringify(reviewId)}`);
243
+ }
244
+ if (verdict.callId !== undefined && verdict.callId !== block.toolCallId) {
245
+ fail(`tool/result fallback marker for review ${JSON.stringify(reviewId)} has call id ${JSON.stringify(block.toolCallId)}, expected ${JSON.stringify(verdict.callId)}`);
246
+ }
247
+ return;
248
+ }
249
+ const circuitMatch = CIRCUIT_MARKER_PATTERN.exec(text);
250
+ if (circuitMatch !== null) {
251
+ const circuitId = circuitMatch[1];
252
+ const toolName = circuitMatch[2];
253
+ if (circuitId === undefined || toolName === undefined) {
254
+ fail(`tool/result carries an unparseable circuit marker: ${JSON.stringify(circuitMatch[0])}`);
255
+ return;
256
+ }
257
+ const action = circuits.get(session)?.get(circuitId);
258
+ if (action === undefined) {
259
+ fail(`tool/result circuit marker references unknown circuitId ${JSON.stringify(circuitId)}`);
260
+ return;
261
+ }
262
+ if (action === 'delegate') {
263
+ fail(`tool/result circuit marker references a delegate-action circuit ${JSON.stringify(circuitId)}`);
264
+ }
265
+ return;
266
+ }
267
+ const neverMatch = NEVER_MARKER_PATTERN.exec(text);
268
+ if (neverMatch === null)
269
+ return;
270
+ const rejectionId = neverMatch[1];
271
+ if (rejectionId === undefined) {
272
+ fail(`tool/result carries an unparseable never marker: ${JSON.stringify(neverMatch[0])}`);
273
+ return;
274
+ }
275
+ const rejection = rejections.get(session)?.get(rejectionId);
276
+ if (rejection === undefined) {
277
+ fail(`tool/result never marker references unknown rejectionId ${JSON.stringify(rejectionId)}`);
278
+ return;
279
+ }
280
+ if (rejection.outcome !== 'rejected') {
281
+ fail(`tool/result never marker references a rejection that did not settle rejected ${JSON.stringify(rejectionId)}`);
282
+ }
283
+ if (rejection.callId !== undefined && rejection.callId !== block.toolCallId) {
284
+ fail(`tool/result never marker for rejection ${JSON.stringify(rejectionId)} has call id ${JSON.stringify(block.toolCallId)}, expected ${JSON.stringify(rejection.callId)}`);
285
+ }
286
+ }
287
+ };
288
+ for (const session of ctx.sessions.list()) {
289
+ for (const event of session.events)
290
+ validateEvent(session, event);
291
+ }
292
+ ctx.on('internal/dispatch', (_mode, eventName, args) => {
293
+ if (eventName !== 'session/event')
294
+ return;
295
+ const [session, event] = args;
296
+ validateEvent(session, event);
297
+ }, { global: true });
298
+ }, { inject: ['sessions'] });
299
+ /* jscpd:ignore-end */
300
+ /**
301
+ * Register this package's invariant companion.
302
+ * @param ctx - Cordis context carrying the invariant service.
303
+ * @returns the installed registration's disposer after setup succeeds.
304
+ */
305
+ export const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
306
+ //# sourceMappingURL=invariant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.js","sourceRoot":"","sources":["../../src/invariant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * User-facing command strings for `dsh-auto-review` in the supported
3
+ * languages. The table is a pure function of the resolved `language` config;
4
+ * the English strings are the source of truth, the Chinese twin mirrors
5
+ * them. Reviewer-prompt content is NOT here (it is config-provided
6
+ * guidance/policy text, not command UI).
7
+ * @module dsh-auto-review/messages
8
+ */
9
+ /** Supported UI languages for the `/auto-review` command output. */
10
+ export type UiLanguage = 'en' | 'zh';
11
+ /** All command strings of one language. */
12
+ export interface Messages {
13
+ readonly usage: string;
14
+ readonly description: string;
15
+ readonly statusLine: (enabled: boolean) => string;
16
+ readonly verdictsLine: (used: number, max: number) => string;
17
+ readonly failuresLine: (used: number, max: number) => string;
18
+ readonly circuitLine: (kind: string, count: number, action: string) => string;
19
+ readonly allTimeLine: (allows: number, denies: number, fallbacks: number, rejections: number, avg: number) => string;
20
+ readonly recentLine: (labels: string) => string;
21
+ readonly unknownArg: (arg: string) => string;
22
+ readonly already: (state: string) => string;
23
+ readonly switchedNotice: (enabled: boolean) => string;
24
+ readonly switchedResult: (state: string) => string;
25
+ readonly approveResult: (toolName: string, reviewId: string, minutes: number) => string;
26
+ readonly approveNone: (index: number, count: number) => string;
27
+ readonly approveInvalid: (arg: string) => string;
28
+ readonly circuitNotice: (kind: string, count: number) => string;
29
+ }
30
+ /** The message tables, keyed by {@link UiLanguage}. */
31
+ export declare const MESSAGES: Readonly<Record<UiLanguage, Messages>>;
32
+ /**
33
+ * Pick one language's message table.
34
+ * @param language - the resolved UI language.
35
+ * @returns the table (English and Chinese are the shipped languages).
36
+ */
37
+ export declare function messages(language: UiLanguage): Messages;
38
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oEAAoE;AACpE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAA;AAEpC,2CAA2C;AAC3C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5D,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5D,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC7E,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACpH,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3C,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAA;IACrD,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;IACvF,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9D,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAChD,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CAChE;AAkDD,uDAAuD;AACvD,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAsB,CAAA;AAElF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,CAEvD"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * User-facing command strings for `dsh-auto-review` in the supported
3
+ * languages. The table is a pure function of the resolved `language` config;
4
+ * the English strings are the source of truth, the Chinese twin mirrors
5
+ * them. Reviewer-prompt content is NOT here (it is config-provided
6
+ * guidance/policy text, not command UI).
7
+ * @module dsh-auto-review/messages
8
+ */
9
+ const EN = {
10
+ usage: 'Usage: /auto-review on|off|status|approve [n]',
11
+ description: 'enable or disable second-model AI auto-review for this session, inspect verdicts, or approve one retry',
12
+ statusLine: enabled => `Auto-review is ${enabled ? 'ON' : 'OFF'} for this session.`,
13
+ verdictsLine: (used, max) => `AI verdicts this turn: ${used}/${max}`,
14
+ failuresLine: (used, max) => `Reviewer failures this turn: ${used}/${max}`,
15
+ circuitLine: (kind, count, action) => `Rejection circuit breaker tripped (${kind}: ${count} denials); later requests in this turn follow "${action}".`,
16
+ allTimeLine: (allows, denies, fallbacks, rejections, avg) => `All-time: ${allows} allows, ${denies} denies, ${fallbacks} fallbacks, ${rejections} never rejects (avg ${avg} ms per verdict).`,
17
+ recentLine: labels => `Recent verdicts: ${labels}`,
18
+ unknownArg: arg => `Unknown /auto-review argument "${arg}". Usage: /auto-review on|off|status|approve [n]`,
19
+ already: state => `Auto-review is already ${state} for this session.`,
20
+ switchedNotice: enabled => `AI auto-review was switched ${enabled ? 'ON' : 'OFF'} for this session (changed by the user).`,
21
+ switchedResult: state => `Auto-review ${state} for this session.`,
22
+ approveResult: (toolName, reviewId, minutes) => [
23
+ `Authorized ONE retry of the denied ${toolName} action (review ${reviewId}).`,
24
+ `The next ${toolName} review within ${minutes} minutes carries this authorization as reviewer context — the reviewer still decides.`,
25
+ ].join('\n'),
26
+ approveNone: (index, count) => `No recent denial #${index} in this session (${count} recorded).`,
27
+ approveInvalid: arg => `Invalid /auto-review approve index "${arg}". Usage: /auto-review approve [n]`,
28
+ circuitNotice: (kind, count) => `The AI auto-review rejection circuit breaker tripped (${kind}: ${count} denials). `
29
+ + 'This turn is aborted because the agent kept proposing blocked actions. '
30
+ + 'Adjust the sandbox boundary or the review policy, then continue.',
31
+ };
32
+ const ZH = {
33
+ usage: '用法:/auto-review on|off|status|approve [n]',
34
+ description: '为本会话启用或禁用第二模型 AI 自动审查、查看裁决统计,或批准一次重试',
35
+ statusLine: enabled => `本会话的自动审查已${enabled ? '开启' : '关闭'}。`,
36
+ verdictsLine: (used, max) => `本回合 AI 裁决数:${used}/${max}`,
37
+ failuresLine: (used, max) => `本回合审查失败数:${used}/${max}`,
38
+ circuitLine: (kind, count, action) => `拒绝熔断器已触发(${kind}:${count} 次拒绝);本回合后续请求按 "${action}" 处理。`,
39
+ allTimeLine: (allows, denies, fallbacks, rejections, avg) => `累计:${allows} 次放行,${denies} 次拒绝,${fallbacks} 次失败,${rejections} 次硬禁用拒绝(每次裁决平均 ${avg} ms)。`,
40
+ recentLine: labels => `最近裁决:${labels}`,
41
+ unknownArg: arg => `未知的 /auto-review 参数 "${arg}"。用法:/auto-review on|off|status|approve [n]`,
42
+ already: state => `本会话的自动审查已处于 ${state} 状态。`,
43
+ switchedNotice: enabled => `AI 自动审查已为本会话${enabled ? '开启' : '关闭'}(由用户更改)。`,
44
+ switchedResult: state => `本会话的自动审查已${state}。`,
45
+ approveResult: (toolName, reviewId, minutes) => [
46
+ `已批准对 ${toolName} 被拒操作的一次重试(审查 ${reviewId})。`,
47
+ `接下来 ${minutes} 分钟内对 ${toolName} 的下一次审查将携带该授权作为审查上下文——最终仍由审查代理裁决。`,
48
+ ].join('\n'),
49
+ approveNone: (index, count) => `本会话没有第 ${index} 条近期拒绝记录(共 ${count} 条)。`,
50
+ approveInvalid: arg => `无效的 /auto-review approve 序号 "${arg}"。用法:/auto-review approve [n]`,
51
+ circuitNotice: (kind, count) => `AI 自动审查拒绝熔断器触发(${kind}:${count} 次拒绝)。`
52
+ + '由于代理持续提出被阻止的操作,本回合已中止。'
53
+ + '请调整沙箱边界或审查策略后继续。',
54
+ };
55
+ /** The message tables, keyed by {@link UiLanguage}. */
56
+ export const MESSAGES = { en: EN, zh: ZH };
57
+ /**
58
+ * Pick one language's message table.
59
+ * @param language - the resolved UI language.
60
+ * @returns the table (English and Chinese are the shipped languages).
61
+ */
62
+ export function messages(language) {
63
+ return MESSAGES[language];
64
+ }
65
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Pure-type outlet of the `autoReview` session projection: the wire value
3
+ * the host folds and the browser review panel renders. Zero value imports —
4
+ * client programs pull these types without dragging the host chain.
5
+ * @module dsh-auto-review/projection-types
6
+ */
7
+ /** One verdict, presented for the panel. */
8
+ export interface AutoReviewVerdictView {
9
+ readonly reviewId: string;
10
+ readonly toolName: string;
11
+ readonly at: number;
12
+ readonly durationMs: number;
13
+ readonly decision?: 'allow' | 'deny';
14
+ readonly riskLevel?: 'low' | 'medium' | 'high';
15
+ readonly escalation?: 'risk-policy';
16
+ readonly fallback?: string;
17
+ readonly outcome?: string;
18
+ readonly reason?: string;
19
+ }
20
+ /** One recent denial offered for a one-shot approve (newest first). */
21
+ export interface AutoReviewDenyView {
22
+ readonly reviewId: string;
23
+ readonly toolName: string;
24
+ readonly reason?: string;
25
+ }
26
+ /** The whole wire value folded by the `autoReview` projection unit. */
27
+ export interface AutoReviewProjection {
28
+ /** The session's switch — the last `autoReview/state` event, or the `enableByDefault` default. */
29
+ readonly enabled: boolean;
30
+ /** Real AI verdicts in the current open turn. */
31
+ readonly verdictsUsed: number;
32
+ /** Reviewer failures in the current open turn. */
33
+ readonly failuresUsed: number;
34
+ /** Cumulative counts over the whole session. */
35
+ readonly allows: number;
36
+ readonly denies: number;
37
+ readonly fallbacks: number;
38
+ /** Hard-disable (`never` policy) rejections — no reviewer ran for these. */
39
+ readonly neverRejects: number;
40
+ /** Mean duration of decision-carrying verdicts, rounded; 0 without any. */
41
+ readonly avgDurationMs: number;
42
+ /** The current turn's circuit trip, or null. */
43
+ readonly circuit: {
44
+ readonly action: 'delegate' | 'reject' | 'abort-turn';
45
+ readonly trip: {
46
+ readonly kind: 'consecutive' | 'window';
47
+ readonly count: number;
48
+ };
49
+ readonly toolName: string;
50
+ } | null;
51
+ /** The last 8 verdicts, newest first. */
52
+ readonly recent: readonly AutoReviewVerdictView[];
53
+ /** The last 5 denials, newest first (approve candidates; index 0 = approve 1). */
54
+ readonly recentDenies: readonly AutoReviewDenyView[];
55
+ }
56
+ declare module '@deepseek-ai/dsh-session-projection/types' {
57
+ interface SessionProjectionMap {
58
+ autoReview: AutoReviewProjection;
59
+ }
60
+ }
61
+ //# sourceMappingURL=projection-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection-types.d.ts","sourceRoot":"","sources":["../../src/projection-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,kGAAkG;IAClG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAA;QACrD,QAAQ,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;QAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAC1B,GAAG,IAAI,CAAA;IACR,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACjD,kFAAkF;IAClF,QAAQ,CAAC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAA;CACrD;AAED,OAAO,QAAQ,2CAA2C,CAAC;IACzD,UAAU,oBAAoB;QAC5B,UAAU,EAAE,oBAAoB,CAAA;KACjC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Pure-type outlet of the `autoReview` session projection: the wire value
3
+ * the host folds and the browser review panel renders. Zero value imports —
4
+ * client programs pull these types without dragging the host chain.
5
+ * @module dsh-auto-review/projection-types
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=projection-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection-types.js","sourceRoot":"","sources":["../../src/projection-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Host projection unit for the `autoReview` panel value: folds the log-only
3
+ * `autoReview/*` events into one wire-JSON whole value the browser review
4
+ * panel reads via `useProjection('autoReview')`. Pure mathematics only — the
5
+ * framework owns subscriptions, watermarks, change feeds, and persistence.
6
+ * The fold mirrors the `events.ts` pure folds (budgets, statistics, denials).
7
+ * @module dsh-auto-review/projection
8
+ */
9
+ import { z } from 'zod';
10
+ import type { ProjectionDefinition } from '@deepseek-ai/dsh-session-projection';
11
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
12
+ import type { AutoReviewDenyView, AutoReviewProjection, AutoReviewVerdictView } from './projection-types.ts';
13
+ /** Strict wire schema — validates the `view` output before it leaves the host. */
14
+ export declare const AUTO_REVIEW_PROJECTION_SCHEMA: z.ZodObject<{
15
+ enabled: z.ZodBoolean;
16
+ verdictsUsed: z.ZodNumber;
17
+ failuresUsed: z.ZodNumber;
18
+ allows: z.ZodNumber;
19
+ denies: z.ZodNumber;
20
+ fallbacks: z.ZodNumber;
21
+ neverRejects: z.ZodNumber;
22
+ avgDurationMs: z.ZodNumber;
23
+ circuit: z.ZodNullable<z.ZodObject<{
24
+ action: z.ZodUnion<readonly [z.ZodLiteral<"delegate">, z.ZodLiteral<"reject">, z.ZodLiteral<"abort-turn">]>;
25
+ trip: z.ZodObject<{
26
+ kind: z.ZodUnion<readonly [z.ZodLiteral<"consecutive">, z.ZodLiteral<"window">]>;
27
+ count: z.ZodNumber;
28
+ }, z.core.$strip>;
29
+ toolName: z.ZodString;
30
+ }, z.core.$strip>>;
31
+ recent: z.ZodArray<z.ZodObject<{
32
+ reviewId: z.ZodString;
33
+ toolName: z.ZodString;
34
+ at: z.ZodNumber;
35
+ durationMs: z.ZodNumber;
36
+ decision: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"allow">, z.ZodLiteral<"deny">]>>;
37
+ riskLevel: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"low">, z.ZodLiteral<"medium">, z.ZodLiteral<"high">]>>;
38
+ escalation: z.ZodOptional<z.ZodLiteral<"risk-policy">>;
39
+ fallback: z.ZodOptional<z.ZodString>;
40
+ outcome: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"allowed-once">, z.ZodLiteral<"rejected">, z.ZodLiteral<"cancelled">, z.ZodLiteral<"unavailable">]>>;
41
+ reason: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>>;
43
+ recentDenies: z.ZodArray<z.ZodObject<{
44
+ reviewId: z.ZodString;
45
+ toolName: z.ZodString;
46
+ reason: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>;
49
+ /** The fold's plain-JSON state (the persisted-cache precondition). */
50
+ export interface AutoReviewProjectionState {
51
+ readonly enabled: boolean;
52
+ readonly turnOpen: boolean;
53
+ readonly verdictsUsed: number;
54
+ readonly failuresUsed: number;
55
+ readonly allows: number;
56
+ readonly denies: number;
57
+ readonly fallbacks: number;
58
+ readonly neverRejects: number;
59
+ readonly durationSum: number;
60
+ readonly decided: number;
61
+ readonly circuit: AutoReviewProjection['circuit'];
62
+ readonly recent: readonly AutoReviewVerdictView[];
63
+ readonly recentDenies: readonly AutoReviewDenyView[];
64
+ }
65
+ /**
66
+ * State for the empty log. `enabled` starts at the resolved
67
+ * `enableByDefault` — the projection cannot know the plugin config on its
68
+ * own, so the unit is built per mount by {@link makeAutoReviewProjection}.
69
+ * @param enabledByDefault - the resolved `enableByDefault` config value.
70
+ */
71
+ export declare function initAutoReviewProjection(enabledByDefault: boolean): AutoReviewProjectionState;
72
+ /**
73
+ * Pure transition: previous state + one committed event → next state.
74
+ * Uninterested events return the same state reference.
75
+ * @param state - the state covering all prior events.
76
+ * @param event - the next committed session event.
77
+ * @returns the next state (same reference when the event is not this unit's).
78
+ */
79
+ export declare function applyAutoReview(state: AutoReviewProjectionState, event: SessionEvent): AutoReviewProjectionState;
80
+ /** State → wire payload (the read-side projection). */
81
+ export declare function viewAutoReview(state: AutoReviewProjectionState): AutoReviewProjection;
82
+ /**
83
+ * Build the registered unit for one mount. The unit's initial `enabled` is
84
+ * the mount's resolved `enableByDefault` (the pure `init` cannot see plugin
85
+ * config otherwise), and the panel therefore reports the same switch state
86
+ * the answerer applies. Registrants sharing the `autoReview` key share one
87
+ * unit; the first mount's default wins, which only matters for a double
88
+ * mount with conflicting `enableByDefault` values.
89
+ * @param enabledByDefault - the resolved `enableByDefault` config value.
90
+ * @returns the projection unit for `ctx.sessionProjections.register`.
91
+ */
92
+ export declare function makeAutoReviewProjection(enabledByDefault: boolean): ProjectionDefinition<'autoReview', AutoReviewProjectionState>;
93
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/projection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,0BAA0B,CAAA;AAC7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAmC5G,kFAAkF;AAClF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYxC,CAAA;AAEF,sEAAsE;AACtE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAA;CACrD;AAKD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,OAAO,GAAG,yBAAyB,CAgB7F;AA6BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,YAAY,GAAG,yBAAyB,CAyChH;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,KAAK,EAAE,yBAAyB,GAAG,oBAAoB,CAcrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,OAAO,GAAG,oBAAoB,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAajI"}