Skip to content

Commit 56288d2

Browse files
Merge branch 'master' into fix/app-business-reviews-sdk-v2
2 parents a29aa0b + f40054c commit 56288d2

58 files changed

Lines changed: 8641 additions & 8056 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,7 @@
6666
# -- Gong --
6767
# GONG_ACCESS_KEY=
6868
# GONG_ACCESS_KEY_SECRET=
69+
# -- Supadata --
70+
# SUPADATA_API_KEY=
71+
# -- LinkedIn --
72+
# LINKEDIN_ACCESS_TOKEN=
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
name: Validate Integration Comment
2+
3+
# Posts the validation-results comment to the PR.
4+
#
5+
# Why a separate workflow?
6+
# ------------------------
7+
# When a pull request is opened from a fork, GitHub deliberately downgrades
8+
# the GITHUB_TOKEN provided to `pull_request`-triggered workflows to
9+
# read-only — even if the workflow declares `permissions: pull-requests:
10+
# write`. That means the validation workflow can't post a sticky comment
11+
# directly on fork PRs.
12+
#
13+
# This companion workflow runs on `workflow_run` (which executes in the
14+
# base repository's context with normal token permissions) and posts the
15+
# comment using the artifact uploaded by validate-integration.yml.
16+
#
17+
# See: https://docs.github.com/actions/security-guides/automatic-token-authentication
18+
19+
on:
20+
workflow_run:
21+
workflows: ['Validate Integration (Tooling)']
22+
types: [completed]
23+
24+
jobs:
25+
comment:
26+
runs-on: ubuntu-latest
27+
if: github.event.workflow_run.event == 'pull_request'
28+
permissions:
29+
pull-requests: write
30+
actions: read
31+
steps:
32+
- name: Resolve PR number
33+
id: pr
34+
shell: bash
35+
env:
36+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
37+
REPO: ${{ github.repository }}
38+
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
39+
# workflow_run.pull_requests is populated for same-repo PRs but
40+
# is empty for fork PRs (the head SHA is in a different repo).
41+
INLINE_PR: ${{ github.event.workflow_run.pull_requests[0].number }}
42+
# head_repository / head_branch are populated for both same-repo
43+
# and fork PRs and come from the workflow_run event payload, so
44+
# they're trustworthy (not influenceable by runner code).
45+
HEAD_REPO: ${{ github.event.workflow_run.head_repository.full_name }}
46+
HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
47+
run: |
48+
set -euo pipefail
49+
# All inputs below come from the workflow_run event payload —
50+
# they cannot be influenced by code that ran on the original
51+
# runner. Never read the PR number from the artifact: the
52+
# validation job executes fork-controlled code (pytest,
53+
# imported integration modules), so any file it produces must
54+
# be treated as untrusted.
55+
PR="$INLINE_PR"
56+
if [ -z "$PR" ] || [ "$PR" = "null" ]; then
57+
# Fork PR: pull_requests array is empty (the head SHA lives
58+
# in a different repo, and /commits/{sha}/pulls doesn't
59+
# index fork commits). Look up the open PR by its head
60+
# (user:branch) — this pair uniquely identifies an open PR
61+
# in this repo.
62+
HEAD_USER="${HEAD_REPO%%/*}"
63+
PR=$(gh api "repos/$REPO/pulls?state=open&head=$HEAD_USER:$HEAD_BRANCH&per_page=10" \
64+
--jq ".[] | select(.head.repo.full_name == \"$HEAD_REPO\" and .head.ref == \"$HEAD_BRANCH\") | .number" \
65+
| head -1)
66+
fi
67+
if [ -z "$PR" ]; then
68+
echo "::error::Could not resolve PR for $HEAD_REPO:$HEAD_BRANCH (head SHA $HEAD_SHA)"
69+
exit 1
70+
fi
71+
echo "number=$PR" >> "$GITHUB_OUTPUT"
72+
73+
- name: Download comment artifact
74+
uses: actions/download-artifact@v4
75+
with:
76+
name: validation-comment
77+
run-id: ${{ github.event.workflow_run.id }}
78+
github-token: ${{ secrets.GITHUB_TOKEN }}
79+
path: validation-artifact
80+
81+
- name: Determine action
82+
id: meta
83+
shell: bash
84+
run: |
85+
set -euo pipefail
86+
if [ -f validation-artifact/delete.marker ]; then
87+
echo "action=delete" >> "$GITHUB_OUTPUT"
88+
elif [ -f validation-artifact/comment.md ]; then
89+
echo "action=post" >> "$GITHUB_OUTPUT"
90+
else
91+
echo "::error::Artifact missing both comment.md and delete.marker"
92+
exit 1
93+
fi
94+
95+
- name: Delete stale comment
96+
if: steps.meta.outputs.action == 'delete'
97+
uses: marocchino/sticky-pull-request-comment@v2
98+
with:
99+
number: ${{ steps.pr.outputs.number }}
100+
header: validation-results
101+
delete: true
102+
103+
- name: Post sticky comment
104+
if: steps.meta.outputs.action == 'post'
105+
uses: marocchino/sticky-pull-request-comment@v2
106+
with:
107+
number: ${{ steps.pr.outputs.number }}
108+
header: validation-results
109+
path: validation-artifact/comment.md

.github/workflows/validate-integration.yml

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,53 @@ jobs:
1010
name: Validate Integration
1111
permissions:
1212
contents: read
13-
pull-requests: write
1413
steps:
1514
- name: Checkout code
1615
uses: actions/checkout@v4
1716
with:
1817
fetch-depth: 0
1918

2019
- name: Validate
20+
id: validate
2121
uses: autohive-ai/autohive-integrations-tooling@v2
2222
with:
2323
base_ref: origin/${{ github.base_ref }}
24+
# Don't post directly: pull_request workflows triggered from forks
25+
# run with a read-only GITHUB_TOKEN, so the comment would 403 and
26+
# the job would go red even when validation passed. Instead we
27+
# upload the rendered comment as an artifact and let
28+
# validate-integration-comment.yml post it from base-repo context.
29+
post_comment: 'false'
30+
31+
- name: Stage comment artifact
32+
if: always()
33+
shell: bash
34+
env:
35+
COMMENT_PATH: ${{ steps.validate.outputs.comment_path }}
36+
run: |
37+
set -euo pipefail
38+
mkdir -p validation-artifact
39+
# Note: the PR number is intentionally NOT written to the artifact.
40+
# This step runs after the validation pipeline has executed fork
41+
# tests / fork-imported code on the runner, so anything written
42+
# here must be considered untrusted by the companion workflow.
43+
# The companion derives the target PR from the trusted
44+
# workflow_run event payload (and a GitHub API lookup as the
45+
# fork-PR fallback) instead of trusting an artifact value.
46+
if [ -n "$COMMENT_PATH" ] && [ -f "$COMMENT_PATH" ]; then
47+
cp "$COMMENT_PATH" validation-artifact/comment.md
48+
else
49+
# No integration directories changed (or the action bailed out
50+
# before rendering). Tell the companion workflow to clear any
51+
# stale comment instead of posting a new one.
52+
: > validation-artifact/delete.marker
53+
fi
54+
55+
- name: Upload comment artifact
56+
if: always()
57+
uses: actions/upload-artifact@v4
58+
with:
59+
name: validation-comment
60+
path: validation-artifact/
61+
if-no-files-found: error
62+
retention-days: 1

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ Supports basic HTTP authentication and Bearer token authentication via the SDK.
7777

7878
### ElevenLabs
7979

80-
[elevenlabs](elevenlabs): Text-to-speech integration with ElevenLabs API for voice generation and audio management. Supports converting text to realistic speech with customizable voice settings, browsing and filtering available voices by category and use case, accessing voice metadata and settings, tracking generation history, downloading previously generated audio files, and monitoring subscription usage and credits. Features 7 actions (1 paid, 6 free), API key authentication, multiple output formats (MP3, PCM), voice customization controls (stability, similarity, style), and base64-encoded audio file outputs. Includes 20 premade professional voices with various accents. Ideal for content creation, audiobook narration, voiceovers, and automated audio generation workflows.
80+
[elevenlabs](elevenlabs): Text-to-speech and speech-to-text integration with ElevenLabs API for voice generation, audio transcription, and audio management. Supports converting text to realistic speech with customizable voice settings, transcribing audio/video files using ElevenLabs Scribe with word-level timestamps and speaker diarization, browsing voices, managing transcripts, and monitoring subscription usage. Features 10 actions (1 paid, 9 free) covering text-to-speech, speech-to-text, voice management, history, and account. Uses API key authentication. Ideal for content creation, audiobook narration, voiceovers, meeting transcription, and automated audio/transcription workflows.
8181

8282
### Fergus
8383

doc-maker/config.json

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Doc Maker",
3-
"version": "1.0.0",
3+
"version": "2.0.0",
44
"description": "Word document automation integration using python-docx with markdown-first content creation. AI agents should use markdown syntax for most content creation - headings (#), paragraphs, lists (- or 1.), formatting (**bold**, *italic*), tables, blockquotes (>), and code blocks. Only use non-markdown actions for images, page breaks, or when you need direct table creation with structured data arrays.",
55
"entry_point": "doc_maker.py",
66
"actions": {
@@ -92,10 +92,6 @@
9292
"name",
9393
"contentType"
9494
]
95-
},
96-
"error": {
97-
"type": "string",
98-
"description": "Error message if file streaming failed"
9995
}
10096
},
10197
"required": [
@@ -195,10 +191,6 @@
195191
"name",
196192
"contentType"
197193
]
198-
},
199-
"error": {
200-
"type": "string",
201-
"description": "Error message if file streaming failed"
202194
}
203195
},
204196
"required": [
@@ -311,10 +303,6 @@
311303
"name",
312304
"contentType"
313305
]
314-
},
315-
"error": {
316-
"type": "string",
317-
"description": "Error message if file streaming failed"
318306
}
319307
},
320308
"required": [
@@ -413,10 +401,6 @@
413401
"name",
414402
"contentType"
415403
]
416-
},
417-
"error": {
418-
"type": "string",
419-
"description": "Error message if file streaming failed"
420404
}
421405
},
422406
"required": [
@@ -502,10 +486,6 @@
502486
"name",
503487
"contentType"
504488
]
505-
},
506-
"error": {
507-
"type": "string",
508-
"description": "Error message if file streaming failed"
509489
}
510490
},
511491
"required": [
@@ -1117,10 +1097,6 @@
11171097
"name",
11181098
"contentType"
11191099
]
1120-
},
1121-
"error": {
1122-
"type": "string",
1123-
"description": "Error message if save failed"
11241100
}
11251101
},
11261102
"required": [

0 commit comments

Comments
 (0)