Compare commits
5 commits
feat/per-j
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28ef6818a3 | ||
|
|
a051bb00d4 | ||
|
|
1a87bee280 | ||
|
|
c64c0278f2 | ||
|
|
794ad7faaa |
3 changed files with 35 additions and 9 deletions
|
|
@ -108,3 +108,9 @@ AGENT_BACKOFF_MAX=300
|
|||
AGENT_LOG_GZIP_AFTER_HOURS=24
|
||||
# Hoeveel dagen ge-gzipte logs bewaren voor we ze verwijderen.
|
||||
AGENT_LOG_DELETE_AFTER_DAYS=30
|
||||
|
||||
# Claude CLI --output-format. Default 'stream-json' streamt de volledige
|
||||
# event-stream (tool-calls, berichten) live naar de run-log; 'text' geeft
|
||||
# alleen Claude's eind-samenvatting (terser, maar geen live-meekijken).
|
||||
# stream-json maakt de run-log JSONL — gebruik jq of een viewer.
|
||||
AGENT_CLAUDE_OUTPUT_FORMAT=stream-json
|
||||
|
|
|
|||
|
|
@ -80,8 +80,12 @@ while true; do
|
|||
# Token-expiry detectie: run-one-job.ts retourneert exit 3 wanneer het
|
||||
# bekende auth-error-strings in Claude's output ziet. We checken óók de
|
||||
# log-tekst voor het geval een ander pad het patroon raakt (bv. Prisma-
|
||||
# connection-error met OAuth-expired in error-body).
|
||||
if [[ "$exit_code" -eq 3 ]] || grep -qE '(invalid_api_key|authentication.*failed|401.*unauthor|OAuth.*expired)' "${run_log}"; then
|
||||
# connection-error met OAuth-expired in error-body) — maar alléén bij een
|
||||
# niet-nul exit. Het run-log bevat de volledige stream-json output (incl.
|
||||
# tool-results én run-one-job's eigen "TOKEN_EXPIRED detected"-logregel),
|
||||
# dus een geslaagde job die toevallig "401 unauthorized" in z'n output
|
||||
# heeft mag de grep-fallback niet triggeren.
|
||||
if [[ "$exit_code" -eq 3 ]] || { [[ "$exit_code" -ne 0 ]] && grep -qE '(invalid_api_key|authentication.*failed|401.*unauthor|OAuth.*expired)' "${run_log}"; }; then
|
||||
log "AUTH FAILURE detected (exit=$exit_code or pattern in log) — marking TOKEN_EXPIRED"
|
||||
touch "${AGENT_STATE_DIR}/TOKEN_EXPIRED"
|
||||
write_state "$(jq -n \
|
||||
|
|
|
|||
|
|
@ -292,6 +292,13 @@ async function main(): Promise<number> {
|
|||
|
||||
// 7. Build CLI args.
|
||||
const promptText = getKindPromptText(ctx.kind).replace('$PAYLOAD_PATH', payloadPath)
|
||||
// --output-format is configureerbaar via env. Default 'stream-json' geeft
|
||||
// de volledige event-stream (elke tool-call, elk bericht) live in de
|
||||
// run-log, i.p.v. alleen Claude's eind-samenvatting. stream-json vereist
|
||||
// --verbose in print-mode. Zet AGENT_CLAUDE_OUTPUT_FORMAT=text terug voor
|
||||
// de oude terse output. TOKEN_EXPIRED-detectie werkt ongewijzigd: de
|
||||
// auth-error-strings staan ook binnen de JSON-events.
|
||||
const outputFormat = process.env.AGENT_CLAUDE_OUTPUT_FORMAT ?? 'stream-json'
|
||||
const args: string[] = [
|
||||
'-p',
|
||||
promptText,
|
||||
|
|
@ -306,8 +313,9 @@ async function main(): Promise<number> {
|
|||
'--add-dir',
|
||||
'/opt/agent',
|
||||
'--output-format',
|
||||
'text',
|
||||
outputFormat,
|
||||
]
|
||||
if (outputFormat === 'stream-json') args.push('--verbose')
|
||||
if (effort) args.push('--effort', effort)
|
||||
|
||||
const cwd = worktreePath ?? '/opt/agent'
|
||||
|
|
@ -375,13 +383,21 @@ async function main(): Promise<number> {
|
|||
`duration_ms=${durationMs} wall_clock_seconds=${Math.round(durationMs / 1000)}`,
|
||||
)
|
||||
|
||||
// 10. Token-expiry detection.
|
||||
// 10. Token-expiry detection — alleen als Claude zelf non-zero eindigde.
|
||||
// stdoutBuf bevat de volledige stream-json output incl. álle tool-results,
|
||||
// dus de auth-error-strings kunnen ook agent-werk-content zijn (een doc
|
||||
// over 401-handling gelezen, een endpoint getest). Een echte credential-
|
||||
// fout laat 'claude' non-zero exiten; een geslaagde run (exit 0) is per
|
||||
// definitie geen token-expiry. Zonder deze gate legt zulke content de
|
||||
// worker onterecht plat (run-agent.sh → TOKEN_EXPIRED marker + sleep).
|
||||
let tokenExpired = false
|
||||
for (const pat of TOKEN_EXPIRY_PATTERNS) {
|
||||
if (pat.test(stdoutBuf)) {
|
||||
tokenExpired = true
|
||||
log(`TOKEN_EXPIRED detected pattern="${pat.source}" exiting code=3`)
|
||||
break
|
||||
if (exitCode !== 0) {
|
||||
for (const pat of TOKEN_EXPIRY_PATTERNS) {
|
||||
if (pat.test(stdoutBuf)) {
|
||||
tokenExpired = true
|
||||
log(`TOKEN_EXPIRED detected pattern="${pat.source}" exiting code=3`)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue