konecty / konecty Goto Github PK
View Code? Open in Web Editor NEWKonecty Open source Tech Business Platform
Home Page: https://konecty.com
License: GNU Affero General Public License v3.0
Konecty Open source Tech Business Platform
Home Page: https://konecty.com
License: GNU Affero General Public License v3.0
Ao tentar cadastrar uma segunda Atividade de forma incorreta, sem o campo type:
Expected value to deeply and strictly equal to:
[{"message": "A lista de escolha 'type' exige o mínimo de 1 valores selecionados. Mas não está presente no dado. [utils-internal-error]"}]
Received:
[{"message": "[Activity] Duplicate key error"}]
O mesmo erro ocorre ao tentar com outros campos do documento Atividade.
Corretor › Cadastrando uma Oportunidade de Compra › Não deve ser possível cadastrar uma Oportunidade pois o campo [Cliente] é obrigatório
Expected value to deeply and strictly equal to:
[{"message": "O Campo 'contact' é obrigatório, mas não está presente no dado. [utils-internal-error]"}]
Received:
[{"message": "Field contact is required"}]
When querying the scope of lookups is very limited
could be possible to list the field inside plan
and konecty makes the lookup:
fields: ['code', 'plan.permissions', 'plan.expiration']
{
_id: 'sample-1',
plan: {
_id: 'sample-2-plan',
code: 123,
name: 'Sample plan'
permissions: ['permission-1', 'permission-2'],
expiration: date
}
}
at least the SDK could abstract the secondary queries.
Konecty/server/methods/data.js
Line 1238 in 4430948
This line causes an error when the document does not have the _updatedAt field.
{"level":50,"time":1694180641293,"pid":1,"hostname":"dd88bfcc1fcf","err":{"type":"TypeError","message":"Cannot read property 'getTime' of undefined","stack":"TypeError: Cannot read property 'getTime' of undefined\n at MethodInvocation.<anonymous> (server/methods/data.js:1238:28)\n at MethodInvocation.meteorMethods.<computed> (packages/konecty_methods-middleware/konecty_methods-middleware.coffee:141:23)\n at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1902:12)\n at packages/ddp-server/livedata_server.js:1820:15\n at packages/meteor.js:365:18\n at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1389:31)\n at packages/ddp-server/livedata_server.js:1818:36\n at new Promise (<anonymous>)\n at Server.applyAsync (packages/ddp-server/livedata_server.js:1817:12)\n at Server.apply (packages/ddp-server/livedata_server.js:1756:26)\n at Server.call (packages/ddp-server/livedata_server.js:1738:17)\n at server/routes/rest/data/dataApi.js:132:10\n at server/lib/routes/app.js:257:4\n at doCall (packages/meteorhacks_picker.js:128:14)\n at PickerImp._processRoute (packages/meteorhacks_picker.js:122:5)\n at processNextRoute (packages/meteorhacks_picker.js:90:14)\n => awaited here:\n at Promise.await (/app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:60:12)\n at Server.apply (packages/ddp-server/livedata_server.js:1769:22)\n at Server.call (packages/ddp-server/livedata_server.js:1738:17)\n at server/routes/rest/data/dataApi.js:132:10\n at server/lib/routes/app.js:257:4\n at doCall (packages/meteorhacks_picker.js:128:14)\n at PickerImp._processRoute (packages/meteorhacks_picker.js:122:5)\n at processNextRoute (packages/meteorhacks_picker.js:90:14)\n at processNextMiddleware (packages/meteorhacks_picker.js:78:7)\n at PickerImp._dispatch (packages/meteorhacks_picker.js:72:3)\n at processNextSubRouter (packages/meteorhacks_picker.js:102:17)\n at PickerImp._dispatch (packages/meteorhacks_picker.js:68:14)\n at processNextSubRouter (packages/meteorhacks_picker.js:102:17)\n at PickerImp._dispatch (packages/meteorhacks_picker.js:68:14)\n at processNextSubRouter (packages/meteorhacks_picker.js:102:17)\n at processNextRoute (packages/meteorhacks_picker.js:95:7)"},"msg":"uncaughtException Cannot read property 'getTime' of undefined"}
A alteração de senha não está funcionando na versão #54. A request retorna 200 porém a tentar efetuar login não funciona, apenas com a senha anterior.
Corretor › Cadastrando rascunho de um imóvel › Imóvel não foi cadastrado pois o campo CEP do Endereço deve conter apenas números e ter tamanho 8
Expected value to deeply and strictly equal to:
[{"message": "[CEP deve conter somente números com tamanho de 8 caracteres]"}]
Received:
[{"message": "[Product] CEP deve conter somente números com tamanho de 8 caracteres"}]
Acredito que foi alterado a forma de retorno dos erros nos hooks
Corretor › Modificando Imóveis em Rascunho › Não deve ser possível modificar o campo [Proprietário Abordado] para '3 Aprovado' pois o usuário não tem permissão
Expected value to deeply and strictly equal to:
[{"message": "[[Proprietário Abordado] Você não tem permissão para selecionar esse valor.]"}]
Received:
[{"message": "[Product] [Proprietário Abordado] Você não tem permissão para selecionar esse valor."}]
Parece que foi alterado a forma de retorno dos erros dos Hooks
A função alterar senha do usuário via interface do Konecty não está funcionando
Corretor › Cadastrando rascunho de um imóvel › Imóvel não foi cadastrado pois o campo Endereço é obrigatório
Expected value to deeply and strictly equal to:
[{"message": "O Campo 'address' é obrigatório, mas não está presente no dado. [utils-internal-error]"}]
Received:
[{"message": "[Product] Houve um erro inesperado: 'Cannot read property 'postalCode' of undefined'"}]
Na versão em DEV, os metaobjects não possuem o meta Preference, o que causa um erro ao inicializar o Konecty
Docker image tagged latest
and 1.0.21
gives this while starting:
Bugsnag: Error: Can't find npm module 'lodash'. Did you forget to call 'Npm.depends' in package.js within the 'konsistent' package?
at Object.require (/app/bundle/programs/server/boot.js:230:17)
at packages/konsistent/server/lib/mailConsumer.coffee:9:9
at /app/bundle/programs/server/packages/konsistent.js:713:4
at /app/bundle/programs/server/packages/konsistent.js:2391:3
at /app/bundle/programs/server/boot.js:338:34
at Array.forEach (native)
at Function._.each._.forEach (/app/bundle/programs/server/node_modules/underscore/underscore.js:79:11)
at /app/bundle/programs/server/boot.js:158:5
at /app/bundle/programs/server/boot.js:387:5
at Function.run (/app/bundle/programs/server/profile.js:510:12)
at /app/bundle/programs/server/boot.js:386:11
Corretor › Modificando Imóveis em Rascunho › Não deve ser possível modificar o campo [Estágio do Agenciamento] para 'Vendido Concorrência' e o campo [Exclusividade] para SIM
Expected value to deeply and strictly equal to:
[{"message": "[Product] You don't have permission to update field exclusive [internal-error]"}]
Received:
[{"message": "[Product] Imóvel exclusivo: cliente precisa enviar solicitação de cancelamento para [email protected], conforme cláusula 5ª do contrato."}]
Parece que passou pelos Access e foi direto para a verificação dos hooks.
#56 Branch Develop
Log error:
Bugsnag: Encountered an uncaught error, terminating…
qw3fd MongoInvalidArgumentError: Method "collection.aggregate()" accepts at most two arguments
qw3fd at Collection.aggregate (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/collection.js:365:19)
qw3fd at packages/meteor.js:350:21
qw3fd at Collection.Mongo.Collection.aggregate (packages/meteorhacks_aggregate.js:39:46)
qw3fd at MethodInvocation.DNE_District_List (server/methods/dne.js:234:49)
qw3fd at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1902:12)
qw3fd at packages/ddp-server/livedata_server.js:1820:15
qw3fd at packages/meteor.js:365:18
qw3fd at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1389:31)
qw3fd at packages/ddp-server/livedata_server.js:1818:36
qw3fd at new Promise (<anonymous>)
qw3fd at Server.applyAsync (packages/ddp-server/livedata_server.js:1817:12)
qw3fd at Server.apply (packages/ddp-server/livedata_server.js:1756:26)
qw3fd at Server.call (packages/ddp-server/livedata_server.js:1738:17)
qw3fd at server/routes/rest/dne/dne.js:14:19
qw3fd at server/lib/routes/app.js:272:4
qw3fd at doCall (packages/meteorhacks_picker.js:128:14)
qw3fd at PickerImp._processRoute (packages/meteorhacks_picker.js:122:5)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:90:14)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:78:7)
qw3fd at PickerImp._dispatch (packages/meteorhacks_picker.js:72:3)
qw3fd at processNextSubRouter (packages/meteorhacks_picker.js:102:17)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:95:7)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:78:7)
qw3fd at cors (/app/bundle/programs/server/npm/node_modules/cors/lib/index.js:188:7)
qw3fd at /app/bundle/programs/server/npm/node_modules/cors/lib/index.js:224:17
qw3fd at origin (server/lib/routes/app.js:250:4)
qw3fd at /app/bundle/programs/server/npm/node_modules/cors/lib/index.js:219:13
qw3fd at optionsCallback (/app/bundle/programs/server/npm/node_modules/cors/lib/index.js:199:9)
qw3fd at corsMiddleware (/app/bundle/programs/server/npm/node_modules/cors/lib/index.js:204:7)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at urlencodedParser (/app/bundle/programs/server/npm/node_modules/body-parser/lib/types/urlencoded.js:91:7)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at jsonParser (/app/bundle/programs/server/npm/node_modules/body-parser/lib/types/json.js:113:7)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at server/lib/routes/app.js:226:2
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at cookieParser (/app/bundle/programs/server/npm/node_modules/cookie-parser/index.js:71:5)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at PickerImp._dispatch (packages/meteorhacks_picker.js:72:3)
qw3fd at packages/meteorhacks_picker.js:162:10
qw3fd at /app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/fiber_pool.js:43:40
qw3fd => awaited here:
qw3fd at Promise.await (/app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:60:12)
qw3fd at Server.apply (packages/ddp-server/livedata_server.js:1769:22)
qw3fd at Server.call (packages/ddp-server/livedata_server.js:1738:17)
qw3fd at server/routes/rest/dne/dne.js:14:19
qw3fd at server/lib/routes/app.js:272:4
qw3fd at doCall (packages/meteorhacks_picker.js:128:14)
qw3fd at PickerImp._processRoute (packages/meteorhacks_picker.js:122:5)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:90:14)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:92:9)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:78:7)
qw3fd at PickerImp._dispatch (packages/meteorhacks_picker.js:72:3)
qw3fd at processNextSubRouter (packages/meteorhacks_picker.js:102:17)
qw3fd at processNextRoute (packages/meteorhacks_picker.js:95:7)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:78:7)
qw3fd at cors (/app/bundle/programs/server/npm/node_modules/cors/lib/index.js:188:7)
qw3fd at /app/bundle/programs/server/npm/node_modules/cors/lib/index.js:224:17
qw3fd at origin (server/lib/routes/app.js:250:4)
qw3fd at /app/bundle/programs/server/npm/node_modules/cors/lib/index.js:219:13
qw3fd at optionsCallback (/app/bundle/programs/server/npm/node_modules/cors/lib/index.js:199:9)
qw3fd at corsMiddleware (/app/bundle/programs/server/npm/node_modules/cors/lib/index.js:204:7)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at urlencodedParser (/app/bundle/programs/server/npm/node_modules/body-parser/lib/types/urlencoded.js:91:7)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at jsonParser (/app/bundle/programs/server/npm/node_modules/body-parser/lib/types/json.js:113:7)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at server/lib/routes/app.js:226:2
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at cookieParser (/app/bundle/programs/server/npm/node_modules/cookie-parser/index.js:71:5)
qw3fd at doCall (packages/meteorhacks_picker.js:140:16)
qw3fd at PickerImp._processMiddleware (packages/meteorhacks_picker.js:134:5)
qw3fd at processNextMiddleware (packages/meteorhacks_picker.js:76:12)
qw3fd at PickerImp._dispatch (packages/meteorhacks_picker.js:72:3)
qw3fd at packages/meteorhacks_picker.js:162:10
qw3fd at /app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/fiber_pool.js:43:40
Devemos utilizar alguma forma de internacionalização para retornar os erros em uma determinada linguagem.
Ao tentar uma atividade o campo [Faixa de Área Privativa] deve receber valor 'Até 25m²' automaticamente se o Imóvel da Atividade existir e tiver o campo [Área Privada] com valor menor que 25m²
Expected value to strictly be equal to:
10
Received:
undefined
Isso aconteceu para outros valores de Area Privada, acredito que algum hook (scriptBeforeValidation) não esteja executando corretamente
Corretor › Deletando Imóveis › Não deve ser possível deletar um Imóvel pois o usuário não tem permissão
Expected value to deeply and strictly equal to:
[{"message": "[Product] You don't have permission to delete this record [internal-error]"}]
Received:
[{"message": "[Product] You don't have permission to delete records"}]
Parece ser a mesma alteração dos logs de erros
Ao criar um usuário ocorreu o erro relacionado ao autonumber gerado para o usuário. No banco, a collection AutoNumber avançou muito.
Provavelmente a função responsável por isso está entrando em loop
Devemos melhorar o parse da URL do Mongo para que cubra todas as possibilidades
Ao tentar cadastrar um contato utilizando nodered ocorreu o seguinte erro no Konecty:
{"level":50,"time":1698763044024,"pid":1,"hostname":"bf9915fa1645","err":{"type":"TypeError","message":"\"\".concat(...).trim(...).toLowerCase(...).value is not a function","stack":"TypeError: \"\".concat(...).trim(...).toLowerCase(...).value is not a function\n at MethodInvocation.<anonymous> (server/methods/process.js:734:72)\n at MethodInvocation.meteorMethods.<computed> (packages/konecty_methods-middleware/konecty_methods-middleware.coffee:141:23)\n at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1902:12)\n at packages/ddp-server/livedata_server.js:1820:15\n at packages/meteor.js:365:18\n at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1389:31)\n at packages/ddp-server/livedata_server.js:1818:36\n at new Promise (<anonymous>)\n at Server.applyAsync (packages/ddp-server/livedata_server.js:1817:12)\n at Server.apply (packages/ddp-server/livedata_server.js:1756:26)\n at Server.call (packages/ddp-server/livedata_server.js:1738:17)\n at server/methods/process.js:98:38\n at Array.some (<anonymous>)\n at MethodInvocation.<anonymous> (server/methods/process.js:74:15)\n at MethodInvocation.meteorMethods.<computed> (packages/konecty_methods-middleware/konecty_methods-middleware.coffee:141:23)\n at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1902:12)\n => awaited here:\n at Promise.await (/app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:60:12)\n at Server.apply (packages/ddp-server/livedata_server.js:1769:22)\n at Server.call (packages/ddp-server/livedata_server.js:1738:17)\n at server/methods/process.js:98:38\n at Array.some (<anonymous>)\n at MethodInvocation.<anonymous> (server/methods/process.js:74:15)\n at MethodInvocation.meteorMethods.<computed> (packages/konecty_methods-middleware/konecty_methods-middleware.coffee:141:23)\n at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1902:12)\n at packages/ddp-server/livedata_server.js:1820:15\n at packages/meteor.js:365:18\n at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1389:31)\n at packages/ddp-server/livedata_server.js:1818:36\n at new Promise (<anonymous>)\n at Server.applyAsync (packages/ddp-server/livedata_server.js:1817:12)\n at Server.apply (packages/ddp-server/livedata_server.js:1756:26)\n at Server.call (packages/ddp-server/livedata_server.js:1738:17)\n => awaited here:\n at Promise.await (/app/bundle/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:60:12)\n at Server.apply (packages/ddp-server/livedata_server.js:1769:22)\n at Server.call (packages/ddp-server/livedata_server.js:1738:17)\n at server/routes/rest/process/processApi.js:8:10\n at server/lib/routes/app.js:248:4\n at doCall (packages/meteorhacks_picker.js:128:14)\n at PickerImp._processRoute (packages/meteorhacks_picker.js:122:5)\n at processNextRoute (packages/meteorhacks_picker.js:90:14)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)\n at processNextRoute (packages/meteorhacks_picker.js:92:9)"},"msg":"uncaughtException \"\".concat(...).trim(...).toLowerCase(...).value is not a function"}
Testei na versão 1.2.3 e o contato é criado com sucesso
Corretor › Cadastrando um Contato › Não deve ser possível cadastrar um Contato pois o campo [Nome] é obrigatório
Expected value to strictly be equal to:
false
Received:
true
Ao dar um error de Duplicate Key
, geralmente por conta de campos marcados como isUnique
, devolver uma mensagem de erro relevante. Se possível, com o campo ofendido e talvez até o outro registro.
Corretor › Modificando uma Oportunidade de Compra › Não deve ser possível modificar o campo [Situação] para 'Desistiu' pois o campo [Motivo da Desistência] é obrigatório
Expected value to deeply and strictly equal to:
[{"message": "[O campo Motivo da Desistência não pode estar vazio]"}]
Received:
[{"message": "[Opportunity] O campo Motivo da Desistência não pode estar vazio"}]
Nessa caso acredito que apenas foi alterada a forma de retorno dos erros dos hooks.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.