context_watch: parametru -StareFile pentru fisierul de progres

Scrie/inlocuieste un singur antet pe primul rand al fisierului de stare
(data, ora, tokeni, nivel), fara sa atinga restul continutului. Garanteaza
ca fisierul de progres exista si e datat chiar daca sesiunea se opreste
inainte sa apuce modelul sa scrie handoff-ul.

Fara -StareFile comportamentul ramane neschimbat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ZwtBDjGbAWvy7TmcNVxDC
This commit is contained in:
2026-09-17 22:00:36 +03:00
parent 9d097d9880
commit 65d681a097

View File

@@ -6,6 +6,9 @@
# Iese cu 2 si scrie pe stderr cand contextul depaseste pragul (asa ajunge mesajul la agent).
# -OSinguraData: emite o singura data per prag per sesiune (marcaj in %TEMP%). Necesar pe PostToolUse,
# altfel mesajul s-ar repeta la fiecare apel de tool si ar deveni zgomot ignorat.
# -StareFile <cale>: la pragul de avertisment/max, garanteaza ca fisierul exista si are un antet
# datat pe primul rand ("<!-- context_watch: DD.MM.YYYY HH:mm | tokeni: N | nivel: ... -->"),
# inlocuit la fiecare rulare, nu acumulat. Restul continutului (scris de model) ramane neatins.
[CmdletBinding()]
param(
[string]$TranscriptPath,
@@ -13,9 +16,25 @@ param(
[int]$PragMax = 275000,
[switch]$Intotdeauna,
[switch]$Stdout, # UserPromptSubmit: mesajul se scrie pe stdout si se iese cu 0
[switch]$OSinguraData # PostToolUse: o singura alerta per prag atins, nu la fiecare tool
[switch]$OSinguraData, # PostToolUse: o singura alerta per prag atins, nu la fiecare tool
[string]$StareFile # optional: fisier de stare cu antet datat, actualizat la prag atins
)
function Scrie-AntetStare([string]$cale, [int]$tokeni, [string]$nivel) {
$antet = "<!-- context_watch: $(Get-Date -Format 'dd.MM.yyyy HH:mm') | tokeni: $tokeni | nivel: $nivel -->"
if (Test-Path $cale) {
$continut = Get-Content -Path $cale -Encoding UTF8
if ($continut.Count -gt 0 -and $continut[0] -match '^<!-- context_watch:') {
$continut[0] = $antet
} else {
$continut = ,$antet + $continut
}
} else {
$continut = ,$antet
}
Set-Content -Path $cale -Value $continut -Encoding UTF8
}
if (-not $TranscriptPath) {
$stdin = [Console]::In.ReadToEnd()
if ($stdin) {
@@ -70,6 +89,7 @@ if ($total -ge $PragMax) {
"nu citi loguri brute si nu diagnostica prin citire de cod in sesiunea asta."
}
if ($mesaj) {
if ($StareFile) { Scrie-AntetStare -cale $StareFile -tokeni $total -nivel $nivel }
if ($OSinguraData -and $nivel) {
# marcaj per sesiune+prag: transcriptul identifica sesiunea, deci si numele fisierului de marcaj
$cheie = [IO.Path]::GetFileNameWithoutExtension($TranscriptPath) + '_' + $nivel