@sage-protocol/pi-adapter 0.3.11 → 0.4.1
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/README.md +72 -23
- package/SKILL.md +143 -166
- package/USAGE.md +100 -38
- package/dist/behavior/pi-executor.d.ts.map +1 -1
- package/dist/behavior/pi-executor.js +26 -6
- package/dist/behavior/pi-executor.js.map +1 -1
- package/dist/behavior/types.d.ts +15 -4
- package/dist/behavior/types.d.ts.map +1 -1
- package/dist/index.d.ts +29 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -7
- package/dist/index.js.map +1 -1
- package/dist/sage-pi-adapter.d.ts +71 -6
- package/dist/sage-pi-adapter.d.ts.map +1 -1
- package/dist/sage-pi-adapter.js +420 -55
- package/dist/sage-pi-adapter.js.map +1 -1
- package/extensions/index.ts +443 -598
- package/package.json +9 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sage-pi-adapter.d.ts","sourceRoot":"","sources":["../src/sage-pi-adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sage-pi-adapter.d.ts","sourceRoot":"","sources":["../src/sage-pi-adapter.ts"],"names":[],"mappings":"AA8BA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,MAAM,MAAM,UAAU,GACnB,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,KAAK,GACL,cAAc,GACd,UAAU,GACV,MAAM,GACN,KAAK,GACL,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,MAAM,GACN,UAAU,CAAC;AAEd,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,6GAA6G;IAC7G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;IACnE,YAAY,CAAC,EAAE,CACd,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,EAClD,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,GAAG,KACT,OAAO,CAAC;IACb,OAAO,EAAE,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,EACvC,GAAG,CAAC,EAAE,OAAO,KACT,OAAO,CAAC,UAAU,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC9D,eAAe,CAAC,EAAE,CACjB,OAAO,EAAE,WAAW,EACpB,WAAW,CAAC,EAAE,OAAO,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6FAA6F;IAC7F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAmBD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,+BAA+B,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAE/E,MAAM,MAAM,yBAAyB,GAClC;IACA,MAAM,EAAE,kCAAkC,CAAC;IAC3C,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACpB,GACD;IACA,MAAM,EAAE,kCAAkC,CAAC;IAC3C,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACf,GACD;IACA,MAAM,EAAE,kCAAkC,CAAC;IAC3C,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;CACf,CAAC;AAEL,MAAM,WAAW,wBAAwB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,+BAA+B,CAAC;IACpD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,0BAA0B,CAAC;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,UAAU,CAAC;IAC5B,IAAI,EAAE,wBAAwB,EAAE,CAAC;CACjC;AASD,MAAM,MAAM,iBAAiB,GAAG,CAC/B,OAAO,EAAE,kBAAkB,KACvB,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAmChC,KAAK,gBAAgB,GAAG;IACvB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2bF,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAgF5B;AAmLD,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAgCvE;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpE;AAirBD,qBAAa,aAAa;IAaxB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,gBAAgB;IAfzB,OAAO,CAAC,IAAI,CAA+C;IAC3D,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,eAAe,CAAgB;gBAG9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAChC,gBAAgB,SAAS;IAGlC,OAAO,IAAI,OAAO;IAIlB,UAAU,IAAI,OAAO;IAIrB,iBAAiB,IAAI;QACpB,eAAe,EAAE,OAAO,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC;QAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;KAC7B;IAWK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,WAAW,CAChB,SAAS,SAAyC,GAChD,OAAO,CAAC,OAAO,CAAC;IAgBb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,SAAS,CACd,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAOnD,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC;IAqBb,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnE,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,qBAAqB;YAgBf,gBAAgB;YAoBhB,UAAU;YAWV,KAAK;IAsDnB,OAAO,CAAC,OAAO;IAoCf,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,gBAAgB;CAKxB;AAED,qBAAa,eAAe;IAW1B,OAAO,CAAC,MAAM;IAVf,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,oBAAoB,CAAsC;IAClE,OAAO,CAAC,gBAAgB,CAGpB;gBAGK,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,GACpE,YAAY;IAKd,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKvC,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;IAuBhB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5D;;;;;;OAMG;IACG,yBAAyB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IA+EjE;;;OAGG;IACG,YAAY,CACjB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAiCZ,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAyBxB,eAAe,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAC1C,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IA4Bb,mBAAmB,CACxB,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC;IAgCnB;;;;;OAKG;IACG,oBAAoB,CACzB,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAsC3C;;;;;;OAMG;IACG,qBAAqB,CAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,GAAG,GAAE,OAAO,GAAG,MAAgB,GAC7B,OAAO,CAAC,yBAAyB,CAAC;IA4C/B,oBAAoB,CACzB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAmBV,sBAAsB,CAC3B,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAmBV,sBAAsB,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,EACvC,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IA2BV,WAAW,CAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAwB7B,YAAY,CACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,UAAU,EAAE,OAAO,EACnB,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAyBnC;;;;;;;;OAQG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IA6BlE;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY,CAGhB;IAEE,iBAAiB,CACtB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAkC3D,uEAAuE;IACvE,eAAe,CACd,QAAQ,EAAE,MAAM,GACd;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKlD;;;OAGG;IACG,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAI7C,GAAG;CA6DjB;AAyBD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,GAAG,cAAc,CAgF7E;AAED,wBAAgB,qBAAqB,CACpC,SAAS,EAAE,aAAa,GACtB,cAAc,CA+EhB;AA+ED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,aAAa,GACtB,cAAc,CAyDhB;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,cAAc,CAyD5E;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,aAAa,GACtB,cAAc,CA2EhB;AAED,wBAAgB,uBAAuB,CACtC,SAAS,EAAE,aAAa,GACtB,cAAc,CAuEhB;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,aAAa,GACtB,cAAc,CAwEhB;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,GAAG,cAAc,CAwG7E;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,aAAa,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,eAAe,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,mBAAmB,GAC1B,cAAc,EAAE,CA8DlB;AA0BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG;IACpE,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,sFAAsF;IACtF,oBAAoB,EAAE,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,kBAAkB,EAAE,MAAM,MAAM,CAAC;CACjC,CA0CA;AAED,wBAAsB,uBAAuB,CAC5C,MAAM,GAAE,YAAiB,GACvB,OAAO,CAAC;IACV,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,MAAM,IAAI,CAAC;IAClD,qBAAqB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,CAAC;CACrE,CAAC,CA+HD;;;;;;;;AAED,wBAME"}
|
package/dist/sage-pi-adapter.js
CHANGED
|
@@ -437,6 +437,7 @@ function normalizeAction(aliasesByDomain, domain, action) {
|
|
|
437
437
|
export async function defaultSageCommandRunner(request) {
|
|
438
438
|
return new Promise((resolve, reject) => {
|
|
439
439
|
const proc = spawn(request.command, request.args, {
|
|
440
|
+
cwd: request.cwd,
|
|
440
441
|
env: { ...process.env, ...request.env },
|
|
441
442
|
stdio: ["pipe", "pipe", "pipe"],
|
|
442
443
|
});
|
|
@@ -622,22 +623,137 @@ function appendText(result, text) {
|
|
|
622
623
|
existing.push({ type: "text", text });
|
|
623
624
|
return { ...result, content: existing };
|
|
624
625
|
}
|
|
625
|
-
|
|
626
|
-
|
|
626
|
+
let hostPiTuiResolved = false;
|
|
627
|
+
let hostPiTui = null;
|
|
628
|
+
function loadHostPiTui() {
|
|
629
|
+
if (hostPiTuiResolved)
|
|
630
|
+
return hostPiTui;
|
|
631
|
+
hostPiTuiResolved = true;
|
|
632
|
+
const anchors = [];
|
|
633
|
+
const entry = typeof process !== "undefined" && Array.isArray(process.argv) ? process.argv[1] : undefined;
|
|
634
|
+
if (entry)
|
|
635
|
+
anchors.push(entry); // pi process entry — sibling pi-tui
|
|
636
|
+
anchors.push(import.meta.url); // adapter-local (usually fails, kept last)
|
|
637
|
+
for (const anchor of anchors) {
|
|
638
|
+
let req;
|
|
627
639
|
try {
|
|
628
|
-
|
|
629
|
-
if (mod.Text)
|
|
630
|
-
return new mod.Text(text, 0, 0);
|
|
640
|
+
req = createRequire(anchor);
|
|
631
641
|
}
|
|
632
|
-
catch
|
|
633
|
-
|
|
642
|
+
catch {
|
|
643
|
+
continue;
|
|
644
|
+
}
|
|
645
|
+
for (const name of ["@earendil-works/pi-tui", "@mariozechner/pi-tui"]) {
|
|
646
|
+
try {
|
|
647
|
+
const mod = req(name);
|
|
648
|
+
if (mod && typeof mod.Text === "function") {
|
|
649
|
+
hostPiTui = mod;
|
|
650
|
+
return mod;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
catch {
|
|
654
|
+
/* try next anchor/name */
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
hostPiTui = null;
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
/** Return terminal-visible width while ignoring ANSI SGR sequences. */
|
|
662
|
+
export function visibleWidthOf(line) {
|
|
663
|
+
const mod = loadHostPiTui();
|
|
664
|
+
if (mod?.visibleWidth) {
|
|
665
|
+
try {
|
|
666
|
+
return mod.visibleWidth(line);
|
|
667
|
+
}
|
|
668
|
+
catch {
|
|
669
|
+
/* fall through to the dependency-free counter */
|
|
634
670
|
}
|
|
635
671
|
}
|
|
672
|
+
// eslint-disable-next-line no-control-regex
|
|
673
|
+
return [...line.replace(/\x1b\[[0-9;]*m/g, "")].length;
|
|
674
|
+
}
|
|
675
|
+
/** Truncate one ANSI-styled line without counting styling bytes as columns. */
|
|
676
|
+
export function truncateLineToWidth(line, width) {
|
|
677
|
+
const cols = Number.isFinite(width) && width > 0 ? Math.floor(width) : 80;
|
|
678
|
+
if (visibleWidthOf(line) <= cols)
|
|
679
|
+
return line;
|
|
680
|
+
const mod = loadHostPiTui();
|
|
681
|
+
if (mod?.truncateToWidth) {
|
|
682
|
+
try {
|
|
683
|
+
return mod.truncateToWidth(line, cols);
|
|
684
|
+
}
|
|
685
|
+
catch {
|
|
686
|
+
/* fall through to the dependency-free truncator */
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
// Preserve SGR styling while counting only visible code points.
|
|
690
|
+
// eslint-disable-next-line no-control-regex
|
|
691
|
+
const tokens = line.match(/\x1b\[[0-9;]*m|./gu) ?? [];
|
|
692
|
+
let visible = 0;
|
|
693
|
+
let sawStyle = false;
|
|
694
|
+
let result = "";
|
|
695
|
+
for (const token of tokens) {
|
|
696
|
+
// eslint-disable-next-line no-control-regex
|
|
697
|
+
if (/^\x1b\[[0-9;]*m$/.test(token)) {
|
|
698
|
+
result += token;
|
|
699
|
+
sawStyle = true;
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
if (visible >= cols)
|
|
703
|
+
break;
|
|
704
|
+
result += token;
|
|
705
|
+
visible += 1;
|
|
706
|
+
}
|
|
707
|
+
if (sawStyle && !result.endsWith("\x1b[0m"))
|
|
708
|
+
result += "\x1b[0m";
|
|
709
|
+
return result;
|
|
710
|
+
}
|
|
711
|
+
/** Clamp a line so custom TUI/status rendering cannot exceed terminal width. */
|
|
712
|
+
export function clampLineToWidth(line, width) {
|
|
713
|
+
return truncateLineToWidth(line, width);
|
|
714
|
+
}
|
|
715
|
+
function createTextComponent(text) {
|
|
716
|
+
// Canonical path: return the host pi-tui's real Text component. It wraps via
|
|
717
|
+
// wrapTextWithAnsi and is always width-safe, preserving theme colors.
|
|
718
|
+
const mod = loadHostPiTui();
|
|
719
|
+
if (mod?.Text)
|
|
720
|
+
return new mod.Text(text, 0, 0);
|
|
721
|
+
// Safety net only if the host pi-tui genuinely cannot be resolved. The object
|
|
722
|
+
// MUST satisfy pi-tui's child contract — pi's Box.render calls
|
|
723
|
+
// `child.render(width)` and `child.invalidate()` — and every returned line
|
|
724
|
+
// MUST fit `width` (pi throws "Rendered line exceeds terminal width"
|
|
725
|
+
// otherwise). The `width` Box passes is already the content width, so wrap to
|
|
726
|
+
// the full value; strip ANSI so char length equals visible width.
|
|
636
727
|
return {
|
|
637
728
|
text,
|
|
638
729
|
setText(next) {
|
|
639
730
|
this.text = next;
|
|
640
731
|
},
|
|
732
|
+
invalidate() {
|
|
733
|
+
/* no cached render state to clear */
|
|
734
|
+
},
|
|
735
|
+
render(width) {
|
|
736
|
+
const raw = String(this.text ?? "");
|
|
737
|
+
if (raw === "")
|
|
738
|
+
return [];
|
|
739
|
+
const cols = typeof width === "number" && Number.isFinite(width) && width > 0
|
|
740
|
+
? Math.floor(width)
|
|
741
|
+
: 80;
|
|
742
|
+
// eslint-disable-next-line no-control-regex
|
|
743
|
+
const ansi = /\x1b\[[0-9;]*m/g;
|
|
744
|
+
const lines = [];
|
|
745
|
+
for (const para of raw.replace(/\t/g, " ").replace(ansi, "").split("\n")) {
|
|
746
|
+
if (para.length === 0) {
|
|
747
|
+
lines.push("");
|
|
748
|
+
}
|
|
749
|
+
else {
|
|
750
|
+
for (let i = 0; i < para.length; i += cols) {
|
|
751
|
+
lines.push(para.slice(i, i + cols));
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
return lines;
|
|
756
|
+
},
|
|
641
757
|
};
|
|
642
758
|
}
|
|
643
759
|
/**
|
|
@@ -1022,6 +1138,140 @@ function looksUnknownToolError(error) {
|
|
|
1022
1138
|
msg.includes("no such tool") ||
|
|
1023
1139
|
msg.includes("does not exist"));
|
|
1024
1140
|
}
|
|
1141
|
+
const FAILED_NATIVE_SKILL_LOAD_RESULT = {
|
|
1142
|
+
schema: "sage.native-skill-load-signal.v1",
|
|
1143
|
+
status: "failed",
|
|
1144
|
+
recorded: false,
|
|
1145
|
+
};
|
|
1146
|
+
const NATIVE_SKILL_LOAD_EVIDENCE_TIERS = new Set([
|
|
1147
|
+
"full_serve",
|
|
1148
|
+
"native_observed",
|
|
1149
|
+
]);
|
|
1150
|
+
function parseJsonObject(stdout) {
|
|
1151
|
+
try {
|
|
1152
|
+
const parsed = JSON.parse(stdout.trim());
|
|
1153
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
1154
|
+
? parsed
|
|
1155
|
+
: null;
|
|
1156
|
+
}
|
|
1157
|
+
catch {
|
|
1158
|
+
return null;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
function parseNativeSkillLoadResult(stdout) {
|
|
1162
|
+
const parsed = parseJsonObject(stdout);
|
|
1163
|
+
if (!parsed ||
|
|
1164
|
+
parsed.schema !== "sage.native-skill-load-signal.v1") {
|
|
1165
|
+
return null;
|
|
1166
|
+
}
|
|
1167
|
+
if (parsed.status === "ignored" && parsed.recorded === false) {
|
|
1168
|
+
const result = {
|
|
1169
|
+
schema: "sage.native-skill-load-signal.v1",
|
|
1170
|
+
status: "ignored",
|
|
1171
|
+
recorded: false,
|
|
1172
|
+
};
|
|
1173
|
+
if (typeof parsed.reason === "string" && parsed.reason.trim()) {
|
|
1174
|
+
result.reason = parsed.reason;
|
|
1175
|
+
}
|
|
1176
|
+
return result;
|
|
1177
|
+
}
|
|
1178
|
+
if (parsed.status !== "recorded" ||
|
|
1179
|
+
parsed.recorded !== true ||
|
|
1180
|
+
typeof parsed.qualified_key !== "string" ||
|
|
1181
|
+
!parsed.qualified_key.trim() ||
|
|
1182
|
+
parsed.load_evidence_tier !== "native_observed" ||
|
|
1183
|
+
typeof parsed.loaded_at_ms !== "number" ||
|
|
1184
|
+
!Number.isSafeInteger(parsed.loaded_at_ms) ||
|
|
1185
|
+
parsed.loaded_at_ms < 0) {
|
|
1186
|
+
return null;
|
|
1187
|
+
}
|
|
1188
|
+
return {
|
|
1189
|
+
schema: "sage.native-skill-load-signal.v1",
|
|
1190
|
+
status: "recorded",
|
|
1191
|
+
recorded: true,
|
|
1192
|
+
qualified_key: parsed.qualified_key,
|
|
1193
|
+
load_evidence_tier: "native_observed",
|
|
1194
|
+
loaded_at_ms: parsed.loaded_at_ms,
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
function normalizeNativeSkillName(value) {
|
|
1198
|
+
return value.trim().toLocaleLowerCase("en-US");
|
|
1199
|
+
}
|
|
1200
|
+
function dedupeNativeSkillNames(skillKeys) {
|
|
1201
|
+
const names = new Map();
|
|
1202
|
+
for (const raw of skillKeys) {
|
|
1203
|
+
const trimmed = raw.trim();
|
|
1204
|
+
if (!trimmed)
|
|
1205
|
+
continue;
|
|
1206
|
+
const normalized = normalizeNativeSkillName(trimmed);
|
|
1207
|
+
if (!names.has(normalized))
|
|
1208
|
+
names.set(normalized, trimmed);
|
|
1209
|
+
}
|
|
1210
|
+
return [...names.values()];
|
|
1211
|
+
}
|
|
1212
|
+
function parseNativeSkillUseResult(stdout, expectedCaptureId, expectedNames) {
|
|
1213
|
+
const parsed = parseJsonObject(stdout);
|
|
1214
|
+
if (!parsed ||
|
|
1215
|
+
parsed.schema !== "sage.native-skill-use.v1" ||
|
|
1216
|
+
parsed.status !== "recorded" ||
|
|
1217
|
+
parsed.capture_id !== expectedCaptureId ||
|
|
1218
|
+
!Array.isArray(parsed.uses) ||
|
|
1219
|
+
parsed.uses.length === 0) {
|
|
1220
|
+
return null;
|
|
1221
|
+
}
|
|
1222
|
+
const expected = new Set(expectedNames.map(normalizeNativeSkillName));
|
|
1223
|
+
if (expected.size === 0 || parsed.uses.length !== expected.size)
|
|
1224
|
+
return null;
|
|
1225
|
+
if (parsed.capture_linkage !== "explicit")
|
|
1226
|
+
return null;
|
|
1227
|
+
const returnedNames = new Set();
|
|
1228
|
+
const returnedQualifiedKeys = new Set();
|
|
1229
|
+
const uses = [];
|
|
1230
|
+
for (const entry of parsed.uses) {
|
|
1231
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry))
|
|
1232
|
+
return null;
|
|
1233
|
+
const record = entry;
|
|
1234
|
+
if (typeof record.requested_name !== "string" ||
|
|
1235
|
+
!record.requested_name.trim() ||
|
|
1236
|
+
typeof record.qualified_key !== "string" ||
|
|
1237
|
+
!record.qualified_key.trim() ||
|
|
1238
|
+
typeof record.load_evidence_tier !== "string" ||
|
|
1239
|
+
!NATIVE_SKILL_LOAD_EVIDENCE_TIERS.has(record.load_evidence_tier) ||
|
|
1240
|
+
typeof record.load_observed_at_ms !== "number" ||
|
|
1241
|
+
!Number.isSafeInteger(record.load_observed_at_ms) ||
|
|
1242
|
+
record.load_observed_at_ms < 0 ||
|
|
1243
|
+
typeof record.recorded !== "boolean") {
|
|
1244
|
+
return null;
|
|
1245
|
+
}
|
|
1246
|
+
const requestedName = record.requested_name.trim();
|
|
1247
|
+
const normalizedName = normalizeNativeSkillName(requestedName);
|
|
1248
|
+
const qualifiedKey = record.qualified_key.trim();
|
|
1249
|
+
const normalizedQualifiedKey = normalizeNativeSkillName(qualifiedKey);
|
|
1250
|
+
if (!expected.has(normalizedName) ||
|
|
1251
|
+
returnedNames.has(normalizedName) ||
|
|
1252
|
+
returnedQualifiedKeys.has(normalizedQualifiedKey)) {
|
|
1253
|
+
return null;
|
|
1254
|
+
}
|
|
1255
|
+
returnedNames.add(normalizedName);
|
|
1256
|
+
returnedQualifiedKeys.add(normalizedQualifiedKey);
|
|
1257
|
+
uses.push({
|
|
1258
|
+
requested_name: requestedName,
|
|
1259
|
+
qualified_key: qualifiedKey,
|
|
1260
|
+
load_evidence_tier: record.load_evidence_tier,
|
|
1261
|
+
load_observed_at_ms: record.load_observed_at_ms,
|
|
1262
|
+
recorded: record.recorded,
|
|
1263
|
+
});
|
|
1264
|
+
}
|
|
1265
|
+
if ([...expected].some((name) => !returnedNames.has(name)))
|
|
1266
|
+
return null;
|
|
1267
|
+
return {
|
|
1268
|
+
schema: "sage.native-skill-use.v1",
|
|
1269
|
+
status: "recorded",
|
|
1270
|
+
capture_id: expectedCaptureId,
|
|
1271
|
+
capture_linkage: "explicit",
|
|
1272
|
+
uses,
|
|
1273
|
+
};
|
|
1274
|
+
}
|
|
1025
1275
|
function parseSecurityDecision(stdout) {
|
|
1026
1276
|
const lines = stdout
|
|
1027
1277
|
.split(/\r?\n/)
|
|
@@ -1340,6 +1590,7 @@ export class SageMcpBridge {
|
|
|
1340
1590
|
export class SageHookRuntime {
|
|
1341
1591
|
config;
|
|
1342
1592
|
commandRunner;
|
|
1593
|
+
workingDirectory;
|
|
1343
1594
|
sessionContextCache = new Map();
|
|
1344
1595
|
skillVisibilityCache = null;
|
|
1345
1596
|
softFailureState = new Map();
|
|
@@ -1347,6 +1598,10 @@ export class SageHookRuntime {
|
|
|
1347
1598
|
this.config = config;
|
|
1348
1599
|
this.commandRunner = config.commandRunner ?? defaultSageCommandRunner;
|
|
1349
1600
|
}
|
|
1601
|
+
setWorkingDirectory(cwd) {
|
|
1602
|
+
this.workingDirectory =
|
|
1603
|
+
typeof cwd === "string" && cwd.trim() ? cwd.trim() : undefined;
|
|
1604
|
+
}
|
|
1350
1605
|
getSoftTimeout(maxTimeoutMs) {
|
|
1351
1606
|
return Math.max(250, Math.min(this.config.timeoutMs, maxTimeoutMs));
|
|
1352
1607
|
}
|
|
@@ -1462,7 +1717,11 @@ export class SageHookRuntime {
|
|
|
1462
1717
|
}
|
|
1463
1718
|
return this.skillVisibilityCache ?? current;
|
|
1464
1719
|
}
|
|
1465
|
-
|
|
1720
|
+
/**
|
|
1721
|
+
* @deprecated Low-level compatibility helper. The default Pi path uses
|
|
1722
|
+
* native skill discovery/loading and does not call this per prompt.
|
|
1723
|
+
*/
|
|
1724
|
+
async suggestSkill(prompt, sessionId, model) {
|
|
1466
1725
|
const trimmed = prompt.trim();
|
|
1467
1726
|
if (!trimmed)
|
|
1468
1727
|
return "";
|
|
@@ -1480,6 +1739,7 @@ export class SageHookRuntime {
|
|
|
1480
1739
|
SAGE_PROMPT: trimmed,
|
|
1481
1740
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1482
1741
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1742
|
+
SAGE_MODEL: model ?? "",
|
|
1483
1743
|
}, JSON.stringify({ prompt: trimmed }), {
|
|
1484
1744
|
failurePolicy: "warn",
|
|
1485
1745
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.suggest),
|
|
@@ -1488,11 +1748,11 @@ export class SageHookRuntime {
|
|
|
1488
1748
|
}
|
|
1489
1749
|
async capturePrompt(prompt, sessionId) {
|
|
1490
1750
|
if (this.config.enableRlmFeedback === false)
|
|
1491
|
-
return;
|
|
1751
|
+
return undefined;
|
|
1492
1752
|
const trimmed = prompt.trim();
|
|
1493
1753
|
if (!trimmed)
|
|
1494
|
-
return;
|
|
1495
|
-
await this.run(["capture", "hook", "prompt"], {
|
|
1754
|
+
return undefined;
|
|
1755
|
+
const result = await this.run(["capture", "hook", "prompt"], {
|
|
1496
1756
|
PROMPT: trimmed,
|
|
1497
1757
|
SAGE_PROMPT: trimmed,
|
|
1498
1758
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
@@ -1501,34 +1761,153 @@ export class SageHookRuntime {
|
|
|
1501
1761
|
failurePolicy: "silent",
|
|
1502
1762
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.capture),
|
|
1503
1763
|
});
|
|
1764
|
+
const captureId = result?.stdout
|
|
1765
|
+
.trim()
|
|
1766
|
+
.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i)?.[0];
|
|
1767
|
+
return captureId;
|
|
1504
1768
|
}
|
|
1505
|
-
async captureResponse(response, usage, sessionId) {
|
|
1769
|
+
async captureResponse(response, usage, sessionId, captureId) {
|
|
1506
1770
|
if (this.config.enableRlmFeedback === false)
|
|
1507
|
-
return;
|
|
1771
|
+
return false;
|
|
1508
1772
|
const trimmed = response.trim();
|
|
1509
1773
|
if (!trimmed)
|
|
1510
|
-
return;
|
|
1511
|
-
|
|
1774
|
+
return false;
|
|
1775
|
+
const args = ["capture", "hook", "response"];
|
|
1776
|
+
const exactCaptureId = captureId?.trim();
|
|
1777
|
+
if (exactCaptureId)
|
|
1778
|
+
args.push("--correlation-id", exactCaptureId);
|
|
1779
|
+
const result = await this.run(args, {
|
|
1512
1780
|
SAGE_RESPONSE: trimmed,
|
|
1513
1781
|
LAST_RESPONSE: trimmed,
|
|
1514
1782
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1515
1783
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1784
|
+
SAGE_DEFER_SUGGESTION_FEEDBACK: "1",
|
|
1516
1785
|
TOKENS_INPUT: usage.input ?? "",
|
|
1517
1786
|
TOKENS_OUTPUT: usage.output ?? "",
|
|
1518
1787
|
}, JSON.stringify({ response: trimmed }), {
|
|
1519
1788
|
failurePolicy: "silent",
|
|
1520
1789
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.capture),
|
|
1521
1790
|
});
|
|
1791
|
+
return result !== null;
|
|
1522
1792
|
}
|
|
1523
|
-
async recordSuggestionUse(skillKeys, sessionId) {
|
|
1793
|
+
async recordSuggestionUse(skillKeys, sessionId, correlationId) {
|
|
1524
1794
|
if (this.config.enableRlmFeedback === false)
|
|
1525
|
-
return;
|
|
1795
|
+
return false;
|
|
1526
1796
|
const used = [
|
|
1527
1797
|
...new Set(skillKeys.map((key) => key.trim()).filter(Boolean)),
|
|
1528
1798
|
];
|
|
1529
1799
|
if (used.length === 0)
|
|
1800
|
+
return false;
|
|
1801
|
+
const args = [
|
|
1802
|
+
"suggest",
|
|
1803
|
+
"feedback",
|
|
1804
|
+
"use",
|
|
1805
|
+
...used.flatMap((key) => ["--used", key]),
|
|
1806
|
+
];
|
|
1807
|
+
const correlation = correlationId?.trim();
|
|
1808
|
+
if (correlation)
|
|
1809
|
+
args.push("--correlation-id", correlation);
|
|
1810
|
+
const result = await this.run(args, {
|
|
1811
|
+
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1812
|
+
SAGE_SESSION_ID: sessionId ?? "",
|
|
1813
|
+
}, undefined, {
|
|
1814
|
+
failurePolicy: "silent",
|
|
1815
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1816
|
+
});
|
|
1817
|
+
return result !== null;
|
|
1818
|
+
}
|
|
1819
|
+
/**
|
|
1820
|
+
* Atomically record use of procedures that Pi loaded natively. This path
|
|
1821
|
+
* intentionally has no fallback to legacy suggestion feedback: the daemon
|
|
1822
|
+
* must authorize every returned qualified record from session-scoped load
|
|
1823
|
+
* evidence and link the complete batch to the exact capture.
|
|
1824
|
+
*/
|
|
1825
|
+
async recordNativeSkillUse(skillKeys, sessionId, captureId) {
|
|
1826
|
+
if (this.config.enableRlmFeedback === false)
|
|
1827
|
+
return null;
|
|
1828
|
+
const used = dedupeNativeSkillNames(skillKeys);
|
|
1829
|
+
const session = sessionId?.trim();
|
|
1830
|
+
const capture = captureId?.trim();
|
|
1831
|
+
if (used.length === 0 || !session || !capture)
|
|
1832
|
+
return null;
|
|
1833
|
+
const source = this.config.source?.trim() || "pi";
|
|
1834
|
+
const result = await this.run([
|
|
1835
|
+
"suggest",
|
|
1836
|
+
"feedback",
|
|
1837
|
+
"native-use",
|
|
1838
|
+
...used.flatMap((key) => ["--used", key]),
|
|
1839
|
+
"--capture-id",
|
|
1840
|
+
capture,
|
|
1841
|
+
"--source",
|
|
1842
|
+
source,
|
|
1843
|
+
"--session",
|
|
1844
|
+
session,
|
|
1845
|
+
"--format",
|
|
1846
|
+
"json",
|
|
1847
|
+
], {
|
|
1848
|
+
SAGE_SOURCE: source,
|
|
1849
|
+
SAGE_SESSION_ID: session,
|
|
1850
|
+
}, undefined, {
|
|
1851
|
+
failurePolicy: "silent",
|
|
1852
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1853
|
+
});
|
|
1854
|
+
return result
|
|
1855
|
+
? parseNativeSkillUseResult(result.stdout, capture, used)
|
|
1856
|
+
: null;
|
|
1857
|
+
}
|
|
1858
|
+
/**
|
|
1859
|
+
* Record a daemon load receipt for a full skill procedure this session
|
|
1860
|
+
* loaded through Pi's native full SKILL.md read or sage_execute get. The
|
|
1861
|
+
* structured result only reports `recorded: true` after validating the
|
|
1862
|
+
* explicit CLI's versioned JSON receipt. Ignored and failed writes remain
|
|
1863
|
+
* non-recorded so callers can retry honestly.
|
|
1864
|
+
*/
|
|
1865
|
+
async recordSkillLoadSignal(skillKey, sessionId, via = "slash") {
|
|
1866
|
+
if (this.config.enableRlmFeedback === false) {
|
|
1867
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1868
|
+
}
|
|
1869
|
+
const key = skillKey.trim();
|
|
1870
|
+
const session = sessionId?.trim();
|
|
1871
|
+
// A receipt is session-scoped evidence. Without the real Pi session id,
|
|
1872
|
+
// the CLI would fall back to ambient env (a foreign harness session) and
|
|
1873
|
+
// record evidence that verifies the WRONG scope — worse than nothing.
|
|
1874
|
+
if (!key || !session)
|
|
1875
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1876
|
+
const source = this.config.source?.trim() || "pi";
|
|
1877
|
+
const result = await this.run([
|
|
1878
|
+
"suggest",
|
|
1879
|
+
"load-signal",
|
|
1880
|
+
"--name",
|
|
1881
|
+
key,
|
|
1882
|
+
"--via",
|
|
1883
|
+
via,
|
|
1884
|
+
"--source",
|
|
1885
|
+
source,
|
|
1886
|
+
"--session",
|
|
1887
|
+
session,
|
|
1888
|
+
"--format",
|
|
1889
|
+
"json",
|
|
1890
|
+
], {
|
|
1891
|
+
SAGE_SOURCE: source,
|
|
1892
|
+
SAGE_SESSION_ID: session,
|
|
1893
|
+
}, undefined, {
|
|
1894
|
+
failurePolicy: "silent",
|
|
1895
|
+
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1896
|
+
});
|
|
1897
|
+
if (!result)
|
|
1898
|
+
return { ...FAILED_NATIVE_SKILL_LOAD_RESULT };
|
|
1899
|
+
return (parseNativeSkillLoadResult(result.stdout) ?? {
|
|
1900
|
+
...FAILED_NATIVE_SKILL_LOAD_RESULT,
|
|
1901
|
+
});
|
|
1902
|
+
}
|
|
1903
|
+
async recordSuggestionSkip(sessionId, correlationId) {
|
|
1904
|
+
if (this.config.enableRlmFeedback === false)
|
|
1530
1905
|
return;
|
|
1531
|
-
|
|
1906
|
+
const args = ["suggest", "feedback", "skip"];
|
|
1907
|
+
const correlation = correlationId?.trim();
|
|
1908
|
+
if (correlation)
|
|
1909
|
+
args.push("--correlation-id", correlation);
|
|
1910
|
+
await this.run(args, {
|
|
1532
1911
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1533
1912
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1534
1913
|
}, undefined, {
|
|
@@ -1536,10 +1915,14 @@ export class SageHookRuntime {
|
|
|
1536
1915
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1537
1916
|
});
|
|
1538
1917
|
}
|
|
1539
|
-
async
|
|
1918
|
+
async recordSuggestionReject(sessionId, correlationId) {
|
|
1540
1919
|
if (this.config.enableRlmFeedback === false)
|
|
1541
1920
|
return;
|
|
1542
|
-
|
|
1921
|
+
const args = ["suggest", "feedback", "reject"];
|
|
1922
|
+
const correlation = correlationId?.trim();
|
|
1923
|
+
if (correlation)
|
|
1924
|
+
args.push("--correlation-id", correlation);
|
|
1925
|
+
await this.run(args, {
|
|
1543
1926
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1544
1927
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
1545
1928
|
}, undefined, {
|
|
@@ -1547,7 +1930,7 @@ export class SageHookRuntime {
|
|
|
1547
1930
|
timeoutMs: this.getSoftTimeout(SAGE_HOOK_TIMEOUTS.feedback),
|
|
1548
1931
|
});
|
|
1549
1932
|
}
|
|
1550
|
-
async recordExecutionOutcome(skillKey, status, queryPreview, sessionId, _model) {
|
|
1933
|
+
async recordExecutionOutcome(skillKey, status, queryPreview, sessionId, _model, correlationId, captureId) {
|
|
1551
1934
|
if (this.config.enableRlmFeedback === false)
|
|
1552
1935
|
return;
|
|
1553
1936
|
const key = skillKey.trim();
|
|
@@ -1557,6 +1940,12 @@ export class SageHookRuntime {
|
|
|
1557
1940
|
const preview = queryPreview?.trim();
|
|
1558
1941
|
if (preview)
|
|
1559
1942
|
args.push("--query-preview", preview.slice(0, 500));
|
|
1943
|
+
const correlation = correlationId?.trim();
|
|
1944
|
+
if (correlation)
|
|
1945
|
+
args.push("--correlation-id", correlation);
|
|
1946
|
+
const exactCaptureId = captureId?.trim();
|
|
1947
|
+
if (exactCaptureId)
|
|
1948
|
+
args.push("--capture-id", exactCaptureId);
|
|
1560
1949
|
await this.run(args, {
|
|
1561
1950
|
SAGE_SOURCE: this.config.source ?? "pi",
|
|
1562
1951
|
SAGE_SESSION_ID: sessionId ?? "",
|
|
@@ -1692,11 +2081,15 @@ export class SageHookRuntime {
|
|
|
1692
2081
|
if (this.config.sageProfile) {
|
|
1693
2082
|
commandEnv.SAGE_PROFILE = this.config.sageProfile;
|
|
1694
2083
|
}
|
|
2084
|
+
if (this.workingDirectory && !commandEnv.SAGE_WORKSPACE) {
|
|
2085
|
+
commandEnv.SAGE_WORKSPACE = this.workingDirectory;
|
|
2086
|
+
}
|
|
1695
2087
|
const result = await this.commandRunner({
|
|
1696
2088
|
command: this.config.sageBin,
|
|
1697
2089
|
args,
|
|
1698
2090
|
env: commandEnv,
|
|
1699
2091
|
stdin,
|
|
2092
|
+
cwd: this.workingDirectory,
|
|
1700
2093
|
timeoutMs: options.timeoutMs ?? this.config.timeoutMs,
|
|
1701
2094
|
});
|
|
1702
2095
|
if (result.timedOut || result.exitCode !== 0) {
|
|
@@ -2269,7 +2662,7 @@ async function injectHookMessage(session, customType, content, display = false)
|
|
|
2269
2662
|
console.log(`\n[${customType}]\n${trimmed}\n`);
|
|
2270
2663
|
}
|
|
2271
2664
|
export function createSageExtensions(options) {
|
|
2272
|
-
const { mcpBridge
|
|
2665
|
+
const { mcpBridge } = options;
|
|
2273
2666
|
const hookRuntime = options.hookRuntime ??
|
|
2274
2667
|
new SageHookRuntime({
|
|
2275
2668
|
sageBin: options.config.sageBin ?? "sage",
|
|
@@ -2293,40 +2686,13 @@ export function createSageExtensions(options) {
|
|
|
2293
2686
|
hookRuntime,
|
|
2294
2687
|
getSessionId: options.getSessionId,
|
|
2295
2688
|
});
|
|
2296
|
-
let currentSuggestions = "";
|
|
2297
|
-
let lastInjectionTimestamp = 0;
|
|
2298
|
-
let lastSuggestionPrompt = "";
|
|
2299
2689
|
return {
|
|
2300
2690
|
customTools,
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
if (now - lastInjectionTimestamp < debounceMs)
|
|
2307
|
-
return;
|
|
2308
|
-
if (prompt === lastSuggestionPrompt)
|
|
2309
|
-
return;
|
|
2310
|
-
lastInjectionTimestamp = now;
|
|
2311
|
-
lastSuggestionPrompt = prompt;
|
|
2312
|
-
try {
|
|
2313
|
-
const suggestions = await hookRuntime.suggestSkill(prompt, sessionId);
|
|
2314
|
-
if (!suggestions.trim())
|
|
2315
|
-
return;
|
|
2316
|
-
currentSuggestions = suggestions;
|
|
2317
|
-
if (session) {
|
|
2318
|
-
await injectHookMessage(session, "sage-suggested-skills", suggestions, false);
|
|
2319
|
-
}
|
|
2320
|
-
}
|
|
2321
|
-
catch (error) {
|
|
2322
|
-
console.error("[sage-pi-adapter] suggestion hook failed:", error);
|
|
2323
|
-
}
|
|
2324
|
-
},
|
|
2325
|
-
sageClearSuggestions: () => {
|
|
2326
|
-
currentSuggestions = "";
|
|
2327
|
-
lastSuggestionPrompt = "";
|
|
2328
|
-
},
|
|
2329
|
-
sageGetSuggestions: () => currentSuggestions,
|
|
2691
|
+
// Preserved for one compatibility release. Pi's native skill surface owns
|
|
2692
|
+
// discovery/loading now, so adapter-side prompt injection must stay inert.
|
|
2693
|
+
sageInjectSuggestion: async (_userPrompt, _session, _sessionId) => { },
|
|
2694
|
+
sageClearSuggestions: () => { },
|
|
2695
|
+
sageGetSuggestions: () => "",
|
|
2330
2696
|
};
|
|
2331
2697
|
}
|
|
2332
2698
|
export async function createSageSessionConfig(config = {}) {
|
|
@@ -2405,7 +2771,6 @@ export async function createSageSessionConfig(config = {}) {
|
|
|
2405
2771
|
.catch((error) => {
|
|
2406
2772
|
console.error("[sage-pi-adapter] prompt capture failed:", error);
|
|
2407
2773
|
});
|
|
2408
|
-
void extension.sageInjectSuggestion(content, session, activeSessionId);
|
|
2409
2774
|
return;
|
|
2410
2775
|
}
|
|
2411
2776
|
if (parsed.role === "assistant") {
|