{"_id":"@attunesolutions/piece-yoke","_rev":"9-7115bc150a65cefd95915e104839d35c","name":"@attunesolutions/piece-yoke","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.1":{"name":"@attunesolutions/piece-yoke","version":"0.0.1","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.0.1","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://app.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"47242ec83f331029bc3f0f263f1061b6d638bea6","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.0.1.tgz","fileCount":4,"integrity":"sha512-mMAHVYKeDOEDPVf/U91ozXCMTV0y7lqmaPLZbbhaIBHSDbU3iLZvbmhWNTUbdYq7vh1qrhKv5XeD/1zPVsXOgg==","signatures":[{"sig":"MEUCIHL1xV+IurrIoQaLKqu3zP18Acd61h+yoglVrnzoPKxJAiEAtFYPtZrE0Y2g4+OSp40xE8RzudZrSdQMGz9iCtfgIU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122263},"main":"./src/index.js","type":"commonjs","gitHead":"33c9fe65ed2e00ab344d06a51060b7da7e21d2d0","_npmUser":{"name":"sgsimpson","email":"scott@simpson.kiwi"},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"10.9.4","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"22.22.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.0.1_1785814429245_0.19549325458915146","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@attunesolutions/piece-yoke","version":"0.0.2","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.0.2","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"32cf433dbd251524c3e9baca79fea893a20c6b1e","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.0.2.tgz","fileCount":4,"integrity":"sha512-1ls+Z47S0xWI0ixCHRk7otJqlQKi9Q+qQ5u0dW139uDVbc3cgVRbLYUaE6VBm3b8/d5LpjYZLD+f0ywAXVeSxg==","signatures":[{"sig":"MEUCIQCvYUhX8bIJRHYdWvvsnhza7wZ2JXH82NvEkKyh/qipBQIgC7PWnVy+UsolGYwKW9Ar0DXQQtAWAY3BBhHHJuBM5t0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122263},"main":"./src/index.js","type":"commonjs","gitHead":"2b607a5288647897bc35effdb338739aa9927f77","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.0.2_1785815833101_0.23447961438772746","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@attunesolutions/piece-yoke","version":"0.1.0","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.1.0","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"3de85b94ec1a44353bd1e090350d8c1763881c3f","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.1.0.tgz","fileCount":4,"integrity":"sha512-rLpbOrrK+0sYdCp50SQWv94m9zV2jAm+RcNHWbw9yos6y7pKigiruOG3t1XvRU/nxPohFMoAdoFqno/cCPmryQ==","signatures":[{"sig":"MEUCIQCz/Hit/+WzVWY+Bh0brUrFMmxIjymqS9AaB527///bcQIgC4w586eRcvayXngHdfSSrh/RPQ9DDYGfijAbcKUlSr4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122379},"main":"./src/index.js","type":"commonjs","gitHead":"fd8cb4d6ef8f783c1b78b80a7238affc60fba967","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.19.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.1.0_1786510737129_0.8380401745468729","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@attunesolutions/piece-yoke","version":"0.1.1","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.1.1","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"fd0b99ad7587d76fdbce690a33fe47355c0e38ff","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.1.1.tgz","fileCount":4,"integrity":"sha512-3fNK3/GlTzCkdg+GXYqKKnGy1W79LTg9rrl7S4XU3Hv1woCOT4JiqoDGuPnQR8BRaXTn00dd6eBC35f7gq5uvA==","signatures":[{"sig":"MEQCIE922WPO0voIrnxcVYKM3/upYWGfXP8Tvozbv+v1gv/aAiBHFRSLtCpgth8UFKESIzUIfEpzNp7LTJMZO6xmlVpTGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122379},"main":"./src/index.js","type":"commonjs","gitHead":"7e8db11aa9aa3d62c71b63d2e5934e8ee4a1aa18","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.1.1_1786565707975_0.7294273604556314","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@attunesolutions/piece-yoke","version":"0.2.0","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.2.0","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"bc175d9945667b8b2f8e83ec7c2dddd2b93c7d7b","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.2.0.tgz","fileCount":4,"integrity":"sha512-ZYsjWQxwFZ3xoUEr8aMbmxM+G9NJZNdz57sQoFqEmrP5pxRxPqmvQOGapassvGKmbfd9ZiY2oPxbNcCvMqZKaQ==","signatures":[{"sig":"MEUCIQDCIklUg9WXfFvdfvQNMLdp0+rpnmrOb0ADRSs+yUWtlwIgHgHay811RjO9i1fmDeEFlexuWiK8lPmqrXGdIYj0W6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122377},"main":"./src/index.js","type":"commonjs","gitHead":"56ce18deee391a05a250cfc578eef91829d1a6b7","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.2.0_1786570239597_0.30481069958761764","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@attunesolutions/piece-yoke","version":"0.2.1","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.2.1","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"5d21e11214ab21fa9bd06602dd30ee9896bc92b8","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.2.1.tgz","fileCount":4,"integrity":"sha512-jBINcB7C4t6/UyAy18W63UVx8GBpPmC1959aKutwSPGEF4sO2cn7gNrHLX8VR2csNbPCgy1B141qpyQ1lkih/g==","signatures":[{"sig":"MEYCIQD80x8SxBvnbiMJgGwlugc7NQ/UGK5/e6OJWGxyvsdjGAIhAKgBvxKL5IK/IXUoCbuKHefUaZZgM2g6WinfM1t6Xckk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":122374},"main":"./src/index.js","type":"commonjs","gitHead":"578ca64629e35b6b769770e64df1523bb0763a8a","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.2.1_1786571175308_0.8328377459529719","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@attunesolutions/piece-yoke","version":"0.2.2","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.2.2","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"f9a1a759d3e0cfe43774c97e23f7922507e3113b","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.2.2.tgz","fileCount":4,"integrity":"sha512-qR2FnZ7YHmin1zLNW3zoPOKryJ95Vo9Jxor/Gmuy+NOo6+zhdcBfwLSXqDjBl20wuyPliaiR8+bSkKomyAw0wg==","signatures":[{"sig":"MEUCIQDW1QauiySFRsXrR3srSTopAWuGcPX5iUuWO7E6r9iLgAIgV8NJ7b6E6CK9Pfxj1dBtQLqGh2CJLReaEaoPaXFAHz4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":123092},"main":"./src/index.js","type":"commonjs","gitHead":"19bec4b8b945d5228b97f007933e77098a30387b","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.2.2_1786571507005_0.0796421088033894","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@attunesolutions/piece-yoke","version":"0.3.0","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"license":"MIT","_id":"@attunesolutions/piece-yoke@0.3.0","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"homepage":"https://www.yokecontrol.ai","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"dist":{"shasum":"63fced371f1735261455fe01af06fc9d33027bd0","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.3.0.tgz","fileCount":4,"integrity":"sha512-hi0+QkFkhScn8/p/cmpCSKedzuE6zITJNW2g6+0fs7n+Py4T7VigjiPdZpGTBnuExYFF5dtuniiH24mj0RShvg==","signatures":[{"sig":"MEYCIQDAlxIXXr9UkeVmn0zQflrzFM3OCLlzdTb2aCiL1itW1wIhAPxqULl1tz04R60qEI2GND1MU6gnIR2xg4cvIlIKsM6Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":123066},"main":"./src/index.js","type":"commonjs","gitHead":"d6be54664cef3f4fa6a784cec584684072b65506","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"repository":{"url":"git+https://github.com/AttuneSolutions/activepieces.git","type":"git","directory":"packages/pieces/community/yoke"},"_npmVersion":"12.0.2","description":"Activepieces piece for Yoke — read instruction documents and gate flows on human approval.","directories":{},"_nodeVersion":"24.18.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/piece-yoke_0.3.0_1786571844760_0.9872442894700775","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@attunesolutions/piece-yoke","version":"0.4.0","description":"Activepieces piece for Yoke — read instruction documents and agent email, and gate flows on human approval.","license":"MIT","homepage":"https://www.yokecontrol.ai","repository":{"type":"git","url":"git+https://github.com/AttuneSolutions/activepieces.git","directory":"packages/pieces/community/yoke"},"keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"type":"commonjs","main":"./src/index.js","dependencies":{},"gitHead":"8511919b559d574fc0f9760da88d61fb405e2312","_id":"@attunesolutions/piece-yoke@0.4.0","bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-ONh3IBOt2/kYOV3F2olBnto7L5EDqM8yKxQE3pBbYHR8uF5oEYecOpCg0T/F9oo+wUsJEf8g+1tYukMP6L8cpw==","shasum":"eb9b2c01af3643900338661f90242d33d65c4c49","tarball":"https://registry.npmjs.org/@attunesolutions/piece-yoke/-/piece-yoke-0.4.0.tgz","fileCount":4,"unpackedSize":138719,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@attunesolutions%2fpiece-yoke@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAT0ayAoFpZlZLahTtr+agknpaEXXxeeKUdV7wzfopQoAiEA71FQSA3+yYodTbo+eeRFFkNFEwZ7l2cjITOR1K65pe8="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:86c85a48-252f-4185-be29-eb1711912ca5"}},"directories":{},"maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/piece-yoke_0.4.0_1788244182076_0.42625300413440215"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-04T03:33:49.071Z","modified":"2026-09-01T06:29:42.705Z","0.0.1":"2026-08-04T03:33:49.394Z","0.0.2":"2026-08-04T03:57:13.262Z","0.1.0":"2026-08-12T04:58:57.272Z","0.1.1":"2026-08-12T20:15:08.110Z","0.2.0":"2026-08-12T21:30:39.738Z","0.2.1":"2026-08-12T21:46:15.476Z","0.2.2":"2026-08-12T21:51:47.155Z","0.3.0":"2026-08-12T21:57:24.918Z","0.4.0":"2026-09-01T06:29:42.251Z"},"bugs":{"url":"https://github.com/AttuneSolutions/activepieces/issues"},"license":"MIT","homepage":"https://www.yokecontrol.ai","keywords":["activepieces","activepieces-piece","yoke","approval","human-in-the-loop"],"repository":{"type":"git","url":"git+https://github.com/AttuneSolutions/activepieces.git","directory":"packages/pieces/community/yoke"},"description":"Activepieces piece for Yoke — read instruction documents and agent email, and gate flows on human approval.","maintainers":[{"name":"sgsimpson","email":"scott@simpson.kiwi"}],"readme":"# @attunesolutions/piece-yoke\n\nAn [Activepieces](https://www.activepieces.com) piece for [Yoke](https://www.yokecontrol.ai).\nIt reads instruction documents and agent email out of Yoke, and gates a flow on a human decision\nmade in Yoke's request queues.\n\n## Install\n\nSelf-hosted Activepieces, as a custom piece:\n\n```bash\nnpm install @attunesolutions/piece-yoke\n```\n\nOr from the Activepieces admin UI (**Platform Admin → Pieces → Install piece**) by npm package\nname:\n\n```\n@attunesolutions/piece-yoke\n```\n\nRequires Activepieces `0.86.3` or later — the approval action resumes through the\n`/confirm` waitpoint endpoint added in that release.\n\n## Connection\n\nOAuth2 client credentials, issued per Yoke integration:\n\n1. Sign in to Yoke at [app.yokecontrol.ai](https://app.yokecontrol.ai).\n2. Open **Integrations** and create one (or pick an existing one).\n3. **Generate credentials** — Yoke shows a one-time **Client ID** and **Client Secret**.\n4. Paste both into the connection.\n\nScopes requested: `instructions_read`, `request_queues_read`, `requests_write`,\n`received_emails_read`. Tokens are scoped to the Yoke account behind the integration, so no tenant\nid is needed.\n\n> ### Upgrading to 0.4.0: existing Yoke connections must be deleted and recreated\n>\n> Activepieces stores the requested scopes when a connection is created, so a connection made\n> before 0.4.0 cannot read email even after upgrading. Delete the Yoke connection, create it\n> again with the same Client ID and Secret, and reconnect it in each flow that uses it.\n>\n> Until you do, **Get Received Email** and **Find Received Emails** answer `403` with an empty\n> body — that is Yoke's Doorkeeper telling you the token lacks `received_emails_read`, not a\n> misconfigured URL.\n\nSelf-hosters pointing at a non-default Yoke deployment can set `YOKE_BASE_URL` on the worker;\nit defaults to `https://app.yokecontrol.ai`.\n\n## Actions\n\n**List Instructions** — lists instruction documents with optional title search and a single tag\nfilter. Returns `{ rows, total, page, per_page, pages }`, each row flattened (tags joined to a\nstring, owner lifted to `owner_id` / `owner_name` / `owner_email`). **Fetch All Pages** walks\nevery page and returns one combined result.\n\n**Get Instruction** — fetches one document by id from a dropdown, including `body` (raw Markdown,\nserved verbatim; can be an empty string for placeholder docs). The list action omits `body`, so\nrows from **List Instructions** carry `body: null`. Yoke no longer returns HTML — render the\nMarkdown downstream if you need it.\n\n**Request Approval in Yoke** — creates a request in a Yoke request queue, pauses the run, and\nresumes with the decision:\n\n| Type | Yoke renders | Resume yields |\n| --- | --- | --- |\n| Approval | approve / reject buttons | `approved: true \\| false` |\n| Approval with Note | the same plus a text box | `approved` + `feedback` |\n| Input | text box only | `approved: null`, `feedback` |\n\nResume output is `{ approved, action, feedback, approvalId, requestQueue }`. `approved` is\n`true` for `approve`, `false` for `reject` or `disapprove` (the latter is what Activepieces' own\nconfirmation page posts), and `null` for input submissions.\n\nThe action sends Yoke resume URLs on the `/confirm` endpoint, so a link scanner or email\nprefetch cannot consume the waitpoint — only a POST resumes the run. It also reads\n`PAUSED_FLOW_TIMEOUT_DAYS` from the instance's `/v1/flags` and passes it to Yoke as\n`paused_flow_timeout_days`, so Yoke can expire its request when the resume URL dies.\n\n**Get Received Email** — fetches one message that arrived in a Yoke agent email inbox: `text_body`,\n`html_body`, an allowlisted set of thirteen headers, and an attachment manifest. Takes the\n`rem_...` id from the webhook payload. The inbox object is flattened to `inbox_token` /\n`inbox_label` / `inbox_address` / `inbox_discarded`; `headers` stays an object and `attachments`\nstays an array so a flow can loop it. Turning **Include HTML Body** off drops `html_body` from the\nresult entirely rather than sending it as null.\n\nTwo things worth knowing before mapping it:\n\n- **A `410 content_expired` is a real answer, not a fault.** Yoke incinerates the raw message 30\n  days after arrival; the metadata row outlives it. The action lets the error through rather than\n  returning an empty result, because a silent empty result is how a flow posts a blank invoice. Use\n  continue-on-failure and `{{step['error']}}` if a 31-day-old message is expected.\n- **`attachments[].byte_size` can be null**, meaning the part is real and listed but its\n  `Content-Transfer-Encoding` is one Yoke cannot decode. Downloading that position answers `422`.\n\n**Find Received Emails** — searches message metadata: inbox, free-text over subject and sender,\nexact sender address, a received-at window, attachment presence, and Yoke's own webhook delivery\nstatus. No bodies — use **Get Received Email** for one message. Same\n`{ rows, total, page, per_page, pages }` shape as **List Instructions**, and the same **Fetch All\nPages** behaviour.\n\n`content_available` on a row is deliberately optimistic: Yoke computes it from the metadata alone,\nbecause checking storage would be a query per row. `true` can still turn into a `410`.\n\n**Custom API Call** — any other `https://app.yokecontrol.ai/api/v1` endpoint with the connection's\nbearer token applied.\n\n## Reading agent email: the flow\n\nThere is no Yoke trigger, and that is a decision rather than a gap — see **Known limitations**.\nActivepieces' own **Catch Webhook** is the trigger:\n\n```\nCatch Webhook  ->  Get Received Email  ->  (the flow's own work)\n```\n\nSet it up in this order, because Yoke rejects a URL it cannot store, so the Activepieces step has\nto exist first:\n\n1. In Activepieces, add **Catch Webhook** as the trigger and copy its URL. Copy the **bare live\n   URL** only: Yoke rejects a stored URL ending in `/test` or `/sync`, and one carrying a query\n   string.\n2. Set Catch Webhook's **Authentication** to **Header Auth**, header name `x-yoke-token`.\n3. In Yoke, open the inbox, **Configure webhook**, paste the URL, leave the mode on **Header** and\n   the header name at its `x-yoke-token` default, and copy the generated secret into Catch\n   Webhook's value field.\n4. Press Yoke's **Send test**. Yoke appends `/test` itself, which populates Catch Webhook's sample\n   data without running the flow — so you map fields against a payload Yoke actually produced.\n5. Map **Get Received Email**'s **Email ID** from `{{trigger['output'].body.email.id}}`.\n\nBasic and HMAC work too; Yoke's three auth modes were built byte-compatible with Catch Webhook's\nverifier. Header mode is documented here only because it is Yoke's default for a new webhook and\nis one value pasted once in each direction.\n\n**Nothing enforces that the two ends agree, and a mismatch is silent.** Catch Webhook cannot reject\na request: on a failed auth check it returns nothing, the engine has already answered `200`, and\nYoke records the delivery as succeeded. So if the flow stops seeing mail while Yoke says every\ndelivery succeeded, check these three, in this order:\n\n- the secret was rotated in Yoke and not updated in Catch Webhook;\n- the inbox's header name was changed away from `x-yoke-token` while Catch Webhook still looks for\n  the old one;\n- the two ends name different auth modes.\n\n**Deduplicate in the flow.** Yoke's delivery is at-least-once and Catch Webhook sets no dedupe key,\nso the same message can start two runs. Every payload carries a stable `event_id`\n(`received_email.created:rem_...`) — key your own store on that. The engine's built-in dedupe\nwindow is 30 seconds and Yoke's earliest retry is 48, so it would not have helped.\n\n## Setup notes\n\n| Setting | Why it matters |\n| --- | --- |\n| `AP_FRONTEND_URL` | must be the externally reachable URL of the instance; the resume URLs handed to Yoke are built from it. |\n| `AP_WORKER_CONCURRENCY` | a paused approval releases its worker, but the flow still occupies a run slot; keep concurrency above 1 on busy instances. |\n| `AP_PAUSED_FLOW_TIMEOUT_DAYS` | how long an unanswered approval stays resumable. Yoke treats an omitted or non-positive `paused_flow_timeout_days` as \"use my default\", so a missing flag is never an error. |\n| Yoke integration `callback_host` allow-list | must contain the host of `AP_FRONTEND_URL`. Yoke validates `approve_url` / `reject_url` / `response_url` against it and rejects a mismatch with `422 callback_host_not_allowed` — the usual symptom of a self-hosted instance Yoke has not been told about. |\n\n## Known limitations\n\n- **Loop On Items is unsupported.** Waitpoints are keyed on `(flowRunId, stepName)`, so a second\n  iteration of the same approval step in one run can collide with the first. Use one run (or a\n  sub-flow) per approval.\n- **A `404 not_found` / \"Request queue not found.\" from the approval action is a body problem, not a\n  route problem.** Yoke's strong params silently drop an unknown key, so a stale field name leaves\n  `request_queue_id` nil and the queue lookup 404s. Check the request body before the URL.\n- **Not idempotent across reruns** unless you supply an **Approval ID**. Left empty, the key is\n  derived per run (`runId:stepName`), so a rerun creates a new Yoke request.\n- **Deduplication is Yoke's.** A repeated `idempotency_key` only collapses while the earlier\n  request is still pending.\n- **No `New Email Received` trigger ships, deliberately.** An Activepieces trigger's `run` returns\n  `unknown[]` and the engine answers `200` before the body executes, so a Yoke trigger could not\n  reject a forged delivery — only discard it after Yoke had recorded the delivery as succeeded.\n  Catch Webhook has the same constraint but verifies all three of Yoke's auth modes rather than\n  one, and does not hardcode a header name the operator can change. Revisit if Activepieces ever\n  exposes a rejecting webhook response.\n- **`Fetch All Pages` on Find Received Emails is unbounded.** An account with 50,000 messages and\n  no filters is 2,000 sequential API calls inside one step, against Yoke's 300/minute per-account\n  limit. Filter first.\n- **The read API is account-wide.** `received_emails_read` grants read of every agent email inbox\n  in the Yoke account, not just the one whose webhook fired. Per-inbox isolation does not exist and\n  cannot be expressed with scopes.\n- **The attachment download endpoint has its own, lower limit** — 60 requests a minute against the\n  read endpoints' 300 — because every call re-downloads and re-parses the whole raw message to\n  reach one part. A flow that fans out over attachments hits that one first.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}