@hasna/connectors 1.3.2 → 1.3.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/bin/index.js +2116 -248
- package/bin/mcp.js +1620 -172
- package/bin/serve.js +1230 -128
- package/connectors/connect-aiagenttool/src/api/client.ts +18 -205
- package/connectors/connect-aiagenttool/src/api/index.ts +32 -43
- package/connectors/connect-aiagenttool/src/types/index.ts +7 -233
- package/connectors/connect-airbrake/src/api/client.ts +25 -208
- package/connectors/connect-airbrake/src/api/index.ts +31 -44
- package/connectors/connect-airbrake/src/types/index.ts +10 -233
- package/connectors/connect-airnow/src/api/client.ts +16 -204
- package/connectors/connect-airnow/src/api/index.ts +32 -43
- package/connectors/connect-airnow/src/types/index.ts +5 -233
- package/connectors/connect-airtop/src/api/client.ts +18 -205
- package/connectors/connect-airtop/src/api/index.ts +35 -41
- package/connectors/connect-airtop/src/types/index.ts +9 -233
- package/connectors/connect-aitableai/src/api/client.ts +18 -205
- package/connectors/connect-aitableai/src/api/index.ts +35 -43
- package/connectors/connect-aitableai/src/types/index.ts +10 -233
- package/connectors/connect-alchemy/src/api/client.ts +33 -207
- package/connectors/connect-alchemy/src/api/index.ts +38 -44
- package/connectors/connect-alchemy/src/types/index.ts +13 -235
- package/connectors/connect-alerty/src/api/client.ts +18 -205
- package/connectors/connect-alerty/src/api/index.ts +29 -44
- package/connectors/connect-alerty/src/types/index.ts +9 -233
- package/connectors/connect-alienvault/src/api/client.ts +18 -205
- package/connectors/connect-alienvault/src/api/index.ts +34 -44
- package/connectors/connect-alienvault/src/types/index.ts +9 -233
- package/connectors/connect-alphamoon/src/api/client.ts +19 -206
- package/connectors/connect-alphamoon/src/api/index.ts +30 -42
- package/connectors/connect-alphamoon/src/types/index.ts +10 -233
- package/connectors/connect-alttextai/src/api/client.ts +18 -205
- package/connectors/connect-alttextai/src/api/index.ts +20 -43
- package/connectors/connect-alttextai/src/types/index.ts +7 -233
- package/connectors/connect-amadeus/src/api/client.ts +2 -2
- package/connectors/connect-amilia/src/api/client.ts +26 -211
- package/connectors/connect-amilia/src/api/index.ts +27 -44
- package/connectors/connect-amilia/src/types/index.ts +9 -233
- package/connectors/connect-amqpsender/src/api/client.ts +35 -212
- package/connectors/connect-amqpsender/src/api/index.ts +35 -42
- package/connectors/connect-amqpsender/src/types/index.ts +8 -233
- package/connectors/connect-announcekit/src/api/client.ts +19 -206
- package/connectors/connect-announcekit/src/api/index.ts +30 -43
- package/connectors/connect-announcekit/src/types/index.ts +8 -233
- package/connectors/connect-anthropic/src/api/messages.ts +2 -2
- package/connectors/connect-apiary/src/api/client.ts +19 -206
- package/connectors/connect-apiary/src/api/index.ts +23 -44
- package/connectors/connect-apiary/src/types/index.ts +9 -233
- package/connectors/connect-apiflash/src/api/client.ts +19 -204
- package/connectors/connect-apiflash/src/api/index.ts +48 -43
- package/connectors/connect-apiflash/src/types/index.ts +29 -235
- package/connectors/connect-apitemplateio/src/api/client.ts +18 -205
- package/connectors/connect-apitemplateio/src/api/index.ts +27 -43
- package/connectors/connect-apitemplateio/src/types/index.ts +8 -233
- package/connectors/connect-apptivegrid/src/api/client.ts +19 -205
- package/connectors/connect-apptivegrid/src/api/index.ts +32 -43
- package/connectors/connect-apptivegrid/src/types/index.ts +9 -233
- package/connectors/connect-auth0/src/api/client.ts +20 -206
- package/connectors/connect-auth0/src/api/index.ts +47 -45
- package/connectors/connect-auth0/src/types/index.ts +9 -233
- package/connectors/connect-autom/src/api/client.ts +18 -205
- package/connectors/connect-autom/src/api/index.ts +33 -43
- package/connectors/connect-autom/src/types/index.ts +8 -233
- package/connectors/connect-automizy/src/api/client.ts +19 -206
- package/connectors/connect-automizy/src/api/index.ts +37 -45
- package/connectors/connect-automizy/src/types/index.ts +10 -233
- package/connectors/connect-autopilot/src/api/client.ts +18 -205
- package/connectors/connect-autopilot/src/api/index.ts +34 -42
- package/connectors/connect-autopilot/src/types/index.ts +8 -233
- package/connectors/connect-azureaisearchvectorstore/src/api/client.ts +21 -204
- package/connectors/connect-azureaisearchvectorstore/src/api/index.ts +31 -41
- package/connectors/connect-azureaisearchvectorstore/src/types/index.ts +9 -233
- package/connectors/connect-azurecosmosdb/src/api/client.ts +32 -204
- package/connectors/connect-azurecosmosdb/src/api/index.ts +42 -43
- package/connectors/connect-azurecosmosdb/src/types/index.ts +9 -233
- package/connectors/connect-botstar/src/api/client.ts +19 -206
- package/connectors/connect-botstar/src/api/index.ts +36 -43
- package/connectors/connect-botstar/src/types/index.ts +9 -233
- package/connectors/connect-breezyhr/src/api/client.ts +19 -206
- package/connectors/connect-breezyhr/src/api/index.ts +40 -41
- package/connectors/connect-breezyhr/src/types/index.ts +9 -233
- package/connectors/connect-browseai/src/api/client.ts +18 -205
- package/connectors/connect-browseai/src/api/index.ts +22 -43
- package/connectors/connect-browseai/src/types/index.ts +6 -233
- package/connectors/connect-browserless/src/api/client.ts +20 -203
- package/connectors/connect-browserless/src/api/index.ts +32 -43
- package/connectors/connect-browserless/src/types/index.ts +8 -233
- package/connectors/connect-browserstack/src/api/client.ts +19 -206
- package/connectors/connect-browserstack/src/api/index.ts +28 -43
- package/connectors/connect-browserstack/src/types/index.ts +8 -233
- package/connectors/connect-bugbug/src/api/client.ts +18 -205
- package/connectors/connect-bugbug/src/api/index.ts +27 -42
- package/connectors/connect-bugbug/src/types/index.ts +9 -233
- package/connectors/connect-bugherd/src/api/client.ts +24 -211
- package/connectors/connect-bugherd/src/api/index.ts +33 -43
- package/connectors/connect-bugherd/src/types/index.ts +8 -233
- package/connectors/connect-bugreplay/src/api/client.ts +18 -205
- package/connectors/connect-bugreplay/src/api/index.ts +24 -43
- package/connectors/connect-bugreplay/src/types/index.ts +7 -233
- package/connectors/connect-buildkite/src/api/client.ts +19 -206
- package/connectors/connect-buildkite/src/api/index.ts +37 -43
- package/connectors/connect-buildkite/src/types/index.ts +8 -233
- package/connectors/connect-bunnycdn/src/api/client.ts +18 -207
- package/connectors/connect-bunnycdn/src/api/index.ts +29 -44
- package/connectors/connect-bunnycdn/src/types/index.ts +7 -233
- package/connectors/connect-carbonblack/src/api/client.ts +19 -205
- package/connectors/connect-carbonblack/src/api/index.ts +34 -43
- package/connectors/connect-carbonblack/src/types/index.ts +9 -233
- package/connectors/connect-chargify/src/api/client.ts +21 -204
- package/connectors/connect-chargify/src/api/index.ts +49 -42
- package/connectors/connect-chargify/src/types/index.ts +8 -233
- package/connectors/connect-chatling/src/api/client.ts +18 -205
- package/connectors/connect-chatling/src/api/index.ts +35 -42
- package/connectors/connect-chatling/src/types/index.ts +8 -233
- package/connectors/connect-chekhub/src/api/client.ts +19 -206
- package/connectors/connect-chekhub/src/api/index.ts +33 -44
- package/connectors/connect-chekhub/src/types/index.ts +9 -233
- package/connectors/connect-chromavectorstore/src/api/client.ts +28 -206
- package/connectors/connect-chromavectorstore/src/api/index.ts +41 -44
- package/connectors/connect-chromavectorstore/src/types/index.ts +7 -233
- package/connectors/connect-ciscoumbrella/src/api/client.ts +24 -207
- package/connectors/connect-ciscoumbrella/src/api/index.ts +33 -43
- package/connectors/connect-ciscoumbrella/src/types/index.ts +8 -233
- package/connectors/connect-clicksendsms/src/api/client.ts +19 -206
- package/connectors/connect-clicksendsms/src/api/index.ts +32 -43
- package/connectors/connect-clicksendsms/src/types/index.ts +9 -233
- package/connectors/connect-cloudboost/src/api/client.ts +23 -208
- package/connectors/connect-cloudboost/src/api/index.ts +36 -43
- package/connectors/connect-cloudboost/src/types/index.ts +9 -233
- package/connectors/connect-cloudlayer/src/api/client.ts +20 -209
- package/connectors/connect-cloudlayer/src/api/index.ts +25 -42
- package/connectors/connect-cloudlayer/src/types/index.ts +8 -233
- package/connectors/connect-cody/src/api/client.ts +19 -205
- package/connectors/connect-cody/src/api/index.ts +23 -42
- package/connectors/connect-cody/src/types/index.ts +6 -233
- package/connectors/connect-confluent/src/api/client.ts +21 -205
- package/connectors/connect-confluent/src/api/index.ts +36 -43
- package/connectors/connect-confluent/src/types/index.ts +9 -233
- package/connectors/connect-convertapi/src/api/client.ts +17 -205
- package/connectors/connect-convertapi/src/api/index.ts +20 -44
- package/connectors/connect-convertapi/src/types/index.ts +7 -233
- package/connectors/connect-copper/src/api/client.ts +20 -205
- package/connectors/connect-copper/src/api/index.ts +38 -42
- package/connectors/connect-copper/src/types/index.ts +8 -233
- package/connectors/connect-cortex/src/api/client.ts +19 -206
- package/connectors/connect-cortex/src/api/index.ts +33 -43
- package/connectors/connect-cortex/src/types/index.ts +10 -233
- package/connectors/connect-craftdraft/src/api/client.ts +18 -205
- package/connectors/connect-craftdraft/src/api/index.ts +27 -43
- package/connectors/connect-craftdraft/src/types/index.ts +7 -233
- package/connectors/connect-crisp/src/api/client.ts +24 -207
- package/connectors/connect-crisp/src/api/index.ts +34 -42
- package/connectors/connect-crisp/src/types/index.ts +7 -233
- package/connectors/connect-crossmint/src/api/client.ts +20 -208
- package/connectors/connect-crossmint/src/api/index.ts +29 -43
- package/connectors/connect-crossmint/src/types/index.ts +7 -233
- package/connectors/connect-crowddev/src/api/client.ts +18 -204
- package/connectors/connect-crowddev/src/api/index.ts +23 -43
- package/connectors/connect-crowddev/src/types/index.ts +8 -233
- package/connectors/connect-crowdpower/src/api/client.ts +18 -205
- package/connectors/connect-crowdpower/src/api/index.ts +28 -44
- package/connectors/connect-crowdpower/src/types/index.ts +9 -233
- package/connectors/connect-cryptolens/src/api/client.ts +20 -211
- package/connectors/connect-cryptolens/src/api/index.ts +34 -44
- package/connectors/connect-cryptolens/src/types/index.ts +7 -233
- package/connectors/connect-customerio/src/api/client.ts +37 -211
- package/connectors/connect-customerio/src/api/index.ts +34 -44
- package/connectors/connect-customerio/src/types/index.ts +9 -233
- package/connectors/connect-daffy/src/api/client.ts +18 -205
- package/connectors/connect-daffy/src/api/index.ts +25 -42
- package/connectors/connect-daffy/src/types/index.ts +8 -233
- package/connectors/connect-datasoap/src/api/client.ts +18 -205
- package/connectors/connect-datasoap/src/api/index.ts +28 -42
- package/connectors/connect-datasoap/src/types/index.ts +8 -233
- package/connectors/connect-dayschedule/src/api/client.ts +18 -205
- package/connectors/connect-dayschedule/src/api/index.ts +25 -43
- package/connectors/connect-dayschedule/src/types/index.ts +8 -233
- package/connectors/connect-deepl/src/api/client.ts +46 -185
- package/connectors/connect-deepl/src/api/index.ts +18 -40
- package/connectors/connect-deepl/src/api/translate.ts +98 -0
- package/connectors/connect-deepl/src/types/index.ts +33 -217
- package/connectors/connect-demio/src/api/client.ts +19 -204
- package/connectors/connect-demio/src/api/index.ts +29 -42
- package/connectors/connect-demio/src/types/index.ts +7 -233
- package/connectors/connect-dhl/src/api/client.ts +22 -201
- package/connectors/connect-dhl/src/api/index.ts +23 -42
- package/connectors/connect-dhl/src/types/index.ts +10 -233
- package/connectors/connect-docsbotai/src/api/client.ts +21 -206
- package/connectors/connect-docsbotai/src/api/index.ts +55 -39
- package/connectors/connect-docsbotai/src/types/index.ts +7 -233
- package/connectors/connect-drift/src/api/client.ts +19 -203
- package/connectors/connect-drift/src/api/index.ts +41 -42
- package/connectors/connect-drift/src/types/index.ts +7 -233
- package/connectors/connect-dropcontact/src/api/client.ts +21 -209
- package/connectors/connect-dropcontact/src/api/index.ts +23 -42
- package/connectors/connect-dropcontact/src/types/index.ts +8 -233
- package/connectors/connect-eartho/src/api/client.ts +21 -206
- package/connectors/connect-eartho/src/api/index.ts +24 -44
- package/connectors/connect-eartho/src/types/index.ts +6 -233
- package/connectors/connect-echowin/src/api/client.ts +18 -205
- package/connectors/connect-echowin/src/api/index.ts +29 -43
- package/connectors/connect-echowin/src/types/index.ts +8 -233
- package/connectors/connect-ecwid/src/api/client.ts +20 -205
- package/connectors/connect-ecwid/src/api/index.ts +36 -42
- package/connectors/connect-ecwid/src/types/index.ts +9 -233
- package/connectors/connect-elasticsearch/src/api/client.ts +29 -204
- package/connectors/connect-elasticsearch/src/api/index.ts +40 -41
- package/connectors/connect-elasticsearch/src/types/index.ts +9 -233
- package/connectors/connect-emelia/src/api/client.ts +23 -199
- package/connectors/connect-emelia/src/api/index.ts +60 -41
- package/connectors/connect-emelia/src/types/index.ts +24 -220
- package/connectors/connect-engati/src/api/client.ts +20 -205
- package/connectors/connect-engati/src/api/index.ts +31 -42
- package/connectors/connect-engati/src/types/index.ts +9 -233
- package/connectors/connect-erpnext/src/api/client.ts +21 -204
- package/connectors/connect-erpnext/src/api/index.ts +34 -43
- package/connectors/connect-erpnext/src/types/index.ts +6 -233
- package/connectors/connect-evervault/src/api/client.ts +22 -211
- package/connectors/connect-evervault/src/api/index.ts +28 -42
- package/connectors/connect-evervault/src/types/index.ts +9 -233
- package/connectors/connect-faros/src/api/client.ts +18 -204
- package/connectors/connect-faros/src/api/index.ts +31 -43
- package/connectors/connect-faros/src/types/index.ts +9 -233
- package/connectors/connect-fastbots/src/api/client.ts +18 -205
- package/connectors/connect-fastbots/src/api/index.ts +31 -42
- package/connectors/connect-fastbots/src/types/index.ts +8 -233
- package/connectors/connect-flagship/src/api/client.ts +24 -209
- package/connectors/connect-flagship/src/api/index.ts +24 -42
- package/connectors/connect-flagship/src/types/index.ts +7 -233
- package/connectors/connect-float/src/api/client.ts +19 -206
- package/connectors/connect-float/src/api/index.ts +38 -42
- package/connectors/connect-float/src/types/index.ts +9 -233
- package/connectors/connect-flotiq/src/api/client.ts +18 -205
- package/connectors/connect-flotiq/src/api/index.ts +38 -42
- package/connectors/connect-flotiq/src/types/index.ts +9 -233
- package/connectors/connect-formcarry/src/api/client.ts +20 -210
- package/connectors/connect-formcarry/src/api/index.ts +25 -46
- package/connectors/connect-formcarry/src/types/index.ts +5 -235
- package/connectors/connect-formdesk/src/api/client.ts +19 -204
- package/connectors/connect-formdesk/src/api/index.ts +23 -44
- package/connectors/connect-formdesk/src/types/index.ts +7 -233
- package/connectors/connect-formsonfire/src/api/client.ts +18 -205
- package/connectors/connect-formsonfire/src/api/index.ts +21 -44
- package/connectors/connect-formsonfire/src/types/index.ts +8 -233
- package/connectors/connect-fortinetfortigate/src/api/client.ts +19 -205
- package/connectors/connect-fortinetfortigate/src/api/index.ts +33 -43
- package/connectors/connect-fortinetfortigate/src/types/index.ts +8 -233
- package/connectors/connect-freedictionary/src/api/client.ts +11 -205
- package/connectors/connect-freedictionary/src/api/index.ts +29 -42
- package/connectors/connect-freedictionary/src/types/index.ts +5 -233
- package/connectors/connect-freshworkscrm/src/api/client.ts +18 -204
- package/connectors/connect-freshworkscrm/src/api/index.ts +41 -41
- package/connectors/connect-freshworkscrm/src/types/index.ts +8 -233
- package/connectors/connect-fusioo/src/api/client.ts +19 -206
- package/connectors/connect-fusioo/src/api/index.ts +29 -43
- package/connectors/connect-fusioo/src/types/index.ts +8 -233
- package/connectors/connect-genderapi/src/api/client.ts +14 -205
- package/connectors/connect-genderapi/src/api/index.ts +23 -42
- package/connectors/connect-genderapi/src/types/index.ts +5 -233
- package/connectors/connect-ghost/src/api/client.ts +45 -211
- package/connectors/connect-ghost/src/api/index.ts +38 -43
- package/connectors/connect-ghost/src/types/index.ts +9 -233
- package/connectors/connect-gitea/src/api/client.ts +19 -205
- package/connectors/connect-gitea/src/api/index.ts +39 -43
- package/connectors/connect-gitea/src/types/index.ts +9 -233
- package/connectors/connect-github/src/api/client.ts +11 -0
- package/connectors/connect-github/src/api/commits.ts +169 -0
- package/connectors/connect-github/src/api/index.ts +12 -0
- package/connectors/connect-github/src/api/releases.ts +158 -0
- package/connectors/connect-github/src/api/workflows.ts +169 -0
- package/connectors/connect-github/src/types/index.ts +190 -0
- package/connectors/connect-gmail/src/cli/index.ts +3 -32
- package/connectors/connect-googleads/src/api/adGroups.ts +3 -3
- package/connectors/connect-googleads/src/api/ads.ts +3 -3
- package/connectors/connect-googleads/src/api/campaigns.ts +4 -4
- package/connectors/connect-googleads/src/api/client.ts +1 -1
- package/connectors/connect-googleads/src/api/keywords.ts +6 -6
- package/connectors/connect-googlebigquery/src/api/client.ts +24 -204
- package/connectors/connect-googlebigquery/src/api/index.ts +39 -42
- package/connectors/connect-googlebigquery/src/types/index.ts +8 -233
- package/connectors/connect-googletranslate/src/api/client.ts +20 -204
- package/connectors/connect-googletranslate/src/api/index.ts +22 -43
- package/connectors/connect-googletranslate/src/types/index.ts +9 -233
- package/connectors/connect-gotowebinar/src/api/client.ts +24 -207
- package/connectors/connect-gotowebinar/src/api/index.ts +36 -43
- package/connectors/connect-gotowebinar/src/types/index.ts +7 -233
- package/connectors/connect-gptea/src/api/client.ts +20 -209
- package/connectors/connect-gptea/src/api/index.ts +23 -42
- package/connectors/connect-gptea/src/types/index.ts +6 -233
- package/connectors/connect-grain/src/api/client.ts +19 -206
- package/connectors/connect-grain/src/api/index.ts +29 -43
- package/connectors/connect-grain/src/types/index.ts +8 -233
- package/connectors/connect-grist/src/api/client.ts +18 -204
- package/connectors/connect-grist/src/api/index.ts +27 -43
- package/connectors/connect-grist/src/types/index.ts +10 -233
- package/connectors/connect-handwrytten/src/api/client.ts +18 -205
- package/connectors/connect-handwrytten/src/api/index.ts +23 -43
- package/connectors/connect-handwrytten/src/types/index.ts +8 -233
- package/connectors/connect-harrypotterapi/src/api/client.ts +9 -206
- package/connectors/connect-harrypotterapi/src/api/index.ts +15 -45
- package/connectors/connect-harrypotterapi/src/types/index.ts +5 -233
- package/connectors/connect-helcim/src/api/client.ts +20 -210
- package/connectors/connect-helcim/src/api/index.ts +38 -43
- package/connectors/connect-helcim/src/types/index.ts +15 -228
- package/connectors/connect-heysummit/src/api/client.ts +22 -209
- package/connectors/connect-heysummit/src/api/index.ts +23 -44
- package/connectors/connect-heysummit/src/types/index.ts +8 -233
- package/connectors/connect-hubplanner/src/api/client.ts +18 -205
- package/connectors/connect-hubplanner/src/api/index.ts +33 -42
- package/connectors/connect-hubplanner/src/types/index.ts +8 -233
- package/connectors/connect-huggingface/src/api/client.ts +5 -0
- package/connectors/connect-huggingface/src/api/datasets.ts +73 -0
- package/connectors/connect-huggingface/src/api/index.ts +17 -19
- package/connectors/connect-huggingface/src/api/inference.ts +199 -0
- package/connectors/connect-huggingface/src/api/models.ts +66 -0
- package/connectors/connect-huggingface/src/api/spaces.ts +42 -0
- package/connectors/connect-huggingface/src/cli/index.ts +148 -36
- package/connectors/connect-hunter/src/api/client.ts +14 -205
- package/connectors/connect-hunter/src/api/index.ts +25 -42
- package/connectors/connect-hunter/src/types/index.ts +8 -233
- package/connectors/connect-hybridanalysis/src/api/client.ts +24 -204
- package/connectors/connect-hybridanalysis/src/api/index.ts +24 -43
- package/connectors/connect-hybridanalysis/src/types/index.ts +7 -233
- package/connectors/connect-ideta/src/api/client.ts +18 -205
- package/connectors/connect-ideta/src/api/index.ts +25 -42
- package/connectors/connect-ideta/src/types/index.ts +8 -233
- package/connectors/connect-invoiced/src/api/client.ts +19 -208
- package/connectors/connect-invoiced/src/api/index.ts +22 -49
- package/connectors/connect-invoiced/src/types/index.ts +5 -237
- package/connectors/connect-ip2location/src/api/client.ts +14 -205
- package/connectors/connect-ip2location/src/api/index.ts +20 -43
- package/connectors/connect-ip2location/src/types/index.ts +5 -233
- package/connectors/connect-ipinfo/src/api/client.ts +16 -206
- package/connectors/connect-ipinfo/src/api/index.ts +21 -47
- package/connectors/connect-ipinfo/src/types/index.ts +6 -233
- package/connectors/connect-jasper/src/api/client.ts +18 -202
- package/connectors/connect-jasper/src/api/index.ts +41 -43
- package/connectors/connect-jasper/src/types/index.ts +7 -233
- package/connectors/connect-jenkins/src/api/client.ts +25 -205
- package/connectors/connect-jenkins/src/api/index.ts +38 -43
- package/connectors/connect-jenkins/src/types/index.ts +8 -233
- package/connectors/connect-jinaai/src/api/client.ts +21 -204
- package/connectors/connect-jinaai/src/api/index.ts +23 -42
- package/connectors/connect-jinaai/src/types/index.ts +9 -233
- package/connectors/connect-jira/src/api/client.ts +57 -0
- package/connectors/connect-jira/src/api/index.ts +22 -63
- package/connectors/connect-kafka/src/api/client.ts +27 -206
- package/connectors/connect-kafka/src/api/index.ts +29 -42
- package/connectors/connect-kafka/src/types/index.ts +9 -233
- package/connectors/connect-kaggle/src/api/client.ts +15 -205
- package/connectors/connect-kaggle/src/api/index.ts +27 -43
- package/connectors/connect-kaggle/src/types/index.ts +7 -233
- package/connectors/connect-kanbantool/src/api/client.ts +19 -205
- package/connectors/connect-kanbantool/src/api/index.ts +34 -43
- package/connectors/connect-kanbantool/src/types/index.ts +8 -233
- package/connectors/connect-keygen/src/api/client.ts +19 -205
- package/connectors/connect-keygen/src/api/index.ts +33 -43
- package/connectors/connect-keygen/src/types/index.ts +8 -233
- package/connectors/connect-kibana/src/api/client.ts +24 -204
- package/connectors/connect-kibana/src/api/index.ts +36 -42
- package/connectors/connect-kibana/src/types/index.ts +9 -233
- package/connectors/connect-lambdatest/src/api/client.ts +19 -206
- package/connectors/connect-lambdatest/src/api/index.ts +29 -44
- package/connectors/connect-lambdatest/src/types/index.ts +8 -233
- package/connectors/connect-laposta/src/api/client.ts +19 -206
- package/connectors/connect-laposta/src/api/index.ts +39 -42
- package/connectors/connect-laposta/src/types/index.ts +8 -233
- package/connectors/connect-launch27/src/api/client.ts +18 -207
- package/connectors/connect-launch27/src/api/index.ts +31 -42
- package/connectors/connect-launch27/src/types/index.ts +7 -233
- package/connectors/connect-leadboxer/src/api/client.ts +18 -205
- package/connectors/connect-leadboxer/src/api/index.ts +20 -44
- package/connectors/connect-leadboxer/src/types/index.ts +7 -233
- package/connectors/connect-leadpops/src/api/client.ts +18 -205
- package/connectors/connect-leadpops/src/api/index.ts +25 -45
- package/connectors/connect-leadpops/src/types/index.ts +7 -233
- package/connectors/connect-lighthouse/src/api/client.ts +18 -205
- package/connectors/connect-lighthouse/src/api/index.ts +33 -41
- package/connectors/connect-lighthouse/src/types/index.ts +9 -233
- package/connectors/connect-limego/src/api/client.ts +18 -205
- package/connectors/connect-limego/src/api/index.ts +25 -44
- package/connectors/connect-limego/src/types/index.ts +8 -233
- package/connectors/connect-line/src/api/client.ts +23 -205
- package/connectors/connect-line/src/api/index.ts +34 -44
- package/connectors/connect-line/src/types/index.ts +9 -233
- package/connectors/connect-linear/src/api/comments.ts +148 -0
- package/connectors/connect-linear/src/api/index.ts +8 -0
- package/connectors/connect-linear/src/api/states.ts +88 -0
- package/connectors/connect-linear/src/types/index.ts +68 -0
- package/connectors/connect-lingvanex/src/api/client.ts +19 -209
- package/connectors/connect-lingvanex/src/api/index.ts +24 -42
- package/connectors/connect-lingvanex/src/types/index.ts +7 -233
- package/connectors/connect-liveagent/src/api/client.ts +18 -204
- package/connectors/connect-liveagent/src/api/index.ts +34 -42
- package/connectors/connect-liveagent/src/types/index.ts +9 -233
- package/connectors/connect-loginradius/src/api/client.ts +23 -202
- package/connectors/connect-loginradius/src/api/index.ts +35 -43
- package/connectors/connect-loginradius/src/types/index.ts +9 -233
- package/connectors/connect-mailerlite/src/api/client.ts +18 -205
- package/connectors/connect-mailerlite/src/api/index.ts +35 -42
- package/connectors/connect-mailerlite/src/types/index.ts +9 -233
- package/connectors/connect-mailgun/src/api/client.ts +29 -201
- package/connectors/connect-mailgun/src/api/index.ts +37 -43
- package/connectors/connect-mailgun/src/types/index.ts +10 -233
- package/connectors/connect-malcore/src/api/client.ts +18 -205
- package/connectors/connect-malcore/src/api/index.ts +30 -43
- package/connectors/connect-malcore/src/types/index.ts +7 -233
- package/connectors/connect-marketplacer/src/api/client.ts +18 -204
- package/connectors/connect-marketplacer/src/api/index.ts +30 -44
- package/connectors/connect-marketplacer/src/types/index.ts +9 -233
- package/connectors/connect-matrix/src/api/client.ts +21 -204
- package/connectors/connect-matrix/src/api/index.ts +34 -41
- package/connectors/connect-matrix/src/types/index.ts +10 -233
- package/connectors/connect-mattermost/src/api/client.ts +19 -205
- package/connectors/connect-mattermost/src/api/index.ts +34 -42
- package/connectors/connect-mattermost/src/types/index.ts +8 -233
- package/connectors/connect-mem/src/api/client.ts +18 -205
- package/connectors/connect-mem/src/api/index.ts +20 -43
- package/connectors/connect-mem/src/types/index.ts +6 -233
- package/connectors/connect-mercury/CLAUDE.md +0 -1
- package/connectors/connect-microsoftentraid/src/api/client.ts +21 -205
- package/connectors/connect-microsoftentraid/src/api/index.ts +29 -44
- package/connectors/connect-microsoftentraid/src/types/index.ts +8 -233
- package/connectors/connect-microsoftentraidazureactivedirectory/src/api/client.ts +21 -205
- package/connectors/connect-microsoftentraidazureactivedirectory/src/api/index.ts +37 -44
- package/connectors/connect-microsoftentraidazureactivedirectory/src/types/index.ts +10 -233
- package/connectors/connect-microsoftgraphsecurity/src/api/client.ts +21 -205
- package/connectors/connect-microsoftgraphsecurity/src/api/index.ts +28 -43
- package/connectors/connect-microsoftgraphsecurity/src/types/index.ts +8 -233
- package/connectors/connect-microsoftonedrive/src/api/client.ts +21 -205
- package/connectors/connect-microsoftonedrive/src/api/index.ts +41 -41
- package/connectors/connect-microsoftonedrive/src/types/index.ts +8 -233
- package/connectors/connect-microsofttodo/src/api/client.ts +21 -205
- package/connectors/connect-microsofttodo/src/api/index.ts +35 -43
- package/connectors/connect-microsofttodo/src/types/index.ts +6 -233
- package/connectors/connect-miestro/src/api/client.ts +18 -205
- package/connectors/connect-miestro/src/api/index.ts +30 -43
- package/connectors/connect-miestro/src/types/index.ts +8 -233
- package/connectors/connect-miro/src/api/client.ts +19 -206
- package/connectors/connect-miro/src/api/index.ts +32 -41
- package/connectors/connect-miro/src/types/index.ts +10 -233
- package/connectors/connect-missive/src/api/client.ts +19 -206
- package/connectors/connect-missive/src/api/index.ts +35 -42
- package/connectors/connect-missive/src/types/index.ts +13 -235
- package/connectors/connect-mist/src/api/client.ts +19 -205
- package/connectors/connect-mist/src/api/index.ts +24 -43
- package/connectors/connect-mist/src/types/index.ts +8 -233
- package/connectors/connect-mistral/src/api/chat.ts +2 -1
- package/connectors/connect-mistral/src/api/embeddings.ts +2 -1
- package/connectors/connect-monday/src/api/index.ts +120 -1
- package/connectors/connect-moonmail/src/api/client.ts +18 -205
- package/connectors/connect-moonmail/src/api/index.ts +31 -43
- package/connectors/connect-moonmail/src/types/index.ts +7 -233
- package/connectors/connect-mxtoolbox/src/api/client.ts +15 -204
- package/connectors/connect-mxtoolbox/src/api/index.ts +25 -45
- package/connectors/connect-mxtoolbox/src/types/index.ts +10 -233
- package/connectors/connect-myaskai/src/api/client.ts +18 -205
- package/connectors/connect-myaskai/src/api/index.ts +28 -42
- package/connectors/connect-myaskai/src/types/index.ts +7 -233
- package/connectors/connect-myphoner/src/api/client.ts +18 -205
- package/connectors/connect-myphoner/src/api/index.ts +30 -43
- package/connectors/connect-myphoner/src/types/index.ts +8 -233
- package/connectors/connect-nanonetsocr/src/api/client.ts +19 -206
- package/connectors/connect-nanonetsocr/src/api/index.ts +22 -42
- package/connectors/connect-nanonetsocr/src/types/index.ts +8 -233
- package/connectors/connect-nocodb/src/api/client.ts +22 -208
- package/connectors/connect-nocodb/src/api/index.ts +40 -42
- package/connectors/connect-nocodb/src/types/index.ts +10 -233
- package/connectors/connect-npm/src/api/client.ts +22 -203
- package/connectors/connect-npm/src/api/index.ts +24 -43
- package/connectors/connect-npm/src/types/index.ts +8 -233
- package/connectors/connect-nuclia/src/api/client.ts +19 -205
- package/connectors/connect-nuclia/src/api/index.ts +32 -43
- package/connectors/connect-nuclia/src/types/index.ts +8 -233
- package/connectors/connect-nyota/src/api/client.ts +18 -205
- package/connectors/connect-nyota/src/api/index.ts +24 -43
- package/connectors/connect-nyota/src/types/index.ts +8 -233
- package/connectors/connect-offalerts/src/api/client.ts +18 -205
- package/connectors/connect-offalerts/src/api/index.ts +25 -44
- package/connectors/connect-offalerts/src/types/index.ts +7 -233
- package/connectors/connect-okta/src/api/client.ts +21 -204
- package/connectors/connect-okta/src/api/index.ts +40 -42
- package/connectors/connect-okta/src/types/index.ts +10 -233
- package/connectors/connect-omnimind/src/api/client.ts +18 -205
- package/connectors/connect-omnimind/src/api/index.ts +31 -43
- package/connectors/connect-omnimind/src/types/index.ts +7 -233
- package/connectors/connect-on2air/src/api/client.ts +18 -205
- package/connectors/connect-on2air/src/api/index.ts +26 -44
- package/connectors/connect-on2air/src/types/index.ts +7 -233
- package/connectors/connect-oneai/src/api/client.ts +19 -209
- package/connectors/connect-oneai/src/api/index.ts +36 -39
- package/connectors/connect-oneai/src/types/index.ts +7 -233
- package/connectors/connect-onesimpleapi/src/api/client.ts +17 -204
- package/connectors/connect-onesimpleapi/src/api/index.ts +30 -43
- package/connectors/connect-onesimpleapi/src/types/index.ts +8 -233
- package/connectors/connect-openai/src/api/chat.ts +2 -2
- package/connectors/connect-openai/src/api/images.ts +52 -8
- package/connectors/connect-openai/src/types/index.ts +0 -10
- package/connectors/connect-ortto/src/api/client.ts +19 -204
- package/connectors/connect-ortto/src/api/index.ts +28 -44
- package/connectors/connect-ortto/src/types/index.ts +9 -233
- package/connectors/connect-oura/src/api/client.ts +16 -205
- package/connectors/connect-oura/src/api/index.ts +25 -42
- package/connectors/connect-oura/src/types/index.ts +9 -233
- package/connectors/connect-papyrs/src/api/client.ts +18 -204
- package/connectors/connect-papyrs/src/api/index.ts +30 -43
- package/connectors/connect-papyrs/src/types/index.ts +8 -233
- package/connectors/connect-paymo/src/api/client.ts +19 -206
- package/connectors/connect-paymo/src/api/index.ts +34 -43
- package/connectors/connect-paymo/src/types/index.ts +9 -233
- package/connectors/connect-personalai/src/api/client.ts +18 -205
- package/connectors/connect-personalai/src/api/index.ts +26 -43
- package/connectors/connect-personalai/src/types/index.ts +8 -233
- package/connectors/connect-phantombuster/src/api/client.ts +18 -205
- package/connectors/connect-phantombuster/src/api/index.ts +28 -43
- package/connectors/connect-phantombuster/src/types/index.ts +6 -233
- package/connectors/connect-planyoonlinebooking/src/api/client.ts +19 -209
- package/connectors/connect-planyoonlinebooking/src/api/index.ts +34 -43
- package/connectors/connect-planyoonlinebooking/src/types/index.ts +8 -233
- package/connectors/connect-plivo/src/api/client.ts +22 -208
- package/connectors/connect-plivo/src/api/index.ts +32 -44
- package/connectors/connect-plivo/src/types/index.ts +9 -233
- package/connectors/connect-posthog/src/api/client.ts +22 -205
- package/connectors/connect-posthog/src/api/index.ts +65 -39
- package/connectors/connect-posthog/src/types/index.ts +8 -233
- package/connectors/connect-practitest/src/api/client.ts +19 -206
- package/connectors/connect-practitest/src/api/index.ts +36 -40
- package/connectors/connect-practitest/src/types/index.ts +9 -233
- package/connectors/connect-predisai/src/api/client.ts +18 -205
- package/connectors/connect-predisai/src/api/index.ts +25 -43
- package/connectors/connect-predisai/src/types/index.ts +7 -233
- package/connectors/connect-prodia/src/api/client.ts +18 -205
- package/connectors/connect-prodia/src/api/index.ts +26 -43
- package/connectors/connect-prodia/src/types/index.ts +7 -233
- package/connectors/connect-profitwell/src/api/client.ts +18 -205
- package/connectors/connect-profitwell/src/api/index.ts +28 -44
- package/connectors/connect-profitwell/src/types/index.ts +7 -233
- package/connectors/connect-projectbubbleproprofsproject/src/api/client.ts +18 -205
- package/connectors/connect-projectbubbleproprofsproject/src/api/index.ts +32 -43
- package/connectors/connect-projectbubbleproprofsproject/src/types/index.ts +8 -233
- package/connectors/connect-pulsetic/src/api/client.ts +18 -205
- package/connectors/connect-pulsetic/src/api/index.ts +25 -43
- package/connectors/connect-pulsetic/src/types/index.ts +8 -233
- package/connectors/connect-pusher/src/api/client.ts +36 -205
- package/connectors/connect-pusher/src/api/index.ts +29 -41
- package/connectors/connect-pusher/src/types/index.ts +8 -233
- package/connectors/connect-pushover/src/api/client.ts +24 -207
- package/connectors/connect-pushover/src/api/index.ts +27 -46
- package/connectors/connect-pushover/src/types/index.ts +5 -237
- package/connectors/connect-qualys/src/api/client.ts +21 -205
- package/connectors/connect-qualys/src/api/index.ts +35 -42
- package/connectors/connect-qualys/src/types/index.ts +8 -233
- package/connectors/connect-quentn/src/api/client.ts +18 -204
- package/connectors/connect-quentn/src/api/index.ts +35 -44
- package/connectors/connect-quentn/src/types/index.ts +9 -233
- package/connectors/connect-questdb/src/api/client.ts +22 -204
- package/connectors/connect-questdb/src/api/index.ts +35 -43
- package/connectors/connect-questdb/src/types/index.ts +7 -233
- package/connectors/connect-quintadb/src/api/client.ts +21 -207
- package/connectors/connect-quintadb/src/api/index.ts +32 -43
- package/connectors/connect-quintadb/src/types/index.ts +6 -233
- package/connectors/connect-rapid7insightvm/src/api/client.ts +19 -205
- package/connectors/connect-rapid7insightvm/src/api/index.ts +34 -42
- package/connectors/connect-rapid7insightvm/src/types/index.ts +9 -233
- package/connectors/connect-raventools/src/api/client.ts +20 -209
- package/connectors/connect-raventools/src/api/index.ts +24 -44
- package/connectors/connect-raventools/src/types/index.ts +8 -233
- package/connectors/connect-rdstationcrm/src/api/client.ts +20 -206
- package/connectors/connect-rdstationcrm/src/api/index.ts +34 -43
- package/connectors/connect-rdstationcrm/src/types/index.ts +9 -233
- package/connectors/connect-realphonevalidation/src/api/client.ts +15 -205
- package/connectors/connect-realphonevalidation/src/api/index.ts +21 -43
- package/connectors/connect-realphonevalidation/src/types/index.ts +5 -233
- package/connectors/connect-recharge/src/api/client.ts +19 -206
- package/connectors/connect-recharge/src/api/index.ts +35 -42
- package/connectors/connect-recharge/src/types/index.ts +10 -233
- package/connectors/connect-relevanceai/src/api/client.ts +21 -204
- package/connectors/connect-relevanceai/src/api/index.ts +28 -41
- package/connectors/connect-relevanceai/src/types/index.ts +8 -233
- package/connectors/connect-relinkurlshortener/src/api/client.ts +18 -205
- package/connectors/connect-relinkurlshortener/src/api/index.ts +25 -44
- package/connectors/connect-relinkurlshortener/src/types/index.ts +6 -233
- package/connectors/connect-reply/src/api/client.ts +18 -205
- package/connectors/connect-reply/src/api/index.ts +31 -44
- package/connectors/connect-reply/src/types/index.ts +9 -233
- package/connectors/connect-ritekit/src/api/client.ts +15 -206
- package/connectors/connect-ritekit/src/api/index.ts +32 -43
- package/connectors/connect-ritekit/src/types/index.ts +7 -233
- package/connectors/connect-rocketchat/src/api/client.ts +20 -205
- package/connectors/connect-rocketchat/src/api/index.ts +39 -41
- package/connectors/connect-rocketchat/src/types/index.ts +8 -233
- package/connectors/connect-rundeck/src/api/client.ts +20 -205
- package/connectors/connect-rundeck/src/api/index.ts +30 -43
- package/connectors/connect-rundeck/src/types/index.ts +8 -233
- package/connectors/connect-salesforce/src/api/client.ts +49 -0
- package/connectors/connect-salesforce/src/api/index.ts +18 -15
- package/connectors/connect-samsungsmartthings/src/api/client.ts +19 -206
- package/connectors/connect-samsungsmartthings/src/api/index.ts +26 -44
- package/connectors/connect-samsungsmartthings/src/types/index.ts +10 -233
- package/connectors/connect-scrapeitcloud/src/api/client.ts +18 -205
- package/connectors/connect-scrapeitcloud/src/api/index.ts +22 -43
- package/connectors/connect-scrapeitcloud/src/types/index.ts +7 -233
- package/connectors/connect-seamlessai/src/api/client.ts +18 -205
- package/connectors/connect-seamlessai/src/api/index.ts +28 -43
- package/connectors/connect-seamlessai/src/types/index.ts +8 -233
- package/connectors/connect-sekoia/src/api/client.ts +18 -205
- package/connectors/connect-sekoia/src/api/index.ts +31 -41
- package/connectors/connect-sekoia/src/types/index.ts +9 -233
- package/connectors/connect-sellix/src/api/client.ts +18 -205
- package/connectors/connect-sellix/src/api/index.ts +32 -42
- package/connectors/connect-sellix/src/types/index.ts +10 -233
- package/connectors/connect-servicenow/src/api/client.ts +21 -204
- package/connectors/connect-servicenow/src/api/index.ts +45 -41
- package/connectors/connect-servicenow/src/types/index.ts +9 -233
- package/connectors/connect-shopify/src/api/products.ts +79 -2
- package/connectors/connect-shuffler/src/api/client.ts +18 -204
- package/connectors/connect-shuffler/src/api/index.ts +29 -44
- package/connectors/connect-shuffler/src/types/index.ts +8 -233
- package/connectors/connect-signaturit/src/api/client.ts +19 -205
- package/connectors/connect-signaturit/src/api/index.ts +30 -42
- package/connectors/connect-signaturit/src/types/index.ts +10 -233
- package/connectors/connect-simplehash/src/api/client.ts +14 -204
- package/connectors/connect-simplehash/src/api/index.ts +29 -43
- package/connectors/connect-simplehash/src/types/index.ts +7 -233
- package/connectors/connect-simplelocalize/src/api/client.ts +18 -205
- package/connectors/connect-simplelocalize/src/api/index.ts +33 -42
- package/connectors/connect-simplelocalize/src/types/index.ts +13 -235
- package/connectors/connect-sitespeakai/src/api/client.ts +18 -205
- package/connectors/connect-sitespeakai/src/api/index.ts +29 -41
- package/connectors/connect-sitespeakai/src/types/index.ts +8 -233
- package/connectors/connect-smaily/src/api/client.ts +19 -205
- package/connectors/connect-smaily/src/api/index.ts +29 -44
- package/connectors/connect-smaily/src/types/index.ts +8 -233
- package/connectors/connect-snatchbot/src/api/client.ts +19 -206
- package/connectors/connect-snatchbot/src/api/index.ts +25 -42
- package/connectors/connect-snatchbot/src/types/index.ts +8 -233
- package/connectors/connect-solvedata/src/api/client.ts +18 -205
- package/connectors/connect-solvedata/src/api/index.ts +26 -43
- package/connectors/connect-solvedata/src/types/index.ts +7 -233
- package/connectors/connect-specter/src/api/client.ts +24 -209
- package/connectors/connect-specter/src/api/index.ts +27 -43
- package/connectors/connect-specter/src/types/index.ts +10 -233
- package/connectors/connect-spike/src/api/client.ts +18 -205
- package/connectors/connect-spike/src/api/index.ts +28 -45
- package/connectors/connect-spike/src/types/index.ts +8 -233
- package/connectors/connect-sportsdata/src/api/client.ts +14 -206
- package/connectors/connect-sportsdata/src/api/index.ts +32 -46
- package/connectors/connect-sportsdata/src/types/index.ts +8 -233
- package/connectors/connect-sslmatecertspotterapi/src/api/client.ts +15 -204
- package/connectors/connect-sslmatecertspotterapi/src/api/index.ts +23 -43
- package/connectors/connect-sslmatecertspotterapi/src/types/index.ts +5 -233
- package/connectors/connect-starton/src/api/client.ts +18 -205
- package/connectors/connect-starton/src/api/index.ts +34 -42
- package/connectors/connect-starton/src/types/index.ts +8 -233
- package/connectors/connect-statuscake/src/api/client.ts +18 -205
- package/connectors/connect-statuscake/src/api/index.ts +30 -44
- package/connectors/connect-statuscake/src/types/index.ts +9 -233
- package/connectors/connect-strapi/src/api/client.ts +21 -204
- package/connectors/connect-strapi/src/api/index.ts +38 -42
- package/connectors/connect-strapi/src/types/index.ts +9 -233
- package/connectors/connect-supernormal/src/api/client.ts +18 -205
- package/connectors/connect-supernormal/src/api/index.ts +28 -43
- package/connectors/connect-supernormal/src/types/index.ts +8 -233
- package/connectors/connect-supportivekoala/src/api/client.ts +18 -205
- package/connectors/connect-supportivekoala/src/api/index.ts +21 -43
- package/connectors/connect-supportivekoala/src/types/index.ts +7 -233
- package/connectors/connect-surveysparrow/src/api/client.ts +20 -210
- package/connectors/connect-surveysparrow/src/api/index.ts +39 -42
- package/connectors/connect-surveysparrow/src/types/index.ts +7 -233
- package/connectors/connect-swagup/src/api/client.ts +18 -205
- package/connectors/connect-swagup/src/api/index.ts +30 -42
- package/connectors/connect-swagup/src/types/index.ts +8 -233
- package/connectors/connect-switchboard/src/api/client.ts +18 -205
- package/connectors/connect-switchboard/src/api/index.ts +27 -43
- package/connectors/connect-switchboard/src/types/index.ts +7 -233
- package/connectors/connect-syncly/src/api/client.ts +18 -205
- package/connectors/connect-syncly/src/api/index.ts +21 -44
- package/connectors/connect-syncly/src/types/index.ts +8 -233
- package/connectors/connect-syncromsp/src/api/client.ts +19 -204
- package/connectors/connect-syncromsp/src/api/index.ts +35 -42
- package/connectors/connect-syncromsp/src/types/index.ts +8 -233
- package/connectors/connect-talentlms/src/api/client.ts +19 -205
- package/connectors/connect-talentlms/src/api/index.ts +30 -42
- package/connectors/connect-talentlms/src/types/index.ts +8 -233
- package/connectors/connect-tdameritrade/src/api/client.ts +22 -205
- package/connectors/connect-tdameritrade/src/api/index.ts +32 -41
- package/connectors/connect-tdameritrade/src/types/index.ts +9 -233
- package/connectors/connect-teamdeck/src/api/client.ts +20 -210
- package/connectors/connect-teamdeck/src/api/index.ts +39 -41
- package/connectors/connect-teamdeck/src/types/index.ts +8 -233
- package/connectors/connect-teamgate/src/api/client.ts +21 -206
- package/connectors/connect-teamgate/src/api/index.ts +37 -43
- package/connectors/connect-teamgate/src/types/index.ts +9 -233
- package/connectors/connect-teamup/src/api/client.ts +24 -209
- package/connectors/connect-teamup/src/api/index.ts +25 -45
- package/connectors/connect-teamup/src/types/index.ts +6 -233
- package/connectors/connect-testmonitor/src/api/client.ts +19 -205
- package/connectors/connect-testmonitor/src/api/index.ts +38 -42
- package/connectors/connect-testmonitor/src/types/index.ts +8 -233
- package/connectors/connect-textcortexai/src/api/client.ts +18 -205
- package/connectors/connect-textcortexai/src/api/index.ts +33 -43
- package/connectors/connect-textcortexai/src/types/index.ts +7 -233
- package/connectors/connect-textmagic/src/api/client.ts +20 -205
- package/connectors/connect-textmagic/src/api/index.ts +34 -43
- package/connectors/connect-textmagic/src/types/index.ts +9 -233
- package/connectors/connect-thankster/src/api/client.ts +18 -205
- package/connectors/connect-thankster/src/api/index.ts +27 -43
- package/connectors/connect-thankster/src/types/index.ts +8 -233
- package/connectors/connect-thecustomerfactor/src/api/client.ts +18 -205
- package/connectors/connect-thecustomerfactor/src/api/index.ts +34 -42
- package/connectors/connect-thecustomerfactor/src/types/index.ts +7 -233
- package/connectors/connect-theleap/src/api/client.ts +18 -205
- package/connectors/connect-theleap/src/api/index.ts +23 -43
- package/connectors/connect-theleap/src/types/index.ts +6 -233
- package/connectors/connect-thoughtfulgpt/src/api/client.ts +18 -205
- package/connectors/connect-thoughtfulgpt/src/api/index.ts +22 -44
- package/connectors/connect-thoughtfulgpt/src/types/index.ts +7 -233
- package/connectors/connect-tilda/src/api/client.ts +18 -206
- package/connectors/connect-tilda/src/api/index.ts +22 -46
- package/connectors/connect-tilda/src/types/index.ts +7 -233
- package/connectors/connect-tisanelabs/src/api/client.ts +13 -206
- package/connectors/connect-tisanelabs/src/api/index.ts +26 -41
- package/connectors/connect-tisanelabs/src/types/index.ts +8 -233
- package/connectors/connect-trackvia/src/api/client.ts +22 -206
- package/connectors/connect-trackvia/src/api/index.ts +35 -43
- package/connectors/connect-trackvia/src/types/index.ts +9 -233
- package/connectors/connect-travisci/src/api/client.ts +19 -205
- package/connectors/connect-travisci/src/api/index.ts +28 -43
- package/connectors/connect-travisci/src/types/index.ts +7 -233
- package/connectors/connect-turbohire/src/api/client.ts +18 -205
- package/connectors/connect-turbohire/src/api/index.ts +34 -42
- package/connectors/connect-turbohire/src/types/index.ts +8 -233
- package/connectors/connect-tuskr/src/api/client.ts +19 -206
- package/connectors/connect-tuskr/src/api/index.ts +37 -42
- package/connectors/connect-tuskr/src/types/index.ts +8 -233
- package/connectors/connect-unisender/src/api/client.ts +19 -209
- package/connectors/connect-unisender/src/api/index.ts +37 -42
- package/connectors/connect-unisender/src/types/index.ts +10 -233
- package/connectors/connect-uproc/src/api/client.ts +18 -205
- package/connectors/connect-uproc/src/api/index.ts +25 -43
- package/connectors/connect-uproc/src/types/index.ts +7 -233
- package/connectors/connect-uptimerobot/src/api/client.ts +22 -208
- package/connectors/connect-uptimerobot/src/api/index.ts +43 -39
- package/connectors/connect-uptimerobot/src/types/index.ts +8 -233
- package/connectors/connect-uservoice/src/api/client.ts +19 -205
- package/connectors/connect-uservoice/src/api/index.ts +31 -43
- package/connectors/connect-uservoice/src/types/index.ts +13 -235
- package/connectors/connect-verifalia/src/api/client.ts +20 -206
- package/connectors/connect-verifalia/src/api/index.ts +31 -41
- package/connectors/connect-verifalia/src/types/index.ts +6 -233
- package/connectors/connect-virustotal/src/api/client.ts +21 -204
- package/connectors/connect-virustotal/src/api/index.ts +27 -42
- package/connectors/connect-virustotal/src/types/index.ts +8 -233
- package/connectors/connect-vivifyscrum/src/api/client.ts +19 -206
- package/connectors/connect-vivifyscrum/src/api/index.ts +28 -44
- package/connectors/connect-vivifyscrum/src/types/index.ts +9 -233
- package/connectors/connect-voicit/src/api/client.ts +18 -205
- package/connectors/connect-voicit/src/api/index.ts +19 -45
- package/connectors/connect-voicit/src/types/index.ts +7 -233
- package/connectors/connect-vowel/src/api/client.ts +18 -205
- package/connectors/connect-vowel/src/api/index.ts +22 -44
- package/connectors/connect-vowel/src/types/index.ts +8 -233
- package/connectors/connect-watchsignals/src/api/client.ts +15 -205
- package/connectors/connect-watchsignals/src/api/index.ts +24 -42
- package/connectors/connect-watchsignals/src/types/index.ts +8 -233
- package/connectors/connect-wavelineextract/src/api/client.ts +18 -205
- package/connectors/connect-wavelineextract/src/api/index.ts +21 -45
- package/connectors/connect-wavelineextract/src/types/index.ts +6 -233
- package/connectors/connect-webinarjam/src/api/client.ts +15 -206
- package/connectors/connect-webinarjam/src/api/index.ts +18 -44
- package/connectors/connect-webinarjam/src/types/index.ts +6 -233
- package/connectors/connect-wikipedia/src/api/client.ts +22 -202
- package/connectors/connect-wikipedia/src/api/index.ts +49 -43
- package/connectors/connect-wikipedia/src/types/index.ts +22 -228
- package/connectors/connect-wubookratechecker/src/api/client.ts +14 -204
- package/connectors/connect-wubookratechecker/src/api/index.ts +18 -46
- package/connectors/connect-wubookratechecker/src/types/index.ts +6 -233
- package/connectors/connect-xai/src/api/chat.ts +2 -1
- package/connectors/connect-yodiz/src/api/client.ts +20 -205
- package/connectors/connect-yodiz/src/api/index.ts +36 -41
- package/connectors/connect-yodiz/src/types/index.ts +8 -233
- package/connectors/connect-yourls/src/api/client.ts +25 -211
- package/connectors/connect-yourls/src/api/index.ts +33 -41
- package/connectors/connect-yourls/src/types/index.ts +7 -233
- package/connectors/connect-zammad/src/api/client.ts +19 -208
- package/connectors/connect-zammad/src/api/index.ts +32 -44
- package/connectors/connect-zammad/src/types/index.ts +8 -233
- package/connectors/connect-zohobooks/src/api/client.ts +21 -205
- package/connectors/connect-zohobooks/src/api/index.ts +36 -42
- package/connectors/connect-zohobooks/src/types/index.ts +10 -233
- package/connectors/connect-zohocrm/src/api/client.ts +21 -204
- package/connectors/connect-zohocrm/src/api/index.ts +36 -41
- package/connectors/connect-zohocrm/src/types/index.ts +10 -233
- package/connectors/connect-zohoworkdrive/src/api/client.ts +24 -206
- package/connectors/connect-zohoworkdrive/src/api/index.ts +31 -42
- package/connectors/connect-zohoworkdrive/src/types/index.ts +7 -233
- package/connectors/connect-zoom/src/api/users.ts +95 -1
- package/connectors/connect-zulip/src/api/client.ts +22 -206
- package/connectors/connect-zulip/src/api/index.ts +35 -44
- package/connectors/connect-zulip/src/types/index.ts +7 -233
- package/dist/db/agents.d.ts +38 -0
- package/dist/db/agents.test.d.ts +1 -0
- package/dist/db/database.d.ts +7 -0
- package/dist/db/jobs.d.ts +53 -0
- package/dist/db/jobs.test.d.ts +1 -0
- package/dist/db/locks.d.ts +59 -0
- package/dist/db/locks.test.d.ts +1 -0
- package/dist/db/promotions.d.ts +5 -0
- package/dist/db/promotions.test.d.ts +1 -0
- package/dist/db/rate.d.ts +57 -0
- package/dist/db/rate.test.d.ts +1 -0
- package/dist/db/usage.d.ts +17 -0
- package/dist/db/usage.test.d.ts +1 -0
- package/dist/db/workflows.d.ts +26 -0
- package/dist/db/workflows.test.d.ts +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +312 -22
- package/dist/lib/fuzzy.d.ts +16 -0
- package/dist/lib/fuzzy.test.d.ts +1 -0
- package/dist/lib/installer.d.ts +6 -7
- package/dist/lib/llm.d.ts +38 -0
- package/dist/lib/llm.test.d.ts +1 -0
- package/dist/lib/lock.d.ts +22 -0
- package/dist/lib/lock.test.d.ts +1 -0
- package/dist/lib/registry.d.ts +22 -1
- package/dist/lib/scheduler.d.ts +20 -0
- package/dist/lib/scheduler.test.d.ts +1 -0
- package/dist/lib/strip.d.ts +20 -0
- package/dist/lib/strip.test.d.ts +1 -0
- package/dist/lib/synonyms.d.ts +12 -0
- package/dist/lib/synonyms.test.d.ts +1 -0
- package/dist/lib/workflow-runner.d.ts +22 -0
- package/dist/server/auth.d.ts +4 -2
- package/package.json +2 -1
- package/connectors/connect-huggingface/src/api/example.ts +0 -48
- package/connectors/connect-yousign/CLAUDE.md +0 -48
- package/connectors/connect-yousign/package.json +0 -52
- package/connectors/connect-yousign/src/api/client.ts +0 -119
- package/connectors/connect-yousign/src/api/index.ts +0 -221
- package/connectors/connect-yousign/src/cli/index.ts +0 -555
- package/connectors/connect-yousign/src/index.ts +0 -21
- package/connectors/connect-yousign/src/types/index.ts +0 -275
- package/connectors/connect-yousign/src/utils/config.ts +0 -121
- package/connectors/connect-yousign/tsconfig.json +0 -16
package/bin/mcp.js
CHANGED
|
@@ -26,6 +26,7 @@ var __export = (target, all) => {
|
|
|
26
26
|
set: (newValue) => all[name] = () => newValue
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
29
30
|
|
|
30
31
|
// node_modules/ajv/dist/compile/codegen/code.js
|
|
31
32
|
var require_code = __commonJS((exports) => {
|
|
@@ -6490,6 +6491,895 @@ var require_dist = __commonJS((exports, module) => {
|
|
|
6490
6491
|
exports.default = formatsPlugin;
|
|
6491
6492
|
});
|
|
6492
6493
|
|
|
6494
|
+
// src/lib/installer.ts
|
|
6495
|
+
var exports_installer = {};
|
|
6496
|
+
__export(exports_installer, {
|
|
6497
|
+
removeConnector: () => removeConnector,
|
|
6498
|
+
installConnectors: () => installConnectors,
|
|
6499
|
+
installConnector: () => installConnector,
|
|
6500
|
+
getInstalledConnectors: () => getInstalledConnectors,
|
|
6501
|
+
getConnectorPath: () => getConnectorPath,
|
|
6502
|
+
getConnectorDocs: () => getConnectorDocs,
|
|
6503
|
+
connectorExists: () => connectorExists
|
|
6504
|
+
});
|
|
6505
|
+
import { existsSync as existsSync2, cpSync, mkdirSync, readFileSync as readFileSync2, writeFileSync, readdirSync, statSync, rmSync } from "fs";
|
|
6506
|
+
import { homedir } from "os";
|
|
6507
|
+
import { join as join2, dirname as dirname2 } from "path";
|
|
6508
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
6509
|
+
function resolveConnectorsDir() {
|
|
6510
|
+
const fromBin = join2(__dirname2, "..", "connectors");
|
|
6511
|
+
if (existsSync2(fromBin))
|
|
6512
|
+
return fromBin;
|
|
6513
|
+
const fromSrc = join2(__dirname2, "..", "..", "connectors");
|
|
6514
|
+
if (existsSync2(fromSrc))
|
|
6515
|
+
return fromSrc;
|
|
6516
|
+
return fromBin;
|
|
6517
|
+
}
|
|
6518
|
+
function getConnectorPath(name) {
|
|
6519
|
+
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
6520
|
+
return join2(CONNECTORS_DIR, connectorName);
|
|
6521
|
+
}
|
|
6522
|
+
function connectorExists(name) {
|
|
6523
|
+
return existsSync2(getConnectorPath(name));
|
|
6524
|
+
}
|
|
6525
|
+
function installConnector(name, options = {}) {
|
|
6526
|
+
const { targetDir = process.cwd(), overwrite = false } = options;
|
|
6527
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
6528
|
+
return {
|
|
6529
|
+
connector: name,
|
|
6530
|
+
success: false,
|
|
6531
|
+
error: `Invalid connector name '${name}'`
|
|
6532
|
+
};
|
|
6533
|
+
}
|
|
6534
|
+
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
6535
|
+
const sourcePath = getConnectorPath(name);
|
|
6536
|
+
const destDir = join2(targetDir, ".connectors");
|
|
6537
|
+
const destPath = join2(destDir, connectorName);
|
|
6538
|
+
if (!existsSync2(sourcePath)) {
|
|
6539
|
+
return {
|
|
6540
|
+
connector: name,
|
|
6541
|
+
success: false,
|
|
6542
|
+
error: `Connector '${name}' not found`
|
|
6543
|
+
};
|
|
6544
|
+
}
|
|
6545
|
+
if (existsSync2(destPath) && !overwrite) {
|
|
6546
|
+
return {
|
|
6547
|
+
connector: name,
|
|
6548
|
+
success: false,
|
|
6549
|
+
error: `Already installed. Use --overwrite to replace.`,
|
|
6550
|
+
path: destPath
|
|
6551
|
+
};
|
|
6552
|
+
}
|
|
6553
|
+
try {
|
|
6554
|
+
if (!existsSync2(destDir)) {
|
|
6555
|
+
mkdirSync(destDir, { recursive: true });
|
|
6556
|
+
}
|
|
6557
|
+
cpSync(sourcePath, destPath, { recursive: true });
|
|
6558
|
+
const homeCredDir = join2(homedir(), ".connectors", connectorName);
|
|
6559
|
+
if (existsSync2(homeCredDir)) {
|
|
6560
|
+
const filesToCopy = ["credentials.json", "current_profile"];
|
|
6561
|
+
for (const file of filesToCopy) {
|
|
6562
|
+
const src = join2(homeCredDir, file);
|
|
6563
|
+
if (existsSync2(src)) {
|
|
6564
|
+
cpSync(src, join2(destPath, file));
|
|
6565
|
+
}
|
|
6566
|
+
}
|
|
6567
|
+
const profilesDir = join2(homeCredDir, "profiles");
|
|
6568
|
+
if (existsSync2(profilesDir)) {
|
|
6569
|
+
cpSync(profilesDir, join2(destPath, "profiles"), { recursive: true });
|
|
6570
|
+
}
|
|
6571
|
+
}
|
|
6572
|
+
updateConnectorsIndex(destDir);
|
|
6573
|
+
return {
|
|
6574
|
+
connector: name,
|
|
6575
|
+
success: true,
|
|
6576
|
+
path: destPath
|
|
6577
|
+
};
|
|
6578
|
+
} catch (error2) {
|
|
6579
|
+
return {
|
|
6580
|
+
connector: name,
|
|
6581
|
+
success: false,
|
|
6582
|
+
error: error2 instanceof Error ? error2.message : "Unknown error"
|
|
6583
|
+
};
|
|
6584
|
+
}
|
|
6585
|
+
}
|
|
6586
|
+
function installConnectors(names, options = {}) {
|
|
6587
|
+
return names.map((name) => installConnector(name, options));
|
|
6588
|
+
}
|
|
6589
|
+
function updateConnectorsIndex(connectorsDir) {
|
|
6590
|
+
const indexPath = join2(connectorsDir, "index.ts");
|
|
6591
|
+
const connectors = readdirSync(connectorsDir).filter((f) => f.startsWith("connect-") && !f.includes("."));
|
|
6592
|
+
const exports = connectors.map((c) => {
|
|
6593
|
+
const name = c.replace("connect-", "");
|
|
6594
|
+
return `export * as ${name} from './${c}/src/index.js';`;
|
|
6595
|
+
}).join(`
|
|
6596
|
+
`);
|
|
6597
|
+
const content = `/**
|
|
6598
|
+
* Auto-generated index of installed connectors
|
|
6599
|
+
* Do not edit manually - run 'connectors install' to update
|
|
6600
|
+
*/
|
|
6601
|
+
|
|
6602
|
+
${exports}
|
|
6603
|
+
`;
|
|
6604
|
+
writeFileSync(indexPath, content);
|
|
6605
|
+
}
|
|
6606
|
+
function getInstalledConnectors(targetDir = process.cwd()) {
|
|
6607
|
+
const connectorsDir = join2(targetDir, ".connectors");
|
|
6608
|
+
if (!existsSync2(connectorsDir)) {
|
|
6609
|
+
return [];
|
|
6610
|
+
}
|
|
6611
|
+
return readdirSync(connectorsDir).filter((f) => {
|
|
6612
|
+
const fullPath = join2(connectorsDir, f);
|
|
6613
|
+
return f.startsWith("connect-") && statSync(fullPath).isDirectory();
|
|
6614
|
+
}).map((f) => f.replace("connect-", ""));
|
|
6615
|
+
}
|
|
6616
|
+
function getConnectorDocs(name) {
|
|
6617
|
+
const connectorPath = getConnectorPath(name);
|
|
6618
|
+
const claudeMdPath = join2(connectorPath, "CLAUDE.md");
|
|
6619
|
+
if (!existsSync2(claudeMdPath))
|
|
6620
|
+
return null;
|
|
6621
|
+
const raw = readFileSync2(claudeMdPath, "utf-8");
|
|
6622
|
+
return {
|
|
6623
|
+
overview: extractSection(raw, "Project Overview"),
|
|
6624
|
+
auth: extractSection(raw, "Authentication"),
|
|
6625
|
+
envVars: parseEnvVarsTable(extractSection(raw, "Environment Variables")),
|
|
6626
|
+
cliCommands: extractSection(raw, "CLI Commands"),
|
|
6627
|
+
dataStorage: extractSection(raw, "Data Storage"),
|
|
6628
|
+
raw
|
|
6629
|
+
};
|
|
6630
|
+
}
|
|
6631
|
+
function extractSection(markdown, heading) {
|
|
6632
|
+
const regex = new RegExp(`^##\\s+${escapeRegex2(heading)}\\s*$`, "m");
|
|
6633
|
+
const match = regex.exec(markdown);
|
|
6634
|
+
if (!match)
|
|
6635
|
+
return "";
|
|
6636
|
+
const start = match.index + match[0].length;
|
|
6637
|
+
const nextHeading = markdown.slice(start).search(/^##\s/m);
|
|
6638
|
+
const content = nextHeading === -1 ? markdown.slice(start) : markdown.slice(start, start + nextHeading);
|
|
6639
|
+
return content.trim();
|
|
6640
|
+
}
|
|
6641
|
+
function escapeRegex2(str) {
|
|
6642
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
6643
|
+
}
|
|
6644
|
+
function parseEnvVarsTable(section) {
|
|
6645
|
+
if (!section)
|
|
6646
|
+
return [];
|
|
6647
|
+
const vars = [];
|
|
6648
|
+
const lines = section.split(`
|
|
6649
|
+
`);
|
|
6650
|
+
for (const line of lines) {
|
|
6651
|
+
const match = line.match(/\|\s*`([^`]+)`\s*\|\s*(.+?)\s*\|/);
|
|
6652
|
+
if (match && match[1] !== "Variable") {
|
|
6653
|
+
vars.push({ variable: match[1], description: match[2].trim() });
|
|
6654
|
+
}
|
|
6655
|
+
}
|
|
6656
|
+
return vars;
|
|
6657
|
+
}
|
|
6658
|
+
function removeConnector(name, targetDir = process.cwd()) {
|
|
6659
|
+
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
6660
|
+
const connectorsDir = join2(targetDir, ".connectors");
|
|
6661
|
+
const connectorPath = join2(connectorsDir, connectorName);
|
|
6662
|
+
if (!existsSync2(connectorPath)) {
|
|
6663
|
+
return false;
|
|
6664
|
+
}
|
|
6665
|
+
rmSync(connectorPath, { recursive: true });
|
|
6666
|
+
updateConnectorsIndex(connectorsDir);
|
|
6667
|
+
return true;
|
|
6668
|
+
}
|
|
6669
|
+
var __dirname2, CONNECTORS_DIR;
|
|
6670
|
+
var init_installer = __esm(() => {
|
|
6671
|
+
__dirname2 = dirname2(fileURLToPath2(import.meta.url));
|
|
6672
|
+
CONNECTORS_DIR = resolveConnectorsDir();
|
|
6673
|
+
});
|
|
6674
|
+
|
|
6675
|
+
// src/db/database.ts
|
|
6676
|
+
var exports_database = {};
|
|
6677
|
+
__export(exports_database, {
|
|
6678
|
+
shortUuid: () => shortUuid,
|
|
6679
|
+
now: () => now,
|
|
6680
|
+
getDatabase: () => getDatabase,
|
|
6681
|
+
closeDatabase: () => closeDatabase
|
|
6682
|
+
});
|
|
6683
|
+
import { Database } from "bun:sqlite";
|
|
6684
|
+
import { join as join6 } from "path";
|
|
6685
|
+
import { homedir as homedir4 } from "os";
|
|
6686
|
+
import { mkdirSync as mkdirSync4 } from "fs";
|
|
6687
|
+
function getDatabase(path) {
|
|
6688
|
+
if (_db)
|
|
6689
|
+
return _db;
|
|
6690
|
+
const dbPath = path ?? DB_PATH;
|
|
6691
|
+
mkdirSync4(join6(dbPath, ".."), { recursive: true });
|
|
6692
|
+
_db = new Database(dbPath);
|
|
6693
|
+
_db.run("PRAGMA journal_mode = WAL");
|
|
6694
|
+
migrate(_db);
|
|
6695
|
+
return _db;
|
|
6696
|
+
}
|
|
6697
|
+
function closeDatabase() {
|
|
6698
|
+
_db?.close();
|
|
6699
|
+
_db = null;
|
|
6700
|
+
}
|
|
6701
|
+
function now() {
|
|
6702
|
+
return new Date().toISOString();
|
|
6703
|
+
}
|
|
6704
|
+
function shortUuid() {
|
|
6705
|
+
return crypto.randomUUID().slice(0, 8);
|
|
6706
|
+
}
|
|
6707
|
+
function migrate(db) {
|
|
6708
|
+
db.run(`
|
|
6709
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
6710
|
+
id TEXT PRIMARY KEY,
|
|
6711
|
+
name TEXT UNIQUE NOT NULL,
|
|
6712
|
+
session_id TEXT,
|
|
6713
|
+
role TEXT NOT NULL DEFAULT 'agent',
|
|
6714
|
+
last_seen_at TEXT NOT NULL,
|
|
6715
|
+
created_at TEXT NOT NULL
|
|
6716
|
+
)
|
|
6717
|
+
`);
|
|
6718
|
+
db.run(`
|
|
6719
|
+
CREATE TABLE IF NOT EXISTS resource_locks (
|
|
6720
|
+
id TEXT PRIMARY KEY,
|
|
6721
|
+
resource_type TEXT NOT NULL CHECK(resource_type IN ('connector', 'agent', 'profile', 'token')),
|
|
6722
|
+
resource_id TEXT NOT NULL,
|
|
6723
|
+
agent_id TEXT NOT NULL,
|
|
6724
|
+
lock_type TEXT NOT NULL DEFAULT 'exclusive' CHECK(lock_type IN ('advisory', 'exclusive')),
|
|
6725
|
+
locked_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
6726
|
+
expires_at TEXT NOT NULL
|
|
6727
|
+
)
|
|
6728
|
+
`);
|
|
6729
|
+
db.run(`
|
|
6730
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_resource_locks_exclusive
|
|
6731
|
+
ON resource_locks(resource_type, resource_id)
|
|
6732
|
+
WHERE lock_type = 'exclusive'
|
|
6733
|
+
`);
|
|
6734
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_resource_locks_agent ON resource_locks(agent_id)`);
|
|
6735
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_resource_locks_expires ON resource_locks(expires_at)`);
|
|
6736
|
+
db.run(`
|
|
6737
|
+
CREATE TABLE IF NOT EXISTS connector_rate_usage (
|
|
6738
|
+
agent_id TEXT NOT NULL,
|
|
6739
|
+
connector TEXT NOT NULL,
|
|
6740
|
+
window_start TEXT NOT NULL,
|
|
6741
|
+
call_count INTEGER NOT NULL DEFAULT 0,
|
|
6742
|
+
PRIMARY KEY (agent_id, connector, window_start)
|
|
6743
|
+
)
|
|
6744
|
+
`);
|
|
6745
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_rate_usage_window ON connector_rate_usage(connector, window_start)`);
|
|
6746
|
+
db.run(`
|
|
6747
|
+
CREATE TABLE IF NOT EXISTS connector_jobs (
|
|
6748
|
+
id TEXT PRIMARY KEY,
|
|
6749
|
+
name TEXT UNIQUE NOT NULL,
|
|
6750
|
+
connector TEXT NOT NULL,
|
|
6751
|
+
command TEXT NOT NULL,
|
|
6752
|
+
args TEXT NOT NULL DEFAULT '[]',
|
|
6753
|
+
cron TEXT NOT NULL,
|
|
6754
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
6755
|
+
strip INTEGER NOT NULL DEFAULT 0,
|
|
6756
|
+
created_at TEXT NOT NULL,
|
|
6757
|
+
last_run_at TEXT
|
|
6758
|
+
)
|
|
6759
|
+
`);
|
|
6760
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_jobs_enabled ON connector_jobs(enabled)`);
|
|
6761
|
+
db.run(`
|
|
6762
|
+
CREATE TABLE IF NOT EXISTS connector_job_runs (
|
|
6763
|
+
id TEXT PRIMARY KEY,
|
|
6764
|
+
job_id TEXT NOT NULL REFERENCES connector_jobs(id) ON DELETE CASCADE,
|
|
6765
|
+
started_at TEXT NOT NULL,
|
|
6766
|
+
finished_at TEXT,
|
|
6767
|
+
exit_code INTEGER,
|
|
6768
|
+
raw_output TEXT,
|
|
6769
|
+
stripped_output TEXT
|
|
6770
|
+
)
|
|
6771
|
+
`);
|
|
6772
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_job_runs_job ON connector_job_runs(job_id, started_at DESC)`);
|
|
6773
|
+
db.run(`
|
|
6774
|
+
CREATE TABLE IF NOT EXISTS connector_workflows (
|
|
6775
|
+
id TEXT PRIMARY KEY,
|
|
6776
|
+
name TEXT UNIQUE NOT NULL,
|
|
6777
|
+
steps TEXT NOT NULL DEFAULT '[]',
|
|
6778
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
6779
|
+
created_at TEXT NOT NULL
|
|
6780
|
+
)
|
|
6781
|
+
`);
|
|
6782
|
+
db.run(`
|
|
6783
|
+
CREATE TABLE IF NOT EXISTS connector_usage (
|
|
6784
|
+
id TEXT PRIMARY KEY,
|
|
6785
|
+
connector TEXT NOT NULL,
|
|
6786
|
+
action TEXT NOT NULL,
|
|
6787
|
+
agent_id TEXT,
|
|
6788
|
+
timestamp TEXT NOT NULL
|
|
6789
|
+
)
|
|
6790
|
+
`);
|
|
6791
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_usage_connector ON connector_usage(connector, timestamp DESC)`);
|
|
6792
|
+
db.run(`
|
|
6793
|
+
CREATE TABLE IF NOT EXISTS connector_promotions (
|
|
6794
|
+
connector TEXT UNIQUE NOT NULL,
|
|
6795
|
+
promoted_at TEXT NOT NULL
|
|
6796
|
+
)
|
|
6797
|
+
`);
|
|
6798
|
+
}
|
|
6799
|
+
var DB_DIR, DB_PATH, _db = null;
|
|
6800
|
+
var init_database = __esm(() => {
|
|
6801
|
+
DB_DIR = join6(homedir4(), ".connectors");
|
|
6802
|
+
DB_PATH = join6(DB_DIR, "connectors.db");
|
|
6803
|
+
});
|
|
6804
|
+
|
|
6805
|
+
// src/lib/llm.ts
|
|
6806
|
+
var exports_llm = {};
|
|
6807
|
+
__export(exports_llm, {
|
|
6808
|
+
setLlmStrip: () => setLlmStrip,
|
|
6809
|
+
saveLlmConfig: () => saveLlmConfig,
|
|
6810
|
+
maskKey: () => maskKey,
|
|
6811
|
+
isStripEnabled: () => isStripEnabled,
|
|
6812
|
+
getLlmConfig: () => getLlmConfig,
|
|
6813
|
+
PROVIDER_DEFAULTS: () => PROVIDER_DEFAULTS,
|
|
6814
|
+
LLMClient: () => LLMClient
|
|
6815
|
+
});
|
|
6816
|
+
import { existsSync as existsSync6, readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync5 } from "fs";
|
|
6817
|
+
import { join as join7 } from "path";
|
|
6818
|
+
import { homedir as homedir5 } from "os";
|
|
6819
|
+
function getLlmConfigPath() {
|
|
6820
|
+
return join7(homedir5(), ".connectors", "llm.json");
|
|
6821
|
+
}
|
|
6822
|
+
function getLlmConfig() {
|
|
6823
|
+
const path = getLlmConfigPath();
|
|
6824
|
+
if (!existsSync6(path))
|
|
6825
|
+
return null;
|
|
6826
|
+
try {
|
|
6827
|
+
return JSON.parse(readFileSync4(path, "utf-8"));
|
|
6828
|
+
} catch {
|
|
6829
|
+
return null;
|
|
6830
|
+
}
|
|
6831
|
+
}
|
|
6832
|
+
function saveLlmConfig(config2) {
|
|
6833
|
+
const dir = join7(homedir5(), ".connectors");
|
|
6834
|
+
mkdirSync5(dir, { recursive: true });
|
|
6835
|
+
writeFileSync3(getLlmConfigPath(), JSON.stringify(config2, null, 2));
|
|
6836
|
+
}
|
|
6837
|
+
function setLlmStrip(enabled) {
|
|
6838
|
+
const config2 = getLlmConfig();
|
|
6839
|
+
if (!config2)
|
|
6840
|
+
throw new Error("No LLM config found. Run: connectors llm set --provider <provider> --key <key>");
|
|
6841
|
+
saveLlmConfig({ ...config2, strip: enabled });
|
|
6842
|
+
}
|
|
6843
|
+
function isStripEnabled() {
|
|
6844
|
+
return getLlmConfig()?.strip === true;
|
|
6845
|
+
}
|
|
6846
|
+
function maskKey(key) {
|
|
6847
|
+
if (key.length <= 8)
|
|
6848
|
+
return "***";
|
|
6849
|
+
return key.slice(0, 8) + "***";
|
|
6850
|
+
}
|
|
6851
|
+
|
|
6852
|
+
class LLMClient {
|
|
6853
|
+
config;
|
|
6854
|
+
constructor(config2) {
|
|
6855
|
+
this.config = config2;
|
|
6856
|
+
}
|
|
6857
|
+
static fromConfig() {
|
|
6858
|
+
const config2 = getLlmConfig();
|
|
6859
|
+
if (!config2)
|
|
6860
|
+
return null;
|
|
6861
|
+
return new LLMClient(config2);
|
|
6862
|
+
}
|
|
6863
|
+
async complete(prompt, content) {
|
|
6864
|
+
const start = Date.now();
|
|
6865
|
+
const { provider, model, api_key } = this.config;
|
|
6866
|
+
if (provider === "anthropic") {
|
|
6867
|
+
return this._anthropicComplete(prompt, content, start);
|
|
6868
|
+
}
|
|
6869
|
+
const baseUrl = PROVIDER_BASE_URLS[provider];
|
|
6870
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
6871
|
+
method: "POST",
|
|
6872
|
+
headers: {
|
|
6873
|
+
"Content-Type": "application/json",
|
|
6874
|
+
Authorization: `Bearer ${api_key}`
|
|
6875
|
+
},
|
|
6876
|
+
body: JSON.stringify({
|
|
6877
|
+
model,
|
|
6878
|
+
messages: [
|
|
6879
|
+
{ role: "system", content: prompt },
|
|
6880
|
+
{ role: "user", content }
|
|
6881
|
+
],
|
|
6882
|
+
temperature: 0,
|
|
6883
|
+
max_tokens: 4096
|
|
6884
|
+
})
|
|
6885
|
+
});
|
|
6886
|
+
if (!response.ok) {
|
|
6887
|
+
const error2 = await response.text();
|
|
6888
|
+
throw new Error(`LLM request failed (${provider} ${response.status}): ${error2}`);
|
|
6889
|
+
}
|
|
6890
|
+
const data = await response.json();
|
|
6891
|
+
return {
|
|
6892
|
+
content: data.choices[0].message.content,
|
|
6893
|
+
provider,
|
|
6894
|
+
model,
|
|
6895
|
+
latency_ms: Date.now() - start
|
|
6896
|
+
};
|
|
6897
|
+
}
|
|
6898
|
+
async _anthropicComplete(prompt, content, start) {
|
|
6899
|
+
const { model, api_key } = this.config;
|
|
6900
|
+
const response = await fetch("https://api.anthropic.com/v1/messages", {
|
|
6901
|
+
method: "POST",
|
|
6902
|
+
headers: {
|
|
6903
|
+
"Content-Type": "application/json",
|
|
6904
|
+
"x-api-key": api_key,
|
|
6905
|
+
"anthropic-version": "2023-06-01"
|
|
6906
|
+
},
|
|
6907
|
+
body: JSON.stringify({
|
|
6908
|
+
model,
|
|
6909
|
+
system: prompt,
|
|
6910
|
+
messages: [{ role: "user", content }],
|
|
6911
|
+
max_tokens: 4096
|
|
6912
|
+
})
|
|
6913
|
+
});
|
|
6914
|
+
if (!response.ok) {
|
|
6915
|
+
const error2 = await response.text();
|
|
6916
|
+
throw new Error(`LLM request failed (anthropic ${response.status}): ${error2}`);
|
|
6917
|
+
}
|
|
6918
|
+
const data = await response.json();
|
|
6919
|
+
return {
|
|
6920
|
+
content: data.content[0].text,
|
|
6921
|
+
provider: "anthropic",
|
|
6922
|
+
model,
|
|
6923
|
+
latency_ms: Date.now() - start
|
|
6924
|
+
};
|
|
6925
|
+
}
|
|
6926
|
+
}
|
|
6927
|
+
var PROVIDER_BASE_URLS, PROVIDER_DEFAULTS;
|
|
6928
|
+
var init_llm = __esm(() => {
|
|
6929
|
+
PROVIDER_BASE_URLS = {
|
|
6930
|
+
cerebras: "https://api.cerebras.ai/v1",
|
|
6931
|
+
groq: "https://api.groq.com/openai/v1",
|
|
6932
|
+
openai: "https://api.openai.com/v1"
|
|
6933
|
+
};
|
|
6934
|
+
PROVIDER_DEFAULTS = {
|
|
6935
|
+
cerebras: { model: "qwen-3-32b" },
|
|
6936
|
+
groq: { model: "llama-3.3-70b-versatile" },
|
|
6937
|
+
openai: { model: "gpt-4o-mini" },
|
|
6938
|
+
anthropic: { model: "claude-haiku-4-5-20251001" }
|
|
6939
|
+
};
|
|
6940
|
+
});
|
|
6941
|
+
|
|
6942
|
+
// src/lib/strip.ts
|
|
6943
|
+
async function maybeStrip(output, _type = "json") {
|
|
6944
|
+
const config2 = getLlmConfig();
|
|
6945
|
+
if (!config2?.strip)
|
|
6946
|
+
return output;
|
|
6947
|
+
if (!output || output.trim().length === 0)
|
|
6948
|
+
return output;
|
|
6949
|
+
const client = LLMClient.fromConfig();
|
|
6950
|
+
if (!client)
|
|
6951
|
+
return output;
|
|
6952
|
+
try {
|
|
6953
|
+
const result = await client.complete(STRIP_PROMPT, output);
|
|
6954
|
+
return result.content.trim();
|
|
6955
|
+
} catch {
|
|
6956
|
+
return output;
|
|
6957
|
+
}
|
|
6958
|
+
}
|
|
6959
|
+
var STRIP_PROMPT = `You are a data extraction assistant. Your job is to take raw API output and return ONLY the essential, structured data.
|
|
6960
|
+
|
|
6961
|
+
Rules:
|
|
6962
|
+
- Return valid JSON only (no markdown, no explanation)
|
|
6963
|
+
- Remove pagination metadata, rate limit headers, empty fields, null values
|
|
6964
|
+
- Keep all meaningful data fields
|
|
6965
|
+
- If the input is already minimal, return it unchanged
|
|
6966
|
+
- If input is not JSON, extract key facts as a JSON object
|
|
6967
|
+
- Never truncate actual data values`;
|
|
6968
|
+
var init_strip = __esm(() => {
|
|
6969
|
+
init_llm();
|
|
6970
|
+
});
|
|
6971
|
+
|
|
6972
|
+
// src/db/promotions.ts
|
|
6973
|
+
var exports_promotions = {};
|
|
6974
|
+
__export(exports_promotions, {
|
|
6975
|
+
promoteConnector: () => promoteConnector,
|
|
6976
|
+
isPromoted: () => isPromoted,
|
|
6977
|
+
getPromotedConnectors: () => getPromotedConnectors,
|
|
6978
|
+
demoteConnector: () => demoteConnector
|
|
6979
|
+
});
|
|
6980
|
+
function promoteConnector(name, db) {
|
|
6981
|
+
const d = db ?? getDatabase();
|
|
6982
|
+
d.run("INSERT OR REPLACE INTO connector_promotions (connector, promoted_at) VALUES (?, ?)", [name, now()]);
|
|
6983
|
+
}
|
|
6984
|
+
function demoteConnector(name, db) {
|
|
6985
|
+
const d = db ?? getDatabase();
|
|
6986
|
+
return d.run("DELETE FROM connector_promotions WHERE connector = ?", [name]).changes > 0;
|
|
6987
|
+
}
|
|
6988
|
+
function getPromotedConnectors(db) {
|
|
6989
|
+
const d = db ?? getDatabase();
|
|
6990
|
+
return d.query("SELECT connector FROM connector_promotions ORDER BY promoted_at DESC").all().map((r) => r.connector);
|
|
6991
|
+
}
|
|
6992
|
+
function isPromoted(name, db) {
|
|
6993
|
+
const d = db ?? getDatabase();
|
|
6994
|
+
const row = d.query("SELECT 1 FROM connector_promotions WHERE connector = ?").get(name);
|
|
6995
|
+
return !!row;
|
|
6996
|
+
}
|
|
6997
|
+
var init_promotions = __esm(() => {
|
|
6998
|
+
init_database();
|
|
6999
|
+
});
|
|
7000
|
+
|
|
7001
|
+
// src/db/usage.ts
|
|
7002
|
+
var exports_usage = {};
|
|
7003
|
+
__export(exports_usage, {
|
|
7004
|
+
logUsage: () => logUsage,
|
|
7005
|
+
getUsageStats: () => getUsageStats,
|
|
7006
|
+
getUsageMap: () => getUsageMap,
|
|
7007
|
+
getTopConnectors: () => getTopConnectors,
|
|
7008
|
+
cleanOldUsage: () => cleanOldUsage
|
|
7009
|
+
});
|
|
7010
|
+
function logUsage(connector, action, agentId, db) {
|
|
7011
|
+
const d = db ?? getDatabase();
|
|
7012
|
+
d.run("INSERT INTO connector_usage (id, connector, action, agent_id, timestamp) VALUES (?, ?, ?, ?, ?)", [shortUuid(), connector, action, agentId ?? null, now()]);
|
|
7013
|
+
}
|
|
7014
|
+
function getUsageStats(connector, db) {
|
|
7015
|
+
const d = db ?? getDatabase();
|
|
7016
|
+
const total = d.query("SELECT COUNT(*) as c FROM connector_usage WHERE connector = ?").get(connector).c;
|
|
7017
|
+
const d7 = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
7018
|
+
const last7d = d.query("SELECT COUNT(*) as c FROM connector_usage WHERE connector = ? AND timestamp > ?").get(connector, d7).c;
|
|
7019
|
+
const d1 = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
|
7020
|
+
const last24h = d.query("SELECT COUNT(*) as c FROM connector_usage WHERE connector = ? AND timestamp > ?").get(connector, d1).c;
|
|
7021
|
+
return { connector, total, last7d, last24h };
|
|
7022
|
+
}
|
|
7023
|
+
function getTopConnectors(limit = 10, days = 7, db) {
|
|
7024
|
+
const d = db ?? getDatabase();
|
|
7025
|
+
const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
7026
|
+
return d.query("SELECT connector, COUNT(*) as count FROM connector_usage WHERE timestamp > ? GROUP BY connector ORDER BY count DESC LIMIT ?").all(since, limit);
|
|
7027
|
+
}
|
|
7028
|
+
function getUsageMap(days = 7, db) {
|
|
7029
|
+
const top = getTopConnectors(100, days, db);
|
|
7030
|
+
return new Map(top.map((t) => [t.connector, t.count]));
|
|
7031
|
+
}
|
|
7032
|
+
function cleanOldUsage(days = 30, db) {
|
|
7033
|
+
const d = db ?? getDatabase();
|
|
7034
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
7035
|
+
return d.run("DELETE FROM connector_usage WHERE timestamp < ?", [cutoff]).changes;
|
|
7036
|
+
}
|
|
7037
|
+
var init_usage = __esm(() => {
|
|
7038
|
+
init_database();
|
|
7039
|
+
});
|
|
7040
|
+
|
|
7041
|
+
// src/db/jobs.ts
|
|
7042
|
+
var exports_jobs = {};
|
|
7043
|
+
__export(exports_jobs, {
|
|
7044
|
+
updateJob: () => updateJob,
|
|
7045
|
+
touchJobLastRun: () => touchJobLastRun,
|
|
7046
|
+
listJobs: () => listJobs,
|
|
7047
|
+
listJobRuns: () => listJobRuns,
|
|
7048
|
+
listEnabledJobs: () => listEnabledJobs,
|
|
7049
|
+
getLatestRun: () => getLatestRun,
|
|
7050
|
+
getJobByName: () => getJobByName,
|
|
7051
|
+
getJob: () => getJob,
|
|
7052
|
+
finishJobRun: () => finishJobRun,
|
|
7053
|
+
deleteJob: () => deleteJob,
|
|
7054
|
+
createJobRun: () => createJobRun,
|
|
7055
|
+
createJob: () => createJob
|
|
7056
|
+
});
|
|
7057
|
+
function rowToJob(row) {
|
|
7058
|
+
return {
|
|
7059
|
+
...row,
|
|
7060
|
+
args: JSON.parse(row.args || "[]"),
|
|
7061
|
+
enabled: row.enabled === 1,
|
|
7062
|
+
strip: row.strip === 1
|
|
7063
|
+
};
|
|
7064
|
+
}
|
|
7065
|
+
function createJob(input, db) {
|
|
7066
|
+
const d = db ?? getDatabase();
|
|
7067
|
+
const id = shortUuid();
|
|
7068
|
+
const ts = now();
|
|
7069
|
+
d.run("INSERT INTO connector_jobs (id, name, connector, command, args, cron, enabled, strip, created_at) VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?)", [id, input.name, input.connector, input.command, JSON.stringify(input.args ?? []), input.cron, input.strip ? 1 : 0, ts]);
|
|
7070
|
+
return getJob(id, d);
|
|
7071
|
+
}
|
|
7072
|
+
function getJob(id, db) {
|
|
7073
|
+
const d = db ?? getDatabase();
|
|
7074
|
+
const row = d.query("SELECT * FROM connector_jobs WHERE id = ?").get(id);
|
|
7075
|
+
return row ? rowToJob(row) : null;
|
|
7076
|
+
}
|
|
7077
|
+
function getJobByName(name, db) {
|
|
7078
|
+
const d = db ?? getDatabase();
|
|
7079
|
+
const row = d.query("SELECT * FROM connector_jobs WHERE name = ?").get(name);
|
|
7080
|
+
return row ? rowToJob(row) : null;
|
|
7081
|
+
}
|
|
7082
|
+
function listJobs(db) {
|
|
7083
|
+
const d = db ?? getDatabase();
|
|
7084
|
+
return d.query("SELECT * FROM connector_jobs ORDER BY name").all().map(rowToJob);
|
|
7085
|
+
}
|
|
7086
|
+
function listEnabledJobs(db) {
|
|
7087
|
+
const d = db ?? getDatabase();
|
|
7088
|
+
return d.query("SELECT * FROM connector_jobs WHERE enabled = 1").all().map(rowToJob);
|
|
7089
|
+
}
|
|
7090
|
+
function updateJob(id, input, db) {
|
|
7091
|
+
const d = db ?? getDatabase();
|
|
7092
|
+
const sets = [];
|
|
7093
|
+
const params = [];
|
|
7094
|
+
if (input.name !== undefined) {
|
|
7095
|
+
sets.push("name = ?");
|
|
7096
|
+
params.push(input.name);
|
|
7097
|
+
}
|
|
7098
|
+
if (input.connector !== undefined) {
|
|
7099
|
+
sets.push("connector = ?");
|
|
7100
|
+
params.push(input.connector);
|
|
7101
|
+
}
|
|
7102
|
+
if (input.command !== undefined) {
|
|
7103
|
+
sets.push("command = ?");
|
|
7104
|
+
params.push(input.command);
|
|
7105
|
+
}
|
|
7106
|
+
if (input.args !== undefined) {
|
|
7107
|
+
sets.push("args = ?");
|
|
7108
|
+
params.push(JSON.stringify(input.args));
|
|
7109
|
+
}
|
|
7110
|
+
if (input.cron !== undefined) {
|
|
7111
|
+
sets.push("cron = ?");
|
|
7112
|
+
params.push(input.cron);
|
|
7113
|
+
}
|
|
7114
|
+
if (input.enabled !== undefined) {
|
|
7115
|
+
sets.push("enabled = ?");
|
|
7116
|
+
params.push(input.enabled ? 1 : 0);
|
|
7117
|
+
}
|
|
7118
|
+
if (input.strip !== undefined) {
|
|
7119
|
+
sets.push("strip = ?");
|
|
7120
|
+
params.push(input.strip ? 1 : 0);
|
|
7121
|
+
}
|
|
7122
|
+
if (sets.length === 0)
|
|
7123
|
+
return getJob(id, d);
|
|
7124
|
+
params.push(id);
|
|
7125
|
+
d.run(`UPDATE connector_jobs SET ${sets.join(", ")} WHERE id = ?`, params);
|
|
7126
|
+
return getJob(id, d);
|
|
7127
|
+
}
|
|
7128
|
+
function deleteJob(id, db) {
|
|
7129
|
+
const d = db ?? getDatabase();
|
|
7130
|
+
return d.run("DELETE FROM connector_jobs WHERE id = ?", [id]).changes > 0;
|
|
7131
|
+
}
|
|
7132
|
+
function touchJobLastRun(id, db) {
|
|
7133
|
+
const d = db ?? getDatabase();
|
|
7134
|
+
d.run("UPDATE connector_jobs SET last_run_at = ? WHERE id = ?", [now(), id]);
|
|
7135
|
+
}
|
|
7136
|
+
function createJobRun(jobId, db) {
|
|
7137
|
+
const d = db ?? getDatabase();
|
|
7138
|
+
const id = shortUuid();
|
|
7139
|
+
const ts = now();
|
|
7140
|
+
d.run("INSERT INTO connector_job_runs (id, job_id, started_at) VALUES (?, ?, ?)", [id, jobId, ts]);
|
|
7141
|
+
return { id, job_id: jobId, started_at: ts, finished_at: null, exit_code: null, raw_output: null, stripped_output: null };
|
|
7142
|
+
}
|
|
7143
|
+
function finishJobRun(id, result, db) {
|
|
7144
|
+
const d = db ?? getDatabase();
|
|
7145
|
+
d.run("UPDATE connector_job_runs SET finished_at = ?, exit_code = ?, raw_output = ?, stripped_output = ? WHERE id = ?", [now(), result.exit_code, result.raw_output, result.stripped_output ?? null, id]);
|
|
7146
|
+
}
|
|
7147
|
+
function getLatestRun(jobId, db) {
|
|
7148
|
+
const d = db ?? getDatabase();
|
|
7149
|
+
return d.query("SELECT * FROM connector_job_runs WHERE job_id = ? ORDER BY started_at DESC LIMIT 1").get(jobId);
|
|
7150
|
+
}
|
|
7151
|
+
function listJobRuns(jobId, limit = 20, db) {
|
|
7152
|
+
const d = db ?? getDatabase();
|
|
7153
|
+
return d.query("SELECT * FROM connector_job_runs WHERE job_id = ? ORDER BY started_at DESC LIMIT ?").all(jobId, limit);
|
|
7154
|
+
}
|
|
7155
|
+
var init_jobs = __esm(() => {
|
|
7156
|
+
init_database();
|
|
7157
|
+
});
|
|
7158
|
+
|
|
7159
|
+
// src/lib/scheduler.ts
|
|
7160
|
+
var exports_scheduler = {};
|
|
7161
|
+
__export(exports_scheduler, {
|
|
7162
|
+
triggerJob: () => triggerJob,
|
|
7163
|
+
stopScheduler: () => stopScheduler,
|
|
7164
|
+
startScheduler: () => startScheduler
|
|
7165
|
+
});
|
|
7166
|
+
import { spawn as spawn2 } from "child_process";
|
|
7167
|
+
function cronMatches(cron, d) {
|
|
7168
|
+
const parts = cron.trim().split(/\s+/);
|
|
7169
|
+
if (parts.length !== 5)
|
|
7170
|
+
return false;
|
|
7171
|
+
const [min, hour, dom, mon, dow] = parts;
|
|
7172
|
+
function matches(field, value, min_v, max_v) {
|
|
7173
|
+
if (field === "*")
|
|
7174
|
+
return true;
|
|
7175
|
+
if (field.startsWith("*/")) {
|
|
7176
|
+
const step = parseInt(field.slice(2));
|
|
7177
|
+
return value % step === 0;
|
|
7178
|
+
}
|
|
7179
|
+
if (field.includes("-")) {
|
|
7180
|
+
const [a, b] = field.split("-").map(Number);
|
|
7181
|
+
return value >= a && value <= b;
|
|
7182
|
+
}
|
|
7183
|
+
if (field.includes(",")) {
|
|
7184
|
+
return field.split(",").map(Number).includes(value);
|
|
7185
|
+
}
|
|
7186
|
+
return parseInt(field) === value;
|
|
7187
|
+
}
|
|
7188
|
+
return matches(min, d.getMinutes(), 0, 59) && matches(hour, d.getHours(), 0, 23) && matches(dom, d.getDate(), 1, 31) && matches(mon, d.getMonth() + 1, 1, 12) && matches(dow, d.getDay(), 0, 6);
|
|
7189
|
+
}
|
|
7190
|
+
async function runConnectorCommand2(connector, command, args) {
|
|
7191
|
+
return new Promise((resolve) => {
|
|
7192
|
+
const cmdArgs = [connector, command, ...args, "--format", "json"];
|
|
7193
|
+
const proc = spawn2("connectors", ["run", ...cmdArgs], { shell: false });
|
|
7194
|
+
let output = "";
|
|
7195
|
+
proc.stdout.on("data", (d) => {
|
|
7196
|
+
output += d.toString();
|
|
7197
|
+
});
|
|
7198
|
+
proc.stderr.on("data", (d) => {
|
|
7199
|
+
output += d.toString();
|
|
7200
|
+
});
|
|
7201
|
+
proc.on("close", (code) => resolve({ exitCode: code ?? 1, output }));
|
|
7202
|
+
proc.on("error", () => resolve({ exitCode: 1, output: `Failed to spawn connectors run` }));
|
|
7203
|
+
setTimeout(() => {
|
|
7204
|
+
proc.kill();
|
|
7205
|
+
resolve({ exitCode: 124, output: output + `
|
|
7206
|
+
[timeout]` });
|
|
7207
|
+
}, 60000);
|
|
7208
|
+
});
|
|
7209
|
+
}
|
|
7210
|
+
async function executeJob(job, db) {
|
|
7211
|
+
const run = createJobRun(job.id, db);
|
|
7212
|
+
try {
|
|
7213
|
+
const { exitCode, output } = await runConnectorCommand2(job.connector, job.command, job.args);
|
|
7214
|
+
const stripped = job.strip ? await maybeStrip(output) : undefined;
|
|
7215
|
+
finishJobRun(run.id, { exit_code: exitCode, raw_output: output, stripped_output: stripped }, db);
|
|
7216
|
+
touchJobLastRun(job.id, db);
|
|
7217
|
+
} catch (e) {
|
|
7218
|
+
finishJobRun(run.id, { exit_code: 1, raw_output: String(e) }, db);
|
|
7219
|
+
}
|
|
7220
|
+
}
|
|
7221
|
+
function startScheduler(db) {
|
|
7222
|
+
if (_interval)
|
|
7223
|
+
return;
|
|
7224
|
+
_interval = setInterval(async () => {
|
|
7225
|
+
const now3 = new Date;
|
|
7226
|
+
const currentMinute = now3.getMinutes() + now3.getHours() * 60;
|
|
7227
|
+
if (currentMinute === _lastCheckedMinute)
|
|
7228
|
+
return;
|
|
7229
|
+
_lastCheckedMinute = currentMinute;
|
|
7230
|
+
const jobs = listEnabledJobs(db);
|
|
7231
|
+
for (const job of jobs) {
|
|
7232
|
+
if (cronMatches(job.cron, now3)) {
|
|
7233
|
+
executeJob(job, db).catch(() => {});
|
|
7234
|
+
}
|
|
7235
|
+
}
|
|
7236
|
+
}, 30000);
|
|
7237
|
+
}
|
|
7238
|
+
function stopScheduler() {
|
|
7239
|
+
if (_interval) {
|
|
7240
|
+
clearInterval(_interval);
|
|
7241
|
+
_interval = null;
|
|
7242
|
+
_lastCheckedMinute = -1;
|
|
7243
|
+
}
|
|
7244
|
+
}
|
|
7245
|
+
async function triggerJob(job, db) {
|
|
7246
|
+
const run = createJobRun(job.id, db);
|
|
7247
|
+
const { exitCode, output } = await runConnectorCommand2(job.connector, job.command, job.args);
|
|
7248
|
+
const stripped = job.strip ? await maybeStrip(output) : undefined;
|
|
7249
|
+
finishJobRun(run.id, { exit_code: exitCode, raw_output: output, stripped_output: stripped }, db);
|
|
7250
|
+
touchJobLastRun(job.id, db);
|
|
7251
|
+
return { run_id: run.id, exit_code: exitCode, output: stripped ?? output };
|
|
7252
|
+
}
|
|
7253
|
+
var _interval = null, _lastCheckedMinute = -1;
|
|
7254
|
+
var init_scheduler = __esm(() => {
|
|
7255
|
+
init_jobs();
|
|
7256
|
+
init_strip();
|
|
7257
|
+
});
|
|
7258
|
+
|
|
7259
|
+
// src/db/workflows.ts
|
|
7260
|
+
var exports_workflows = {};
|
|
7261
|
+
__export(exports_workflows, {
|
|
7262
|
+
updateWorkflow: () => updateWorkflow,
|
|
7263
|
+
listWorkflows: () => listWorkflows,
|
|
7264
|
+
getWorkflowByName: () => getWorkflowByName,
|
|
7265
|
+
getWorkflow: () => getWorkflow,
|
|
7266
|
+
deleteWorkflow: () => deleteWorkflow,
|
|
7267
|
+
createWorkflow: () => createWorkflow
|
|
7268
|
+
});
|
|
7269
|
+
function rowToWorkflow(row) {
|
|
7270
|
+
return {
|
|
7271
|
+
...row,
|
|
7272
|
+
steps: JSON.parse(row.steps || "[]"),
|
|
7273
|
+
enabled: row.enabled === 1
|
|
7274
|
+
};
|
|
7275
|
+
}
|
|
7276
|
+
function createWorkflow(input, db) {
|
|
7277
|
+
const d = db ?? getDatabase();
|
|
7278
|
+
const id = shortUuid();
|
|
7279
|
+
d.run("INSERT INTO connector_workflows (id, name, steps, enabled, created_at) VALUES (?, ?, ?, 1, ?)", [id, input.name, JSON.stringify(input.steps), now()]);
|
|
7280
|
+
return getWorkflow(id, d);
|
|
7281
|
+
}
|
|
7282
|
+
function getWorkflow(id, db) {
|
|
7283
|
+
const d = db ?? getDatabase();
|
|
7284
|
+
const row = d.query("SELECT * FROM connector_workflows WHERE id = ?").get(id);
|
|
7285
|
+
return row ? rowToWorkflow(row) : null;
|
|
7286
|
+
}
|
|
7287
|
+
function getWorkflowByName(name, db) {
|
|
7288
|
+
const d = db ?? getDatabase();
|
|
7289
|
+
const row = d.query("SELECT * FROM connector_workflows WHERE name = ?").get(name);
|
|
7290
|
+
return row ? rowToWorkflow(row) : null;
|
|
7291
|
+
}
|
|
7292
|
+
function listWorkflows(db) {
|
|
7293
|
+
const d = db ?? getDatabase();
|
|
7294
|
+
return d.query("SELECT * FROM connector_workflows ORDER BY name").all().map(rowToWorkflow);
|
|
7295
|
+
}
|
|
7296
|
+
function updateWorkflow(id, input, db) {
|
|
7297
|
+
const d = db ?? getDatabase();
|
|
7298
|
+
const sets = [];
|
|
7299
|
+
const params = [];
|
|
7300
|
+
if (input.name !== undefined) {
|
|
7301
|
+
sets.push("name = ?");
|
|
7302
|
+
params.push(input.name);
|
|
7303
|
+
}
|
|
7304
|
+
if (input.steps !== undefined) {
|
|
7305
|
+
sets.push("steps = ?");
|
|
7306
|
+
params.push(JSON.stringify(input.steps));
|
|
7307
|
+
}
|
|
7308
|
+
if (input.enabled !== undefined) {
|
|
7309
|
+
sets.push("enabled = ?");
|
|
7310
|
+
params.push(input.enabled ? 1 : 0);
|
|
7311
|
+
}
|
|
7312
|
+
if (sets.length === 0)
|
|
7313
|
+
return getWorkflow(id, d);
|
|
7314
|
+
params.push(id);
|
|
7315
|
+
d.run(`UPDATE connector_workflows SET ${sets.join(", ")} WHERE id = ?`, params);
|
|
7316
|
+
return getWorkflow(id, d);
|
|
7317
|
+
}
|
|
7318
|
+
function deleteWorkflow(id, db) {
|
|
7319
|
+
const d = db ?? getDatabase();
|
|
7320
|
+
return d.run("DELETE FROM connector_workflows WHERE id = ?", [id]).changes > 0;
|
|
7321
|
+
}
|
|
7322
|
+
var init_workflows = __esm(() => {
|
|
7323
|
+
init_database();
|
|
7324
|
+
});
|
|
7325
|
+
|
|
7326
|
+
// src/lib/workflow-runner.ts
|
|
7327
|
+
var exports_workflow_runner = {};
|
|
7328
|
+
__export(exports_workflow_runner, {
|
|
7329
|
+
runWorkflow: () => runWorkflow
|
|
7330
|
+
});
|
|
7331
|
+
import { spawn as spawn3 } from "child_process";
|
|
7332
|
+
async function runStep(step, previousOutput) {
|
|
7333
|
+
return new Promise((resolve) => {
|
|
7334
|
+
const args = [...step.args ?? []];
|
|
7335
|
+
if (previousOutput && previousOutput.trim()) {
|
|
7336
|
+
args.push("--input", previousOutput.trim().slice(0, 4096));
|
|
7337
|
+
}
|
|
7338
|
+
const cmdArgs = ["run", step.connector, step.command, ...args, "--format", "json"];
|
|
7339
|
+
const proc = spawn3("connectors", cmdArgs, { shell: false });
|
|
7340
|
+
let output = "";
|
|
7341
|
+
proc.stdout.on("data", (d) => {
|
|
7342
|
+
output += d.toString();
|
|
7343
|
+
});
|
|
7344
|
+
proc.stderr.on("data", (d) => {
|
|
7345
|
+
output += d.toString();
|
|
7346
|
+
});
|
|
7347
|
+
proc.on("close", (code) => resolve({ exitCode: code ?? 1, output }));
|
|
7348
|
+
proc.on("error", () => resolve({ exitCode: 1, output: "Failed to spawn connectors" }));
|
|
7349
|
+
setTimeout(() => {
|
|
7350
|
+
proc.kill();
|
|
7351
|
+
resolve({ exitCode: 124, output: output + `
|
|
7352
|
+
[timeout]` });
|
|
7353
|
+
}, 60000);
|
|
7354
|
+
});
|
|
7355
|
+
}
|
|
7356
|
+
async function runWorkflow(workflow) {
|
|
7357
|
+
const results = [];
|
|
7358
|
+
let previousOutput;
|
|
7359
|
+
let success = true;
|
|
7360
|
+
for (let i = 0;i < workflow.steps.length; i++) {
|
|
7361
|
+
const step = workflow.steps[i];
|
|
7362
|
+
const { exitCode, output } = await runStep(step, previousOutput);
|
|
7363
|
+
const stripped = await maybeStrip(output);
|
|
7364
|
+
results.push({ step: i + 1, connector: step.connector, command: step.command, exit_code: exitCode, output: stripped });
|
|
7365
|
+
if (exitCode !== 0) {
|
|
7366
|
+
success = false;
|
|
7367
|
+
break;
|
|
7368
|
+
}
|
|
7369
|
+
previousOutput = stripped;
|
|
7370
|
+
}
|
|
7371
|
+
return {
|
|
7372
|
+
workflow_id: workflow.id,
|
|
7373
|
+
workflow_name: workflow.name,
|
|
7374
|
+
steps: results,
|
|
7375
|
+
success,
|
|
7376
|
+
final_output: results[results.length - 1]?.output ?? ""
|
|
7377
|
+
};
|
|
7378
|
+
}
|
|
7379
|
+
var init_workflow_runner = __esm(() => {
|
|
7380
|
+
init_strip();
|
|
7381
|
+
});
|
|
7382
|
+
|
|
6493
7383
|
// node_modules/zod/v3/external.js
|
|
6494
7384
|
var exports_external = {};
|
|
6495
7385
|
__export(exports_external, {
|
|
@@ -19394,6 +20284,94 @@ class StdioServerTransport {
|
|
|
19394
20284
|
import { existsSync, readFileSync } from "fs";
|
|
19395
20285
|
import { join, dirname } from "path";
|
|
19396
20286
|
import { fileURLToPath } from "url";
|
|
20287
|
+
|
|
20288
|
+
// src/lib/fuzzy.ts
|
|
20289
|
+
function levenshtein(a, b) {
|
|
20290
|
+
const m = a.length;
|
|
20291
|
+
const n = b.length;
|
|
20292
|
+
if (m === 0)
|
|
20293
|
+
return n;
|
|
20294
|
+
if (n === 0)
|
|
20295
|
+
return m;
|
|
20296
|
+
let prev = new Array(n + 1);
|
|
20297
|
+
let curr = new Array(n + 1);
|
|
20298
|
+
for (let j = 0;j <= n; j++)
|
|
20299
|
+
prev[j] = j;
|
|
20300
|
+
for (let i = 1;i <= m; i++) {
|
|
20301
|
+
curr[0] = i;
|
|
20302
|
+
for (let j = 1;j <= n; j++) {
|
|
20303
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
20304
|
+
curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
|
|
20305
|
+
}
|
|
20306
|
+
[prev, curr] = [curr, prev];
|
|
20307
|
+
}
|
|
20308
|
+
return prev[n];
|
|
20309
|
+
}
|
|
20310
|
+
function bestFuzzyScore(token, candidates, maxDistance = 2) {
|
|
20311
|
+
if (token.length < 3)
|
|
20312
|
+
return 0;
|
|
20313
|
+
let bestDist = maxDistance + 1;
|
|
20314
|
+
for (const c of candidates) {
|
|
20315
|
+
if (Math.abs(token.length - c.length) > maxDistance)
|
|
20316
|
+
continue;
|
|
20317
|
+
const d = levenshtein(token, c);
|
|
20318
|
+
if (d < bestDist)
|
|
20319
|
+
bestDist = d;
|
|
20320
|
+
if (d === 0)
|
|
20321
|
+
return maxDistance + 1;
|
|
20322
|
+
}
|
|
20323
|
+
if (bestDist > maxDistance)
|
|
20324
|
+
return 0;
|
|
20325
|
+
return maxDistance - bestDist + 1;
|
|
20326
|
+
}
|
|
20327
|
+
|
|
20328
|
+
// src/lib/synonyms.ts
|
|
20329
|
+
var SYNONYM_MAP = {
|
|
20330
|
+
email: ["smtp", "mail", "inbox", "resend", "ses"],
|
|
20331
|
+
chat: ["messaging", "im", "slack", "discord", "teams"],
|
|
20332
|
+
sms: ["text", "twilio", "messaging"],
|
|
20333
|
+
payment: ["billing", "invoicing", "commerce", "checkout", "stripe"],
|
|
20334
|
+
payments: ["billing", "invoicing", "commerce", "checkout", "stripe"],
|
|
20335
|
+
ecommerce: ["shop", "store", "commerce", "shopify"],
|
|
20336
|
+
finance: ["banking", "accounting", "invoicing"],
|
|
20337
|
+
crypto: ["blockchain", "web3", "wallet"],
|
|
20338
|
+
ai: ["llm", "ml", "model", "gpt", "claude", "anthropic", "openai"],
|
|
20339
|
+
llm: ["ai", "model", "gpt", "claude"],
|
|
20340
|
+
auth: ["oauth", "sso", "login", "identity", "authentication"],
|
|
20341
|
+
database: ["db", "sql", "nosql", "postgres", "mongo", "supabase"],
|
|
20342
|
+
deploy: ["hosting", "infrastructure", "ci", "cd", "vercel"],
|
|
20343
|
+
storage: ["files", "drive", "s3", "bucket", "upload"],
|
|
20344
|
+
cloud: ["aws", "gcp", "azure", "infrastructure"],
|
|
20345
|
+
api: ["rest", "graphql", "endpoint", "webhook"],
|
|
20346
|
+
monitoring: ["logs", "observability", "alerting", "datadog", "sentry"],
|
|
20347
|
+
ci: ["cd", "deploy", "pipeline", "github", "actions"],
|
|
20348
|
+
crm: ["sales", "leads", "contacts", "hubspot", "salesforce"],
|
|
20349
|
+
analytics: ["data", "metrics", "tracking", "mixpanel", "amplitude"],
|
|
20350
|
+
project: ["task", "issue", "board", "jira", "linear", "asana"],
|
|
20351
|
+
docs: ["documentation", "wiki", "notion", "confluence"],
|
|
20352
|
+
design: ["figma", "sketch", "ui", "ux"],
|
|
20353
|
+
security: ["auth", "encryption", "compliance", "vault"]
|
|
20354
|
+
};
|
|
20355
|
+
function expandQuery(tokens) {
|
|
20356
|
+
const synonyms = new Set;
|
|
20357
|
+
for (const token of tokens) {
|
|
20358
|
+
const matches = SYNONYM_MAP[token];
|
|
20359
|
+
if (matches) {
|
|
20360
|
+
for (const syn of matches) {
|
|
20361
|
+
if (!tokens.includes(syn))
|
|
20362
|
+
synonyms.add(syn);
|
|
20363
|
+
}
|
|
20364
|
+
}
|
|
20365
|
+
for (const [key, values] of Object.entries(SYNONYM_MAP)) {
|
|
20366
|
+
if (values.includes(token) && !tokens.includes(key)) {
|
|
20367
|
+
synonyms.add(key);
|
|
20368
|
+
}
|
|
20369
|
+
}
|
|
20370
|
+
}
|
|
20371
|
+
return { original: tokens, expanded: [...synonyms] };
|
|
20372
|
+
}
|
|
20373
|
+
|
|
20374
|
+
// src/lib/registry.ts
|
|
19397
20375
|
var CATEGORIES = [
|
|
19398
20376
|
"AI & ML",
|
|
19399
20377
|
"Developer Tools",
|
|
@@ -24279,13 +25257,6 @@ var CONNECTORS = [
|
|
|
24279
25257
|
category: "Business Tools",
|
|
24280
25258
|
tags: ["e-signature", "contracts", "digital", "documents", "legal"]
|
|
24281
25259
|
},
|
|
24282
|
-
{
|
|
24283
|
-
name: "yousign",
|
|
24284
|
-
displayName: "Yousign",
|
|
24285
|
-
description: "eIDAS-compliant electronic signature API for EU workflows",
|
|
24286
|
-
category: "Business Tools",
|
|
24287
|
-
tags: ["e-signature", "eidas", "contracts", "documents", "legal", "eu"]
|
|
24288
|
-
},
|
|
24289
25260
|
{
|
|
24290
25261
|
name: "signl4",
|
|
24291
25262
|
displayName: "SIGNL4",
|
|
@@ -25319,9 +26290,152 @@ var CONNECTORS = [
|
|
|
25319
26290
|
function getConnectorsByCategory(category) {
|
|
25320
26291
|
return CONNECTORS.filter((c) => c.category === category);
|
|
25321
26292
|
}
|
|
25322
|
-
function searchConnectors(query) {
|
|
25323
|
-
const
|
|
25324
|
-
|
|
26293
|
+
function searchConnectors(query, context) {
|
|
26294
|
+
const tokens = query.toLowerCase().trim().split(/\s+/).filter(Boolean);
|
|
26295
|
+
if (tokens.length === 0)
|
|
26296
|
+
return [];
|
|
26297
|
+
const limit = context?.limit ?? 20;
|
|
26298
|
+
const installed = new Set(context?.installed ?? []);
|
|
26299
|
+
const promoted = new Set(context?.promoted ?? []);
|
|
26300
|
+
const usage = context?.usage ?? new Map;
|
|
26301
|
+
const results = [];
|
|
26302
|
+
for (const c of CONNECTORS) {
|
|
26303
|
+
const nameLow = c.name.toLowerCase();
|
|
26304
|
+
const displayLow = c.displayName.toLowerCase();
|
|
26305
|
+
const descLow = c.description.toLowerCase();
|
|
26306
|
+
const tagsLow = c.tags.map((t) => t.toLowerCase());
|
|
26307
|
+
let score = 0;
|
|
26308
|
+
const matchReasons = [];
|
|
26309
|
+
let allTokensMatch = true;
|
|
26310
|
+
for (const token of tokens) {
|
|
26311
|
+
let tokenMatched = false;
|
|
26312
|
+
if (nameLow === token) {
|
|
26313
|
+
score += 100;
|
|
26314
|
+
matchReasons.push(`name="${token}"`);
|
|
26315
|
+
tokenMatched = true;
|
|
26316
|
+
} else if (nameLow.includes(token)) {
|
|
26317
|
+
score += 10;
|
|
26318
|
+
matchReasons.push(`name~${token}`);
|
|
26319
|
+
tokenMatched = true;
|
|
26320
|
+
}
|
|
26321
|
+
if (tagsLow.includes(token)) {
|
|
26322
|
+
score += 8;
|
|
26323
|
+
if (!tokenMatched)
|
|
26324
|
+
matchReasons.push(`tag="${token}"`);
|
|
26325
|
+
tokenMatched = true;
|
|
26326
|
+
} else if (tagsLow.some((t) => t.includes(token))) {
|
|
26327
|
+
score += 5;
|
|
26328
|
+
if (!tokenMatched)
|
|
26329
|
+
matchReasons.push(`tag~${token}`);
|
|
26330
|
+
tokenMatched = true;
|
|
26331
|
+
}
|
|
26332
|
+
if (displayLow.includes(token)) {
|
|
26333
|
+
score += 3;
|
|
26334
|
+
if (!tokenMatched)
|
|
26335
|
+
matchReasons.push(`display~${token}`);
|
|
26336
|
+
tokenMatched = true;
|
|
26337
|
+
}
|
|
26338
|
+
if (descLow.includes(token)) {
|
|
26339
|
+
score += 1;
|
|
26340
|
+
if (!tokenMatched)
|
|
26341
|
+
matchReasons.push(`desc~${token}`);
|
|
26342
|
+
tokenMatched = true;
|
|
26343
|
+
}
|
|
26344
|
+
if (!tokenMatched && token.length >= 3) {
|
|
26345
|
+
const nameFuzzy = bestFuzzyScore(token, [nameLow], 1);
|
|
26346
|
+
if (nameFuzzy > 0) {
|
|
26347
|
+
score += nameFuzzy * 6;
|
|
26348
|
+
matchReasons.push(`fuzzy:name\u2248${token}`);
|
|
26349
|
+
tokenMatched = true;
|
|
26350
|
+
}
|
|
26351
|
+
if (!tokenMatched) {
|
|
26352
|
+
const tagFuzzy = bestFuzzyScore(token, tagsLow, 2);
|
|
26353
|
+
if (tagFuzzy > 0) {
|
|
26354
|
+
score += tagFuzzy * 3;
|
|
26355
|
+
matchReasons.push(`fuzzy:tag\u2248${token}`);
|
|
26356
|
+
tokenMatched = true;
|
|
26357
|
+
}
|
|
26358
|
+
}
|
|
26359
|
+
if (!tokenMatched) {
|
|
26360
|
+
const displayFuzzy = bestFuzzyScore(token, [displayLow], 2);
|
|
26361
|
+
if (displayFuzzy > 0) {
|
|
26362
|
+
score += displayFuzzy * 2;
|
|
26363
|
+
matchReasons.push(`fuzzy:display\u2248${token}`);
|
|
26364
|
+
tokenMatched = true;
|
|
26365
|
+
}
|
|
26366
|
+
}
|
|
26367
|
+
}
|
|
26368
|
+
if (!tokenMatched) {
|
|
26369
|
+
allTokensMatch = false;
|
|
26370
|
+
break;
|
|
26371
|
+
}
|
|
26372
|
+
}
|
|
26373
|
+
if (!allTokensMatch)
|
|
26374
|
+
continue;
|
|
26375
|
+
const badges = [];
|
|
26376
|
+
if (installed.has(c.name)) {
|
|
26377
|
+
score += 50;
|
|
26378
|
+
badges.push("installed");
|
|
26379
|
+
}
|
|
26380
|
+
if (promoted.has(c.name)) {
|
|
26381
|
+
score += 30;
|
|
26382
|
+
badges.push("promoted");
|
|
26383
|
+
}
|
|
26384
|
+
const usageCount = usage.get(c.name) ?? 0;
|
|
26385
|
+
if (usageCount > 0) {
|
|
26386
|
+
score += Math.min(usageCount * 2, 40);
|
|
26387
|
+
if (usageCount >= 5)
|
|
26388
|
+
badges.push("hot");
|
|
26389
|
+
}
|
|
26390
|
+
results.push({ ...c, score, matchReasons, badges });
|
|
26391
|
+
}
|
|
26392
|
+
const matchedNames = new Set(results.map((r) => r.name));
|
|
26393
|
+
if (results.length < limit) {
|
|
26394
|
+
const { expanded } = expandQuery(tokens);
|
|
26395
|
+
if (expanded.length > 0) {
|
|
26396
|
+
for (const c of CONNECTORS) {
|
|
26397
|
+
if (matchedNames.has(c.name))
|
|
26398
|
+
continue;
|
|
26399
|
+
const nameLow2 = c.name.toLowerCase();
|
|
26400
|
+
const tagsLow2 = c.tags.map((t) => t.toLowerCase());
|
|
26401
|
+
const descLow2 = c.description.toLowerCase();
|
|
26402
|
+
let synScore = 0;
|
|
26403
|
+
const synReasons = [];
|
|
26404
|
+
for (const syn of expanded) {
|
|
26405
|
+
if (nameLow2.includes(syn)) {
|
|
26406
|
+
synScore += 2;
|
|
26407
|
+
synReasons.push(`syn:name~${syn}`);
|
|
26408
|
+
} else if (tagsLow2.some((t) => t.includes(syn))) {
|
|
26409
|
+
synScore += 1;
|
|
26410
|
+
synReasons.push(`syn:tag~${syn}`);
|
|
26411
|
+
} else if (descLow2.includes(syn)) {
|
|
26412
|
+
synScore += 1;
|
|
26413
|
+
synReasons.push(`syn:desc~${syn}`);
|
|
26414
|
+
}
|
|
26415
|
+
}
|
|
26416
|
+
if (synScore > 0) {
|
|
26417
|
+
const badges = [];
|
|
26418
|
+
if (installed.has(c.name)) {
|
|
26419
|
+
synScore += 50;
|
|
26420
|
+
badges.push("installed");
|
|
26421
|
+
}
|
|
26422
|
+
if (promoted.has(c.name)) {
|
|
26423
|
+
synScore += 30;
|
|
26424
|
+
badges.push("promoted");
|
|
26425
|
+
}
|
|
26426
|
+
const usageCount = usage.get(c.name) ?? 0;
|
|
26427
|
+
if (usageCount > 0) {
|
|
26428
|
+
synScore += Math.min(usageCount * 2, 40);
|
|
26429
|
+
if (usageCount >= 5)
|
|
26430
|
+
badges.push("hot");
|
|
26431
|
+
}
|
|
26432
|
+
results.push({ ...c, score: synScore, matchReasons: synReasons, badges });
|
|
26433
|
+
}
|
|
26434
|
+
}
|
|
26435
|
+
}
|
|
26436
|
+
}
|
|
26437
|
+
results.sort((a, b) => b.score - a.score);
|
|
26438
|
+
return results.slice(0, limit);
|
|
25325
26439
|
}
|
|
25326
26440
|
function getConnector(name) {
|
|
25327
26441
|
return CONNECTORS.find((c) => c.name === name);
|
|
@@ -25350,106 +26464,83 @@ function loadConnectorVersions() {
|
|
|
25350
26464
|
}
|
|
25351
26465
|
}
|
|
25352
26466
|
|
|
25353
|
-
// src/
|
|
25354
|
-
|
|
25355
|
-
|
|
25356
|
-
|
|
25357
|
-
|
|
25358
|
-
|
|
25359
|
-
|
|
25360
|
-
|
|
25361
|
-
|
|
25362
|
-
|
|
25363
|
-
|
|
25364
|
-
|
|
25365
|
-
|
|
26467
|
+
// src/mcp/index.ts
|
|
26468
|
+
init_installer();
|
|
26469
|
+
|
|
26470
|
+
// src/server/auth.ts
|
|
26471
|
+
import { existsSync as existsSync4, readFileSync as readFileSync3, writeFileSync as writeFileSync2, mkdirSync as mkdirSync3, readdirSync as readdirSync2, rmSync as rmSync2, statSync as statSync3 } from "fs";
|
|
26472
|
+
init_installer();
|
|
26473
|
+
import { homedir as homedir3 } from "os";
|
|
26474
|
+
import { join as join4 } from "path";
|
|
26475
|
+
|
|
26476
|
+
// src/lib/lock.ts
|
|
26477
|
+
import { openSync, closeSync, unlinkSync, existsSync as existsSync3, statSync as statSync2 } from "fs";
|
|
26478
|
+
import { join as join3 } from "path";
|
|
26479
|
+
import { homedir as homedir2 } from "os";
|
|
26480
|
+
import { mkdirSync as mkdirSync2 } from "fs";
|
|
26481
|
+
var LOCK_TIMEOUT_MS = 5000;
|
|
26482
|
+
var LOCK_RETRY_MS = 100;
|
|
26483
|
+
var STALE_LOCK_MS = 30000;
|
|
26484
|
+
|
|
26485
|
+
class LockTimeoutError extends Error {
|
|
26486
|
+
connector;
|
|
26487
|
+
constructor(connector) {
|
|
26488
|
+
super(`Could not acquire write lock for connector "${connector}" within ${LOCK_TIMEOUT_MS}ms. Another agent may be writing. Try again shortly.`);
|
|
26489
|
+
this.connector = connector;
|
|
26490
|
+
this.name = "LockTimeoutError";
|
|
26491
|
+
}
|
|
25366
26492
|
}
|
|
25367
|
-
|
|
25368
|
-
|
|
25369
|
-
|
|
25370
|
-
return
|
|
26493
|
+
function lockPath(connector) {
|
|
26494
|
+
const dir = join3(homedir2(), ".connectors", `connect-${connector}`);
|
|
26495
|
+
mkdirSync2(dir, { recursive: true });
|
|
26496
|
+
return join3(dir, ".write.lock");
|
|
25371
26497
|
}
|
|
25372
|
-
function
|
|
25373
|
-
|
|
25374
|
-
|
|
25375
|
-
|
|
25376
|
-
|
|
25377
|
-
|
|
25378
|
-
};
|
|
25379
|
-
}
|
|
25380
|
-
const sourcePath = getConnectorPath(name);
|
|
25381
|
-
if (!existsSync2(sourcePath)) {
|
|
25382
|
-
return {
|
|
25383
|
-
connector: name,
|
|
25384
|
-
success: false,
|
|
25385
|
-
error: `Connector '${name}' not found`
|
|
25386
|
-
};
|
|
26498
|
+
function isStale(path) {
|
|
26499
|
+
try {
|
|
26500
|
+
const stat = statSync2(path);
|
|
26501
|
+
return Date.now() - stat.mtimeMs > STALE_LOCK_MS;
|
|
26502
|
+
} catch {
|
|
26503
|
+
return false;
|
|
25387
26504
|
}
|
|
25388
|
-
return {
|
|
25389
|
-
connector: name,
|
|
25390
|
-
success: true,
|
|
25391
|
-
path: sourcePath
|
|
25392
|
-
};
|
|
25393
26505
|
}
|
|
25394
|
-
function
|
|
25395
|
-
if (
|
|
25396
|
-
|
|
26506
|
+
function tryAcquire(path) {
|
|
26507
|
+
if (existsSync3(path) && isStale(path)) {
|
|
26508
|
+
try {
|
|
26509
|
+
unlinkSync(path);
|
|
26510
|
+
} catch {}
|
|
26511
|
+
}
|
|
26512
|
+
try {
|
|
26513
|
+
const fd = openSync(path, "wx");
|
|
26514
|
+
closeSync(fd);
|
|
26515
|
+
return true;
|
|
26516
|
+
} catch (e) {
|
|
26517
|
+
if (e.code === "EEXIST")
|
|
26518
|
+
return false;
|
|
26519
|
+
throw e;
|
|
25397
26520
|
}
|
|
25398
|
-
return readdirSync(CONNECTORS_DIR).filter((f) => {
|
|
25399
|
-
const fullPath = join2(CONNECTORS_DIR, f);
|
|
25400
|
-
return f.startsWith("connect-") && statSync(fullPath).isDirectory();
|
|
25401
|
-
}).map((f) => f.replace("connect-", ""));
|
|
25402
|
-
}
|
|
25403
|
-
function getConnectorDocs(name) {
|
|
25404
|
-
const connectorPath = getConnectorPath(name);
|
|
25405
|
-
const claudeMdPath = join2(connectorPath, "CLAUDE.md");
|
|
25406
|
-
if (!existsSync2(claudeMdPath))
|
|
25407
|
-
return null;
|
|
25408
|
-
const raw = readFileSync2(claudeMdPath, "utf-8");
|
|
25409
|
-
return {
|
|
25410
|
-
overview: extractSection(raw, "Project Overview"),
|
|
25411
|
-
auth: extractSection(raw, "Authentication"),
|
|
25412
|
-
envVars: parseEnvVarsTable(extractSection(raw, "Environment Variables")),
|
|
25413
|
-
cliCommands: extractSection(raw, "CLI Commands"),
|
|
25414
|
-
dataStorage: extractSection(raw, "Data Storage"),
|
|
25415
|
-
raw
|
|
25416
|
-
};
|
|
25417
|
-
}
|
|
25418
|
-
function extractSection(markdown, heading) {
|
|
25419
|
-
const regex = new RegExp(`^##\\s+${escapeRegex2(heading)}\\s*$`, "m");
|
|
25420
|
-
const match = regex.exec(markdown);
|
|
25421
|
-
if (!match)
|
|
25422
|
-
return "";
|
|
25423
|
-
const start = match.index + match[0].length;
|
|
25424
|
-
const nextHeading = markdown.slice(start).search(/^##\s/m);
|
|
25425
|
-
const content = nextHeading === -1 ? markdown.slice(start) : markdown.slice(start, start + nextHeading);
|
|
25426
|
-
return content.trim();
|
|
25427
|
-
}
|
|
25428
|
-
function escapeRegex2(str) {
|
|
25429
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
25430
26521
|
}
|
|
25431
|
-
function
|
|
25432
|
-
|
|
25433
|
-
|
|
25434
|
-
|
|
25435
|
-
|
|
25436
|
-
|
|
25437
|
-
|
|
25438
|
-
|
|
25439
|
-
|
|
25440
|
-
|
|
26522
|
+
function release(path) {
|
|
26523
|
+
try {
|
|
26524
|
+
unlinkSync(path);
|
|
26525
|
+
} catch {}
|
|
26526
|
+
}
|
|
26527
|
+
async function withWriteLock(connector, fn) {
|
|
26528
|
+
const path = lockPath(connector);
|
|
26529
|
+
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
26530
|
+
while (Date.now() < deadline) {
|
|
26531
|
+
if (tryAcquire(path)) {
|
|
26532
|
+
try {
|
|
26533
|
+
return await fn();
|
|
26534
|
+
} finally {
|
|
26535
|
+
release(path);
|
|
26536
|
+
}
|
|
25441
26537
|
}
|
|
26538
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
25442
26539
|
}
|
|
25443
|
-
|
|
25444
|
-
}
|
|
25445
|
-
function removeConnector(name) {
|
|
25446
|
-
return false;
|
|
26540
|
+
throw new LockTimeoutError(connector);
|
|
25447
26541
|
}
|
|
25448
26542
|
|
|
25449
26543
|
// src/server/auth.ts
|
|
25450
|
-
import { existsSync as existsSync3, readFileSync as readFileSync3, writeFileSync, mkdirSync, readdirSync as readdirSync2, rmSync, statSync as statSync2 } from "fs";
|
|
25451
|
-
import { homedir } from "os";
|
|
25452
|
-
import { join as join3 } from "path";
|
|
25453
26544
|
var oauthStateStore = new Map;
|
|
25454
26545
|
var GOOGLE_SCOPES = {
|
|
25455
26546
|
gmail: [
|
|
@@ -25502,12 +26593,12 @@ function getAuthType(name) {
|
|
|
25502
26593
|
}
|
|
25503
26594
|
function getConnectorConfigDir(name) {
|
|
25504
26595
|
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
25505
|
-
return
|
|
26596
|
+
return join4(homedir3(), ".connectors", connectorName);
|
|
25506
26597
|
}
|
|
25507
26598
|
function getCurrentProfile(name) {
|
|
25508
26599
|
const configDir = getConnectorConfigDir(name);
|
|
25509
|
-
const currentProfileFile =
|
|
25510
|
-
if (
|
|
26600
|
+
const currentProfileFile = join4(configDir, "current_profile");
|
|
26601
|
+
if (existsSync4(currentProfileFile)) {
|
|
25511
26602
|
try {
|
|
25512
26603
|
return readFileSync3(currentProfileFile, "utf-8").trim() || "default";
|
|
25513
26604
|
} catch {
|
|
@@ -25521,14 +26612,14 @@ function loadProfileConfig(name) {
|
|
|
25521
26612
|
const profile = getCurrentProfile(name);
|
|
25522
26613
|
let flatConfig = {};
|
|
25523
26614
|
let dirConfig = {};
|
|
25524
|
-
const profileFile =
|
|
25525
|
-
if (
|
|
26615
|
+
const profileFile = join4(configDir, "profiles", `${profile}.json`);
|
|
26616
|
+
if (existsSync4(profileFile)) {
|
|
25526
26617
|
try {
|
|
25527
26618
|
flatConfig = JSON.parse(readFileSync3(profileFile, "utf-8"));
|
|
25528
26619
|
} catch {}
|
|
25529
26620
|
}
|
|
25530
|
-
const profileDirConfig =
|
|
25531
|
-
if (
|
|
26621
|
+
const profileDirConfig = join4(configDir, "profiles", profile, "config.json");
|
|
26622
|
+
if (existsSync4(profileDirConfig)) {
|
|
25532
26623
|
try {
|
|
25533
26624
|
dirConfig = JSON.parse(readFileSync3(profileDirConfig, "utf-8"));
|
|
25534
26625
|
} catch {}
|
|
@@ -25541,14 +26632,24 @@ function loadProfileConfig(name) {
|
|
|
25541
26632
|
function loadTokens(name) {
|
|
25542
26633
|
const configDir = getConnectorConfigDir(name);
|
|
25543
26634
|
const profile = getCurrentProfile(name);
|
|
25544
|
-
const tokensFile =
|
|
25545
|
-
if (
|
|
26635
|
+
const tokensFile = join4(configDir, "profiles", profile, "tokens.json");
|
|
26636
|
+
if (existsSync4(tokensFile)) {
|
|
25546
26637
|
try {
|
|
25547
26638
|
return JSON.parse(readFileSync3(tokensFile, "utf-8"));
|
|
25548
26639
|
} catch {
|
|
25549
26640
|
return null;
|
|
25550
26641
|
}
|
|
25551
26642
|
}
|
|
26643
|
+
const profileConfig = loadProfileConfig(name);
|
|
26644
|
+
if (profileConfig.refreshToken || profileConfig.accessToken) {
|
|
26645
|
+
return {
|
|
26646
|
+
accessToken: profileConfig.accessToken ?? "",
|
|
26647
|
+
refreshToken: profileConfig.refreshToken,
|
|
26648
|
+
expiresAt: profileConfig.expiresAt ?? 0,
|
|
26649
|
+
tokenType: profileConfig.tokenType,
|
|
26650
|
+
scope: profileConfig.scope
|
|
26651
|
+
};
|
|
26652
|
+
}
|
|
25552
26653
|
return null;
|
|
25553
26654
|
}
|
|
25554
26655
|
function getAuthStatus(name) {
|
|
@@ -25589,48 +26690,51 @@ function getAuthStatus(name) {
|
|
|
25589
26690
|
envVarTotalCount
|
|
25590
26691
|
};
|
|
25591
26692
|
}
|
|
25592
|
-
function saveApiKey(name, key, field) {
|
|
26693
|
+
async function saveApiKey(name, key, field) {
|
|
26694
|
+
return withWriteLock(name, () => _saveApiKey(name, key, field));
|
|
26695
|
+
}
|
|
26696
|
+
function _saveApiKey(name, key, field) {
|
|
25593
26697
|
const configDir = getConnectorConfigDir(name);
|
|
25594
26698
|
const profile = getCurrentProfile(name);
|
|
25595
26699
|
const keyField = field || guessKeyField(name);
|
|
25596
26700
|
if (keyField === "clientId" || keyField === "clientSecret") {
|
|
25597
|
-
const credentialsFile =
|
|
25598
|
-
|
|
26701
|
+
const credentialsFile = join4(configDir, "credentials.json");
|
|
26702
|
+
mkdirSync3(configDir, { recursive: true });
|
|
25599
26703
|
let creds = {};
|
|
25600
|
-
if (
|
|
26704
|
+
if (existsSync4(credentialsFile)) {
|
|
25601
26705
|
try {
|
|
25602
26706
|
creds = JSON.parse(readFileSync3(credentialsFile, "utf-8"));
|
|
25603
26707
|
} catch {}
|
|
25604
26708
|
}
|
|
25605
26709
|
creds[keyField] = key;
|
|
25606
|
-
|
|
26710
|
+
writeFileSync2(credentialsFile, JSON.stringify(creds, null, 2));
|
|
25607
26711
|
return;
|
|
25608
26712
|
}
|
|
25609
|
-
const profileFile =
|
|
25610
|
-
const profileDir =
|
|
25611
|
-
if (
|
|
26713
|
+
const profileFile = join4(configDir, "profiles", `${profile}.json`);
|
|
26714
|
+
const profileDir = join4(configDir, "profiles", profile);
|
|
26715
|
+
if (existsSync4(profileFile)) {
|
|
25612
26716
|
let config2 = {};
|
|
25613
26717
|
try {
|
|
25614
26718
|
config2 = JSON.parse(readFileSync3(profileFile, "utf-8"));
|
|
25615
26719
|
} catch {}
|
|
25616
26720
|
config2[keyField] = key;
|
|
25617
|
-
|
|
26721
|
+
writeFileSync2(profileFile, JSON.stringify(config2, null, 2));
|
|
25618
26722
|
return;
|
|
25619
26723
|
}
|
|
25620
|
-
if (
|
|
25621
|
-
const configFile =
|
|
26724
|
+
if (existsSync4(profileDir)) {
|
|
26725
|
+
const configFile = join4(profileDir, "config.json");
|
|
25622
26726
|
let config2 = {};
|
|
25623
|
-
if (
|
|
26727
|
+
if (existsSync4(configFile)) {
|
|
25624
26728
|
try {
|
|
25625
26729
|
config2 = JSON.parse(readFileSync3(configFile, "utf-8"));
|
|
25626
26730
|
} catch {}
|
|
25627
26731
|
}
|
|
25628
26732
|
config2[keyField] = key;
|
|
25629
|
-
|
|
26733
|
+
writeFileSync2(configFile, JSON.stringify(config2, null, 2));
|
|
25630
26734
|
return;
|
|
25631
26735
|
}
|
|
25632
|
-
|
|
25633
|
-
|
|
26736
|
+
mkdirSync3(profileDir, { recursive: true });
|
|
26737
|
+
writeFileSync2(join4(profileDir, "config.json"), JSON.stringify({ [keyField]: key }, null, 2));
|
|
25634
26738
|
}
|
|
25635
26739
|
function guessKeyField(name) {
|
|
25636
26740
|
const docs = getConnectorDocs(name);
|
|
@@ -25648,17 +26752,17 @@ function guessKeyField(name) {
|
|
|
25648
26752
|
}
|
|
25649
26753
|
|
|
25650
26754
|
// src/lib/runner.ts
|
|
25651
|
-
import { existsSync as
|
|
25652
|
-
import { join as
|
|
26755
|
+
import { existsSync as existsSync5 } from "fs";
|
|
26756
|
+
import { join as join5, dirname as dirname3 } from "path";
|
|
25653
26757
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
25654
26758
|
import { spawn } from "child_process";
|
|
25655
26759
|
var __dirname3 = dirname3(fileURLToPath3(import.meta.url));
|
|
25656
26760
|
function resolveConnectorsDir2() {
|
|
25657
|
-
const fromBin =
|
|
25658
|
-
if (
|
|
26761
|
+
const fromBin = join5(__dirname3, "..", "connectors");
|
|
26762
|
+
if (existsSync5(fromBin))
|
|
25659
26763
|
return fromBin;
|
|
25660
|
-
const fromSrc =
|
|
25661
|
-
if (
|
|
26764
|
+
const fromSrc = join5(__dirname3, "..", "..", "connectors");
|
|
26765
|
+
if (existsSync5(fromSrc))
|
|
25662
26766
|
return fromSrc;
|
|
25663
26767
|
return fromBin;
|
|
25664
26768
|
}
|
|
@@ -25698,9 +26802,9 @@ function buildEnvWithCredentials(connectorName, baseEnv) {
|
|
|
25698
26802
|
}
|
|
25699
26803
|
function getConnectorCliPath(name) {
|
|
25700
26804
|
const safeName = name.replace(/[^a-z0-9-]/g, "");
|
|
25701
|
-
const connectorDir =
|
|
25702
|
-
const cliPath =
|
|
25703
|
-
if (
|
|
26805
|
+
const connectorDir = join5(CONNECTORS_DIR2, `connect-${safeName}`);
|
|
26806
|
+
const cliPath = join5(connectorDir, "src", "cli", "index.ts");
|
|
26807
|
+
if (existsSync5(cliPath))
|
|
25704
26808
|
return cliPath;
|
|
25705
26809
|
return null;
|
|
25706
26810
|
}
|
|
@@ -25779,32 +26883,248 @@ async function getConnectorCommandHelp(name, command) {
|
|
|
25779
26883
|
return result.stdout || result.stderr;
|
|
25780
26884
|
}
|
|
25781
26885
|
|
|
26886
|
+
// src/db/agents.ts
|
|
26887
|
+
init_database();
|
|
26888
|
+
var AGENT_ACTIVE_WINDOW_MS = 30 * 60 * 1000;
|
|
26889
|
+
function shortUuid2() {
|
|
26890
|
+
return crypto.randomUUID().slice(0, 8);
|
|
26891
|
+
}
|
|
26892
|
+
function isAgentConflict(result) {
|
|
26893
|
+
return result.conflict === true;
|
|
26894
|
+
}
|
|
26895
|
+
function registerAgent(input, db) {
|
|
26896
|
+
const d = db ?? getDatabase();
|
|
26897
|
+
const normalizedName = input.name.trim().toLowerCase();
|
|
26898
|
+
const existing = getAgentByName(normalizedName, d);
|
|
26899
|
+
if (existing) {
|
|
26900
|
+
const lastSeenMs = new Date(existing.last_seen_at).getTime();
|
|
26901
|
+
const isActive = Date.now() - lastSeenMs < AGENT_ACTIVE_WINDOW_MS;
|
|
26902
|
+
const sameSession = input.session_id && existing.session_id && input.session_id === existing.session_id;
|
|
26903
|
+
const differentSession = input.session_id && existing.session_id && input.session_id !== existing.session_id;
|
|
26904
|
+
if (isActive && differentSession) {
|
|
26905
|
+
const minutesAgo = Math.round((Date.now() - lastSeenMs) / 60000);
|
|
26906
|
+
return {
|
|
26907
|
+
conflict: true,
|
|
26908
|
+
existing_id: existing.id,
|
|
26909
|
+
existing_name: existing.name,
|
|
26910
|
+
last_seen_at: existing.last_seen_at,
|
|
26911
|
+
session_hint: existing.session_id ? existing.session_id.slice(0, 8) : null,
|
|
26912
|
+
working_dir: null,
|
|
26913
|
+
message: `Agent "${normalizedName}" is already active (last seen ${minutesAgo}m ago). Pass session_id="${existing.session_id}" to reclaim it, or choose a different name.`
|
|
26914
|
+
};
|
|
26915
|
+
}
|
|
26916
|
+
const updates = ["last_seen_at = ?"];
|
|
26917
|
+
const params = [now()];
|
|
26918
|
+
if (input.session_id && !sameSession) {
|
|
26919
|
+
updates.push("session_id = ?");
|
|
26920
|
+
params.push(input.session_id);
|
|
26921
|
+
}
|
|
26922
|
+
params.push(existing.id);
|
|
26923
|
+
d.run(`UPDATE agents SET ${updates.join(", ")} WHERE id = ?`, params);
|
|
26924
|
+
return getAgent(existing.id, d);
|
|
26925
|
+
}
|
|
26926
|
+
const id = shortUuid2();
|
|
26927
|
+
const ts = now();
|
|
26928
|
+
d.run(`INSERT INTO agents (id, name, session_id, role, last_seen_at, created_at)
|
|
26929
|
+
VALUES (?, ?, ?, ?, ?, ?)`, [id, normalizedName, input.session_id ?? null, input.role ?? "agent", ts, ts]);
|
|
26930
|
+
return getAgent(id, d);
|
|
26931
|
+
}
|
|
26932
|
+
function getAgent(id, db) {
|
|
26933
|
+
const d = db ?? getDatabase();
|
|
26934
|
+
return d.query("SELECT * FROM agents WHERE id = ?").get(id);
|
|
26935
|
+
}
|
|
26936
|
+
function getAgentByName(name, db) {
|
|
26937
|
+
const d = db ?? getDatabase();
|
|
26938
|
+
return d.query("SELECT * FROM agents WHERE LOWER(name) = ?").get(name.trim().toLowerCase());
|
|
26939
|
+
}
|
|
26940
|
+
function listAgents(db) {
|
|
26941
|
+
const d = db ?? getDatabase();
|
|
26942
|
+
return d.query("SELECT * FROM agents ORDER BY name").all();
|
|
26943
|
+
}
|
|
26944
|
+
|
|
26945
|
+
// src/db/rate.ts
|
|
26946
|
+
init_database();
|
|
26947
|
+
var AGENT_ACTIVE_WINDOW_MS2 = 30 * 60 * 1000;
|
|
26948
|
+
var WINDOW_SECONDS = 60;
|
|
26949
|
+
function ensureRateTable(db) {
|
|
26950
|
+
db.run(`
|
|
26951
|
+
CREATE TABLE IF NOT EXISTS connector_rate_usage (
|
|
26952
|
+
agent_id TEXT NOT NULL,
|
|
26953
|
+
connector TEXT NOT NULL,
|
|
26954
|
+
window_start TEXT NOT NULL,
|
|
26955
|
+
call_count INTEGER NOT NULL DEFAULT 0,
|
|
26956
|
+
PRIMARY KEY (agent_id, connector, window_start)
|
|
26957
|
+
)
|
|
26958
|
+
`);
|
|
26959
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_rate_usage_window ON connector_rate_usage(connector, window_start)`);
|
|
26960
|
+
}
|
|
26961
|
+
function countActiveAgents(db) {
|
|
26962
|
+
const cutoff = new Date(Date.now() - AGENT_ACTIVE_WINDOW_MS2).toISOString();
|
|
26963
|
+
const row = db.query("SELECT COUNT(*) as count FROM agents WHERE last_seen_at > ?").get(cutoff);
|
|
26964
|
+
return Math.max(1, row?.count ?? 1);
|
|
26965
|
+
}
|
|
26966
|
+
function currentWindowStart() {
|
|
26967
|
+
const now3 = Date.now();
|
|
26968
|
+
const windowMs = WINDOW_SECONDS * 1000;
|
|
26969
|
+
return new Date(Math.floor(now3 / windowMs) * windowMs).toISOString();
|
|
26970
|
+
}
|
|
26971
|
+
function checkRateBudget(agentId, connector, connectorLimit, consume = true, db) {
|
|
26972
|
+
const d = db ?? getDatabase();
|
|
26973
|
+
ensureRateTable(d);
|
|
26974
|
+
const activeAgents = countActiveAgents(d);
|
|
26975
|
+
const budget = Math.max(1, Math.floor(connectorLimit / activeAgents));
|
|
26976
|
+
const windowStart = currentWindowStart();
|
|
26977
|
+
const windowMs = WINDOW_SECONDS * 1000;
|
|
26978
|
+
const windowEnd = new Date(Math.floor(Date.now() / windowMs) * windowMs + windowMs);
|
|
26979
|
+
const windowResetsIn = windowEnd.getTime() - Date.now();
|
|
26980
|
+
const row = d.query("SELECT call_count FROM connector_rate_usage WHERE agent_id = ? AND connector = ? AND window_start = ?").get(agentId, connector, windowStart);
|
|
26981
|
+
const used = row?.call_count ?? 0;
|
|
26982
|
+
if (used >= budget) {
|
|
26983
|
+
return {
|
|
26984
|
+
exceeded: true,
|
|
26985
|
+
connector,
|
|
26986
|
+
agent_id: agentId,
|
|
26987
|
+
budget,
|
|
26988
|
+
used,
|
|
26989
|
+
active_agents: activeAgents,
|
|
26990
|
+
window_resets_in_ms: windowResetsIn,
|
|
26991
|
+
message: `Rate budget exceeded for "${connector}" (${used}/${budget} calls used, ${activeAgents} active agent${activeAgents === 1 ? "" : "s"} sharing limit of ${connectorLimit}/min). Resets in ${Math.ceil(windowResetsIn / 1000)}s.`
|
|
26992
|
+
};
|
|
26993
|
+
}
|
|
26994
|
+
if (consume) {
|
|
26995
|
+
d.run(`INSERT INTO connector_rate_usage (agent_id, connector, window_start, call_count)
|
|
26996
|
+
VALUES (?, ?, ?, 1)
|
|
26997
|
+
ON CONFLICT(agent_id, connector, window_start) DO UPDATE SET call_count = call_count + 1`, [agentId, connector, windowStart]);
|
|
26998
|
+
}
|
|
26999
|
+
return {
|
|
27000
|
+
connector,
|
|
27001
|
+
agent_id: agentId,
|
|
27002
|
+
limit: connectorLimit,
|
|
27003
|
+
active_agents: activeAgents,
|
|
27004
|
+
budget,
|
|
27005
|
+
used: consume ? used + 1 : used,
|
|
27006
|
+
remaining: consume ? budget - used - 1 : budget - used,
|
|
27007
|
+
window_start: windowStart,
|
|
27008
|
+
window_resets_in_ms: windowResetsIn
|
|
27009
|
+
};
|
|
27010
|
+
}
|
|
27011
|
+
function getRateBudget(agentId, connector, connectorLimit, db) {
|
|
27012
|
+
return checkRateBudget(agentId, connector, connectorLimit, false, db);
|
|
27013
|
+
}
|
|
27014
|
+
|
|
27015
|
+
// src/mcp/index.ts
|
|
27016
|
+
init_strip();
|
|
27017
|
+
// package.json
|
|
27018
|
+
var package_default = {
|
|
27019
|
+
name: "@hasna/connectors",
|
|
27020
|
+
version: "1.3.3",
|
|
27021
|
+
description: "Open source connector library - Install API connectors with a single command",
|
|
27022
|
+
type: "module",
|
|
27023
|
+
bin: {
|
|
27024
|
+
connectors: "./bin/index.js",
|
|
27025
|
+
"connectors-mcp": "./bin/mcp.js",
|
|
27026
|
+
"connectors-serve": "./bin/serve.js"
|
|
27027
|
+
},
|
|
27028
|
+
files: [
|
|
27029
|
+
"bin/",
|
|
27030
|
+
"dist/",
|
|
27031
|
+
"dashboard/dist/",
|
|
27032
|
+
"connectors/",
|
|
27033
|
+
"README.md"
|
|
27034
|
+
],
|
|
27035
|
+
exports: {
|
|
27036
|
+
".": {
|
|
27037
|
+
import: "./dist/index.js",
|
|
27038
|
+
types: "./dist/index.d.ts"
|
|
27039
|
+
}
|
|
27040
|
+
},
|
|
27041
|
+
main: "./dist/index.js",
|
|
27042
|
+
types: "./dist/index.d.ts",
|
|
27043
|
+
scripts: {
|
|
27044
|
+
build: "cd dashboard && bun run build && cd .. && bun build ./src/cli/index.tsx --outdir ./bin --target bun --external ink --external react --external chalk --external conf && bun build ./src/mcp/index.ts --outfile ./bin/mcp.js --target bun && bun build ./src/server/index.ts --outfile ./bin/serve.js --target bun && bun build ./src/index.ts --outdir ./dist --target bun && tsc --emitDeclarationOnly --outDir ./dist",
|
|
27045
|
+
"build:dashboard": "cd dashboard && bun run build",
|
|
27046
|
+
postinstall: '[ "$SKIP_DASHBOARD" = "1" ] || [ ! -f dashboard/package.json ] || [ -d dashboard/node_modules ] || (cd dashboard && bun install)',
|
|
27047
|
+
dev: "bun run ./src/cli/index.tsx",
|
|
27048
|
+
typecheck: "tsc --noEmit",
|
|
27049
|
+
test: "bun test",
|
|
27050
|
+
"sdk:build": "cd sdk && bun run build",
|
|
27051
|
+
prepublishOnly: "bun test && bun run build"
|
|
27052
|
+
},
|
|
27053
|
+
keywords: [
|
|
27054
|
+
"connectors",
|
|
27055
|
+
"api",
|
|
27056
|
+
"cli",
|
|
27057
|
+
"typescript",
|
|
27058
|
+
"bun",
|
|
27059
|
+
"figma",
|
|
27060
|
+
"stripe",
|
|
27061
|
+
"github",
|
|
27062
|
+
"openai",
|
|
27063
|
+
"mcp",
|
|
27064
|
+
"model-context-protocol"
|
|
27065
|
+
],
|
|
27066
|
+
author: "Hasna",
|
|
27067
|
+
license: "Apache-2.0",
|
|
27068
|
+
devDependencies: {
|
|
27069
|
+
"@types/bun": "latest",
|
|
27070
|
+
"@types/react": "^18.2.0",
|
|
27071
|
+
"ink-testing-library": "^4.0.0",
|
|
27072
|
+
typescript: "^5"
|
|
27073
|
+
},
|
|
27074
|
+
dependencies: {
|
|
27075
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
27076
|
+
chalk: "^5.3.0",
|
|
27077
|
+
commander: "^12.1.0",
|
|
27078
|
+
conf: "^13.0.1",
|
|
27079
|
+
"fast-xml-parser": "^5.5.3",
|
|
27080
|
+
ink: "^5.0.1",
|
|
27081
|
+
"ink-select-input": "^6.0.0",
|
|
27082
|
+
"ink-spinner": "^5.0.0",
|
|
27083
|
+
"ink-text-input": "^6.0.0",
|
|
27084
|
+
open: "^11.0.0",
|
|
27085
|
+
react: "^18.2.0",
|
|
27086
|
+
zod: "3"
|
|
27087
|
+
},
|
|
27088
|
+
engines: {
|
|
27089
|
+
bun: ">=1.0.0"
|
|
27090
|
+
},
|
|
27091
|
+
publishConfig: {
|
|
27092
|
+
registry: "https://registry.npmjs.org",
|
|
27093
|
+
access: "public"
|
|
27094
|
+
},
|
|
27095
|
+
repository: {
|
|
27096
|
+
type: "git",
|
|
27097
|
+
url: "git+https://github.com/hasna/connectors.git"
|
|
27098
|
+
},
|
|
27099
|
+
homepage: "https://github.com/hasna/connectors#readme",
|
|
27100
|
+
bugs: {
|
|
27101
|
+
url: "https://github.com/hasna/connectors/issues"
|
|
27102
|
+
}
|
|
27103
|
+
};
|
|
27104
|
+
|
|
25782
27105
|
// src/mcp/index.ts
|
|
25783
27106
|
loadConnectorVersions();
|
|
27107
|
+
async function stripped(text) {
|
|
27108
|
+
return { content: [{ type: "text", text: await maybeStrip(text) }] };
|
|
27109
|
+
}
|
|
25784
27110
|
var server = new McpServer({
|
|
25785
27111
|
name: "connectors",
|
|
25786
|
-
version:
|
|
27112
|
+
version: package_default.version
|
|
25787
27113
|
});
|
|
25788
27114
|
server.registerTool("search_connectors", {
|
|
25789
27115
|
title: "Search Connectors",
|
|
25790
27116
|
description: "Search connectors by name or keyword.",
|
|
25791
27117
|
inputSchema: { query: exports_external.string() }
|
|
25792
27118
|
}, async ({ query }) => {
|
|
25793
|
-
const
|
|
25794
|
-
|
|
25795
|
-
|
|
25796
|
-
|
|
25797
|
-
|
|
25798
|
-
|
|
25799
|
-
|
|
25800
|
-
|
|
25801
|
-
|
|
25802
|
-
category: c.category,
|
|
25803
|
-
description: c.description
|
|
25804
|
-
})), null, 2)
|
|
25805
|
-
}
|
|
25806
|
-
]
|
|
25807
|
-
};
|
|
27119
|
+
const { getInstalledConnectors: getInstalledConnectors2 } = await Promise.resolve().then(() => (init_installer(), exports_installer));
|
|
27120
|
+
const { getPromotedConnectors: getPromotedConnectors2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
27121
|
+
const { getUsageMap: getUsageMap2 } = await Promise.resolve().then(() => (init_usage(), exports_usage));
|
|
27122
|
+
const results = searchConnectors(query, {
|
|
27123
|
+
installed: getInstalledConnectors2(),
|
|
27124
|
+
promoted: getPromotedConnectors2(),
|
|
27125
|
+
usage: getUsageMap2()
|
|
27126
|
+
});
|
|
27127
|
+
return stripped(JSON.stringify(results.map((c) => ({ name: c.name, displayName: c.displayName, version: c.version, category: c.category, description: c.description, score: c.score, badges: c.badges })), null, 2));
|
|
25808
27128
|
});
|
|
25809
27129
|
server.registerTool("list_connectors", {
|
|
25810
27130
|
title: "List Connectors",
|
|
@@ -25837,9 +27157,7 @@ server.registerTool("list_connectors", {
|
|
|
25837
27157
|
category: c.category,
|
|
25838
27158
|
description: c.description
|
|
25839
27159
|
}));
|
|
25840
|
-
return
|
|
25841
|
-
content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
|
|
25842
|
-
};
|
|
27160
|
+
return stripped(JSON.stringify(data, null, 2));
|
|
25843
27161
|
});
|
|
25844
27162
|
server.registerTool("connector_docs", {
|
|
25845
27163
|
title: "Connector Documentation",
|
|
@@ -25881,14 +27199,14 @@ server.registerTool("connector_docs", {
|
|
|
25881
27199
|
});
|
|
25882
27200
|
server.registerTool("install_connector", {
|
|
25883
27201
|
title: "Install Connector",
|
|
25884
|
-
description: "
|
|
27202
|
+
description: "Install connectors into .connectors/.",
|
|
25885
27203
|
inputSchema: {
|
|
25886
27204
|
names: exports_external.array(exports_external.string()),
|
|
25887
27205
|
overwrite: exports_external.boolean().optional()
|
|
25888
27206
|
}
|
|
25889
|
-
}, async ({ names }) => {
|
|
25890
|
-
const results = names.map((name) => installConnector(name));
|
|
25891
|
-
const summary = results.map((r) => r.success ? `\u2713 ${r.connector}
|
|
27207
|
+
}, async ({ names, overwrite }) => {
|
|
27208
|
+
const results = names.map((name) => installConnector(name, { overwrite: overwrite ?? false }));
|
|
27209
|
+
const summary = results.map((r) => r.success ? `\u2713 ${r.connector} \u2192 ${r.path}` : `\u2717 ${r.connector}: ${r.error}`);
|
|
25892
27210
|
return {
|
|
25893
27211
|
content: [
|
|
25894
27212
|
{
|
|
@@ -25896,7 +27214,8 @@ server.registerTool("install_connector", {
|
|
|
25896
27214
|
text: JSON.stringify({
|
|
25897
27215
|
results,
|
|
25898
27216
|
summary: summary.join(`
|
|
25899
|
-
`)
|
|
27217
|
+
`),
|
|
27218
|
+
usage: results.some((r) => r.success) ? "Import from './.connectors': import { " + results.filter((r) => r.success).map((r) => r.connector).join(", ") + " } from './.connectors'" : undefined
|
|
25900
27219
|
}, null, 2)
|
|
25901
27220
|
}
|
|
25902
27221
|
]
|
|
@@ -25904,22 +27223,22 @@ server.registerTool("install_connector", {
|
|
|
25904
27223
|
});
|
|
25905
27224
|
server.registerTool("remove_connector", {
|
|
25906
27225
|
title: "Remove Connector",
|
|
25907
|
-
description: "Remove
|
|
27226
|
+
description: "Remove an installed connector.",
|
|
25908
27227
|
inputSchema: { name: exports_external.string() }
|
|
25909
27228
|
}, async ({ name }) => {
|
|
25910
|
-
removeConnector(name);
|
|
27229
|
+
const removed = removeConnector(name);
|
|
25911
27230
|
return {
|
|
25912
27231
|
content: [
|
|
25913
27232
|
{
|
|
25914
27233
|
type: "text",
|
|
25915
|
-
text: JSON.stringify({ name,
|
|
27234
|
+
text: JSON.stringify({ name, removed })
|
|
25916
27235
|
}
|
|
25917
27236
|
]
|
|
25918
27237
|
};
|
|
25919
27238
|
});
|
|
25920
27239
|
server.registerTool("list_installed", {
|
|
25921
27240
|
title: "List Installed Connectors",
|
|
25922
|
-
description: "List
|
|
27241
|
+
description: "List connectors installed in .connectors/.",
|
|
25923
27242
|
inputSchema: {}
|
|
25924
27243
|
}, async () => {
|
|
25925
27244
|
const installed = getInstalledConnectors();
|
|
@@ -25991,7 +27310,7 @@ server.registerTool("configure_auth", {
|
|
|
25991
27310
|
}
|
|
25992
27311
|
}, async ({ name, key, field }) => {
|
|
25993
27312
|
try {
|
|
25994
|
-
saveApiKey(name, key, field);
|
|
27313
|
+
await saveApiKey(name, key, field);
|
|
25995
27314
|
return {
|
|
25996
27315
|
content: [
|
|
25997
27316
|
{
|
|
@@ -26087,18 +27406,11 @@ server.registerTool("run_connector_operation", {
|
|
|
26087
27406
|
description: "Execute an API operation on a connector. Pass the connector name and CLI arguments. Use list_connector_operations first to discover available commands. Example: name='stripe', args=['products', 'list', '--limit', '5']",
|
|
26088
27407
|
inputSchema: {
|
|
26089
27408
|
name: exports_external.string().describe("Connector name (e.g. stripe, gmail, anthropic)"),
|
|
26090
|
-
args: exports_external.
|
|
27409
|
+
args: exports_external.array(exports_external.string()).describe("CLI arguments for the connector command (e.g. ['products', 'list', '--limit', '5'])"),
|
|
26091
27410
|
format: exports_external.enum(["json", "pretty"]).optional().describe("Output format (default: json for structured parsing)"),
|
|
26092
27411
|
timeout: exports_external.number().optional().describe("Timeout in milliseconds (default: 30000)")
|
|
26093
27412
|
}
|
|
26094
|
-
}, async ({ name, args
|
|
26095
|
-
const args = typeof rawArgs === "string" ? (() => {
|
|
26096
|
-
try {
|
|
26097
|
-
return JSON.parse(rawArgs);
|
|
26098
|
-
} catch {
|
|
26099
|
-
return [rawArgs];
|
|
26100
|
-
}
|
|
26101
|
-
})() : rawArgs;
|
|
27413
|
+
}, async ({ name, args, format, timeout }) => {
|
|
26102
27414
|
const meta = getConnector(name);
|
|
26103
27415
|
if (!meta) {
|
|
26104
27416
|
return {
|
|
@@ -26106,6 +27418,10 @@ server.registerTool("run_connector_operation", {
|
|
|
26106
27418
|
isError: true
|
|
26107
27419
|
};
|
|
26108
27420
|
}
|
|
27421
|
+
try {
|
|
27422
|
+
const { logUsage: logUsage2 } = await Promise.resolve().then(() => (init_usage(), exports_usage));
|
|
27423
|
+
logUsage2(name, "run");
|
|
27424
|
+
} catch {}
|
|
26109
27425
|
const finalArgs = [...args];
|
|
26110
27426
|
if (format) {
|
|
26111
27427
|
finalArgs.push("--format", format);
|
|
@@ -26188,7 +27504,7 @@ server.registerTool("setup_connector", {
|
|
|
26188
27504
|
}
|
|
26189
27505
|
if (key) {
|
|
26190
27506
|
try {
|
|
26191
|
-
saveApiKey(name, key, field);
|
|
27507
|
+
await saveApiKey(name, key, field);
|
|
26192
27508
|
} catch (error2) {
|
|
26193
27509
|
return {
|
|
26194
27510
|
content: [
|
|
@@ -26274,10 +27590,142 @@ server.registerTool("describe_tools", {
|
|
|
26274
27590
|
`);
|
|
26275
27591
|
return { content: [{ type: "text", text: result }] };
|
|
26276
27592
|
});
|
|
27593
|
+
server.registerTool("get_hot_connectors", { title: "Get Hot Connectors", description: "Top connectors by usage.", inputSchema: { limit: exports_external.number().optional(), days: exports_external.number().optional() } }, async ({ limit, days }) => {
|
|
27594
|
+
const { getTopConnectors: getTopConnectors2 } = await Promise.resolve().then(() => (init_usage(), exports_usage));
|
|
27595
|
+
const { getPromotedConnectors: getPromotedConnectors2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
27596
|
+
const top = getTopConnectors2(limit ?? 10, days ?? 7);
|
|
27597
|
+
const promoted = new Set(getPromotedConnectors2());
|
|
27598
|
+
const result = top.map((t) => ({ ...t, promoted: promoted.has(t.connector) }));
|
|
27599
|
+
return stripped(JSON.stringify(result, null, 2));
|
|
27600
|
+
});
|
|
27601
|
+
server.registerTool("promote_connector", { title: "Promote Connector", description: "Boost a connector in search rankings.", inputSchema: { name: exports_external.string() } }, async ({ name }) => {
|
|
27602
|
+
const meta = getConnector(name);
|
|
27603
|
+
if (!meta)
|
|
27604
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: "Connector not found" }) }], isError: true };
|
|
27605
|
+
const { promoteConnector: promoteConnector2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
27606
|
+
promoteConnector2(name);
|
|
27607
|
+
return { content: [{ type: "text", text: JSON.stringify({ success: true, connector: name }) }] };
|
|
27608
|
+
});
|
|
27609
|
+
server.registerTool("demote_connector", { title: "Demote Connector", description: "Remove search ranking boost.", inputSchema: { name: exports_external.string() } }, async ({ name }) => {
|
|
27610
|
+
const { demoteConnector: demoteConnector2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
27611
|
+
const removed = demoteConnector2(name);
|
|
27612
|
+
return { content: [{ type: "text", text: JSON.stringify({ success: removed, connector: name }) }] };
|
|
27613
|
+
});
|
|
27614
|
+
server.registerTool("list_jobs", { title: "List Jobs", description: "List scheduled connector jobs.", inputSchema: {} }, async () => {
|
|
27615
|
+
const { listJobs: listJobs2 } = await Promise.resolve().then(() => (init_jobs(), exports_jobs));
|
|
27616
|
+
const { getDatabase: getDatabase2 } = await Promise.resolve().then(() => (init_database(), exports_database));
|
|
27617
|
+
return stripped(JSON.stringify(listJobs2(getDatabase2()), null, 2));
|
|
27618
|
+
});
|
|
27619
|
+
server.registerTool("get_latest_job_run", { title: "Get Latest Job Run", description: "Get the most recent run output for a job.", inputSchema: { name: exports_external.string() } }, async ({ name }) => {
|
|
27620
|
+
const { getJobByName: getJobByName2, getLatestRun: getLatestRun2 } = await Promise.resolve().then(() => (init_jobs(), exports_jobs));
|
|
27621
|
+
const { getDatabase: getDatabase2 } = await Promise.resolve().then(() => (init_database(), exports_database));
|
|
27622
|
+
const db = getDatabase2();
|
|
27623
|
+
const job = getJobByName2(name, db);
|
|
27624
|
+
if (!job)
|
|
27625
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `Job "${name}" not found` }) }], isError: true };
|
|
27626
|
+
const run = getLatestRun2(job.id, db);
|
|
27627
|
+
return stripped(JSON.stringify(run ?? { message: "No runs yet" }, null, 2));
|
|
27628
|
+
});
|
|
27629
|
+
server.registerTool("run_job", { title: "Run Job", description: "Manually trigger a scheduled job.", inputSchema: { name: exports_external.string() } }, async ({ name }) => {
|
|
27630
|
+
const { getJobByName: getJobByName2 } = await Promise.resolve().then(() => (init_jobs(), exports_jobs));
|
|
27631
|
+
const { getDatabase: getDatabase2 } = await Promise.resolve().then(() => (init_database(), exports_database));
|
|
27632
|
+
const { triggerJob: triggerJob2 } = await Promise.resolve().then(() => (init_scheduler(), exports_scheduler));
|
|
27633
|
+
const db = getDatabase2();
|
|
27634
|
+
const job = getJobByName2(name, db);
|
|
27635
|
+
if (!job)
|
|
27636
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `Job "${name}" not found` }) }], isError: true };
|
|
27637
|
+
const result = await triggerJob2(job, db);
|
|
27638
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
27639
|
+
});
|
|
27640
|
+
server.registerTool("list_workflows", { title: "List Workflows", description: "List connector workflows.", inputSchema: {} }, async () => {
|
|
27641
|
+
const { listWorkflows: listWorkflows2 } = await Promise.resolve().then(() => (init_workflows(), exports_workflows));
|
|
27642
|
+
const { getDatabase: getDatabase2 } = await Promise.resolve().then(() => (init_database(), exports_database));
|
|
27643
|
+
return stripped(JSON.stringify(listWorkflows2(getDatabase2()), null, 2));
|
|
27644
|
+
});
|
|
27645
|
+
server.registerTool("run_workflow", { title: "Run Workflow", description: "Execute a connector workflow pipeline.", inputSchema: { name: exports_external.string() } }, async ({ name }) => {
|
|
27646
|
+
const { getWorkflowByName: getWorkflowByName2 } = await Promise.resolve().then(() => (init_workflows(), exports_workflows));
|
|
27647
|
+
const { getDatabase: getDatabase2 } = await Promise.resolve().then(() => (init_database(), exports_database));
|
|
27648
|
+
const { runWorkflow: runWorkflow2 } = await Promise.resolve().then(() => (init_workflow_runner(), exports_workflow_runner));
|
|
27649
|
+
const wf = getWorkflowByName2(name, getDatabase2());
|
|
27650
|
+
if (!wf)
|
|
27651
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `Workflow "${name}" not found` }) }], isError: true };
|
|
27652
|
+
const result = await runWorkflow2(wf);
|
|
27653
|
+
return stripped(JSON.stringify(result, null, 2));
|
|
27654
|
+
});
|
|
27655
|
+
server.registerTool("get_llm_config", {
|
|
27656
|
+
title: "Get LLM Config",
|
|
27657
|
+
description: "Get current LLM provider config and strip status.",
|
|
27658
|
+
inputSchema: {}
|
|
27659
|
+
}, async () => {
|
|
27660
|
+
const { getLlmConfig: getConfig, maskKey: mask } = await Promise.resolve().then(() => (init_llm(), exports_llm));
|
|
27661
|
+
const config2 = getConfig();
|
|
27662
|
+
if (!config2)
|
|
27663
|
+
return { content: [{ type: "text", text: JSON.stringify({ configured: false }) }] };
|
|
27664
|
+
return { content: [{ type: "text", text: JSON.stringify({ configured: true, provider: config2.provider, model: config2.model, key: mask(config2.api_key), strip: config2.strip }) }] };
|
|
27665
|
+
});
|
|
27666
|
+
server.registerTool("set_llm_strip", {
|
|
27667
|
+
title: "Set LLM Strip",
|
|
27668
|
+
description: "Enable or disable global output stripping.",
|
|
27669
|
+
inputSchema: { enabled: exports_external.boolean() }
|
|
27670
|
+
}, async ({ enabled }) => {
|
|
27671
|
+
const { setLlmStrip: setLlmStrip2 } = await Promise.resolve().then(() => (init_llm(), exports_llm));
|
|
27672
|
+
try {
|
|
27673
|
+
setLlmStrip2(enabled);
|
|
27674
|
+
return { content: [{ type: "text", text: JSON.stringify({ success: true, strip: enabled }) }] };
|
|
27675
|
+
} catch (e) {
|
|
27676
|
+
return { content: [{ type: "text", text: JSON.stringify({ success: false, error: e instanceof Error ? e.message : String(e) }) }], isError: true };
|
|
27677
|
+
}
|
|
27678
|
+
});
|
|
27679
|
+
server.registerTool("register_agent", {
|
|
27680
|
+
title: "Register Agent",
|
|
27681
|
+
description: "Register or heartbeat an agent. Returns agent or conflict error.",
|
|
27682
|
+
inputSchema: {
|
|
27683
|
+
name: exports_external.string(),
|
|
27684
|
+
session_id: exports_external.string().optional(),
|
|
27685
|
+
role: exports_external.string().optional()
|
|
27686
|
+
}
|
|
27687
|
+
}, async ({ name, session_id, role }) => {
|
|
27688
|
+
const result = registerAgent({ name, session_id, role });
|
|
27689
|
+
if (isAgentConflict(result)) {
|
|
27690
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
27691
|
+
}
|
|
27692
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
27693
|
+
});
|
|
27694
|
+
server.registerTool("list_agents", {
|
|
27695
|
+
title: "List Agents",
|
|
27696
|
+
description: "List all registered agents.",
|
|
27697
|
+
inputSchema: {}
|
|
27698
|
+
}, async () => {
|
|
27699
|
+
const agents = listAgents();
|
|
27700
|
+
return { content: [{ type: "text", text: JSON.stringify(agents, null, 2) }] };
|
|
27701
|
+
});
|
|
27702
|
+
server.registerTool("check_rate_budget", {
|
|
27703
|
+
title: "Check Rate Budget",
|
|
27704
|
+
description: "Consume one rate budget unit for an agent+connector. Returns budget status or RateExceededError.",
|
|
27705
|
+
inputSchema: {
|
|
27706
|
+
agent_id: exports_external.string(),
|
|
27707
|
+
connector: exports_external.string(),
|
|
27708
|
+
limit: exports_external.number().describe("Connector's documented rate limit (calls/min)")
|
|
27709
|
+
}
|
|
27710
|
+
}, async ({ agent_id, connector, limit }) => {
|
|
27711
|
+
const result = checkRateBudget(agent_id, connector, limit);
|
|
27712
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
27713
|
+
});
|
|
27714
|
+
server.registerTool("get_rate_budget", {
|
|
27715
|
+
title: "Get Rate Budget",
|
|
27716
|
+
description: "Peek at rate budget status without consuming a unit.",
|
|
27717
|
+
inputSchema: {
|
|
27718
|
+
agent_id: exports_external.string(),
|
|
27719
|
+
connector: exports_external.string(),
|
|
27720
|
+
limit: exports_external.number().describe("Connector's documented rate limit (calls/min)")
|
|
27721
|
+
}
|
|
27722
|
+
}, async ({ agent_id, connector, limit }) => {
|
|
27723
|
+
const result = getRateBudget(agent_id, connector, limit);
|
|
27724
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
27725
|
+
});
|
|
26277
27726
|
async function main() {
|
|
26278
27727
|
const transport = new StdioServerTransport;
|
|
26279
27728
|
await server.connect(transport);
|
|
26280
|
-
console.error("Connectors MCP server running on stdio");
|
|
26281
27729
|
}
|
|
26282
27730
|
main().catch((error2) => {
|
|
26283
27731
|
console.error("Fatal error:", error2);
|