@zelari/core 2.10.0 → 2.11.1
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/dist/context/ContextPolicy.d.ts +48 -0
- package/dist/context/ContextPolicy.d.ts.map +1 -0
- package/dist/context/ContextPolicy.js +71 -0
- package/dist/context/ContextPolicy.js.map +1 -0
- package/dist/context/ContextProjector.d.ts +44 -0
- package/dist/context/ContextProjector.d.ts.map +1 -0
- package/dist/context/ContextProjector.js +156 -0
- package/dist/context/ContextProjector.js.map +1 -0
- package/dist/context/index.d.ts +11 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +11 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/parentContext.d.ts +39 -0
- package/dist/context/parentContext.d.ts.map +1 -0
- package/dist/context/parentContext.js +67 -0
- package/dist/context/parentContext.js.map +1 -0
- package/dist/core/AgentHarness.d.ts +38 -0
- package/dist/core/AgentHarness.d.ts.map +1 -1
- package/dist/core/AgentHarness.js +142 -0
- package/dist/core/AgentHarness.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/controls/RuntimeControlQueue.d.ts +35 -0
- package/dist/runtime/controls/RuntimeControlQueue.d.ts.map +1 -0
- package/dist/runtime/controls/RuntimeControlQueue.js +54 -0
- package/dist/runtime/controls/RuntimeControlQueue.js.map +1 -0
- package/dist/runtime/controls/SteeringObserver.d.ts +24 -0
- package/dist/runtime/controls/SteeringObserver.d.ts.map +1 -0
- package/dist/runtime/controls/SteeringObserver.js +46 -0
- package/dist/runtime/controls/SteeringObserver.js.map +1 -0
- package/dist/runtime/controls/index.d.ts +4 -0
- package/dist/runtime/controls/index.d.ts.map +1 -0
- package/dist/runtime/controls/index.js +4 -0
- package/dist/runtime/controls/index.js.map +1 -0
- package/dist/runtime/controls/types.d.ts +43 -0
- package/dist/runtime/controls/types.d.ts.map +1 -0
- package/dist/runtime/controls/types.js +18 -0
- package/dist/runtime/controls/types.js.map +1 -0
- package/dist/runtime/guards/DuplicateSearchGuard.d.ts +41 -0
- package/dist/runtime/guards/DuplicateSearchGuard.d.ts.map +1 -0
- package/dist/runtime/guards/DuplicateSearchGuard.js +150 -0
- package/dist/runtime/guards/DuplicateSearchGuard.js.map +1 -0
- package/dist/runtime/guards/FailureSignatureGuard.d.ts +34 -0
- package/dist/runtime/guards/FailureSignatureGuard.d.ts.map +1 -0
- package/dist/runtime/guards/FailureSignatureGuard.js +143 -0
- package/dist/runtime/guards/FailureSignatureGuard.js.map +1 -0
- package/dist/runtime/guards/NoProgressGuard.d.ts +23 -0
- package/dist/runtime/guards/NoProgressGuard.d.ts.map +1 -0
- package/dist/runtime/guards/NoProgressGuard.js +84 -0
- package/dist/runtime/guards/NoProgressGuard.js.map +1 -0
- package/dist/runtime/guards/ReasoningWatchdog.d.ts +48 -0
- package/dist/runtime/guards/ReasoningWatchdog.d.ts.map +1 -0
- package/dist/runtime/guards/ReasoningWatchdog.js +135 -0
- package/dist/runtime/guards/ReasoningWatchdog.js.map +1 -0
- package/dist/runtime/guards/RepetitionGuard.d.ts +22 -0
- package/dist/runtime/guards/RepetitionGuard.d.ts.map +1 -0
- package/dist/runtime/guards/RepetitionGuard.js +56 -0
- package/dist/runtime/guards/RepetitionGuard.js.map +1 -0
- package/dist/runtime/guards/index.d.ts +6 -0
- package/dist/runtime/guards/index.d.ts.map +1 -0
- package/dist/runtime/guards/index.js +6 -0
- package/dist/runtime/guards/index.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/observers/MetricsObserver.d.ts +42 -0
- package/dist/runtime/observers/MetricsObserver.d.ts.map +1 -0
- package/dist/runtime/observers/MetricsObserver.js +110 -0
- package/dist/runtime/observers/MetricsObserver.js.map +1 -0
- package/dist/runtime/observers/ObserverBus.d.ts +49 -0
- package/dist/runtime/observers/ObserverBus.d.ts.map +1 -0
- package/dist/runtime/observers/ObserverBus.js +160 -0
- package/dist/runtime/observers/ObserverBus.js.map +1 -0
- package/dist/runtime/observers/TraceObserver.d.ts +36 -0
- package/dist/runtime/observers/TraceObserver.d.ts.map +1 -0
- package/dist/runtime/observers/TraceObserver.js +78 -0
- package/dist/runtime/observers/TraceObserver.js.map +1 -0
- package/dist/runtime/observers/composeObservers.d.ts +10 -0
- package/dist/runtime/observers/composeObservers.d.ts.map +1 -0
- package/dist/runtime/observers/composeObservers.js +30 -0
- package/dist/runtime/observers/composeObservers.js.map +1 -0
- package/dist/runtime/observers/index.d.ts +7 -0
- package/dist/runtime/observers/index.d.ts.map +1 -0
- package/dist/runtime/observers/index.js +7 -0
- package/dist/runtime/observers/index.js.map +1 -0
- package/dist/runtime/observers/resolve.d.ts +3 -0
- package/dist/runtime/observers/resolve.d.ts.map +1 -0
- package/dist/runtime/observers/resolve.js +30 -0
- package/dist/runtime/observers/resolve.js.map +1 -0
- package/dist/runtime/observers/types.d.ts +113 -0
- package/dist/runtime/observers/types.d.ts.map +1 -0
- package/dist/runtime/observers/types.js +13 -0
- package/dist/runtime/observers/types.js.map +1 -0
- package/dist/runtime/recorder/Redactor.d.ts +19 -0
- package/dist/runtime/recorder/Redactor.d.ts.map +1 -0
- package/dist/runtime/recorder/Redactor.js +78 -0
- package/dist/runtime/recorder/Redactor.js.map +1 -0
- package/dist/runtime/recorder/RunRecorder.d.ts +73 -0
- package/dist/runtime/recorder/RunRecorder.d.ts.map +1 -0
- package/dist/runtime/recorder/RunRecorder.js +137 -0
- package/dist/runtime/recorder/RunRecorder.js.map +1 -0
- package/dist/runtime/recorder/index.d.ts +8 -0
- package/dist/runtime/recorder/index.d.ts.map +1 -0
- package/dist/runtime/recorder/index.js +8 -0
- package/dist/runtime/recorder/index.js.map +1 -0
- package/dist/runtime/recorder/recorderObserver.d.ts +4 -0
- package/dist/runtime/recorder/recorderObserver.d.ts.map +1 -0
- package/dist/runtime/recorder/recorderObserver.js +63 -0
- package/dist/runtime/recorder/recorderObserver.js.map +1 -0
- package/dist/runtime/recorder/retention.d.ts +15 -0
- package/dist/runtime/recorder/retention.d.ts.map +1 -0
- package/dist/runtime/recorder/retention.js +105 -0
- package/dist/runtime/recorder/retention.js.map +1 -0
- package/dist/session/taskContract.d.ts +2 -2
- package/dist/shared/events.d.ts +40 -2
- package/dist/shared/events.d.ts.map +1 -1
- package/dist/shared/events.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NoProgressGuard — detect runs that stop making meaningful progress
|
|
3
|
+
* (Frontier upgrade, PHASE 1B §15).
|
|
4
|
+
*
|
|
5
|
+
* Core-level progress signals available from observer events: file-writing
|
|
6
|
+
* tool calls (write_file / edit_file / apply_diff) and first-time tool-call
|
|
7
|
+
* fingerprints. A turn with zero tool calls is treated as neutral (pure
|
|
8
|
+
* synthesis / answer turns do not advance the stall counter, to avoid false
|
|
9
|
+
* positives on legitimately finishing runs).
|
|
10
|
+
*
|
|
11
|
+
* `softStallTurns` consecutive unproductive turns inject a change-strategy
|
|
12
|
+
* warning; `hardStallTurns` consecutive unproductive turns stop the run.
|
|
13
|
+
* This generalizes the mission-level stall concept to the plain Kraken loop.
|
|
14
|
+
*/
|
|
15
|
+
import { CONTINUE } from '../observers/types.js';
|
|
16
|
+
import { toolCallFingerprint } from './RepetitionGuard.js';
|
|
17
|
+
/** Tools whose execution changes repository state. */
|
|
18
|
+
export const FILE_WRITING_TOOLS = new Set([
|
|
19
|
+
'write_file',
|
|
20
|
+
'edit_file',
|
|
21
|
+
'apply_diff',
|
|
22
|
+
]);
|
|
23
|
+
const REASSESS_MESSAGE = [
|
|
24
|
+
'The run has made no measurable progress for several turns.',
|
|
25
|
+
'Change strategy: inspect different files, delegate exploration, or revise the hypothesis.',
|
|
26
|
+
].join('\n');
|
|
27
|
+
export class NoProgressGuard {
|
|
28
|
+
seenFingerprints = new Set();
|
|
29
|
+
soft;
|
|
30
|
+
hard;
|
|
31
|
+
stallTurns = 0;
|
|
32
|
+
turnToolCalls = 0;
|
|
33
|
+
turnWrites = 0;
|
|
34
|
+
turnNewFingerprints = 0;
|
|
35
|
+
constructor(config = {}) {
|
|
36
|
+
this.soft = config.softStallTurns ?? 2;
|
|
37
|
+
this.hard = config.hardStallTurns ?? 5;
|
|
38
|
+
}
|
|
39
|
+
async onToolCall(event) {
|
|
40
|
+
this.turnToolCalls += 1;
|
|
41
|
+
if (FILE_WRITING_TOOLS.has(event.toolName))
|
|
42
|
+
this.turnWrites += 1;
|
|
43
|
+
const fingerprint = toolCallFingerprint(event.toolName, event.args);
|
|
44
|
+
const key = `${fingerprint.tool}\u0000${fingerprint.argsHash}`;
|
|
45
|
+
if (!this.seenFingerprints.has(key)) {
|
|
46
|
+
this.seenFingerprints.add(key);
|
|
47
|
+
this.turnNewFingerprints += 1;
|
|
48
|
+
}
|
|
49
|
+
return CONTINUE;
|
|
50
|
+
}
|
|
51
|
+
async onTurnEnd(_event) {
|
|
52
|
+
if (this.turnToolCalls === 0) {
|
|
53
|
+
// Neutral: a turn without tool calls is synthesis, not stall evidence.
|
|
54
|
+
return CONTINUE;
|
|
55
|
+
}
|
|
56
|
+
const productive = this.turnWrites > 0 || this.turnNewFingerprints > 0;
|
|
57
|
+
this.stallTurns = productive ? 0 : this.stallTurns + 1;
|
|
58
|
+
this.turnToolCalls = 0;
|
|
59
|
+
this.turnWrites = 0;
|
|
60
|
+
this.turnNewFingerprints = 0;
|
|
61
|
+
if (this.stallTurns >= this.hard) {
|
|
62
|
+
return {
|
|
63
|
+
action: 'stop',
|
|
64
|
+
reason: `no measurable progress for ${this.stallTurns} consecutive turns`,
|
|
65
|
+
code: 'no_progress',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (this.stallTurns >= this.soft) {
|
|
69
|
+
return {
|
|
70
|
+
action: 'inject',
|
|
71
|
+
message: { role: 'user', kind: 'runtime-warning', content: REASSESS_MESSAGE },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return CONTINUE;
|
|
75
|
+
}
|
|
76
|
+
reset() {
|
|
77
|
+
this.seenFingerprints.clear();
|
|
78
|
+
this.stallTurns = 0;
|
|
79
|
+
this.turnToolCalls = 0;
|
|
80
|
+
this.turnWrites = 0;
|
|
81
|
+
this.turnNewFingerprints = 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=NoProgressGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoProgressGuard.js","sourceRoot":"","sources":["../../../src/runtime/guards/NoProgressGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AgentObserver, ModelAttemptEvent, ModelDeltaEvent, ModelResponseEvent, ObserverResult, RunCancelledEvent, RunEndEvent } from '../observers/types.js';
|
|
2
|
+
export interface ReasoningWatchdogConfig {
|
|
3
|
+
/** Warn when the first token takes longer than this (ms). */
|
|
4
|
+
firstTokenWarnMs?: number;
|
|
5
|
+
/** Warn when the gap between two stream deltas exceeds this (ms). */
|
|
6
|
+
streamIdleWarnMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ProviderAttemptMetrics {
|
|
9
|
+
attemptId: string;
|
|
10
|
+
startedAt: number;
|
|
11
|
+
firstTokenAt?: number;
|
|
12
|
+
endedAt?: number;
|
|
13
|
+
timeToFirstTokenMs?: number;
|
|
14
|
+
generationDurationMs?: number;
|
|
15
|
+
maxStreamIdleMs?: number;
|
|
16
|
+
deltas: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ProviderIdleWarning {
|
|
19
|
+
code: 'provider_idle';
|
|
20
|
+
metric: 'time_to_first_token' | 'stream_idle';
|
|
21
|
+
attemptId: string;
|
|
22
|
+
valueMs: number;
|
|
23
|
+
thresholdMs: number;
|
|
24
|
+
message: string;
|
|
25
|
+
ts: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class ReasoningWatchdog implements AgentObserver {
|
|
28
|
+
private readonly firstTokenWarnMs;
|
|
29
|
+
private readonly streamIdleWarnMs;
|
|
30
|
+
private readonly now;
|
|
31
|
+
private current;
|
|
32
|
+
private lastDeltaAt;
|
|
33
|
+
private readonly completed;
|
|
34
|
+
private readonly warnings;
|
|
35
|
+
constructor(config?: ReasoningWatchdogConfig, now?: () => number);
|
|
36
|
+
onModelAttempt(event: ModelAttemptEvent): Promise<ObserverResult>;
|
|
37
|
+
onModelDelta(event: ModelDeltaEvent): Promise<ObserverResult>;
|
|
38
|
+
onModelResponse(_event: ModelResponseEvent): Promise<ObserverResult>;
|
|
39
|
+
onRunEnd(_event: RunEndEvent): Promise<ObserverResult>;
|
|
40
|
+
onCancelled(_event: RunCancelledEvent): Promise<ObserverResult>;
|
|
41
|
+
/** Completed attempt metrics, oldest first (bounded). */
|
|
42
|
+
getAttemptMetrics(): ProviderAttemptMetrics[];
|
|
43
|
+
getWarnings(): ProviderIdleWarning[];
|
|
44
|
+
reset(): void;
|
|
45
|
+
private finalizeCurrent;
|
|
46
|
+
private warn;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ReasoningWatchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReasoningWatchdog.d.ts","sourceRoot":"","sources":["../../../src/runtime/guards/ReasoningWatchdog.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,uBAAuB;IACtC,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,qBAAqB,GAAG,aAAa,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAkBD,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAE1C,MAAM,GAAE,uBAA4B,EAAE,GAAG,GAAE,MAAM,MAAiB;IAUxE,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAajE,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA4B7D,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAKpE,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAKtD,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAKrE,yDAAyD;IACzD,iBAAiB,IAAI,sBAAsB,EAAE;IAI7C,WAAW,IAAI,mBAAmB,EAAE;IAIpC,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,IAAI;CAmBb"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReasoningWatchdog — provider latency telemetry (Frontier upgrade, PHASE 1B §17).
|
|
3
|
+
*
|
|
4
|
+
* Tracks time-to-first-token, generation duration and stream idle gaps per
|
|
5
|
+
* model attempt, and records `provider_idle` warnings when thresholds are
|
|
6
|
+
* exceeded. It NEVER interrupts the provider on its own: observers here are
|
|
7
|
+
* telemetry-only (§17 — do not auto-abort providers that support long
|
|
8
|
+
* reasoning). Warnings and metrics are exposed via accessors for the CLI /
|
|
9
|
+
* future Run Flight Recorder.
|
|
10
|
+
*
|
|
11
|
+
* Env thresholds (config overrides win):
|
|
12
|
+
* ZELARI_MODEL_FIRST_TOKEN_WARN_MS (default 60000)
|
|
13
|
+
* ZELARI_MODEL_STREAM_IDLE_WARN_MS (default 30000)
|
|
14
|
+
*/
|
|
15
|
+
import { CONTINUE } from '../observers/types.js';
|
|
16
|
+
const DEFAULT_FIRST_TOKEN_WARN_MS = 60_000;
|
|
17
|
+
const DEFAULT_STREAM_IDLE_WARN_MS = 30_000;
|
|
18
|
+
const MAX_COMPLETED = 100;
|
|
19
|
+
function envPositiveInt(name, fallback) {
|
|
20
|
+
const raw = process.env[name]?.trim();
|
|
21
|
+
if (!raw)
|
|
22
|
+
return fallback;
|
|
23
|
+
const parsed = Number.parseInt(raw, 10);
|
|
24
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
25
|
+
}
|
|
26
|
+
export class ReasoningWatchdog {
|
|
27
|
+
firstTokenWarnMs;
|
|
28
|
+
streamIdleWarnMs;
|
|
29
|
+
now;
|
|
30
|
+
current = null;
|
|
31
|
+
lastDeltaAt;
|
|
32
|
+
completed = [];
|
|
33
|
+
warnings = [];
|
|
34
|
+
constructor(config = {}, now = Date.now) {
|
|
35
|
+
this.firstTokenWarnMs =
|
|
36
|
+
config.firstTokenWarnMs ??
|
|
37
|
+
envPositiveInt('ZELARI_MODEL_FIRST_TOKEN_WARN_MS', DEFAULT_FIRST_TOKEN_WARN_MS);
|
|
38
|
+
this.streamIdleWarnMs =
|
|
39
|
+
config.streamIdleWarnMs ??
|
|
40
|
+
envPositiveInt('ZELARI_MODEL_STREAM_IDLE_WARN_MS', DEFAULT_STREAM_IDLE_WARN_MS);
|
|
41
|
+
this.now = now;
|
|
42
|
+
}
|
|
43
|
+
async onModelAttempt(event) {
|
|
44
|
+
this.finalizeCurrent();
|
|
45
|
+
this.current = {
|
|
46
|
+
attemptId: event.id,
|
|
47
|
+
startedAt: this.now(),
|
|
48
|
+
deltas: 0,
|
|
49
|
+
warnedFirstToken: false,
|
|
50
|
+
warnedIdle: false,
|
|
51
|
+
};
|
|
52
|
+
this.lastDeltaAt = undefined;
|
|
53
|
+
return CONTINUE;
|
|
54
|
+
}
|
|
55
|
+
async onModelDelta(event) {
|
|
56
|
+
const attempt = this.current;
|
|
57
|
+
if (!attempt)
|
|
58
|
+
return CONTINUE;
|
|
59
|
+
const at = this.now();
|
|
60
|
+
attempt.deltas += 1;
|
|
61
|
+
if (attempt.firstTokenAt === undefined) {
|
|
62
|
+
attempt.firstTokenAt = at;
|
|
63
|
+
const ttft = at - attempt.startedAt;
|
|
64
|
+
attempt.timeToFirstTokenMs = ttft;
|
|
65
|
+
if (!attempt.warnedFirstToken && ttft > this.firstTokenWarnMs) {
|
|
66
|
+
attempt.warnedFirstToken = true;
|
|
67
|
+
this.warn('time_to_first_token', attempt, ttft, this.firstTokenWarnMs);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const gap = at - (this.lastDeltaAt ?? attempt.firstTokenAt);
|
|
72
|
+
if (gap > (attempt.maxStreamIdleMs ?? 0))
|
|
73
|
+
attempt.maxStreamIdleMs = gap;
|
|
74
|
+
if (!attempt.warnedIdle && gap > this.streamIdleWarnMs) {
|
|
75
|
+
attempt.warnedIdle = true;
|
|
76
|
+
this.warn('stream_idle', attempt, gap, this.streamIdleWarnMs);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
this.lastDeltaAt = at;
|
|
80
|
+
return CONTINUE;
|
|
81
|
+
}
|
|
82
|
+
async onModelResponse(_event) {
|
|
83
|
+
this.finalizeCurrent();
|
|
84
|
+
return CONTINUE;
|
|
85
|
+
}
|
|
86
|
+
async onRunEnd(_event) {
|
|
87
|
+
this.finalizeCurrent();
|
|
88
|
+
return CONTINUE;
|
|
89
|
+
}
|
|
90
|
+
async onCancelled(_event) {
|
|
91
|
+
this.finalizeCurrent();
|
|
92
|
+
return CONTINUE;
|
|
93
|
+
}
|
|
94
|
+
/** Completed attempt metrics, oldest first (bounded). */
|
|
95
|
+
getAttemptMetrics() {
|
|
96
|
+
return this.completed.map((attempt) => ({ ...attempt }));
|
|
97
|
+
}
|
|
98
|
+
getWarnings() {
|
|
99
|
+
return this.warnings.map((warning) => ({ ...warning }));
|
|
100
|
+
}
|
|
101
|
+
reset() {
|
|
102
|
+
this.current = null;
|
|
103
|
+
this.lastDeltaAt = undefined;
|
|
104
|
+
this.completed.length = 0;
|
|
105
|
+
this.warnings.length = 0;
|
|
106
|
+
}
|
|
107
|
+
finalizeCurrent() {
|
|
108
|
+
const attempt = this.current;
|
|
109
|
+
if (!attempt)
|
|
110
|
+
return;
|
|
111
|
+
attempt.endedAt = this.now();
|
|
112
|
+
if (attempt.firstTokenAt !== undefined) {
|
|
113
|
+
attempt.generationDurationMs = attempt.endedAt - attempt.startedAt;
|
|
114
|
+
}
|
|
115
|
+
this.completed.push({ ...attempt });
|
|
116
|
+
if (this.completed.length > MAX_COMPLETED)
|
|
117
|
+
this.completed.shift();
|
|
118
|
+
this.current = null;
|
|
119
|
+
this.lastDeltaAt = undefined;
|
|
120
|
+
}
|
|
121
|
+
warn(metric, attempt, valueMs, thresholdMs) {
|
|
122
|
+
this.warnings.push({
|
|
123
|
+
code: 'provider_idle',
|
|
124
|
+
metric,
|
|
125
|
+
attemptId: attempt.attemptId,
|
|
126
|
+
valueMs,
|
|
127
|
+
thresholdMs,
|
|
128
|
+
message: metric === 'time_to_first_token'
|
|
129
|
+
? `Provider first token took ${valueMs}ms (threshold ${thresholdMs}ms).`
|
|
130
|
+
: `Provider stream idle for ${valueMs}ms between deltas (threshold ${thresholdMs}ms).`,
|
|
131
|
+
ts: this.now(),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=ReasoningWatchdog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReasoningWatchdog.js","sourceRoot":"","sources":["../../../src/runtime/guards/ReasoningWatchdog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentObserver, ObserverResult, ToolCallEvent } from '../observers/types.js';
|
|
2
|
+
export interface ToolCallFingerprint {
|
|
3
|
+
tool: string;
|
|
4
|
+
argsHash: string;
|
|
5
|
+
}
|
|
6
|
+
/** Canonical sha256 over { tool, args }; arg-key-order independent. */
|
|
7
|
+
export declare function toolCallFingerprint(tool: string, args: unknown): ToolCallFingerprint;
|
|
8
|
+
export interface RepetitionGuardConfig {
|
|
9
|
+
/** Inject a reassess message at this many identical calls (default 2). */
|
|
10
|
+
warnAfter?: number;
|
|
11
|
+
/** Stop the run at this many identical calls (default 5). */
|
|
12
|
+
stopAfter?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class RepetitionGuard implements AgentObserver {
|
|
15
|
+
private readonly counts;
|
|
16
|
+
private readonly warnAfter;
|
|
17
|
+
private readonly stopAfter;
|
|
18
|
+
constructor(config?: RepetitionGuardConfig);
|
|
19
|
+
onToolCall(event: ToolCallEvent): Promise<ObserverResult>;
|
|
20
|
+
reset(): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=RepetitionGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepetitionGuard.d.ts","sourceRoot":"","sources":["../../../src/runtime/guards/RepetitionGuard.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACd,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,mBAAmB,CAKpF;AAED,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,GAAE,qBAA0B;IAKxC,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAsB/D,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RepetitionGuard — detect semantically identical tool calls repeated without
|
|
3
|
+
* new progress (Frontier upgrade, PHASE 1B).
|
|
4
|
+
*
|
|
5
|
+
* Fingerprint is a canonical sha256 over { tool, args } (order-free), so two
|
|
6
|
+
* calls with the same tool and equal arguments — regardless of key order — map
|
|
7
|
+
* to the same bucket. Reaction: inject a reassess message at `warnAfter`, stop
|
|
8
|
+
* the run at `stopAfter`.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
11
|
+
import { stableStringify } from '../../core/requestSnapshot.js';
|
|
12
|
+
import { CONTINUE } from '../observers/types.js';
|
|
13
|
+
/** Canonical sha256 over { tool, args }; arg-key-order independent. */
|
|
14
|
+
export function toolCallFingerprint(tool, args) {
|
|
15
|
+
const argsHash = createHash('sha256')
|
|
16
|
+
.update(stableStringify(args ?? null))
|
|
17
|
+
.digest('hex');
|
|
18
|
+
return { tool, argsHash };
|
|
19
|
+
}
|
|
20
|
+
const REASSESS_MESSAGE = [
|
|
21
|
+
'The same tool call has produced no new progress multiple times.',
|
|
22
|
+
'Reassess the current hypothesis before repeating it again.',
|
|
23
|
+
].join('\n');
|
|
24
|
+
export class RepetitionGuard {
|
|
25
|
+
counts = new Map();
|
|
26
|
+
warnAfter;
|
|
27
|
+
stopAfter;
|
|
28
|
+
constructor(config = {}) {
|
|
29
|
+
this.warnAfter = config.warnAfter ?? 2;
|
|
30
|
+
this.stopAfter = config.stopAfter ?? 5;
|
|
31
|
+
}
|
|
32
|
+
async onToolCall(event) {
|
|
33
|
+
const fingerprint = toolCallFingerprint(event.toolName, event.args);
|
|
34
|
+
const key = `${fingerprint.tool}\u0000${fingerprint.argsHash}`;
|
|
35
|
+
const count = (this.counts.get(key) ?? 0) + 1;
|
|
36
|
+
this.counts.set(key, count);
|
|
37
|
+
if (count >= this.stopAfter) {
|
|
38
|
+
return {
|
|
39
|
+
action: 'stop',
|
|
40
|
+
reason: `repeated tool call "${fingerprint.tool}" ${count} times without new progress`,
|
|
41
|
+
code: 'repeated_tool',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (count >= this.warnAfter) {
|
|
45
|
+
return {
|
|
46
|
+
action: 'inject',
|
|
47
|
+
message: { role: 'user', kind: 'runtime-warning', content: REASSESS_MESSAGE },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return CONTINUE;
|
|
51
|
+
}
|
|
52
|
+
reset() {
|
|
53
|
+
this.counts.clear();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=RepetitionGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepetitionGuard.js","sourceRoot":"","sources":["../../../src/runtime/guards/RepetitionGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAYjD,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAa;IAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;SAClC,MAAM,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AASD,MAAM,gBAAgB,GAAG;IACvB,iEAAiE;IACjE,4DAA4D;CAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,OAAO,eAAe;IACT,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnC,SAAS,CAAS;IAClB,SAAS,CAAS;IAEnC,YAAY,SAAgC,EAAE;QAC5C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAoB;QACnC,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,IAAI,SAAS,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE5B,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,uBAAuB,WAAW,CAAC,IAAI,KAAK,KAAK,6BAA6B;gBACtF,IAAI,EAAE,eAAe;aACtB,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,EAAE;aAC9E,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/guards/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -10,4 +10,8 @@ export * from './harnessManifest.js';
|
|
|
10
10
|
export * from './executionContext.js';
|
|
11
11
|
export * from './resourcePolicy.js';
|
|
12
12
|
export * from './resourceBudget.js';
|
|
13
|
+
export * from './observers/index.js';
|
|
14
|
+
export * from './guards/index.js';
|
|
15
|
+
export * from './recorder/index.js';
|
|
16
|
+
export * from './controls/index.js';
|
|
13
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -10,4 +10,8 @@ export * from './harnessManifest.js';
|
|
|
10
10
|
export * from './executionContext.js';
|
|
11
11
|
export * from './resourcePolicy.js';
|
|
12
12
|
export * from './resourceBudget.js';
|
|
13
|
+
export * from './observers/index.js';
|
|
14
|
+
export * from './guards/index.js';
|
|
15
|
+
export * from './recorder/index.js';
|
|
16
|
+
export * from './controls/index.js';
|
|
13
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AgentObserver, ModelAttemptEvent, ModelDeltaEvent, ModelResponseEvent, ObserverResult, RunCancelledEvent, RunEndEvent, RunStartEvent, ToolCallEvent, ToolResultEvent, TurnEndEvent } from './types.js';
|
|
2
|
+
export interface RuntimeMetricsSnapshot {
|
|
3
|
+
runsStarted: number;
|
|
4
|
+
modelAttempts: number;
|
|
5
|
+
modelDeltas: number;
|
|
6
|
+
modelResponses: number;
|
|
7
|
+
toolCalls: number;
|
|
8
|
+
toolResults: number;
|
|
9
|
+
toolFailures: number;
|
|
10
|
+
turnsEnded: number;
|
|
11
|
+
runsEnded: number;
|
|
12
|
+
cancelled: number;
|
|
13
|
+
firstEventTs?: number;
|
|
14
|
+
lastEventTs?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class MetricsObserver implements AgentObserver {
|
|
17
|
+
private runsStarted;
|
|
18
|
+
private modelAttempts;
|
|
19
|
+
private modelDeltas;
|
|
20
|
+
private modelResponses;
|
|
21
|
+
private toolCalls;
|
|
22
|
+
private toolResults;
|
|
23
|
+
private toolFailures;
|
|
24
|
+
private turnsEnded;
|
|
25
|
+
private runsEnded;
|
|
26
|
+
private cancelled;
|
|
27
|
+
private firstEventTs;
|
|
28
|
+
private lastEventTs;
|
|
29
|
+
onRunStart(event: RunStartEvent): Promise<ObserverResult>;
|
|
30
|
+
onModelAttempt(event: ModelAttemptEvent): Promise<ObserverResult>;
|
|
31
|
+
onModelDelta(event: ModelDeltaEvent): Promise<ObserverResult>;
|
|
32
|
+
onModelResponse(event: ModelResponseEvent): Promise<ObserverResult>;
|
|
33
|
+
onToolCall(event: ToolCallEvent): Promise<ObserverResult>;
|
|
34
|
+
onToolResult(event: ToolResultEvent): Promise<ObserverResult>;
|
|
35
|
+
onTurnEnd(event: TurnEndEvent): Promise<ObserverResult>;
|
|
36
|
+
onRunEnd(event: RunEndEvent): Promise<ObserverResult>;
|
|
37
|
+
onCancelled(event: RunCancelledEvent): Promise<ObserverResult>;
|
|
38
|
+
snapshot(): RuntimeMetricsSnapshot;
|
|
39
|
+
reset(): void;
|
|
40
|
+
private tick;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=MetricsObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricsObserver.d.ts","sourceRoot":"","sources":["../../../src/runtime/observers/MetricsObserver.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,WAAW,CAAqB;IAElC,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAMzD,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAMjE,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAM7D,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAMnE,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAMzD,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAO7D,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAMvD,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAMrD,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAMpE,QAAQ,IAAI,sBAAsB;IAiBlC,KAAK,IAAI,IAAI;IAeb,OAAO,CAAC,IAAI;CAQb"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MetricsObserver — aggregate runtime counters (Frontier upgrade, PHASE 1
|
|
3
|
+
* observer set).
|
|
4
|
+
*
|
|
5
|
+
* Purely observational: counts loop activity (model attempts/deltas/responses,
|
|
6
|
+
* tool calls/results/failures, turns, run endings, cancellations) and tracks
|
|
7
|
+
* first/last event timestamps. Never returns an intervention. Failure mode
|
|
8
|
+
* should be `ignore` (§7.1: MetricsObserver → ignore).
|
|
9
|
+
*/
|
|
10
|
+
import { CONTINUE } from './types.js';
|
|
11
|
+
export class MetricsObserver {
|
|
12
|
+
runsStarted = 0;
|
|
13
|
+
modelAttempts = 0;
|
|
14
|
+
modelDeltas = 0;
|
|
15
|
+
modelResponses = 0;
|
|
16
|
+
toolCalls = 0;
|
|
17
|
+
toolResults = 0;
|
|
18
|
+
toolFailures = 0;
|
|
19
|
+
turnsEnded = 0;
|
|
20
|
+
runsEnded = 0;
|
|
21
|
+
cancelled = 0;
|
|
22
|
+
firstEventTs;
|
|
23
|
+
lastEventTs;
|
|
24
|
+
async onRunStart(event) {
|
|
25
|
+
this.tick(event.ts);
|
|
26
|
+
this.runsStarted += 1;
|
|
27
|
+
return CONTINUE;
|
|
28
|
+
}
|
|
29
|
+
async onModelAttempt(event) {
|
|
30
|
+
this.tick(event.ts);
|
|
31
|
+
this.modelAttempts += 1;
|
|
32
|
+
return CONTINUE;
|
|
33
|
+
}
|
|
34
|
+
async onModelDelta(event) {
|
|
35
|
+
this.tick(event.ts);
|
|
36
|
+
this.modelDeltas += 1;
|
|
37
|
+
return CONTINUE;
|
|
38
|
+
}
|
|
39
|
+
async onModelResponse(event) {
|
|
40
|
+
this.tick(event.ts);
|
|
41
|
+
this.modelResponses += 1;
|
|
42
|
+
return CONTINUE;
|
|
43
|
+
}
|
|
44
|
+
async onToolCall(event) {
|
|
45
|
+
this.tick(event.ts);
|
|
46
|
+
this.toolCalls += 1;
|
|
47
|
+
return CONTINUE;
|
|
48
|
+
}
|
|
49
|
+
async onToolResult(event) {
|
|
50
|
+
this.tick(event.ts);
|
|
51
|
+
this.toolResults += 1;
|
|
52
|
+
if (!event.ok)
|
|
53
|
+
this.toolFailures += 1;
|
|
54
|
+
return CONTINUE;
|
|
55
|
+
}
|
|
56
|
+
async onTurnEnd(event) {
|
|
57
|
+
this.tick(event.ts);
|
|
58
|
+
this.turnsEnded += 1;
|
|
59
|
+
return CONTINUE;
|
|
60
|
+
}
|
|
61
|
+
async onRunEnd(event) {
|
|
62
|
+
this.tick(event.ts);
|
|
63
|
+
this.runsEnded += 1;
|
|
64
|
+
return CONTINUE;
|
|
65
|
+
}
|
|
66
|
+
async onCancelled(event) {
|
|
67
|
+
this.tick(event.ts);
|
|
68
|
+
this.cancelled += 1;
|
|
69
|
+
return CONTINUE;
|
|
70
|
+
}
|
|
71
|
+
snapshot() {
|
|
72
|
+
return {
|
|
73
|
+
runsStarted: this.runsStarted,
|
|
74
|
+
modelAttempts: this.modelAttempts,
|
|
75
|
+
modelDeltas: this.modelDeltas,
|
|
76
|
+
modelResponses: this.modelResponses,
|
|
77
|
+
toolCalls: this.toolCalls,
|
|
78
|
+
toolResults: this.toolResults,
|
|
79
|
+
toolFailures: this.toolFailures,
|
|
80
|
+
turnsEnded: this.turnsEnded,
|
|
81
|
+
runsEnded: this.runsEnded,
|
|
82
|
+
cancelled: this.cancelled,
|
|
83
|
+
firstEventTs: this.firstEventTs,
|
|
84
|
+
lastEventTs: this.lastEventTs,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
reset() {
|
|
88
|
+
this.runsStarted = 0;
|
|
89
|
+
this.modelAttempts = 0;
|
|
90
|
+
this.modelDeltas = 0;
|
|
91
|
+
this.modelResponses = 0;
|
|
92
|
+
this.toolCalls = 0;
|
|
93
|
+
this.toolResults = 0;
|
|
94
|
+
this.toolFailures = 0;
|
|
95
|
+
this.turnsEnded = 0;
|
|
96
|
+
this.runsEnded = 0;
|
|
97
|
+
this.cancelled = 0;
|
|
98
|
+
this.firstEventTs = undefined;
|
|
99
|
+
this.lastEventTs = undefined;
|
|
100
|
+
}
|
|
101
|
+
tick(ts) {
|
|
102
|
+
if (this.firstEventTs === undefined || ts < this.firstEventTs) {
|
|
103
|
+
this.firstEventTs = ts;
|
|
104
|
+
}
|
|
105
|
+
if (this.lastEventTs === undefined || ts > this.lastEventTs) {
|
|
106
|
+
this.lastEventTs = ts;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=MetricsObserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricsObserver.js","sourceRoot":"","sources":["../../../src/runtime/observers/MetricsObserver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA8BtC,MAAM,OAAO,eAAe;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,cAAc,GAAG,CAAC,CAAC;IACnB,SAAS,GAAG,CAAC,CAAC;IACd,WAAW,GAAG,CAAC,CAAC;IAChB,YAAY,GAAG,CAAC,CAAC;IACjB,UAAU,GAAG,CAAC,CAAC;IACf,SAAS,GAAG,CAAC,CAAC;IACd,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,CAAqB;IACjC,WAAW,CAAqB;IAExC,KAAK,CAAC,UAAU,CAAC,KAAoB;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAwB;QAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAsB;QACvC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAyB;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAoB;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAsB;QACvC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAmB;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACrB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAkB;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAwB;QACxC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,QAAQ;QACN,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC/B,CAAC;IAEO,IAAI,CAAC,EAAU;QACrB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9D,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AgentObserver, ObserverDescriptor, ObserverResult } from './types.js';
|
|
2
|
+
import type { RuntimeControlQueue } from '../controls/RuntimeControlQueue.js';
|
|
3
|
+
export interface ObserverBusOptions {
|
|
4
|
+
logger?: (message: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare class ObserverBus {
|
|
7
|
+
private readonly descriptors;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(descriptors?: ObserverDescriptor[], options?: ObserverBusOptions);
|
|
10
|
+
get size(): number;
|
|
11
|
+
emit<K extends keyof AgentObserver>(hook: K, event: Parameters<NonNullable<AgentObserver[K]>>[0]): Promise<ObserverResult[]>;
|
|
12
|
+
emitResolved<K extends keyof AgentObserver>(hook: K, event: Parameters<NonNullable<AgentObserver[K]>>[0]): Promise<ObserverResult>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Env flag for the default runtime-observer set (Frontier PHASE 1 rollout).
|
|
16
|
+
* Explicit `AgentHarnessConfig.observers` always run; this flag only gates
|
|
17
|
+
* the implicit default bus (RepetitionGuard, failureMode 'warn').
|
|
18
|
+
*/
|
|
19
|
+
export declare function runtimeObserversEnabled(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Options for {@link buildRuntimeObserverBus}. The recorder branch only
|
|
22
|
+
* activates when ZELARI_RUN_RECORD is enabled; `runsDir`/`runId` exist so
|
|
23
|
+
* callers (and tests) can redirect the flight recorder away from the real
|
|
24
|
+
* workspace.
|
|
25
|
+
*/
|
|
26
|
+
export interface DefaultObserverBusOptions {
|
|
27
|
+
/** Root for `.zelari/runs`-style output. Default: `<cwd>/.zelari/runs`. */
|
|
28
|
+
runsDir?: string;
|
|
29
|
+
runId?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Frontier PHASE 2: live steering queue. An explicit queue is itself an
|
|
32
|
+
* opt-in, so the SteeringObserver joins the bus even when the default-guard
|
|
33
|
+
* env flag is off (explicit config always wins, mirroring
|
|
34
|
+
* `AgentHarnessConfig.observers`).
|
|
35
|
+
*/
|
|
36
|
+
steeringQueue?: RuntimeControlQueue;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build the default observer bus: the four runtime guards (priority 30,
|
|
40
|
+
* warn) plus the telemetry-only observers — ReasoningWatchdog (priority 30,
|
|
41
|
+
* warn), TraceObserver (80, warn) and MetricsObserver (90, ignore). Returns
|
|
42
|
+
* `undefined` (→ observers OFF) unless ZELARI_RUNTIME_OBSERVERS is enabled,
|
|
43
|
+
* so the default hot path pays zero observer overhead.
|
|
44
|
+
*
|
|
45
|
+
* With ZELARI_RUN_RECORD=1 a Run Flight Recorder observer (priority 85) is
|
|
46
|
+
* appended: manifest/trace/agents/metrics under `<runsDir>/<runId>/`.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildRuntimeObserverBus(options?: DefaultObserverBusOptions): ObserverBus | undefined;
|
|
49
|
+
//# sourceMappingURL=ObserverBus.d.ts.map
|