runline 0.33.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/oauth2.d.ts +7 -1
- package/dist/auth/oauth2.js +10 -0
- package/dist/auth/token.d.ts +1 -0
- package/dist/auth/token.js +19 -1
- package/dist/auth/types.d.ts +22 -1
- package/dist/core/engine.d.ts +7 -0
- package/dist/core/engine.js +21 -8
- package/dist/credentials/policy.d.ts +53 -1
- package/dist/credentials/policy.js +146 -6
- package/dist/credentials/registry.d.ts +9 -0
- package/dist/credentials/registry.js +184 -22
- package/dist/credentials/transport.d.ts +48 -2
- package/dist/credentials/transport.js +248 -70
- package/dist/credentials/types.d.ts +177 -10
- package/dist/index.d.ts +6 -5
- package/dist/index.js +3 -2
- package/dist/plugin/api.d.ts +7 -0
- package/dist/plugin/api.js +7 -0
- package/dist/plugin/schema.d.ts +16 -4
- package/dist/plugin/schema.js +28 -5
- package/dist/plugin/types.d.ts +20 -0
- package/dist/plugins/_shared/base64.js +30 -0
- package/dist/plugins/_shared/credentialAdapter.js +99 -15
- package/dist/plugins/_shared/credentials.js +416 -0
- package/dist/plugins/_shared/googleAuth.js +69 -39
- package/dist/plugins/_shared/googleCredentials.js +68 -14
- package/dist/plugins/_shared/localFile.js +40 -0
- package/dist/plugins/_shared/mediaFile.js +12 -12
- package/dist/plugins/_shared/microsoftAuth.js +31 -47
- package/dist/plugins/_shared/microsoftCredentials.js +42 -15
- package/dist/plugins/_shared/provider.js +2 -14
- package/dist/plugins/_shared/shiftCloud.js +16 -56
- package/dist/plugins/_shared/shiftCredentials.js +83 -0
- package/dist/plugins/_shared/shiftUpload.js +14 -10
- package/dist/plugins/actionNetwork/src/credentials.js +14 -0
- package/dist/plugins/actionNetwork/src/index.js +39 -50
- package/dist/plugins/activeCampaign/src/credentials.js +22 -0
- package/dist/plugins/activeCampaign/src/index.js +61 -132
- package/dist/plugins/adalo/src/credentials.js +16 -0
- package/dist/plugins/adalo/src/index.js +19 -43
- package/dist/plugins/affinity/src/credentials.js +19 -0
- package/dist/plugins/affinity/src/index.js +29 -54
- package/dist/plugins/agentMail/src/credentials.js +35 -0
- package/dist/plugins/agentMail/src/drafts.js +137 -0
- package/dist/plugins/agentMail/src/inboxes.js +95 -0
- package/dist/plugins/agentMail/src/index.js +35 -0
- package/dist/plugins/agentMail/src/messages.js +154 -0
- package/dist/plugins/agentMail/src/schemas.js +156 -0
- package/dist/plugins/agentMail/src/shared.js +203 -0
- package/dist/plugins/agentMail/src/threads.js +75 -0
- package/dist/plugins/agileCrm/src/credentials.js +16 -0
- package/dist/plugins/agileCrm/src/index.js +46 -112
- package/dist/plugins/airtable/src/credentials.js +19 -0
- package/dist/plugins/airtable/src/index.js +37 -50
- package/dist/plugins/airtop/src/credentials.js +20 -0
- package/dist/plugins/airtop/src/index.js +51 -75
- package/dist/plugins/apiTemplateIo/src/credentials.js +19 -0
- package/dist/plugins/apiTemplateIo/src/index.js +14 -31
- package/dist/plugins/asana/src/credentials.js +19 -0
- package/dist/plugins/asana/src/index.js +51 -72
- package/dist/plugins/autopilot/src/credentials.js +19 -0
- package/dist/plugins/autopilot/src/index.js +38 -45
- package/dist/plugins/bambooHr/src/credentials.js +16 -0
- package/dist/plugins/bambooHr/src/index.js +41 -67
- package/dist/plugins/bannerbear/src/credentials.js +19 -0
- package/dist/plugins/bannerbear/src/index.js +15 -27
- package/dist/plugins/baserow/src/credentials.js +17 -0
- package/dist/plugins/baserow/src/index.js +23 -49
- package/dist/plugins/beeminder/src/credentials.js +19 -0
- package/dist/plugins/beeminder/src/index.js +32 -54
- package/dist/plugins/bitly/src/credentials.js +19 -0
- package/dist/plugins/bitly/src/index.js +12 -26
- package/dist/plugins/bitwarden/src/credentials.js +62 -0
- package/dist/plugins/bitwarden/src/index.js +34 -80
- package/dist/plugins/box/src/credentials.js +19 -0
- package/dist/plugins/box/src/index.js +24 -49
- package/dist/plugins/brandfetch/src/credentials.js +13 -0
- package/dist/plugins/brandfetch/src/index.js +12 -17
- package/dist/plugins/brevo/src/credentials.js +19 -0
- package/dist/plugins/brevo/src/index.js +30 -51
- package/dist/plugins/bubble/src/credentials.js +28 -0
- package/dist/plugins/bubble/src/index.js +29 -65
- package/dist/plugins/chargebee/src/credentials.js +16 -0
- package/dist/plugins/chargebee/src/index.js +15 -45
- package/dist/plugins/circleci/src/credentials.js +19 -0
- package/dist/plugins/circleci/src/index.js +19 -39
- package/dist/plugins/ciscoWebex/src/credentials.js +19 -0
- package/dist/plugins/ciscoWebex/src/index.js +43 -61
- package/dist/plugins/clearbit/src/credentials.js +22 -0
- package/dist/plugins/clearbit/src/index.js +11 -21
- package/dist/plugins/clickup/src/credentials.js +19 -0
- package/dist/plugins/clickup/src/index.js +85 -117
- package/dist/plugins/clockify/src/credentials.js +19 -0
- package/dist/plugins/clockify/src/index.js +46 -61
- package/dist/plugins/cloudflare/src/credentials.js +19 -0
- package/dist/plugins/cloudflare/src/index.js +19 -34
- package/dist/plugins/cockpit/src/credentials.js +17 -0
- package/dist/plugins/cockpit/src/index.js +18 -31
- package/dist/plugins/coda/src/credentials.js +19 -0
- package/dist/plugins/coda/src/index.js +33 -50
- package/dist/plugins/coingecko/src/credentials.js +20 -0
- package/dist/plugins/coingecko/src/index.js +24 -34
- package/dist/plugins/contentful/src/credentials.js +26 -0
- package/dist/plugins/contentful/src/index.js +19 -40
- package/dist/plugins/convertkit/src/credentials.js +26 -0
- package/dist/plugins/convertkit/src/index.js +27 -45
- package/dist/plugins/copper/src/credentials.js +17 -0
- package/dist/plugins/copper/src/index.js +25 -47
- package/dist/plugins/cortex/src/credentials.js +28 -0
- package/dist/plugins/cortex/src/index.js +26 -49
- package/dist/plugins/currents/src/credentials.js +19 -0
- package/dist/plugins/currents/src/index.js +46 -59
- package/dist/plugins/customerIo/src/credentials.js +52 -0
- package/dist/plugins/customerIo/src/index.js +30 -58
- package/dist/plugins/databricks/src/credentials.js +13 -0
- package/dist/plugins/databricks/src/index.js +51 -103
- package/dist/plugins/deepl/src/credentials.js +19 -0
- package/dist/plugins/deepl/src/index.js +13 -39
- package/dist/plugins/demio/src/credentials.js +26 -0
- package/dist/plugins/demio/src/index.js +17 -41
- package/dist/plugins/dhl/src/credentials.js +13 -0
- package/dist/plugins/dhl/src/index.js +8 -19
- package/dist/plugins/discord/src/credentials.js +19 -0
- package/dist/plugins/discord/src/index.js +30 -58
- package/dist/plugins/discourse/src/credentials.js +18 -0
- package/dist/plugins/discourse/src/index.js +36 -53
- package/dist/plugins/disqus/src/credentials.js +13 -0
- package/dist/plugins/disqus/src/index.js +14 -32
- package/dist/plugins/drift/src/credentials.js +13 -0
- package/dist/plugins/drift/src/index.js +16 -26
- package/dist/plugins/dropbox/src/credentials.js +13 -0
- package/dist/plugins/dropbox/src/index.js +23 -30
- package/dist/plugins/dropcontact/src/credentials.js +13 -0
- package/dist/plugins/dropcontact/src/index.js +13 -18
- package/dist/plugins/egoi/src/credentials.js +19 -0
- package/dist/plugins/egoi/src/index.js +23 -38
- package/dist/plugins/elasticsearch/src/credentials.js +18 -0
- package/dist/plugins/elasticsearch/src/index.js +27 -48
- package/dist/plugins/elevenlabs/src/credentials.js +30 -0
- package/dist/plugins/elevenlabs/src/index.js +4 -1
- package/dist/plugins/elevenlabs/src/schemas.js +2 -1
- package/dist/plugins/elevenlabs/src/shared.js +87 -62
- package/dist/plugins/elevenlabs/src/workflows.js +2 -2
- package/dist/plugins/emelia/src/credentials.js +14 -0
- package/dist/plugins/emelia/src/index.js +19 -23
- package/dist/plugins/erpnext/src/credentials.js +27 -0
- package/dist/plugins/erpnext/src/index.js +21 -42
- package/dist/plugins/facebookGraph/src/credentials.js +20 -0
- package/dist/plugins/facebookGraph/src/index.js +39 -37
- package/dist/plugins/fal/src/credentials.js +14 -0
- package/dist/plugins/fal/src/index.js +5 -3
- package/dist/plugins/fal/src/shared.js +58 -63
- package/dist/plugins/freshdesk/src/credentials.js +20 -0
- package/dist/plugins/freshdesk/src/index.js +25 -46
- package/dist/plugins/freshservice/src/credentials.js +16 -0
- package/dist/plugins/freshservice/src/index.js +37 -58
- package/dist/plugins/freshworksCrm/src/credentials.js +16 -0
- package/dist/plugins/freshworksCrm/src/index.js +20 -39
- package/dist/plugins/getresponse/src/credentials.js +22 -0
- package/dist/plugins/getresponse/src/index.js +20 -32
- package/dist/plugins/gett/src/credentials.js +64 -0
- package/dist/plugins/gett/src/index.js +11 -6
- package/dist/plugins/gett/src/login.js +24 -0
- package/dist/plugins/gett/src/session.js +15 -38
- package/dist/plugins/gett/src/shared.js +41 -84
- package/dist/plugins/ghost/src/credentials.js +36 -0
- package/dist/plugins/ghost/src/index.js +18 -59
- package/dist/plugins/github/src/credentials.js +18 -0
- package/dist/plugins/github/src/index.js +55 -78
- package/dist/plugins/gitlab/src/credentials.js +24 -0
- package/dist/plugins/gitlab/src/index.js +29 -48
- package/dist/plugins/gmail/src/index.js +47 -108
- package/dist/plugins/gong/src/credentials.js +16 -0
- package/dist/plugins/gong/src/index.js +16 -32
- package/dist/plugins/googleAppsScript/src/index.js +109 -42
- package/dist/plugins/googleCalendar/src/index.js +20 -51
- package/dist/plugins/googleContacts/src/index.js +13 -40
- package/dist/plugins/googleDocs/src/index.js +3 -32
- package/dist/plugins/googleDocs/src/shared.js +2 -1
- package/dist/plugins/googleDrive/src/index.js +68 -97
- package/dist/plugins/googleImage/src/credentials.js +14 -0
- package/dist/plugins/googleImage/src/index.js +15 -26
- package/dist/plugins/googleSheets/src/index.js +27 -60
- package/dist/plugins/googleSlides/src/index.js +7 -35
- package/dist/plugins/googleTasks/src/index.js +14 -42
- package/dist/plugins/gotify/src/credentials.js +32 -0
- package/dist/plugins/gotify/src/index.js +14 -36
- package/dist/plugins/gotowebinar/src/credentials.js +13 -0
- package/dist/plugins/gotowebinar/src/index.js +52 -69
- package/dist/plugins/grafana/src/credentials.js +16 -0
- package/dist/plugins/grafana/src/index.js +34 -53
- package/dist/plugins/graphql/src/credentials.js +42 -0
- package/dist/plugins/graphql/src/index.js +21 -46
- package/dist/plugins/grist/src/credentials.js +30 -0
- package/dist/plugins/grist/src/index.js +14 -43
- package/dist/plugins/halopsa/src/credentials.js +56 -0
- package/dist/plugins/halopsa/src/index.js +20 -47
- package/dist/plugins/harvest/src/credentials.js +20 -0
- package/dist/plugins/harvest/src/index.js +24 -43
- package/dist/plugins/helpscout/src/credentials.js +13 -0
- package/dist/plugins/helpscout/src/index.js +26 -38
- package/dist/plugins/highlevel/src/credentials.js +19 -0
- package/dist/plugins/highlevel/src/index.js +42 -65
- package/dist/plugins/homeAssistant/src/credentials.js +27 -0
- package/dist/plugins/homeAssistant/src/index.js +34 -52
- package/dist/plugins/hubspot/src/credentials.js +16 -0
- package/dist/plugins/hubspot/src/index.js +29 -41
- package/dist/plugins/humanticAi/src/credentials.js +13 -0
- package/dist/plugins/humanticAi/src/index.js +15 -22
- package/dist/plugins/hunter/src/credentials.js +13 -0
- package/dist/plugins/hunter/src/index.js +18 -17
- package/dist/plugins/intercom/src/credentials.js +19 -0
- package/dist/plugins/intercom/src/index.js +25 -38
- package/dist/plugins/iterable/src/credentials.js +17 -0
- package/dist/plugins/iterable/src/index.js +26 -40
- package/dist/plugins/jenkins/src/credentials.js +16 -0
- package/dist/plugins/jenkins/src/index.js +22 -36
- package/dist/plugins/jira/src/credentials.js +16 -0
- package/dist/plugins/jira/src/index.js +35 -61
- package/dist/plugins/keap/src/credentials.js +19 -0
- package/dist/plugins/keap/src/index.js +43 -71
- package/dist/plugins/kobotoolbox/src/credentials.js +13 -0
- package/dist/plugins/kobotoolbox/src/index.js +46 -84
- package/dist/plugins/lemlist/src/credentials.js +19 -0
- package/dist/plugins/lemlist/src/index.js +35 -47
- package/dist/plugins/linear/src/attachments.js +7 -7
- package/dist/plugins/linear/src/comments.js +7 -7
- package/dist/plugins/linear/src/credentials.js +17 -0
- package/dist/plugins/linear/src/cycles.js +5 -5
- package/dist/plugins/linear/src/index.js +2 -0
- package/dist/plugins/linear/src/initiatives.js +6 -6
- package/dist/plugins/linear/src/issues.js +14 -14
- package/dist/plugins/linear/src/labels.js +6 -6
- package/dist/plugins/linear/src/organization.js +2 -2
- package/dist/plugins/linear/src/projects.js +12 -12
- package/dist/plugins/linear/src/shared.js +34 -32
- package/dist/plugins/linear/src/states.js +3 -3
- package/dist/plugins/linear/src/teams.js +4 -4
- package/dist/plugins/linear/src/users.js +3 -3
- package/dist/plugins/linear/src/views.js +5 -5
- package/dist/plugins/linear/src/webhooks.js +5 -5
- package/dist/plugins/lingvanex/src/credentials.js +13 -0
- package/dist/plugins/lingvanex/src/index.js +7 -9
- package/dist/plugins/linkedin/src/credentials.js +17 -0
- package/dist/plugins/linkedin/src/index.js +13 -17
- package/dist/plugins/lonescale/src/credentials.js +13 -0
- package/dist/plugins/lonescale/src/index.js +16 -26
- package/dist/plugins/magento/src/credentials.js +16 -0
- package/dist/plugins/magento/src/index.js +67 -84
- package/dist/plugins/mailcheck/src/credentials.js +17 -0
- package/dist/plugins/mailcheck/src/index.js +7 -9
- package/dist/plugins/mailchimp/src/credentials.js +32 -0
- package/dist/plugins/mailchimp/src/index.js +36 -44
- package/dist/plugins/mailerlite/src/credentials.js +13 -0
- package/dist/plugins/mailerlite/src/index.js +19 -32
- package/dist/plugins/mailgun/src/credentials.js +21 -0
- package/dist/plugins/mailgun/src/index.js +15 -21
- package/dist/plugins/mailjet/src/credentials.js +38 -0
- package/dist/plugins/mailjet/src/index.js +60 -115
- package/dist/plugins/mandrill/src/credentials.js +17 -0
- package/dist/plugins/mandrill/src/index.js +11 -12
- package/dist/plugins/marketstack/src/credentials.js +16 -0
- package/dist/plugins/marketstack/src/index.js +18 -28
- package/dist/plugins/matrix/src/credentials.js +19 -0
- package/dist/plugins/matrix/src/index.js +23 -52
- package/dist/plugins/mattermost/src/credentials.js +19 -0
- package/dist/plugins/mattermost/src/index.js +41 -73
- package/dist/plugins/mautic/src/credentials.js +16 -0
- package/dist/plugins/mautic/src/index.js +46 -62
- package/dist/plugins/medium/src/credentials.js +20 -0
- package/dist/plugins/medium/src/index.js +18 -23
- package/dist/plugins/messagebird/src/credentials.js +22 -0
- package/dist/plugins/messagebird/src/index.js +13 -18
- package/dist/plugins/metabase/src/credentials.js +19 -0
- package/dist/plugins/metabase/src/index.js +24 -40
- package/dist/plugins/microsoftCalendar/src/index.js +49 -18
- package/dist/plugins/microsoftFiles/src/index.js +95 -31
- package/dist/plugins/microsoftMail/src/index.js +63 -21
- package/dist/plugins/misp/src/credentials.js +16 -0
- package/dist/plugins/misp/src/index.js +60 -71
- package/dist/plugins/mocean/src/credentials.js +17 -0
- package/dist/plugins/mocean/src/index.js +11 -23
- package/dist/plugins/monday/src/credentials.js +14 -0
- package/dist/plugins/monday/src/index.js +31 -44
- package/dist/plugins/monicaCrm/src/credentials.js +19 -0
- package/dist/plugins/monicaCrm/src/index.js +25 -42
- package/dist/plugins/msg91/src/credentials.js +10 -0
- package/dist/plugins/msg91/src/index.js +15 -11
- package/dist/plugins/nasa/src/credentials.js +22 -0
- package/dist/plugins/nasa/src/index.js +24 -28
- package/dist/plugins/netlify/src/credentials.js +19 -0
- package/dist/plugins/netlify/src/index.js +27 -51
- package/dist/plugins/netscalerAdc/src/credentials.js +18 -0
- package/dist/plugins/netscalerAdc/src/index.js +16 -31
- package/dist/plugins/nextcloud/src/credentials.js +27 -0
- package/dist/plugins/nextcloud/src/index.js +55 -109
- package/dist/plugins/nocodb/src/credentials.js +16 -0
- package/dist/plugins/nocodb/src/index.js +19 -37
- package/dist/plugins/notion/src/credentials.js +21 -0
- package/dist/plugins/notion/src/index.js +25 -38
- package/dist/plugins/npm/src/credentials.js +19 -0
- package/dist/plugins/npm/src/index.js +22 -32
- package/dist/plugins/odoo/src/credentials.js +21 -0
- package/dist/plugins/odoo/src/index.js +53 -69
- package/dist/plugins/okta/src/credentials.js +23 -0
- package/dist/plugins/okta/src/index.js +30 -35
- package/dist/plugins/oneSimpleApi/src/credentials.js +16 -0
- package/dist/plugins/oneSimpleApi/src/index.js +19 -24
- package/dist/plugins/onfleet/src/credentials.js +23 -0
- package/dist/plugins/onfleet/src/index.js +42 -53
- package/dist/plugins/openai/src/credentials.js +13 -0
- package/dist/plugins/openai/src/index.js +16 -24
- package/dist/plugins/openweathermap/src/credentials.js +16 -0
- package/dist/plugins/openweathermap/src/index.js +22 -22
- package/dist/plugins/oura/src/credentials.js +19 -0
- package/dist/plugins/oura/src/index.js +13 -18
- package/dist/plugins/paddle/src/credentials.js +27 -0
- package/dist/plugins/paddle/src/index.js +20 -36
- package/dist/plugins/pagerduty/src/credentials.js +24 -0
- package/dist/plugins/pagerduty/src/index.js +30 -39
- package/dist/plugins/parallel/src/credentials.js +18 -0
- package/dist/plugins/parallel/src/index.js +16 -22
- package/dist/plugins/paypal/src/credentials.js +44 -0
- package/dist/plugins/paypal/src/index.js +14 -40
- package/dist/plugins/peekalink/src/credentials.js +16 -0
- package/dist/plugins/peekalink/src/index.js +10 -11
- package/dist/plugins/phantombuster/src/credentials.js +19 -0
- package/dist/plugins/phantombuster/src/index.js +19 -32
- package/dist/plugins/philipsHue/src/credentials.js +17 -0
- package/dist/plugins/philipsHue/src/index.js +15 -27
- package/dist/plugins/pipedrive/src/credentials.js +26 -0
- package/dist/plugins/pipedrive/src/index.js +43 -73
- package/dist/plugins/plaud/src/index.js +2 -1
- package/dist/plugins/plaud/src/shared.js +23 -19
- package/dist/plugins/plivo/src/credentials.js +20 -0
- package/dist/plugins/plivo/src/index.js +13 -19
- package/dist/plugins/posthog/src/credentials.js +18 -0
- package/dist/plugins/posthog/src/index.js +14 -20
- package/dist/plugins/profitwell/src/credentials.js +22 -0
- package/dist/plugins/profitwell/src/index.js +10 -17
- package/dist/plugins/pushbullet/src/credentials.js +19 -0
- package/dist/plugins/pushbullet/src/index.js +19 -27
- package/dist/plugins/pushcut/src/credentials.js +19 -0
- package/dist/plugins/pushcut/src/index.js +7 -8
- package/dist/plugins/pushover/src/credentials.js +14 -0
- package/dist/plugins/pushover/src/index.js +7 -12
- package/dist/plugins/quickbase/src/credentials.js +15 -0
- package/dist/plugins/quickbase/src/index.js +24 -34
- package/dist/plugins/quickbooks/src/credentials.js +22 -0
- package/dist/plugins/quickbooks/src/index.js +17 -46
- package/dist/plugins/raindrop/src/credentials.js +19 -0
- package/dist/plugins/raindrop/src/index.js +30 -32
- package/dist/plugins/recraft/src/credentials.js +13 -0
- package/dist/plugins/recraft/src/index.js +39 -28
- package/dist/plugins/reddit/src/credentials.js +26 -0
- package/dist/plugins/reddit/src/index.js +30 -34
- package/dist/plugins/replicate/src/credentials.js +23 -0
- package/dist/plugins/replicate/src/index.js +18 -28
- package/dist/plugins/rocketchat/src/credentials.js +17 -0
- package/dist/plugins/rocketchat/src/index.js +8 -19
- package/dist/plugins/rundeck/src/credentials.js +16 -0
- package/dist/plugins/rundeck/src/index.js +12 -28
- package/dist/plugins/salesforce/src/credentials.js +73 -0
- package/dist/plugins/salesforce/src/index.js +6 -0
- package/dist/plugins/salesforce/src/metadata.js +3 -16
- package/dist/plugins/salesforce/src/shared.js +25 -100
- package/dist/plugins/salesforce/src/sobjects.js +10 -9
- package/dist/plugins/salesmate/src/credentials.js +17 -0
- package/dist/plugins/salesmate/src/index.js +20 -37
- package/dist/plugins/securityScorecard/src/credentials.js +22 -0
- package/dist/plugins/securityScorecard/src/index.js +24 -37
- package/dist/plugins/segment/src/credentials.js +16 -0
- package/dist/plugins/segment/src/index.js +12 -16
- package/dist/plugins/sendgrid/src/credentials.js +13 -0
- package/dist/plugins/sendgrid/src/index.js +31 -35
- package/dist/plugins/sendy/src/credentials.js +18 -0
- package/dist/plugins/sendy/src/index.js +18 -24
- package/dist/plugins/sentry/src/credentials.js +16 -0
- package/dist/plugins/sentry/src/index.js +30 -98
- package/dist/plugins/servicenow/src/credentials.js +13 -0
- package/dist/plugins/servicenow/src/index.js +22 -41
- package/dist/plugins/shiftAtlas/src/graph.js +2 -2
- package/dist/plugins/shiftAtlas/src/index.js +2 -0
- package/dist/plugins/shiftAtlas/src/shared.js +3 -1
- package/dist/plugins/shiftBwm/src/index.js +4 -2
- package/dist/plugins/shiftBwm/src/shared.js +41 -16
- package/dist/plugins/shiftCrm/src/access.js +2 -2
- package/dist/plugins/shiftCrm/src/accounts.js +3 -3
- package/dist/plugins/shiftCrm/src/activities.js +3 -3
- package/dist/plugins/shiftCrm/src/credentials.js +6 -0
- package/dist/plugins/shiftCrm/src/index.js +2 -0
- package/dist/plugins/shiftCrm/src/opportunities.js +3 -3
- package/dist/plugins/shiftCrm/src/people.js +3 -3
- package/dist/plugins/shiftCrm/src/records.js +2 -2
- package/dist/plugins/shiftCrm/src/shared.js +2 -1
- package/dist/plugins/shiftCrm/src/tasks.js +3 -3
- package/dist/plugins/shiftObjects/src/credentials.js +2 -0
- package/dist/plugins/shiftObjects/src/index.js +2 -0
- package/dist/plugins/shiftObjects/src/objects.js +4 -3
- package/dist/plugins/shiftOcr/src/credentials.js +8 -0
- package/dist/plugins/shiftOcr/src/index.js +14 -8
- package/dist/plugins/shiftPages/src/index.js +2 -0
- package/dist/plugins/shiftPages/src/pages.js +5 -3
- package/dist/plugins/shiftPages/src/shared.js +3 -1
- package/dist/plugins/shiftTranscription/src/index.js +2 -0
- package/dist/plugins/shiftTranscription/src/shared.js +11 -1
- package/dist/plugins/shiftTranscription/src/transcription.js +5 -5
- package/dist/plugins/shiftWork/src/index.js +2 -0
- package/dist/plugins/shiftWork/src/issue-views.js +5 -5
- package/dist/plugins/shiftWork/src/issues.js +11 -7
- package/dist/plugins/shiftWork/src/projects.js +3 -3
- package/dist/plugins/shiftWork/src/shared.js +3 -1
- package/dist/plugins/shopify/src/credentials.js +16 -0
- package/dist/plugins/shopify/src/index.js +32 -59
- package/dist/plugins/signl4/src/credentials.js +17 -0
- package/dist/plugins/signl4/src/index.js +28 -29
- package/dist/plugins/slack/src/credentials.js +19 -0
- package/dist/plugins/slack/src/index.js +51 -60
- package/dist/plugins/sms77/src/credentials.js +17 -0
- package/dist/plugins/sms77/src/index.js +11 -16
- package/dist/plugins/splunk/src/credentials.js +19 -0
- package/dist/plugins/splunk/src/index.js +32 -74
- package/dist/plugins/spotify/src/credentials.js +19 -0
- package/dist/plugins/spotify/src/index.js +40 -55
- package/dist/plugins/stackby/src/credentials.js +13 -0
- package/dist/plugins/stackby/src/index.js +14 -23
- package/dist/plugins/steel/src/auth.js +27 -0
- package/dist/plugins/steel/src/browser.js +4 -3
- package/dist/plugins/steel/src/captchas.js +4 -3
- package/dist/plugins/steel/src/extensions.js +3 -2
- package/dist/plugins/steel/src/files.js +9 -10
- package/dist/plugins/steel/src/index.js +2 -0
- package/dist/plugins/steel/src/page/tools.js +3 -3
- package/dist/plugins/steel/src/profiles.js +4 -3
- package/dist/plugins/steel/src/sessions.js +13 -13
- package/dist/plugins/steel/src/shared.js +21 -51
- package/dist/plugins/storyblok/src/credentials.js +37 -0
- package/dist/plugins/storyblok/src/index.js +22 -66
- package/dist/plugins/strapi/src/credentials.js +71 -0
- package/dist/plugins/strapi/src/index.js +36 -70
- package/dist/plugins/strava/src/credentials.js +19 -0
- package/dist/plugins/strava/src/index.js +16 -33
- package/dist/plugins/stripe/src/credentials.js +19 -0
- package/dist/plugins/stripe/src/index.js +44 -58
- package/dist/plugins/supabase/src/credentials.js +30 -0
- package/dist/plugins/supabase/src/index.js +18 -40
- package/dist/plugins/syncromsp/src/credentials.js +16 -0
- package/dist/plugins/syncromsp/src/index.js +37 -70
- package/dist/plugins/tapfiliate/src/credentials.js +13 -0
- package/dist/plugins/tapfiliate/src/index.js +21 -31
- package/dist/plugins/telegram/src/credentials.js +20 -0
- package/dist/plugins/telegram/src/index.js +31 -39
- package/dist/plugins/thehive/src/credentials.js +14 -0
- package/dist/plugins/thehive/src/index.js +33 -50
- package/dist/plugins/thehiveProject/src/credentials.js +16 -0
- package/dist/plugins/thehiveProject/src/index.js +53 -122
- package/dist/plugins/todoist/src/credentials.js +26 -0
- package/dist/plugins/todoist/src/index.js +49 -79
- package/dist/plugins/together/src/credentials.js +16 -0
- package/dist/plugins/together/src/index.js +31 -33
- package/dist/plugins/travisci/src/credentials.js +24 -0
- package/dist/plugins/travisci/src/index.js +16 -30
- package/dist/plugins/trello/src/credentials.js +29 -0
- package/dist/plugins/trello/src/index.js +49 -64
- package/dist/plugins/twake/src/credentials.js +16 -0
- package/dist/plugins/twake/src/index.js +8 -10
- package/dist/plugins/twilio/src/credentials.js +23 -0
- package/dist/plugins/twilio/src/index.js +12 -26
- package/dist/plugins/twist/src/credentials.js +13 -0
- package/dist/plugins/twist/src/index.js +32 -44
- package/dist/plugins/twitter/src/credentials.js +16 -0
- package/dist/plugins/twitter/src/index.js +25 -37
- package/dist/plugins/typesafe/src/credentials.js +28 -0
- package/dist/plugins/typesafe/src/index.js +3 -1
- package/dist/plugins/typesafe/src/shared.js +23 -35
- package/dist/plugins/unleashedSoftware/src/credentials.js +21 -0
- package/dist/plugins/unleashedSoftware/src/index.js +13 -37
- package/dist/plugins/uplead/src/credentials.js +16 -0
- package/dist/plugins/uplead/src/index.js +11 -16
- package/dist/plugins/uproc/src/credentials.js +14 -0
- package/dist/plugins/uproc/src/index.js +7 -10
- package/dist/plugins/uptimerobot/src/credentials.js +14 -0
- package/dist/plugins/uptimerobot/src/index.js +28 -39
- package/dist/plugins/urlscanio/src/credentials.js +13 -0
- package/dist/plugins/urlscanio/src/index.js +13 -22
- package/dist/plugins/vercel/src/credentials.js +19 -0
- package/dist/plugins/vercel/src/deployments.js +27 -11
- package/dist/plugins/vercel/src/env.js +31 -12
- package/dist/plugins/vercel/src/index.js +2 -0
- package/dist/plugins/vercel/src/projects.js +6 -3
- package/dist/plugins/vercel/src/shared.js +32 -37
- package/dist/plugins/vero/src/credentials.js +17 -0
- package/dist/plugins/vero/src/index.js +18 -21
- package/dist/plugins/vonage/src/credentials.js +17 -0
- package/dist/plugins/vonage/src/index.js +14 -18
- package/dist/plugins/wekan/src/credentials.js +16 -0
- package/dist/plugins/wekan/src/index.js +33 -46
- package/dist/plugins/wolt/src/account.js +6 -0
- package/dist/plugins/wolt/src/catalog.js +2 -2
- package/dist/plugins/wolt/src/credentials.js +64 -0
- package/dist/plugins/wolt/src/index.js +8 -3
- package/dist/plugins/wolt/src/orders.js +2 -2
- package/dist/plugins/wolt/src/public.js +91 -0
- package/dist/plugins/wolt/src/shared.js +49 -158
- package/dist/plugins/woocommerce/src/credentials.js +16 -0
- package/dist/plugins/woocommerce/src/index.js +19 -37
- package/dist/plugins/wordpress/src/credentials.js +16 -0
- package/dist/plugins/wordpress/src/index.js +23 -42
- package/dist/plugins/xai/src/credentials.js +13 -0
- package/dist/plugins/xai/src/index.js +32 -31
- package/dist/plugins/xero/src/credentials.js +17 -0
- package/dist/plugins/xero/src/index.js +19 -36
- package/dist/plugins/yourls/src/credentials.js +17 -0
- package/dist/plugins/yourls/src/index.js +13 -23
- package/dist/plugins/zammad/src/credentials.js +15 -0
- package/dist/plugins/zammad/src/index.js +27 -47
- package/dist/plugins/zendesk/src/credentials.js +26 -0
- package/dist/plugins/zendesk/src/index.js +29 -48
- package/dist/plugins/zoho/src/credentials.js +17 -0
- package/dist/plugins/zoho/src/index.js +18 -38
- package/dist/plugins/zoom/src/credentials.js +19 -0
- package/dist/plugins/zoom/src/index.js +15 -30
- package/dist/plugins/zulip/src/credentials.js +16 -0
- package/dist/plugins/zulip/src/index.js +36 -42
- package/dist/sdk.d.ts +8 -0
- package/dist/sdk.js +3 -0
- package/package.json +2 -1
- package/dist/plugins/_shared/authedFetch.js +0 -33
- package/dist/plugins/_shared/tokenRefresh.js +0 -41
- package/dist/tests/helpers/engine-harness.d.ts +0 -1
- package/dist/tests/helpers/engine-harness.js +0 -236
|
@@ -1,36 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { credentialJson, pathSegment } from "../../_shared/credentials.js";
|
|
2
|
+
import { zulipCredential } from "./credentials.js";
|
|
3
|
+
/** Zulip takes form-encoded parameters; nested values are JSON strings. */
|
|
4
|
+
function zulipParams(body) {
|
|
5
|
+
return Object.fromEntries(Object.entries(body).map(([k, v]) => [
|
|
6
|
+
k,
|
|
7
|
+
v && typeof v === "object" ? JSON.stringify(v) : v,
|
|
8
|
+
]));
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
10
|
+
function apiRequest(ctx, method, path, body) {
|
|
11
|
+
const params = body && Object.keys(body).length > 0 ? zulipParams(body) : undefined;
|
|
12
|
+
// GET parameters ride in the query string; a GET carries no body.
|
|
13
|
+
return credentialJson(ctx, zulipCredential, "zulip", {
|
|
14
|
+
target: "api",
|
|
15
|
+
path,
|
|
12
16
|
method,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const form = new URLSearchParams();
|
|
20
|
-
for (const [k, v] of Object.entries(body)) {
|
|
21
|
-
if (v !== undefined && v !== null)
|
|
22
|
-
form.set(k, typeof v === "object" ? JSON.stringify(v) : String(v));
|
|
23
|
-
}
|
|
24
|
-
init.body = form;
|
|
25
|
-
}
|
|
26
|
-
const res = await fetch(url, init);
|
|
27
|
-
if (!res.ok)
|
|
28
|
-
throw new Error(`Zulip error ${res.status}: ${await res.text()}`);
|
|
29
|
-
return res.json();
|
|
17
|
+
...(params && method === "GET"
|
|
18
|
+
? { query: params }
|
|
19
|
+
: params
|
|
20
|
+
? { form: params }
|
|
21
|
+
: {}),
|
|
22
|
+
});
|
|
30
23
|
}
|
|
31
24
|
export default function zulip(rl) {
|
|
32
25
|
rl.setName("zulip");
|
|
33
26
|
rl.setVersion("0.1.0");
|
|
27
|
+
rl.setCredential(zulipCredential);
|
|
34
28
|
rl.setConnectionSchema({
|
|
35
29
|
url: {
|
|
36
30
|
type: "string",
|
|
@@ -65,7 +59,7 @@ export default function zulip(rl) {
|
|
|
65
59
|
},
|
|
66
60
|
async execute(input, ctx) {
|
|
67
61
|
const p = input;
|
|
68
|
-
return apiRequest(
|
|
62
|
+
return apiRequest(ctx, "POST", "messages", {
|
|
69
63
|
type: "private",
|
|
70
64
|
to: p.to,
|
|
71
65
|
content: p.content,
|
|
@@ -86,7 +80,7 @@ export default function zulip(rl) {
|
|
|
86
80
|
},
|
|
87
81
|
async execute(input, ctx) {
|
|
88
82
|
const p = input;
|
|
89
|
-
return apiRequest(
|
|
83
|
+
return apiRequest(ctx, "POST", "messages", {
|
|
90
84
|
type: "stream",
|
|
91
85
|
to: p.stream,
|
|
92
86
|
topic: p.topic,
|
|
@@ -99,7 +93,7 @@ export default function zulip(rl) {
|
|
|
99
93
|
description: "Get a message by ID",
|
|
100
94
|
inputSchema: { messageId: { type: "string", required: true } },
|
|
101
95
|
async execute(input, ctx) {
|
|
102
|
-
return apiRequest(
|
|
96
|
+
return apiRequest(ctx, "GET", `messages/${pathSegment(input.messageId)}`);
|
|
103
97
|
},
|
|
104
98
|
});
|
|
105
99
|
rl.registerAction("message.update", {
|
|
@@ -112,7 +106,7 @@ export default function zulip(rl) {
|
|
|
112
106
|
},
|
|
113
107
|
async execute(input, ctx) {
|
|
114
108
|
const { messageId, ...fields } = input;
|
|
115
|
-
return apiRequest(
|
|
109
|
+
return apiRequest(ctx, "PATCH", `messages/${pathSegment(messageId)}`, fields);
|
|
116
110
|
},
|
|
117
111
|
});
|
|
118
112
|
rl.registerAction("message.delete", {
|
|
@@ -120,7 +114,7 @@ export default function zulip(rl) {
|
|
|
120
114
|
description: "Delete a message",
|
|
121
115
|
inputSchema: { messageId: { type: "string", required: true } },
|
|
122
116
|
async execute(input, ctx) {
|
|
123
|
-
return apiRequest(
|
|
117
|
+
return apiRequest(ctx, "DELETE", `messages/${pathSegment(input.messageId)}`);
|
|
124
118
|
},
|
|
125
119
|
});
|
|
126
120
|
// ── Stream ──────────────────────────────────────────
|
|
@@ -138,7 +132,7 @@ export default function zulip(rl) {
|
|
|
138
132
|
body.include_public = p.includePublic;
|
|
139
133
|
if (p.includeSubscribed !== undefined)
|
|
140
134
|
body.include_subscribed = p.includeSubscribed;
|
|
141
|
-
const data = (await apiRequest(
|
|
135
|
+
const data = (await apiRequest(ctx, "GET", "streams", body));
|
|
142
136
|
return data.streams;
|
|
143
137
|
},
|
|
144
138
|
});
|
|
@@ -147,7 +141,7 @@ export default function zulip(rl) {
|
|
|
147
141
|
description: "List subscribed streams",
|
|
148
142
|
inputSchema: {},
|
|
149
143
|
async execute(_input, ctx) {
|
|
150
|
-
const data = (await apiRequest(
|
|
144
|
+
const data = (await apiRequest(ctx, "GET", "users/me/subscriptions"));
|
|
151
145
|
return data.subscriptions;
|
|
152
146
|
},
|
|
153
147
|
});
|
|
@@ -168,7 +162,7 @@ export default function zulip(rl) {
|
|
|
168
162
|
};
|
|
169
163
|
if (p.inviteOnly !== undefined)
|
|
170
164
|
body.invite_only = p.inviteOnly;
|
|
171
|
-
return apiRequest(
|
|
165
|
+
return apiRequest(ctx, "POST", "users/me/subscriptions", body);
|
|
172
166
|
},
|
|
173
167
|
});
|
|
174
168
|
rl.registerAction("stream.update", {
|
|
@@ -189,7 +183,7 @@ export default function zulip(rl) {
|
|
|
189
183
|
body.new_name = JSON.stringify(fields.newName);
|
|
190
184
|
if (fields.isPrivate !== undefined)
|
|
191
185
|
body.is_private = fields.isPrivate;
|
|
192
|
-
return apiRequest(
|
|
186
|
+
return apiRequest(ctx, "PATCH", `streams/${pathSegment(streamId)}`, body);
|
|
193
187
|
},
|
|
194
188
|
});
|
|
195
189
|
rl.registerAction("stream.delete", {
|
|
@@ -197,7 +191,7 @@ export default function zulip(rl) {
|
|
|
197
191
|
description: "Delete a stream",
|
|
198
192
|
inputSchema: { streamId: { type: "string", required: true } },
|
|
199
193
|
async execute(input, ctx) {
|
|
200
|
-
return apiRequest(
|
|
194
|
+
return apiRequest(ctx, "DELETE", `streams/${pathSegment(input.streamId)}`);
|
|
201
195
|
},
|
|
202
196
|
});
|
|
203
197
|
// ── User ────────────────────────────────────────────
|
|
@@ -206,7 +200,7 @@ export default function zulip(rl) {
|
|
|
206
200
|
description: "Get a user by ID",
|
|
207
201
|
inputSchema: { userId: { type: "string", required: true } },
|
|
208
202
|
async execute(input, ctx) {
|
|
209
|
-
return apiRequest(
|
|
203
|
+
return apiRequest(ctx, "GET", `users/${pathSegment(input.userId)}`);
|
|
210
204
|
},
|
|
211
205
|
});
|
|
212
206
|
rl.registerAction("user.list", {
|
|
@@ -214,7 +208,7 @@ export default function zulip(rl) {
|
|
|
214
208
|
description: "List all users",
|
|
215
209
|
inputSchema: {},
|
|
216
210
|
async execute(_input, ctx) {
|
|
217
|
-
const data = (await apiRequest(
|
|
211
|
+
const data = (await apiRequest(ctx, "GET", "users"));
|
|
218
212
|
return data.members;
|
|
219
213
|
},
|
|
220
214
|
});
|
|
@@ -229,7 +223,7 @@ export default function zulip(rl) {
|
|
|
229
223
|
},
|
|
230
224
|
async execute(input, ctx) {
|
|
231
225
|
const p = input;
|
|
232
|
-
return apiRequest(
|
|
226
|
+
return apiRequest(ctx, "POST", "users", {
|
|
233
227
|
email: p.email,
|
|
234
228
|
password: p.password,
|
|
235
229
|
full_name: p.fullName,
|
|
@@ -252,7 +246,7 @@ export default function zulip(rl) {
|
|
|
252
246
|
body.full_name = JSON.stringify(fields.fullName);
|
|
253
247
|
if (fields.role !== undefined)
|
|
254
248
|
body.role = fields.role;
|
|
255
|
-
return apiRequest(
|
|
249
|
+
return apiRequest(ctx, "PATCH", `users/${pathSegment(userId)}`, body);
|
|
256
250
|
},
|
|
257
251
|
});
|
|
258
252
|
rl.registerAction("user.deactivate", {
|
|
@@ -260,7 +254,7 @@ export default function zulip(rl) {
|
|
|
260
254
|
description: "Deactivate a user",
|
|
261
255
|
inputSchema: { userId: { type: "string", required: true } },
|
|
262
256
|
async execute(input, ctx) {
|
|
263
|
-
return apiRequest(
|
|
257
|
+
return apiRequest(ctx, "DELETE", `users/${pathSegment(input.userId)}`);
|
|
264
258
|
},
|
|
265
259
|
});
|
|
266
260
|
}
|
package/dist/sdk.d.ts
CHANGED
|
@@ -8,6 +8,13 @@ export interface RunlineOptions {
|
|
|
8
8
|
connections?: ConnectionConfig[];
|
|
9
9
|
/** Host-owned credentials; mutually exclusive with initial connections. */
|
|
10
10
|
connectionProvider?: ConnectionProvider;
|
|
11
|
+
/**
|
|
12
|
+
* Host-signed requests, built per action call of a plugin that declares
|
|
13
|
+
* its credential and handed to the action as `ctx.credentials`. For
|
|
14
|
+
* hosts that keep credentials outside the process running actions;
|
|
15
|
+
* absent, plugins sign with their connection.
|
|
16
|
+
*/
|
|
17
|
+
credentialBroker?: EngineHooks["credentialBroker"];
|
|
11
18
|
timeoutMs?: number;
|
|
12
19
|
memoryLimitBytes?: number;
|
|
13
20
|
/**
|
|
@@ -42,6 +49,7 @@ export declare class Runline {
|
|
|
42
49
|
*/
|
|
43
50
|
private _engine;
|
|
44
51
|
private readonly _onAction;
|
|
52
|
+
private readonly _credentialBroker;
|
|
45
53
|
private constructor();
|
|
46
54
|
private engine;
|
|
47
55
|
/**
|
package/dist/sdk.js
CHANGED
|
@@ -19,9 +19,11 @@ export class Runline {
|
|
|
19
19
|
*/
|
|
20
20
|
_engine = null;
|
|
21
21
|
_onAction;
|
|
22
|
+
_credentialBroker;
|
|
22
23
|
constructor(options) {
|
|
23
24
|
this._registry = new PluginRegistry();
|
|
24
25
|
this._onAction = options.onAction;
|
|
26
|
+
this._credentialBroker = options.credentialBroker;
|
|
25
27
|
if (options.connectionProvider && options.connections) {
|
|
26
28
|
throw new Error("Pass connections or connectionProvider, not both");
|
|
27
29
|
}
|
|
@@ -50,6 +52,7 @@ export class Runline {
|
|
|
50
52
|
this._engine = new ExecutionEngine(this._registry, this._config, {
|
|
51
53
|
onAction: this._onAction,
|
|
52
54
|
connectionProvider: this._connectionProvider,
|
|
55
|
+
credentialBroker: this._credentialBroker,
|
|
53
56
|
});
|
|
54
57
|
}
|
|
55
58
|
return this._engine;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "runline",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Code mode for agents \u2014 turn any API or command into a callable action",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"prepublishOnly": "bun run build",
|
|
33
33
|
"dev": "bun run src/main.ts",
|
|
34
34
|
"test": "bun test src/tests",
|
|
35
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.test.json",
|
|
35
36
|
"format": "bunx @biomejs/biome format --write src/",
|
|
36
37
|
"lint": "bunx @biomejs/biome lint src/",
|
|
37
38
|
"check": "bunx @biomejs/biome check src/"
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `fetch` for a request that carries a credential.
|
|
3
|
-
*
|
|
4
|
-
* Every plugin outside the credential registry hand-rolls its provider calls,
|
|
5
|
-
* and a bare `fetch` follows redirects by default — which hands the
|
|
6
|
-
* `Authorization` header to whatever host the response names. The registry's
|
|
7
|
-
* own transport (`runline/src/credentials/http.ts`) refuses redirects for
|
|
8
|
-
* exactly this reason; this is the same guarantee for the plugins that do not
|
|
9
|
-
* go through it.
|
|
10
|
-
*
|
|
11
|
-
* Drop-in: same signature and same `Response` as `fetch`, so a call site
|
|
12
|
-
* changes by one identifier and nothing downstream moves.
|
|
13
|
-
*
|
|
14
|
-
* const res = await authedFetch(url, { headers: { Authorization: key } });
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* `redirect: "error"` makes fetch reject rather than follow. The
|
|
18
|
-
* `response.redirected` and 3xx checks are belt to that brace: a runtime whose
|
|
19
|
-
* fetch ignores the option, or a hook that replaces it, must not silently
|
|
20
|
-
* reopen the hole.
|
|
21
|
-
*/
|
|
22
|
-
export async function authedFetch(input, init = {}) {
|
|
23
|
-
const response = await fetch(input, { ...init, redirect: "error" });
|
|
24
|
-
const followed = response.redirected;
|
|
25
|
-
const offered = response.status >= 300 && response.status < 400;
|
|
26
|
-
if (followed || offered) {
|
|
27
|
-
void response.body?.cancel().catch(() => { });
|
|
28
|
-
throw new Error(followed
|
|
29
|
-
? "Refusing a request that followed a redirect while carrying credentials."
|
|
30
|
-
: `Refusing a redirect on a request carrying credentials (HTTP ${response.status}).`);
|
|
31
|
-
}
|
|
32
|
-
return response;
|
|
33
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { requestOAuth2Token, } from "runline";
|
|
2
|
-
const REFRESH_SKEW_MS = 60_000;
|
|
3
|
-
function usableToken(config) {
|
|
4
|
-
return typeof config.accessToken === "string" &&
|
|
5
|
-
config.accessToken &&
|
|
6
|
-
(config.accessTokenExpiresAt === undefined ||
|
|
7
|
-
(typeof config.accessTokenExpiresAt === "number" &&
|
|
8
|
-
Number.isFinite(config.accessTokenExpiresAt) &&
|
|
9
|
-
Date.now() < config.accessTokenExpiresAt - REFRESH_SKEW_MS))
|
|
10
|
-
? config.accessToken
|
|
11
|
-
: undefined;
|
|
12
|
-
}
|
|
13
|
-
/** Refresh ownership includes the provider request and persistence of rotated tokens. */
|
|
14
|
-
export async function coordinatedAccessToken(ctx, refresh,
|
|
15
|
-
/** Renew even when the stored token is still usable, to prove it or to rotate it. */
|
|
16
|
-
force = false) {
|
|
17
|
-
const cached = force ? undefined : usableToken(ctx.connection.config);
|
|
18
|
-
if (cached)
|
|
19
|
-
return cached;
|
|
20
|
-
await ctx.updateConnection(async (current) => {
|
|
21
|
-
if (!force && usableToken(current))
|
|
22
|
-
return;
|
|
23
|
-
return refresh(current);
|
|
24
|
-
});
|
|
25
|
-
const token = ctx.connection.config.accessToken;
|
|
26
|
-
if (typeof token !== "string" || !token)
|
|
27
|
-
throw new Error("Token refresh committed no access token");
|
|
28
|
-
return token;
|
|
29
|
-
}
|
|
30
|
-
/** Token errors exclude response bodies, parser diagnostics, and request credentials. */
|
|
31
|
-
export async function requestToken(endpoint, body, application) {
|
|
32
|
-
const tokens = await requestOAuth2Token(endpoint, body, application);
|
|
33
|
-
return {
|
|
34
|
-
accessToken: tokens.accessToken,
|
|
35
|
-
// Unknown expiry replaces an old expiry; it never inherits a stale timestamp.
|
|
36
|
-
accessTokenExpiresAt: tokens.expiresAt,
|
|
37
|
-
...(tokens.refreshToken === undefined
|
|
38
|
-
? {}
|
|
39
|
-
: { refreshToken: tokens.refreshToken }),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
// Test harness for engine robustness scenarios (large payloads, OOM,
|
|
2
|
-
// timeouts, crashes). Runs one named scenario in this process and prints a
|
|
3
|
-
// JSON report to stdout. Tests spawn this file so that a hard process
|
|
4
|
-
// abort or exit kills the harness, not the test runner.
|
|
5
|
-
//
|
|
6
|
-
// Usage: bun run engine-harness.ts <scenario>
|
|
7
|
-
import { createHash } from "node:crypto";
|
|
8
|
-
import { DEFAULT_CONFIG } from "../../config/types.js";
|
|
9
|
-
import { ExecutionEngine } from "../../core/engine.js";
|
|
10
|
-
import { createPluginAPI } from "../../plugin/api.js";
|
|
11
|
-
import { PluginRegistry } from "../../plugin/registry.js";
|
|
12
|
-
const BLOB_MB = 8;
|
|
13
|
-
// ~8MB of raw bytes → ~10.7MB base64
|
|
14
|
-
const base64 = Buffer.alloc(BLOB_MB * 1024 * 1024, 0xab).toString("base64");
|
|
15
|
-
const base64Sha = createHash("sha256").update(base64).digest("hex");
|
|
16
|
-
// Captures what the host-side actions actually received, so tests can
|
|
17
|
-
// verify that data crossing the execution boundary arrives byte-identical.
|
|
18
|
-
const received = {};
|
|
19
|
-
function makeFilesPlugin() {
|
|
20
|
-
const { api, resolve } = createPluginAPI("test");
|
|
21
|
-
api.setName("files");
|
|
22
|
-
api.setVersion("0.0.0");
|
|
23
|
-
api.registerAction("getAttachment", {
|
|
24
|
-
description: "Returns a large base64 payload",
|
|
25
|
-
async execute() {
|
|
26
|
-
await new Promise((r) => setTimeout(r, 5));
|
|
27
|
-
return { filename: "msa.pdf", data: base64 };
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
api.registerAction("upload", {
|
|
31
|
-
description: "Accepts a large base64 payload",
|
|
32
|
-
async execute(input) {
|
|
33
|
-
await new Promise((r) => setTimeout(r, 5));
|
|
34
|
-
const { data } = input;
|
|
35
|
-
received.uploadSha =
|
|
36
|
-
typeof data === "string"
|
|
37
|
-
? createHash("sha256").update(data).digest("hex")
|
|
38
|
-
: `not-a-string:${typeof data}`;
|
|
39
|
-
received.uploadBytes = typeof data === "string" ? data.length : -1;
|
|
40
|
-
return { id: "file_123", bytes: received.uploadBytes };
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
api.registerAction("send", {
|
|
44
|
-
description: "Accepts a large attachment",
|
|
45
|
-
async execute(input) {
|
|
46
|
-
await new Promise((r) => setTimeout(r, 5));
|
|
47
|
-
const { attachment } = input;
|
|
48
|
-
received.sendBytes =
|
|
49
|
-
typeof attachment === "string" ? attachment.length : -1;
|
|
50
|
-
return { messageId: "msg_456", bytes: received.sendBytes };
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
api.registerAction("append", {
|
|
54
|
-
description: "Small side effect",
|
|
55
|
-
async execute() {
|
|
56
|
-
await new Promise((r) => setTimeout(r, 5));
|
|
57
|
-
return { updatedRows: 1 };
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
api.registerAction("slow", {
|
|
61
|
-
description: "Sleeps for the given ms, then returns",
|
|
62
|
-
async execute(input) {
|
|
63
|
-
const { ms } = input;
|
|
64
|
-
await new Promise((r) => setTimeout(r, ms));
|
|
65
|
-
return { waited: ms };
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
api.registerAction("circular", {
|
|
69
|
-
description: "Returns a non-JSON-serializable (circular) value",
|
|
70
|
-
async execute() {
|
|
71
|
-
const obj = { name: "loop" };
|
|
72
|
-
obj.self = obj;
|
|
73
|
-
return obj;
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
return resolve();
|
|
77
|
-
}
|
|
78
|
-
function makeEngine(memoryMb = 64, timeoutMs = 30_000) {
|
|
79
|
-
const registry = new PluginRegistry();
|
|
80
|
-
registry.register(makeFilesPlugin());
|
|
81
|
-
return new ExecutionEngine(registry, {
|
|
82
|
-
...DEFAULT_CONFIG,
|
|
83
|
-
timeoutMs,
|
|
84
|
-
memoryLimitBytes: memoryMb * 1024 * 1024,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
const scenarios = {
|
|
88
|
-
// The agent's original failure: multi-step chain with a large payload,
|
|
89
|
-
// default 64MB memory limit. Must complete cleanly.
|
|
90
|
-
async "chain-default"() {
|
|
91
|
-
const engine = makeEngine(64);
|
|
92
|
-
const out = await engine.execute(`
|
|
93
|
-
const att = await files.getAttachment({ messageId: "m1" });
|
|
94
|
-
const up = await files.upload({ name: att.filename, data: att.data });
|
|
95
|
-
const sent = await files.send({ to: "x@y.z", attachment: att.data });
|
|
96
|
-
const row = await files.append({ values: [["Triple-A MSA", "May"]] });
|
|
97
|
-
return { up, sent, row };
|
|
98
|
-
`);
|
|
99
|
-
return { error: out.error ?? null, result: out.result, received };
|
|
100
|
-
},
|
|
101
|
-
// Integrity: the bytes the upload action receives must be byte-identical
|
|
102
|
-
// to what getAttachment produced.
|
|
103
|
-
async integrity() {
|
|
104
|
-
const engine = makeEngine(64);
|
|
105
|
-
const out = await engine.execute(`
|
|
106
|
-
const att = await files.getAttachment({ messageId: "m1" });
|
|
107
|
-
await files.upload({ name: att.filename, data: att.data });
|
|
108
|
-
return "done";
|
|
109
|
-
`);
|
|
110
|
-
return {
|
|
111
|
-
error: out.error ?? null,
|
|
112
|
-
expectedSha: base64Sha,
|
|
113
|
-
expectedBytes: base64.length,
|
|
114
|
-
received,
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
|
-
// Ergonomics: inside the sandbox a large payload is a plain string the
|
|
118
|
-
// agent can measure, slice, and pass around — no tokens, no proxies.
|
|
119
|
-
async "string-surface"() {
|
|
120
|
-
const engine = makeEngine(64);
|
|
121
|
-
const out = await engine.execute(`
|
|
122
|
-
const att = await files.getAttachment({ messageId: "m1" });
|
|
123
|
-
const d = att.data;
|
|
124
|
-
return { type: typeof d, bytes: d.length, head: d.slice(0, 8) };
|
|
125
|
-
`);
|
|
126
|
-
return {
|
|
127
|
-
error: out.error ?? null,
|
|
128
|
-
result: out.result,
|
|
129
|
-
expectedBytes: base64.length,
|
|
130
|
-
expectedHead: base64.slice(0, 8),
|
|
131
|
-
};
|
|
132
|
-
},
|
|
133
|
-
// A large value in the final return reaches the host caller intact.
|
|
134
|
-
async "final-result-large"() {
|
|
135
|
-
const engine = makeEngine(64);
|
|
136
|
-
const out = await engine.execute(`
|
|
137
|
-
const att = await files.getAttachment({ messageId: "m1" });
|
|
138
|
-
return { data: att.data };
|
|
139
|
-
`);
|
|
140
|
-
const data = out.result?.data;
|
|
141
|
-
return {
|
|
142
|
-
error: out.error ?? null,
|
|
143
|
-
resultBytes: typeof data === "string" ? data.length : -1,
|
|
144
|
-
resultSha: typeof data === "string"
|
|
145
|
-
? createHash("sha256").update(data).digest("hex")
|
|
146
|
-
: null,
|
|
147
|
-
expectedSha: base64Sha,
|
|
148
|
-
expectedBytes: base64.length,
|
|
149
|
-
};
|
|
150
|
-
},
|
|
151
|
-
// An action still in flight when the run times out must not crash the
|
|
152
|
-
// host when its result arrives after the worker is gone — no unhandled
|
|
153
|
-
// rejections, no uncaught exceptions, clean timeout error.
|
|
154
|
-
async "timeout-inflight-action"() {
|
|
155
|
-
const unhandled = [];
|
|
156
|
-
process.on("unhandledRejection", (e) => unhandled.push(String(e)));
|
|
157
|
-
process.on("uncaughtException", (e) => unhandled.push(String(e)));
|
|
158
|
-
const engine = makeEngine(64, 150);
|
|
159
|
-
const out = await engine.execute(`
|
|
160
|
-
await files.slow({ ms: 1000 });
|
|
161
|
-
return "unreachable";
|
|
162
|
-
`);
|
|
163
|
-
// let the in-flight action resolve against the dead worker
|
|
164
|
-
await new Promise((r) => setTimeout(r, 1200));
|
|
165
|
-
return { error: out.error ?? null, unhandled };
|
|
166
|
-
},
|
|
167
|
-
// An action returning a non-JSON-serializable value must surface as a
|
|
168
|
-
// clean per-call error inside the sandbox — catchable by agent code —
|
|
169
|
-
// not a hang or a crash.
|
|
170
|
-
async "circular-result"() {
|
|
171
|
-
const engine = makeEngine(64);
|
|
172
|
-
const out = await engine.execute(`
|
|
173
|
-
try {
|
|
174
|
-
await files.circular({});
|
|
175
|
-
return { caught: false };
|
|
176
|
-
} catch (e) {
|
|
177
|
-
return { caught: true, message: e.message };
|
|
178
|
-
}
|
|
179
|
-
`);
|
|
180
|
-
return { error: out.error ?? null, result: out.result };
|
|
181
|
-
},
|
|
182
|
-
// Two executes on the same engine running concurrently must not
|
|
183
|
-
// interfere — separate workers, separate logs, correct results.
|
|
184
|
-
async concurrent() {
|
|
185
|
-
const engine = makeEngine(64);
|
|
186
|
-
const [a, b] = await Promise.all([
|
|
187
|
-
engine.execute(`console.log("run-a"); const r = await files.slow({ ms: 50 }); return { tag: "a", waited: r.waited };`),
|
|
188
|
-
engine.execute(`console.log("run-b"); const r = await files.slow({ ms: 30 }); return { tag: "b", waited: r.waited };`),
|
|
189
|
-
]);
|
|
190
|
-
return {
|
|
191
|
-
aError: a.error ?? null,
|
|
192
|
-
bError: b.error ?? null,
|
|
193
|
-
aResult: a.result,
|
|
194
|
-
bResult: b.result,
|
|
195
|
-
aLogs: a.logs,
|
|
196
|
-
bLogs: b.logs,
|
|
197
|
-
};
|
|
198
|
-
},
|
|
199
|
-
// Agent code killing its own worker (it has the full runtime, so it can)
|
|
200
|
-
// must fail soft with a descriptive error and leave the engine usable.
|
|
201
|
-
async "worker-suicide"() {
|
|
202
|
-
const engine = makeEngine(64);
|
|
203
|
-
const out = await engine.execute(`process.exit(7);`);
|
|
204
|
-
const after = await engine.execute("return 1 + 1");
|
|
205
|
-
return {
|
|
206
|
-
error: out.error ?? null,
|
|
207
|
-
afterError: after.error ?? null,
|
|
208
|
-
afterResult: after.result,
|
|
209
|
-
};
|
|
210
|
-
},
|
|
211
|
-
// Sandbox code that genuinely exhausts the memory limit must fail soft:
|
|
212
|
-
// a clean error returned from execute(), no process abort, and the engine
|
|
213
|
-
// must remain usable for a subsequent run.
|
|
214
|
-
async "sandbox-oom"() {
|
|
215
|
-
const engine = makeEngine(32);
|
|
216
|
-
const out = await engine.execute(`
|
|
217
|
-
const hog = [];
|
|
218
|
-
while (true) hog.push(new Array(1e6).fill(1));
|
|
219
|
-
`);
|
|
220
|
-
const after = await engine.execute("return 1 + 1");
|
|
221
|
-
return {
|
|
222
|
-
error: out.error ?? null,
|
|
223
|
-
afterError: after.error ?? null,
|
|
224
|
-
afterResult: after.result,
|
|
225
|
-
};
|
|
226
|
-
},
|
|
227
|
-
};
|
|
228
|
-
const name = process.argv[2];
|
|
229
|
-
const scenario = scenarios[name];
|
|
230
|
-
if (!scenario) {
|
|
231
|
-
console.error(`Unknown scenario: ${name}`);
|
|
232
|
-
process.exit(2);
|
|
233
|
-
}
|
|
234
|
-
const report = await scenario();
|
|
235
|
-
console.log(JSON.stringify(report));
|
|
236
|
-
process.exit(0);
|