@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/serve.js
CHANGED
|
@@ -1,16 +1,795 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __export = (target, all) => {
|
|
5
|
+
for (var name in all)
|
|
6
|
+
__defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
set: (newValue) => all[name] = () => newValue
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
3
14
|
var __require = import.meta.require;
|
|
4
15
|
|
|
16
|
+
// src/db/database.ts
|
|
17
|
+
var exports_database = {};
|
|
18
|
+
__export(exports_database, {
|
|
19
|
+
shortUuid: () => shortUuid,
|
|
20
|
+
now: () => now,
|
|
21
|
+
getDatabase: () => getDatabase,
|
|
22
|
+
closeDatabase: () => closeDatabase
|
|
23
|
+
});
|
|
24
|
+
import { Database } from "bun:sqlite";
|
|
25
|
+
import { join } from "path";
|
|
26
|
+
import { homedir } from "os";
|
|
27
|
+
import { mkdirSync } from "fs";
|
|
28
|
+
function getDatabase(path) {
|
|
29
|
+
if (_db)
|
|
30
|
+
return _db;
|
|
31
|
+
const dbPath = path ?? DB_PATH;
|
|
32
|
+
mkdirSync(join(dbPath, ".."), { recursive: true });
|
|
33
|
+
_db = new Database(dbPath);
|
|
34
|
+
_db.run("PRAGMA journal_mode = WAL");
|
|
35
|
+
migrate(_db);
|
|
36
|
+
return _db;
|
|
37
|
+
}
|
|
38
|
+
function closeDatabase() {
|
|
39
|
+
_db?.close();
|
|
40
|
+
_db = null;
|
|
41
|
+
}
|
|
42
|
+
function now() {
|
|
43
|
+
return new Date().toISOString();
|
|
44
|
+
}
|
|
45
|
+
function shortUuid() {
|
|
46
|
+
return crypto.randomUUID().slice(0, 8);
|
|
47
|
+
}
|
|
48
|
+
function migrate(db) {
|
|
49
|
+
db.run(`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
name TEXT UNIQUE NOT NULL,
|
|
53
|
+
session_id TEXT,
|
|
54
|
+
role TEXT NOT NULL DEFAULT 'agent',
|
|
55
|
+
last_seen_at TEXT NOT NULL,
|
|
56
|
+
created_at TEXT NOT NULL
|
|
57
|
+
)
|
|
58
|
+
`);
|
|
59
|
+
db.run(`
|
|
60
|
+
CREATE TABLE IF NOT EXISTS resource_locks (
|
|
61
|
+
id TEXT PRIMARY KEY,
|
|
62
|
+
resource_type TEXT NOT NULL CHECK(resource_type IN ('connector', 'agent', 'profile', 'token')),
|
|
63
|
+
resource_id TEXT NOT NULL,
|
|
64
|
+
agent_id TEXT NOT NULL,
|
|
65
|
+
lock_type TEXT NOT NULL DEFAULT 'exclusive' CHECK(lock_type IN ('advisory', 'exclusive')),
|
|
66
|
+
locked_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
67
|
+
expires_at TEXT NOT NULL
|
|
68
|
+
)
|
|
69
|
+
`);
|
|
70
|
+
db.run(`
|
|
71
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_resource_locks_exclusive
|
|
72
|
+
ON resource_locks(resource_type, resource_id)
|
|
73
|
+
WHERE lock_type = 'exclusive'
|
|
74
|
+
`);
|
|
75
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_resource_locks_agent ON resource_locks(agent_id)`);
|
|
76
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_resource_locks_expires ON resource_locks(expires_at)`);
|
|
77
|
+
db.run(`
|
|
78
|
+
CREATE TABLE IF NOT EXISTS connector_rate_usage (
|
|
79
|
+
agent_id TEXT NOT NULL,
|
|
80
|
+
connector TEXT NOT NULL,
|
|
81
|
+
window_start TEXT NOT NULL,
|
|
82
|
+
call_count INTEGER NOT NULL DEFAULT 0,
|
|
83
|
+
PRIMARY KEY (agent_id, connector, window_start)
|
|
84
|
+
)
|
|
85
|
+
`);
|
|
86
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_rate_usage_window ON connector_rate_usage(connector, window_start)`);
|
|
87
|
+
db.run(`
|
|
88
|
+
CREATE TABLE IF NOT EXISTS connector_jobs (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
name TEXT UNIQUE NOT NULL,
|
|
91
|
+
connector TEXT NOT NULL,
|
|
92
|
+
command TEXT NOT NULL,
|
|
93
|
+
args TEXT NOT NULL DEFAULT '[]',
|
|
94
|
+
cron TEXT NOT NULL,
|
|
95
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
96
|
+
strip INTEGER NOT NULL DEFAULT 0,
|
|
97
|
+
created_at TEXT NOT NULL,
|
|
98
|
+
last_run_at TEXT
|
|
99
|
+
)
|
|
100
|
+
`);
|
|
101
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_jobs_enabled ON connector_jobs(enabled)`);
|
|
102
|
+
db.run(`
|
|
103
|
+
CREATE TABLE IF NOT EXISTS connector_job_runs (
|
|
104
|
+
id TEXT PRIMARY KEY,
|
|
105
|
+
job_id TEXT NOT NULL REFERENCES connector_jobs(id) ON DELETE CASCADE,
|
|
106
|
+
started_at TEXT NOT NULL,
|
|
107
|
+
finished_at TEXT,
|
|
108
|
+
exit_code INTEGER,
|
|
109
|
+
raw_output TEXT,
|
|
110
|
+
stripped_output TEXT
|
|
111
|
+
)
|
|
112
|
+
`);
|
|
113
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_job_runs_job ON connector_job_runs(job_id, started_at DESC)`);
|
|
114
|
+
db.run(`
|
|
115
|
+
CREATE TABLE IF NOT EXISTS connector_workflows (
|
|
116
|
+
id TEXT PRIMARY KEY,
|
|
117
|
+
name TEXT UNIQUE NOT NULL,
|
|
118
|
+
steps TEXT NOT NULL DEFAULT '[]',
|
|
119
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
120
|
+
created_at TEXT NOT NULL
|
|
121
|
+
)
|
|
122
|
+
`);
|
|
123
|
+
db.run(`
|
|
124
|
+
CREATE TABLE IF NOT EXISTS connector_usage (
|
|
125
|
+
id TEXT PRIMARY KEY,
|
|
126
|
+
connector TEXT NOT NULL,
|
|
127
|
+
action TEXT NOT NULL,
|
|
128
|
+
agent_id TEXT,
|
|
129
|
+
timestamp TEXT NOT NULL
|
|
130
|
+
)
|
|
131
|
+
`);
|
|
132
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_usage_connector ON connector_usage(connector, timestamp DESC)`);
|
|
133
|
+
db.run(`
|
|
134
|
+
CREATE TABLE IF NOT EXISTS connector_promotions (
|
|
135
|
+
connector TEXT UNIQUE NOT NULL,
|
|
136
|
+
promoted_at TEXT NOT NULL
|
|
137
|
+
)
|
|
138
|
+
`);
|
|
139
|
+
}
|
|
140
|
+
var DB_DIR, DB_PATH, _db = null;
|
|
141
|
+
var init_database = __esm(() => {
|
|
142
|
+
DB_DIR = join(homedir(), ".connectors");
|
|
143
|
+
DB_PATH = join(DB_DIR, "connectors.db");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// src/lib/llm.ts
|
|
147
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
|
|
148
|
+
import { join as join2 } from "path";
|
|
149
|
+
import { homedir as homedir2 } from "os";
|
|
150
|
+
function getLlmConfigPath() {
|
|
151
|
+
return join2(homedir2(), ".connectors", "llm.json");
|
|
152
|
+
}
|
|
153
|
+
function getLlmConfig() {
|
|
154
|
+
const path = getLlmConfigPath();
|
|
155
|
+
if (!existsSync(path))
|
|
156
|
+
return null;
|
|
157
|
+
try {
|
|
158
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
159
|
+
} catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function saveLlmConfig(config) {
|
|
164
|
+
const dir = join2(homedir2(), ".connectors");
|
|
165
|
+
mkdirSync2(dir, { recursive: true });
|
|
166
|
+
writeFileSync(getLlmConfigPath(), JSON.stringify(config, null, 2));
|
|
167
|
+
}
|
|
168
|
+
function maskKey(key) {
|
|
169
|
+
if (key.length <= 8)
|
|
170
|
+
return "***";
|
|
171
|
+
return key.slice(0, 8) + "***";
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class LLMClient {
|
|
175
|
+
config;
|
|
176
|
+
constructor(config) {
|
|
177
|
+
this.config = config;
|
|
178
|
+
}
|
|
179
|
+
static fromConfig() {
|
|
180
|
+
const config = getLlmConfig();
|
|
181
|
+
if (!config)
|
|
182
|
+
return null;
|
|
183
|
+
return new LLMClient(config);
|
|
184
|
+
}
|
|
185
|
+
async complete(prompt, content) {
|
|
186
|
+
const start = Date.now();
|
|
187
|
+
const { provider, model, api_key } = this.config;
|
|
188
|
+
if (provider === "anthropic") {
|
|
189
|
+
return this._anthropicComplete(prompt, content, start);
|
|
190
|
+
}
|
|
191
|
+
const baseUrl = PROVIDER_BASE_URLS[provider];
|
|
192
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
193
|
+
method: "POST",
|
|
194
|
+
headers: {
|
|
195
|
+
"Content-Type": "application/json",
|
|
196
|
+
Authorization: `Bearer ${api_key}`
|
|
197
|
+
},
|
|
198
|
+
body: JSON.stringify({
|
|
199
|
+
model,
|
|
200
|
+
messages: [
|
|
201
|
+
{ role: "system", content: prompt },
|
|
202
|
+
{ role: "user", content }
|
|
203
|
+
],
|
|
204
|
+
temperature: 0,
|
|
205
|
+
max_tokens: 4096
|
|
206
|
+
})
|
|
207
|
+
});
|
|
208
|
+
if (!response.ok) {
|
|
209
|
+
const error = await response.text();
|
|
210
|
+
throw new Error(`LLM request failed (${provider} ${response.status}): ${error}`);
|
|
211
|
+
}
|
|
212
|
+
const data = await response.json();
|
|
213
|
+
return {
|
|
214
|
+
content: data.choices[0].message.content,
|
|
215
|
+
provider,
|
|
216
|
+
model,
|
|
217
|
+
latency_ms: Date.now() - start
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
async _anthropicComplete(prompt, content, start) {
|
|
221
|
+
const { model, api_key } = this.config;
|
|
222
|
+
const response = await fetch("https://api.anthropic.com/v1/messages", {
|
|
223
|
+
method: "POST",
|
|
224
|
+
headers: {
|
|
225
|
+
"Content-Type": "application/json",
|
|
226
|
+
"x-api-key": api_key,
|
|
227
|
+
"anthropic-version": "2023-06-01"
|
|
228
|
+
},
|
|
229
|
+
body: JSON.stringify({
|
|
230
|
+
model,
|
|
231
|
+
system: prompt,
|
|
232
|
+
messages: [{ role: "user", content }],
|
|
233
|
+
max_tokens: 4096
|
|
234
|
+
})
|
|
235
|
+
});
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
const error = await response.text();
|
|
238
|
+
throw new Error(`LLM request failed (anthropic ${response.status}): ${error}`);
|
|
239
|
+
}
|
|
240
|
+
const data = await response.json();
|
|
241
|
+
return {
|
|
242
|
+
content: data.content[0].text,
|
|
243
|
+
provider: "anthropic",
|
|
244
|
+
model,
|
|
245
|
+
latency_ms: Date.now() - start
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
var PROVIDER_BASE_URLS;
|
|
250
|
+
var init_llm = __esm(() => {
|
|
251
|
+
PROVIDER_BASE_URLS = {
|
|
252
|
+
cerebras: "https://api.cerebras.ai/v1",
|
|
253
|
+
groq: "https://api.groq.com/openai/v1",
|
|
254
|
+
openai: "https://api.openai.com/v1"
|
|
255
|
+
};
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// src/lib/strip.ts
|
|
259
|
+
async function maybeStrip(output, _type = "json") {
|
|
260
|
+
const config = getLlmConfig();
|
|
261
|
+
if (!config?.strip)
|
|
262
|
+
return output;
|
|
263
|
+
if (!output || output.trim().length === 0)
|
|
264
|
+
return output;
|
|
265
|
+
const client = LLMClient.fromConfig();
|
|
266
|
+
if (!client)
|
|
267
|
+
return output;
|
|
268
|
+
try {
|
|
269
|
+
const result = await client.complete(STRIP_PROMPT, output);
|
|
270
|
+
return result.content.trim();
|
|
271
|
+
} catch {
|
|
272
|
+
return output;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
var STRIP_PROMPT = `You are a data extraction assistant. Your job is to take raw API output and return ONLY the essential, structured data.
|
|
276
|
+
|
|
277
|
+
Rules:
|
|
278
|
+
- Return valid JSON only (no markdown, no explanation)
|
|
279
|
+
- Remove pagination metadata, rate limit headers, empty fields, null values
|
|
280
|
+
- Keep all meaningful data fields
|
|
281
|
+
- If the input is already minimal, return it unchanged
|
|
282
|
+
- If input is not JSON, extract key facts as a JSON object
|
|
283
|
+
- Never truncate actual data values`;
|
|
284
|
+
var init_strip = __esm(() => {
|
|
285
|
+
init_llm();
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// src/db/jobs.ts
|
|
289
|
+
function rowToJob(row) {
|
|
290
|
+
return {
|
|
291
|
+
...row,
|
|
292
|
+
args: JSON.parse(row.args || "[]"),
|
|
293
|
+
enabled: row.enabled === 1,
|
|
294
|
+
strip: row.strip === 1
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function createJob(input, db) {
|
|
298
|
+
const d = db ?? getDatabase();
|
|
299
|
+
const id = shortUuid();
|
|
300
|
+
const ts = now();
|
|
301
|
+
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]);
|
|
302
|
+
return getJob(id, d);
|
|
303
|
+
}
|
|
304
|
+
function getJob(id, db) {
|
|
305
|
+
const d = db ?? getDatabase();
|
|
306
|
+
const row = d.query("SELECT * FROM connector_jobs WHERE id = ?").get(id);
|
|
307
|
+
return row ? rowToJob(row) : null;
|
|
308
|
+
}
|
|
309
|
+
function getJobByName(name, db) {
|
|
310
|
+
const d = db ?? getDatabase();
|
|
311
|
+
const row = d.query("SELECT * FROM connector_jobs WHERE name = ?").get(name);
|
|
312
|
+
return row ? rowToJob(row) : null;
|
|
313
|
+
}
|
|
314
|
+
function listJobs(db) {
|
|
315
|
+
const d = db ?? getDatabase();
|
|
316
|
+
return d.query("SELECT * FROM connector_jobs ORDER BY name").all().map(rowToJob);
|
|
317
|
+
}
|
|
318
|
+
function listEnabledJobs(db) {
|
|
319
|
+
const d = db ?? getDatabase();
|
|
320
|
+
return d.query("SELECT * FROM connector_jobs WHERE enabled = 1").all().map(rowToJob);
|
|
321
|
+
}
|
|
322
|
+
function updateJob(id, input, db) {
|
|
323
|
+
const d = db ?? getDatabase();
|
|
324
|
+
const sets = [];
|
|
325
|
+
const params = [];
|
|
326
|
+
if (input.name !== undefined) {
|
|
327
|
+
sets.push("name = ?");
|
|
328
|
+
params.push(input.name);
|
|
329
|
+
}
|
|
330
|
+
if (input.connector !== undefined) {
|
|
331
|
+
sets.push("connector = ?");
|
|
332
|
+
params.push(input.connector);
|
|
333
|
+
}
|
|
334
|
+
if (input.command !== undefined) {
|
|
335
|
+
sets.push("command = ?");
|
|
336
|
+
params.push(input.command);
|
|
337
|
+
}
|
|
338
|
+
if (input.args !== undefined) {
|
|
339
|
+
sets.push("args = ?");
|
|
340
|
+
params.push(JSON.stringify(input.args));
|
|
341
|
+
}
|
|
342
|
+
if (input.cron !== undefined) {
|
|
343
|
+
sets.push("cron = ?");
|
|
344
|
+
params.push(input.cron);
|
|
345
|
+
}
|
|
346
|
+
if (input.enabled !== undefined) {
|
|
347
|
+
sets.push("enabled = ?");
|
|
348
|
+
params.push(input.enabled ? 1 : 0);
|
|
349
|
+
}
|
|
350
|
+
if (input.strip !== undefined) {
|
|
351
|
+
sets.push("strip = ?");
|
|
352
|
+
params.push(input.strip ? 1 : 0);
|
|
353
|
+
}
|
|
354
|
+
if (sets.length === 0)
|
|
355
|
+
return getJob(id, d);
|
|
356
|
+
params.push(id);
|
|
357
|
+
d.run(`UPDATE connector_jobs SET ${sets.join(", ")} WHERE id = ?`, params);
|
|
358
|
+
return getJob(id, d);
|
|
359
|
+
}
|
|
360
|
+
function deleteJob(id, db) {
|
|
361
|
+
const d = db ?? getDatabase();
|
|
362
|
+
return d.run("DELETE FROM connector_jobs WHERE id = ?", [id]).changes > 0;
|
|
363
|
+
}
|
|
364
|
+
function touchJobLastRun(id, db) {
|
|
365
|
+
const d = db ?? getDatabase();
|
|
366
|
+
d.run("UPDATE connector_jobs SET last_run_at = ? WHERE id = ?", [now(), id]);
|
|
367
|
+
}
|
|
368
|
+
function createJobRun(jobId, db) {
|
|
369
|
+
const d = db ?? getDatabase();
|
|
370
|
+
const id = shortUuid();
|
|
371
|
+
const ts = now();
|
|
372
|
+
d.run("INSERT INTO connector_job_runs (id, job_id, started_at) VALUES (?, ?, ?)", [id, jobId, ts]);
|
|
373
|
+
return { id, job_id: jobId, started_at: ts, finished_at: null, exit_code: null, raw_output: null, stripped_output: null };
|
|
374
|
+
}
|
|
375
|
+
function finishJobRun(id, result, db) {
|
|
376
|
+
const d = db ?? getDatabase();
|
|
377
|
+
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]);
|
|
378
|
+
}
|
|
379
|
+
function listJobRuns(jobId, limit = 20, db) {
|
|
380
|
+
const d = db ?? getDatabase();
|
|
381
|
+
return d.query("SELECT * FROM connector_job_runs WHERE job_id = ? ORDER BY started_at DESC LIMIT ?").all(jobId, limit);
|
|
382
|
+
}
|
|
383
|
+
var init_jobs = __esm(() => {
|
|
384
|
+
init_database();
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// src/lib/scheduler.ts
|
|
388
|
+
var exports_scheduler = {};
|
|
389
|
+
__export(exports_scheduler, {
|
|
390
|
+
triggerJob: () => triggerJob,
|
|
391
|
+
stopScheduler: () => stopScheduler,
|
|
392
|
+
startScheduler: () => startScheduler
|
|
393
|
+
});
|
|
394
|
+
import { spawn } from "child_process";
|
|
395
|
+
function cronMatches(cron, d) {
|
|
396
|
+
const parts = cron.trim().split(/\s+/);
|
|
397
|
+
if (parts.length !== 5)
|
|
398
|
+
return false;
|
|
399
|
+
const [min, hour, dom, mon, dow] = parts;
|
|
400
|
+
function matches(field, value, min_v, max_v) {
|
|
401
|
+
if (field === "*")
|
|
402
|
+
return true;
|
|
403
|
+
if (field.startsWith("*/")) {
|
|
404
|
+
const step = parseInt(field.slice(2));
|
|
405
|
+
return value % step === 0;
|
|
406
|
+
}
|
|
407
|
+
if (field.includes("-")) {
|
|
408
|
+
const [a, b] = field.split("-").map(Number);
|
|
409
|
+
return value >= a && value <= b;
|
|
410
|
+
}
|
|
411
|
+
if (field.includes(",")) {
|
|
412
|
+
return field.split(",").map(Number).includes(value);
|
|
413
|
+
}
|
|
414
|
+
return parseInt(field) === value;
|
|
415
|
+
}
|
|
416
|
+
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);
|
|
417
|
+
}
|
|
418
|
+
async function runConnectorCommand(connector, command, args) {
|
|
419
|
+
return new Promise((resolve) => {
|
|
420
|
+
const cmdArgs = [connector, command, ...args, "--format", "json"];
|
|
421
|
+
const proc = spawn("connectors", ["run", ...cmdArgs], { shell: false });
|
|
422
|
+
let output = "";
|
|
423
|
+
proc.stdout.on("data", (d) => {
|
|
424
|
+
output += d.toString();
|
|
425
|
+
});
|
|
426
|
+
proc.stderr.on("data", (d) => {
|
|
427
|
+
output += d.toString();
|
|
428
|
+
});
|
|
429
|
+
proc.on("close", (code) => resolve({ exitCode: code ?? 1, output }));
|
|
430
|
+
proc.on("error", () => resolve({ exitCode: 1, output: `Failed to spawn connectors run` }));
|
|
431
|
+
setTimeout(() => {
|
|
432
|
+
proc.kill();
|
|
433
|
+
resolve({ exitCode: 124, output: output + `
|
|
434
|
+
[timeout]` });
|
|
435
|
+
}, 60000);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
async function executeJob(job, db) {
|
|
439
|
+
const run = createJobRun(job.id, db);
|
|
440
|
+
try {
|
|
441
|
+
const { exitCode, output } = await runConnectorCommand(job.connector, job.command, job.args);
|
|
442
|
+
const stripped = job.strip ? await maybeStrip(output) : undefined;
|
|
443
|
+
finishJobRun(run.id, { exit_code: exitCode, raw_output: output, stripped_output: stripped }, db);
|
|
444
|
+
touchJobLastRun(job.id, db);
|
|
445
|
+
} catch (e) {
|
|
446
|
+
finishJobRun(run.id, { exit_code: 1, raw_output: String(e) }, db);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function startScheduler(db) {
|
|
450
|
+
if (_interval)
|
|
451
|
+
return;
|
|
452
|
+
_interval = setInterval(async () => {
|
|
453
|
+
const now3 = new Date;
|
|
454
|
+
const currentMinute = now3.getMinutes() + now3.getHours() * 60;
|
|
455
|
+
if (currentMinute === _lastCheckedMinute)
|
|
456
|
+
return;
|
|
457
|
+
_lastCheckedMinute = currentMinute;
|
|
458
|
+
const jobs = listEnabledJobs(db);
|
|
459
|
+
for (const job of jobs) {
|
|
460
|
+
if (cronMatches(job.cron, now3)) {
|
|
461
|
+
executeJob(job, db).catch(() => {});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}, 30000);
|
|
465
|
+
}
|
|
466
|
+
function stopScheduler() {
|
|
467
|
+
if (_interval) {
|
|
468
|
+
clearInterval(_interval);
|
|
469
|
+
_interval = null;
|
|
470
|
+
_lastCheckedMinute = -1;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
async function triggerJob(job, db) {
|
|
474
|
+
const run = createJobRun(job.id, db);
|
|
475
|
+
const { exitCode, output } = await runConnectorCommand(job.connector, job.command, job.args);
|
|
476
|
+
const stripped = job.strip ? await maybeStrip(output) : undefined;
|
|
477
|
+
finishJobRun(run.id, { exit_code: exitCode, raw_output: output, stripped_output: stripped }, db);
|
|
478
|
+
touchJobLastRun(job.id, db);
|
|
479
|
+
return { run_id: run.id, exit_code: exitCode, output: stripped ?? output };
|
|
480
|
+
}
|
|
481
|
+
var _interval = null, _lastCheckedMinute = -1;
|
|
482
|
+
var init_scheduler = __esm(() => {
|
|
483
|
+
init_jobs();
|
|
484
|
+
init_strip();
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
// src/db/usage.ts
|
|
488
|
+
var exports_usage = {};
|
|
489
|
+
__export(exports_usage, {
|
|
490
|
+
logUsage: () => logUsage,
|
|
491
|
+
getUsageStats: () => getUsageStats,
|
|
492
|
+
getUsageMap: () => getUsageMap,
|
|
493
|
+
getTopConnectors: () => getTopConnectors,
|
|
494
|
+
cleanOldUsage: () => cleanOldUsage
|
|
495
|
+
});
|
|
496
|
+
function logUsage(connector, action, agentId, db) {
|
|
497
|
+
const d = db ?? getDatabase();
|
|
498
|
+
d.run("INSERT INTO connector_usage (id, connector, action, agent_id, timestamp) VALUES (?, ?, ?, ?, ?)", [shortUuid(), connector, action, agentId ?? null, now()]);
|
|
499
|
+
}
|
|
500
|
+
function getUsageStats(connector, db) {
|
|
501
|
+
const d = db ?? getDatabase();
|
|
502
|
+
const total = d.query("SELECT COUNT(*) as c FROM connector_usage WHERE connector = ?").get(connector).c;
|
|
503
|
+
const d7 = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
504
|
+
const last7d = d.query("SELECT COUNT(*) as c FROM connector_usage WHERE connector = ? AND timestamp > ?").get(connector, d7).c;
|
|
505
|
+
const d1 = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
|
506
|
+
const last24h = d.query("SELECT COUNT(*) as c FROM connector_usage WHERE connector = ? AND timestamp > ?").get(connector, d1).c;
|
|
507
|
+
return { connector, total, last7d, last24h };
|
|
508
|
+
}
|
|
509
|
+
function getTopConnectors(limit = 10, days = 7, db) {
|
|
510
|
+
const d = db ?? getDatabase();
|
|
511
|
+
const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
512
|
+
return d.query("SELECT connector, COUNT(*) as count FROM connector_usage WHERE timestamp > ? GROUP BY connector ORDER BY count DESC LIMIT ?").all(since, limit);
|
|
513
|
+
}
|
|
514
|
+
function getUsageMap(days = 7, db) {
|
|
515
|
+
const top = getTopConnectors(100, days, db);
|
|
516
|
+
return new Map(top.map((t) => [t.connector, t.count]));
|
|
517
|
+
}
|
|
518
|
+
function cleanOldUsage(days = 30, db) {
|
|
519
|
+
const d = db ?? getDatabase();
|
|
520
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
521
|
+
return d.run("DELETE FROM connector_usage WHERE timestamp < ?", [cutoff]).changes;
|
|
522
|
+
}
|
|
523
|
+
var init_usage = __esm(() => {
|
|
524
|
+
init_database();
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
// src/db/promotions.ts
|
|
528
|
+
var exports_promotions = {};
|
|
529
|
+
__export(exports_promotions, {
|
|
530
|
+
promoteConnector: () => promoteConnector,
|
|
531
|
+
isPromoted: () => isPromoted,
|
|
532
|
+
getPromotedConnectors: () => getPromotedConnectors,
|
|
533
|
+
demoteConnector: () => demoteConnector
|
|
534
|
+
});
|
|
535
|
+
function promoteConnector(name, db) {
|
|
536
|
+
const d = db ?? getDatabase();
|
|
537
|
+
d.run("INSERT OR REPLACE INTO connector_promotions (connector, promoted_at) VALUES (?, ?)", [name, now()]);
|
|
538
|
+
}
|
|
539
|
+
function demoteConnector(name, db) {
|
|
540
|
+
const d = db ?? getDatabase();
|
|
541
|
+
return d.run("DELETE FROM connector_promotions WHERE connector = ?", [name]).changes > 0;
|
|
542
|
+
}
|
|
543
|
+
function getPromotedConnectors(db) {
|
|
544
|
+
const d = db ?? getDatabase();
|
|
545
|
+
return d.query("SELECT connector FROM connector_promotions ORDER BY promoted_at DESC").all().map((r) => r.connector);
|
|
546
|
+
}
|
|
547
|
+
function isPromoted(name, db) {
|
|
548
|
+
const d = db ?? getDatabase();
|
|
549
|
+
const row = d.query("SELECT 1 FROM connector_promotions WHERE connector = ?").get(name);
|
|
550
|
+
return !!row;
|
|
551
|
+
}
|
|
552
|
+
var init_promotions = __esm(() => {
|
|
553
|
+
init_database();
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
// src/server/serve.ts
|
|
557
|
+
import { existsSync as existsSync6, readdirSync as readdirSync3, readFileSync as readFileSync5, writeFileSync as writeFileSync4, mkdirSync as mkdirSync6 } from "fs";
|
|
558
|
+
|
|
559
|
+
// src/db/agents.ts
|
|
560
|
+
init_database();
|
|
561
|
+
var AGENT_ACTIVE_WINDOW_MS = 30 * 60 * 1000;
|
|
562
|
+
function shortUuid2() {
|
|
563
|
+
return crypto.randomUUID().slice(0, 8);
|
|
564
|
+
}
|
|
565
|
+
function isAgentConflict(result) {
|
|
566
|
+
return result.conflict === true;
|
|
567
|
+
}
|
|
568
|
+
function registerAgent(input, db) {
|
|
569
|
+
const d = db ?? getDatabase();
|
|
570
|
+
const normalizedName = input.name.trim().toLowerCase();
|
|
571
|
+
const existing = getAgentByName(normalizedName, d);
|
|
572
|
+
if (existing) {
|
|
573
|
+
const lastSeenMs = new Date(existing.last_seen_at).getTime();
|
|
574
|
+
const isActive = Date.now() - lastSeenMs < AGENT_ACTIVE_WINDOW_MS;
|
|
575
|
+
const sameSession = input.session_id && existing.session_id && input.session_id === existing.session_id;
|
|
576
|
+
const differentSession = input.session_id && existing.session_id && input.session_id !== existing.session_id;
|
|
577
|
+
if (isActive && differentSession) {
|
|
578
|
+
const minutesAgo = Math.round((Date.now() - lastSeenMs) / 60000);
|
|
579
|
+
return {
|
|
580
|
+
conflict: true,
|
|
581
|
+
existing_id: existing.id,
|
|
582
|
+
existing_name: existing.name,
|
|
583
|
+
last_seen_at: existing.last_seen_at,
|
|
584
|
+
session_hint: existing.session_id ? existing.session_id.slice(0, 8) : null,
|
|
585
|
+
working_dir: null,
|
|
586
|
+
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.`
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
const updates = ["last_seen_at = ?"];
|
|
590
|
+
const params = [now()];
|
|
591
|
+
if (input.session_id && !sameSession) {
|
|
592
|
+
updates.push("session_id = ?");
|
|
593
|
+
params.push(input.session_id);
|
|
594
|
+
}
|
|
595
|
+
params.push(existing.id);
|
|
596
|
+
d.run(`UPDATE agents SET ${updates.join(", ")} WHERE id = ?`, params);
|
|
597
|
+
return getAgent(existing.id, d);
|
|
598
|
+
}
|
|
599
|
+
const id = shortUuid2();
|
|
600
|
+
const ts = now();
|
|
601
|
+
d.run(`INSERT INTO agents (id, name, session_id, role, last_seen_at, created_at)
|
|
602
|
+
VALUES (?, ?, ?, ?, ?, ?)`, [id, normalizedName, input.session_id ?? null, input.role ?? "agent", ts, ts]);
|
|
603
|
+
return getAgent(id, d);
|
|
604
|
+
}
|
|
605
|
+
function getAgent(id, db) {
|
|
606
|
+
const d = db ?? getDatabase();
|
|
607
|
+
return d.query("SELECT * FROM agents WHERE id = ?").get(id);
|
|
608
|
+
}
|
|
609
|
+
function getAgentByName(name, db) {
|
|
610
|
+
const d = db ?? getDatabase();
|
|
611
|
+
return d.query("SELECT * FROM agents WHERE LOWER(name) = ?").get(name.trim().toLowerCase());
|
|
612
|
+
}
|
|
613
|
+
function listAgents(db) {
|
|
614
|
+
const d = db ?? getDatabase();
|
|
615
|
+
return d.query("SELECT * FROM agents ORDER BY name").all();
|
|
616
|
+
}
|
|
617
|
+
function deleteAgent(id, db) {
|
|
618
|
+
const d = db ?? getDatabase();
|
|
619
|
+
return d.run("DELETE FROM agents WHERE id = ?", [id]).changes > 0;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// src/db/rate.ts
|
|
623
|
+
init_database();
|
|
624
|
+
var AGENT_ACTIVE_WINDOW_MS2 = 30 * 60 * 1000;
|
|
625
|
+
var WINDOW_SECONDS = 60;
|
|
626
|
+
function ensureRateTable(db) {
|
|
627
|
+
db.run(`
|
|
628
|
+
CREATE TABLE IF NOT EXISTS connector_rate_usage (
|
|
629
|
+
agent_id TEXT NOT NULL,
|
|
630
|
+
connector TEXT NOT NULL,
|
|
631
|
+
window_start TEXT NOT NULL,
|
|
632
|
+
call_count INTEGER NOT NULL DEFAULT 0,
|
|
633
|
+
PRIMARY KEY (agent_id, connector, window_start)
|
|
634
|
+
)
|
|
635
|
+
`);
|
|
636
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_rate_usage_window ON connector_rate_usage(connector, window_start)`);
|
|
637
|
+
}
|
|
638
|
+
function countActiveAgents(db) {
|
|
639
|
+
const cutoff = new Date(Date.now() - AGENT_ACTIVE_WINDOW_MS2).toISOString();
|
|
640
|
+
const row = db.query("SELECT COUNT(*) as count FROM agents WHERE last_seen_at > ?").get(cutoff);
|
|
641
|
+
return Math.max(1, row?.count ?? 1);
|
|
642
|
+
}
|
|
643
|
+
function currentWindowStart() {
|
|
644
|
+
const now3 = Date.now();
|
|
645
|
+
const windowMs = WINDOW_SECONDS * 1000;
|
|
646
|
+
return new Date(Math.floor(now3 / windowMs) * windowMs).toISOString();
|
|
647
|
+
}
|
|
648
|
+
function checkRateBudget(agentId, connector, connectorLimit, consume = true, db) {
|
|
649
|
+
const d = db ?? getDatabase();
|
|
650
|
+
ensureRateTable(d);
|
|
651
|
+
const activeAgents = countActiveAgents(d);
|
|
652
|
+
const budget = Math.max(1, Math.floor(connectorLimit / activeAgents));
|
|
653
|
+
const windowStart = currentWindowStart();
|
|
654
|
+
const windowMs = WINDOW_SECONDS * 1000;
|
|
655
|
+
const windowEnd = new Date(Math.floor(Date.now() / windowMs) * windowMs + windowMs);
|
|
656
|
+
const windowResetsIn = windowEnd.getTime() - Date.now();
|
|
657
|
+
const row = d.query("SELECT call_count FROM connector_rate_usage WHERE agent_id = ? AND connector = ? AND window_start = ?").get(agentId, connector, windowStart);
|
|
658
|
+
const used = row?.call_count ?? 0;
|
|
659
|
+
if (used >= budget) {
|
|
660
|
+
return {
|
|
661
|
+
exceeded: true,
|
|
662
|
+
connector,
|
|
663
|
+
agent_id: agentId,
|
|
664
|
+
budget,
|
|
665
|
+
used,
|
|
666
|
+
active_agents: activeAgents,
|
|
667
|
+
window_resets_in_ms: windowResetsIn,
|
|
668
|
+
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.`
|
|
669
|
+
};
|
|
670
|
+
}
|
|
671
|
+
if (consume) {
|
|
672
|
+
d.run(`INSERT INTO connector_rate_usage (agent_id, connector, window_start, call_count)
|
|
673
|
+
VALUES (?, ?, ?, 1)
|
|
674
|
+
ON CONFLICT(agent_id, connector, window_start) DO UPDATE SET call_count = call_count + 1`, [agentId, connector, windowStart]);
|
|
675
|
+
}
|
|
676
|
+
return {
|
|
677
|
+
connector,
|
|
678
|
+
agent_id: agentId,
|
|
679
|
+
limit: connectorLimit,
|
|
680
|
+
active_agents: activeAgents,
|
|
681
|
+
budget,
|
|
682
|
+
used: consume ? used + 1 : used,
|
|
683
|
+
remaining: consume ? budget - used - 1 : budget - used,
|
|
684
|
+
window_start: windowStart,
|
|
685
|
+
window_resets_in_ms: windowResetsIn
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
function getRateBudget(agentId, connector, connectorLimit, db) {
|
|
689
|
+
return checkRateBudget(agentId, connector, connectorLimit, false, db);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
// src/server/serve.ts
|
|
693
|
+
init_strip();
|
|
694
|
+
init_llm();
|
|
695
|
+
init_jobs();
|
|
696
|
+
|
|
697
|
+
// src/db/workflows.ts
|
|
698
|
+
init_database();
|
|
699
|
+
function rowToWorkflow(row) {
|
|
700
|
+
return {
|
|
701
|
+
...row,
|
|
702
|
+
steps: JSON.parse(row.steps || "[]"),
|
|
703
|
+
enabled: row.enabled === 1
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
function createWorkflow(input, db) {
|
|
707
|
+
const d = db ?? getDatabase();
|
|
708
|
+
const id = shortUuid();
|
|
709
|
+
d.run("INSERT INTO connector_workflows (id, name, steps, enabled, created_at) VALUES (?, ?, ?, 1, ?)", [id, input.name, JSON.stringify(input.steps), now()]);
|
|
710
|
+
return getWorkflow(id, d);
|
|
711
|
+
}
|
|
712
|
+
function getWorkflow(id, db) {
|
|
713
|
+
const d = db ?? getDatabase();
|
|
714
|
+
const row = d.query("SELECT * FROM connector_workflows WHERE id = ?").get(id);
|
|
715
|
+
return row ? rowToWorkflow(row) : null;
|
|
716
|
+
}
|
|
717
|
+
function getWorkflowByName(name, db) {
|
|
718
|
+
const d = db ?? getDatabase();
|
|
719
|
+
const row = d.query("SELECT * FROM connector_workflows WHERE name = ?").get(name);
|
|
720
|
+
return row ? rowToWorkflow(row) : null;
|
|
721
|
+
}
|
|
722
|
+
function listWorkflows(db) {
|
|
723
|
+
const d = db ?? getDatabase();
|
|
724
|
+
return d.query("SELECT * FROM connector_workflows ORDER BY name").all().map(rowToWorkflow);
|
|
725
|
+
}
|
|
726
|
+
function deleteWorkflow(id, db) {
|
|
727
|
+
const d = db ?? getDatabase();
|
|
728
|
+
return d.run("DELETE FROM connector_workflows WHERE id = ?", [id]).changes > 0;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// src/server/serve.ts
|
|
732
|
+
init_scheduler();
|
|
733
|
+
|
|
734
|
+
// src/lib/workflow-runner.ts
|
|
735
|
+
init_strip();
|
|
736
|
+
import { spawn as spawn2 } from "child_process";
|
|
737
|
+
async function runStep(step, previousOutput) {
|
|
738
|
+
return new Promise((resolve) => {
|
|
739
|
+
const args = [...step.args ?? []];
|
|
740
|
+
if (previousOutput && previousOutput.trim()) {
|
|
741
|
+
args.push("--input", previousOutput.trim().slice(0, 4096));
|
|
742
|
+
}
|
|
743
|
+
const cmdArgs = ["run", step.connector, step.command, ...args, "--format", "json"];
|
|
744
|
+
const proc = spawn2("connectors", cmdArgs, { shell: false });
|
|
745
|
+
let output = "";
|
|
746
|
+
proc.stdout.on("data", (d) => {
|
|
747
|
+
output += d.toString();
|
|
748
|
+
});
|
|
749
|
+
proc.stderr.on("data", (d) => {
|
|
750
|
+
output += d.toString();
|
|
751
|
+
});
|
|
752
|
+
proc.on("close", (code) => resolve({ exitCode: code ?? 1, output }));
|
|
753
|
+
proc.on("error", () => resolve({ exitCode: 1, output: "Failed to spawn connectors" }));
|
|
754
|
+
setTimeout(() => {
|
|
755
|
+
proc.kill();
|
|
756
|
+
resolve({ exitCode: 124, output: output + `
|
|
757
|
+
[timeout]` });
|
|
758
|
+
}, 60000);
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
async function runWorkflow(workflow) {
|
|
762
|
+
const results = [];
|
|
763
|
+
let previousOutput;
|
|
764
|
+
let success = true;
|
|
765
|
+
for (let i = 0;i < workflow.steps.length; i++) {
|
|
766
|
+
const step = workflow.steps[i];
|
|
767
|
+
const { exitCode, output } = await runStep(step, previousOutput);
|
|
768
|
+
const stripped = await maybeStrip(output);
|
|
769
|
+
results.push({ step: i + 1, connector: step.connector, command: step.command, exit_code: exitCode, output: stripped });
|
|
770
|
+
if (exitCode !== 0) {
|
|
771
|
+
success = false;
|
|
772
|
+
break;
|
|
773
|
+
}
|
|
774
|
+
previousOutput = stripped;
|
|
775
|
+
}
|
|
776
|
+
return {
|
|
777
|
+
workflow_id: workflow.id,
|
|
778
|
+
workflow_name: workflow.name,
|
|
779
|
+
steps: results,
|
|
780
|
+
success,
|
|
781
|
+
final_output: results[results.length - 1]?.output ?? ""
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
|
|
5
785
|
// src/server/serve.ts
|
|
6
|
-
import {
|
|
7
|
-
import { join as join4, dirname as dirname3, extname, basename } from "path";
|
|
786
|
+
import { join as join7, dirname as dirname3, extname, basename } from "path";
|
|
8
787
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
9
|
-
import { homedir as
|
|
788
|
+
import { homedir as homedir6 } from "os";
|
|
10
789
|
|
|
11
790
|
// src/lib/registry.ts
|
|
12
|
-
import { existsSync, readFileSync } from "fs";
|
|
13
|
-
import { join, dirname } from "path";
|
|
791
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
792
|
+
import { join as join3, dirname } from "path";
|
|
14
793
|
import { fileURLToPath } from "url";
|
|
15
794
|
var CONNECTORS = [
|
|
16
795
|
{
|
|
@@ -4878,13 +5657,6 @@ var CONNECTORS = [
|
|
|
4878
5657
|
category: "Business Tools",
|
|
4879
5658
|
tags: ["e-signature", "contracts", "digital", "documents", "legal"]
|
|
4880
5659
|
},
|
|
4881
|
-
{
|
|
4882
|
-
name: "yousign",
|
|
4883
|
-
displayName: "Yousign",
|
|
4884
|
-
description: "eIDAS-compliant electronic signature API for EU workflows",
|
|
4885
|
-
category: "Business Tools",
|
|
4886
|
-
tags: ["e-signature", "eidas", "contracts", "documents", "legal", "eu"]
|
|
4887
|
-
},
|
|
4888
5660
|
{
|
|
4889
5661
|
name: "signl4",
|
|
4890
5662
|
displayName: "SIGNL4",
|
|
@@ -5925,17 +6697,17 @@ function loadConnectorVersions() {
|
|
|
5925
6697
|
versionsLoaded = true;
|
|
5926
6698
|
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
5927
6699
|
const candidates = [
|
|
5928
|
-
|
|
5929
|
-
|
|
6700
|
+
join3(thisDir, "..", "connectors"),
|
|
6701
|
+
join3(thisDir, "..", "..", "connectors")
|
|
5930
6702
|
];
|
|
5931
|
-
const connectorsDir = candidates.find((d) =>
|
|
6703
|
+
const connectorsDir = candidates.find((d) => existsSync2(d));
|
|
5932
6704
|
if (!connectorsDir)
|
|
5933
6705
|
return;
|
|
5934
6706
|
for (const connector of CONNECTORS) {
|
|
5935
6707
|
try {
|
|
5936
|
-
const pkgPath =
|
|
5937
|
-
if (
|
|
5938
|
-
const pkg = JSON.parse(
|
|
6708
|
+
const pkgPath = join3(connectorsDir, `connect-${connector.name}`, "package.json");
|
|
6709
|
+
if (existsSync2(pkgPath)) {
|
|
6710
|
+
const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
|
|
5939
6711
|
connector.version = pkg.version || "0.0.0";
|
|
5940
6712
|
}
|
|
5941
6713
|
} catch {}
|
|
@@ -5943,25 +6715,27 @@ function loadConnectorVersions() {
|
|
|
5943
6715
|
}
|
|
5944
6716
|
|
|
5945
6717
|
// src/lib/installer.ts
|
|
5946
|
-
import { existsSync as
|
|
5947
|
-
import {
|
|
6718
|
+
import { existsSync as existsSync3, cpSync, mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync2, readdirSync, statSync, rmSync } from "fs";
|
|
6719
|
+
import { homedir as homedir3 } from "os";
|
|
6720
|
+
import { join as join4, dirname as dirname2 } from "path";
|
|
5948
6721
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
5949
6722
|
var __dirname2 = dirname2(fileURLToPath2(import.meta.url));
|
|
5950
6723
|
function resolveConnectorsDir() {
|
|
5951
|
-
const fromBin =
|
|
5952
|
-
if (
|
|
6724
|
+
const fromBin = join4(__dirname2, "..", "connectors");
|
|
6725
|
+
if (existsSync3(fromBin))
|
|
5953
6726
|
return fromBin;
|
|
5954
|
-
const fromSrc =
|
|
5955
|
-
if (
|
|
6727
|
+
const fromSrc = join4(__dirname2, "..", "..", "connectors");
|
|
6728
|
+
if (existsSync3(fromSrc))
|
|
5956
6729
|
return fromSrc;
|
|
5957
6730
|
return fromBin;
|
|
5958
6731
|
}
|
|
5959
6732
|
var CONNECTORS_DIR = resolveConnectorsDir();
|
|
5960
6733
|
function getConnectorPath(name) {
|
|
5961
6734
|
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
5962
|
-
return
|
|
6735
|
+
return join4(CONNECTORS_DIR, connectorName);
|
|
5963
6736
|
}
|
|
5964
6737
|
function installConnector(name, options = {}) {
|
|
6738
|
+
const { targetDir = process.cwd(), overwrite = false } = options;
|
|
5965
6739
|
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
5966
6740
|
return {
|
|
5967
6741
|
connector: name,
|
|
@@ -5969,35 +6743,91 @@ function installConnector(name, options = {}) {
|
|
|
5969
6743
|
error: `Invalid connector name '${name}'`
|
|
5970
6744
|
};
|
|
5971
6745
|
}
|
|
6746
|
+
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
5972
6747
|
const sourcePath = getConnectorPath(name);
|
|
5973
|
-
|
|
6748
|
+
const destDir = join4(targetDir, ".connectors");
|
|
6749
|
+
const destPath = join4(destDir, connectorName);
|
|
6750
|
+
if (!existsSync3(sourcePath)) {
|
|
5974
6751
|
return {
|
|
5975
6752
|
connector: name,
|
|
5976
6753
|
success: false,
|
|
5977
6754
|
error: `Connector '${name}' not found`
|
|
5978
6755
|
};
|
|
5979
6756
|
}
|
|
5980
|
-
|
|
5981
|
-
|
|
5982
|
-
|
|
5983
|
-
|
|
5984
|
-
|
|
6757
|
+
if (existsSync3(destPath) && !overwrite) {
|
|
6758
|
+
return {
|
|
6759
|
+
connector: name,
|
|
6760
|
+
success: false,
|
|
6761
|
+
error: `Already installed. Use --overwrite to replace.`,
|
|
6762
|
+
path: destPath
|
|
6763
|
+
};
|
|
6764
|
+
}
|
|
6765
|
+
try {
|
|
6766
|
+
if (!existsSync3(destDir)) {
|
|
6767
|
+
mkdirSync3(destDir, { recursive: true });
|
|
6768
|
+
}
|
|
6769
|
+
cpSync(sourcePath, destPath, { recursive: true });
|
|
6770
|
+
const homeCredDir = join4(homedir3(), ".connectors", connectorName);
|
|
6771
|
+
if (existsSync3(homeCredDir)) {
|
|
6772
|
+
const filesToCopy = ["credentials.json", "current_profile"];
|
|
6773
|
+
for (const file of filesToCopy) {
|
|
6774
|
+
const src = join4(homeCredDir, file);
|
|
6775
|
+
if (existsSync3(src)) {
|
|
6776
|
+
cpSync(src, join4(destPath, file));
|
|
6777
|
+
}
|
|
6778
|
+
}
|
|
6779
|
+
const profilesDir = join4(homeCredDir, "profiles");
|
|
6780
|
+
if (existsSync3(profilesDir)) {
|
|
6781
|
+
cpSync(profilesDir, join4(destPath, "profiles"), { recursive: true });
|
|
6782
|
+
}
|
|
6783
|
+
}
|
|
6784
|
+
updateConnectorsIndex(destDir);
|
|
6785
|
+
return {
|
|
6786
|
+
connector: name,
|
|
6787
|
+
success: true,
|
|
6788
|
+
path: destPath
|
|
6789
|
+
};
|
|
6790
|
+
} catch (error) {
|
|
6791
|
+
return {
|
|
6792
|
+
connector: name,
|
|
6793
|
+
success: false,
|
|
6794
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
6795
|
+
};
|
|
6796
|
+
}
|
|
6797
|
+
}
|
|
6798
|
+
function updateConnectorsIndex(connectorsDir) {
|
|
6799
|
+
const indexPath = join4(connectorsDir, "index.ts");
|
|
6800
|
+
const connectors = readdirSync(connectorsDir).filter((f) => f.startsWith("connect-") && !f.includes("."));
|
|
6801
|
+
const exports = connectors.map((c) => {
|
|
6802
|
+
const name = c.replace("connect-", "");
|
|
6803
|
+
return `export * as ${name} from './${c}/src/index.js';`;
|
|
6804
|
+
}).join(`
|
|
6805
|
+
`);
|
|
6806
|
+
const content = `/**
|
|
6807
|
+
* Auto-generated index of installed connectors
|
|
6808
|
+
* Do not edit manually - run 'connectors install' to update
|
|
6809
|
+
*/
|
|
6810
|
+
|
|
6811
|
+
${exports}
|
|
6812
|
+
`;
|
|
6813
|
+
writeFileSync2(indexPath, content);
|
|
5985
6814
|
}
|
|
5986
|
-
function getInstalledConnectors() {
|
|
5987
|
-
|
|
6815
|
+
function getInstalledConnectors(targetDir = process.cwd()) {
|
|
6816
|
+
const connectorsDir = join4(targetDir, ".connectors");
|
|
6817
|
+
if (!existsSync3(connectorsDir)) {
|
|
5988
6818
|
return [];
|
|
5989
6819
|
}
|
|
5990
|
-
return readdirSync(
|
|
5991
|
-
const fullPath =
|
|
6820
|
+
return readdirSync(connectorsDir).filter((f) => {
|
|
6821
|
+
const fullPath = join4(connectorsDir, f);
|
|
5992
6822
|
return f.startsWith("connect-") && statSync(fullPath).isDirectory();
|
|
5993
6823
|
}).map((f) => f.replace("connect-", ""));
|
|
5994
6824
|
}
|
|
5995
6825
|
function getConnectorDocs(name) {
|
|
5996
6826
|
const connectorPath = getConnectorPath(name);
|
|
5997
|
-
const claudeMdPath =
|
|
5998
|
-
if (!
|
|
6827
|
+
const claudeMdPath = join4(connectorPath, "CLAUDE.md");
|
|
6828
|
+
if (!existsSync3(claudeMdPath))
|
|
5999
6829
|
return null;
|
|
6000
|
-
const raw =
|
|
6830
|
+
const raw = readFileSync3(claudeMdPath, "utf-8");
|
|
6001
6831
|
return {
|
|
6002
6832
|
overview: extractSection(raw, "Project Overview"),
|
|
6003
6833
|
auth: extractSection(raw, "Authentication"),
|
|
@@ -6034,15 +6864,92 @@ function parseEnvVarsTable(section) {
|
|
|
6034
6864
|
}
|
|
6035
6865
|
return vars;
|
|
6036
6866
|
}
|
|
6037
|
-
function removeConnector(name) {
|
|
6038
|
-
|
|
6867
|
+
function removeConnector(name, targetDir = process.cwd()) {
|
|
6868
|
+
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
6869
|
+
const connectorsDir = join4(targetDir, ".connectors");
|
|
6870
|
+
const connectorPath = join4(connectorsDir, connectorName);
|
|
6871
|
+
if (!existsSync3(connectorPath)) {
|
|
6872
|
+
return false;
|
|
6873
|
+
}
|
|
6874
|
+
rmSync(connectorPath, { recursive: true });
|
|
6875
|
+
updateConnectorsIndex(connectorsDir);
|
|
6876
|
+
return true;
|
|
6039
6877
|
}
|
|
6040
6878
|
|
|
6041
6879
|
// src/server/auth.ts
|
|
6042
|
-
import { existsSync as
|
|
6880
|
+
import { existsSync as existsSync5, readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync5, readdirSync as readdirSync2, rmSync as rmSync2, statSync as statSync3 } from "fs";
|
|
6043
6881
|
import { randomBytes } from "crypto";
|
|
6044
|
-
import { homedir } from "os";
|
|
6045
|
-
import { join as
|
|
6882
|
+
import { homedir as homedir5 } from "os";
|
|
6883
|
+
import { join as join6 } from "path";
|
|
6884
|
+
|
|
6885
|
+
// src/lib/lock.ts
|
|
6886
|
+
import { openSync, closeSync, unlinkSync, existsSync as existsSync4, statSync as statSync2 } from "fs";
|
|
6887
|
+
import { join as join5 } from "path";
|
|
6888
|
+
import { homedir as homedir4 } from "os";
|
|
6889
|
+
import { mkdirSync as mkdirSync4 } from "fs";
|
|
6890
|
+
var LOCK_TIMEOUT_MS = 5000;
|
|
6891
|
+
var LOCK_RETRY_MS = 100;
|
|
6892
|
+
var STALE_LOCK_MS = 30000;
|
|
6893
|
+
|
|
6894
|
+
class LockTimeoutError extends Error {
|
|
6895
|
+
connector;
|
|
6896
|
+
constructor(connector) {
|
|
6897
|
+
super(`Could not acquire write lock for connector "${connector}" within ${LOCK_TIMEOUT_MS}ms. Another agent may be writing. Try again shortly.`);
|
|
6898
|
+
this.connector = connector;
|
|
6899
|
+
this.name = "LockTimeoutError";
|
|
6900
|
+
}
|
|
6901
|
+
}
|
|
6902
|
+
function lockPath(connector) {
|
|
6903
|
+
const dir = join5(homedir4(), ".connectors", `connect-${connector}`);
|
|
6904
|
+
mkdirSync4(dir, { recursive: true });
|
|
6905
|
+
return join5(dir, ".write.lock");
|
|
6906
|
+
}
|
|
6907
|
+
function isStale(path) {
|
|
6908
|
+
try {
|
|
6909
|
+
const stat = statSync2(path);
|
|
6910
|
+
return Date.now() - stat.mtimeMs > STALE_LOCK_MS;
|
|
6911
|
+
} catch {
|
|
6912
|
+
return false;
|
|
6913
|
+
}
|
|
6914
|
+
}
|
|
6915
|
+
function tryAcquire(path) {
|
|
6916
|
+
if (existsSync4(path) && isStale(path)) {
|
|
6917
|
+
try {
|
|
6918
|
+
unlinkSync(path);
|
|
6919
|
+
} catch {}
|
|
6920
|
+
}
|
|
6921
|
+
try {
|
|
6922
|
+
const fd = openSync(path, "wx");
|
|
6923
|
+
closeSync(fd);
|
|
6924
|
+
return true;
|
|
6925
|
+
} catch (e) {
|
|
6926
|
+
if (e.code === "EEXIST")
|
|
6927
|
+
return false;
|
|
6928
|
+
throw e;
|
|
6929
|
+
}
|
|
6930
|
+
}
|
|
6931
|
+
function release(path) {
|
|
6932
|
+
try {
|
|
6933
|
+
unlinkSync(path);
|
|
6934
|
+
} catch {}
|
|
6935
|
+
}
|
|
6936
|
+
async function withWriteLock(connector, fn) {
|
|
6937
|
+
const path = lockPath(connector);
|
|
6938
|
+
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
6939
|
+
while (Date.now() < deadline) {
|
|
6940
|
+
if (tryAcquire(path)) {
|
|
6941
|
+
try {
|
|
6942
|
+
return await fn();
|
|
6943
|
+
} finally {
|
|
6944
|
+
release(path);
|
|
6945
|
+
}
|
|
6946
|
+
}
|
|
6947
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
6948
|
+
}
|
|
6949
|
+
throw new LockTimeoutError(connector);
|
|
6950
|
+
}
|
|
6951
|
+
|
|
6952
|
+
// src/server/auth.ts
|
|
6046
6953
|
var FETCH_TIMEOUT = 1e4;
|
|
6047
6954
|
var oauthStateStore = new Map;
|
|
6048
6955
|
var GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
@@ -6098,14 +7005,14 @@ function getAuthType(name) {
|
|
|
6098
7005
|
}
|
|
6099
7006
|
function getConnectorConfigDir(name) {
|
|
6100
7007
|
const connectorName = name.startsWith("connect-") ? name : `connect-${name}`;
|
|
6101
|
-
return
|
|
7008
|
+
return join6(homedir5(), ".connectors", connectorName);
|
|
6102
7009
|
}
|
|
6103
7010
|
function getCurrentProfile(name) {
|
|
6104
7011
|
const configDir = getConnectorConfigDir(name);
|
|
6105
|
-
const currentProfileFile =
|
|
6106
|
-
if (
|
|
7012
|
+
const currentProfileFile = join6(configDir, "current_profile");
|
|
7013
|
+
if (existsSync5(currentProfileFile)) {
|
|
6107
7014
|
try {
|
|
6108
|
-
return
|
|
7015
|
+
return readFileSync4(currentProfileFile, "utf-8").trim() || "default";
|
|
6109
7016
|
} catch {
|
|
6110
7017
|
return "default";
|
|
6111
7018
|
}
|
|
@@ -6117,16 +7024,16 @@ function loadProfileConfig(name) {
|
|
|
6117
7024
|
const profile = getCurrentProfile(name);
|
|
6118
7025
|
let flatConfig = {};
|
|
6119
7026
|
let dirConfig = {};
|
|
6120
|
-
const profileFile =
|
|
6121
|
-
if (
|
|
7027
|
+
const profileFile = join6(configDir, "profiles", `${profile}.json`);
|
|
7028
|
+
if (existsSync5(profileFile)) {
|
|
6122
7029
|
try {
|
|
6123
|
-
flatConfig = JSON.parse(
|
|
7030
|
+
flatConfig = JSON.parse(readFileSync4(profileFile, "utf-8"));
|
|
6124
7031
|
} catch {}
|
|
6125
7032
|
}
|
|
6126
|
-
const profileDirConfig =
|
|
6127
|
-
if (
|
|
7033
|
+
const profileDirConfig = join6(configDir, "profiles", profile, "config.json");
|
|
7034
|
+
if (existsSync5(profileDirConfig)) {
|
|
6128
7035
|
try {
|
|
6129
|
-
dirConfig = JSON.parse(
|
|
7036
|
+
dirConfig = JSON.parse(readFileSync4(profileDirConfig, "utf-8"));
|
|
6130
7037
|
} catch {}
|
|
6131
7038
|
}
|
|
6132
7039
|
if (Object.keys(flatConfig).length === 0 && Object.keys(dirConfig).length === 0) {
|
|
@@ -6137,14 +7044,24 @@ function loadProfileConfig(name) {
|
|
|
6137
7044
|
function loadTokens(name) {
|
|
6138
7045
|
const configDir = getConnectorConfigDir(name);
|
|
6139
7046
|
const profile = getCurrentProfile(name);
|
|
6140
|
-
const tokensFile =
|
|
6141
|
-
if (
|
|
7047
|
+
const tokensFile = join6(configDir, "profiles", profile, "tokens.json");
|
|
7048
|
+
if (existsSync5(tokensFile)) {
|
|
6142
7049
|
try {
|
|
6143
|
-
return JSON.parse(
|
|
7050
|
+
return JSON.parse(readFileSync4(tokensFile, "utf-8"));
|
|
6144
7051
|
} catch {
|
|
6145
7052
|
return null;
|
|
6146
7053
|
}
|
|
6147
7054
|
}
|
|
7055
|
+
const profileConfig = loadProfileConfig(name);
|
|
7056
|
+
if (profileConfig.refreshToken || profileConfig.accessToken) {
|
|
7057
|
+
return {
|
|
7058
|
+
accessToken: profileConfig.accessToken ?? "",
|
|
7059
|
+
refreshToken: profileConfig.refreshToken,
|
|
7060
|
+
expiresAt: profileConfig.expiresAt ?? 0,
|
|
7061
|
+
tokenType: profileConfig.tokenType,
|
|
7062
|
+
scope: profileConfig.scope
|
|
7063
|
+
};
|
|
7064
|
+
}
|
|
6148
7065
|
return null;
|
|
6149
7066
|
}
|
|
6150
7067
|
function getAuthStatus(name) {
|
|
@@ -6185,48 +7102,51 @@ function getAuthStatus(name) {
|
|
|
6185
7102
|
envVarTotalCount
|
|
6186
7103
|
};
|
|
6187
7104
|
}
|
|
6188
|
-
function saveApiKey(name, key, field) {
|
|
7105
|
+
async function saveApiKey(name, key, field) {
|
|
7106
|
+
return withWriteLock(name, () => _saveApiKey(name, key, field));
|
|
7107
|
+
}
|
|
7108
|
+
function _saveApiKey(name, key, field) {
|
|
6189
7109
|
const configDir = getConnectorConfigDir(name);
|
|
6190
7110
|
const profile = getCurrentProfile(name);
|
|
6191
7111
|
const keyField = field || guessKeyField(name);
|
|
6192
7112
|
if (keyField === "clientId" || keyField === "clientSecret") {
|
|
6193
|
-
const credentialsFile =
|
|
6194
|
-
|
|
7113
|
+
const credentialsFile = join6(configDir, "credentials.json");
|
|
7114
|
+
mkdirSync5(configDir, { recursive: true });
|
|
6195
7115
|
let creds = {};
|
|
6196
|
-
if (
|
|
7116
|
+
if (existsSync5(credentialsFile)) {
|
|
6197
7117
|
try {
|
|
6198
|
-
creds = JSON.parse(
|
|
7118
|
+
creds = JSON.parse(readFileSync4(credentialsFile, "utf-8"));
|
|
6199
7119
|
} catch {}
|
|
6200
7120
|
}
|
|
6201
7121
|
creds[keyField] = key;
|
|
6202
|
-
|
|
7122
|
+
writeFileSync3(credentialsFile, JSON.stringify(creds, null, 2));
|
|
6203
7123
|
return;
|
|
6204
7124
|
}
|
|
6205
|
-
const profileFile =
|
|
6206
|
-
const profileDir =
|
|
6207
|
-
if (
|
|
7125
|
+
const profileFile = join6(configDir, "profiles", `${profile}.json`);
|
|
7126
|
+
const profileDir = join6(configDir, "profiles", profile);
|
|
7127
|
+
if (existsSync5(profileFile)) {
|
|
6208
7128
|
let config = {};
|
|
6209
7129
|
try {
|
|
6210
|
-
config = JSON.parse(
|
|
7130
|
+
config = JSON.parse(readFileSync4(profileFile, "utf-8"));
|
|
6211
7131
|
} catch {}
|
|
6212
7132
|
config[keyField] = key;
|
|
6213
|
-
|
|
7133
|
+
writeFileSync3(profileFile, JSON.stringify(config, null, 2));
|
|
6214
7134
|
return;
|
|
6215
7135
|
}
|
|
6216
|
-
if (
|
|
6217
|
-
const configFile =
|
|
7136
|
+
if (existsSync5(profileDir)) {
|
|
7137
|
+
const configFile = join6(profileDir, "config.json");
|
|
6218
7138
|
let config = {};
|
|
6219
|
-
if (
|
|
7139
|
+
if (existsSync5(configFile)) {
|
|
6220
7140
|
try {
|
|
6221
|
-
config = JSON.parse(
|
|
7141
|
+
config = JSON.parse(readFileSync4(configFile, "utf-8"));
|
|
6222
7142
|
} catch {}
|
|
6223
7143
|
}
|
|
6224
7144
|
config[keyField] = key;
|
|
6225
|
-
|
|
7145
|
+
writeFileSync3(configFile, JSON.stringify(config, null, 2));
|
|
6226
7146
|
return;
|
|
6227
7147
|
}
|
|
6228
|
-
|
|
6229
|
-
|
|
7148
|
+
mkdirSync5(profileDir, { recursive: true });
|
|
7149
|
+
writeFileSync3(join6(profileDir, "config.json"), JSON.stringify({ [keyField]: key }, null, 2));
|
|
6230
7150
|
}
|
|
6231
7151
|
function guessKeyField(name) {
|
|
6232
7152
|
const docs = getConnectorDocs(name);
|
|
@@ -6244,10 +7164,10 @@ function guessKeyField(name) {
|
|
|
6244
7164
|
}
|
|
6245
7165
|
function getOAuthConfig(name) {
|
|
6246
7166
|
const configDir = getConnectorConfigDir(name);
|
|
6247
|
-
const credentialsFile =
|
|
6248
|
-
if (
|
|
7167
|
+
const credentialsFile = join6(configDir, "credentials.json");
|
|
7168
|
+
if (existsSync5(credentialsFile)) {
|
|
6249
7169
|
try {
|
|
6250
|
-
const creds = JSON.parse(
|
|
7170
|
+
const creds = JSON.parse(readFileSync4(credentialsFile, "utf-8"));
|
|
6251
7171
|
return { clientId: creds.clientId, clientSecret: creds.clientSecret };
|
|
6252
7172
|
} catch {}
|
|
6253
7173
|
}
|
|
@@ -6326,12 +7246,15 @@ async function exchangeOAuthCode(name, code, redirectUri) {
|
|
|
6326
7246
|
function saveOAuthTokens(name, tokens) {
|
|
6327
7247
|
const configDir = getConnectorConfigDir(name);
|
|
6328
7248
|
const profile = getCurrentProfile(name);
|
|
6329
|
-
const profileDir =
|
|
6330
|
-
|
|
6331
|
-
const tokensFile =
|
|
6332
|
-
|
|
7249
|
+
const profileDir = join6(configDir, "profiles", profile);
|
|
7250
|
+
mkdirSync5(profileDir, { recursive: true });
|
|
7251
|
+
const tokensFile = join6(profileDir, "tokens.json");
|
|
7252
|
+
writeFileSync3(tokensFile, JSON.stringify(tokens, null, 2), { mode: 384 });
|
|
6333
7253
|
}
|
|
6334
7254
|
async function refreshOAuthToken(name) {
|
|
7255
|
+
return withWriteLock(name, () => _refreshOAuthToken(name));
|
|
7256
|
+
}
|
|
7257
|
+
async function _refreshOAuthToken(name) {
|
|
6335
7258
|
const oauthConfig = getOAuthConfig(name);
|
|
6336
7259
|
const currentTokens = loadTokens(name);
|
|
6337
7260
|
if (!oauthConfig.clientId || !oauthConfig.clientSecret) {
|
|
@@ -6368,15 +7291,15 @@ async function refreshOAuthToken(name) {
|
|
|
6368
7291
|
}
|
|
6369
7292
|
function listProfiles(name) {
|
|
6370
7293
|
const configDir = getConnectorConfigDir(name);
|
|
6371
|
-
const profilesDir =
|
|
6372
|
-
if (!
|
|
7294
|
+
const profilesDir = join6(configDir, "profiles");
|
|
7295
|
+
if (!existsSync5(profilesDir))
|
|
6373
7296
|
return ["default"];
|
|
6374
7297
|
const seen = new Set;
|
|
6375
7298
|
try {
|
|
6376
7299
|
const entries = readdirSync2(profilesDir);
|
|
6377
7300
|
for (const entry of entries) {
|
|
6378
|
-
const fullPath =
|
|
6379
|
-
const stat =
|
|
7301
|
+
const fullPath = join6(profilesDir, entry);
|
|
7302
|
+
const stat = statSync3(fullPath);
|
|
6380
7303
|
if (stat.isDirectory()) {
|
|
6381
7304
|
seen.add(entry);
|
|
6382
7305
|
} else if (entry.endsWith(".json")) {
|
|
@@ -6389,25 +7312,25 @@ function listProfiles(name) {
|
|
|
6389
7312
|
}
|
|
6390
7313
|
function switchProfile(name, profile) {
|
|
6391
7314
|
const configDir = getConnectorConfigDir(name);
|
|
6392
|
-
|
|
6393
|
-
|
|
7315
|
+
mkdirSync5(configDir, { recursive: true });
|
|
7316
|
+
writeFileSync3(join6(configDir, "current_profile"), profile);
|
|
6394
7317
|
}
|
|
6395
7318
|
function deleteProfile(name, profile) {
|
|
6396
7319
|
if (profile === "default")
|
|
6397
7320
|
return false;
|
|
6398
7321
|
const configDir = getConnectorConfigDir(name);
|
|
6399
|
-
const profilesDir =
|
|
6400
|
-
const profileFile =
|
|
6401
|
-
if (
|
|
6402
|
-
|
|
7322
|
+
const profilesDir = join6(configDir, "profiles");
|
|
7323
|
+
const profileFile = join6(profilesDir, `${profile}.json`);
|
|
7324
|
+
if (existsSync5(profileFile)) {
|
|
7325
|
+
rmSync2(profileFile);
|
|
6403
7326
|
if (getCurrentProfile(name) === profile) {
|
|
6404
7327
|
switchProfile(name, "default");
|
|
6405
7328
|
}
|
|
6406
7329
|
return true;
|
|
6407
7330
|
}
|
|
6408
|
-
const profileDir =
|
|
6409
|
-
if (
|
|
6410
|
-
|
|
7331
|
+
const profileDir = join6(profilesDir, profile);
|
|
7332
|
+
if (existsSync5(profileDir)) {
|
|
7333
|
+
rmSync2(profileDir, { recursive: true });
|
|
6411
7334
|
if (getCurrentProfile(name) === profile) {
|
|
6412
7335
|
switchProfile(name, "default");
|
|
6413
7336
|
}
|
|
@@ -6429,20 +7352,20 @@ function resolveDashboardDir() {
|
|
|
6429
7352
|
const candidates = [];
|
|
6430
7353
|
try {
|
|
6431
7354
|
const scriptDir = dirname3(fileURLToPath3(import.meta.url));
|
|
6432
|
-
candidates.push(
|
|
6433
|
-
candidates.push(
|
|
7355
|
+
candidates.push(join7(scriptDir, "..", "dashboard", "dist"));
|
|
7356
|
+
candidates.push(join7(scriptDir, "..", "..", "dashboard", "dist"));
|
|
6434
7357
|
} catch {}
|
|
6435
7358
|
if (process.argv[1]) {
|
|
6436
7359
|
const mainDir = dirname3(process.argv[1]);
|
|
6437
|
-
candidates.push(
|
|
6438
|
-
candidates.push(
|
|
7360
|
+
candidates.push(join7(mainDir, "..", "dashboard", "dist"));
|
|
7361
|
+
candidates.push(join7(mainDir, "..", "..", "dashboard", "dist"));
|
|
6439
7362
|
}
|
|
6440
|
-
candidates.push(
|
|
7363
|
+
candidates.push(join7(process.cwd(), "dashboard", "dist"));
|
|
6441
7364
|
for (const candidate of candidates) {
|
|
6442
|
-
if (
|
|
7365
|
+
if (existsSync6(candidate))
|
|
6443
7366
|
return candidate;
|
|
6444
7367
|
}
|
|
6445
|
-
return
|
|
7368
|
+
return join7(process.cwd(), "dashboard", "dist");
|
|
6446
7369
|
}
|
|
6447
7370
|
var MIME_TYPES = {
|
|
6448
7371
|
".html": "text/html; charset=utf-8",
|
|
@@ -6470,6 +7393,18 @@ function json(data, status = 200, port) {
|
|
|
6470
7393
|
}
|
|
6471
7394
|
});
|
|
6472
7395
|
}
|
|
7396
|
+
async function jsonStripped(data, status = 200, port) {
|
|
7397
|
+
const raw = JSON.stringify(data);
|
|
7398
|
+
const body = await maybeStrip(raw);
|
|
7399
|
+
return new Response(body, {
|
|
7400
|
+
status,
|
|
7401
|
+
headers: {
|
|
7402
|
+
"Content-Type": "application/json",
|
|
7403
|
+
"Access-Control-Allow-Origin": port ? `http://localhost:${port}` : "*",
|
|
7404
|
+
...SECURITY_HEADERS
|
|
7405
|
+
}
|
|
7406
|
+
});
|
|
7407
|
+
}
|
|
6473
7408
|
function htmlResponse(content, status = 200) {
|
|
6474
7409
|
return new Response(content, {
|
|
6475
7410
|
status,
|
|
@@ -6532,7 +7467,7 @@ function oauthPage(type, title, message, hint, extra) {
|
|
|
6532
7467
|
</body></html>`;
|
|
6533
7468
|
}
|
|
6534
7469
|
function serveStaticFile(filePath) {
|
|
6535
|
-
if (!
|
|
7470
|
+
if (!existsSync6(filePath))
|
|
6536
7471
|
return null;
|
|
6537
7472
|
const ext = extname(filePath);
|
|
6538
7473
|
const contentType = MIME_TYPES[ext] || "application/octet-stream";
|
|
@@ -6556,7 +7491,7 @@ async function startServer(requestedPort, options) {
|
|
|
6556
7491
|
const shouldOpen = options?.open ?? true;
|
|
6557
7492
|
loadConnectorVersions();
|
|
6558
7493
|
const dashboardDir = resolveDashboardDir();
|
|
6559
|
-
const dashboardExists =
|
|
7494
|
+
const dashboardExists = existsSync6(dashboardDir);
|
|
6560
7495
|
if (!dashboardExists) {
|
|
6561
7496
|
console.error(`
|
|
6562
7497
|
Dashboard not found at: ${dashboardDir}`);
|
|
@@ -6585,10 +7520,10 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6585
7520
|
const fields = fieldsParam ? new Set(fieldsParam.split(",").map((f) => f.trim())) : null;
|
|
6586
7521
|
const data = getAllConnectorsWithAuth();
|
|
6587
7522
|
if (compact) {
|
|
6588
|
-
return
|
|
7523
|
+
return jsonStripped(data.map((c) => ({ name: c.name, category: c.category, installed: c.installed })), 200, port);
|
|
6589
7524
|
}
|
|
6590
7525
|
if (fields) {
|
|
6591
|
-
return
|
|
7526
|
+
return jsonStripped(data.map((c) => {
|
|
6592
7527
|
const out = {};
|
|
6593
7528
|
for (const f of fields) {
|
|
6594
7529
|
if (f in c)
|
|
@@ -6597,7 +7532,7 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6597
7532
|
return out;
|
|
6598
7533
|
}), 200, port);
|
|
6599
7534
|
}
|
|
6600
|
-
return
|
|
7535
|
+
return jsonStripped(data, 200, port);
|
|
6601
7536
|
}
|
|
6602
7537
|
const singleMatch = path.match(/^\/api\/connectors\/([^/]+)$/);
|
|
6603
7538
|
if (singleMatch && method === "GET") {
|
|
@@ -6631,7 +7566,7 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6631
7566
|
const body = await req.json();
|
|
6632
7567
|
if (!body.key)
|
|
6633
7568
|
return json({ error: "Missing 'key' in request body" }, 400, port);
|
|
6634
|
-
saveApiKey(name, body.key, body.field);
|
|
7569
|
+
await saveApiKey(name, body.key, body.field);
|
|
6635
7570
|
logActivity("key_saved", name, body.field ? `Field: ${body.field}` : undefined);
|
|
6636
7571
|
return json({ success: true }, 200, port);
|
|
6637
7572
|
} catch (e) {
|
|
@@ -6676,7 +7611,10 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6676
7611
|
if (!isValidConnectorName(name))
|
|
6677
7612
|
return json({ error: "Invalid connector name" }, 400, port);
|
|
6678
7613
|
try {
|
|
6679
|
-
removeConnector(name);
|
|
7614
|
+
const removed = removeConnector(name);
|
|
7615
|
+
if (!removed) {
|
|
7616
|
+
return json({ error: `Connector '${name}' is not installed` }, 404, port);
|
|
7617
|
+
}
|
|
6680
7618
|
logActivity("uninstalled", name);
|
|
6681
7619
|
return json({ success: true, name }, 200, port);
|
|
6682
7620
|
} catch (e) {
|
|
@@ -6702,6 +7640,167 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6702
7640
|
if (path === "/api/activity" && method === "GET") {
|
|
6703
7641
|
return json(activityLog, 200, port);
|
|
6704
7642
|
}
|
|
7643
|
+
if (path === "/api/hot" && method === "GET") {
|
|
7644
|
+
const { getTopConnectors: getTopConnectors2 } = await Promise.resolve().then(() => (init_usage(), exports_usage));
|
|
7645
|
+
const { getPromotedConnectors: getPromotedConnectors2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
7646
|
+
const limit = parseInt(url2.searchParams.get("limit") || "10", 10);
|
|
7647
|
+
const days = parseInt(url2.searchParams.get("days") || "7", 10);
|
|
7648
|
+
const db = getDatabase2();
|
|
7649
|
+
const top = getTopConnectors2(limit, days, db);
|
|
7650
|
+
const promoted = new Set(getPromotedConnectors2(db));
|
|
7651
|
+
return json(top.map((t) => ({ ...t, promoted: promoted.has(t.connector) })), 200, port);
|
|
7652
|
+
}
|
|
7653
|
+
const promoteMatch = path.match(/^\/api\/connectors\/([^/]+)\/promote$/);
|
|
7654
|
+
if (promoteMatch && method === "POST") {
|
|
7655
|
+
const name = promoteMatch[1];
|
|
7656
|
+
if (!getConnector(name))
|
|
7657
|
+
return json({ error: "Connector not found" }, 404, port);
|
|
7658
|
+
const { promoteConnector: promoteConnector2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
7659
|
+
promoteConnector2(name, getDatabase2());
|
|
7660
|
+
return json({ success: true, connector: name }, 200, port);
|
|
7661
|
+
}
|
|
7662
|
+
if (promoteMatch && method === "DELETE") {
|
|
7663
|
+
const { demoteConnector: demoteConnector2 } = await Promise.resolve().then(() => (init_promotions(), exports_promotions));
|
|
7664
|
+
const removed = demoteConnector2(promoteMatch[1], getDatabase2());
|
|
7665
|
+
return json({ success: removed, connector: promoteMatch[1] }, 200, port);
|
|
7666
|
+
}
|
|
7667
|
+
if (path === "/api/llm" && method === "GET") {
|
|
7668
|
+
const config = getLlmConfig();
|
|
7669
|
+
if (!config)
|
|
7670
|
+
return json({ configured: false }, 200, port);
|
|
7671
|
+
return json({ configured: true, provider: config.provider, model: config.model, key: maskKey(config.api_key), strip: config.strip }, 200, port);
|
|
7672
|
+
}
|
|
7673
|
+
if (path === "/api/llm" && method === "POST") {
|
|
7674
|
+
const body = await req.json().catch(() => ({}));
|
|
7675
|
+
const validProviders = ["cerebras", "groq", "openai", "anthropic"];
|
|
7676
|
+
const provider = body.provider;
|
|
7677
|
+
if (!provider || !validProviders.includes(provider))
|
|
7678
|
+
return json({ error: "provider must be one of: " + validProviders.join(", ") }, 400, port);
|
|
7679
|
+
const api_key = body.api_key;
|
|
7680
|
+
if (!api_key)
|
|
7681
|
+
return json({ error: "api_key is required" }, 400, port);
|
|
7682
|
+
const model = body.model || getLlmConfig()?.model || "qwen-3-32b";
|
|
7683
|
+
const strip = typeof body.strip === "boolean" ? body.strip : getLlmConfig()?.strip ?? false;
|
|
7684
|
+
saveLlmConfig({ provider, model, api_key, strip });
|
|
7685
|
+
return json({ success: true, provider, model, strip }, 200, port);
|
|
7686
|
+
}
|
|
7687
|
+
if (path === "/api/llm/test" && method === "POST") {
|
|
7688
|
+
const config = getLlmConfig();
|
|
7689
|
+
if (!config)
|
|
7690
|
+
return json({ error: "No LLM configured" }, 400, port);
|
|
7691
|
+
try {
|
|
7692
|
+
const client = new LLMClient(config);
|
|
7693
|
+
const result = await client.complete('Respond with exactly: {"status":"ok"}', "ping");
|
|
7694
|
+
return json({ success: true, provider: result.provider, model: result.model, latency_ms: result.latency_ms, response: result.content }, 200, port);
|
|
7695
|
+
} catch (e) {
|
|
7696
|
+
return json({ success: false, error: e instanceof Error ? e.message : String(e) }, 500, port);
|
|
7697
|
+
}
|
|
7698
|
+
}
|
|
7699
|
+
if (path === "/api/jobs" && method === "GET") {
|
|
7700
|
+
return json(listJobs(getDatabase2()), 200, port);
|
|
7701
|
+
}
|
|
7702
|
+
if (path === "/api/jobs" && method === "POST") {
|
|
7703
|
+
const body = await req.json().catch(() => ({}));
|
|
7704
|
+
if (!body.name || !body.connector || !body.command || !body.cron)
|
|
7705
|
+
return json({ error: "name, connector, command, cron required" }, 400, port);
|
|
7706
|
+
const job = createJob({ name: body.name, connector: body.connector, command: body.command, args: body.args ?? [], cron: body.cron, strip: !!body.strip }, getDatabase2());
|
|
7707
|
+
return json(job, 201, port);
|
|
7708
|
+
}
|
|
7709
|
+
const jobMatch = path.match(/^\/api\/jobs\/([^/]+)$/);
|
|
7710
|
+
if (jobMatch) {
|
|
7711
|
+
const db = getDatabase2();
|
|
7712
|
+
const job = getJobByName(jobMatch[1]) ?? getDatabase2().query("SELECT * FROM connector_jobs WHERE id = ?").get(jobMatch[1]);
|
|
7713
|
+
if (!job && method !== "DELETE")
|
|
7714
|
+
return json({ error: "Job not found" }, 404, port);
|
|
7715
|
+
if (method === "GET")
|
|
7716
|
+
return json(listJobRuns(job.id, 20, db), 200, port);
|
|
7717
|
+
if (method === "DELETE") {
|
|
7718
|
+
const j = getJobByName(jobMatch[1], db);
|
|
7719
|
+
if (!j)
|
|
7720
|
+
return json({ error: "Job not found" }, 404, port);
|
|
7721
|
+
deleteJob(j.id, db);
|
|
7722
|
+
return json({ success: true }, 200, port);
|
|
7723
|
+
}
|
|
7724
|
+
if (method === "PATCH") {
|
|
7725
|
+
const body = await req.json().catch(() => ({}));
|
|
7726
|
+
const j = getJobByName(jobMatch[1], db);
|
|
7727
|
+
const updated = updateJob(j.id, { enabled: typeof body.enabled === "boolean" ? body.enabled : undefined, strip: typeof body.strip === "boolean" ? body.strip : undefined }, db);
|
|
7728
|
+
return json(updated, 200, port);
|
|
7729
|
+
}
|
|
7730
|
+
}
|
|
7731
|
+
const jobRunMatch = path.match(/^\/api\/jobs\/([^/]+)\/run$/);
|
|
7732
|
+
if (jobRunMatch && method === "POST") {
|
|
7733
|
+
const db = getDatabase2();
|
|
7734
|
+
const job = getJobByName(jobRunMatch[1], db);
|
|
7735
|
+
if (!job)
|
|
7736
|
+
return json({ error: "Job not found" }, 404, port);
|
|
7737
|
+
const result = await triggerJob(job, db);
|
|
7738
|
+
return json(result, 200, port);
|
|
7739
|
+
}
|
|
7740
|
+
if (path === "/api/workflows" && method === "GET") {
|
|
7741
|
+
return json(listWorkflows(getDatabase2()), 200, port);
|
|
7742
|
+
}
|
|
7743
|
+
if (path === "/api/workflows" && method === "POST") {
|
|
7744
|
+
const body = await req.json().catch(() => ({}));
|
|
7745
|
+
if (!body.name || !body.steps)
|
|
7746
|
+
return json({ error: "name and steps required" }, 400, port);
|
|
7747
|
+
const wf = createWorkflow({ name: body.name, steps: body.steps }, getDatabase2());
|
|
7748
|
+
return json(wf, 201, port);
|
|
7749
|
+
}
|
|
7750
|
+
const wfMatch = path.match(/^\/api\/workflows\/([^/]+)$/);
|
|
7751
|
+
if (wfMatch) {
|
|
7752
|
+
const db = getDatabase2();
|
|
7753
|
+
const wf = getWorkflowByName(wfMatch[1], db);
|
|
7754
|
+
if (!wf)
|
|
7755
|
+
return json({ error: "Workflow not found" }, 404, port);
|
|
7756
|
+
if (method === "GET")
|
|
7757
|
+
return json(wf, 200, port);
|
|
7758
|
+
if (method === "DELETE") {
|
|
7759
|
+
deleteWorkflow(wf.id, db);
|
|
7760
|
+
return json({ success: true }, 200, port);
|
|
7761
|
+
}
|
|
7762
|
+
}
|
|
7763
|
+
const wfRunMatch = path.match(/^\/api\/workflows\/([^/]+)\/run$/);
|
|
7764
|
+
if (wfRunMatch && method === "POST") {
|
|
7765
|
+
const wf = getWorkflowByName(wfRunMatch[1], getDatabase2());
|
|
7766
|
+
if (!wf)
|
|
7767
|
+
return json({ error: "Workflow not found" }, 404, port);
|
|
7768
|
+
const result = await runWorkflow(wf);
|
|
7769
|
+
return json(result, 200, port);
|
|
7770
|
+
}
|
|
7771
|
+
if (path === "/api/agents" && method === "GET") {
|
|
7772
|
+
return json(listAgents(), 200, port);
|
|
7773
|
+
}
|
|
7774
|
+
if (path === "/api/agents/register" && method === "POST") {
|
|
7775
|
+
const body = await req.json().catch(() => ({}));
|
|
7776
|
+
const name = typeof body.name === "string" ? body.name : null;
|
|
7777
|
+
if (!name)
|
|
7778
|
+
return json({ error: "name is required" }, 400, port);
|
|
7779
|
+
const result = registerAgent({
|
|
7780
|
+
name,
|
|
7781
|
+
session_id: typeof body.session_id === "string" ? body.session_id : undefined,
|
|
7782
|
+
role: typeof body.role === "string" ? body.role : undefined
|
|
7783
|
+
});
|
|
7784
|
+
if (isAgentConflict(result))
|
|
7785
|
+
return json(result, 409, port);
|
|
7786
|
+
return json(result, 200, port);
|
|
7787
|
+
}
|
|
7788
|
+
if (path.startsWith("/api/agents/") && method === "DELETE") {
|
|
7789
|
+
const agentName = path.slice("/api/agents/".length);
|
|
7790
|
+
const agent = getAgentByName(agentName);
|
|
7791
|
+
if (!agent)
|
|
7792
|
+
return json({ error: "Agent not found" }, 404, port);
|
|
7793
|
+
deleteAgent(agent.id);
|
|
7794
|
+
return json({ success: true }, 200, port);
|
|
7795
|
+
}
|
|
7796
|
+
const rateMatch = path.match(/^\/api\/rate\/([^/]+)\/([^/]+)$/);
|
|
7797
|
+
if (rateMatch && method === "GET") {
|
|
7798
|
+
const [, agentId, connector] = rateMatch;
|
|
7799
|
+
const limit = parseInt(url2.searchParams.get("limit") || "60", 10);
|
|
7800
|
+
const consume = url2.searchParams.get("consume") === "true";
|
|
7801
|
+
const result = consume ? checkRateBudget(agentId, connector, limit) : getRateBudget(agentId, connector, limit);
|
|
7802
|
+
return json(result, 200, port);
|
|
7803
|
+
}
|
|
6705
7804
|
const profilesMatch = path.match(/^\/api\/connectors\/([^/]+)\/profiles$/);
|
|
6706
7805
|
if (profilesMatch && method === "GET") {
|
|
6707
7806
|
const name = profilesMatch[1];
|
|
@@ -6709,12 +7808,12 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6709
7808
|
return json({ error: "Invalid connector name" }, 400, port);
|
|
6710
7809
|
try {
|
|
6711
7810
|
const profiles = listProfiles(name);
|
|
6712
|
-
const configDir =
|
|
6713
|
-
const currentProfileFile =
|
|
7811
|
+
const configDir = join7(homedir6(), ".connectors", name.startsWith("connect-") ? name : `connect-${name}`);
|
|
7812
|
+
const currentProfileFile = join7(configDir, "current_profile");
|
|
6714
7813
|
let current = "default";
|
|
6715
|
-
if (
|
|
7814
|
+
if (existsSync6(currentProfileFile)) {
|
|
6716
7815
|
try {
|
|
6717
|
-
current =
|
|
7816
|
+
current = readFileSync5(currentProfileFile, "utf-8").trim() || "default";
|
|
6718
7817
|
} catch {}
|
|
6719
7818
|
}
|
|
6720
7819
|
return json({ current, profiles }, 200, port);
|
|
@@ -6761,16 +7860,16 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6761
7860
|
}
|
|
6762
7861
|
if (path === "/api/export" && method === "GET") {
|
|
6763
7862
|
try {
|
|
6764
|
-
const connectDir =
|
|
7863
|
+
const connectDir = join7(homedir6(), ".connectors");
|
|
6765
7864
|
const result = {};
|
|
6766
|
-
if (
|
|
7865
|
+
if (existsSync6(connectDir)) {
|
|
6767
7866
|
const entries = readdirSync3(connectDir, { withFileTypes: true });
|
|
6768
7867
|
for (const entry of entries) {
|
|
6769
7868
|
if (!entry.isDirectory() || !entry.name.startsWith("connect-"))
|
|
6770
7869
|
continue;
|
|
6771
7870
|
const connectorName = entry.name.replace(/^connect-/, "");
|
|
6772
|
-
const profilesDir =
|
|
6773
|
-
if (!
|
|
7871
|
+
const profilesDir = join7(connectDir, entry.name, "profiles");
|
|
7872
|
+
if (!existsSync6(profilesDir))
|
|
6774
7873
|
continue;
|
|
6775
7874
|
const profiles = {};
|
|
6776
7875
|
const profileEntries = readdirSync3(profilesDir, { withFileTypes: true });
|
|
@@ -6778,15 +7877,15 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6778
7877
|
if (pEntry.isFile() && pEntry.name.endsWith(".json")) {
|
|
6779
7878
|
const profileName = basename(pEntry.name, ".json");
|
|
6780
7879
|
try {
|
|
6781
|
-
const config = JSON.parse(
|
|
7880
|
+
const config = JSON.parse(readFileSync5(join7(profilesDir, pEntry.name), "utf-8"));
|
|
6782
7881
|
profiles[profileName] = config;
|
|
6783
7882
|
} catch {}
|
|
6784
7883
|
}
|
|
6785
7884
|
if (pEntry.isDirectory()) {
|
|
6786
|
-
const configPath =
|
|
6787
|
-
if (
|
|
7885
|
+
const configPath = join7(profilesDir, pEntry.name, "config.json");
|
|
7886
|
+
if (existsSync6(configPath)) {
|
|
6788
7887
|
try {
|
|
6789
|
-
const config = JSON.parse(
|
|
7888
|
+
const config = JSON.parse(readFileSync5(configPath, "utf-8"));
|
|
6790
7889
|
profiles[pEntry.name] = config;
|
|
6791
7890
|
} catch {}
|
|
6792
7891
|
}
|
|
@@ -6821,20 +7920,20 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6821
7920
|
return json({ error: "Invalid import format: missing 'connectors' object" }, 400, port);
|
|
6822
7921
|
}
|
|
6823
7922
|
let imported = 0;
|
|
6824
|
-
const connectDir =
|
|
7923
|
+
const connectDir = join7(homedir6(), ".connectors");
|
|
6825
7924
|
for (const [connectorName, data] of Object.entries(body.connectors)) {
|
|
6826
7925
|
if (!isValidConnectorName(connectorName))
|
|
6827
7926
|
continue;
|
|
6828
7927
|
if (!data.profiles || typeof data.profiles !== "object")
|
|
6829
7928
|
continue;
|
|
6830
|
-
const connectorDir =
|
|
6831
|
-
const profilesDir =
|
|
7929
|
+
const connectorDir = join7(connectDir, `connect-${connectorName}`);
|
|
7930
|
+
const profilesDir = join7(connectorDir, "profiles");
|
|
6832
7931
|
for (const [profileName, config] of Object.entries(data.profiles)) {
|
|
6833
7932
|
if (!config || typeof config !== "object")
|
|
6834
7933
|
continue;
|
|
6835
|
-
|
|
6836
|
-
const profileFile =
|
|
6837
|
-
|
|
7934
|
+
mkdirSync6(profilesDir, { recursive: true });
|
|
7935
|
+
const profileFile = join7(profilesDir, `${profileName}.json`);
|
|
7936
|
+
writeFileSync4(profileFile, JSON.stringify(config, null, 2));
|
|
6838
7937
|
imported++;
|
|
6839
7938
|
}
|
|
6840
7939
|
}
|
|
@@ -6889,12 +7988,12 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6889
7988
|
}
|
|
6890
7989
|
if (dashboardExists && (method === "GET" || method === "HEAD")) {
|
|
6891
7990
|
if (path !== "/") {
|
|
6892
|
-
const filePath =
|
|
7991
|
+
const filePath = join7(dashboardDir, path);
|
|
6893
7992
|
const res2 = serveStaticFile(filePath);
|
|
6894
7993
|
if (res2)
|
|
6895
7994
|
return res2;
|
|
6896
7995
|
}
|
|
6897
|
-
const indexPath =
|
|
7996
|
+
const indexPath = join7(dashboardDir, "index.html");
|
|
6898
7997
|
const res = serveStaticFile(indexPath);
|
|
6899
7998
|
if (res)
|
|
6900
7999
|
return res;
|
|
@@ -6908,6 +8007,9 @@ Dashboard not found at: ${dashboardDir}`);
|
|
|
6908
8007
|
};
|
|
6909
8008
|
process.on("SIGINT", shutdown);
|
|
6910
8009
|
process.on("SIGTERM", shutdown);
|
|
8010
|
+
const { startScheduler: startScheduler2 } = await Promise.resolve().then(() => (init_scheduler(), exports_scheduler));
|
|
8011
|
+
const { getDatabase: getDatabase2 } = await Promise.resolve().then(() => (init_database(), exports_database));
|
|
8012
|
+
startScheduler2(getDatabase2());
|
|
6911
8013
|
const url = `http://localhost:${port}`;
|
|
6912
8014
|
console.log(`Connectors Dashboard running at ${url}`);
|
|
6913
8015
|
if (shouldOpen) {
|