agentfootprint
Version:
The explainable agent framework — backtrack a wrong answer to the exact context that caused it (evidence, not guesses). Built on footprintjs.
84 lines • 3.85 kB
JavaScript
;
/**
* coverage/timeLimitFacts — WHAT the time layer's limits lines of one turn
* say (step T8), read from the record and not yet rendered: the clock's zone,
* the turn's `period` rows whose result checks hold, and the wall-clock
* sources.
*
* Pattern: Walker over the committed ledger; pure, no rendering.
* Role: the record half of `timeLimits.ts`, split out BY FILE for the one
* synchronous door that needs it — the Tools mount's `inputMapper`
* (`agent/buildAgentChart.ts` · `timeLimitsArg`), which runs before
* any `import()` can: it hands these facts across, and the slot's
* served line renders them (`arguments/serve.ts` · `timeLimitsLine`,
* loaded under the arm). The renderer (`time/present.ts`) never
* reaches the graph `import { Agent }` loads (the optional-family
* law, `test/trace-toolpack/browserGraph.test.ts`).
* Emits: N/A.
*
* `undefined` exactly when `timeLimits.ts` · `renderTimeLimits` would say
* nothing for the same audience — so the mount arg stays value-conditional:
* a turn whose reads match what was asked crosses no key.
*
* @example
* ```ts
* timeLimitFactsOf(ledger, 1, 'model');
* // { zone: 'America/Los_Angeles', period: [{ kind: 'period', differs: { … }, … }], sources: [] }
* ```
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeLimitFactsOf = exports.carriesCheckLine = void 0;
const rows_js_1 = require("../../time/rows.js");
const checkRecord_js_1 = require("../../time/checkRecord.js");
/**
* Whether a `period` row carries a limits line for `audience`: a read that
* differs, a shifted look-back, or a window beyond retention (`period.ts` ·
* `periodCheckLine` returns one exactly then) — and, for the MODEL only, a
* source that holds none or only part of the asked time (`held`, rendered by
* `timeLimits.ts` · `heldLine`). The person's limits block already prints that
* span on the call's `Period:` line (`period.ts` · `periodLine`), in their
* zone, so it gets no second line.
*/
function carriesCheckLine(row, audience = 'person') {
return (row.differs !== undefined ||
row.shifted !== undefined ||
row.beyondRetention === true ||
(audience === 'model' && row.held !== undefined));
}
exports.carriesCheckLine = carriesCheckLine;
/**
* The turn's limits facts from the ledger. `turn` undefined reads every row
* (a ledger that carries one turn). `undefined` when there is no clock or,
* for this `audience`, nothing to say: the person reads every wall-clock
* source, the model only the label that two differ.
*/
function timeLimitFactsOf(ledger, turn, audience = 'person') {
const zone = (0, rows_js_1.presentationZoneOf)(ledger);
if (zone === undefined || ledger === undefined)
return undefined;
const zoneUnknown = (0, rows_js_1.clockOf)(ledger)?.zoneSource === 'unknown';
const period = [];
for (const row of ledger) {
const r = row;
if (r === null || typeof r !== 'object' || r.kind !== 'period')
continue;
if (turn !== undefined && r.turn !== turn)
continue;
if (carriesCheckLine(row, audience))
period.push(row);
}
const sources = (0, checkRecord_js_1.distinctSources)((0, rows_js_1.sourceClocksOf)(ledger, turn));
const differ = (0, checkRecord_js_1.clocksDiffer)(sources);
const clocks = audience === 'person' ? sources.length > 0 : differ !== undefined;
if (period.length === 0 && !clocks)
return undefined;
return {
zone,
period,
sources,
...(differ !== undefined && { differ }),
...(zoneUnknown && { zoneUnknown: true }),
};
}
exports.timeLimitFactsOf = timeLimitFactsOf;
//# sourceMappingURL=timeLimitFacts.js.map