ponch-mcp-server 1.0.1 → 1.0.3
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/dist/auth.d.ts +4 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +6 -0
- package/dist/auth.js.map +1 -1
- package/dist/firestore.d.ts +11 -23
- package/dist/firestore.d.ts.map +1 -1
- package/dist/firestore.js +146 -48
- package/dist/firestore.js.map +1 -1
- package/dist/index.js +18 -13
- package/dist/index.js.map +1 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +5 -6
- package/dist/tools/context.js.map +1 -1
- package/package.json +1 -1
package/dist/auth.d.ts
CHANGED
|
@@ -94,6 +94,10 @@ export declare class Session {
|
|
|
94
94
|
id: string;
|
|
95
95
|
nombre: string;
|
|
96
96
|
}>, userId: string, userName: string | null): void;
|
|
97
|
+
/**
|
|
98
|
+
* Fuerza el modo (usado cuando credentials existen pero token expiro)
|
|
99
|
+
*/
|
|
100
|
+
forceMode(newMode: AuthMode): void;
|
|
97
101
|
requireTenant(): string;
|
|
98
102
|
requireBrand(): string;
|
|
99
103
|
}
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,QAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,QAA4C,CAAC;AAG1E,eAAO,MAAM,eAAe;;;;;;;CAO3B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAqDzC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAK9D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAO1D;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAc;gBAEtB,IAAI,EAAE,WAAW;IAQ7B,IAAI,IAAI,IAAI,QAAQ,CAEnB;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED,IAAI,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAEtC;IAED,IAAI,MAAM,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAElD;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQnD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUjJ,aAAa,IAAI,MAAM;IAWvB,YAAY,IAAI,MAAM;CAMvB"}
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,QAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,QAA4C,CAAC;AAG1E,eAAO,MAAM,eAAe;;;;;;;CAO3B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAqDzC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAK9D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAO1D;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAc;gBAEtB,IAAI,EAAE,WAAW;IAQ7B,IAAI,IAAI,IAAI,QAAQ,CAEnB;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED,IAAI,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAEtC;IAED,IAAI,MAAM,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAElD;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQnD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUjJ;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAIlC,aAAa,IAAI,MAAM;IAWvB,YAAY,IAAI,MAAM;CAMvB"}
|
package/dist/auth.js
CHANGED
|
@@ -157,6 +157,12 @@ export class Session {
|
|
|
157
157
|
this._authContext.userId = userId;
|
|
158
158
|
this._authContext.userName = userName;
|
|
159
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Fuerza el modo (usado cuando credentials existen pero token expiro)
|
|
162
|
+
*/
|
|
163
|
+
forceMode(newMode) {
|
|
164
|
+
this._authContext.mode = newMode;
|
|
165
|
+
}
|
|
160
166
|
requireTenant() {
|
|
161
167
|
if (!this.context.tenantId) {
|
|
162
168
|
throw new Error(this._authContext.mode === 'cowork'
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAiC7B,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAE1E,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,yCAAyC;IACjD,UAAU,EAAE,4BAA4B;IACxC,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE,gCAAgC;IAC/C,iBAAiB,EAAE,cAAc;IACjC,KAAK,EAAE,2CAA2C;CACnD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,0BAA0B;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QACnF,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE,aAAa,EAAE,gCAAgC;gBACpD,kBAAkB,EAAE,YAAY;gBAChC,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,4CAA4C,YAAY,iBAAiB,CAAC,CAAC;IAC3F,CAAC;IAED,yCAAyC;IACzC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAsB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;YACrF,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,eAAe,EAAE,gBAAgB;aAClC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,IAAI;QACT,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,OAAO;IACV,OAAO,CAAiB;IACxB,YAAY,CAAc;IAElC,YAAY,IAAiB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,OAAe;QAC1C,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAgB,EAAE,OAAe,EAAE,MAA6C,EAAE,MAAc,EAAE,QAAuB;QACxI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ;gBACjC,CAAC,CAAC,oDAAoD;gBACtD,CAAC,CAAC,oEAAoE,CACzE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAiC7B,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAE1E,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,yCAAyC;IACjD,UAAU,EAAE,4BAA4B;IACxC,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE,gCAAgC;IAC/C,iBAAiB,EAAE,cAAc;IACjC,KAAK,EAAE,2CAA2C;CACnD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,0BAA0B;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QACnF,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE,aAAa,EAAE,gCAAgC;gBACpD,kBAAkB,EAAE,YAAY;gBAChC,eAAe,EAAE,IAAI;aACtB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,4CAA4C,YAAY,iBAAiB,CAAC,CAAC;IAC3F,CAAC;IAED,yCAAyC;IACzC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAsB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;YACrF,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,eAAe,EAAE,gBAAgB;aAClC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,IAAI;QACT,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,OAAO;IACV,OAAO,CAAiB;IACxB,YAAY,CAAc;IAElC,YAAY,IAAiB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,OAAe;QAC1C,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAgB,EAAE,OAAe,EAAE,MAA6C,EAAE,MAAc,EAAE,QAAuB;QACxI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAiB;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC;IACnC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ;gBACjC,CAAC,CAAC,oDAAoD;gBACtD,CAAC,CAAC,oEAAoE,CACzE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;CACF"}
|
package/dist/firestore.d.ts
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* Firebase connection + helpers
|
|
3
3
|
*
|
|
4
4
|
* Modo A (Cowork): firebase-admin con service account → acceso total
|
|
5
|
-
* Modo B (Tenant): firebase client SDK con auth token → solo su data
|
|
5
|
+
* Modo B (Tenant): firebase client SDK con auth token → solo su data
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Auth Modo B:
|
|
8
|
+
* Primera vez: customToken → signInWithCustomToken → extraer refreshToken → guardar
|
|
9
|
+
* Siguientes: refreshToken → Firebase REST API → nuevo idToken → signIn
|
|
10
|
+
* El refreshToken NO expira. El customToken expira en 1 hora.
|
|
9
11
|
*/
|
|
10
12
|
import type { Session } from './auth.js';
|
|
11
13
|
type FirestoreMode = 'admin' | 'client' | 'none';
|
|
@@ -15,11 +17,16 @@ type FirestoreMode = 'admin' | 'client' | 'none';
|
|
|
15
17
|
export declare function initFirebaseAdmin(serviceAccountPath: string): void;
|
|
16
18
|
/**
|
|
17
19
|
* Inicializa Firebase Client SDK (Modo B).
|
|
18
|
-
*
|
|
20
|
+
*
|
|
21
|
+
* Estrategia de auth:
|
|
22
|
+
* 1. Si hay refreshToken → intercambiar por idToken via REST API → signIn
|
|
23
|
+
* 2. Si solo hay customToken → intentar signInWithCustomToken (puede expirar)
|
|
24
|
+
* 3. Si ambos fallan → return false (necesita connect_account)
|
|
19
25
|
*/
|
|
20
26
|
export declare function initFirebaseClient(): Promise<boolean>;
|
|
21
27
|
/**
|
|
22
28
|
* Re-autenticar despues de connect_account (sin reiniciar el MCP).
|
|
29
|
+
* Extrae y guarda el refreshToken.
|
|
23
30
|
*/
|
|
24
31
|
export declare function reauthClient(customToken: string): Promise<boolean>;
|
|
25
32
|
export declare function getMode(): FirestoreMode;
|
|
@@ -35,30 +42,11 @@ interface QueryOptions {
|
|
|
35
42
|
};
|
|
36
43
|
limit?: number;
|
|
37
44
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Query con tenantId obligatorio.
|
|
40
|
-
* Funciona identico en Modo A (admin) y Modo B (client).
|
|
41
|
-
*/
|
|
42
45
|
export declare function queryByTenant(session: Session, collectionName: string, filters?: QueryFilter[], options?: QueryOptions): Promise<Record<string, unknown>[]>;
|
|
43
|
-
/**
|
|
44
|
-
* Lee un documento por ID.
|
|
45
|
-
*/
|
|
46
46
|
export declare function readDoc(collectionName: string, docId: string): Promise<Record<string, unknown> | null>;
|
|
47
|
-
/**
|
|
48
|
-
* Escribe (set merge) un documento.
|
|
49
|
-
*/
|
|
50
47
|
export declare function writeDoc(collectionName: string, docId: string, data: Record<string, unknown>): Promise<void>;
|
|
51
|
-
/**
|
|
52
|
-
* Actualiza campos de un documento existente.
|
|
53
|
-
*/
|
|
54
48
|
export declare function updateDoc(collectionName: string, docId: string, data: Record<string, unknown>): Promise<void>;
|
|
55
|
-
/**
|
|
56
|
-
* Genera un ID unico para un documento nuevo.
|
|
57
|
-
*/
|
|
58
49
|
export declare function generateId(collectionName: string): string;
|
|
59
|
-
/**
|
|
60
|
-
* Server timestamp para escrituras. Funciona en ambos modos.
|
|
61
|
-
*/
|
|
62
50
|
export declare function serverTimestamp(): unknown;
|
|
63
51
|
export {};
|
|
64
52
|
//# sourceMappingURL=firestore.d.ts.map
|
package/dist/firestore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestore.d.ts","sourceRoot":"","sources":["../src/firestore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"firestore.d.ts","sourceRoot":"","sources":["../src/firestore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuBH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,KAAK,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAOjD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAalE;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAmF3D;AAsED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBxE;AAED,wBAAgB,OAAO,IAAI,aAAa,CAEvC;AAID,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,gBAAgB,GAAG,IAAI,GAAG,QAAQ,GAAG,oBAAoB,CAAC;IACtG,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,WAAW,EAAO,EAC3B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CASpC;AAkDD,wBAAsB,OAAO,CAC3B,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAYzC;AAED,wBAAsB,QAAQ,CAC5B,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,SAAS,CAC7B,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAgB,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAOzD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAMzC"}
|
package/dist/firestore.js
CHANGED
|
@@ -2,17 +2,19 @@
|
|
|
2
2
|
* Firebase connection + helpers
|
|
3
3
|
*
|
|
4
4
|
* Modo A (Cowork): firebase-admin con service account → acceso total
|
|
5
|
-
* Modo B (Tenant): firebase client SDK con auth token → solo su data
|
|
5
|
+
* Modo B (Tenant): firebase client SDK con auth token → solo su data
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Auth Modo B:
|
|
8
|
+
* Primera vez: customToken → signInWithCustomToken → extraer refreshToken → guardar
|
|
9
|
+
* Siguientes: refreshToken → Firebase REST API → nuevo idToken → signIn
|
|
10
|
+
* El refreshToken NO expira. El customToken expira en 1 hora.
|
|
9
11
|
*/
|
|
10
12
|
import admin from 'firebase-admin';
|
|
11
|
-
import { initializeApp as initClientApp } from 'firebase/app';
|
|
13
|
+
import { initializeApp as initClientApp, getApps, getApp } from 'firebase/app';
|
|
12
14
|
import { getFirestore as getClientFirestore, collection as clientCollection, doc as clientDoc, getDoc as clientGetDoc, getDocs as clientGetDocs, setDoc as clientSetDoc, updateDoc as clientUpdateDoc, query as clientQuery, where as clientWhere, orderBy as clientOrderBy, limit as clientLimit, serverTimestamp as clientServerTimestamp, } from 'firebase/firestore';
|
|
13
15
|
import { getAuth as getClientAuth, signInWithCustomToken, } from 'firebase/auth';
|
|
14
16
|
import { readFileSync } from 'fs';
|
|
15
|
-
import { FIREBASE_CONFIG, readCredentials } from './auth.js';
|
|
17
|
+
import { FIREBASE_CONFIG, readCredentials, saveCredentials } from './auth.js';
|
|
16
18
|
let mode = 'none';
|
|
17
19
|
let adminDb;
|
|
18
20
|
let clientDb;
|
|
@@ -32,47 +34,162 @@ export function initFirebaseAdmin(serviceAccountPath) {
|
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
36
|
* Inicializa Firebase Client SDK (Modo B).
|
|
35
|
-
*
|
|
37
|
+
*
|
|
38
|
+
* Estrategia de auth:
|
|
39
|
+
* 1. Si hay refreshToken → intercambiar por idToken via REST API → signIn
|
|
40
|
+
* 2. Si solo hay customToken → intentar signInWithCustomToken (puede expirar)
|
|
41
|
+
* 3. Si ambos fallan → return false (necesita connect_account)
|
|
36
42
|
*/
|
|
37
43
|
export async function initFirebaseClient() {
|
|
38
44
|
if (mode !== 'none')
|
|
39
45
|
return true;
|
|
40
46
|
const creds = readCredentials();
|
|
41
|
-
if (!creds
|
|
42
|
-
console.error('[firestore] No hay
|
|
47
|
+
if (!creds) {
|
|
48
|
+
console.error('[firestore] No hay credentials.json');
|
|
43
49
|
return false;
|
|
44
50
|
}
|
|
51
|
+
const app = getApps().length > 0 ? getApp() : initClientApp(FIREBASE_CONFIG);
|
|
52
|
+
const auth = getClientAuth(app);
|
|
53
|
+
// Estrategia 1: usar refreshToken (no expira, preferido)
|
|
54
|
+
if (creds.refreshToken) {
|
|
55
|
+
try {
|
|
56
|
+
const idToken = await exchangeRefreshToken(creds.refreshToken);
|
|
57
|
+
if (idToken) {
|
|
58
|
+
// signIn con el idToken obtenido
|
|
59
|
+
const { signInWithCredential, GoogleAuthProvider } = await import('firebase/auth');
|
|
60
|
+
// No podemos usar signInWithCredential con idToken directo.
|
|
61
|
+
// Pero Firebase Auth en Node.js acepta signInWithCustomToken.
|
|
62
|
+
// El truco: usar Firebase REST API para verificar y obtener sesion.
|
|
63
|
+
// Alternativa mas simple: Firebase REST API retorna idToken + refreshToken
|
|
64
|
+
// Podemos hacer requests a Firestore directamente con el idToken como bearer.
|
|
65
|
+
// Pero para mantener la interfaz unificada, usamos Admin SDK como proxy.
|
|
66
|
+
// La solucion real: el refreshToken nos da un idToken valido.
|
|
67
|
+
// Usamos ese idToken para autenticar un custom signIn.
|
|
68
|
+
// Firebase Client SDK no soporta signIn con idToken directo en Node.js.
|
|
69
|
+
// SOLUCION PRAGMATICA: usar firebase-admin con el idToken para verificar
|
|
70
|
+
// y hacer queries. Pero admin SDK no necesita auth del usuario...
|
|
71
|
+
// SOLUCION CORRECTA: Hacer queries a Firestore REST API con el idToken.
|
|
72
|
+
// Pero eso cambia toda la interfaz de queries.
|
|
73
|
+
// SOLUCION MAS SIMPLE: Generar un NUEVO customToken desde una Cloud Function
|
|
74
|
+
// usando el refreshToken. Asi el MCP siempre tiene un customToken fresco.
|
|
75
|
+
console.error('[firestore] Tiene refreshToken, intercambiando por sesion...');
|
|
76
|
+
// Usar el idToken para obtener info del usuario y crear sesion
|
|
77
|
+
// La forma mas limpia: llamar una Cloud Function que genere nuevo customToken
|
|
78
|
+
const newCustomToken = await getNewCustomToken(creds.refreshToken);
|
|
79
|
+
if (newCustomToken) {
|
|
80
|
+
await signInWithCustomToken(auth, newCustomToken);
|
|
81
|
+
clientDb = getClientFirestore(app);
|
|
82
|
+
mode = 'client';
|
|
83
|
+
// Actualizar credentials con el nuevo customToken
|
|
84
|
+
saveCredentials({ ...creds, customToken: newCustomToken });
|
|
85
|
+
console.error('[firestore] Firebase Client re-autenticado con refreshToken');
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
console.error('[firestore] Error con refreshToken, intentando customToken:', err);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Estrategia 2: usar customToken directamente (puede estar expirado)
|
|
95
|
+
if (creds.customToken) {
|
|
96
|
+
try {
|
|
97
|
+
const userCred = await signInWithCustomToken(auth, creds.customToken);
|
|
98
|
+
// Extraer y guardar refreshToken para futuras sesiones
|
|
99
|
+
const user = userCred.user;
|
|
100
|
+
const refreshToken = user.refreshToken ?? null;
|
|
101
|
+
if (refreshToken && refreshToken !== creds.refreshToken) {
|
|
102
|
+
saveCredentials({ ...creds, refreshToken });
|
|
103
|
+
console.error('[firestore] refreshToken guardado para futuras sesiones');
|
|
104
|
+
}
|
|
105
|
+
clientDb = getClientFirestore(app);
|
|
106
|
+
mode = 'client';
|
|
107
|
+
console.error('[firestore] Firebase Client autenticado con customToken');
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error('[firestore] customToken expirado o invalido');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Intercambia refreshToken por nuevo idToken usando Firebase REST API.
|
|
118
|
+
* El refreshToken NO expira (a menos que se revoque manualmente).
|
|
119
|
+
*/
|
|
120
|
+
async function exchangeRefreshToken(refreshToken) {
|
|
45
121
|
try {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
122
|
+
const response = await fetch(`https://securetoken.googleapis.com/v1/token?key=${FIREBASE_CONFIG.apiKey}`, {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
125
|
+
body: `grant_type=refresh_token&refresh_token=${encodeURIComponent(refreshToken)}`,
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
console.error('[firestore] Error refresh token:', response.status);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const data = await response.json();
|
|
132
|
+
return data.id_token ?? null;
|
|
54
133
|
}
|
|
55
|
-
catch
|
|
56
|
-
|
|
57
|
-
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Obtiene un nuevo customToken llamando a una Cloud Function con el refreshToken.
|
|
140
|
+
* Esto permite que el MCP se re-autentique sin que el usuario haga nada.
|
|
141
|
+
*/
|
|
142
|
+
async function getNewCustomToken(refreshToken) {
|
|
143
|
+
try {
|
|
144
|
+
// Primero obtenemos un idToken del refreshToken
|
|
145
|
+
const idToken = await exchangeRefreshToken(refreshToken);
|
|
146
|
+
if (!idToken)
|
|
147
|
+
return null;
|
|
148
|
+
// Llamar Cloud Function mcpRefreshToken con el idToken como auth
|
|
149
|
+
const response = await fetch(`https://us-central1-atteyo-ops.cloudfunctions.net/mcpRefreshToken`, {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: {
|
|
152
|
+
'Content-Type': 'application/json',
|
|
153
|
+
'Authorization': `Bearer ${idToken}`,
|
|
154
|
+
},
|
|
155
|
+
body: JSON.stringify({ data: {} }),
|
|
156
|
+
});
|
|
157
|
+
if (!response.ok) {
|
|
158
|
+
// Cloud Function no existe aun — no es critico, usamos idToken directo
|
|
159
|
+
console.error('[firestore] mcpRefreshToken no disponible, usando idToken directo');
|
|
160
|
+
// Alternativa: signIn directo con credential
|
|
161
|
+
// En Node.js podemos usar signInWithCredential no está disponible fácil
|
|
162
|
+
// Pero el idToken ya nos permite hacer queries a Firestore REST API
|
|
163
|
+
// La solucion pragmatica: si tenemos refreshToken que funciona,
|
|
164
|
+
// intentamos signInWithCustomToken de nuevo con un truco:
|
|
165
|
+
// Firebase Client SDK en Node.js acepta re-auth si el session ya existe
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const result = await response.json();
|
|
169
|
+
return result.result?.customToken ?? null;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
58
173
|
}
|
|
59
174
|
}
|
|
60
175
|
/**
|
|
61
176
|
* Re-autenticar despues de connect_account (sin reiniciar el MCP).
|
|
177
|
+
* Extrae y guarda el refreshToken.
|
|
62
178
|
*/
|
|
63
179
|
export async function reauthClient(customToken) {
|
|
64
180
|
try {
|
|
65
|
-
|
|
66
|
-
if (mode === 'client') {
|
|
67
|
-
// Ya inicializado, solo re-autenticar
|
|
68
|
-
const { getApp } = await import('firebase/app');
|
|
69
|
-
app = getApp();
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
app = initClientApp(FIREBASE_CONFIG);
|
|
73
|
-
}
|
|
181
|
+
const app = getApps().length > 0 ? getApp() : initClientApp(FIREBASE_CONFIG);
|
|
74
182
|
const auth = getClientAuth(app);
|
|
75
|
-
await signInWithCustomToken(auth, customToken);
|
|
183
|
+
const userCred = await signInWithCustomToken(auth, customToken);
|
|
184
|
+
// Extraer refreshToken para futuras sesiones
|
|
185
|
+
const user = userCred.user;
|
|
186
|
+
const refreshToken = user.refreshToken ?? null;
|
|
187
|
+
// Actualizar credentials con refreshToken
|
|
188
|
+
const creds = readCredentials();
|
|
189
|
+
if (creds && refreshToken) {
|
|
190
|
+
saveCredentials({ ...creds, customToken, refreshToken });
|
|
191
|
+
console.error('[firestore] refreshToken guardado');
|
|
192
|
+
}
|
|
76
193
|
clientDb = getClientFirestore(app);
|
|
77
194
|
mode = 'client';
|
|
78
195
|
return true;
|
|
@@ -86,10 +203,6 @@ export function getMode() {
|
|
|
86
203
|
return mode;
|
|
87
204
|
}
|
|
88
205
|
// ─── Helpers unificados ───
|
|
89
|
-
/**
|
|
90
|
-
* Query con tenantId obligatorio.
|
|
91
|
-
* Funciona identico en Modo A (admin) y Modo B (client).
|
|
92
|
-
*/
|
|
93
206
|
export async function queryByTenant(session, collectionName, filters = [], options = {}) {
|
|
94
207
|
const tenantId = session.requireTenant();
|
|
95
208
|
if (mode === 'admin') {
|
|
@@ -132,9 +245,6 @@ async function queryByTenantClient(tenantId, collectionName, filters, options) {
|
|
|
132
245
|
const snapshot = await clientGetDocs(q);
|
|
133
246
|
return snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }));
|
|
134
247
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Lee un documento por ID.
|
|
137
|
-
*/
|
|
138
248
|
export async function readDoc(collectionName, docId) {
|
|
139
249
|
if (mode === 'admin') {
|
|
140
250
|
const doc = await adminDb.collection(collectionName).doc(docId).get();
|
|
@@ -151,9 +261,6 @@ export async function readDoc(collectionName, docId) {
|
|
|
151
261
|
}
|
|
152
262
|
throw new Error('Firebase no inicializado');
|
|
153
263
|
}
|
|
154
|
-
/**
|
|
155
|
-
* Escribe (set merge) un documento.
|
|
156
|
-
*/
|
|
157
264
|
export async function writeDoc(collectionName, docId, data) {
|
|
158
265
|
if (mode === 'admin') {
|
|
159
266
|
await adminDb.collection(collectionName).doc(docId).set(data, { merge: true });
|
|
@@ -166,9 +273,6 @@ export async function writeDoc(collectionName, docId, data) {
|
|
|
166
273
|
throw new Error('Firebase no inicializado');
|
|
167
274
|
}
|
|
168
275
|
}
|
|
169
|
-
/**
|
|
170
|
-
* Actualiza campos de un documento existente.
|
|
171
|
-
*/
|
|
172
276
|
export async function updateDoc(collectionName, docId, data) {
|
|
173
277
|
if (mode === 'admin') {
|
|
174
278
|
await adminDb.collection(collectionName).doc(docId).update(data);
|
|
@@ -181,9 +285,6 @@ export async function updateDoc(collectionName, docId, data) {
|
|
|
181
285
|
throw new Error('Firebase no inicializado');
|
|
182
286
|
}
|
|
183
287
|
}
|
|
184
|
-
/**
|
|
185
|
-
* Genera un ID unico para un documento nuevo.
|
|
186
|
-
*/
|
|
187
288
|
export function generateId(collectionName) {
|
|
188
289
|
if (mode === 'admin') {
|
|
189
290
|
return adminDb.collection(collectionName).doc().id;
|
|
@@ -193,9 +294,6 @@ export function generateId(collectionName) {
|
|
|
193
294
|
}
|
|
194
295
|
throw new Error('Firebase no inicializado');
|
|
195
296
|
}
|
|
196
|
-
/**
|
|
197
|
-
* Server timestamp para escrituras. Funciona en ambos modos.
|
|
198
|
-
*/
|
|
199
297
|
export function serverTimestamp() {
|
|
200
298
|
if (mode === 'admin') {
|
|
201
299
|
return admin.firestore.FieldValue.serverTimestamp();
|
package/dist/firestore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestore.js","sourceRoot":"","sources":["../src/firestore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"firestore.js","sourceRoot":"","sources":["../src/firestore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,EAAE,aAAa,IAAI,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EACL,YAAY,IAAI,kBAAkB,EAClC,UAAU,IAAI,gBAAgB,EAC9B,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,OAAO,IAAI,aAAa,EACxB,MAAM,IAAI,YAAY,EACtB,SAAS,IAAI,eAAe,EAC5B,KAAK,IAAI,WAAW,EACpB,KAAK,IAAI,WAAW,EACpB,OAAO,IAAI,aAAa,EACxB,KAAK,IAAI,WAAW,EACpB,eAAe,IAAI,qBAAqB,GACzC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,OAAO,IAAI,aAAa,EACxB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAK9E,IAAI,IAAI,GAAkB,MAAM,CAAC;AACjC,IAAI,OAAkC,CAAC;AACvC,IAAI,QAA+C,CAAC;AAEpD,yBAAyB;AAEzB;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,kBAA0B;IAC1D,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO;IAE5B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAC1C,CAAC;IAEF,KAAK,CAAC,aAAa,CAAC;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC;KAClD,CAAC,CAAC;IAEH,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC5B,IAAI,GAAG,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEhC,yDAAyD;IACzD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/D,IAAI,OAAO,EAAE,CAAC;gBACZ,iCAAiC;gBACjC,MAAM,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;gBACnF,4DAA4D;gBAC5D,8DAA8D;gBAC9D,oEAAoE;gBAEpE,2EAA2E;gBAC3E,8EAA8E;gBAC9E,yEAAyE;gBAEzE,8DAA8D;gBAC9D,uDAAuD;gBACvD,wEAAwE;gBAExE,yEAAyE;gBACzE,kEAAkE;gBAElE,wEAAwE;gBACxE,+CAA+C;gBAE/C,6EAA6E;gBAC7E,0EAA0E;gBAC1E,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;gBAE9E,+DAA+D;gBAC/D,8EAA8E;gBAC9E,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACnE,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAClD,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;oBACnC,IAAI,GAAG,QAAQ,CAAC;oBAEhB,kDAAkD;oBAClD,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;oBAC3D,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBAC7E,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6DAA6D,EAAE,GAAG,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAEtE,uDAAuD;YACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,YAAY,GAAI,IAA6C,CAAC,YAAY,IAAI,IAAI,CAAC;YACzF,IAAI,YAAY,IAAI,YAAY,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;gBACxD,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC3E,CAAC;YAED,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,GAAG,QAAQ,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CAAC,YAAoB;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mDAAmD,eAAe,CAAC,MAAM,EAAE,EAAE;YACxG,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,0CAA0C,kBAAkB,CAAC,YAAY,CAAC,EAAE;SACnF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmD,CAAC;QACpF,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,YAAoB;IACnD,IAAI,CAAC;QACH,gDAAgD;QAChD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,iEAAiE;QACjE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,mEAAmE,EACnE;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,OAAO,EAAE;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;SACnC,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,uEAAuE;YACvE,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YAEnF,6CAA6C;YAC7C,wEAAwE;YACxE,oEAAoE;YAEpE,gEAAgE;YAChE,0DAA0D;YAC1D,wEAAwE;YACxE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2C,CAAC;QAC9E,OAAO,MAAM,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAEhE,6CAA6C;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,MAAM,YAAY,GAAI,IAA6C,CAAC,YAAY,IAAI,IAAI,CAAC;QAEzF,0CAA0C;QAC1C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,IAAI,YAAY,EAAE,CAAC;YAC1B,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACrD,CAAC;QAED,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,QAAQ,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAeD,6BAA6B;AAE7B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAgB,EAChB,cAAsB,EACtB,UAAyB,EAAE,EAC3B,UAAwB,EAAE;IAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAEzC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAgB,EAChB,cAAsB,EACtB,OAAsB,EACtB,OAAqB;IAErB,IAAI,KAAK,GAA0B,OAAO;SACvC,UAAU,CAAC,cAAc,CAAC;SAC1B,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAErC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;IACnC,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,cAAsB,EACtB,OAAsB,EACtB,OAAqB;IAErB,MAAM,gBAAgB,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,cAAc,GAAwC,CAAC,GAAG,gBAAgB,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,cAAsB,EACtB,KAAa;IAEb,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACvC,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,cAAsB,EACtB,KAAa,EACb,IAA6B;IAE7B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,cAAsB,EACtB,KAAa,EACb,IAA6B;IAE7B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAAsB;IAC/C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IACrD,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,qBAAqB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -22,29 +22,33 @@ async function main() {
|
|
|
22
22
|
const session = new Session(authContext);
|
|
23
23
|
console.error(`[ponch-mcp] Modo: ${authContext.mode}`);
|
|
24
24
|
// 2. Inicializar Firebase segun el modo
|
|
25
|
+
let firebaseReady = false;
|
|
25
26
|
if (authContext.serviceAccountPath) {
|
|
26
27
|
// Modo A puro: service account → Admin SDK
|
|
27
28
|
initFirebaseAdmin(authContext.serviceAccountPath);
|
|
28
|
-
|
|
29
|
+
firebaseReady = true;
|
|
30
|
+
console.error('[ponch-mcp] Firebase Admin inicializado.');
|
|
29
31
|
}
|
|
30
32
|
else if (authContext.credentialsPath && authContext.tenantId) {
|
|
31
|
-
// Modo B
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
console.error(`[ponch-mcp] Firebase Client autenticado. Tenant: ${authContext.tenantId}${rolLabel}`);
|
|
33
|
+
// Modo B: tiene credentials → intentar Client SDK
|
|
34
|
+
firebaseReady = await initFirebaseClient();
|
|
35
|
+
if (firebaseReady) {
|
|
36
|
+
console.error(`[ponch-mcp] Firebase Client autenticado. Tenant: ${authContext.tenantId}`);
|
|
36
37
|
}
|
|
37
38
|
else {
|
|
38
|
-
|
|
39
|
+
// Token expirado o invalido — necesita reconectar
|
|
40
|
+
console.error('[ponch-mcp] Token expirado. Usa connect_account para reconectar.');
|
|
41
|
+
// Forzar modo tenant para que connect_account este disponible
|
|
42
|
+
session.forceMode('tenant');
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
else {
|
|
42
|
-
console.error('[ponch-mcp] Sin conexion. Usa connect_account para conectar
|
|
46
|
+
console.error('[ponch-mcp] Sin conexion. Usa connect_account para conectar.');
|
|
43
47
|
}
|
|
44
48
|
// 3. Crear MCP Server
|
|
45
49
|
const server = new McpServer({
|
|
46
50
|
name: 'ponch',
|
|
47
|
-
version: '1.0.
|
|
51
|
+
version: '1.0.1',
|
|
48
52
|
});
|
|
49
53
|
// 4. Registrar system prompt como resource
|
|
50
54
|
server.resource('system-prompt', 'ponch://system-prompt', {
|
|
@@ -62,13 +66,14 @@ async function main() {
|
|
|
62
66
|
});
|
|
63
67
|
// 5. Registrar tools
|
|
64
68
|
registerContextTools(server, session);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
69
|
+
if (firebaseReady) {
|
|
70
|
+
registerCoreTools(server, session);
|
|
71
|
+
registerMarketingTools(server, session);
|
|
72
|
+
}
|
|
73
|
+
console.error(`[ponch-mcp] Servidor listo. Firebase: ${firebaseReady ? 'OK' : 'pendiente (connect_account)'}`);
|
|
68
74
|
// 6. Conectar via stdio
|
|
69
75
|
const transport = new StdioServerTransport();
|
|
70
76
|
await server.connect(transport);
|
|
71
|
-
console.error('[ponch-mcp] Servidor listo.');
|
|
72
77
|
}
|
|
73
78
|
main().catch((error) => {
|
|
74
79
|
console.error('[ponch-mcp] Error fatal:', error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAiJ9E"}
|
package/dist/tools/context.js
CHANGED
|
@@ -10,7 +10,7 @@ import { readDoc, reauthClient } from '../firestore.js';
|
|
|
10
10
|
import { getFunctions, httpsCallable } from 'firebase/functions';
|
|
11
11
|
import { initializeApp, getApps, getApp } from 'firebase/app';
|
|
12
12
|
export function registerContextTools(server, session) {
|
|
13
|
-
// ─── set_context (
|
|
13
|
+
// ─── set_context (Modo A service account, o super_admin con credentials) ───
|
|
14
14
|
if (session.mode === 'cowork') {
|
|
15
15
|
server.tool('set_context', 'Establece el tenant y brand para esta sesion. Solo disponible en Modo Cowork (admin).', {
|
|
16
16
|
tenantId: z.string().describe('ID del tenant (ej: "atteyo")'),
|
|
@@ -50,8 +50,9 @@ export function registerContextTools(server, session) {
|
|
|
50
50
|
};
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
|
-
// ─── connect_account (
|
|
54
|
-
|
|
53
|
+
// ─── connect_account (siempre disponible cuando no hay service account) ───
|
|
54
|
+
// Se necesita para: primera conexion, reconexion por token expirado, cambio de cuenta
|
|
55
|
+
if (!session.serviceAccountPath) {
|
|
55
56
|
server.tool('connect_account', 'Conecta tu cuenta de Ponch para acceder a tus datos. Primero visita https://atpops.vercel.app/auth/mcp-connect para obtener el codigo.', {
|
|
56
57
|
code: z.string().describe('Codigo de conexion de 8 caracteres (ej: ABCD-EFGH) obtenido de la pagina web'),
|
|
57
58
|
}, async ({ code }) => {
|
|
@@ -102,9 +103,7 @@ export function registerContextTools(server, session) {
|
|
|
102
103
|
brands: data.brands,
|
|
103
104
|
brandActiva: defaultBrand,
|
|
104
105
|
multiTenant: data.rol === 'super_admin',
|
|
105
|
-
mensaje:
|
|
106
|
-
? 'Cuenta super_admin conectada. Puedes usar set_context para cambiar de tenant. Reinicia el MCP para activar set_context.'
|
|
107
|
-
: 'Cuenta conectada exitosamente. Tus datos quedan guardados para futuras sesiones.',
|
|
106
|
+
mensaje: 'Cuenta conectada. Reinicia Claude Desktop (Cmd+Q y reabrir) para activar todas las herramientas.',
|
|
108
107
|
}),
|
|
109
108
|
}],
|
|
110
109
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
|