thepopebot 1.2.74 → 1.2.75-beta.2

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.
Files changed (63) hide show
  1. package/README.md +11 -0
  2. package/api/CLAUDE.md +2 -0
  3. package/api/index.js +95 -3
  4. package/bin/cli.js +1 -1
  5. package/bin/managed-paths.js +1 -1
  6. package/bin/sync.js +7 -2
  7. package/config/instrumentation.js +4 -0
  8. package/lib/chat/actions.js +4 -4
  9. package/lib/chat/components/chat-input.js +2 -2
  10. package/lib/chat/components/chat-input.jsx +2 -2
  11. package/lib/chat/components/settings-chat-page.js +41 -37
  12. package/lib/chat/components/settings-chat-page.jsx +39 -37
  13. package/lib/chat/components/settings-jobs-page.js +68 -10
  14. package/lib/chat/components/settings-jobs-page.jsx +99 -34
  15. package/lib/code/code-page.js +2 -1
  16. package/lib/code/code-page.jsx +2 -1
  17. package/lib/code/terminal-view.js +6 -3
  18. package/lib/code/terminal-view.jsx +6 -3
  19. package/lib/db/api-keys.js +35 -2
  20. package/lib/db/config.js +40 -4
  21. package/lib/maintenance.js +35 -0
  22. package/lib/oauth/helper.js +34 -0
  23. package/lib/tools/create-agent-job.js +3 -0
  24. package/lib/tools/docker.js +12 -5
  25. package/package.json +3 -2
  26. package/templates/docker-compose.custom.yml +1 -0
  27. package/templates/docker-compose.litellm.yml +1 -0
  28. package/templates/docker-compose.yml +2 -0
  29. package/templates/skills/agent-job-secrets/SKILL.md +25 -0
  30. package/templates/skills/agent-job-secrets/agent-job-secrets.js +66 -0
  31. package/templates/skills/playwright-cli/SKILL.md +294 -0
  32. package/templates/skills/brave-search/SKILL.md +0 -79
  33. package/templates/skills/brave-search/content.js +0 -86
  34. package/templates/skills/brave-search/package-lock.json +0 -621
  35. package/templates/skills/brave-search/package.json +0 -14
  36. package/templates/skills/brave-search/search.js +0 -199
  37. package/templates/skills/browser-tools/SKILL.md +0 -196
  38. package/templates/skills/browser-tools/browser-content.js +0 -103
  39. package/templates/skills/browser-tools/browser-cookies.js +0 -35
  40. package/templates/skills/browser-tools/browser-eval.js +0 -53
  41. package/templates/skills/browser-tools/browser-hn-scraper.js +0 -108
  42. package/templates/skills/browser-tools/browser-nav.js +0 -44
  43. package/templates/skills/browser-tools/browser-pick.js +0 -162
  44. package/templates/skills/browser-tools/browser-screenshot.js +0 -34
  45. package/templates/skills/browser-tools/browser-start.js +0 -87
  46. package/templates/skills/browser-tools/package-lock.json +0 -2556
  47. package/templates/skills/browser-tools/package.json +0 -19
  48. package/templates/skills/get-secret/SKILL.md +0 -34
  49. package/templates/skills/get-secret/get-secret.js +0 -33
  50. package/templates/skills/google-docs/SKILL.md +0 -23
  51. package/templates/skills/google-docs/create.sh +0 -69
  52. package/templates/skills/google-drive/SKILL.md +0 -47
  53. package/templates/skills/google-drive/delete.sh +0 -47
  54. package/templates/skills/google-drive/download.sh +0 -50
  55. package/templates/skills/google-drive/list.sh +0 -41
  56. package/templates/skills/google-drive/upload.sh +0 -76
  57. package/templates/skills/kie-ai/SKILL.md +0 -38
  58. package/templates/skills/kie-ai/generate-image.sh +0 -77
  59. package/templates/skills/kie-ai/generate-video.sh +0 -69
  60. package/templates/skills/youtube-transcript/SKILL.md +0 -41
  61. package/templates/skills/youtube-transcript/package-lock.json +0 -24
  62. package/templates/skills/youtube-transcript/package.json +0 -8
  63. package/templates/skills/youtube-transcript/transcript.js +0 -84
@@ -1,19 +0,0 @@
1
- {
2
- "name": "browser-tools",
3
- "version": "1.0.0",
4
- "type": "module",
5
- "description": "Minimal CDP tools for collaborative site exploration",
6
- "author": "Mario Zechner",
7
- "license": "MIT",
8
- "dependencies": {
9
- "@mozilla/readability": "^0.6.0",
10
- "cheerio": "^1.1.2",
11
- "jsdom": "^27.0.1",
12
- "puppeteer": "^24.31.0",
13
- "puppeteer-core": "^23.11.1",
14
- "puppeteer-extra": "^3.3.6",
15
- "puppeteer-extra-plugin-stealth": "^2.11.2",
16
- "turndown": "^7.2.2",
17
- "turndown-plugin-gfm": "^1.0.2"
18
- }
19
- }
@@ -1,34 +0,0 @@
1
- ---
2
- name: get-secret
3
- description: List available LLM-accessible credentials. Use when you need API keys, passwords, or other secrets that have been made available to you.
4
- ---
5
-
6
- # List Available Secrets
7
-
8
- ```bash
9
- skills/get-secret/get-secret.js
10
- ```
11
-
12
- Shows the names of available secret keys (not values). Output example:
13
-
14
- ```
15
- Available secrets:
16
- - BROWSER_PASSWORD
17
- - SOME_API_KEY
18
-
19
- To get a value: echo $KEY_NAME
20
- ```
21
-
22
- ## Get a Secret Value
23
-
24
- ```bash
25
- echo $KEY_NAME
26
- ```
27
-
28
- Replace `KEY_NAME` with one of the available secret names.
29
-
30
- ## When to Use
31
-
32
- - When a skill or tool needs authentication credentials
33
- - When logging into a website via browser tools
34
- - When calling an external API that requires a key
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * get-secret.js - List available agent job secret keys
5
- *
6
- * Usage: get-secret.js
7
- *
8
- * Lists the key names from AGENT_JOB_SECRETS (not the values).
9
- * To get a value, use: echo $KEY_NAME
10
- */
11
-
12
- const secretsJson = process.env.AGENT_JOB_SECRETS;
13
-
14
- if (!secretsJson) {
15
- console.log('No AGENT_JOB_SECRETS configured.');
16
- process.exit(0);
17
- }
18
-
19
- try {
20
- const parsed = JSON.parse(secretsJson);
21
- const keys = Object.keys(parsed);
22
-
23
- if (keys.length === 0) {
24
- console.log('AGENT_JOB_SECRETS is empty.');
25
- } else {
26
- console.log('Available secrets:');
27
- keys.forEach(key => console.log(` - ${key}`));
28
- console.log('\nTo get a value: echo $KEY_NAME');
29
- }
30
- } catch (e) {
31
- console.error('Error parsing AGENT_JOB_SECRETS:', e.message);
32
- process.exit(1);
33
- }
@@ -1,23 +0,0 @@
1
- ---
2
- name: google-docs
3
- description: "Create and manage Google Docs on a shared drive via service account."
4
- ---
5
-
6
- # Google Docs
7
-
8
- Create and manage Google Docs on a shared drive using a service account.
9
-
10
- ## Environment Variables
11
-
12
- - `GOOGLE_SERVICE_ACCOUNT_JSON` — Service account credentials JSON
13
- - `GOOGLE_SHARED_DRIVE_ID` — Shared drive ID
14
-
15
- ## Commands
16
-
17
- ### Create a Google Doc
18
-
19
- ```bash
20
- skills/google-docs/create.sh <title> <content> <parent_folder_id>
21
- ```
22
-
23
- Creates a new Google Doc with the given title and text content in the specified folder. Returns the document ID and URL.
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- TITLE="${1:?Usage: create.sh <title> <content> <parent_folder_id>}"
5
- CONTENT="${2:?Usage: create.sh <title> <content> <parent_folder_id>}"
6
- PARENT_FOLDER_ID="${3:?Usage: create.sh <title> <content> <parent_folder_id>}"
7
-
8
- if [ -z "${GOOGLE_SERVICE_ACCOUNT_JSON:-}" ]; then
9
- echo "Error: GOOGLE_SERVICE_ACCOUNT_JSON is not set" >&2
10
- exit 1
11
- fi
12
-
13
- # Extract service account email and private key
14
- SA_EMAIL=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.client_email')
15
- SA_KEY=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.private_key')
16
- TOKEN_URI=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.token_uri')
17
-
18
- # Build JWT with both drive and docs scopes
19
- NOW=$(date +%s)
20
- EXP=$((NOW + 3600))
21
- HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
22
- CLAIMS=$(printf '{"iss":"%s","scope":"https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/documents","aud":"%s","iat":%d,"exp":%d}' \
23
- "$SA_EMAIL" "$TOKEN_URI" "$NOW" "$EXP" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
24
- SIGNING_INPUT="${HEADER}.${CLAIMS}"
25
- SIGNATURE=$(printf '%s' "$SIGNING_INPUT" | openssl dgst -sha256 -sign <(echo "$SA_KEY") | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
26
- JWT="${SIGNING_INPUT}.${SIGNATURE}"
27
-
28
- # Exchange JWT for access token
29
- ACCESS_TOKEN=$(curl -s -X POST "$TOKEN_URI" \
30
- -H "Content-Type: application/x-www-form-urlencoded" \
31
- -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${JWT}" | jq -r '.access_token')
32
-
33
- if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then
34
- echo "Error: Failed to obtain access token" >&2
35
- exit 1
36
- fi
37
-
38
- # Create Google Doc via Drive API (creates empty doc in the shared drive)
39
- METADATA=$(jq -n --arg title "$TITLE" --arg parent "$PARENT_FOLDER_ID" \
40
- '{name: $title, mimeType: "application/vnd.google-apps.document", parents: [$parent]}')
41
-
42
- CREATE_RESPONSE=$(curl -s -X POST \
43
- "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true&includeItemsFromAllDrives=true" \
44
- -H "Authorization: Bearer ${ACCESS_TOKEN}" \
45
- -H "Content-Type: application/json" \
46
- -d "$METADATA")
47
-
48
- DOC_ID=$(echo "$CREATE_RESPONSE" | jq -r '.id')
49
- if [ -z "$DOC_ID" ] || [ "$DOC_ID" = "null" ]; then
50
- echo "Error: Failed to create document" >&2
51
- echo "$CREATE_RESPONSE" >&2
52
- exit 1
53
- fi
54
-
55
- # Insert content using Docs API batchUpdate
56
- if [ -n "$CONTENT" ]; then
57
- UPDATE_BODY=$(jq -n --arg text "$CONTENT" \
58
- '{requests: [{insertText: {location: {index: 1}, text: $text}}]}')
59
-
60
- curl -s -X POST \
61
- "https://docs.googleapis.com/v1/documents/${DOC_ID}:batchUpdate" \
62
- -H "Authorization: Bearer ${ACCESS_TOKEN}" \
63
- -H "Content-Type: application/json" \
64
- -d "$UPDATE_BODY" > /dev/null
65
- fi
66
-
67
- echo "Created Google Doc: $TITLE"
68
- echo "Doc ID: $DOC_ID"
69
- echo "URL: https://docs.google.com/document/d/${DOC_ID}/edit"
@@ -1,47 +0,0 @@
1
- ---
2
- name: google-drive
3
- description: "Interact with Google Drive shared drives via service account. Supports list, upload, download, delete operations."
4
- ---
5
-
6
- # Google Drive
7
-
8
- Interact with Google Drive shared drives using a service account.
9
-
10
- ## Environment Variables
11
-
12
- - `GOOGLE_SERVICE_ACCOUNT_JSON` — Service account credentials JSON
13
- - `GOOGLE_SHARED_DRIVE_ID` — Shared drive ID
14
-
15
- ## Commands
16
-
17
- ### List files in a folder
18
-
19
- ```bash
20
- skills/google-drive/list.sh <folder_id>
21
- ```
22
-
23
- Lists files and folders in the given folder. Use `$GOOGLE_SHARED_DRIVE_ID` for the root.
24
-
25
- ### Upload a file
26
-
27
- ```bash
28
- skills/google-drive/upload.sh <local_file> <parent_folder_id> <filename>
29
- ```
30
-
31
- Uploads a local file to the specified folder with the given name.
32
-
33
- ### Download a file
34
-
35
- ```bash
36
- skills/google-drive/download.sh <file_id> <local_path>
37
- ```
38
-
39
- Downloads a file by ID to a local path.
40
-
41
- ### Delete a file
42
-
43
- ```bash
44
- skills/google-drive/delete.sh <file_id>
45
- ```
46
-
47
- Deletes a file by ID.
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FILE_ID="${1:?Usage: delete.sh <file_id>}"
5
-
6
- if [ -z "${GOOGLE_SERVICE_ACCOUNT_JSON:-}" ]; then
7
- echo "Error: GOOGLE_SERVICE_ACCOUNT_JSON is not set" >&2
8
- exit 1
9
- fi
10
-
11
- # Extract service account email and private key
12
- SA_EMAIL=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.client_email')
13
- SA_KEY=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.private_key')
14
- TOKEN_URI=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.token_uri')
15
-
16
- # Build JWT
17
- NOW=$(date +%s)
18
- EXP=$((NOW + 3600))
19
- HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
20
- CLAIMS=$(printf '{"iss":"%s","scope":"https://www.googleapis.com/auth/drive","aud":"%s","iat":%d,"exp":%d}' \
21
- "$SA_EMAIL" "$TOKEN_URI" "$NOW" "$EXP" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
22
- SIGNING_INPUT="${HEADER}.${CLAIMS}"
23
- SIGNATURE=$(printf '%s' "$SIGNING_INPUT" | openssl dgst -sha256 -sign <(echo "$SA_KEY") | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
24
- JWT="${SIGNING_INPUT}.${SIGNATURE}"
25
-
26
- # Exchange JWT for access token
27
- ACCESS_TOKEN=$(curl -s -X POST "$TOKEN_URI" \
28
- -H "Content-Type: application/x-www-form-urlencoded" \
29
- -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${JWT}" | jq -r '.access_token')
30
-
31
- if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then
32
- echo "Error: Failed to obtain access token" >&2
33
- exit 1
34
- fi
35
-
36
- # Delete file
37
- HTTP_CODE=$(curl -s -w "%{http_code}" -o /dev/null \
38
- -X DELETE \
39
- "https://www.googleapis.com/drive/v3/files/${FILE_ID}?supportsAllDrives=true" \
40
- -H "Authorization: Bearer ${ACCESS_TOKEN}")
41
-
42
- if [ "$HTTP_CODE" -ne 204 ] && [ "$HTTP_CODE" -ne 200 ]; then
43
- echo "Error: Delete failed with HTTP $HTTP_CODE" >&2
44
- exit 1
45
- fi
46
-
47
- echo "Deleted file: $FILE_ID"
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FILE_ID="${1:?Usage: download.sh <file_id> <local_path>}"
5
- LOCAL_PATH="${2:?Usage: download.sh <file_id> <local_path>}"
6
-
7
- if [ -z "${GOOGLE_SERVICE_ACCOUNT_JSON:-}" ]; then
8
- echo "Error: GOOGLE_SERVICE_ACCOUNT_JSON is not set" >&2
9
- exit 1
10
- fi
11
-
12
- # Extract service account email and private key
13
- SA_EMAIL=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.client_email')
14
- SA_KEY=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.private_key')
15
- TOKEN_URI=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.token_uri')
16
-
17
- # Build JWT
18
- NOW=$(date +%s)
19
- EXP=$((NOW + 3600))
20
- HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
21
- CLAIMS=$(printf '{"iss":"%s","scope":"https://www.googleapis.com/auth/drive","aud":"%s","iat":%d,"exp":%d}' \
22
- "$SA_EMAIL" "$TOKEN_URI" "$NOW" "$EXP" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
23
- SIGNING_INPUT="${HEADER}.${CLAIMS}"
24
- SIGNATURE=$(printf '%s' "$SIGNING_INPUT" | openssl dgst -sha256 -sign <(echo "$SA_KEY") | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
25
- JWT="${SIGNING_INPUT}.${SIGNATURE}"
26
-
27
- # Exchange JWT for access token
28
- ACCESS_TOKEN=$(curl -s -X POST "$TOKEN_URI" \
29
- -H "Content-Type: application/x-www-form-urlencoded" \
30
- -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${JWT}" | jq -r '.access_token')
31
-
32
- if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then
33
- echo "Error: Failed to obtain access token" >&2
34
- exit 1
35
- fi
36
-
37
- # Download file
38
- HTTP_CODE=$(curl -s -w "%{http_code}" -o "$LOCAL_PATH" \
39
- "https://www.googleapis.com/drive/v3/files/${FILE_ID}?alt=media&supportsAllDrives=true&includeItemsFromAllDrives=true" \
40
- -H "Authorization: Bearer ${ACCESS_TOKEN}")
41
-
42
- if [ "$HTTP_CODE" -ne 200 ]; then
43
- echo "Error: Download failed with HTTP $HTTP_CODE" >&2
44
- cat "$LOCAL_PATH" >&2
45
- rm -f "$LOCAL_PATH"
46
- exit 1
47
- fi
48
-
49
- FILE_SIZE=$(stat -c%s "$LOCAL_PATH" 2>/dev/null || stat -f%z "$LOCAL_PATH" 2>/dev/null)
50
- echo "Downloaded to: $LOCAL_PATH ($FILE_SIZE bytes)"
@@ -1,41 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FOLDER_ID="${1:?Usage: list.sh <folder_id>}"
5
-
6
- if [ -z "${GOOGLE_SERVICE_ACCOUNT_JSON:-}" ]; then
7
- echo "Error: GOOGLE_SERVICE_ACCOUNT_JSON is not set" >&2
8
- exit 1
9
- fi
10
-
11
- # Extract service account email and private key
12
- SA_EMAIL=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.client_email')
13
- SA_KEY=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.private_key')
14
- TOKEN_URI=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.token_uri')
15
-
16
- # Build JWT
17
- NOW=$(date +%s)
18
- EXP=$((NOW + 3600))
19
- HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
20
- CLAIMS=$(printf '{"iss":"%s","scope":"https://www.googleapis.com/auth/drive","aud":"%s","iat":%d,"exp":%d}' \
21
- "$SA_EMAIL" "$TOKEN_URI" "$NOW" "$EXP" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
22
- SIGNING_INPUT="${HEADER}.${CLAIMS}"
23
- SIGNATURE=$(printf '%s' "$SIGNING_INPUT" | openssl dgst -sha256 -sign <(echo "$SA_KEY") | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
24
- JWT="${SIGNING_INPUT}.${SIGNATURE}"
25
-
26
- # Exchange JWT for access token
27
- ACCESS_TOKEN=$(curl -s -X POST "$TOKEN_URI" \
28
- -H "Content-Type: application/x-www-form-urlencoded" \
29
- -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${JWT}" | jq -r '.access_token')
30
-
31
- if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then
32
- echo "Error: Failed to obtain access token" >&2
33
- exit 1
34
- fi
35
-
36
- # List files
37
- RESPONSE=$(curl -s -X GET \
38
- "https://www.googleapis.com/drive/v3/files?q='${FOLDER_ID}'+in+parents&supportsAllDrives=true&includeItemsFromAllDrives=true&corpora=allDrives&fields=files(id,name,mimeType,size,modifiedTime)" \
39
- -H "Authorization: Bearer ${ACCESS_TOKEN}")
40
-
41
- echo "$RESPONSE" | jq -r '.files[] | "\(.id)\t\(.name)\t\(.mimeType)\t\(.size // "N/A")\t\(.modifiedTime)"' 2>/dev/null || echo "$RESPONSE"
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- LOCAL_FILE="${1:?Usage: upload.sh <local_file> <parent_folder_id> <filename>}"
5
- PARENT_FOLDER_ID="${2:?Usage: upload.sh <local_file> <parent_folder_id> <filename>}"
6
- FILENAME="${3:?Usage: upload.sh <local_file> <parent_folder_id> <filename>}"
7
-
8
- if [ ! -f "$LOCAL_FILE" ]; then
9
- echo "Error: File not found: $LOCAL_FILE" >&2
10
- exit 1
11
- fi
12
-
13
- if [ -z "${GOOGLE_SERVICE_ACCOUNT_JSON:-}" ]; then
14
- echo "Error: GOOGLE_SERVICE_ACCOUNT_JSON is not set" >&2
15
- exit 1
16
- fi
17
-
18
- # Extract service account email and private key
19
- SA_EMAIL=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.client_email')
20
- SA_KEY=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.private_key')
21
- TOKEN_URI=$(echo "$GOOGLE_SERVICE_ACCOUNT_JSON" | jq -r '.token_uri')
22
-
23
- # Build JWT
24
- NOW=$(date +%s)
25
- EXP=$((NOW + 3600))
26
- HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
27
- CLAIMS=$(printf '{"iss":"%s","scope":"https://www.googleapis.com/auth/drive","aud":"%s","iat":%d,"exp":%d}' \
28
- "$SA_EMAIL" "$TOKEN_URI" "$NOW" "$EXP" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
29
- SIGNING_INPUT="${HEADER}.${CLAIMS}"
30
- SIGNATURE=$(printf '%s' "$SIGNING_INPUT" | openssl dgst -sha256 -sign <(echo "$SA_KEY") | openssl base64 -e -A | tr '+/' '-_' | tr -d '=')
31
- JWT="${SIGNING_INPUT}.${SIGNATURE}"
32
-
33
- # Exchange JWT for access token
34
- ACCESS_TOKEN=$(curl -s -X POST "$TOKEN_URI" \
35
- -H "Content-Type: application/x-www-form-urlencoded" \
36
- -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=${JWT}" | jq -r '.access_token')
37
-
38
- if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then
39
- echo "Error: Failed to obtain access token" >&2
40
- exit 1
41
- fi
42
-
43
- # Detect MIME type from extension
44
- EXT="${LOCAL_FILE##*.}"
45
- case "${EXT,,}" in
46
- jpg|jpeg) MIME_TYPE="image/jpeg" ;;
47
- png) MIME_TYPE="image/png" ;;
48
- gif) MIME_TYPE="image/gif" ;;
49
- webp) MIME_TYPE="image/webp" ;;
50
- mp4) MIME_TYPE="video/mp4" ;;
51
- webm) MIME_TYPE="video/webm" ;;
52
- pdf) MIME_TYPE="application/pdf" ;;
53
- txt) MIME_TYPE="text/plain" ;;
54
- json) MIME_TYPE="application/json" ;;
55
- csv) MIME_TYPE="text/csv" ;;
56
- *) MIME_TYPE="application/octet-stream" ;;
57
- esac
58
-
59
- # Upload file using multipart upload
60
- METADATA=$(printf '{"name":"%s","parents":["%s"]}' "$FILENAME" "$PARENT_FOLDER_ID")
61
-
62
- RESPONSE=$(curl -s -X POST \
63
- "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true&includeItemsFromAllDrives=true" \
64
- -H "Authorization: Bearer ${ACCESS_TOKEN}" \
65
- -F "metadata=${METADATA};type=application/json" \
66
- -F "file=@${LOCAL_FILE};type=${MIME_TYPE}")
67
-
68
- FILE_ID=$(echo "$RESPONSE" | jq -r '.id')
69
- if [ -z "$FILE_ID" ] || [ "$FILE_ID" = "null" ]; then
70
- echo "Error: Upload failed" >&2
71
- echo "$RESPONSE" >&2
72
- exit 1
73
- fi
74
-
75
- echo "Uploaded: $FILENAME"
76
- echo "File ID: $FILE_ID"
@@ -1,38 +0,0 @@
1
- ---
2
- name: kie-ai
3
- description: "Generate images and videos using kie.ai API. Use for AI image and video generation tasks."
4
- ---
5
-
6
- # KIE AI
7
-
8
- Generate images and videos using the kie.ai API.
9
-
10
- ## Environment Variables
11
-
12
- - `KIE_AI_API_KEY` — API key for kie.ai
13
-
14
- ## Commands
15
-
16
- ### Generate an image
17
-
18
- ```bash
19
- skills/kie-ai/generate-image.sh <prompt> [aspect_ratio] [resolution] [output_format]
20
- ```
21
-
22
- - `prompt` (required) — Text prompt for image generation
23
- - `aspect_ratio` (optional, default: `auto`) — One of: `auto, 1:1, 1:4, 16:9, 1:8, 21:9, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16`
24
- - `resolution` (optional, default: `1K`) — One of: `1K, 2K, 4K`
25
- - `output_format` (optional, default: `jpg`) — One of: `jpg, png`
26
-
27
- Downloads the generated image to a local file and prints the path.
28
-
29
- ### Generate a video
30
-
31
- ```bash
32
- skills/kie-ai/generate-video.sh <prompt> [aspect_ratio]
33
- ```
34
-
35
- - `prompt` (required) — Text prompt for video generation
36
- - `aspect_ratio` (optional, default: `16:9`) — One of: `16:9, 9:16, Auto`
37
-
38
- Downloads the generated video to a local file and prints the path.
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- PROMPT="${1:?Usage: generate-image.sh <prompt> [aspect_ratio] [resolution] [output_format]}"
5
- ASPECT_RATIO="${2:-auto}"
6
- RESOLUTION="${3:-1K}"
7
- OUTPUT_FORMAT="${4:-jpg}"
8
-
9
- if [ -z "${KIE_AI_API_KEY:-}" ]; then
10
- echo "Error: KIE_AI_API_KEY is not set" >&2
11
- exit 1
12
- fi
13
-
14
- # Create task
15
- BODY=$(jq -n \
16
- --arg prompt "$PROMPT" \
17
- --arg ar "$ASPECT_RATIO" \
18
- --arg res "$RESOLUTION" \
19
- --arg fmt "$OUTPUT_FORMAT" \
20
- '{
21
- model: "nano-banana-2",
22
- input: {
23
- prompt: $prompt,
24
- aspect_ratio: $ar,
25
- resolution: $res,
26
- output_format: $fmt
27
- }
28
- }')
29
-
30
- echo "Creating image generation task..." >&2
31
- CREATE_RESPONSE=$(curl -s -X POST \
32
- "https://api.kie.ai/api/v1/jobs/createTask" \
33
- -H "Authorization: Bearer ${KIE_AI_API_KEY}" \
34
- -H "Content-Type: application/json" \
35
- -d "$BODY")
36
-
37
- TASK_ID=$(echo "$CREATE_RESPONSE" | jq -r '.data.taskId // .taskId // empty')
38
- if [ -z "$TASK_ID" ]; then
39
- echo "Error: Failed to create task" >&2
40
- echo "$CREATE_RESPONSE" >&2
41
- exit 1
42
- fi
43
-
44
- echo "Task ID: $TASK_ID — polling for completion..." >&2
45
-
46
- # Poll for completion
47
- while true; do
48
- sleep 15
49
- STATUS_RESPONSE=$(curl -s -X GET \
50
- "https://api.kie.ai/api/v1/jobs/recordInfo?taskId=${TASK_ID}" \
51
- -H "Authorization: Bearer ${KIE_AI_API_KEY}" \
52
- -H "Content-Type: application/json")
53
-
54
- STATE=$(echo "$STATUS_RESPONSE" | jq -r '.data.state // empty')
55
- echo "State: $STATE" >&2
56
-
57
- if [ "$STATE" = "success" ]; then
58
- # .data.resultJson is a JSON string — parse it, then get .resultUrls[0]
59
- IMAGE_URL=$(echo "$STATUS_RESPONSE" | jq -r '.data.resultJson' | jq -r '.resultUrls[0]')
60
- if [ -z "$IMAGE_URL" ] || [ "$IMAGE_URL" = "null" ]; then
61
- echo "Error: Could not extract image URL" >&2
62
- echo "$STATUS_RESPONSE" >&2
63
- exit 1
64
- fi
65
-
66
- # Download
67
- OUTPUT_FILE="/tmp/kie-image-${TASK_ID}.${OUTPUT_FORMAT}"
68
- curl -s -o "$OUTPUT_FILE" "$IMAGE_URL"
69
- FILE_SIZE=$(stat -c%s "$OUTPUT_FILE" 2>/dev/null || stat -f%z "$OUTPUT_FILE" 2>/dev/null)
70
- echo "Image downloaded: $OUTPUT_FILE ($FILE_SIZE bytes)"
71
- exit 0
72
- elif [ "$STATE" = "failed" ] || [ "$STATE" = "error" ]; then
73
- echo "Error: Image generation failed" >&2
74
- echo "$STATUS_RESPONSE" >&2
75
- exit 1
76
- fi
77
- done
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- PROMPT="${1:?Usage: generate-video.sh <prompt> [aspect_ratio]}"
5
- ASPECT_RATIO="${2:-16:9}"
6
-
7
- if [ -z "${KIE_AI_API_KEY:-}" ]; then
8
- echo "Error: KIE_AI_API_KEY is not set" >&2
9
- exit 1
10
- fi
11
-
12
- # Create task
13
- BODY=$(jq -n \
14
- --arg prompt "$PROMPT" \
15
- --arg ar "$ASPECT_RATIO" \
16
- '{
17
- prompt: $prompt,
18
- model: "veo3_fast",
19
- generationType: "TEXT_2_VIDEO",
20
- aspect_ratio: $ar
21
- }')
22
-
23
- echo "Creating video generation task..." >&2
24
- CREATE_RESPONSE=$(curl -s -X POST \
25
- "https://api.kie.ai/api/v1/veo/generate" \
26
- -H "Authorization: Bearer ${KIE_AI_API_KEY}" \
27
- -H "Content-Type: application/json" \
28
- -d "$BODY")
29
-
30
- TASK_ID=$(echo "$CREATE_RESPONSE" | jq -r '.data.taskId // .taskId // empty')
31
- if [ -z "$TASK_ID" ]; then
32
- echo "Error: Failed to create task" >&2
33
- echo "$CREATE_RESPONSE" >&2
34
- exit 1
35
- fi
36
-
37
- echo "Task ID: $TASK_ID — polling for completion..." >&2
38
-
39
- # Poll for completion
40
- while true; do
41
- sleep 15
42
- STATUS_RESPONSE=$(curl -s -X GET \
43
- "https://api.kie.ai/api/v1/veo/record-info?taskId=${TASK_ID}" \
44
- -H "Authorization: Bearer ${KIE_AI_API_KEY}" \
45
- -H "Content-Type: application/json")
46
-
47
- SUCCESS_FLAG=$(echo "$STATUS_RESPONSE" | jq -r '.data.successFlag // empty')
48
- echo "Status check... successFlag=$SUCCESS_FLAG" >&2
49
-
50
- if [ "$SUCCESS_FLAG" = "1" ]; then
51
- VIDEO_URL=$(echo "$STATUS_RESPONSE" | jq -r '.data.response.resultUrls[0]')
52
- if [ -z "$VIDEO_URL" ] || [ "$VIDEO_URL" = "null" ]; then
53
- echo "Error: Could not extract video URL" >&2
54
- echo "$STATUS_RESPONSE" >&2
55
- exit 1
56
- fi
57
-
58
- # Download
59
- OUTPUT_FILE="/tmp/kie-video-${TASK_ID}.mp4"
60
- curl -s -o "$OUTPUT_FILE" "$VIDEO_URL"
61
- FILE_SIZE=$(stat -c%s "$OUTPUT_FILE" 2>/dev/null || stat -f%z "$OUTPUT_FILE" 2>/dev/null)
62
- echo "Video downloaded: $OUTPUT_FILE ($FILE_SIZE bytes)"
63
- exit 0
64
- elif [ "$SUCCESS_FLAG" = "-1" ]; then
65
- echo "Error: Video generation failed" >&2
66
- echo "$STATUS_RESPONSE" >&2
67
- exit 1
68
- fi
69
- done
@@ -1,41 +0,0 @@
1
- ---
2
- name: youtube-transcript
3
- description: Fetch transcripts from YouTube videos for summarization and analysis.
4
- ---
5
-
6
- # YouTube Transcript
7
-
8
- Fetch transcripts from YouTube videos.
9
-
10
- ## Setup
11
-
12
- ```bash
13
- cd skills/youtube-transcript
14
- npm install
15
- ```
16
-
17
- ## Usage
18
-
19
- ```bash
20
- skills/youtube-transcript/transcript.js <video-id-or-url>
21
- ```
22
-
23
- Accepts video ID or full URL:
24
- - `EBw7gsDPAYQ`
25
- - `https://www.youtube.com/watch?v=EBw7gsDPAYQ`
26
- - `https://youtu.be/EBw7gsDPAYQ`
27
-
28
- ## Output
29
-
30
- Timestamped transcript entries:
31
-
32
- ```
33
- [0:00] All right. So, I got this UniFi Theta
34
- [0:15] I took the camera out, painted it
35
- [1:23] And here's the final result
36
- ```
37
-
38
- ## Notes
39
-
40
- - Requires the video to have captions/transcripts available
41
- - Works with auto-generated and manual transcripts