dsh-permission-rules 0.6.1 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/README.es.md +35 -17
- package/README.hi.md +35 -17
- package/README.md +35 -17
- package/README.pt.md +35 -17
- package/README.zh.md +35 -17
- package/lib/index.js +54 -34
- package/lib/types/call-id.d.ts +10 -0
- package/lib/types/call-id.d.ts.map +1 -0
- package/lib/types/events.d.ts +1 -1
- package/lib/types/events.d.ts.map +1 -1
- package/lib/types/proxy.d.ts +1 -1
- package/lib/types/proxy.d.ts.map +1 -1
- package/lib/types/runtime.d.ts +28 -15
- package/lib/types/runtime.d.ts.map +1 -1
- package/package.json +31 -25
- package/scripts/repair-session-logs.mjs +38 -19
- package/src/call-id.ts +11 -0
- package/src/events.ts +1 -1
- package/src/prose.ts +5 -5
- package/src/proxy.ts +23 -11
- package/src/runtime.ts +34 -20
package/lib/index.js
CHANGED
|
@@ -1747,7 +1747,7 @@ const EN = {
|
|
|
1747
1747
|
usage: "Usage: /rules [list | reload | network | decisions [n] | test <tool> <json-args>]",
|
|
1748
1748
|
decisionsHeader: (shown, total) => `Last ${shown} of ${total} permission decision(s) for this session:`,
|
|
1749
1749
|
noDecisions: "No permission decisions recorded in this session yet.",
|
|
1750
|
-
auditDisabledNotice: "Session-log audit is disabled on this host:
|
|
1750
|
+
auditDisabledNotice: "Session-log audit is disabled on this host: it cannot safely persist ignorable-marked audit events, which would make sessions unresumable elsewhere (set allowUnmarkedAudit: true to opt back in).",
|
|
1751
1751
|
invalidDecisionsCount: (arg) => `Invalid decisions count "${arg}": give a positive integer (default 10).`,
|
|
1752
1752
|
decisionLine: (seq, action, toolName, ruleIndex, reason, dryRun, outcome) => {
|
|
1753
1753
|
return `- #${seq} ${action} ${toolName}${ruleIndex === void 0 ? "" : ` (rule ${ruleIndex + 1})`}${dryRun ? outcome === void 0 ? " (dry-run)" : ` (dry-run → ${outcome})` : ""}${reason === void 0 ? "" : `: ${short(reason)}`}`;
|
|
@@ -1781,7 +1781,7 @@ const ZH = {
|
|
|
1781
1781
|
usage: "用法:/rules [list | reload | network | decisions [n] | test <工具名> <json-参数>]",
|
|
1782
1782
|
decisionsHeader: (shown, total) => `本会话最近 ${shown}/${total} 条权限裁决:`,
|
|
1783
1783
|
noDecisions: "本会话还没有记录任何权限裁决。",
|
|
1784
|
-
auditDisabledNotice: "
|
|
1784
|
+
auditDisabledNotice: "本宿主上会话日志审计已停用:其无法安全持久化 ignorable 标记的审计事件,会令会话在其他宿主上无法恢复(设 allowUnmarkedAudit: true 可重新开启)。",
|
|
1785
1785
|
invalidDecisionsCount: (arg) => `无效的裁决条数 "${arg}":请给正整数(默认 10)。`,
|
|
1786
1786
|
decisionLine: (seq, action, toolName, ruleIndex, reason, dryRun, outcome) => {
|
|
1787
1787
|
return `- #${seq} ${action} ${toolName}${ruleIndex === void 0 ? "" : `(规则 ${ruleIndex + 1})`}${dryRun ? outcome === void 0 ? "(干跑)" : `(干跑 → ${outcome})` : ""}${reason === void 0 ? "" : `:${short(reason)}`}`;
|
|
@@ -1815,7 +1815,7 @@ const ES = {
|
|
|
1815
1815
|
usage: "Uso: /rules [list | reload | network | decisions [n] | test <herramienta> <json-args>]",
|
|
1816
1816
|
decisionsHeader: (shown, total) => `Últimas ${shown} de ${total} decisión(es) de permiso de esta sesión:`,
|
|
1817
1817
|
noDecisions: "Esta sesión aún no registra decisiones de permiso.",
|
|
1818
|
-
auditDisabledNotice: "La auditoría del registro de sesión está desactivada en este host:
|
|
1818
|
+
auditDisabledNotice: "La auditoría del registro de sesión está desactivada en este host: no puede persistir de forma segura eventos de auditoría marcados como ignorable, lo que haría las sesiones irrecuperables en otros hosts (establece allowUnmarkedAudit: true para reactivarla).",
|
|
1819
1819
|
invalidDecisionsCount: (arg) => `Cantidad de decisiones inválida "${arg}": indique un entero positivo (por defecto 10).`,
|
|
1820
1820
|
decisionLine: (seq, action, toolName, ruleIndex, reason, dryRun, outcome) => {
|
|
1821
1821
|
return `- #${seq} ${action} ${toolName}${ruleIndex === void 0 ? "" : ` (regla ${ruleIndex + 1})`}${dryRun ? outcome === void 0 ? " (simulación)" : ` (simulación → ${outcome})` : ""}${reason === void 0 ? "" : `: ${short(reason)}`}`;
|
|
@@ -1849,7 +1849,7 @@ const PT = {
|
|
|
1849
1849
|
usage: "Uso: /rules [list | reload | network | decisions [n] | test <ferramenta> <json-args>]",
|
|
1850
1850
|
decisionsHeader: (shown, total) => `Últimas ${shown} de ${total} decisão(ões) de permissão desta sessão:`,
|
|
1851
1851
|
noDecisions: "Esta sessão ainda não registrou decisões de permissão.",
|
|
1852
|
-
auditDisabledNotice: "A auditoria do registro da sessão está desativada neste host:
|
|
1852
|
+
auditDisabledNotice: "A auditoria do registro da sessão está desativada neste host: ele não consegue persistir com segurança eventos de auditoria marcados como ignorable, o que tornaria as sessões irrecuperáveis em outros hosts (defina allowUnmarkedAudit: true para reativar).",
|
|
1853
1853
|
invalidDecisionsCount: (arg) => `Quantidade de decisões inválida "${arg}": informe um inteiro positivo (padrão 10).`,
|
|
1854
1854
|
decisionLine: (seq, action, toolName, ruleIndex, reason, dryRun, outcome) => {
|
|
1855
1855
|
return `- #${seq} ${action} ${toolName}${ruleIndex === void 0 ? "" : ` (regra ${ruleIndex + 1})`}${dryRun ? outcome === void 0 ? " (simulação)" : ` (simulação → ${outcome})` : ""}${reason === void 0 ? "" : `: ${short(reason)}`}`;
|
|
@@ -1883,7 +1883,7 @@ const HI = {
|
|
|
1883
1883
|
usage: "उपयोग: /rules [list | reload | network | decisions [n] | test <टूल> <json-args>]",
|
|
1884
1884
|
decisionsHeader: (shown, total) => `इस सत्र के अंतिम ${shown}/${total} अनुमति निर्णय:`,
|
|
1885
1885
|
noDecisions: "इस सत्र में अभी कोई अनुमति निर्णय दर्ज नहीं है।",
|
|
1886
|
-
auditDisabledNotice: "इस होस्ट पर सत्र-लॉग ऑडिट अक्षम है:
|
|
1886
|
+
auditDisabledNotice: "इस होस्ट पर सत्र-लॉग ऑडिट अक्षम है: यह ignorable-चिह्नित ऑडिट इवेंट को सुरक्षित रूप से सहेज नहीं सकता, जिससे सत्र अन्य होस्ट पर अप्राप्य हो जाते (पुनः चालू करने के लिए allowUnmarkedAudit: true सेट करें)।",
|
|
1887
1887
|
invalidDecisionsCount: (arg) => `अमान्य निर्णय-संख्या "${arg}": एक धनात्मक पूर्णांक दें (डिफ़ॉल्ट 10)।`,
|
|
1888
1888
|
decisionLine: (seq, action, toolName, ruleIndex, reason, dryRun, outcome) => {
|
|
1889
1889
|
return `- #${seq} ${action} ${toolName}${ruleIndex === void 0 ? "" : ` (नियम ${ruleIndex + 1})`}${dryRun ? outcome === void 0 ? " (ड्राई-रन)" : ` (ड्राई-रन → ${outcome})` : ""}${reason === void 0 ? "" : `: ${short(reason)}`}`;
|
|
@@ -2138,6 +2138,12 @@ var NetworkProxy = class {
|
|
|
2138
2138
|
}
|
|
2139
2139
|
/** CONNECT tunneling (HTTPS and friends): adjudicate, then either 403 or an established TCP tunnel. */
|
|
2140
2140
|
async handleConnect(req, socket, head) {
|
|
2141
|
+
const tunnelHolder = {};
|
|
2142
|
+
socket.on("error", (error) => {
|
|
2143
|
+
this.options.logger.warn(`permission-rules: CONNECT socket error: ${String(error)}`);
|
|
2144
|
+
tunnelHolder.tunnel?.destroy();
|
|
2145
|
+
socket.destroy();
|
|
2146
|
+
});
|
|
2141
2147
|
const target = connectTarget(req.url ?? "");
|
|
2142
2148
|
if (target === void 0) {
|
|
2143
2149
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
@@ -2150,22 +2156,22 @@ var NetworkProxy = class {
|
|
|
2150
2156
|
socket.end(`HTTP/1.1 403 Forbidden\r\ncontent-type: text/plain\r\ncontent-length: ${Buffer.byteLength(body)}\r\n\r\n${body}`);
|
|
2151
2157
|
return;
|
|
2152
2158
|
}
|
|
2153
|
-
const
|
|
2159
|
+
const tunnel = connect(target.port ?? 443, target.host);
|
|
2160
|
+
tunnelHolder.tunnel = tunnel;
|
|
2154
2161
|
this.sockets.add(socket);
|
|
2155
|
-
this.sockets.add(
|
|
2162
|
+
this.sockets.add(tunnel);
|
|
2156
2163
|
const cleanup = () => {
|
|
2157
2164
|
this.sockets.delete(socket);
|
|
2158
|
-
this.sockets.delete(
|
|
2165
|
+
this.sockets.delete(tunnel);
|
|
2159
2166
|
};
|
|
2160
2167
|
socket.on("close", cleanup);
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
upstream.once("connect", () => {
|
|
2168
|
+
tunnel.on("close", cleanup);
|
|
2169
|
+
tunnel.on("error", () => socket.destroy());
|
|
2170
|
+
tunnel.once("connect", () => {
|
|
2165
2171
|
socket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
|
|
2166
|
-
if (head.length > 0)
|
|
2167
|
-
|
|
2168
|
-
socket.pipe(
|
|
2172
|
+
if (head.length > 0) tunnel.write(head);
|
|
2173
|
+
tunnel.pipe(socket);
|
|
2174
|
+
socket.pipe(tunnel);
|
|
2169
2175
|
});
|
|
2170
2176
|
}
|
|
2171
2177
|
/** Adjudicate one plain-HTTP request; deny/ask blocks with a structured 403 before any forwarding. */
|
|
@@ -2789,8 +2795,11 @@ var PermissionRulesRuntime = class {
|
|
|
2789
2795
|
* runtime therefore detects such hosts BEFORE the first append (peer
|
|
2790
2796
|
* version) and re-checks after the first append (returned envelope), then
|
|
2791
2797
|
* degrades: session-log audit is disabled with a one-time warning unless
|
|
2792
|
-
* `allowUnmarkedAudit: true` opts back in. `
|
|
2793
|
-
*
|
|
2798
|
+
* `allowUnmarkedAudit: true` opts back in. The `0.1.2-alpha` line refuses
|
|
2799
|
+
* plugin event types on read even when marked, so its version gate
|
|
2800
|
+
* disables audit the same way (see `isUnmarkedHostVersion`). `source`
|
|
2801
|
+
* names the matched rule's file, or the nearest effective file on a
|
|
2802
|
+
* passthrough; `cwd`
|
|
2794
2803
|
* names the workspace the rules were resolved for; `dryRun` marks
|
|
2795
2804
|
* would-be deny/ask hits under `enforce: false`; `modeDefault` records a
|
|
2796
2805
|
* network mode-default decision on a web tool (no rule fired).
|
|
@@ -3161,7 +3170,7 @@ var PermissionRulesRuntime = class {
|
|
|
3161
3170
|
}
|
|
3162
3171
|
/** One-time warning that session-log audit was disabled to keep session logs loadable. */
|
|
3163
3172
|
warnUnmarkedAuditHost() {
|
|
3164
|
-
this.ctx.logger.warn("permission-rules: this host
|
|
3173
|
+
this.ctx.logger.warn("permission-rules: this host cannot safely persist ignorable-marked audit events (its Session.append predates the marker, or its read path refuses plugin events), which would make sessions unresumable on stricter harness builds — session-log audit is disabled; set allowUnmarkedAudit: true to opt back in, and repair existing logs with scripts/repair-session-logs.mjs (see https://github.com/PerryLink/dsh-permission-rules/issues/2)");
|
|
3165
3174
|
}
|
|
3166
3175
|
/**
|
|
3167
3176
|
* Execute the `/rules` command: bare `/rules` lists the active rules and
|
|
@@ -3654,25 +3663,36 @@ async function apply(ctx, config) {
|
|
|
3654
3663
|
});
|
|
3655
3664
|
}
|
|
3656
3665
|
/**
|
|
3657
|
-
* Whether a `@deepseek-ai/dsh-session` version line
|
|
3658
|
-
*
|
|
3659
|
-
*
|
|
3660
|
-
*
|
|
3661
|
-
*
|
|
3662
|
-
*
|
|
3663
|
-
*
|
|
3664
|
-
*
|
|
3665
|
-
*
|
|
3666
|
-
*
|
|
3667
|
-
*
|
|
3668
|
-
*
|
|
3666
|
+
* Whether a `@deepseek-ai/dsh-session` version line cannot safely persist
|
|
3667
|
+
* plugin audit events, either because it predates the `ignorable`
|
|
3668
|
+
* envelope-marker surface or because its read path refuses out-of-vocabulary
|
|
3669
|
+
* event types even when marked:
|
|
3670
|
+
* - The released `0.1.0-rc.1`–`0.1.0-rc.7` lines silently drop the marker
|
|
3671
|
+
* from `Session.append` options, so audit events written by those builds
|
|
3672
|
+
* land unmarked and break resume on stricter hosts. `0.1.0-rc.8` and
|
|
3673
|
+
* later stamp the marker. The `0.1.1-rc` line regressed the same way
|
|
3674
|
+
* (verified on `0.1.1-rc.2` — the stamping fix exists only on harness
|
|
3675
|
+
* master), so `0.1.1-rc.1`–`0.1.1-rc.7` are treated as unmarked too.
|
|
3676
|
+
* - The `0.1.2-alpha` line refuses to interpret logs containing plugin
|
|
3677
|
+
* event types even when the envelope carries `ignorable: true` (verified
|
|
3678
|
+
* on `0.1.2-alpha-1`, reported by @rgw87 in issue #15), so audit events
|
|
3679
|
+
* written there make the session unresumable on that host itself. The
|
|
3680
|
+
* whole alpha line is treated as unsafe; over-refusal is harmless because
|
|
3681
|
+
* `allowUnmarkedAudit: true` opts back in, and
|
|
3682
|
+
* `scripts/repair-session-logs.mjs strip` removes already-written audit
|
|
3683
|
+
* rows for hosts where the marker cannot help. On 0.1.2-alpha.2 the envelope field is restored for stored-log read compatibility only - its Session.append still cannot stamp the marker, so the gate behavior is unchanged. Extend the bound if a
|
|
3684
|
+
* future alpha/rc line regresses. Non-matching (later rc, stable, or
|
|
3685
|
+
* unresolvable) versions are treated as possibly-marker-aware and
|
|
3686
|
+
* verified by the append probe.
|
|
3669
3687
|
* @param version - the installed peer version string.
|
|
3670
|
-
* @returns true for the known-
|
|
3688
|
+
* @returns true for the known-unsafe rc.1–rc.7 lines of `0.1.0` and
|
|
3689
|
+
* `0.1.1`, and the `0.1.2-alpha` line.
|
|
3671
3690
|
*/
|
|
3672
3691
|
function isUnmarkedHostVersion(version) {
|
|
3673
|
-
const
|
|
3674
|
-
|
|
3675
|
-
return Number(
|
|
3692
|
+
const v = version.trim();
|
|
3693
|
+
const rc = /^0\.1\.[01]-rc\.(\d+)$/.exec(v);
|
|
3694
|
+
if (rc !== null) return Number(rc[1]) <= 7;
|
|
3695
|
+
return /^0\.1\.2-alpha[.-]\d+$/.test(v);
|
|
3676
3696
|
}
|
|
3677
3697
|
/**
|
|
3678
3698
|
* Identity candidates for the `agents` match dimension, derived from the
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual-ruler call-id brand: host master renamed the dsh-llm `CallId`
|
|
3
|
+
* brand to `ToolCallId`, while the published 0.1.1-rc.2 line still
|
|
4
|
+
* exports `CallId`. Derive the brand from the dsh-tools execution
|
|
5
|
+
* contract so both rulers typecheck without naming either brand name.
|
|
6
|
+
* @module dsh-permission-rules/call-id
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolExecution } from '@deepseek-ai/dsh-tools';
|
|
9
|
+
export type CallId = ToolExecution['callId'];
|
|
10
|
+
//# sourceMappingURL=call-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-id.d.ts","sourceRoot":"","sources":["../../src/call-id.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA"}
|
package/lib/types/events.d.ts
CHANGED
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
* and `scripts/repair-session-logs.mjs` repairs already-polluted logs.
|
|
30
30
|
* @module dsh-permission-rules/events
|
|
31
31
|
*/
|
|
32
|
-
import type { CallId } from '@deepseek-ai/dsh-llm';
|
|
33
32
|
import type { PreToolDecision } from '@deepseek-ai/dsh-tools';
|
|
33
|
+
import type { CallId } from './call-id.js';
|
|
34
34
|
declare module '@deepseek-ai/dsh-session/types' {
|
|
35
35
|
interface SessionEventMap {
|
|
36
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,QAAQ,gCAAgC,CAAC;IAC9C,UAAU,eAAe;QACvB;;;;;;;;;;WAUG;QACH,0BAA0B,EAAE;YAC1B,QAAQ,EAAE,MAAM,CAAA;YAChB,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,MAAM,EAAE,MAAM,CAAA;YACd,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAA;YAChD,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;YAClC,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,GAAG,EAAE,MAAM,CAAA;YACX,MAAM,CAAC,EAAE,IAAI,CAAA;SACd,CAAA;QACD;;;;;;;;;;;WAWG;QACH,yBAAyB,EAAE;YACzB,IAAI,EAAE,OAAO,CAAA;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,UAAU,EAAE,OAAO,CAAA;YACnB,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,MAAM,EAAE,MAAM,CAAA;YACd,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;YACzB,IAAI,CAAC,EAAE,MAAM,CAAA;YACb,MAAM,EAAE,MAAM,GAAG,KAAK,CAAA;YACtB,IAAI,EAAE,MAAM,CAAA;YACZ,OAAO,EAAE,OAAO,CAAA;YAChB,MAAM,EAAE,MAAM,CAAA;YACd,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,IAAI,EAAE,MAAM,CAAA;SACb,CAAA;KACF;CACF;AAED,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAA;AAErE,iEAAiE;AACjE,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;AAErD,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,iFAAiF;IACjF,MAAM,CAAC,EAAE,IAAI,CAAA;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,KAAK,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,IAAI,EAAE,0BAA0B,EAChC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,IAAI,CAAA;CAAE,KAC3B,OAAO,CAAA;AAEZ;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAE3D"}
|
package/lib/types/proxy.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* (web tools get the real approval seam at `tools/pre-execute`).
|
|
15
15
|
* @module dsh-permission-rules/proxy
|
|
16
16
|
*/
|
|
17
|
-
import type { CallId } from '
|
|
17
|
+
import type { CallId } from './call-id.js';
|
|
18
18
|
import type { NetworkDecision, NetworkMode } from './network.js';
|
|
19
19
|
import type { NetworkTarget, SchemeName } from './rules.js';
|
|
20
20
|
/** Proxy environment variable names the injector sets/restores (uppercase + lowercase for mixed-ecosystem CLIs). */
|
package/lib/types/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/lib/types/runtime.d.ts
CHANGED
|
@@ -174,8 +174,11 @@ export declare class PermissionRulesRuntime {
|
|
|
174
174
|
* runtime therefore detects such hosts BEFORE the first append (peer
|
|
175
175
|
* version) and re-checks after the first append (returned envelope), then
|
|
176
176
|
* degrades: session-log audit is disabled with a one-time warning unless
|
|
177
|
-
* `allowUnmarkedAudit: true` opts back in. `
|
|
178
|
-
*
|
|
177
|
+
* `allowUnmarkedAudit: true` opts back in. The `0.1.2-alpha` line refuses
|
|
178
|
+
* plugin event types on read even when marked, so its version gate
|
|
179
|
+
* disables audit the same way (see `isUnmarkedHostVersion`). `source`
|
|
180
|
+
* names the matched rule's file, or the nearest effective file on a
|
|
181
|
+
* passthrough; `cwd`
|
|
179
182
|
* names the workspace the rules were resolved for; `dryRun` marks
|
|
180
183
|
* would-be deny/ask hits under `enforce: false`; `modeDefault` records a
|
|
181
184
|
* network mode-default decision on a web tool (no rule fired).
|
|
@@ -405,20 +408,30 @@ export declare class PermissionRulesRuntime {
|
|
|
405
408
|
*/
|
|
406
409
|
export declare function apply(ctx: Context, config: Config): Promise<void>;
|
|
407
410
|
/**
|
|
408
|
-
* Whether a `@deepseek-ai/dsh-session` version line
|
|
409
|
-
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
*
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
*
|
|
411
|
+
* Whether a `@deepseek-ai/dsh-session` version line cannot safely persist
|
|
412
|
+
* plugin audit events, either because it predates the `ignorable`
|
|
413
|
+
* envelope-marker surface or because its read path refuses out-of-vocabulary
|
|
414
|
+
* event types even when marked:
|
|
415
|
+
* - The released `0.1.0-rc.1`–`0.1.0-rc.7` lines silently drop the marker
|
|
416
|
+
* from `Session.append` options, so audit events written by those builds
|
|
417
|
+
* land unmarked and break resume on stricter hosts. `0.1.0-rc.8` and
|
|
418
|
+
* later stamp the marker. The `0.1.1-rc` line regressed the same way
|
|
419
|
+
* (verified on `0.1.1-rc.2` — the stamping fix exists only on harness
|
|
420
|
+
* master), so `0.1.1-rc.1`–`0.1.1-rc.7` are treated as unmarked too.
|
|
421
|
+
* - The `0.1.2-alpha` line refuses to interpret logs containing plugin
|
|
422
|
+
* event types even when the envelope carries `ignorable: true` (verified
|
|
423
|
+
* on `0.1.2-alpha-1`, reported by @rgw87 in issue #15), so audit events
|
|
424
|
+
* written there make the session unresumable on that host itself. The
|
|
425
|
+
* whole alpha line is treated as unsafe; over-refusal is harmless because
|
|
426
|
+
* `allowUnmarkedAudit: true` opts back in, and
|
|
427
|
+
* `scripts/repair-session-logs.mjs strip` removes already-written audit
|
|
428
|
+
* rows for hosts where the marker cannot help. On 0.1.2-alpha.2 the envelope field is restored for stored-log read compatibility only - its Session.append still cannot stamp the marker, so the gate behavior is unchanged. Extend the bound if a
|
|
429
|
+
* future alpha/rc line regresses. Non-matching (later rc, stable, or
|
|
430
|
+
* unresolvable) versions are treated as possibly-marker-aware and
|
|
431
|
+
* verified by the append probe.
|
|
420
432
|
* @param version - the installed peer version string.
|
|
421
|
-
* @returns true for the known-
|
|
433
|
+
* @returns true for the known-unsafe rc.1–rc.7 lines of `0.1.0` and
|
|
434
|
+
* `0.1.1`, and the `0.1.2-alpha` line.
|
|
422
435
|
*/
|
|
423
436
|
export declare function isUnmarkedHostVersion(version: string): boolean;
|
|
424
437
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-permission-rules",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Declarative Claude Code-style permission rules plus a Codex-style process-level network policy for DeepSeek Harness: ordered allow/deny/ask rules with tool-name, argument (glob/regex), workspace-path, and network-target (domain/ip/port/scheme) matching on the tools/pre-execute waterfall, a built-in local HTTP/CONNECT proxy governing shell subprocess traffic, three network modes mapped onto the official sandbox presets, full session-log audit, HMR rule reload, and a settings page with a rule editor, block counters, and recent interception lists.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"platform": "web",
|
|
46
46
|
"inject": [
|
|
47
47
|
"@deepseek-ai/dsh-client-connection",
|
|
48
|
-
"@deepseek-ai/dsh-client-
|
|
48
|
+
"@deepseek-ai/dsh-client-web",
|
|
49
49
|
"@deepseek-ai/dsh-client-locale",
|
|
50
50
|
"@deepseek-ai/dsh-client-ui-settings"
|
|
51
51
|
]
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
],
|
|
78
78
|
"compatibility": {
|
|
79
79
|
"dshVersions": [
|
|
80
|
-
"0.1.
|
|
80
|
+
"0.1.2-alpha.2"
|
|
81
81
|
]
|
|
82
82
|
},
|
|
83
83
|
"capability": {
|
|
@@ -130,8 +130,8 @@
|
|
|
130
130
|
"react": "^18.2.0",
|
|
131
131
|
"@deepseek-ai/dsh-client-connection": ">=0.1.1-rc.2 <0.2.0",
|
|
132
132
|
"@deepseek-ai/dsh-client-locale": ">=0.1.1-rc.2 <0.2.0",
|
|
133
|
-
"@deepseek-ai/dsh-client-
|
|
134
|
-
"@deepseek-ai/dsh-client-
|
|
133
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.1-rc.2 <0.2.0",
|
|
134
|
+
"@deepseek-ai/dsh-client-web": ">=0.1.1-rc.2 <0.2.0"
|
|
135
135
|
},
|
|
136
136
|
"peerDependenciesMeta": {
|
|
137
137
|
"@deepseek-ai/dsh-client-connection": {
|
|
@@ -140,10 +140,10 @@
|
|
|
140
140
|
"@deepseek-ai/dsh-client-locale": {
|
|
141
141
|
"optional": true
|
|
142
142
|
},
|
|
143
|
-
"@deepseek-ai/dsh-client-
|
|
143
|
+
"@deepseek-ai/dsh-client-ui-settings": {
|
|
144
144
|
"optional": true
|
|
145
145
|
},
|
|
146
|
-
"@deepseek-ai/dsh-client-
|
|
146
|
+
"@deepseek-ai/dsh-client-web": {
|
|
147
147
|
"optional": true
|
|
148
148
|
}
|
|
149
149
|
},
|
|
@@ -155,26 +155,26 @@
|
|
|
155
155
|
"yaml": "^2.8.0",
|
|
156
156
|
"zod": "^4.4.3"
|
|
157
157
|
},
|
|
158
|
-
"devDependencies": {
|
|
158
|
+
"devDependencies": {"@deepseek-ai/dsh-attachment": "0.1.2-alpha.2",
|
|
159
159
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
160
160
|
"@deepseek-ai/cordis-plugin-include": "1.0.6",
|
|
161
161
|
"@deepseek-ai/cordis-plugin-loader": "1.0.2",
|
|
162
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
163
|
-
"@deepseek-ai/dsh-brand": "0.1.
|
|
164
|
-
"@deepseek-ai/dsh-client-connection": "0.1.
|
|
165
|
-
"@deepseek-ai/dsh-client-locale": "0.1.
|
|
166
|
-
"@deepseek-ai/dsh-client-
|
|
167
|
-
"@deepseek-ai/dsh-client-ui-
|
|
168
|
-
"@deepseek-ai/dsh-client-
|
|
169
|
-
"@deepseek-ai/dsh-commands": "0.1.
|
|
170
|
-
"@deepseek-ai/dsh-invariants": "0.1.
|
|
171
|
-
"@deepseek-ai/dsh-llm": "0.1.
|
|
172
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
173
|
-
"@deepseek-ai/dsh-session-projection": "0.1.
|
|
174
|
-
"@deepseek-ai/dsh-subagent": "0.1.
|
|
175
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
176
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.
|
|
177
|
-
"@deepseek-ai/dsh-user-approval": "0.1.
|
|
162
|
+
"@deepseek-ai/dsh-agent": "0.1.2-alpha.2",
|
|
163
|
+
"@deepseek-ai/dsh-brand": "0.1.2-alpha.2",
|
|
164
|
+
"@deepseek-ai/dsh-client-connection": "0.1.2-alpha.2",
|
|
165
|
+
"@deepseek-ai/dsh-client-locale": "0.1.2-alpha.2",
|
|
166
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.2-alpha.2",
|
|
167
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.2-alpha.2",
|
|
168
|
+
"@deepseek-ai/dsh-client-web": "0.1.2-alpha.2",
|
|
169
|
+
"@deepseek-ai/dsh-commands": "0.1.2-alpha.2",
|
|
170
|
+
"@deepseek-ai/dsh-invariants": "0.1.2-alpha.2",
|
|
171
|
+
"@deepseek-ai/dsh-llm": "0.1.2-alpha.2",
|
|
172
|
+
"@deepseek-ai/dsh-session": "0.1.2-alpha.2",
|
|
173
|
+
"@deepseek-ai/dsh-session-projection": "0.1.2-alpha.2",
|
|
174
|
+
"@deepseek-ai/dsh-subagent": "0.1.2-alpha.2",
|
|
175
|
+
"@deepseek-ai/dsh-tools": "0.1.2-alpha.2",
|
|
176
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.2-alpha.2",
|
|
177
|
+
"@deepseek-ai/dsh-user-approval": "0.1.2-alpha.2",
|
|
178
178
|
"@deepseek-ai/schemastery": "^3.18.0",
|
|
179
179
|
"@eslint/js": "^10.0.1",
|
|
180
180
|
"@types/node": "^22.19.0",
|
|
@@ -199,5 +199,11 @@
|
|
|
199
199
|
"prepare": "node scripts/prepare.mjs"
|
|
200
200
|
},
|
|
201
201
|
"packageManager": "pnpm@11.7.0",
|
|
202
|
-
"license": "Apache-2.0"
|
|
202
|
+
"license": "Apache-2.0",
|
|
203
|
+
"funding": {
|
|
204
|
+
"type": "individual",
|
|
205
|
+
"url": "https://github.com/sponsors/PerryLink"
|
|
206
|
+
}
|
|
203
207
|
}
|
|
208
|
+
|
|
209
|
+
|
|
@@ -6,10 +6,18 @@
|
|
|
6
6
|
* `SessionFormatUnsupportedError` ("unknown to this harness and not marked
|
|
7
7
|
* ignorable").
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* `repair` rewrites ONLY the targeted log-only audit rows, adding
|
|
10
10
|
* `ignorable: true` to their envelopes; every other byte is preserved. Each
|
|
11
11
|
* modified artifact is backed up to `<file>.bak-<epoch>` before replacement.
|
|
12
12
|
*
|
|
13
|
+
* `strip` removes the targeted rows entirely. It exists for harness lines
|
|
14
|
+
* whose read path refuses out-of-vocabulary event types even when the
|
|
15
|
+
* envelope is marked (the `0.1.2-alpha` line, verified on `0.1.2-alpha-1` —
|
|
16
|
+
* issue #15): there the marker cannot help, and dropping the log-only audit
|
|
17
|
+
* rows is the only repair. The target vocabulary is reconstruction-safe by
|
|
18
|
+
* construction (never injected into the model context), so removal does not
|
|
19
|
+
* change how the session replays.
|
|
20
|
+
*
|
|
13
21
|
* It understands both physical encodings of the JSONL backend:
|
|
14
22
|
* - `session.jsonl.zstd` — a concatenation of checksummed Zstandard frames
|
|
15
23
|
* (frame 1 = header line, later frames = durable append batches); each
|
|
@@ -20,6 +28,7 @@
|
|
|
20
28
|
* Usage:
|
|
21
29
|
* node scripts/repair-session-logs.mjs scan [--home DIR] # report foreign rows, change nothing
|
|
22
30
|
* node scripts/repair-session-logs.mjs repair [--home DIR] [--dry-run]
|
|
31
|
+
* node scripts/repair-session-logs.mjs strip [--home DIR] [--dry-run]
|
|
23
32
|
* node scripts/repair-session-logs.mjs repair --types a/b,c/d
|
|
24
33
|
*
|
|
25
34
|
* `--home` defaults to `$env:DSH_HOME/sessions` or `~/.dsh/sessions`.
|
|
@@ -171,37 +180,44 @@ function splitLines(text) {
|
|
|
171
180
|
}
|
|
172
181
|
|
|
173
182
|
/**
|
|
174
|
-
* Apply the ignorable marker to targeted audit rows in one JSONL frame
|
|
183
|
+
* Apply the ignorable marker to targeted audit rows in one JSONL frame, or
|
|
184
|
+
* drop them outright in strip mode (for harness lines that refuse marked
|
|
185
|
+
* plugin events, e.g. the 0.1.2-alpha line).
|
|
175
186
|
* @param {string} text - the frame plaintext.
|
|
176
187
|
* @param {Set<string>} targetTypes - event types to mark.
|
|
177
188
|
* @param {Map<string, number>} foreignSeen - scan accumulator: type -> row count.
|
|
189
|
+
* @param {boolean} strip - remove targeted rows instead of marking them.
|
|
178
190
|
* @returns {{ text: string, changed: number }}
|
|
179
191
|
*/
|
|
180
|
-
function filterFrame(text, targetTypes, foreignSeen) {
|
|
192
|
+
function filterFrame(text, targetTypes, foreignSeen, strip) {
|
|
181
193
|
const lines = splitLines(text)
|
|
182
194
|
let changed = 0
|
|
183
|
-
const out = lines.
|
|
184
|
-
if (line.length === 0) return line
|
|
195
|
+
const out = lines.flatMap(line => {
|
|
196
|
+
if (line.length === 0) return [line]
|
|
185
197
|
let row
|
|
186
198
|
try {
|
|
187
199
|
row = JSON.parse(line)
|
|
188
200
|
} catch {
|
|
189
|
-
return line // preserve unparsable bytes exactly; the reader owns the refusal
|
|
201
|
+
return [line] // preserve unparsable bytes exactly; the reader owns the refusal
|
|
190
202
|
}
|
|
191
|
-
if (typeof row !== 'object' || row === null) return line
|
|
203
|
+
if (typeof row !== 'object' || row === null) return [line]
|
|
192
204
|
const type = row.type
|
|
193
|
-
if (typeof type !== 'string' || STORAGE_ROW_TYPES.has(type)) return line
|
|
194
|
-
if (type === 'session') return line // header row: never an event
|
|
205
|
+
if (typeof type !== 'string' || STORAGE_ROW_TYPES.has(type)) return [line]
|
|
206
|
+
if (type === 'session') return [line] // header row: never an event
|
|
195
207
|
if (!KNOWN_SESSION_EVENT_TYPES.has(type)) {
|
|
196
208
|
foreignSeen.set(type, (foreignSeen.get(type) ?? 0) + 1)
|
|
197
209
|
}
|
|
198
210
|
if (targetTypes.has(type)) {
|
|
199
|
-
if (
|
|
211
|
+
if (strip) {
|
|
212
|
+
changed += 1
|
|
213
|
+
return []
|
|
214
|
+
}
|
|
215
|
+
if (row.ignorable === true) return [line]
|
|
200
216
|
row.ignorable = true
|
|
201
217
|
changed += 1
|
|
202
|
-
return JSON.stringify(row)
|
|
218
|
+
return [JSON.stringify(row)]
|
|
203
219
|
}
|
|
204
|
-
return line
|
|
220
|
+
return [line]
|
|
205
221
|
})
|
|
206
222
|
return { text: out.join('\n') + '\n', changed }
|
|
207
223
|
}
|
|
@@ -249,7 +265,7 @@ function parseArgs(argv) {
|
|
|
249
265
|
const args = { mode: undefined, home: undefined, dryRun: false, types: DEFAULT_TARGET_TYPES }
|
|
250
266
|
for (let i = 0; i < argv.length; i++) {
|
|
251
267
|
const arg = argv[i]
|
|
252
|
-
if (arg === 'scan' || arg === 'repair') args.mode = arg
|
|
268
|
+
if (arg === 'scan' || arg === 'repair' || arg === 'strip') args.mode = arg
|
|
253
269
|
else if (arg === '--home') args.home = argv[++i]
|
|
254
270
|
else if (arg === '--dry-run') args.dryRun = true
|
|
255
271
|
else if (arg === '--types') args.types = argv[++i].split(',')
|
|
@@ -258,7 +274,7 @@ function parseArgs(argv) {
|
|
|
258
274
|
}
|
|
259
275
|
|
|
260
276
|
function usage() {
|
|
261
|
-
console.error('usage: node repair-session-logs.mjs scan|repair [--home DIR] [--dry-run] [--types a/b,c/d]')
|
|
277
|
+
console.error('usage: node repair-session-logs.mjs scan|repair|strip [--home DIR] [--dry-run] [--types a/b,c/d]')
|
|
262
278
|
process.exit(2)
|
|
263
279
|
}
|
|
264
280
|
|
|
@@ -297,8 +313,9 @@ for (const path of logs) {
|
|
|
297
313
|
}
|
|
298
314
|
let fileChanged = 0
|
|
299
315
|
const newFrames = []
|
|
316
|
+
const strip = args.mode === 'strip'
|
|
300
317
|
for (const frame of log.frames) {
|
|
301
|
-
const { text, changed } = filterFrame(frame.text, targetTypes, foreignSeen)
|
|
318
|
+
const { text, changed } = filterFrame(frame.text, targetTypes, foreignSeen, strip)
|
|
302
319
|
newFrames.push({ ...frame, text })
|
|
303
320
|
fileChanged += changed
|
|
304
321
|
}
|
|
@@ -306,16 +323,16 @@ for (const path of logs) {
|
|
|
306
323
|
if (fileChanged > 0) {
|
|
307
324
|
affectedFiles += 1
|
|
308
325
|
marked += fileChanged
|
|
309
|
-
if (args.mode
|
|
326
|
+
if (args.mode !== 'scan' && !args.dryRun) {
|
|
310
327
|
const backup = `${path}.bak-${Date.now()}`
|
|
311
328
|
renameSync(path, backup)
|
|
312
329
|
const content = log.compressed
|
|
313
330
|
? Buffer.concat(newFrames.map(frame => zstdCompressSync(frame.text, CHECKSUM_OPTIONS)))
|
|
314
331
|
: Buffer.from(newFrames[0].text, 'utf8')
|
|
315
332
|
writeFileSync(path, content)
|
|
316
|
-
console.log(
|
|
333
|
+
console.log(`${strip ? 'stripped' : 'repaired'} ${path} (${fileChanged} row(s) ${strip ? 'removed' : 'marked ignorable'}; backup: ${backup})`)
|
|
317
334
|
} else {
|
|
318
|
-
console.log(
|
|
335
|
+
console.log(`[${args.dryRun ? 'dry-run' : 'scan'}] would ${strip ? 'strip' : 'repair'} ${path}: ${fileChanged} row(s)`)
|
|
319
336
|
}
|
|
320
337
|
}
|
|
321
338
|
}
|
|
@@ -328,5 +345,7 @@ if (foreignSeen.size > 0) {
|
|
|
328
345
|
}
|
|
329
346
|
}
|
|
330
347
|
for (const failure of failures) console.error(`error: ${failure}`)
|
|
331
|
-
|
|
348
|
+
const verb = args.mode === 'strip' ? 'stripped' : 'marked'
|
|
349
|
+
const past = args.mode !== 'scan' && !args.dryRun ? ` (${verb})` : ''
|
|
350
|
+
console.log(`\n${scanned} log(s) scanned, ${affectedFiles} affected, ${marked} row(s) would be ${verb}${past}`)
|
|
332
351
|
process.exit(failures.length > 0 ? 1 : 0)
|
package/src/call-id.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dual-ruler call-id brand: host master renamed the dsh-llm `CallId`
|
|
3
|
+
* brand to `ToolCallId`, while the published 0.1.1-rc.2 line still
|
|
4
|
+
* exports `CallId`. Derive the brand from the dsh-tools execution
|
|
5
|
+
* contract so both rulers typecheck without naming either brand name.
|
|
6
|
+
* @module dsh-permission-rules/call-id
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { ToolExecution } from '@deepseek-ai/dsh-tools'
|
|
10
|
+
|
|
11
|
+
export type CallId = ToolExecution['callId']
|
package/src/events.ts
CHANGED
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
* @module dsh-permission-rules/events
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
-
import type { CallId } from '@deepseek-ai/dsh-llm'
|
|
34
33
|
import type { PreToolDecision } from '@deepseek-ai/dsh-tools'
|
|
34
|
+
import type { CallId } from './call-id.ts'
|
|
35
35
|
|
|
36
36
|
declare module '@deepseek-ai/dsh-session/types' {
|
|
37
37
|
interface SessionEventMap {
|