runline 0.34.0 → 0.36.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/errors.d.ts +3 -3
- package/dist/auth/errors.js +3 -3
- package/dist/core/engine.js +12 -8
- package/dist/credentials/aws-plugin.d.ts +79 -0
- package/dist/credentials/aws-plugin.js +179 -0
- package/dist/credentials/aws.d.ts +41 -0
- package/dist/credentials/aws.js +213 -0
- package/dist/credentials/broker.d.ts +11 -0
- package/dist/credentials/broker.js +222 -0
- package/dist/credentials/plugin.d.ts +255 -0
- package/dist/{plugins/_shared/credentials.js → credentials/plugin.js} +40 -12
- package/dist/credentials/policy.d.ts +11 -3
- package/dist/credentials/policy.js +22 -3
- package/dist/credentials/registry.d.ts +14 -0
- package/dist/credentials/registry.js +60 -2
- package/dist/credentials/sigv4.d.ts +47 -0
- package/dist/credentials/sigv4.js +145 -0
- package/dist/credentials/transport.d.ts +9 -0
- package/dist/credentials/transport.js +106 -26
- package/dist/credentials/types.d.ts +73 -4
- package/dist/index.d.ts +9 -2
- package/dist/index.js +6 -1
- package/dist/plugin/schema.d.ts +16 -4
- package/dist/plugin/schema.js +28 -5
- package/dist/plugin/types.d.ts +8 -0
- package/dist/plugins/_shared/base64.js +30 -0
- package/dist/plugins/_shared/googleAuth.js +65 -6
- package/dist/plugins/_shared/googleCredentials.js +41 -9
- package/dist/plugins/_shared/localFile.js +40 -0
- package/dist/plugins/_shared/mediaFile.js +16 -13
- package/dist/plugins/_shared/microsoftAuth.js +22 -9
- package/dist/plugins/_shared/microsoftCredentials.js +13 -9
- package/dist/plugins/_shared/shiftCloud.js +14 -19
- package/dist/plugins/_shared/shiftCredentials.js +1 -2
- package/dist/plugins/_shared/shiftUpload.js +14 -10
- package/dist/plugins/actionNetwork/src/credentials.js +1 -1
- package/dist/plugins/actionNetwork/src/index.js +1 -1
- package/dist/plugins/activeCampaign/src/credentials.js +1 -1
- package/dist/plugins/activeCampaign/src/index.js +1 -1
- package/dist/plugins/adalo/src/credentials.js +1 -1
- package/dist/plugins/adalo/src/index.js +1 -1
- package/dist/plugins/affinity/src/credentials.js +1 -1
- package/dist/plugins/affinity/src/index.js +1 -1
- 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 +202 -0
- package/dist/plugins/agentMail/src/threads.js +75 -0
- package/dist/plugins/agileCrm/src/credentials.js +1 -1
- package/dist/plugins/agileCrm/src/index.js +1 -1
- package/dist/plugins/airtable/src/credentials.js +1 -1
- package/dist/plugins/airtable/src/index.js +1 -1
- package/dist/plugins/airtop/src/credentials.js +1 -1
- package/dist/plugins/airtop/src/index.js +1 -1
- package/dist/plugins/apiTemplateIo/src/credentials.js +1 -1
- package/dist/plugins/apiTemplateIo/src/index.js +1 -1
- package/dist/plugins/asana/src/credentials.js +1 -1
- package/dist/plugins/asana/src/index.js +1 -1
- package/dist/plugins/autopilot/src/credentials.js +1 -1
- package/dist/plugins/autopilot/src/index.js +1 -1
- package/dist/plugins/bambooHr/src/credentials.js +1 -1
- package/dist/plugins/bambooHr/src/index.js +1 -1
- package/dist/plugins/bannerbear/src/credentials.js +1 -1
- package/dist/plugins/bannerbear/src/index.js +1 -1
- package/dist/plugins/baserow/src/credentials.js +1 -1
- package/dist/plugins/baserow/src/index.js +1 -1
- package/dist/plugins/beeminder/src/credentials.js +1 -1
- package/dist/plugins/beeminder/src/index.js +1 -1
- package/dist/plugins/bitly/src/credentials.js +1 -1
- package/dist/plugins/bitly/src/index.js +1 -1
- package/dist/plugins/bitwarden/src/credentials.js +1 -1
- package/dist/plugins/bitwarden/src/index.js +1 -1
- package/dist/plugins/box/src/credentials.js +1 -1
- package/dist/plugins/box/src/index.js +1 -1
- package/dist/plugins/brandfetch/src/credentials.js +1 -1
- package/dist/plugins/brandfetch/src/index.js +1 -1
- package/dist/plugins/brevo/src/credentials.js +1 -1
- package/dist/plugins/brevo/src/index.js +1 -1
- package/dist/plugins/bubble/src/credentials.js +1 -1
- package/dist/plugins/bubble/src/index.js +1 -1
- package/dist/plugins/chargebee/src/credentials.js +1 -1
- package/dist/plugins/chargebee/src/index.js +1 -1
- package/dist/plugins/circleci/src/credentials.js +1 -1
- package/dist/plugins/circleci/src/index.js +1 -1
- package/dist/plugins/ciscoWebex/src/credentials.js +1 -1
- package/dist/plugins/ciscoWebex/src/index.js +1 -1
- package/dist/plugins/clearbit/src/credentials.js +1 -1
- package/dist/plugins/clearbit/src/index.js +1 -1
- package/dist/plugins/clickup/src/credentials.js +1 -1
- package/dist/plugins/clickup/src/index.js +1 -1
- package/dist/plugins/clockify/src/credentials.js +1 -1
- package/dist/plugins/clockify/src/index.js +1 -1
- package/dist/plugins/cloudflare/src/credentials.js +1 -1
- package/dist/plugins/cloudflare/src/index.js +1 -1
- package/dist/plugins/cockpit/src/credentials.js +1 -1
- package/dist/plugins/cockpit/src/index.js +1 -1
- package/dist/plugins/coda/src/credentials.js +1 -1
- package/dist/plugins/coda/src/index.js +1 -1
- package/dist/plugins/coingecko/src/credentials.js +1 -1
- package/dist/plugins/coingecko/src/index.js +1 -1
- package/dist/plugins/contentful/src/credentials.js +1 -1
- package/dist/plugins/contentful/src/index.js +1 -1
- package/dist/plugins/convertkit/src/credentials.js +1 -1
- package/dist/plugins/convertkit/src/index.js +1 -1
- package/dist/plugins/copper/src/credentials.js +1 -1
- package/dist/plugins/copper/src/index.js +1 -1
- package/dist/plugins/cortex/src/credentials.js +1 -1
- package/dist/plugins/cortex/src/index.js +1 -1
- package/dist/plugins/currents/src/credentials.js +1 -1
- package/dist/plugins/currents/src/index.js +1 -1
- package/dist/plugins/customerIo/src/credentials.js +1 -1
- package/dist/plugins/customerIo/src/index.js +1 -1
- package/dist/plugins/databricks/src/credentials.js +1 -1
- package/dist/plugins/databricks/src/index.js +1 -1
- package/dist/plugins/deepl/src/credentials.js +1 -1
- package/dist/plugins/deepl/src/index.js +1 -1
- package/dist/plugins/demio/src/credentials.js +1 -1
- package/dist/plugins/demio/src/index.js +1 -1
- package/dist/plugins/dhl/src/credentials.js +1 -1
- package/dist/plugins/dhl/src/index.js +1 -1
- package/dist/plugins/discord/src/credentials.js +1 -1
- package/dist/plugins/discord/src/index.js +1 -1
- package/dist/plugins/discourse/src/credentials.js +1 -1
- package/dist/plugins/discourse/src/index.js +1 -1
- package/dist/plugins/disqus/src/credentials.js +1 -1
- package/dist/plugins/disqus/src/index.js +1 -1
- package/dist/plugins/drift/src/credentials.js +1 -1
- package/dist/plugins/drift/src/index.js +1 -1
- package/dist/plugins/dropbox/src/credentials.js +1 -1
- package/dist/plugins/dropbox/src/index.js +1 -1
- package/dist/plugins/dropcontact/src/credentials.js +1 -1
- package/dist/plugins/dropcontact/src/index.js +1 -1
- package/dist/plugins/egoi/src/credentials.js +1 -1
- package/dist/plugins/egoi/src/index.js +1 -1
- package/dist/plugins/elasticsearch/src/credentials.js +1 -1
- package/dist/plugins/elasticsearch/src/index.js +1 -1
- package/dist/plugins/elevenlabs/src/credentials.js +1 -1
- package/dist/plugins/elevenlabs/src/shared.js +30 -46
- package/dist/plugins/elevenlabs/src/workflows.js +1 -1
- package/dist/plugins/emelia/src/credentials.js +1 -1
- package/dist/plugins/emelia/src/index.js +1 -1
- package/dist/plugins/erpnext/src/credentials.js +1 -1
- package/dist/plugins/erpnext/src/index.js +1 -1
- package/dist/plugins/facebookGraph/src/credentials.js +1 -1
- package/dist/plugins/facebookGraph/src/index.js +1 -2
- package/dist/plugins/fal/src/credentials.js +1 -1
- package/dist/plugins/fal/src/index.js +1 -1
- package/dist/plugins/fal/src/shared.js +1 -1
- package/dist/plugins/freshdesk/src/credentials.js +1 -1
- package/dist/plugins/freshdesk/src/index.js +1 -1
- package/dist/plugins/freshservice/src/credentials.js +1 -1
- package/dist/plugins/freshservice/src/index.js +1 -1
- package/dist/plugins/freshworksCrm/src/credentials.js +1 -1
- package/dist/plugins/freshworksCrm/src/index.js +1 -1
- package/dist/plugins/getresponse/src/credentials.js +1 -1
- package/dist/plugins/getresponse/src/index.js +1 -1
- package/dist/plugins/gett/src/credentials.js +1 -2
- package/dist/plugins/gett/src/index.js +1 -1
- package/dist/plugins/gett/src/login.js +1 -1
- package/dist/plugins/gett/src/session.js +1 -1
- package/dist/plugins/gett/src/shared.js +1 -2
- package/dist/plugins/ghost/src/credentials.js +1 -1
- package/dist/plugins/ghost/src/index.js +1 -1
- package/dist/plugins/github/src/credentials.js +1 -1
- package/dist/plugins/github/src/index.js +1 -1
- package/dist/plugins/gitlab/src/credentials.js +1 -1
- package/dist/plugins/gitlab/src/index.js +1 -1
- package/dist/plugins/gmail/src/index.js +23 -86
- package/dist/plugins/gong/src/credentials.js +1 -1
- package/dist/plugins/gong/src/index.js +1 -1
- package/dist/plugins/googleAppsScript/src/index.js +14 -2
- package/dist/plugins/googleCalendar/src/index.js +7 -40
- package/dist/plugins/googleContacts/src/index.js +3 -33
- package/dist/plugins/googleDocs/src/index.js +2 -33
- package/dist/plugins/googleDocs/src/shared.js +1 -1
- package/dist/plugins/googleDrive/src/index.js +20 -46
- package/dist/plugins/googleImage/src/credentials.js +1 -1
- package/dist/plugins/googleImage/src/index.js +2 -2
- package/dist/plugins/googleSheets/src/index.js +3 -35
- package/dist/plugins/googleSlides/src/index.js +3 -33
- package/dist/plugins/googleTasks/src/index.js +3 -33
- package/dist/plugins/gotify/src/credentials.js +1 -1
- package/dist/plugins/gotify/src/index.js +1 -1
- package/dist/plugins/gotowebinar/src/credentials.js +1 -1
- package/dist/plugins/gotowebinar/src/index.js +1 -1
- package/dist/plugins/grafana/src/credentials.js +1 -1
- package/dist/plugins/grafana/src/index.js +1 -1
- package/dist/plugins/graphql/src/credentials.js +1 -1
- package/dist/plugins/graphql/src/index.js +1 -1
- package/dist/plugins/grist/src/credentials.js +1 -1
- package/dist/plugins/grist/src/index.js +1 -1
- package/dist/plugins/halopsa/src/credentials.js +1 -2
- package/dist/plugins/halopsa/src/index.js +1 -1
- package/dist/plugins/harvest/src/credentials.js +1 -1
- package/dist/plugins/harvest/src/index.js +1 -1
- package/dist/plugins/helpscout/src/credentials.js +1 -1
- package/dist/plugins/helpscout/src/index.js +1 -1
- package/dist/plugins/highlevel/src/credentials.js +1 -1
- package/dist/plugins/highlevel/src/index.js +9 -3
- package/dist/plugins/homeAssistant/src/credentials.js +1 -1
- package/dist/plugins/homeAssistant/src/index.js +1 -1
- package/dist/plugins/hubspot/src/credentials.js +1 -1
- package/dist/plugins/hubspot/src/index.js +1 -1
- package/dist/plugins/humanticAi/src/credentials.js +1 -1
- package/dist/plugins/humanticAi/src/index.js +1 -1
- package/dist/plugins/hunter/src/credentials.js +1 -1
- package/dist/plugins/hunter/src/index.js +1 -1
- package/dist/plugins/intercom/src/credentials.js +1 -1
- package/dist/plugins/intercom/src/index.js +1 -1
- package/dist/plugins/iterable/src/credentials.js +1 -1
- package/dist/plugins/iterable/src/index.js +1 -1
- package/dist/plugins/jenkins/src/credentials.js +1 -1
- package/dist/plugins/jenkins/src/index.js +1 -1
- package/dist/plugins/jira/src/credentials.js +1 -1
- package/dist/plugins/jira/src/index.js +1 -1
- package/dist/plugins/keap/src/credentials.js +1 -1
- package/dist/plugins/keap/src/index.js +1 -1
- package/dist/plugins/kobotoolbox/src/credentials.js +1 -1
- package/dist/plugins/kobotoolbox/src/index.js +1 -1
- package/dist/plugins/lemlist/src/credentials.js +1 -1
- package/dist/plugins/lemlist/src/index.js +1 -1
- package/dist/plugins/linear/src/credentials.js +1 -1
- package/dist/plugins/linear/src/shared.js +1 -1
- package/dist/plugins/lingvanex/src/credentials.js +1 -1
- package/dist/plugins/lingvanex/src/index.js +1 -1
- package/dist/plugins/linkedin/src/credentials.js +1 -1
- package/dist/plugins/linkedin/src/index.js +1 -1
- package/dist/plugins/lonescale/src/credentials.js +1 -1
- package/dist/plugins/lonescale/src/index.js +1 -1
- package/dist/plugins/magento/src/credentials.js +1 -1
- package/dist/plugins/magento/src/index.js +1 -1
- package/dist/plugins/mailcheck/src/credentials.js +1 -1
- package/dist/plugins/mailcheck/src/index.js +1 -1
- package/dist/plugins/mailchimp/src/credentials.js +1 -1
- package/dist/plugins/mailchimp/src/index.js +1 -1
- package/dist/plugins/mailerlite/src/credentials.js +1 -1
- package/dist/plugins/mailerlite/src/index.js +1 -1
- package/dist/plugins/mailgun/src/credentials.js +1 -1
- package/dist/plugins/mailgun/src/index.js +1 -1
- package/dist/plugins/mailjet/src/credentials.js +1 -1
- package/dist/plugins/mailjet/src/index.js +1 -1
- package/dist/plugins/mandrill/src/credentials.js +1 -1
- package/dist/plugins/mandrill/src/index.js +1 -1
- package/dist/plugins/marketstack/src/credentials.js +1 -1
- package/dist/plugins/marketstack/src/index.js +1 -1
- package/dist/plugins/matrix/src/credentials.js +1 -1
- package/dist/plugins/matrix/src/index.js +1 -1
- package/dist/plugins/mattermost/src/credentials.js +1 -1
- package/dist/plugins/mattermost/src/index.js +1 -1
- package/dist/plugins/mautic/src/credentials.js +1 -1
- package/dist/plugins/mautic/src/index.js +1 -1
- package/dist/plugins/medium/src/credentials.js +1 -1
- package/dist/plugins/medium/src/index.js +1 -1
- package/dist/plugins/messagebird/src/credentials.js +1 -1
- package/dist/plugins/messagebird/src/index.js +1 -1
- package/dist/plugins/metabase/src/credentials.js +1 -1
- package/dist/plugins/metabase/src/index.js +1 -1
- package/dist/plugins/microsoftCalendar/src/index.js +2 -7
- package/dist/plugins/microsoftFiles/src/index.js +17 -9
- package/dist/plugins/microsoftMail/src/index.js +2 -7
- package/dist/plugins/misp/src/credentials.js +1 -1
- package/dist/plugins/misp/src/index.js +1 -1
- package/dist/plugins/mocean/src/credentials.js +1 -1
- package/dist/plugins/mocean/src/index.js +1 -1
- package/dist/plugins/monday/src/credentials.js +1 -1
- package/dist/plugins/monday/src/index.js +1 -1
- package/dist/plugins/monicaCrm/src/credentials.js +1 -1
- package/dist/plugins/monicaCrm/src/index.js +1 -1
- package/dist/plugins/msg91/src/credentials.js +1 -1
- package/dist/plugins/msg91/src/index.js +1 -1
- package/dist/plugins/nasa/src/credentials.js +1 -1
- package/dist/plugins/nasa/src/index.js +1 -1
- package/dist/plugins/netlify/src/credentials.js +1 -1
- package/dist/plugins/netlify/src/index.js +1 -1
- package/dist/plugins/netscalerAdc/src/credentials.js +1 -1
- package/dist/plugins/netscalerAdc/src/index.js +1 -1
- package/dist/plugins/nextcloud/src/credentials.js +1 -2
- package/dist/plugins/nextcloud/src/index.js +1 -1
- package/dist/plugins/nocodb/src/credentials.js +1 -1
- package/dist/plugins/nocodb/src/index.js +1 -1
- package/dist/plugins/notion/src/credentials.js +1 -1
- package/dist/plugins/notion/src/index.js +1 -1
- package/dist/plugins/npm/src/credentials.js +1 -1
- package/dist/plugins/npm/src/index.js +1 -1
- package/dist/plugins/odoo/src/credentials.js +1 -1
- package/dist/plugins/odoo/src/index.js +1 -2
- package/dist/plugins/okta/src/credentials.js +1 -1
- package/dist/plugins/okta/src/index.js +1 -2
- package/dist/plugins/oneSimpleApi/src/credentials.js +1 -1
- package/dist/plugins/oneSimpleApi/src/index.js +1 -1
- package/dist/plugins/onfleet/src/credentials.js +1 -1
- package/dist/plugins/onfleet/src/index.js +1 -1
- package/dist/plugins/openai/src/credentials.js +1 -1
- package/dist/plugins/openai/src/index.js +2 -2
- package/dist/plugins/openweathermap/src/credentials.js +1 -1
- package/dist/plugins/openweathermap/src/index.js +1 -1
- package/dist/plugins/oura/src/credentials.js +1 -1
- package/dist/plugins/oura/src/index.js +1 -1
- package/dist/plugins/paddle/src/credentials.js +1 -1
- package/dist/plugins/paddle/src/index.js +1 -1
- package/dist/plugins/pagerduty/src/credentials.js +1 -1
- package/dist/plugins/pagerduty/src/index.js +1 -1
- package/dist/plugins/parallel/src/credentials.js +1 -1
- package/dist/plugins/parallel/src/index.js +15 -1
- package/dist/plugins/paypal/src/credentials.js +1 -1
- package/dist/plugins/paypal/src/index.js +1 -1
- package/dist/plugins/peekalink/src/credentials.js +1 -1
- package/dist/plugins/peekalink/src/index.js +1 -1
- package/dist/plugins/phantombuster/src/credentials.js +1 -1
- package/dist/plugins/phantombuster/src/index.js +1 -1
- package/dist/plugins/philipsHue/src/credentials.js +1 -1
- package/dist/plugins/philipsHue/src/index.js +1 -1
- package/dist/plugins/pipedrive/src/credentials.js +1 -1
- package/dist/plugins/pipedrive/src/index.js +1 -1
- package/dist/plugins/plaud/src/shared.js +1 -2
- package/dist/plugins/plivo/src/credentials.js +1 -1
- package/dist/plugins/plivo/src/index.js +1 -1
- package/dist/plugins/posthog/src/credentials.js +1 -1
- package/dist/plugins/posthog/src/index.js +1 -1
- package/dist/plugins/profitwell/src/credentials.js +1 -1
- package/dist/plugins/profitwell/src/index.js +1 -1
- package/dist/plugins/pushbullet/src/credentials.js +1 -1
- package/dist/plugins/pushbullet/src/index.js +1 -1
- package/dist/plugins/pushcut/src/credentials.js +1 -1
- package/dist/plugins/pushcut/src/index.js +1 -1
- package/dist/plugins/pushover/src/credentials.js +1 -1
- package/dist/plugins/pushover/src/index.js +1 -1
- package/dist/plugins/quickbase/src/credentials.js +1 -1
- package/dist/plugins/quickbase/src/index.js +1 -1
- package/dist/plugins/quickbooks/src/credentials.js +1 -1
- package/dist/plugins/quickbooks/src/index.js +1 -1
- package/dist/plugins/raindrop/src/credentials.js +1 -1
- package/dist/plugins/raindrop/src/index.js +1 -1
- package/dist/plugins/recraft/src/credentials.js +1 -1
- package/dist/plugins/recraft/src/index.js +2 -2
- package/dist/plugins/reddit/src/credentials.js +1 -1
- package/dist/plugins/reddit/src/index.js +1 -1
- package/dist/plugins/replicate/src/credentials.js +1 -1
- package/dist/plugins/replicate/src/index.js +2 -2
- package/dist/plugins/rocketchat/src/credentials.js +1 -1
- package/dist/plugins/rocketchat/src/index.js +1 -1
- package/dist/plugins/rundeck/src/credentials.js +1 -1
- package/dist/plugins/rundeck/src/index.js +1 -1
- package/dist/plugins/salesforce/src/credentials.js +1 -2
- package/dist/plugins/salesforce/src/shared.js +1 -2
- package/dist/plugins/salesforce/src/sobjects.js +1 -1
- package/dist/plugins/salesmate/src/credentials.js +1 -1
- package/dist/plugins/salesmate/src/index.js +1 -1
- package/dist/plugins/securityScorecard/src/credentials.js +1 -1
- package/dist/plugins/securityScorecard/src/index.js +1 -1
- package/dist/plugins/segment/src/credentials.js +1 -1
- package/dist/plugins/segment/src/index.js +1 -1
- package/dist/plugins/sendgrid/src/credentials.js +1 -1
- package/dist/plugins/sendgrid/src/index.js +1 -2
- package/dist/plugins/sendy/src/credentials.js +1 -1
- package/dist/plugins/sendy/src/index.js +1 -1
- package/dist/plugins/sentry/src/credentials.js +1 -1
- package/dist/plugins/sentry/src/index.js +1 -1
- package/dist/plugins/servicenow/src/credentials.js +1 -1
- package/dist/plugins/servicenow/src/index.js +1 -1
- package/dist/plugins/shiftAtlas/src/graph.js +2 -1
- package/dist/plugins/shiftAtlas/src/shared.js +1 -1
- package/dist/plugins/shiftBwm/src/shared.js +2 -4
- package/dist/plugins/shiftCrm/src/access.js +2 -1
- package/dist/plugins/shiftCrm/src/accounts.js +2 -1
- package/dist/plugins/shiftCrm/src/imports.js +2 -1
- package/dist/plugins/shiftCrm/src/opportunities.js +2 -1
- package/dist/plugins/shiftCrm/src/people.js +2 -1
- package/dist/plugins/shiftCrm/src/records.js +2 -1
- package/dist/plugins/shiftCrm/src/shared.js +1 -1
- package/dist/plugins/shiftCrm/src/tasks.js +2 -1
- package/dist/plugins/shiftObjects/src/objects.js +3 -2
- package/dist/plugins/shiftOcr/src/index.js +10 -4
- package/dist/plugins/shiftPages/src/pages.js +2 -1
- package/dist/plugins/shiftPages/src/shared.js +3 -2
- package/dist/plugins/shiftTranscription/src/shared.js +1 -1
- package/dist/plugins/shiftTranscription/src/transcription.js +3 -2
- package/dist/plugins/shiftWork/src/issue-views.js +2 -1
- package/dist/plugins/shiftWork/src/issues.js +2 -1
- package/dist/plugins/shiftWork/src/projects.js +2 -1
- package/dist/plugins/shiftWork/src/shared.js +1 -1
- package/dist/plugins/shopify/src/credentials.js +1 -1
- package/dist/plugins/shopify/src/index.js +1 -1
- package/dist/plugins/signl4/src/credentials.js +1 -1
- package/dist/plugins/signl4/src/index.js +1 -1
- package/dist/plugins/slack/src/credentials.js +1 -1
- package/dist/plugins/slack/src/index.js +1 -1
- package/dist/plugins/sms77/src/credentials.js +1 -1
- package/dist/plugins/sms77/src/index.js +1 -1
- package/dist/plugins/splunk/src/credentials.js +1 -1
- package/dist/plugins/splunk/src/index.js +1 -1
- package/dist/plugins/spotify/src/credentials.js +1 -1
- package/dist/plugins/spotify/src/index.js +1 -1
- package/dist/plugins/stackby/src/credentials.js +1 -1
- package/dist/plugins/stackby/src/index.js +1 -1
- package/dist/plugins/steel/src/auth.js +1 -1
- package/dist/plugins/steel/src/browser.js +1 -1
- package/dist/plugins/steel/src/captchas.js +1 -1
- package/dist/plugins/steel/src/extensions.js +1 -1
- package/dist/plugins/steel/src/files.js +1 -1
- package/dist/plugins/steel/src/profiles.js +1 -1
- package/dist/plugins/steel/src/sessions.js +1 -1
- package/dist/plugins/steel/src/shared.js +1 -1
- package/dist/plugins/storyblok/src/credentials.js +1 -1
- package/dist/plugins/storyblok/src/index.js +1 -1
- package/dist/plugins/strapi/src/credentials.js +1 -1
- package/dist/plugins/strapi/src/index.js +1 -1
- package/dist/plugins/strava/src/credentials.js +1 -1
- package/dist/plugins/strava/src/index.js +1 -1
- package/dist/plugins/stripe/src/credentials.js +1 -1
- package/dist/plugins/stripe/src/index.js +1 -1
- package/dist/plugins/supabase/src/credentials.js +1 -1
- package/dist/plugins/supabase/src/index.js +1 -1
- package/dist/plugins/syncromsp/src/credentials.js +1 -1
- package/dist/plugins/syncromsp/src/index.js +1 -1
- package/dist/plugins/tapfiliate/src/credentials.js +1 -1
- package/dist/plugins/tapfiliate/src/index.js +1 -1
- package/dist/plugins/telegram/src/credentials.js +1 -1
- package/dist/plugins/telegram/src/index.js +1 -1
- package/dist/plugins/thehive/src/credentials.js +1 -1
- package/dist/plugins/thehive/src/index.js +1 -1
- package/dist/plugins/thehiveProject/src/credentials.js +1 -1
- package/dist/plugins/thehiveProject/src/index.js +1 -1
- package/dist/plugins/todoist/src/credentials.js +1 -1
- package/dist/plugins/todoist/src/index.js +1 -1
- package/dist/plugins/together/src/credentials.js +1 -1
- package/dist/plugins/together/src/index.js +2 -2
- package/dist/plugins/travisci/src/credentials.js +1 -1
- package/dist/plugins/travisci/src/index.js +1 -1
- package/dist/plugins/trello/src/credentials.js +1 -1
- package/dist/plugins/trello/src/index.js +1 -1
- package/dist/plugins/twake/src/credentials.js +1 -1
- package/dist/plugins/twake/src/index.js +1 -1
- package/dist/plugins/twilio/src/credentials.js +1 -1
- package/dist/plugins/twilio/src/index.js +1 -1
- package/dist/plugins/twist/src/credentials.js +1 -1
- package/dist/plugins/twist/src/index.js +1 -1
- package/dist/plugins/twitter/src/credentials.js +1 -1
- package/dist/plugins/twitter/src/index.js +1 -1
- package/dist/plugins/typesafe/src/credentials.js +1 -1
- package/dist/plugins/typesafe/src/shared.js +1 -1
- package/dist/plugins/unleashedSoftware/src/credentials.js +1 -1
- package/dist/plugins/unleashedSoftware/src/index.js +1 -1
- package/dist/plugins/uplead/src/credentials.js +1 -1
- package/dist/plugins/uplead/src/index.js +1 -1
- package/dist/plugins/uproc/src/credentials.js +1 -1
- package/dist/plugins/uproc/src/index.js +1 -1
- package/dist/plugins/uptimerobot/src/credentials.js +1 -1
- package/dist/plugins/uptimerobot/src/index.js +1 -1
- package/dist/plugins/urlscanio/src/credentials.js +1 -1
- package/dist/plugins/urlscanio/src/index.js +1 -1
- package/dist/plugins/vercel/src/credentials.js +1 -1
- package/dist/plugins/vercel/src/deployments.js +1 -1
- package/dist/plugins/vercel/src/env.js +1 -1
- package/dist/plugins/vercel/src/projects.js +1 -1
- package/dist/plugins/vercel/src/shared.js +1 -2
- package/dist/plugins/vero/src/credentials.js +1 -1
- package/dist/plugins/vero/src/index.js +1 -1
- package/dist/plugins/vonage/src/credentials.js +1 -1
- package/dist/plugins/vonage/src/index.js +1 -1
- package/dist/plugins/wekan/src/credentials.js +1 -1
- package/dist/plugins/wekan/src/index.js +1 -1
- package/dist/plugins/wolt/src/account.js +1 -1
- package/dist/plugins/wolt/src/credentials.js +1 -1
- package/dist/plugins/wolt/src/index.js +1 -1
- package/dist/plugins/wolt/src/shared.js +1 -2
- package/dist/plugins/woocommerce/src/credentials.js +1 -1
- package/dist/plugins/woocommerce/src/index.js +1 -1
- package/dist/plugins/wordpress/src/credentials.js +1 -1
- package/dist/plugins/wordpress/src/index.js +1 -1
- package/dist/plugins/xai/src/credentials.js +1 -1
- package/dist/plugins/xai/src/index.js +2 -2
- package/dist/plugins/xero/src/credentials.js +1 -1
- package/dist/plugins/xero/src/index.js +1 -1
- package/dist/plugins/yourls/src/credentials.js +1 -1
- package/dist/plugins/yourls/src/index.js +1 -1
- package/dist/plugins/zammad/src/credentials.js +1 -1
- package/dist/plugins/zammad/src/index.js +1 -1
- package/dist/plugins/zendesk/src/credentials.js +1 -1
- package/dist/plugins/zendesk/src/index.js +1 -1
- package/dist/plugins/zoho/src/credentials.js +1 -1
- package/dist/plugins/zoho/src/index.js +1 -1
- package/dist/plugins/zoom/src/credentials.js +1 -1
- package/dist/plugins/zoom/src/index.js +1 -1
- package/dist/plugins/zulip/src/credentials.js +1 -1
- package/dist/plugins/zulip/src/index.js +1 -1
- package/package.json +4 -2
- package/dist/plugins/_shared/credentialAdapter.js +0 -152
- package/dist/tests/helpers/engine-harness.d.ts +0 -1
- package/dist/tests/helpers/engine-harness.js +0 -236
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { staticCredential } from "
|
|
1
|
+
import { staticCredential } from "runline";
|
|
2
2
|
/** An API key and secret, added by the transport as the api_key and api_secret fields of Vonage's SMS form. */
|
|
3
3
|
export const vonageCredential = staticCredential({
|
|
4
4
|
id: "vonage",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { wekanCredential } from "./credentials.js";
|
|
3
3
|
function api(ctx, method, endpoint, body) {
|
|
4
4
|
return credentialJson(ctx, wekanCredential, "wekan", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { refuseUnderHost } from "
|
|
1
|
+
import { refuseUnderHost } from "runline";
|
|
2
2
|
import { AUDIENCE, AUTH, arr, authed, CAPABILITIES, CONSUMER, cfgOf, clientHeaders, ensureIdentity, expiresAt, formEncode, http, normPhone, obj, pick, RESTAURANT, WoltError, } from "./shared.js";
|
|
3
3
|
async function authJson(ctx, path, body, extra = {}) {
|
|
4
4
|
return http(AUTH, path, {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { refuseUnderHost, } from "runline";
|
|
1
2
|
import * as t from "typebox";
|
|
2
|
-
import { refuseUnderHost } from "../../_shared/credentials.js";
|
|
3
3
|
import { discoverPaymentMethod, listAddresses, loginMethods, redeemLink, requestEmailCode, requestSmsCode, status, submitCode, submitConfirmation, whoami, } from "./account.js";
|
|
4
4
|
import { item, menu, nearby, search, venue } from "./catalog.js";
|
|
5
5
|
import { woltCredential } from "./credentials.js";
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { AuthError } from "runline";
|
|
3
|
-
import { credentialRequest, pathSegment } from "../../_shared/credentials.js";
|
|
2
|
+
import { AuthError, credentialRequest, pathSegment, } from "runline";
|
|
4
3
|
import { arr, num, numOrNull, obj, pick } from "../../_shared/provider.js";
|
|
5
4
|
import { CONSUMER, clientHeaders, RESTAURANT, woltCredential, } from "./credentials.js";
|
|
6
5
|
import { answerOf, endpointOf } from "./public.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { woocommerceCredential } from "./credentials.js";
|
|
3
3
|
function apiRequest(ctx, method, path, body, qs) {
|
|
4
4
|
return credentialJson(ctx, woocommerceCredential, "woocommerce", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { wordpressCredential } from "./credentials.js";
|
|
3
3
|
async function apiRequest(ctx, method, path, body, qs) {
|
|
4
4
|
return credentialJson(ctx, wordpressCredential, "wordpress", {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* text rendering well. Sized via aspect_ratio rather than W×H —
|
|
9
9
|
* the API does the math.
|
|
10
10
|
*/
|
|
11
|
-
import { credentialJson } from "
|
|
11
|
+
import { credentialJson } from "runline";
|
|
12
12
|
import { readImageInput, SEND_FILE_NOTE, writeImageFile, } from "../../_shared/mediaFile.js";
|
|
13
13
|
import { xaiCredential } from "./credentials.js";
|
|
14
14
|
const MODEL = "grok-imagine-image";
|
|
@@ -119,7 +119,7 @@ export default function xai(rl) {
|
|
|
119
119
|
if (typeof p.prompt !== "string" || p.prompt.length === 0) {
|
|
120
120
|
throw new Error("xai: prompt is required");
|
|
121
121
|
}
|
|
122
|
-
const img = readImageInput(p.imagePath, "xai");
|
|
122
|
+
const img = await readImageInput(p.imagePath, "xai");
|
|
123
123
|
const model = p.model ?? EDIT_MODEL;
|
|
124
124
|
const data = (await credentialJson(ctx, xaiCredential, "xai", {
|
|
125
125
|
target: "api",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { xeroCredential } from "./credentials.js";
|
|
3
3
|
function api(ctx, method, endpoint, body, qs) {
|
|
4
4
|
return credentialJson(ctx, xeroCredential, "xero", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { httpsBase, staticCredential } from "
|
|
1
|
+
import { httpsBase, staticCredential } from "runline";
|
|
2
2
|
/**
|
|
3
3
|
* A signature token, appended by the transport as the signature query
|
|
4
4
|
* parameter on the installation's own yourls-api.php. The installation
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { answerFailed, credentialJson } from "
|
|
1
|
+
import { answerFailed, credentialJson, } from "runline";
|
|
2
2
|
import { yourlsCredential } from "./credentials.js";
|
|
3
3
|
async function apiRequest(ctx, qs) {
|
|
4
4
|
const data = (await credentialJson(ctx, yourlsCredential, "yourls", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { httpsBase, staticCredential } from "
|
|
1
|
+
import { httpsBase, staticCredential } from "runline";
|
|
2
2
|
/** An access token, sent as `Authorization: Token token={token}` to the
|
|
3
3
|
* connection's own Zammad instance beneath /api/v1/. The instance URL is
|
|
4
4
|
* public config and must be HTTPS. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { zammadCredential } from "./credentials.js";
|
|
3
3
|
async function api(ctx, method, endpoint, body, qs) {
|
|
4
4
|
return credentialJson(ctx, zammadCredential, "zammad", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { hostLabel, staticCredential } from "
|
|
1
|
+
import { hostLabel, staticCredential } from "runline";
|
|
2
2
|
/**
|
|
3
3
|
* An API token as the Basic password, with the agent email joined to the
|
|
4
4
|
* fixed /token suffix as the username, on the account's own Zendesk
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { zendeskCredential } from "./credentials.js";
|
|
3
3
|
/** One Zendesk call: every endpoint is a .json path beneath /api/v2/. */
|
|
4
4
|
function api(ctx, method, endpoint, body, qs) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { zohoCredential } from "./credentials.js";
|
|
3
3
|
function api(ctx, method, endpoint, body, qs) {
|
|
4
4
|
return credentialJson(ctx, zohoCredential, "zoho", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { zoomCredential } from "./credentials.js";
|
|
3
3
|
async function apiRequest(ctx, method, path, body, qs) {
|
|
4
4
|
return credentialJson(ctx, zoomCredential, "zoom", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { credentialJson, pathSegment } from "
|
|
1
|
+
import { credentialJson, pathSegment, } from "runline";
|
|
2
2
|
import { zulipCredential } from "./credentials.js";
|
|
3
3
|
/** Zulip takes form-encoded parameters; nested values are JSON strings. */
|
|
4
4
|
function zulipParams(body) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "runline",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Code mode for agents
|
|
3
|
+
"version": "0.36.0",
|
|
4
|
+
"description": "Code mode for agents — turn any API or command into a callable action",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -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/"
|
|
@@ -92,6 +93,7 @@
|
|
|
92
93
|
"@shift-labs/ferrosearch": "^0.1.0",
|
|
93
94
|
"chalk": "^5.6.2",
|
|
94
95
|
"commander": "^14.0.3",
|
|
96
|
+
"fast-xml-parser": "^5.11.2",
|
|
95
97
|
"jiti": "^2.7.0",
|
|
96
98
|
"proper-lockfile": "^4.1.2",
|
|
97
99
|
"rrule": "^2.8.1",
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { AuthError, CredentialRegistry, CredentialTransport, } from "runline";
|
|
3
|
-
/**
|
|
4
|
-
* Where one action call's authenticated requests go: the host's broker
|
|
5
|
-
* when it supplies one — the credentials then live with the host, and no
|
|
6
|
-
* local signer is built — else this process signs with its own
|
|
7
|
-
* connection, from the plugin's declaration.
|
|
8
|
-
*/
|
|
9
|
-
export function credentialBroker(ctx, declaration) {
|
|
10
|
-
if (ctx.credentials)
|
|
11
|
-
return ctx.credentials;
|
|
12
|
-
const { binding, transport } = localSigner(ctx, declaration);
|
|
13
|
-
return {
|
|
14
|
-
request: (input) => transport.request(binding, input),
|
|
15
|
-
probe: () => transport.probe(binding),
|
|
16
|
-
socketUrl: (input) => transport.socketUrl(binding, input),
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
/** Everything a stored token was issued under. A config whose selection
|
|
20
|
-
* hashes differently can no longer use tokens issued for this one. */
|
|
21
|
-
function authorityOf(selection) {
|
|
22
|
-
return createHash("sha256").update(JSON.stringify(selection)).digest("hex");
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* A static secret's structured shape, from the flat fields and fixed values
|
|
26
|
-
* the declaration names, joined in order where a part concatenates them.
|
|
27
|
-
* Absent when a required part's field is missing, so the transport refuses
|
|
28
|
-
* it as invalid_credentials before any IO; a missing optional part is left
|
|
29
|
-
* out, refusing only the targets that place it.
|
|
30
|
-
*/
|
|
31
|
-
function staticSecret(current, sources, optional) {
|
|
32
|
-
if (!sources)
|
|
33
|
-
return undefined;
|
|
34
|
-
const secret = {};
|
|
35
|
-
sources: for (const [key, source] of Object.entries(sources)) {
|
|
36
|
-
let joined = "";
|
|
37
|
-
for (const part of "concat" in source ? source.concat : [source]) {
|
|
38
|
-
const value = "value" in part ? part.value : current[part.field];
|
|
39
|
-
if (typeof value !== "string") {
|
|
40
|
-
if (optional.includes(key))
|
|
41
|
-
continue sources;
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
joined += value;
|
|
45
|
-
}
|
|
46
|
-
secret[key] = joined;
|
|
47
|
-
}
|
|
48
|
-
return secret;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* This process signing with its own connection. Flat CLI/env storage is a
|
|
52
|
-
* projection, not a second token cache or refresh engine.
|
|
53
|
-
*/
|
|
54
|
-
function localSigner(ctx, declaration) {
|
|
55
|
-
const selection = declaration(ctx.connection.config);
|
|
56
|
-
const { type: definition, method } = selection;
|
|
57
|
-
if (!Object.hasOwn(definition.methods, method))
|
|
58
|
-
throw new AuthError("invalid_definition");
|
|
59
|
-
const auth = definition.methods[method].authentication;
|
|
60
|
-
const identity = { name: ctx.connection.name, plugin: ctx.connection.plugin };
|
|
61
|
-
const expected = authorityOf(selection);
|
|
62
|
-
const project = (current) => {
|
|
63
|
-
if (authorityOf(declaration(current)) !== expected)
|
|
64
|
-
throw new AuthError("binding_changed");
|
|
65
|
-
if (auth.kind === "none")
|
|
66
|
-
return {};
|
|
67
|
-
if (auth.kind === "static") {
|
|
68
|
-
const secret = staticSecret(current, selection.localSecret, auth.optionalParts ?? []);
|
|
69
|
-
return secret ? { [auth.field]: secret } : {};
|
|
70
|
-
}
|
|
71
|
-
const compatible = current.authTokenBinding === undefined ||
|
|
72
|
-
current.authTokenBinding === expected;
|
|
73
|
-
const tokens = {
|
|
74
|
-
...(compatible && current.accessToken !== undefined
|
|
75
|
-
? { accessToken: current.accessToken }
|
|
76
|
-
: {}),
|
|
77
|
-
...(current.refreshToken !== undefined
|
|
78
|
-
? { refreshToken: current.refreshToken }
|
|
79
|
-
: {}),
|
|
80
|
-
...(compatible && current.accessTokenExpiresAt !== undefined
|
|
81
|
-
? { expiresAt: current.accessTokenExpiresAt }
|
|
82
|
-
: {}),
|
|
83
|
-
...(compatible && current.authTokenScope !== undefined
|
|
84
|
-
? { scope: current.authTokenScope }
|
|
85
|
-
: {}),
|
|
86
|
-
...(compatible && current.authTokenType !== undefined
|
|
87
|
-
? { tokenType: current.authTokenType }
|
|
88
|
-
: {}),
|
|
89
|
-
};
|
|
90
|
-
if (!Object.keys(tokens).length)
|
|
91
|
-
return {};
|
|
92
|
-
const revision = typeof current.authTokenRevision === "string" && compatible
|
|
93
|
-
? current.authTokenRevision
|
|
94
|
-
: createHash("sha256").update(JSON.stringify(tokens)).digest("hex");
|
|
95
|
-
return { [auth.field]: { tokens, revision } };
|
|
96
|
-
};
|
|
97
|
-
const snapshot = () => ({
|
|
98
|
-
...identity,
|
|
99
|
-
config: project(ctx.connection.config),
|
|
100
|
-
});
|
|
101
|
-
const binding = {
|
|
102
|
-
type: definition.id,
|
|
103
|
-
method,
|
|
104
|
-
identity,
|
|
105
|
-
application: selection.application,
|
|
106
|
-
...(selection.jwtIdentity ? { jwtIdentity: selection.jwtIdentity } : {}),
|
|
107
|
-
...(selection.resourceOwner
|
|
108
|
-
? { resourceOwner: selection.resourceOwner }
|
|
109
|
-
: {}),
|
|
110
|
-
connection: {
|
|
111
|
-
async read() {
|
|
112
|
-
return snapshot();
|
|
113
|
-
},
|
|
114
|
-
async update(change) {
|
|
115
|
-
// Only an OAuth grant is ever renewed and written back.
|
|
116
|
-
if (auth.kind !== "oauth2")
|
|
117
|
-
throw new AuthError("invalid_definition");
|
|
118
|
-
await ctx.updateConnection(async (current) => {
|
|
119
|
-
const projected = project(current);
|
|
120
|
-
const patch = typeof change === "function" ? await change(projected) : change;
|
|
121
|
-
if (!patch)
|
|
122
|
-
return;
|
|
123
|
-
const grant = patch[auth.field];
|
|
124
|
-
if (!grant?.tokens.accessToken)
|
|
125
|
-
throw new AuthError("invalid_credentials");
|
|
126
|
-
return {
|
|
127
|
-
accessToken: grant.tokens.accessToken,
|
|
128
|
-
accessTokenExpiresAt: grant.tokens.expiresAt,
|
|
129
|
-
refreshToken: grant.tokens.refreshToken ?? current.refreshToken,
|
|
130
|
-
authTokenScope: grant.tokens.scope,
|
|
131
|
-
authTokenType: grant.tokens.tokenType,
|
|
132
|
-
authTokenRevision: grant.revision,
|
|
133
|
-
authTokenBinding: expected,
|
|
134
|
-
};
|
|
135
|
-
});
|
|
136
|
-
return snapshot();
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
const registry = new CredentialRegistry();
|
|
141
|
-
registry.register(definition);
|
|
142
|
-
// The widest defaults the transport allows, so an undeclared slow call
|
|
143
|
-
// (image generation, exports) is bounded rather than cut short; targets
|
|
144
|
-
// that declare their own deadline or ceiling get it up to the host caps.
|
|
145
|
-
const transport = new CredentialTransport(registry, {
|
|
146
|
-
fetch: globalThis.fetch,
|
|
147
|
-
timeoutMs: 120_000,
|
|
148
|
-
maxRequestBytes: 64 * 1024 * 1024,
|
|
149
|
-
maxResponseBytes: 64 * 1024 * 1024,
|
|
150
|
-
});
|
|
151
|
-
return { binding, transport };
|
|
152
|
-
}
|
|
@@ -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);
|