@yadsh/dsh-qa-surface 0.1.0 → 0.2.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.
- package/CHANGELOG.md +83 -0
- package/README.md +162 -14
- package/SPEC-dsh-qa-surface.md +600 -96
- package/capability-policy.json +5 -0
- package/compatibility.json +7 -1
- package/cordis.patch.yml +11 -0
- package/docs/ARCHITECTURE.md +49 -7
- package/docs/COMPATIBILITY.md +5 -4
- package/docs/CONFIGURATION.md +96 -2
- package/lib/attestation.js +10 -0
- package/lib/attestation.js.map +1 -0
- package/lib/client/QaConfigController.js +111 -4
- package/lib/client/QaConfigController.js.map +1 -1
- package/lib/client/QaSessionController.js +501 -119
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +137 -20
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +534 -45
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/attestation.js +60 -0
- package/lib/client/attestation.js.map +1 -0
- package/lib/client/chat-index.js +86 -0
- package/lib/client/chat-index.js.map +1 -0
- package/lib/client/components/Markdown.js +75 -5
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaAgentsDrawer.js +40 -0
- package/lib/client/components/QaAgentsDrawer.js.map +1 -0
- package/lib/client/components/QaComposer.js +132 -15
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaMessage.js +184 -10
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaSidebar.js +124 -0
- package/lib/client/components/QaSidebar.js.map +1 -0
- package/lib/client/components/QaSourcesDrawer.js +46 -0
- package/lib/client/components/QaSourcesDrawer.js.map +1 -0
- package/lib/client/components/QaWorkGroup.js +135 -0
- package/lib/client/components/QaWorkGroup.js.map +1 -0
- package/lib/client/components/VariantSwitcher.js +29 -0
- package/lib/client/components/VariantSwitcher.js.map +1 -0
- package/lib/client/components/format.js +48 -0
- package/lib/client/components/format.js.map +1 -0
- package/lib/client/index.js +77 -34
- package/lib/client/index.js.map +1 -1
- package/lib/client/styles.js +308 -43
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js +13 -0
- package/lib/client/types.js.map +1 -0
- package/lib/client/wait-for.js +49 -0
- package/lib/client/wait-for.js.map +1 -0
- package/lib/client.js +8228 -383
- package/lib/client.js.map +1 -1
- package/lib/config.js +61 -9
- package/lib/config.js.map +1 -1
- package/lib/index.js +166 -70
- package/lib/index.js.map +1 -1
- package/lib/lockdown-policy.js +20 -0
- package/lib/lockdown-policy.js.map +1 -0
- package/lib/resolve-config.js +122 -10
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +170 -0
- package/lib/secure-session.js.map +1 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +191 -0
- package/lib/typert.remote-client.d.ts +24 -0
- package/lib/typert.remote-client.js +129 -0
- package/lib/types/attestation.d.ts +17 -0
- package/lib/types/client/QaConfigController.d.ts +34 -2
- package/lib/types/client/QaSessionController.d.ts +106 -19
- package/lib/types/client/QaSurface.d.ts +5 -4
- package/lib/types/client/QaTranscriptAdapter.d.ts +17 -2
- package/lib/types/client/attestation.d.ts +25 -0
- package/lib/types/client/chat-index.d.ts +28 -0
- package/lib/types/client/components/Markdown.d.ts +7 -3
- package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
- package/lib/types/client/components/QaComposer.d.ts +12 -2
- package/lib/types/client/components/QaMessage.d.ts +14 -1
- package/lib/types/client/components/QaSidebar.d.ts +41 -0
- package/lib/types/client/components/QaSourcesDrawer.d.ts +8 -0
- package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
- package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
- package/lib/types/client/components/format.d.ts +9 -0
- package/lib/types/client/index.d.ts +1 -5
- package/lib/types/client/types.d.ts +29 -0
- package/lib/types/client/wait-for.d.ts +11 -0
- package/lib/types/index.d.ts +22 -6
- package/lib/types/lockdown-policy.d.ts +18 -0
- package/lib/types/secure-session.d.ts +22 -0
- package/lib/types/types.d.ts +148 -1
- package/package.json +76 -52
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAA4B,MAAM,CAAC,MAAM,CAC7E;IACE,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAA4B,MAAM,CAAC,MAAM,CAC7E;IACE,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,IAAI;QACb,UAAU,EACR,sGAAsG;KACzG,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,MAAM,EAAE,oBAAoB;QAC5B,UAAU,EAAE,wBAAwB;QACpC,GAAG,EAAE,IAAI;QACT,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,eAAe,EAAE,IAAI;KACtB,CAAC;IACF,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;QAChB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,GAAG;QACpB,eAAe,EAAE,KAAK;KACvB,CAAC;IACF,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC;QAChC,gBAAgB;QAChB,gBAAgB;QAChB,8BAA8B;KAC/B,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;QACzB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,aAAa;KACzB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,IAAI;QACb,uBAAuB,EAAE,IAAI;QAC7B,qBAAqB,EAAE,IAAI;QAC3B,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,WAAW;QACxB,cAAc,EAAE,OAAO;QACvB,gBAAgB,EAAE,cAAc;QAChC,sBAAsB,EAAE,KAAK;QAC7B,kBAAkB,EAAE,KAAK;QACzB,qBAAqB,EAAE,KAAK;QAC5B,iBAAiB,EAAE,KAAK;QACxB,kBAAkB,EAAE,KAAK;QACzB,kBAAkB,EAAE,KAAK;QACzB,yBAAyB,EAAE,KAAK;QAChC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;SACzB,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;CACnD,CACF,CAAC;AAEF,SAAS,YAAY,CAAC,KAAgC;IACpD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpC,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACzE,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,SAAS,CACjB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,MAAyB;IAChD,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAChE,CAAC;IACF,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,SAAS,CACjB,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,MAAyB;IAChD,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAChE,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,SAAS,GAAG,kBAAkB,CAClC,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAC1D,CAAC;IACF,MAAM,MAAM,GACV,KAAK,CAAC,OAAO,EAAE,MAAM,IAAI,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC;IACpE,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,OAAO,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,SAAS,CACjB,qEAAqE,CACtE,CAAC;IACJ,CAAC;IACD,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,SAAS,CACjB,gEAAgE,CACjE,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,WAAW,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CACjB,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,SAAS,CACjB,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GACd,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;QACjC,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC;IAC/C,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,eAAe,GACnB,KAAK,CAAC,EAAE,EAAE,eAAe,IAAI,yBAAyB,CAAC,EAAE,CAAC,eAAe,CAAC;IAC5E,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC;QACtC,eAAe,GAAG,GAAG;QACrB,eAAe,GAAG,IAAI,EACtB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GACnB,KAAK,CAAC,QAAQ,EAAE,OAAO,IAAI,yBAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC;IACxE,MAAM,WAAW,GAAG,KAAK,CAAC,QACqB,CAAC;IAChD,MAAM,wBAAwB,GAAG;QAC/B,CAAC,wBAAwB,EAAE,WAAW,EAAE,sBAAsB,CAAC;QAC/D,CAAC,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,CAAC;QACvD,CAAC,uBAAuB,EAAE,WAAW,EAAE,qBAAqB,CAAC;QAC7D,CAAC,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,CAAC;QACvD,CAAC,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,CAAC;QACvD,CAAC,2BAA2B,EAAE,WAAW,EAAE,yBAAyB,CAAC;KAC7D,CAAC;IACX,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAC9B,CAAC;IACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CACjB,4BAA4B,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAChE,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,QAAQ,EAAE,WAAW,KAAK,SAAS;QACzC,KAAK,CAAC,QAAQ,CAAC,WAAW,KAAK,WAAW,EAC1C,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,wDAAwD,CACzD,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,QAAQ,EAAE,cAAc,KAAK,SAAS;QAC5C,KAAK,CAAC,QAAQ,CAAC,cAAc,KAAK,OAAO,EACzC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,uDAAuD,CACxD,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,KAAK,SAAS;QAC9C,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,YAAY,EAC/C,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,MAAM,gBAAgB,GACpB,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE;QACxC,yBAAyB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACtD,IAAI,eAAe,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,iBAAiB,GACrB,KAAK,CAAC,QAAQ,EAAE,iBAAiB;QACjC,yBAAyB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACvD,IACE,eAAe;QACf,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,IAAI,yBAAyB,CAAC,EAAE,CAAC,SAAS,CAAC;QAC/D,CAAC,iBAAiB,EAClB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,yBAAyB,CAAC,OAAO;QAC3D,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,SAAS;YACf,aAAa,EACX,KAAK,CAAC,KAAK,EAAE,aAAa;gBAC1B,yBAAyB,CAAC,KAAK,CAAC,aAAa;SAChD,CAAC;QACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,KAAK,EACH,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC7B,yBAAyB,CAAC,QAAQ,CAAC,KAAK;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;YAChD,cAAc,EACZ,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE;gBACtC,yBAAyB,CAAC,QAAQ,CAAC,cAAc;YACnD,WAAW,EACT,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE;gBACnC,yBAAyB,CAAC,QAAQ,CAAC,WAAW;YAChD,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC9C,kEAAkE;YAClE,yCAAyC;YACzC,UAAU,EACR,KAAK,CAAC,QAAQ,EAAE,UAAU,KAAK,SAAS;gBACtC,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,UAAU;gBAC/C,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;SACtD,CAAC;QACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;YACrB,MAAM;YACN,UAAU;YACV,GAAG;YACH,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC;YACrD,cAAc;YACd,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC;YACrD,QAAQ;YACR,KAAK;YACL,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC;SAC9D,CAAC;QACF,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;YAChB,UAAU,EACR,KAAK,CAAC,EAAE,EAAE,UAAU,IAAI,yBAAyB,CAAC,EAAE,CAAC,UAAU;YACjE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,IAAI,yBAAyB,CAAC,EAAE,CAAC,SAAS;YACxE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,IAAI,yBAAyB,CAAC,EAAE,CAAC,QAAQ;YACrE,cAAc,EACZ,KAAK,CAAC,EAAE,EAAE,cAAc,IAAI,yBAAyB,CAAC,EAAE,CAAC,cAAc;YACzE,gBAAgB,EACd,KAAK,CAAC,EAAE,EAAE,gBAAgB;gBAC1B,yBAAyB,CAAC,EAAE,CAAC,gBAAgB;YAC/C,aAAa,EACX,KAAK,CAAC,EAAE,EAAE,aAAa,IAAI,yBAAyB,CAAC,EAAE,CAAC,aAAa;YACvE,cAAc,EACZ,KAAK,CAAC,EAAE,EAAE,cAAc,IAAI,yBAAyB,CAAC,EAAE,CAAC,cAAc;YACzE,eAAe;YACf,eAAe,EACb,KAAK,CAAC,EAAE,EAAE,eAAe;gBACzB,yBAAyB,CAAC,EAAE,CAAC,eAAe;SAC/C,CAAC;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;YACzB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,aAAa;SACzB,CAAC;QACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,OAAO,EAAE,eAAe;YACxB,uBAAuB,EACrB,KAAK,CAAC,QAAQ,EAAE,uBAAuB;gBACvC,yBAAyB,CAAC,QAAQ,CAAC,uBAAuB;YAC5D,qBAAqB,EACnB,KAAK,CAAC,QAAQ,EAAE,qBAAqB;gBACrC,yBAAyB,CAAC,QAAQ,CAAC,qBAAqB;YAC1D,iBAAiB,EACf,KAAK,CAAC,QAAQ,EAAE,iBAAiB;gBACjC,yBAAyB,CAAC,QAAQ,CAAC,iBAAiB;YACtD,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,OAAO;YACvB,gBAAgB;YAChB,sBAAsB,EAAE,KAAK;YAC7B,kBAAkB,EAAE,KAAK;YACzB,qBAAqB,EAAE,KAAK;YAC5B,iBAAiB;YACjB,kBAAkB,EAAE,KAAK;YACzB,kBAAkB,EAAE,KAAK;YACzB,yBAAyB,EAAE,KAAK;YAChC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;gBACxB,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;aAChE,CAAC;SACH,CAAC;QACF,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;YACvB,cAAc,EAAE,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC;SAC9D,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { SessionId } from "@deepseek-ai/dsh-session";
|
|
2
|
+
import { WorkspaceId } from "@deepseek-ai/dsh-workspace";
|
|
3
|
+
import { QaAttestationError } from "./attestation.js";
|
|
4
|
+
import { qaToolDenial, qaToolPolicyPlan } from "./lockdown-policy.js";
|
|
5
|
+
/** Grace period in which a fresh session may still be pinned to the QA preset. */
|
|
6
|
+
const FRESH_SESSION_BOOTSTRAP_WINDOW_MS = 120_000;
|
|
7
|
+
/**
|
|
8
|
+
* Compare session cwds the way the host records them: separator- and
|
|
9
|
+
* case-normalized on Windows, so a deployment path written with either
|
|
10
|
+
* separator or case still matches the session header cwd.
|
|
11
|
+
*/
|
|
12
|
+
function cwdMatches(headerCwd, pinned) {
|
|
13
|
+
if (headerCwd === undefined)
|
|
14
|
+
return false;
|
|
15
|
+
const normalize = (value) => value.replaceAll("\\", "/").replace(/\/+$/u, "");
|
|
16
|
+
const left = normalize(headerCwd);
|
|
17
|
+
const right = normalize(pinned);
|
|
18
|
+
return process.platform === "win32"
|
|
19
|
+
? left.toLowerCase() === right.toLowerCase()
|
|
20
|
+
: left === right;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Host-side QA policy admission boundary — the only browser-callable operation
|
|
24
|
+
* that turns a session into a locked QA session. It verifies the immutable
|
|
25
|
+
* session composition against the effective deployment config, refuses to
|
|
26
|
+
* adopt a non-QA session with user history, validates the named permission
|
|
27
|
+
* preset, pins the scoped tool restriction plus the monotonic execution guard,
|
|
28
|
+
* and returns a sanitized proof. Every refusal carries only a coarse reason.
|
|
29
|
+
*/
|
|
30
|
+
export class QaPolicyAdmission {
|
|
31
|
+
ctx;
|
|
32
|
+
config;
|
|
33
|
+
logger;
|
|
34
|
+
appliedPolicies = new Map();
|
|
35
|
+
constructor(ctx, config, logger) {
|
|
36
|
+
this.ctx = ctx;
|
|
37
|
+
this.config = config;
|
|
38
|
+
this.logger = logger;
|
|
39
|
+
ctx.on("agent/disposed", ({ agent }) => {
|
|
40
|
+
this.appliedPolicies.delete(agent);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
secureSession(sessionId) {
|
|
44
|
+
const config = this.config();
|
|
45
|
+
const lockdown = config.lockdown;
|
|
46
|
+
const agent = this.ctx.agents.get(SessionId(sessionId));
|
|
47
|
+
if (agent === undefined) {
|
|
48
|
+
throw new QaAttestationError("agent-unavailable", "agent is unavailable");
|
|
49
|
+
}
|
|
50
|
+
if (!lockdown.enabled) {
|
|
51
|
+
return {
|
|
52
|
+
sessionId,
|
|
53
|
+
enabled: false,
|
|
54
|
+
agentPresetMatches: true,
|
|
55
|
+
workspaceMatches: true,
|
|
56
|
+
modelMatches: true,
|
|
57
|
+
sandboxIsReadOnly: false,
|
|
58
|
+
approvalIsNever: false,
|
|
59
|
+
permissionPreset: "",
|
|
60
|
+
toolPolicyLoaded: false,
|
|
61
|
+
toolAllowList: [],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const expectedWorkspace = config.session.workspaceId;
|
|
65
|
+
const pinnedWorkspace = expectedWorkspace === null
|
|
66
|
+
? undefined
|
|
67
|
+
: this.ctx.workspaceRegistry.get(WorkspaceId(expectedWorkspace));
|
|
68
|
+
// A pin that resolves to nothing would refuse the cwd comparison anyway,
|
|
69
|
+
// but the precise reason saves an operator a round trip: the surface
|
|
70
|
+
// stays closed until the workspace exists or the id is fixed.
|
|
71
|
+
if (expectedWorkspace !== null && pinnedWorkspace === undefined) {
|
|
72
|
+
throw new QaAttestationError("workspace-unavailable", `workspace ${expectedWorkspace} is not registered`);
|
|
73
|
+
}
|
|
74
|
+
const expectedPreset = config.session.agentPreset;
|
|
75
|
+
const agentPresetMatches = !lockdown.enforceFixedAgentPreset ||
|
|
76
|
+
expectedPreset === null ||
|
|
77
|
+
this.ctx.agentPresets.composedPreset(agent.ctx) === expectedPreset;
|
|
78
|
+
const workspaceMatches = !lockdown.enforceFixedWorkspace ||
|
|
79
|
+
(expectedWorkspace === null && config.session.cwd === null) ||
|
|
80
|
+
(pinnedWorkspace !== undefined &&
|
|
81
|
+
cwdMatches(agent.session.header.cwd, pinnedWorkspace.path)) ||
|
|
82
|
+
(expectedWorkspace === null &&
|
|
83
|
+
config.session.cwd !== null &&
|
|
84
|
+
cwdMatches(agent.session.header.cwd, config.session.cwd));
|
|
85
|
+
const options = agent.options;
|
|
86
|
+
const modelMatches = !lockdown.enforceFixedModel ||
|
|
87
|
+
config.session.provider === null ||
|
|
88
|
+
(options.provider === config.session.provider &&
|
|
89
|
+
options.model === config.session.model &&
|
|
90
|
+
(config.session.reasoningEffort === null ||
|
|
91
|
+
options.reasoningEffort === config.session.reasoningEffort));
|
|
92
|
+
if (!agentPresetMatches || !workspaceMatches || !modelMatches) {
|
|
93
|
+
throw new QaAttestationError("composition-mismatch", `composition mismatch: agent=${agentPresetMatches} workspace=${workspaceMatches} model=${modelMatches}`);
|
|
94
|
+
}
|
|
95
|
+
const permission = this.ctx.permissionPresets.resolve(lockdown.permissionPreset);
|
|
96
|
+
if (permission.sandbox !== lockdown.sandboxMode ||
|
|
97
|
+
permission.approval !== lockdown.approvalPolicy) {
|
|
98
|
+
throw new QaAttestationError("permission-preset", `permission preset ${lockdown.permissionPreset} does not resolve to read-only/never`);
|
|
99
|
+
}
|
|
100
|
+
const currentPermission = this.ctx.permissionPresets.current(agent.session.events);
|
|
101
|
+
const hasUserHistory = agent.session.events.some((event) => event.type === "user/message");
|
|
102
|
+
if (currentPermission !== lockdown.permissionPreset &&
|
|
103
|
+
(hasUserHistory ||
|
|
104
|
+
Date.now() - agent.session.header.createdAt >
|
|
105
|
+
FRESH_SESSION_BOOTSTRAP_WINDOW_MS)) {
|
|
106
|
+
throw new QaAttestationError("adoption-refused", "existing non-QA session cannot be adopted");
|
|
107
|
+
}
|
|
108
|
+
const policy = qaToolPolicyPlan(lockdown.toolPolicy.allow, (toolName) => this.ctx.tools.get(toolName, agent) !== undefined);
|
|
109
|
+
if (policy.unknown.length > 0) {
|
|
110
|
+
throw new QaAttestationError("unknown-tools", `unknown QA tool(s): ${policy.unknown.join(", ")}`);
|
|
111
|
+
}
|
|
112
|
+
const fingerprint = JSON.stringify(policy.allow);
|
|
113
|
+
const prior = this.appliedPolicies.get(agent);
|
|
114
|
+
if (prior?.fingerprint !== fingerprint) {
|
|
115
|
+
const allowed = new Set(policy.allow);
|
|
116
|
+
const disposeGuard = agent.ctx.tools.guard((execution) => qaToolDenial(allowed, execution.name));
|
|
117
|
+
try {
|
|
118
|
+
const disposeRestriction = agent.ctx.tools.restrict({
|
|
119
|
+
allow: policy.allow,
|
|
120
|
+
});
|
|
121
|
+
this.appliedPolicies.set(agent, {
|
|
122
|
+
fingerprint,
|
|
123
|
+
disposeGuard,
|
|
124
|
+
disposeRestriction,
|
|
125
|
+
});
|
|
126
|
+
prior?.disposeRestriction();
|
|
127
|
+
prior?.disposeGuard();
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
disposeGuard();
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
this.ctx.permissionPresets.set(agent.session, lockdown.permissionPreset);
|
|
135
|
+
const effectivePermission = this.ctx.permissionPresets.current(agent.session.events);
|
|
136
|
+
const sandboxIsReadOnly = permission.sandbox === "read-only";
|
|
137
|
+
const approvalIsNever = permission.approval === "never";
|
|
138
|
+
if (effectivePermission !== lockdown.permissionPreset ||
|
|
139
|
+
!sandboxIsReadOnly ||
|
|
140
|
+
!approvalIsNever) {
|
|
141
|
+
throw new QaAttestationError("attestation-failed", "permission attestation failed");
|
|
142
|
+
}
|
|
143
|
+
this.logger.debug("lockdown.attested", {
|
|
144
|
+
sessionId,
|
|
145
|
+
permissionPreset: lockdown.permissionPreset,
|
|
146
|
+
toolAllowList: policy.allow,
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
sessionId,
|
|
150
|
+
enabled: true,
|
|
151
|
+
agentPresetMatches,
|
|
152
|
+
workspaceMatches,
|
|
153
|
+
modelMatches,
|
|
154
|
+
sandboxIsReadOnly,
|
|
155
|
+
approvalIsNever,
|
|
156
|
+
permissionPreset: lockdown.permissionPreset,
|
|
157
|
+
toolPolicyLoaded: true,
|
|
158
|
+
toolAllowList: policy.allow,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** Detach every pinned tool policy; wired as a disposal effect by the entry. */
|
|
162
|
+
dispose() {
|
|
163
|
+
for (const policy of this.appliedPolicies.values()) {
|
|
164
|
+
policy.disposeRestriction();
|
|
165
|
+
policy.disposeGuard();
|
|
166
|
+
}
|
|
167
|
+
this.appliedPolicies.clear();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=secure-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-session.js","sourceRoot":"","sources":["../src/secure-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from FaceModel — do not edit. */
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const _yadsh_dsh_qa_surface_qaSurface_describe_result$schema = z.object({
|
|
5
|
+
'enabled': z.boolean().readonly(),
|
|
6
|
+
'route': z.object({
|
|
7
|
+
'path': z.string().readonly(),
|
|
8
|
+
'matchChildren': z.boolean().readonly(),
|
|
9
|
+
}).readonly(),
|
|
10
|
+
'branding': z.object({
|
|
11
|
+
'title': z.string().readonly(),
|
|
12
|
+
'subtitle': z.string().readonly(),
|
|
13
|
+
'welcomeMessage': z.string().readonly(),
|
|
14
|
+
'placeholder': z.string().readonly(),
|
|
15
|
+
'logoUrl': z.union([z.literal(null), z.string()]).readonly(),
|
|
16
|
+
'disclaimer': z.string().readonly(),
|
|
17
|
+
}).readonly(),
|
|
18
|
+
'session': z.object({
|
|
19
|
+
'policy': z.union([z.literal("browser-persistent"), z.literal("new-on-load"), z.literal("fixed")]).readonly(),
|
|
20
|
+
'storageKey': z.string().readonly(),
|
|
21
|
+
'cwd': z.union([z.literal(null), z.string()]).readonly(),
|
|
22
|
+
'workspaceId': z.union([z.literal(null), z.string()]).readonly(),
|
|
23
|
+
'fixedSessionId': z.union([z.literal(null), z.string()]).readonly(),
|
|
24
|
+
'agentPreset': z.union([z.literal(null), z.string()]).readonly(),
|
|
25
|
+
'provider': z.union([z.literal(null), z.string()]).readonly(),
|
|
26
|
+
'model': z.union([z.literal(null), z.string()]).readonly(),
|
|
27
|
+
'reasoningEffort': z.union([z.literal(null), z.string()]).readonly(),
|
|
28
|
+
}).readonly(),
|
|
29
|
+
'ui': z.object({
|
|
30
|
+
'showHeader': z.boolean().readonly(),
|
|
31
|
+
'showReset': z.boolean().readonly(),
|
|
32
|
+
'showStop': z.boolean().readonly(),
|
|
33
|
+
'showTimestamps': z.boolean().readonly(),
|
|
34
|
+
'showToolActivity': z.boolean().readonly(),
|
|
35
|
+
'showReasoning': z.boolean().readonly(),
|
|
36
|
+
'renderMarkdown': z.boolean().readonly(),
|
|
37
|
+
'maxContentWidth': z.number().readonly(),
|
|
38
|
+
'showSessionList': z.boolean().readonly(),
|
|
39
|
+
}).readonly(),
|
|
40
|
+
'suggestedQuestions': z.array(z.string()).readonly(),
|
|
41
|
+
'interaction': z.object({
|
|
42
|
+
'approvals': z.literal("blocked").readonly(),
|
|
43
|
+
'questions': z.literal("unsupported").readonly(),
|
|
44
|
+
}).readonly(),
|
|
45
|
+
'lockdown': z.object({
|
|
46
|
+
'enabled': z.boolean().readonly(),
|
|
47
|
+
'enforceFixedAgentPreset': z.boolean().readonly(),
|
|
48
|
+
'enforceFixedWorkspace': z.boolean().readonly(),
|
|
49
|
+
'enforceFixedModel': z.boolean().readonly(),
|
|
50
|
+
'sandboxMode': z.literal("read-only").readonly(),
|
|
51
|
+
'approvalPolicy': z.literal("never").readonly(),
|
|
52
|
+
'permissionPreset': z.string().readonly(),
|
|
53
|
+
'allowPermissionChanges': z.literal(false).readonly(),
|
|
54
|
+
'allowSlashCommands': z.literal(false).readonly(),
|
|
55
|
+
'allowSettingsMutation': z.literal(false).readonly(),
|
|
56
|
+
'allowSessionReset': z.boolean().readonly(),
|
|
57
|
+
'allowSessionRename': z.literal(false).readonly(),
|
|
58
|
+
'allowSessionDelete': z.literal(false).readonly(),
|
|
59
|
+
'allowArbitrarySessionOpen': z.literal(false).readonly(),
|
|
60
|
+
'toolPolicy': z.object({
|
|
61
|
+
'mode': z.literal("allow-list").readonly(),
|
|
62
|
+
'allow': z.array(z.string()).readonly(),
|
|
63
|
+
}).readonly(),
|
|
64
|
+
}).readonly(),
|
|
65
|
+
'embedding': z.object({
|
|
66
|
+
'frameAncestors': z.union([z.literal(null), z.string()]).readonly(),
|
|
67
|
+
}).readonly(),
|
|
68
|
+
})
|
|
69
|
+
const _yadsh_dsh_qa_surface_qaSurface_secureSession_parameter_0$schema = z.string()
|
|
70
|
+
const _yadsh_dsh_qa_surface_qaSurface_secureSession_result$schema = z.object({
|
|
71
|
+
'sessionId': z.string().readonly(),
|
|
72
|
+
'enabled': z.boolean().readonly(),
|
|
73
|
+
'agentPresetMatches': z.boolean().readonly(),
|
|
74
|
+
'workspaceMatches': z.boolean().readonly(),
|
|
75
|
+
'modelMatches': z.boolean().readonly(),
|
|
76
|
+
'sandboxIsReadOnly': z.boolean().readonly(),
|
|
77
|
+
'approvalIsNever': z.boolean().readonly(),
|
|
78
|
+
'permissionPreset': z.string().readonly(),
|
|
79
|
+
'toolPolicyLoaded': z.boolean().readonly(),
|
|
80
|
+
'toolAllowList': z.array(z.string()).readonly(),
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
export const TYPERT = {
|
|
84
|
+
package: '@yadsh/dsh-qa-surface',
|
|
85
|
+
face: 'host',
|
|
86
|
+
schemas: [
|
|
87
|
+
],
|
|
88
|
+
invocations: [
|
|
89
|
+
{
|
|
90
|
+
id: '@yadsh/dsh-qa-surface#qaSurface/describe',
|
|
91
|
+
service: 'qaSurface',
|
|
92
|
+
namespace: 'qaSurface',
|
|
93
|
+
method: 'describe',
|
|
94
|
+
invocation: { kind: 'direct' },
|
|
95
|
+
parameters: [
|
|
96
|
+
],
|
|
97
|
+
result: {
|
|
98
|
+
mode: 'strict',
|
|
99
|
+
typeSymbol: '@yadsh/dsh-qa-surface/types#ResolvedQaSurfaceConfig',
|
|
100
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_describe_result$schema,
|
|
101
|
+
},
|
|
102
|
+
sourceLocation: {"file":"packages/dsh-qa-surface/src/index.ts","line":130,"column":3},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: '@yadsh/dsh-qa-surface#qaSurface/secureSession',
|
|
106
|
+
service: 'qaSurface',
|
|
107
|
+
namespace: 'qaSurface',
|
|
108
|
+
method: 'secureSession',
|
|
109
|
+
invocation: { kind: 'direct' },
|
|
110
|
+
parameters: [
|
|
111
|
+
{
|
|
112
|
+
name: 'sessionId',
|
|
113
|
+
wire: 'sessionId',
|
|
114
|
+
source: 'json',
|
|
115
|
+
codec: {
|
|
116
|
+
mode: 'strict',
|
|
117
|
+
typeSymbol: '@yadsh/dsh-qa-surface#qaSurface/secureSession:sessionId',
|
|
118
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_secureSession_parameter_0$schema,
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
result: {
|
|
123
|
+
mode: 'strict',
|
|
124
|
+
typeSymbol: '@yadsh/dsh-qa-surface/types#QaLockdownProof',
|
|
125
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_secureSession_result$schema,
|
|
126
|
+
},
|
|
127
|
+
sourceLocation: {"file":"packages/dsh-qa-surface/src/index.ts","line":136,"column":3},
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
model: {
|
|
131
|
+
"services": [
|
|
132
|
+
{
|
|
133
|
+
"description": "Host companion: validates config, owns the admission boundary and the route.",
|
|
134
|
+
"summary": "Host companion: validates config, owns the admission boundary and the route.",
|
|
135
|
+
"tags": [],
|
|
136
|
+
"jsDoc": "/** Host companion: validates config, owns the admission boundary and the route. */",
|
|
137
|
+
"key": "qaSurface",
|
|
138
|
+
"exportName": "QaSurface",
|
|
139
|
+
"members": [
|
|
140
|
+
{
|
|
141
|
+
"kind": "method",
|
|
142
|
+
"name": "getConfig",
|
|
143
|
+
"signature": "getConfig(): ResolvedQaSurfaceConfig"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"kind": "method",
|
|
147
|
+
"name": "describe",
|
|
148
|
+
"signature": "@Remote(\"describe\") describe(): ResolvedQaSurfaceConfig",
|
|
149
|
+
"summary": "Serve the effective QA configuration to the browser.",
|
|
150
|
+
"jsDoc": "/**\n * Serve the effective QA configuration to the browser. The DSH gateway pins\n * settings RPCs to loopback, so a browser served over the LAN always sees\n * the settings namespace as unavailable; this method is the config channel\n * such a browser falls back to. It is read-only projection — the admission\n * boundary stays in {@link secureSession}.\n */"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"kind": "method",
|
|
154
|
+
"name": "secureSession",
|
|
155
|
+
"signature": "@Remote(\"secureSession\") secureSession(sessionId: string): QaLockdownProof",
|
|
156
|
+
"summary": "Pin and attest the effective policy.",
|
|
157
|
+
"jsDoc": "/** Pin and attest the effective policy. The browser supplies identity only. */"
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
"types": [
|
|
161
|
+
{
|
|
162
|
+
"name": "QaApprovalPolicy",
|
|
163
|
+
"declaration": "export type QaApprovalPolicy = \"never\";"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "QaLockdownProof",
|
|
167
|
+
"declaration": "export interface QaLockdownProof {\n readonly sessionId: string;\n readonly enabled: boolean;\n readonly agentPresetMatches: boolean;\n readonly workspaceMatches: boolean;\n readonly modelMatches: boolean;\n readonly sandboxIsReadOnly: boolean;\n readonly approvalIsNever: boolean;\n readonly permissionPreset: string;\n readonly toolPolicyLoaded: boolean;\n readonly toolAllowList: readonly string[];\n}"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"name": "QaSandboxMode",
|
|
171
|
+
"declaration": "export type QaSandboxMode = \"read-only\";"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "QaSessionPolicy",
|
|
175
|
+
"declaration": "export type QaSessionPolicy = \"browser-persistent\" | \"new-on-load\" | \"fixed\";"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"name": "QaToolPolicyMode",
|
|
179
|
+
"declaration": "export type QaToolPolicyMode = \"allow-list\";"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "ResolvedQaSurfaceConfig",
|
|
183
|
+
"declaration": "export interface ResolvedQaSurfaceConfig {\n readonly enabled: boolean;\n readonly route: { readonly path: string; readonly matchChildren: boolean; };\n readonly branding: { readonly title: string; readonly subtitle: string; readonly welcomeMessage: string; readonly placeholder: string; readonly logoUrl: string | null; readonly disclaimer: string; };\n readonly session: { readonly policy: QaSessionPolicy; readonly storageKey: string; readonly cwd: string | null; readonly workspaceId: string | null; readonly fixedSessionId: string | null; readonly agentPreset: string | null; readonly provider: string | null; readonly model: string | null; readonly reasoningEffort: string | null; };\n readonly ui: { readonly showHeader: boolean; readonly showReset: boolean; readonly showStop: boolean; readonly showTimestamps: boolean; readonly showToolActivity: boolean; readonly showReasoning: boolean; readonly renderMarkdown: boolean; readonly maxContentWidth: number; readonly showSessionList: boolean; };\n readonly suggestedQuestions: readonly string[];\n readonly interaction: { readonly approvals: \"blocked\"; readonly questions: \"unsupported\"; };\n readonly lockdown: { readonly enabled: boolean; readonly enforceFixedAgentPreset: boolean; readonly enforceFixedWorkspace: boolean; readonly enforceFixedModel: boolean; readonly sandboxMode: QaSandboxMode; readonly approvalPolicy: QaApprovalPolicy; readonly permissionPreset: string; readonly allowPermissionChanges: false; readonly allowSlashCommands: false; readonly allowSettingsMutation: false; readonly allowSessionReset: boolean; readonly allowSessionRename: false; readonly allowSessionDelete: false; readonly allowArbitrarySessionOpen: false; readonly toolPolicy: { readonly mode: QaToolPolicyMode; readonly allow: readonly string[]; }; };\n readonly embedding: { readonly frameAncestors: string | null; };\n}"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
],
|
|
188
|
+
"events": [],
|
|
189
|
+
"objects": []
|
|
190
|
+
},
|
|
191
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from the Host FaceModel — do not edit. */
|
|
2
|
+
import type {
|
|
3
|
+
RemoteResult,
|
|
4
|
+
TypertRemoteContribution,
|
|
5
|
+
} from '@deepseek-ai/dsh-typert-protocol'
|
|
6
|
+
import type { QaLockdownProof, ResolvedQaSurfaceConfig } from '@yadsh/dsh-qa-surface/types'
|
|
7
|
+
|
|
8
|
+
declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
9
|
+
interface TypertRemoteNamespace$716153757266616365 {
|
|
10
|
+
describe: () => Promise<RemoteResult<ResolvedQaSurfaceConfig>>
|
|
11
|
+
secureSession: (sessionId: string) => Promise<RemoteResult<QaLockdownProof>>
|
|
12
|
+
}
|
|
13
|
+
interface TypertRemoteMap {
|
|
14
|
+
'qaSurface/describe': () => Promise<RemoteResult<ResolvedQaSurfaceConfig>>
|
|
15
|
+
'qaSurface/secureSession': (sessionId: string) => Promise<RemoteResult<QaLockdownProof>>
|
|
16
|
+
}
|
|
17
|
+
interface TypertRemoteNamespaceMap {
|
|
18
|
+
'qaSurface': TypertRemoteNamespace$716153757266616365
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export declare const TYPERT_REMOTE: TypertRemoteContribution
|
|
23
|
+
export default TYPERT_REMOTE
|
|
24
|
+
//# sourceMappingURL=typert.remote-client.d.ts.map
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from the Host FaceModel — do not edit. */
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const _yadsh_dsh_qa_surface_qaSurface_describe_result$schema = z.object({
|
|
5
|
+
'enabled': z.boolean().readonly(),
|
|
6
|
+
'route': z.object({
|
|
7
|
+
'path': z.string().readonly(),
|
|
8
|
+
'matchChildren': z.boolean().readonly(),
|
|
9
|
+
}).readonly(),
|
|
10
|
+
'branding': z.object({
|
|
11
|
+
'title': z.string().readonly(),
|
|
12
|
+
'subtitle': z.string().readonly(),
|
|
13
|
+
'welcomeMessage': z.string().readonly(),
|
|
14
|
+
'placeholder': z.string().readonly(),
|
|
15
|
+
'logoUrl': z.union([z.literal(null), z.string()]).readonly(),
|
|
16
|
+
'disclaimer': z.string().readonly(),
|
|
17
|
+
}).readonly(),
|
|
18
|
+
'session': z.object({
|
|
19
|
+
'policy': z.union([z.literal("browser-persistent"), z.literal("new-on-load"), z.literal("fixed")]).readonly(),
|
|
20
|
+
'storageKey': z.string().readonly(),
|
|
21
|
+
'cwd': z.union([z.literal(null), z.string()]).readonly(),
|
|
22
|
+
'workspaceId': z.union([z.literal(null), z.string()]).readonly(),
|
|
23
|
+
'fixedSessionId': z.union([z.literal(null), z.string()]).readonly(),
|
|
24
|
+
'agentPreset': z.union([z.literal(null), z.string()]).readonly(),
|
|
25
|
+
'provider': z.union([z.literal(null), z.string()]).readonly(),
|
|
26
|
+
'model': z.union([z.literal(null), z.string()]).readonly(),
|
|
27
|
+
'reasoningEffort': z.union([z.literal(null), z.string()]).readonly(),
|
|
28
|
+
}).readonly(),
|
|
29
|
+
'ui': z.object({
|
|
30
|
+
'showHeader': z.boolean().readonly(),
|
|
31
|
+
'showReset': z.boolean().readonly(),
|
|
32
|
+
'showStop': z.boolean().readonly(),
|
|
33
|
+
'showTimestamps': z.boolean().readonly(),
|
|
34
|
+
'showToolActivity': z.boolean().readonly(),
|
|
35
|
+
'showReasoning': z.boolean().readonly(),
|
|
36
|
+
'renderMarkdown': z.boolean().readonly(),
|
|
37
|
+
'maxContentWidth': z.number().readonly(),
|
|
38
|
+
'showSessionList': z.boolean().readonly(),
|
|
39
|
+
}).readonly(),
|
|
40
|
+
'suggestedQuestions': z.array(z.string()).readonly(),
|
|
41
|
+
'interaction': z.object({
|
|
42
|
+
'approvals': z.literal("blocked").readonly(),
|
|
43
|
+
'questions': z.literal("unsupported").readonly(),
|
|
44
|
+
}).readonly(),
|
|
45
|
+
'lockdown': z.object({
|
|
46
|
+
'enabled': z.boolean().readonly(),
|
|
47
|
+
'enforceFixedAgentPreset': z.boolean().readonly(),
|
|
48
|
+
'enforceFixedWorkspace': z.boolean().readonly(),
|
|
49
|
+
'enforceFixedModel': z.boolean().readonly(),
|
|
50
|
+
'sandboxMode': z.literal("read-only").readonly(),
|
|
51
|
+
'approvalPolicy': z.literal("never").readonly(),
|
|
52
|
+
'permissionPreset': z.string().readonly(),
|
|
53
|
+
'allowPermissionChanges': z.literal(false).readonly(),
|
|
54
|
+
'allowSlashCommands': z.literal(false).readonly(),
|
|
55
|
+
'allowSettingsMutation': z.literal(false).readonly(),
|
|
56
|
+
'allowSessionReset': z.boolean().readonly(),
|
|
57
|
+
'allowSessionRename': z.literal(false).readonly(),
|
|
58
|
+
'allowSessionDelete': z.literal(false).readonly(),
|
|
59
|
+
'allowArbitrarySessionOpen': z.literal(false).readonly(),
|
|
60
|
+
'toolPolicy': z.object({
|
|
61
|
+
'mode': z.literal("allow-list").readonly(),
|
|
62
|
+
'allow': z.array(z.string()).readonly(),
|
|
63
|
+
}).readonly(),
|
|
64
|
+
}).readonly(),
|
|
65
|
+
'embedding': z.object({
|
|
66
|
+
'frameAncestors': z.union([z.literal(null), z.string()]).readonly(),
|
|
67
|
+
}).readonly(),
|
|
68
|
+
})
|
|
69
|
+
const _yadsh_dsh_qa_surface_qaSurface_secureSession_parameter_0$schema = z.string()
|
|
70
|
+
const _yadsh_dsh_qa_surface_qaSurface_secureSession_result$schema = z.object({
|
|
71
|
+
'sessionId': z.string().readonly(),
|
|
72
|
+
'enabled': z.boolean().readonly(),
|
|
73
|
+
'agentPresetMatches': z.boolean().readonly(),
|
|
74
|
+
'workspaceMatches': z.boolean().readonly(),
|
|
75
|
+
'modelMatches': z.boolean().readonly(),
|
|
76
|
+
'sandboxIsReadOnly': z.boolean().readonly(),
|
|
77
|
+
'approvalIsNever': z.boolean().readonly(),
|
|
78
|
+
'permissionPreset': z.string().readonly(),
|
|
79
|
+
'toolPolicyLoaded': z.boolean().readonly(),
|
|
80
|
+
'toolAllowList': z.array(z.string()).readonly(),
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
export const TYPERT_REMOTE = {
|
|
84
|
+
package: '@yadsh/dsh-qa-surface',
|
|
85
|
+
descriptors: [
|
|
86
|
+
{
|
|
87
|
+
id: '@yadsh/dsh-qa-surface#qaSurface/describe',
|
|
88
|
+
service: 'qaSurface',
|
|
89
|
+
namespace: 'qaSurface',
|
|
90
|
+
method: 'describe',
|
|
91
|
+
invocation: { kind: 'direct' },
|
|
92
|
+
parameters: [
|
|
93
|
+
],
|
|
94
|
+
result: {
|
|
95
|
+
mode: 'strict',
|
|
96
|
+
typeSymbol: '@yadsh/dsh-qa-surface/types#ResolvedQaSurfaceConfig',
|
|
97
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_describe_result$schema,
|
|
98
|
+
},
|
|
99
|
+
sourceLocation: {"file":"packages/dsh-qa-surface/src/index.ts","line":130,"column":3},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: '@yadsh/dsh-qa-surface#qaSurface/secureSession',
|
|
103
|
+
service: 'qaSurface',
|
|
104
|
+
namespace: 'qaSurface',
|
|
105
|
+
method: 'secureSession',
|
|
106
|
+
invocation: { kind: 'direct' },
|
|
107
|
+
parameters: [
|
|
108
|
+
{
|
|
109
|
+
name: 'sessionId',
|
|
110
|
+
wire: 'sessionId',
|
|
111
|
+
source: 'json',
|
|
112
|
+
codec: {
|
|
113
|
+
mode: 'strict',
|
|
114
|
+
typeSymbol: '@yadsh/dsh-qa-surface#qaSurface/secureSession:sessionId',
|
|
115
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_secureSession_parameter_0$schema,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
result: {
|
|
120
|
+
mode: 'strict',
|
|
121
|
+
typeSymbol: '@yadsh/dsh-qa-surface/types#QaLockdownProof',
|
|
122
|
+
schema: _yadsh_dsh_qa_surface_qaSurface_secureSession_result$schema,
|
|
123
|
+
},
|
|
124
|
+
sourceLocation: {"file":"packages/dsh-qa-surface/src/index.ts","line":136,"column":3},
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export default TYPERT_REMOTE
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable, coarse reason codes for QA policy attestation rejections.
|
|
3
|
+
*
|
|
4
|
+
* The RPC carrier folds a thrown Host error into `{ code, message, details }`
|
|
5
|
+
* and always empties `details`, so the wire message is the only channel back
|
|
6
|
+
* to the browser. The message therefore carries a `(reason: <code>)` marker:
|
|
7
|
+
* coarse enough to reveal nothing about the deployment policy to the QA
|
|
8
|
+
* audience, precise enough for an operator reading the browser console to
|
|
9
|
+
* know which class of mismatch to look for in the Host logs.
|
|
10
|
+
*/
|
|
11
|
+
export type QaAttestationReason = "agent-unavailable" | "workspace-unavailable" | "composition-mismatch" | "permission-preset" | "adoption-refused" | "unknown-tools" | "attestation-failed";
|
|
12
|
+
/** Host rejection whose wire message carries the coarse reason marker. */
|
|
13
|
+
export declare class QaAttestationError extends Error {
|
|
14
|
+
readonly reason: QaAttestationReason;
|
|
15
|
+
constructor(reason: QaAttestationReason, message: string);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=attestation.d.ts.map
|
|
@@ -5,17 +5,49 @@ export interface QaConfigSnapshot {
|
|
|
5
5
|
readonly config: ResolvedQaSurfaceConfig;
|
|
6
6
|
readonly error: string | null;
|
|
7
7
|
}
|
|
8
|
-
/**
|
|
8
|
+
/** Reads the effective Host configuration when the settings namespace cannot. */
|
|
9
|
+
export type QaConfigFallback = () => Promise<ResolvedQaSurfaceConfig>;
|
|
10
|
+
/**
|
|
11
|
+
* Browser projection of the Host-owned qa-surface settings namespace.
|
|
12
|
+
*
|
|
13
|
+
* The DSH gateway pins settings RPCs to loopback, so a browser served over the
|
|
14
|
+
* LAN always sees the namespace as `unavailable`. When the caller supplies the
|
|
15
|
+
* `qaSurface/describe` Remote as a fallback, that channel answers instead: the
|
|
16
|
+
* projection waits in `loading` until it settles, then reports the Host-owned
|
|
17
|
+
* configuration as `ready`. A rejected fallback returns the projection to
|
|
18
|
+
* `unavailable`, exactly as when no fallback exists.
|
|
19
|
+
*/
|
|
9
20
|
export declare class QaConfigController {
|
|
10
21
|
private readonly scope;
|
|
11
22
|
private readonly listeners;
|
|
12
23
|
private snapshot;
|
|
13
24
|
private readonly unsubscribe;
|
|
14
|
-
|
|
25
|
+
private readonly fallback;
|
|
26
|
+
private fallbackState;
|
|
27
|
+
private fallbackConfig;
|
|
28
|
+
private disposed;
|
|
29
|
+
constructor(scope: SettingsScope<QaSurfaceConfig>, fallback?: QaConfigFallback);
|
|
15
30
|
getSnapshot: () => QaConfigSnapshot;
|
|
16
31
|
subscribe: (listener: () => void) => (() => void);
|
|
17
32
|
dispose(): void;
|
|
18
33
|
private project;
|
|
19
34
|
private refresh;
|
|
35
|
+
/**
|
|
36
|
+
* Re-read the Host configuration after a Host reconnect. Without this, an
|
|
37
|
+
* open page keeps the configuration it fetched at load time: after the Host
|
|
38
|
+
* restarts with a changed deployment config, the next attestation compares
|
|
39
|
+
* its proof against the stale client copy and refuses. While re-reading,
|
|
40
|
+
* the previous answer stays projected — no loading flicker; the snapshot
|
|
41
|
+
* updates only when the answer actually changed.
|
|
42
|
+
*/
|
|
43
|
+
refreshFallback(): void;
|
|
44
|
+
/**
|
|
45
|
+
* The fallback trigger rides every refresh: the scope flips to
|
|
46
|
+
* `unavailable` whenever the browser is served over the LAN, which a
|
|
47
|
+
* constructor-time check can miss. The state guard makes repeats a no-op,
|
|
48
|
+
* so one fetch runs per controller lifetime; the recursive refresh lets the
|
|
49
|
+
* pending state surface before the first notification pass.
|
|
50
|
+
*/
|
|
51
|
+
private requestFallbackIfNeeded;
|
|
20
52
|
}
|
|
21
53
|
//# sourceMappingURL=QaConfigController.d.ts.map
|