crewly 1.5.11 → 1.5.13
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/config/constants.ts +3 -3
- package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +73 -0
- package/config/roles/architect/prompt.md +9 -0
- package/config/roles/backend-developer/prompt.md +9 -0
- package/config/roles/content-strategist/prompt.md +10 -0
- package/config/roles/designer/prompt.md +9 -0
- package/config/roles/developer/prompt.md +9 -0
- package/config/roles/frontend-developer/prompt.md +9 -0
- package/config/roles/fullstack-dev/prompt.md +9 -0
- package/config/roles/generalist/prompt.md +9 -0
- package/config/roles/ops/prompt.md +9 -0
- package/config/roles/product-manager/prompt.md +9 -0
- package/config/roles/qa/prompt.md +9 -0
- package/config/roles/qa-engineer/prompt.md +9 -0
- package/config/roles/researcher/prompt.md +9 -0
- package/config/roles/sales/prompt.md +9 -0
- package/config/roles/support/prompt.md +9 -0
- package/config/roles/team-leader/prompt.md +11 -0
- package/config/roles/tpm/prompt.md +9 -0
- package/config/roles/ux-designer/prompt.md +9 -0
- package/config/skills/_common/lib.sh +31 -0
- package/config/skills/_common/lib.test.sh +164 -0
- package/config/skills/agent/core/block-task/execute.sh +3 -1
- package/config/skills/agent/core/pipe-to-sink/execute.sh +41 -0
- package/config/skills/agent/core/read-task/execute.sh +3 -1
- package/config/skills/agent/core/report-progress/execute.sh +3 -1
- package/config/skills/agent/screenshot-compare/SKILL.md +75 -0
- package/config/skills/agent/screenshot-compare/execute.sh +182 -0
- package/config/skills/agent/screenshot-compare/skill.json +10 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +85 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +306 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +10 -0
- package/config/skills/orchestrator/cancel-cron/SKILL.md +44 -0
- package/config/skills/orchestrator/create-cron/SKILL.md +58 -0
- package/config/skills/orchestrator/list-cron/SKILL.md +51 -0
- package/config/skills/orchestrator/update-cron/SKILL.md +52 -0
- package/dist/backend/backend/src/constants.d.ts +7 -4
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +6 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +21 -2
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +167 -29
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +7 -3
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/data/data.controller.d.ts +47 -0
- package/dist/backend/backend/src/controllers/data/data.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.controller.js +201 -0
- package/dist/backend/backend/src/controllers/data/data.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/data/data.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.routes.js +44 -0
- package/dist/backend/backend/src/controllers/data/data.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts +3 -2
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js +5 -3
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts +4 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js +20 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +18 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts +32 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.js +61 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +7 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +37 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -1
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +6 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +17 -2
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +2 -2
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/task-planning.service.d.ts +134 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.js +291 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts +11 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +47 -18
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +47 -4
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +13 -9
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +44 -12
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +176 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +441 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +162 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +350 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +27 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +2 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/core/team-export.service.d.ts +103 -0
- package/dist/backend/backend/src/services/core/team-export.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/team-export.service.js +182 -0
- package/dist/backend/backend/src/services/core/team-export.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.d.ts +160 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.js +434 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/data-object.types.d.ts +190 -0
- package/dist/backend/backend/src/services/data/data-object.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/data-object.types.js +143 -0
- package/dist/backend/backend/src/services/data/data-object.types.js.map +1 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.d.ts +108 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.js +290 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.d.ts +87 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.js +188 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-router.service.js +7 -0
- package/dist/backend/backend/src/services/messaging/message-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +55 -2
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +89 -5
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +105 -14
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +400 -123
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/cron-task.types.d.ts +1 -1
- package/dist/backend/backend/src/types/data-object.types.d.ts +117 -0
- package/dist/backend/backend/src/types/data-object.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/data-object.types.js +23 -0
- package/dist/backend/backend/src/types/data-object.types.js.map +1 -0
- package/dist/backend/backend/src/types/settings.types.js +1 -1
- package/dist/backend/config/constants.d.ts +3 -3
- package/dist/backend/config/constants.js +3 -3
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +7 -4
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +6 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +1 -1
- package/dist/cli/config/constants.d.ts +3 -3
- package/dist/cli/config/constants.js +3 -3
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-371b68d4.css +33 -0
- package/frontend/dist/assets/{index-9af2ea40.js → index-506f70da.js} +321 -321
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-b19b2478.css +0 -33
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 小宇宙 Podcast Transcript — Extract and transcribe podcast episodes
|
|
3
|
+
#
|
|
4
|
+
# Pipeline: URL → HTML → audio URL → download → ffmpeg split → Gemini per-chunk → merge
|
|
5
|
+
#
|
|
6
|
+
# Long podcasts (>15min) are split into 10-minute chunks via ffmpeg,
|
|
7
|
+
# each chunk is uploaded and transcribed separately, then merged.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# bash execute.sh '{"url":"https://www.xiaoyuzhoufm.com/episode/69bbc8ea3c625cc5ae21b461"}'
|
|
11
|
+
# bash execute.sh '{"url":"...","outputFile":"/path/to/transcript.md"}'
|
|
12
|
+
# bash execute.sh '{"audioFile":"/path/to/local.m4a"}'
|
|
13
|
+
#
|
|
14
|
+
# Requires: GEMINI_API_KEY, ffmpeg, curl, jq
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
# ── Configuration ──────────────────────────────────────────────────────────────
|
|
19
|
+
MODEL="${GEMINI_MODEL:-gemini-2.0-flash}"
|
|
20
|
+
GEMINI_API_BASE="https://generativelanguage.googleapis.com"
|
|
21
|
+
GEMINI_UPLOAD_URL="${GEMINI_API_BASE}/upload/v1beta/files"
|
|
22
|
+
GEMINI_CONTENT_URL="${GEMINI_API_BASE}/v1beta/models/${MODEL}:generateContent"
|
|
23
|
+
MAX_WAIT_SECONDS=300
|
|
24
|
+
CHUNK_DURATION_SECONDS=600 # 10 minutes per chunk
|
|
25
|
+
|
|
26
|
+
# ── Input parsing ──────────────────────────────────────────────────────────────
|
|
27
|
+
INPUT="${1:-}"
|
|
28
|
+
if [ -z "$INPUT" ]; then
|
|
29
|
+
echo '{"success":false,"error":"Usage: execute.sh \u0027{\"url\":\"https://www.xiaoyuzhoufm.com/episode/...\"}\u0027"}'
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
URL=$(echo "$INPUT" | jq -r '.url // empty')
|
|
34
|
+
AUDIO_FILE=$(echo "$INPUT" | jq -r '.audioFile // empty')
|
|
35
|
+
OUTPUT_FILE=$(echo "$INPUT" | jq -r '.outputFile // empty')
|
|
36
|
+
LANGUAGE=$(echo "$INPUT" | jq -r '.language // "auto"')
|
|
37
|
+
|
|
38
|
+
if [ -z "$URL" ] && [ -z "$AUDIO_FILE" ]; then
|
|
39
|
+
echo '{"success":false,"error":"Either url or audioFile is required"}'
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# ── Dependency check ───────────────────────────────────────────────────────────
|
|
44
|
+
if ! command -v ffmpeg >/dev/null 2>&1; then
|
|
45
|
+
echo '{"success":false,"error":"ffmpeg is required but not installed. Install via: brew install ffmpeg"}'
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# ── API key resolution ─────────────────────────────────────────────────────────
|
|
50
|
+
if [ -z "${GEMINI_API_KEY:-}" ]; then
|
|
51
|
+
GEMINI_API_KEY=$(curl -sf "http://localhost:8787/api/settings" 2>/dev/null \
|
|
52
|
+
| jq -r '.data.apiKeys.global.gemini // empty' 2>/dev/null || true)
|
|
53
|
+
fi
|
|
54
|
+
if [ -z "${GEMINI_API_KEY:-}" ]; then
|
|
55
|
+
echo '{"success":false,"error":"GEMINI_API_KEY not set. Set via environment or Settings > API Keys."}'
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# ── Temp directory with auto-cleanup ───────────────────────────────────────────
|
|
60
|
+
TMPDIR_WORK=$(mktemp -d /tmp/xiaoyuzhoufm-XXXXXX)
|
|
61
|
+
cleanup() { rm -rf "$TMPDIR_WORK"; }
|
|
62
|
+
trap cleanup EXIT
|
|
63
|
+
|
|
64
|
+
# ── Step 1: Extract audio URL from 小宇宙 page ────────────────────────────────
|
|
65
|
+
TITLE="Unknown Episode"
|
|
66
|
+
AUDIO_URL=""
|
|
67
|
+
|
|
68
|
+
if [ -n "$URL" ] && [ -z "$AUDIO_FILE" ]; then
|
|
69
|
+
echo '{"status":"fetching","message":"Fetching episode page..."}' >&2
|
|
70
|
+
|
|
71
|
+
HTML_FILE="${TMPDIR_WORK}/page.html"
|
|
72
|
+
curl -sL -o "$HTML_FILE" \
|
|
73
|
+
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
|
|
74
|
+
"$URL" 2>/dev/null
|
|
75
|
+
|
|
76
|
+
if [ ! -s "$HTML_FILE" ]; then
|
|
77
|
+
echo '{"success":false,"error":"Failed to fetch episode page"}'
|
|
78
|
+
exit 1
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
TITLE=$(grep -o '<title>[^<]*</title>' "$HTML_FILE" \
|
|
82
|
+
| sed 's/<title>//;s/<\/title>//' \
|
|
83
|
+
| sed 's/ - .* | 小宇宙.*//' \
|
|
84
|
+
| head -1)
|
|
85
|
+
[ -z "$TITLE" ] && TITLE="Unknown Episode"
|
|
86
|
+
|
|
87
|
+
AUDIO_URL=$(grep -oE 'https://media\.xyzcdn\.net/[^"]*\.(m4a|mp3|aac|ogg)' "$HTML_FILE" | head -1)
|
|
88
|
+
if [ -z "$AUDIO_URL" ]; then
|
|
89
|
+
AUDIO_URL=$(grep -oE 'https://[^"]*\.(m4a|mp3|aac|ogg)' "$HTML_FILE" | grep -v 'apple\|google\|spotify' | head -1)
|
|
90
|
+
fi
|
|
91
|
+
if [ -z "$AUDIO_URL" ]; then
|
|
92
|
+
echo '{"success":false,"error":"Could not find audio URL in page HTML"}'
|
|
93
|
+
exit 1
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
echo "{\"status\":\"downloading\",\"message\":\"Downloading audio...\",\"title\":$(echo "$TITLE" | jq -Rs .)}" >&2
|
|
97
|
+
|
|
98
|
+
AUDIO_FILE="${TMPDIR_WORK}/audio.m4a"
|
|
99
|
+
curl -sL -o "$AUDIO_FILE" \
|
|
100
|
+
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
|
|
101
|
+
-H "Referer: https://www.xiaoyuzhoufm.com/" \
|
|
102
|
+
"$AUDIO_URL" 2>/dev/null
|
|
103
|
+
|
|
104
|
+
if [ ! -s "$AUDIO_FILE" ]; then
|
|
105
|
+
echo '{"success":false,"error":"Failed to download audio file"}'
|
|
106
|
+
exit 1
|
|
107
|
+
fi
|
|
108
|
+
AUDIO_SIZE=$(wc -c < "$AUDIO_FILE" | tr -d ' ')
|
|
109
|
+
echo "{\"status\":\"downloaded\",\"message\":\"Audio downloaded (${AUDIO_SIZE} bytes)\"}" >&2
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
if [ ! -f "$AUDIO_FILE" ]; then
|
|
113
|
+
echo "{\"success\":false,\"error\":\"Audio file not found: ${AUDIO_FILE}\"}"
|
|
114
|
+
exit 1
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# ── Step 2: Get duration and split into chunks ─────────────────────────────────
|
|
118
|
+
DURATION_SECS=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$AUDIO_FILE" 2>/dev/null | cut -d. -f1)
|
|
119
|
+
DURATION_SECS=${DURATION_SECS:-0}
|
|
120
|
+
|
|
121
|
+
CHUNKS_DIR="${TMPDIR_WORK}/chunks"
|
|
122
|
+
mkdir -p "$CHUNKS_DIR"
|
|
123
|
+
|
|
124
|
+
if [ "$DURATION_SECS" -gt "$CHUNK_DURATION_SECONDS" ]; then
|
|
125
|
+
NUM_CHUNKS=$(( (DURATION_SECS + CHUNK_DURATION_SECONDS - 1) / CHUNK_DURATION_SECONDS ))
|
|
126
|
+
echo "{\"status\":\"splitting\",\"message\":\"Splitting ${DURATION_SECS}s audio into ${NUM_CHUNKS} chunks of ${CHUNK_DURATION_SECONDS}s...\"}" >&2
|
|
127
|
+
|
|
128
|
+
ffmpeg -i "$AUDIO_FILE" -f segment -segment_time "$CHUNK_DURATION_SECONDS" \
|
|
129
|
+
-c copy -reset_timestamps 1 \
|
|
130
|
+
"${CHUNKS_DIR}/chunk_%03d.m4a" 2>/dev/null
|
|
131
|
+
|
|
132
|
+
CHUNK_FILES=$(ls "${CHUNKS_DIR}"/chunk_*.m4a 2>/dev/null | sort)
|
|
133
|
+
else
|
|
134
|
+
# Short audio — single chunk
|
|
135
|
+
cp "$AUDIO_FILE" "${CHUNKS_DIR}/chunk_000.m4a"
|
|
136
|
+
CHUNK_FILES="${CHUNKS_DIR}/chunk_000.m4a"
|
|
137
|
+
NUM_CHUNKS=1
|
|
138
|
+
echo "{\"status\":\"splitting\",\"message\":\"Short audio (${DURATION_SECS}s), no splitting needed.\"}" >&2
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# ── Helpers: upload + transcribe a single chunk ────────────────────────────────
|
|
142
|
+
|
|
143
|
+
# Determine MIME type from file extension
|
|
144
|
+
get_mime() {
|
|
145
|
+
case "${1##*.}" in
|
|
146
|
+
mp3) echo "audio/mpeg" ;; m4a) echo "audio/mp4" ;; aac) echo "audio/aac" ;;
|
|
147
|
+
ogg) echo "audio/ogg" ;; wav) echo "audio/wav" ;; *) echo "audio/mp4" ;;
|
|
148
|
+
esac
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
upload_and_wait() {
|
|
152
|
+
local filepath="$1"
|
|
153
|
+
local mime_type="$2"
|
|
154
|
+
local file_size
|
|
155
|
+
file_size=$(wc -c < "$filepath" | tr -d ' ')
|
|
156
|
+
local display_name
|
|
157
|
+
display_name=$(basename "$filepath")
|
|
158
|
+
|
|
159
|
+
# Resumable upload: init
|
|
160
|
+
local init_resp
|
|
161
|
+
init_resp=$(curl -s -D- -X POST \
|
|
162
|
+
"${GEMINI_UPLOAD_URL}?key=${GEMINI_API_KEY}" \
|
|
163
|
+
-H "X-Goog-Upload-Protocol: resumable" \
|
|
164
|
+
-H "X-Goog-Upload-Command: start" \
|
|
165
|
+
-H "X-Goog-Upload-Header-Content-Length: ${file_size}" \
|
|
166
|
+
-H "X-Goog-Upload-Header-Content-Type: ${mime_type}" \
|
|
167
|
+
-H "Content-Type: application/json" \
|
|
168
|
+
-d "{\"file\":{\"display_name\":\"${display_name}\"}}" 2>&1)
|
|
169
|
+
|
|
170
|
+
local upload_url
|
|
171
|
+
upload_url=$(echo "$init_resp" | grep -i 'x-goog-upload-url:' | sed 's/.*: //' | tr -d '\r')
|
|
172
|
+
[ -z "$upload_url" ] && { echo ""; return 1; }
|
|
173
|
+
|
|
174
|
+
# Resumable upload: send bytes
|
|
175
|
+
local upload_resp
|
|
176
|
+
upload_resp=$(curl -s -X POST "$upload_url" \
|
|
177
|
+
-H "X-Goog-Upload-Offset: 0" \
|
|
178
|
+
-H "X-Goog-Upload-Command: upload, finalize" \
|
|
179
|
+
-H "Content-Type: ${mime_type}" \
|
|
180
|
+
--data-binary "@${filepath}" 2>&1)
|
|
181
|
+
|
|
182
|
+
local file_uri file_name
|
|
183
|
+
file_uri=$(echo "$upload_resp" | jq -r '.file.uri // empty' 2>/dev/null)
|
|
184
|
+
file_name=$(echo "$upload_resp" | jq -r '.file.name // empty' 2>/dev/null)
|
|
185
|
+
[ -z "$file_uri" ] && { echo ""; return 1; }
|
|
186
|
+
|
|
187
|
+
# Poll until ACTIVE
|
|
188
|
+
local state="PROCESSING" waited=0
|
|
189
|
+
while [ "$state" = "PROCESSING" ] && [ "$waited" -lt "$MAX_WAIT_SECONDS" ]; do
|
|
190
|
+
sleep 3
|
|
191
|
+
waited=$((waited + 3))
|
|
192
|
+
state=$(curl -s "${GEMINI_API_BASE}/v1beta/${file_name}?key=${GEMINI_API_KEY}" \
|
|
193
|
+
| jq -r '.state // "PROCESSING"' 2>/dev/null)
|
|
194
|
+
done
|
|
195
|
+
|
|
196
|
+
[ "$state" != "ACTIVE" ] && { echo ""; return 1; }
|
|
197
|
+
echo "$file_uri"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
transcribe_chunk() {
|
|
201
|
+
local file_uri="$1"
|
|
202
|
+
local mime_type="$2"
|
|
203
|
+
local chunk_index="$3"
|
|
204
|
+
local total_chunks="$4"
|
|
205
|
+
|
|
206
|
+
local lang_hint=""
|
|
207
|
+
[ "$LANGUAGE" != "auto" ] && lang_hint="The audio is in ${LANGUAGE}. "
|
|
208
|
+
|
|
209
|
+
local prompt="${lang_hint}Transcribe this audio segment (chunk $((chunk_index+1)) of ${total_chunks}). Output the full transcript preserving speaker turns. Format:
|
|
210
|
+
|
|
211
|
+
**Speaker Name/Label:** text spoken...
|
|
212
|
+
|
|
213
|
+
Use Speaker 1, Speaker 2 etc if names unknown. Maintain original language. Add [MM:SS] timestamps at topic changes (relative to this chunk start)."
|
|
214
|
+
|
|
215
|
+
local req_file="${TMPDIR_WORK}/req_${chunk_index}.json"
|
|
216
|
+
cat > "$req_file" <<ENDJSON
|
|
217
|
+
{
|
|
218
|
+
"contents": [{"parts": [
|
|
219
|
+
{"text": $(echo "$prompt" | jq -Rs .)},
|
|
220
|
+
{"file_data": {"mime_type": "${mime_type}", "file_uri": "${file_uri}"}}
|
|
221
|
+
]}],
|
|
222
|
+
"generationConfig": {"temperature": 0.1, "maxOutputTokens": 32768}
|
|
223
|
+
}
|
|
224
|
+
ENDJSON
|
|
225
|
+
|
|
226
|
+
local resp
|
|
227
|
+
resp=$(curl -s --max-time 300 -X POST \
|
|
228
|
+
"${GEMINI_CONTENT_URL}?key=${GEMINI_API_KEY}" \
|
|
229
|
+
-H "Content-Type: application/json" \
|
|
230
|
+
-d "@${req_file}" 2>&1)
|
|
231
|
+
|
|
232
|
+
local err_msg
|
|
233
|
+
err_msg=$(echo "$resp" | jq -r '.error.message // empty' 2>/dev/null)
|
|
234
|
+
[ -n "$err_msg" ] && { echo "[Transcription error: ${err_msg}]"; return 0; }
|
|
235
|
+
|
|
236
|
+
echo "$resp" | jq -r '.candidates[0].content.parts[0].text // "[No transcript for this chunk]"' 2>/dev/null
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
# ── Step 3: Upload and transcribe each chunk ───────────────────────────────────
|
|
240
|
+
FULL_TRANSCRIPT=""
|
|
241
|
+
CHUNK_INDEX=0
|
|
242
|
+
TOTAL_CHUNKS=$(echo "$CHUNK_FILES" | wc -w | tr -d ' ')
|
|
243
|
+
|
|
244
|
+
for chunk_file in $CHUNK_FILES; do
|
|
245
|
+
CHUNK_INDEX_DISPLAY=$((CHUNK_INDEX + 1))
|
|
246
|
+
echo "{\"status\":\"transcribing\",\"message\":\"Chunk ${CHUNK_INDEX_DISPLAY}/${TOTAL_CHUNKS}: uploading...\"}" >&2
|
|
247
|
+
|
|
248
|
+
MIME=$(get_mime "$chunk_file")
|
|
249
|
+
FILE_URI=$(upload_and_wait "$chunk_file" "$MIME")
|
|
250
|
+
|
|
251
|
+
if [ -z "$FILE_URI" ]; then
|
|
252
|
+
echo "{\"status\":\"error\",\"message\":\"Chunk ${CHUNK_INDEX_DISPLAY} upload/processing failed, skipping\"}" >&2
|
|
253
|
+
FULL_TRANSCRIPT="${FULL_TRANSCRIPT}
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
[Chunk ${CHUNK_INDEX_DISPLAY} failed to process]
|
|
257
|
+
---
|
|
258
|
+
"
|
|
259
|
+
CHUNK_INDEX=$((CHUNK_INDEX + 1))
|
|
260
|
+
continue
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
echo "{\"status\":\"transcribing\",\"message\":\"Chunk ${CHUNK_INDEX_DISPLAY}/${TOTAL_CHUNKS}: transcribing...\"}" >&2
|
|
264
|
+
CHUNK_TEXT=$(transcribe_chunk "$FILE_URI" "$MIME" "$CHUNK_INDEX" "$TOTAL_CHUNKS")
|
|
265
|
+
|
|
266
|
+
# Add time offset header for multi-chunk
|
|
267
|
+
if [ "$TOTAL_CHUNKS" -gt 1 ]; then
|
|
268
|
+
OFFSET_MINS=$(( CHUNK_INDEX * CHUNK_DURATION_SECONDS / 60 ))
|
|
269
|
+
FULL_TRANSCRIPT="${FULL_TRANSCRIPT}
|
|
270
|
+
|
|
271
|
+
--- Segment ${CHUNK_INDEX_DISPLAY} (from ${OFFSET_MINS}:00) ---
|
|
272
|
+
|
|
273
|
+
${CHUNK_TEXT}"
|
|
274
|
+
else
|
|
275
|
+
FULL_TRANSCRIPT="$CHUNK_TEXT"
|
|
276
|
+
fi
|
|
277
|
+
|
|
278
|
+
CHUNK_INDEX=$((CHUNK_INDEX + 1))
|
|
279
|
+
echo "{\"status\":\"transcribing\",\"message\":\"Chunk ${CHUNK_INDEX_DISPLAY}/${TOTAL_CHUNKS}: done.\"}" >&2
|
|
280
|
+
done
|
|
281
|
+
|
|
282
|
+
if [ -z "$FULL_TRANSCRIPT" ]; then
|
|
283
|
+
echo '{"success":false,"error":"All chunks failed to transcribe"}'
|
|
284
|
+
exit 1
|
|
285
|
+
fi
|
|
286
|
+
|
|
287
|
+
# ── Step 4: Output ─────────────────────────────────────────────────────────────
|
|
288
|
+
if [ -n "$OUTPUT_FILE" ]; then
|
|
289
|
+
mkdir -p "$(dirname "$OUTPUT_FILE")"
|
|
290
|
+
cat > "$OUTPUT_FILE" <<ENDMD
|
|
291
|
+
# ${TITLE}
|
|
292
|
+
|
|
293
|
+
> Source: ${URL:-local file}
|
|
294
|
+
> Transcribed: $(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
295
|
+
> Model: ${MODEL}
|
|
296
|
+
> Duration: ${DURATION_SECS}s (${TOTAL_CHUNKS} chunks)
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
${FULL_TRANSCRIPT}
|
|
301
|
+
ENDMD
|
|
302
|
+
echo "{\"status\":\"saved\",\"message\":\"Transcript saved to ${OUTPUT_FILE}\"}" >&2
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
TRANSCRIPT_LENGTH=${#FULL_TRANSCRIPT}
|
|
306
|
+
echo "{\"success\":true,\"title\":$(echo "$TITLE" | jq -Rs .),\"url\":$(echo "${URL:-}" | jq -Rs .),\"audioUrl\":$(echo "${AUDIO_URL:-}" | jq -Rs .),\"model\":\"${MODEL}\",\"duration\":${DURATION_SECS},\"chunks\":${TOTAL_CHUNKS},\"transcriptLength\":${TRANSCRIPT_LENGTH},\"transcript\":$(echo "$FULL_TRANSCRIPT" | jq -Rs .)}"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "xiaoyuzhoufm-transcript",
|
|
3
|
+
"displayName": "小宇宙 Podcast Transcript",
|
|
4
|
+
"description": "Extract and transcribe 小宇宙 podcast episodes using Gemini Audio API. Supports speaker identification and timestamps.",
|
|
5
|
+
"category": "content",
|
|
6
|
+
"assignableRoles": ["*"],
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"author": "Crewly Team",
|
|
9
|
+
"requires": ["GEMINI_API_KEY"]
|
|
10
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Cancel Cron Task
|
|
3
|
+
description: Permanently delete a cron task.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: scheduling
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
triggers:
|
|
10
|
+
- cancel cron
|
|
11
|
+
- delete cron
|
|
12
|
+
- remove cron task
|
|
13
|
+
tags:
|
|
14
|
+
- cron
|
|
15
|
+
- scheduling
|
|
16
|
+
- cleanup
|
|
17
|
+
execution:
|
|
18
|
+
type: script
|
|
19
|
+
script:
|
|
20
|
+
file: execute.sh
|
|
21
|
+
interpreter: bash
|
|
22
|
+
timeoutMs: 15000
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Cancel Cron Task
|
|
26
|
+
|
|
27
|
+
Permanently delete a cron task from the Crewly backend.
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/cancel-cron/execute.sh '{"id":"cron-abc123"}'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Parameters
|
|
36
|
+
|
|
37
|
+
| Parameter | Required | Description |
|
|
38
|
+
|-----------|----------|-------------|
|
|
39
|
+
| `id` | Yes | The cron task ID to delete |
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
- This permanently removes the cron task. To temporarily stop it, use `update-cron` with `{"enabled": false}` instead.
|
|
44
|
+
- Only the orchestrator or the user can cancel cron tasks.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Create Cron Task
|
|
3
|
+
description: Create a recurring cron task that sends work to an agent on a schedule.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: scheduling
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
triggers:
|
|
10
|
+
- create cron
|
|
11
|
+
- schedule recurring
|
|
12
|
+
- add cron task
|
|
13
|
+
tags:
|
|
14
|
+
- cron
|
|
15
|
+
- scheduling
|
|
16
|
+
- automation
|
|
17
|
+
execution:
|
|
18
|
+
type: script
|
|
19
|
+
script:
|
|
20
|
+
file: execute.sh
|
|
21
|
+
interpreter: bash
|
|
22
|
+
timeoutMs: 15000
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Create Cron Task
|
|
26
|
+
|
|
27
|
+
Create a recurring cron task in the Crewly backend. The cron evaluator runs every 60 seconds and sends `taskDescription` as a message to the `targetAgent` when the cron expression matches.
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/create-cron/execute.sh '{"cronExpression":"0 9 * * 1-5","timezone":"Asia/Shanghai","targetAgent":"agent-session","targetTeamId":"team-uuid","taskDescription":"Generate daily standup report"}'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Parameters
|
|
36
|
+
|
|
37
|
+
| Parameter | Required | Description |
|
|
38
|
+
|-----------|----------|-------------|
|
|
39
|
+
| `cronExpression` | Yes | Standard 5-field cron expression (minute hour day month weekday) |
|
|
40
|
+
| `timezone` | No | IANA timezone (default: UTC). Examples: `Asia/Shanghai`, `America/New_York` |
|
|
41
|
+
| `targetAgent` | Yes | Session name of the agent to receive the task |
|
|
42
|
+
| `targetTeamId` | Yes | Team ID the agent belongs to |
|
|
43
|
+
| `taskDescription` | Yes | The task message sent to the agent when cron fires |
|
|
44
|
+
|
|
45
|
+
## Cron Expression Examples
|
|
46
|
+
|
|
47
|
+
| Expression | Meaning |
|
|
48
|
+
|------------|---------|
|
|
49
|
+
| `0 9 * * 1-5` | 9:00 AM weekdays |
|
|
50
|
+
| `*/30 * * * *` | Every 30 minutes |
|
|
51
|
+
| `0 0 * * 0` | Midnight every Sunday |
|
|
52
|
+
| `0 8,17 * * *` | 8 AM and 5 PM daily |
|
|
53
|
+
|
|
54
|
+
## Notes
|
|
55
|
+
|
|
56
|
+
- The cron evaluator auto-starts offline agents before delivering the task
|
|
57
|
+
- Tasks are stored in `~/.crewly/teams/{teamId}/cron-tasks.json`
|
|
58
|
+
- Created tasks are enabled by default
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: List Cron Tasks
|
|
3
|
+
description: List all cron tasks, optionally filtered by agent or enabled status.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: scheduling
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
triggers:
|
|
10
|
+
- list cron
|
|
11
|
+
- show cron tasks
|
|
12
|
+
- view scheduled tasks
|
|
13
|
+
tags:
|
|
14
|
+
- cron
|
|
15
|
+
- scheduling
|
|
16
|
+
- monitoring
|
|
17
|
+
execution:
|
|
18
|
+
type: script
|
|
19
|
+
script:
|
|
20
|
+
file: execute.sh
|
|
21
|
+
interpreter: bash
|
|
22
|
+
timeoutMs: 15000
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# List Cron Tasks
|
|
26
|
+
|
|
27
|
+
List all cron tasks registered in the Crewly backend.
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# List all cron tasks
|
|
33
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/list-cron/execute.sh
|
|
34
|
+
|
|
35
|
+
# Filter by target agent
|
|
36
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/list-cron/execute.sh '{"targetAgent":"agent-session"}'
|
|
37
|
+
|
|
38
|
+
# Filter by enabled status
|
|
39
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/list-cron/execute.sh '{"enabled":"true"}'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Parameters
|
|
43
|
+
|
|
44
|
+
| Parameter | Required | Description |
|
|
45
|
+
|-----------|----------|-------------|
|
|
46
|
+
| `targetAgent` | No | Filter by agent session name |
|
|
47
|
+
| `enabled` | No | Filter by enabled status (`true` or `false`) |
|
|
48
|
+
|
|
49
|
+
## Response
|
|
50
|
+
|
|
51
|
+
Returns a JSON array of cron task objects with fields: `id`, `cronExpression`, `timezone`, `targetAgent`, `targetTeamId`, `taskDescription`, `enabled`, `lastRun`, `nextRun`, `createdBy`, `createdAt`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Update Cron Task
|
|
3
|
+
description: Update a cron task's schedule, description, or enable/disable it.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: scheduling
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
triggers:
|
|
10
|
+
- update cron
|
|
11
|
+
- change cron schedule
|
|
12
|
+
- disable cron
|
|
13
|
+
- enable cron
|
|
14
|
+
tags:
|
|
15
|
+
- cron
|
|
16
|
+
- scheduling
|
|
17
|
+
- automation
|
|
18
|
+
execution:
|
|
19
|
+
type: script
|
|
20
|
+
script:
|
|
21
|
+
file: execute.sh
|
|
22
|
+
interpreter: bash
|
|
23
|
+
timeoutMs: 15000
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Update Cron Task
|
|
27
|
+
|
|
28
|
+
Update an existing cron task. You can change the schedule, description, timezone, target agent, or enable/disable it.
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Change schedule
|
|
34
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/update-cron/execute.sh '{"id":"cron-abc123","cronExpression":"0 10 * * 1-5"}'
|
|
35
|
+
|
|
36
|
+
# Disable a cron task
|
|
37
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/update-cron/execute.sh '{"id":"cron-abc123","enabled":false}'
|
|
38
|
+
|
|
39
|
+
# Update description
|
|
40
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/update-cron/execute.sh '{"id":"cron-abc123","taskDescription":"Updated task instructions"}'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Parameters
|
|
44
|
+
|
|
45
|
+
| Parameter | Required | Description |
|
|
46
|
+
|-----------|----------|-------------|
|
|
47
|
+
| `id` | Yes | The cron task ID (from list-cron output) |
|
|
48
|
+
| `cronExpression` | No | New cron expression |
|
|
49
|
+
| `timezone` | No | New IANA timezone |
|
|
50
|
+
| `targetAgent` | No | New target agent session name |
|
|
51
|
+
| `taskDescription` | No | New task description |
|
|
52
|
+
| `enabled` | No | `true` to enable, `false` to disable |
|
|
@@ -153,14 +153,14 @@ export declare const ORCHESTRATOR_RESTART_CONSTANTS: {
|
|
|
153
153
|
readonly RESTART_DELAY_MS: 5000;
|
|
154
154
|
};
|
|
155
155
|
export declare const AGENT_SUSPEND_CONSTANTS: {
|
|
156
|
-
readonly DEFAULT_IDLE_TIMEOUT_MINUTES:
|
|
156
|
+
readonly DEFAULT_IDLE_TIMEOUT_MINUTES: 30;
|
|
157
157
|
readonly IDLE_CHECK_INTERVAL_MS: 120000;
|
|
158
158
|
readonly DEBUG_LOG_MAX_AGE_HOURS: 24;
|
|
159
159
|
readonly REHYDRATION_TIMEOUT_MS: 45000;
|
|
160
160
|
readonly EXEMPT_ROLES: readonly ["orchestrator"];
|
|
161
161
|
readonly STARTED_AGENT_IDLE_TIMEOUT_MINUTES: 15;
|
|
162
162
|
readonly ALWAYS_ON_ROLES: readonly ["orchestrator", "auditor"];
|
|
163
|
-
readonly AGENT_IDLE_STOP_TIMEOUT_MS:
|
|
163
|
+
readonly AGENT_IDLE_STOP_TIMEOUT_MS: 1800000;
|
|
164
164
|
};
|
|
165
165
|
export declare const VERSION_CHECK_CONSTANTS: {
|
|
166
166
|
readonly NPM_REGISTRY_URL: "https://registry.npmjs.org/crewly/latest";
|
|
@@ -355,8 +355,11 @@ export declare const PTY_CONSTANTS: {
|
|
|
355
355
|
readonly FORCE_KILL_ESCALATION_DELAY: 500;
|
|
356
356
|
/** Delay before escalating from SIGTERM to SIGKILL in forceDestroyAll (ms) */
|
|
357
357
|
readonly FORCE_DESTROY_ESCALATION_DELAY: 1000;
|
|
358
|
-
/** Minimum non-whitespace characters in stripped PTY output to count as meaningful activity
|
|
359
|
-
|
|
358
|
+
/** Minimum non-whitespace characters in stripped PTY output to count as meaningful activity.
|
|
359
|
+
* Set to 8 to filter out Gemini CLI TUI noise (cursor movements, spinner chars, single-char
|
|
360
|
+
* redraws) that have 1-5 residual chars after ANSI stripping. Real output (tool results,
|
|
361
|
+
* response text, bash output) is always longer. */
|
|
362
|
+
readonly MIN_MEANINGFUL_OUTPUT_BYTES: 8;
|
|
360
363
|
/** Minimum time (ms) an agent must remain in_progress before emitting busy/idle events */
|
|
361
364
|
readonly MIN_BUSY_DURATION_MS: 10000;
|
|
362
365
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../backend/src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,eAAO,MAAM,kBAAkB;;;;CAA4B,CAAC;AAC5D,eAAO,MAAM,wBAAwB;;;;;;CAAkC,CAAC;AACxE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA0B,CAAC;AACxD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA0B,CAAC;AACxD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgC,CAAC;AACpE,eAAO,MAAM,8BAA8B;;;;CAAwC,CAAC;AACpF,eAAO,MAAM,uBAAuB;;;;;;;;;CAAiC,CAAC;AACtE,eAAO,MAAM,uBAAuB;;;;;CAAiC,CAAC;AACtE,eAAO,MAAM,iCAAiC;;;;;;CAA2C,CAAC;AAC1F,eAAO,MAAM,gCAAgC;;;;;;;;;CAA0C,CAAC;AACxF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;CAAuB,CAAC;AAClD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;CAAyB,CAAC;AACtD,eAAO,MAAM,iBAAiB;;;CAA2B,CAAC;AAG1D,eAAO,MAAM,yBAAyB,cAAqD,CAAC;AAC5F,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAChD,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAC9D,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAClD,eAAO,MAAM,6BAA6B,QAAQ,CAAC;AAGnD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMnB,CAAC;AAGX,eAAO,MAAM,aAAa;IACzB,sEAAsE;;;IAGtE,6EAA6E;;IAE7E,0DAA0D;;IAE1D,qEAAqE;;IAErE,sDAAsD;;IAEtD,4FAA4F;;CAEnF,CAAC;AAGX,eAAO,MAAM,cAAc;;;IAG1B,sFAAsF;;IAEtF,sGAAsG;;CAE7F,CAAC;AAGX,eAAO,MAAM,wBAAwB;IACpC,6DAA6D;;IAE7D,iEAAiE;;CAExD,CAAC;AAGX,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,+GAA+G;AAC/G,eAAO,MAAM,8BAA8B,iEAAkE,CAAC;AAG9G,eAAO,MAAM,aAAa;;;;;;;;;IASzB,wEAAwE;;IAExE,8EAA8E;;IAE9E
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../backend/src/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ export const AGENT_TIMEOUTS = {
|
|
|
57
57
|
/** #252: Watchdog timeout — if agent is still in 'starting' state after this period, mark as error */
|
|
58
58
|
STARTING_WATCHDOG: 300000, // 5 minutes
|
|
59
59
|
};
|
|
60
|
-
//
|
|
60
|
+
// Crewly in Chrome constants for Chrome Extension WebSocket bridge
|
|
61
61
|
export const BROWSER_BRIDGE_CONSTANTS = {
|
|
62
62
|
/** WebSocket server path for Chrome Extension connections */
|
|
63
63
|
WS_PATH: '/ws/browser',
|
|
@@ -87,8 +87,11 @@ export const PTY_CONSTANTS = {
|
|
|
87
87
|
FORCE_KILL_ESCALATION_DELAY: 500,
|
|
88
88
|
/** Delay before escalating from SIGTERM to SIGKILL in forceDestroyAll (ms) */
|
|
89
89
|
FORCE_DESTROY_ESCALATION_DELAY: 1000,
|
|
90
|
-
/** Minimum non-whitespace characters in stripped PTY output to count as meaningful activity
|
|
91
|
-
|
|
90
|
+
/** Minimum non-whitespace characters in stripped PTY output to count as meaningful activity.
|
|
91
|
+
* Set to 8 to filter out Gemini CLI TUI noise (cursor movements, spinner chars, single-char
|
|
92
|
+
* redraws) that have 1-5 residual chars after ANSI stripping. Real output (tool results,
|
|
93
|
+
* response text, bash output) is always longer. */
|
|
94
|
+
MIN_MEANINGFUL_OUTPUT_BYTES: 8,
|
|
92
95
|
/** Minimum time (ms) an agent must remain in_progress before emitting busy/idle events */
|
|
93
96
|
MIN_BUSY_DURATION_MS: 10000,
|
|
94
97
|
};
|