agentfootprint 9.124.0 → 9.125.0
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/AGENTS.md +15 -2
- package/CAPABILITIES.md +2 -1
- package/ai-instructions/claude-code/SKILL.md +15 -2
- package/canonical-notes.json +12 -1
- package/dist/conventions.js +30 -0
- package/dist/conventions.js.map +1 -1
- package/dist/core/Agent.js +57 -7
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/AgentBuilder.js +48 -0
- package/dist/core/agent/AgentBuilder.js.map +1 -1
- package/dist/core/agent/assessment/assess.js +74 -0
- package/dist/core/agent/assessment/assess.js.map +1 -1
- package/dist/core/agent/assessment/compose.js +5 -0
- package/dist/core/agent/assessment/compose.js.map +1 -1
- package/dist/core/agent/assessment/reasons.js +24 -0
- package/dist/core/agent/assessment/reasons.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +13 -1
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +12 -1
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/coverage/absent.js +35 -2
- package/dist/core/agent/coverage/absent.js.map +1 -1
- package/dist/core/agent/coverage/answer.js +62 -9
- package/dist/core/agent/coverage/answer.js.map +1 -1
- package/dist/core/agent/coverage/evidence.js +10 -1
- package/dist/core/agent/coverage/evidence.js.map +1 -1
- package/dist/core/agent/coverage/index.js +4 -1
- package/dist/core/agent/coverage/index.js.map +1 -1
- package/dist/core/agent/coverage/ledger.js +33 -4
- package/dist/core/agent/coverage/ledger.js.map +1 -1
- package/dist/core/agent/coverage/period.js +536 -0
- package/dist/core/agent/coverage/period.js.map +1 -0
- package/dist/core/agent/coverage/read.js +131 -17
- package/dist/core/agent/coverage/read.js.map +1 -1
- package/dist/core/agent/coverage/types.js +5 -1
- package/dist/core/agent/coverage/types.js.map +1 -1
- package/dist/core/agent/findings/ledger.js +12 -0
- package/dist/core/agent/findings/ledger.js.map +1 -1
- package/dist/core/agent/findings/types.js.map +1 -1
- package/dist/core/agent/honesty/armed.js +3 -1
- package/dist/core/agent/honesty/armed.js.map +1 -1
- package/dist/core/agent/honesty/mounts.js +149 -1
- package/dist/core/agent/honesty/mounts.js.map +1 -1
- package/dist/core/agent/results/subflow.js +183 -0
- package/dist/core/agent/results/subflow.js.map +1 -0
- package/dist/core/agent/stages/toolCalls.js +104 -7
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/agent/stages/window.js +3 -1
- package/dist/core/agent/stages/window.js.map +1 -1
- package/dist/core/runCheckpoint.js +9 -0
- package/dist/core/runCheckpoint.js.map +1 -1
- package/dist/esm/conventions.d.ts +18 -0
- package/dist/esm/conventions.js +30 -0
- package/dist/esm/conventions.js.map +1 -1
- package/dist/esm/core/Agent.d.ts +20 -0
- package/dist/esm/core/Agent.js +57 -7
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/AgentBuilder.d.ts +38 -0
- package/dist/esm/core/agent/AgentBuilder.js +48 -0
- package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
- package/dist/esm/core/agent/assessment/assess.js +74 -0
- package/dist/esm/core/agent/assessment/assess.js.map +1 -1
- package/dist/esm/core/agent/assessment/compose.js +5 -0
- package/dist/esm/core/agent/assessment/compose.js.map +1 -1
- package/dist/esm/core/agent/assessment/reasons.js +24 -0
- package/dist/esm/core/agent/assessment/reasons.js.map +1 -1
- package/dist/esm/core/agent/assessment/types.d.ts +18 -3
- package/dist/esm/core/agent/buildAgentChart.d.ts +10 -1
- package/dist/esm/core/agent/buildAgentChart.js +14 -2
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +13 -2
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/coverage/absent.d.ts +17 -0
- package/dist/esm/core/agent/coverage/absent.js +34 -1
- package/dist/esm/core/agent/coverage/absent.js.map +1 -1
- package/dist/esm/core/agent/coverage/answer.d.ts +21 -3
- package/dist/esm/core/agent/coverage/answer.js +61 -8
- package/dist/esm/core/agent/coverage/answer.js.map +1 -1
- package/dist/esm/core/agent/coverage/evidence.js +9 -0
- package/dist/esm/core/agent/coverage/evidence.js.map +1 -1
- package/dist/esm/core/agent/coverage/index.d.ts +1 -0
- package/dist/esm/core/agent/coverage/index.js +1 -0
- package/dist/esm/core/agent/coverage/index.js.map +1 -1
- package/dist/esm/core/agent/coverage/ledger.d.ts +8 -3
- package/dist/esm/core/agent/coverage/ledger.js +34 -5
- package/dist/esm/core/agent/coverage/ledger.js.map +1 -1
- package/dist/esm/core/agent/coverage/period.d.ts +344 -0
- package/dist/esm/core/agent/coverage/period.js +519 -0
- package/dist/esm/core/agent/coverage/period.js.map +1 -0
- package/dist/esm/core/agent/coverage/read.d.ts +40 -2
- package/dist/esm/core/agent/coverage/read.js +131 -18
- package/dist/esm/core/agent/coverage/read.js.map +1 -1
- package/dist/esm/core/agent/coverage/types.d.ts +57 -1
- package/dist/esm/core/agent/coverage/types.js +5 -1
- package/dist/esm/core/agent/coverage/types.js.map +1 -1
- package/dist/esm/core/agent/findings/ledger.js +12 -0
- package/dist/esm/core/agent/findings/ledger.js.map +1 -1
- package/dist/esm/core/agent/findings/types.d.ts +2 -1
- package/dist/esm/core/agent/findings/types.js.map +1 -1
- package/dist/esm/core/agent/honesty/armed.d.ts +4 -0
- package/dist/esm/core/agent/honesty/armed.js +3 -1
- package/dist/esm/core/agent/honesty/armed.js.map +1 -1
- package/dist/esm/core/agent/honesty/mounts.d.ts +47 -0
- package/dist/esm/core/agent/honesty/mounts.js +145 -0
- package/dist/esm/core/agent/honesty/mounts.js.map +1 -1
- package/dist/esm/core/agent/results/subflow.d.ts +155 -0
- package/dist/esm/core/agent/results/subflow.js +173 -0
- package/dist/esm/core/agent/results/subflow.js.map +1 -0
- package/dist/esm/core/agent/stages/toolCalls.d.ts +17 -0
- package/dist/esm/core/agent/stages/toolCalls.js +102 -6
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/agent/stages/window.d.ts +3 -1
- package/dist/esm/core/agent/stages/window.js +3 -1
- package/dist/esm/core/agent/stages/window.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +32 -3
- package/dist/esm/core/runCheckpoint.js +9 -0
- package/dist/esm/core/runCheckpoint.js.map +1 -1
- package/dist/esm/events/payloads.d.ts +69 -0
- package/dist/esm/events/registry.d.ts +3 -1
- package/dist/esm/events/registry.js +3 -0
- package/dist/esm/events/registry.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/answer-account/facts/howSure.js +16 -0
- package/dist/esm/lib/answer-account/facts/howSure.js.map +1 -1
- package/dist/esm/lib/answer-account/templates.d.ts +6 -1
- package/dist/esm/lib/answer-account/templates.js +8 -1
- package/dist/esm/lib/answer-account/templates.js.map +1 -1
- package/dist/esm/lib/semantics/check.js +5 -3
- package/dist/esm/lib/semantics/check.js.map +1 -1
- package/dist/esm/lib/semantics/described.d.ts +34 -1
- package/dist/esm/lib/semantics/described.js +53 -3
- package/dist/esm/lib/semantics/described.js.map +1 -1
- package/dist/esm/lib/semantics/envelope.d.ts +27 -0
- package/dist/esm/lib/semantics/envelope.js +160 -51
- package/dist/esm/lib/semantics/envelope.js.map +1 -1
- package/dist/esm/lib/semantics/types.d.ts +12 -0
- package/dist/esm/lib/semantics/types.js.map +1 -1
- package/dist/esm/recorders/observability/BoundaryRecorder.js +1 -0
- package/dist/esm/recorders/observability/BoundaryRecorder.js.map +1 -1
- package/dist/events/registry.js +3 -0
- package/dist/events/registry.js.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/answer-account/facts/howSure.js +16 -0
- package/dist/lib/answer-account/facts/howSure.js.map +1 -1
- package/dist/lib/answer-account/templates.js +8 -1
- package/dist/lib/answer-account/templates.js.map +1 -1
- package/dist/lib/semantics/check.js +5 -3
- package/dist/lib/semantics/check.js.map +1 -1
- package/dist/lib/semantics/described.js +55 -3
- package/dist/lib/semantics/described.js.map +1 -1
- package/dist/lib/semantics/envelope.js +165 -54
- package/dist/lib/semantics/envelope.js.map +1 -1
- package/dist/lib/semantics/types.js.map +1 -1
- package/dist/recorders/observability/BoundaryRecorder.js +1 -0
- package/dist/recorders/observability/BoundaryRecorder.js.map +1 -1
- package/dist/types/conventions.d.ts +18 -0
- package/dist/types/conventions.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts +20 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/AgentBuilder.d.ts +38 -0
- package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/assess.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/compose.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/reasons.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/types.d.ts +18 -3
- package/dist/types/core/agent/assessment/types.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +10 -1
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/absent.d.ts +17 -0
- package/dist/types/core/agent/coverage/absent.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/answer.d.ts +21 -3
- package/dist/types/core/agent/coverage/answer.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/evidence.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/index.d.ts +1 -0
- package/dist/types/core/agent/coverage/index.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/ledger.d.ts +8 -3
- package/dist/types/core/agent/coverage/ledger.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/period.d.ts +345 -0
- package/dist/types/core/agent/coverage/period.d.ts.map +1 -0
- package/dist/types/core/agent/coverage/read.d.ts +40 -2
- package/dist/types/core/agent/coverage/read.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/types.d.ts +57 -1
- package/dist/types/core/agent/coverage/types.d.ts.map +1 -1
- package/dist/types/core/agent/findings/ledger.d.ts.map +1 -1
- package/dist/types/core/agent/findings/types.d.ts +2 -1
- package/dist/types/core/agent/findings/types.d.ts.map +1 -1
- package/dist/types/core/agent/honesty/armed.d.ts +4 -0
- package/dist/types/core/agent/honesty/armed.d.ts.map +1 -1
- package/dist/types/core/agent/honesty/mounts.d.ts +47 -0
- package/dist/types/core/agent/honesty/mounts.d.ts.map +1 -1
- package/dist/types/core/agent/results/subflow.d.ts +156 -0
- package/dist/types/core/agent/results/subflow.d.ts.map +1 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts +17 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/stages/window.d.ts +3 -1
- package/dist/types/core/agent/stages/window.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +32 -3
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/runCheckpoint.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +69 -0
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/events/registry.d.ts +3 -1
- package/dist/types/events/registry.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/answer-account/facts/howSure.d.ts.map +1 -1
- package/dist/types/lib/answer-account/templates.d.ts +6 -1
- package/dist/types/lib/answer-account/templates.d.ts.map +1 -1
- package/dist/types/lib/semantics/check.d.ts.map +1 -1
- package/dist/types/lib/semantics/described.d.ts +34 -1
- package/dist/types/lib/semantics/described.d.ts.map +1 -1
- package/dist/types/lib/semantics/envelope.d.ts +27 -0
- package/dist/types/lib/semantics/envelope.d.ts.map +1 -1
- package/dist/types/lib/semantics/types.d.ts +12 -0
- package/dist/types/lib/semantics/types.d.ts.map +1 -1
- package/dist/types/recorders/observability/BoundaryRecorder.d.ts.map +1 -1
- package/package.json +2 -1
package/AGENTS.md
CHANGED
|
@@ -246,6 +246,16 @@ execute: ({ vm, summary }) => {
|
|
|
246
246
|
},
|
|
247
247
|
```
|
|
248
248
|
|
|
249
|
+
All three take a `period` — what time the READ covered: `{ queried: { from, to }, held:
|
|
250
|
+
{ from, to } | 'unknown', readAt? }`, ISO 8601 instants WITH a zone, computed by the tool
|
|
251
|
+
from its own data (the library never parses "last hour"). `absent()` also takes
|
|
252
|
+
`describedResult()`'s `provenance: { measuredAt, source }`. The results layer files one
|
|
253
|
+
verdict per call (`covered` · `partly-held` · `not-held` · `unknown` · `undeclared`) and
|
|
254
|
+
the answer's standing reads "not sure" for all but `covered`; a tool that declares a period
|
|
255
|
+
argument (`defineTool({ …, period: { argument: 'window' } })`, needs an `askOrAssume` rule)
|
|
256
|
+
arms it and gets `undeclared` when its result says nothing; `.resultsLayer()` arms it for
|
|
257
|
+
tools that declare a period only on their results.
|
|
258
|
+
|
|
249
259
|
`describedResult()` is camelCase throughout (`measuredAt`, `ageSeconds`, `isCounter`,
|
|
250
260
|
`filterNote`); the envelope the model reads stays snake_case. Series need `grain`
|
|
251
261
|
(`{ interval, aggregation, isCounter }` — state `isCounter` for `sum`/`count`-like
|
|
@@ -254,7 +264,10 @@ refusal. `semantic()` is the deprecated name for the same envelope with a snake_
|
|
|
254
264
|
declaration — do not use it in new code.
|
|
255
265
|
|
|
256
266
|
A helper that cannot honor its declaration throws inside `execute`: the model reads text
|
|
257
|
-
starting `refused: ` in place of the data, and the run continues.
|
|
267
|
+
starting `refused: ` in place of the data, and the run continues. A data list is never
|
|
268
|
+
empty — `describedResult({ facts: [] })` is refused with "`facts` is empty — if nothing
|
|
269
|
+
matched, return absent({ what, checked }) instead" — so every `execute` that returns rows
|
|
270
|
+
writes both branches: `rows.length ? describedResult({ … }) : absent({ … })`. An absence gets the
|
|
258
271
|
delivered status `'absent'` (route it with `onToolStatus: 'absent'`) and grounds only its
|
|
259
272
|
COVERAGE in the evidence gate — so an id the model invented does not become grounded by one
|
|
260
273
|
lookup that found nothing. It is never an error: nothing retries it, nothing refuses it, no
|
|
@@ -275,7 +288,7 @@ const agent = Agent.create({ provider, model })
|
|
|
275
288
|
agent.on('agentfootprint.context.evaluated', (e) => console.log(e.payload.activeIds));
|
|
276
289
|
```
|
|
277
290
|
|
|
278
|
-
**
|
|
291
|
+
**124 typed events across 28 domains.** Two subscription shapes and no third:
|
|
279
292
|
`'*'` (every event) and `'agentfootprint.<domain>.*'` (one domain). **`'agentfootprint.*'`
|
|
280
293
|
is not a pattern** — TypeScript rejects it, and at runtime it would match nothing.
|
|
281
294
|
|
package/CAPABILITIES.md
CHANGED
|
@@ -26,7 +26,7 @@ not in this table, search `src/index.ts` for the nearest noun before writing cod
|
|
|
26
26
|
| speaking MCP from a BROWSER — the SDK is browser-clean (its client + streamableHttp bundle at `platform:'browser'` with zero `node:` edges and never pull in `client/stdio.js`); the one barrier was that `lazyRequire` gets CALLED there, so the fix is to let the caller supply what the loader would have found | `mcpClient({ sdk })` (`McpSdk` = the two SDK modules you imported statically; the library STILL builds the transport, so headers/fetch/gateway vending/`retryOnThrottle`/`_meta` all keep working) · `mcpClient({ connection })` (`McpConnection` = listTools/callTool/close, deliberately NO `connect` — you already did; the only arm that reaches the SDK's `jsonSchemaValidator`, i.e. CSP) + `McpConnectionOptions`; `refuseConflictingOptions` REFUSES at construction every option a transport would have consumed, naming where it moved (a knob naming a behaviour that no longer happens is the defect class); `transportUrl` resolves a relative `url` against `globalThis.location.href` (absolute takes the identical branch, Node refuses by name); `sdkLoadFailure` classifies the seven load sites so a browser is never told to install a package it has (resolution failure ⇒ byte-identical historical message); `retryingFetch` + `ThrottleFetch` promoted out of `@internal` so the connection arm keeps its 429 handling. stdio keeps `lazyRequire` FOREVER — it spawns a subprocess. ZERO packaging change: no subpath, no `browser` condition (TypeScript is blind to it), peer stays optional (no literal dynamic `import()`). Fenced by `test/lib/mcp/browserGraph.test.ts` | `src/lib/mcp/` | 9.81.0 |
|
|
27
27
|
| calling ANOTHER registered tool from inside a tool's `execute` — composition over the agent's own dispatch map instead of importing the module and building a second query stack | `agentToolDispatch` + `ctx.tools` (ToolDispatch has/call) — sees static and skill-carried tools, NEVER ToolProvider-delivered ones (no build-time list, the 9.72.0 caveat); inner calls get the outer facts with hasArtifacts false and a derived toolCallId, `needs` resolved fail-closed non-interactively, `checkIn` and `wants` tools refused by name, no nested dispatch; declare ingredients via `composedOf` (and `gates` for a pausing procedure) — both travel MCP `_meta` | `src/core/agent/toolDispatch.ts` | 9.76.0 |
|
|
28
28
|
| a tool returning numbers WITH the caveats that make them honest — interval/aggregation grain, is-it-a-counter, when the world was measured, which ground was NOT covered — as typed data the model reads compactly and the record keeps whole | `semantic()` + `tools.semantics_declared` (model sees `semanticsForModel` projection; `coverage` field absorbed by the coverage()/absent() channel; `semantic()` is the deprecated name — use `describedResult()`, next row) | `src/lib/semantics/` | 9.53.0 |
|
|
29
|
-
| the same typed tool result declared in ONE spelling — camelCase `measuredAt`/`isCounter`/`filterNote`, respelled to the unchanged snake_case wire — with a missing source a COMPILE error; which result helper to return (rows → describedResult, a value with limits → coverage, nothing → absent) | `describedResult()` + `DescribedResultDeclaration` (`provenance` required whenever `series`/`facts` is present; the snake_case spelling refused, naming the camelCase one) | `src/lib/semantics/described.ts` | 9.119.0 |
|
|
29
|
+
| the same typed tool result declared in ONE spelling — camelCase `measuredAt`/`isCounter`/`filterNote`, respelled to the unchanged snake_case wire — with a missing source a COMPILE error; which result helper to return (rows → describedResult, a value with limits → coverage, nothing → absent); an EMPTY data list refused with the branch to write ("if nothing matched, return absent({ what, checked }) instead"), both doors and the gate | `describedResult()` + `DescribedResultDeclaration` (`provenance` required whenever `series`/`facts` is present; the snake_case spelling refused, naming the camelCase one) | `src/lib/semantics/described.ts` | 9.119.0, empty-list refusal 9.125.0 |
|
|
30
30
|
| a build gate that refuses a triage/inventory tool that forgot its caveats, by tool name and field name | `checkSemantics` + `defineTool({ resultClass })` (`'triage'`/`'inventory'`, the closed set) + bin `agentfootprint-check-semantics` | `src/lib/semantics/check.ts` | 9.53.0 |
|
|
31
31
|
| an agent that runs out of `maxIterations` mid-task handing back a HALF-SENTENCE as its answer — and nothing saying the budget ran out | `wrapUpAtMaxIterations` (default ON) + `WRAP_UP_INSTRUCTION` + `agent.budget_exhausted` + `stoppedEarly.wrappedUp` | `src/core/agent/stages/wrapUp.ts` | 9.56.0 |
|
|
32
32
|
| the conversation outgrowing the context window — dropping, summarizing or token-budgeting old turns, every removal on the record (the three refusal rows below all guard this window) | `.window()` + `slidingWindow` / `summarizeOldest` (= `.compaction()`) / `tokenBudget` + `keepRecentTurns` (default 6) + `thresholdTokens` (required, deliberately no default) + `retain: 'conversation'` (default) / `'discard'` | `src/core/agent/window/` | 7.17.0 |
|
|
@@ -71,6 +71,7 @@ not in this table, search `src/index.ts` for the nearest noun before writing cod
|
|
|
71
71
|
| explaining ONE answer to a person in plain words — what was asked, how it was routed, what each tool checked and did not check, what it found, how sure, and anything wrong — every line from the record by a fixed versioned template (never a model), each with its template id and who vouches for it (person / library / tool / model / app), "not recorded" instead of a guess, own-run events only, three checks with the ones that could not run said aloud | `accountForAnswer` + `AnswerAccount` | `src/lib/answer-account/` | 9.116.0 |
|
|
72
72
|
| a tool whose default NOBODY CHOSE (a log search that quietly defaults to 2 hours) — the LIBRARY fills a value the call left out from the tool's declared rule, never the tool; files one `argument` row per ruled argument per call on the findings ledger (`source: 'default'` filled or echoed — `proposed` tells them apart — or `'model'`), stamped with the conversation `turn`; tells the model in a past-tense note (only for a value the call ran with) behind a `toolChars` boundary every reader of a result reads through, so the note grounds nothing and hides no empty result; the answer's standing reads "not sure — assumed"; an "Assumed" block under `.limitsTravelWithTheAnswer()`; carried over MCP `_meta`; a ruled tool on an agent without the layer is REFUSED before any middleware asks, never run unruled; `{ ask }` is the batch ask (next row) | `Tool.askOrAssume` + `Tool.period` (`ToolPeriod`) + `ArgumentRow` + `agentfootprint.findings.argument` + `AgentBuilder.inputsLayer()` + `allow(value, why, { from })` | `src/core/agent/arguments/` | 9.122.0 |
|
|
73
73
|
| a value the PERSON must give (a look-back period, a site, a row limit) that the model left out — the library asks ONCE for everything the batch needs, before anything in it runs, through the typed ask `requestInput` uses (`isInputPause`, `agent.resume(cp, { requestId, values })`, `standingAgent`): one field per distinct (tool, argument), positional ids, the author's question and choices, `context.agentfootprint` naming each field's calls, one period asked once across spellings (`24h` ↔ `-24h`); the answer re-checked against the property's own schema and asked again (at most three times) when it does not fit; `asked` then `answered` rows; the standing reads "ask" while it waits (`argument-asked`); the resume adds no model call; one human question per resume — a call refused a second pause in the batch that asked keeps the person's answer, so proposed again it runs with it and pauses for its own step (the person is asked once); the resume event carries the reply's shape, never a value | `askOrAssume: { x: { ask, choices? } }` + `argumentAskContext` + `ArgumentRow` (`asked`, `answered`, `free`) | `src/core/agent/arguments/` | 9.123.0 |
|
|
74
|
+
| a result that does not say WHAT TIME its read covered — "no failed backups in the last hour" answered from an export that ends at 02:00 — the result declares its period on the doors it already returns (`absent()`, `coverage()`, `describedResult()`: `period: { queried, held, readAt? }` with `held` a range or `'unknown'`, ISO 8601 instants with a zone, never parsed durations) and an absence its source and time (`provenance`, `describedResult()`'s shape); one rule set refuses a malformed one at the mint and reads a foreign one without repair; the coverage channel carries it (`coverageDeclared`, `tools.absent` / `tools.coverage_declared`); the results layer (`src/core/agent/results/`) at the loop head files ONE verdict per call — covered · partly-held · not-held · unknown · undeclared (a tool with a period argument whose result said nothing) — and the answer's standing reads "not sure" for all but covered, joined to the inputs layer's row for who chose the period; a `Period:` line under `.limitsTravelWithTheAnswer()` and `periods` in a typed answer's limits; `canonical-notes.json` publishes the wire spelling for foreign minters | `period` on `absent`/`coverage`/`describedResult` + `DeclaredPeriod` + `periodVerdict` + `PeriodRow` + `PERIOD_WIRE` + `AgentBuilder.resultsLayer()` + `agentfootprint.findings.period` | `src/core/agent/coverage/period.ts` | 9.125.0 |
|
|
74
75
|
| how far an answer STANDS — known · consistent with the record · not sure (with the reasons) · ask · not assessed — folded from the run's COMMITTED record (never from the model's confidence, never from events, never "known" from silence: only a passed enforce answer check supports it); each reason names the row it rests on, `checked` counts what ran, this turn only; a pause of any kind reads `ask` from the recording alone, a run with no answer has no standing; one emptiness reader shared with the answer account (`coverage/emptiness.ts`: a `coverage()` envelope read through, a described result counted, an undeclared empty rowset said aloud) | `assessAnswer` + `AnswerAssessment` (on the observe door), `agent.assessment()` | `src/core/agent/assessment/` | 9.120.0 |
|
|
75
76
|
| the answer's standing INSIDE the run, the moment the answer exists — the same fold as `agent.assessment()`, run as the first stage of the final branch and served as DATA (`turn_end` and one event: the value, its word, the reason kinds, the checks that ran — never a value or a quote); the evidence gate's clean pass and an answer given before a skill's declared steps finished committed as witness rows (so a clean gate reads "consistent", never "known"); an opt-in line appended to a PROSE answer (refused beside `.answerValidation()` and `.outputSchema()`); the in-run standing equals the fold of the saved recording; a typed answer's limits carry the values a tool's rule assumed | `AgentBuilder.answerLayer({ standingLine? })` + `turn_end.answerAssessment` + `agentfootprint.answer.assessed` + `GroundedRow` / `StepsUnfinishedRow` + `AnswerCoverage.assumed` | `src/core/agent/assessment/` | 9.124.0 |
|
|
76
77
|
| serving that explanation to a browser without the recording: one opt-in wire op returns the account plus allow-listed "show me" leaves, owner-only on the `artifact-get` path, lane-free, cached and single-flight, a stated size ceiling, and a swept record answering "not available" even when cached | `standingAgent({ answerAccounts })` + `{ op: 'answer-account', ref }` + `answerAccountPointerKey` | `src/hosting/answerAccounts.ts` | 9.116.0 |
|
|
@@ -246,6 +246,16 @@ execute: ({ vm, summary }) => {
|
|
|
246
246
|
},
|
|
247
247
|
```
|
|
248
248
|
|
|
249
|
+
All three take a `period` — what time the READ covered: `{ queried: { from, to }, held:
|
|
250
|
+
{ from, to } | 'unknown', readAt? }`, ISO 8601 instants WITH a zone, computed by the tool
|
|
251
|
+
from its own data (the library never parses "last hour"). `absent()` also takes
|
|
252
|
+
`describedResult()`'s `provenance: { measuredAt, source }`. The results layer files one
|
|
253
|
+
verdict per call (`covered` · `partly-held` · `not-held` · `unknown` · `undeclared`) and
|
|
254
|
+
the answer's standing reads "not sure" for all but `covered`; a tool that declares a period
|
|
255
|
+
argument (`defineTool({ …, period: { argument: 'window' } })`, needs an `askOrAssume` rule)
|
|
256
|
+
arms it and gets `undeclared` when its result says nothing; `.resultsLayer()` arms it for
|
|
257
|
+
tools that declare a period only on their results.
|
|
258
|
+
|
|
249
259
|
`describedResult()` is camelCase throughout (`measuredAt`, `ageSeconds`, `isCounter`,
|
|
250
260
|
`filterNote`); the envelope the model reads stays snake_case. Series need `grain`
|
|
251
261
|
(`{ interval, aggregation, isCounter }` — state `isCounter` for `sum`/`count`-like
|
|
@@ -254,7 +264,10 @@ refusal. `semantic()` is the deprecated name for the same envelope with a snake_
|
|
|
254
264
|
declaration — do not use it in new code.
|
|
255
265
|
|
|
256
266
|
A helper that cannot honor its declaration throws inside `execute`: the model reads text
|
|
257
|
-
starting `refused: ` in place of the data, and the run continues.
|
|
267
|
+
starting `refused: ` in place of the data, and the run continues. A data list is never
|
|
268
|
+
empty — `describedResult({ facts: [] })` is refused with "`facts` is empty — if nothing
|
|
269
|
+
matched, return absent({ what, checked }) instead" — so every `execute` that returns rows
|
|
270
|
+
writes both branches: `rows.length ? describedResult({ … }) : absent({ … })`. An absence gets the
|
|
258
271
|
delivered status `'absent'` (route it with `onToolStatus: 'absent'`) and grounds only its
|
|
259
272
|
COVERAGE in the evidence gate — so an id the model invented does not become grounded by one
|
|
260
273
|
lookup that found nothing. It is never an error: nothing retries it, nothing refuses it, no
|
|
@@ -275,7 +288,7 @@ const agent = Agent.create({ provider, model })
|
|
|
275
288
|
agent.on('agentfootprint.context.evaluated', (e) => console.log(e.payload.activeIds));
|
|
276
289
|
```
|
|
277
290
|
|
|
278
|
-
**
|
|
291
|
+
**124 typed events across 28 domains.** Two subscription shapes and no third:
|
|
279
292
|
`'*'` (every event) and `'agentfootprint.<domain>.*'` (one domain). **`'agentfootprint.*'`
|
|
280
293
|
is not a pattern** — TypeScript rejects it, and at runtime it would match nothing.
|
|
281
294
|
|
package/canonical-notes.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "GENERATED by scripts/gen-canonical-notes.mjs from this package's own built exports - do not edit by hand. These are the strings a tool written in another language must reproduce byte for byte: the static notes each result shape carries, the reserved marker keys that make those shapes recognizable,
|
|
2
|
+
"$comment": "GENERATED by scripts/gen-canonical-notes.mjs from this package's own built exports - do not edit by hand. These are the strings a tool written in another language must reproduce byte for byte: the static notes each result shape carries, the reserved marker keys that make those shapes recognizable, the coverage block's heading, and the wire spelling of a result's period (every reserved key and the literal 'unknown'). Keys are the exported constant names, so the same value is reachable as a TypeScript import from the package's main entry point. The package version lives in package.json.",
|
|
3
3
|
"notes": {
|
|
4
4
|
"ABSENCE_NOTE": "The search ran and matched nothing. This is an ANSWER, not an error: nothing failed, nothing was substituted for what was asked, and calling this tool again with the same arguments returns this same result. `checked` is the ground this answer covers; anything under `not_checked` or `cannot_cover` is ground it does NOT cover, and reaching that needs a different question, not a retry.",
|
|
5
5
|
"COVERAGE_NOTE": "This result covers only what `checked` lists. `not_checked` is ground the call this result answers did not look at, and `cannot_cover` is ground this tool can never see — a clean result here is NOT evidence about either, and no retry changes `cannot_cover`. Carry these limits into any answer you build on this result.",
|
|
@@ -12,5 +12,16 @@
|
|
|
12
12
|
},
|
|
13
13
|
"headings": {
|
|
14
14
|
"COVERAGE_BLOCK_HEADING": "Coverage of this answer"
|
|
15
|
+
},
|
|
16
|
+
"wire": {
|
|
17
|
+
"PERIOD_WIRE": {
|
|
18
|
+
"key": "period",
|
|
19
|
+
"queried": "queried",
|
|
20
|
+
"held": "held",
|
|
21
|
+
"from": "from",
|
|
22
|
+
"to": "to",
|
|
23
|
+
"readAt": "read_at",
|
|
24
|
+
"heldUnknown": "unknown"
|
|
25
|
+
}
|
|
15
26
|
}
|
|
16
27
|
}
|
package/dist/conventions.js
CHANGED
|
@@ -67,6 +67,14 @@ exports.SUBFLOW_IDS = {
|
|
|
67
67
|
* per call and handing ToolCalls the values the library fills. Absent on
|
|
68
68
|
* every other agent — the chart is byte-identical. */
|
|
69
69
|
INPUTS: 'sf-inputs',
|
|
70
|
+
/** The results layer (honesty layer 3, step 7b) — mounted at the LOOP HEAD
|
|
71
|
+
* (before `Compact`, which it precedes as the loop target) ONLY when armed
|
|
72
|
+
* (a registered tool declares a `ToolPeriod`, or the agent was built with
|
|
73
|
+
* `.resultsLayer()`). Reads the batch ToolCalls just ran — Declare → Verify
|
|
74
|
+
* → Record → Resolve — and files one `period` row per call that declared a
|
|
75
|
+
* period or whose tool declares a `ToolPeriod`. Absent on every other agent
|
|
76
|
+
* — the chart is byte-identical. */
|
|
77
|
+
RESULTS: 'sf-results',
|
|
70
78
|
};
|
|
71
79
|
// ─── The reserved subflow namespace ──────────────────────────────────
|
|
72
80
|
/**
|
|
@@ -224,6 +232,16 @@ exports.STAGE_IDS = {
|
|
|
224
232
|
RECORD_ARGUMENTS: 'record-arguments',
|
|
225
233
|
/** … and the fills and refusals ToolCalls applies. */
|
|
226
234
|
RESOLVE_ARGUMENTS: 'resolve-arguments',
|
|
235
|
+
/** The results layer's four stages, inside `sf-results` (honesty layer 3):
|
|
236
|
+
* which calls of the batch just run declared a period, or come from a tool
|
|
237
|
+
* that declares a `ToolPeriod` … */
|
|
238
|
+
DECLARE_RESULTS: 'declare-results',
|
|
239
|
+
/** … the verdict on each one's period … */
|
|
240
|
+
VERIFY_RESULTS: 'verify-results',
|
|
241
|
+
/** … one `period` row per call, and its event … */
|
|
242
|
+
RECORD_RESULTS: 'record-results',
|
|
243
|
+
/** … and what the layer does about them: flag (the rows are the flags). */
|
|
244
|
+
RESOLVE_RESULTS: 'resolve-results',
|
|
227
245
|
/** The answer layer (honesty layer 4) — mounted as the FIRST stage of the
|
|
228
246
|
* final branch ONLY when armed (`.answerLayer()`): the answer's standing,
|
|
229
247
|
* folded from the committed record, filed as data for PrepareFinal and
|
|
@@ -316,6 +334,14 @@ const PLUMBING_LOCAL_IDS = new Set([
|
|
|
316
334
|
exports.STAGE_IDS.VERIFY_ARGUMENTS,
|
|
317
335
|
exports.STAGE_IDS.RECORD_ARGUMENTS,
|
|
318
336
|
exports.STAGE_IDS.RESOLVE_ARGUMENTS,
|
|
337
|
+
// The results layer (honesty layer 3): its verdicts ride the ledger's
|
|
338
|
+
// `period` rows and `agentfootprint.findings.period`; the mount and its
|
|
339
|
+
// stages are mechanism.
|
|
340
|
+
exports.SUBFLOW_IDS.RESULTS,
|
|
341
|
+
exports.STAGE_IDS.DECLARE_RESULTS,
|
|
342
|
+
exports.STAGE_IDS.VERIFY_RESULTS,
|
|
343
|
+
exports.STAGE_IDS.RECORD_RESULTS,
|
|
344
|
+
exports.STAGE_IDS.RESOLVE_RESULTS,
|
|
319
345
|
// The answer layer (honesty layer 4): its verdict rides `turn_end` and
|
|
320
346
|
// `agentfootprint.answer.assessed`; the stage that folds it is mechanism —
|
|
321
347
|
// the answer itself is PrepareFinal's milestone, one stage later.
|
|
@@ -401,6 +427,10 @@ const MILESTONES = new Map([
|
|
|
401
427
|
// library filled a value the call left out — a stop a reader scrubs to when
|
|
402
428
|
// asking whose value a call ran with.
|
|
403
429
|
[exports.SUBFLOW_IDS.INPUTS, milestone('decision', 'Inputs')],
|
|
430
|
+
// The results layer (honesty layer 3), mounted only when armed at the loop
|
|
431
|
+
// head: where the record says what the batch just run covered in time — a
|
|
432
|
+
// stop a reader scrubs to when asking whether the data held the period.
|
|
433
|
+
[exports.SUBFLOW_IDS.RESULTS, milestone('decision', 'Results')],
|
|
404
434
|
// The answer failed its schema and the loop asked again — a stop worth
|
|
405
435
|
// scrubbing to, because everything after it is a second attempt.
|
|
406
436
|
[exports.STAGE_IDS.OUTPUT_RETRY, milestone('decision', 'Schema retry')],
|
package/dist/conventions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../src/conventions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,6CAAiD;AAGjD,gEAAgE;AACnD,QAAA,WAAW,GAAG;IACzB;0EACsE;IACtE,gBAAgB,EAAE,qBAAqB;IACvC;;qDAEiD;IACjD,QAAQ,EAAE,aAAa;IACvB,+DAA+D;IAC/D,aAAa,EAAE,kBAAkB;IACjC,6BAA6B;IAC7B,QAAQ,EAAE,aAAa;IACvB,0BAA0B;IAC1B,KAAK,EAAE,UAAU;IACjB,2CAA2C;IAC3C,KAAK,EAAE,UAAU;IACjB,uDAAuD;IACvD,UAAU,EAAE,eAAe;IAC3B,kCAAkC;IAClC,KAAK,EAAE,UAAU;IACjB;;;;oCAIgC;IAChC,KAAK,EAAE,OAAO;IACd;;;;;;gCAM4B;IAC5B,KAAK,EAAE,UAAU;IACjB;;;wDAGoD;IACpD,cAAc,EAAE,mBAAmB;IACnC;;;;;iCAK6B;IAC7B,QAAQ,EAAE,aAAa;IACvB;;;;;2DAKuD;IACvD,MAAM,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../src/conventions.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Agent.js
CHANGED
|
@@ -340,6 +340,16 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
340
340
|
* `.inputsLayer()` was set. Gates the findings event bridge and the
|
|
341
341
|
* widened ledger restore. */
|
|
342
342
|
inputsLayerArmed = false;
|
|
343
|
+
/** `.resultsLayer()` (honesty layer 3, step 7b): mount the results layer
|
|
344
|
+
* even when no registered tool declares a `ToolPeriod` — for tools a
|
|
345
|
+
* ToolProvider serves, and for tools that declare a period only on their
|
|
346
|
+
* results. */
|
|
347
|
+
resultsLayerOption;
|
|
348
|
+
/** Whether this agent's chart mounts the results layer (`sf-results`) —
|
|
349
|
+
* decided ONCE, in `buildChart`: a registered tool declares a `ToolPeriod`,
|
|
350
|
+
* or `.resultsLayer()` was set. Gates the findings event bridge and the
|
|
351
|
+
* widened ledger restore, as the inputs layer's flag does. */
|
|
352
|
+
resultsLayerArmed = false;
|
|
343
353
|
/** `.answerLayer()` (honesty layer 4): the answer's standing folded at the
|
|
344
354
|
* head of the final branch and served as data; `standingLine` — also one
|
|
345
355
|
* line appended to a prose answer. Undefined on every agent that did not
|
|
@@ -765,6 +775,8 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
765
775
|
this.findingsOptions = opts.findings;
|
|
766
776
|
if (opts.inputsLayer === true)
|
|
767
777
|
this.inputsLayerOption = true;
|
|
778
|
+
if (opts.resultsLayer === true)
|
|
779
|
+
this.resultsLayerOption = true;
|
|
768
780
|
if (opts.answerLayer === true)
|
|
769
781
|
this.answerLayerOption = {};
|
|
770
782
|
else if (typeof opts.answerLayer === 'object' && opts.answerLayer !== null) {
|
|
@@ -2853,8 +2865,9 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
2853
2865
|
// per-event work, and `agent.on('agentfootprint.findings.*')` can only
|
|
2854
2866
|
// ever fire on an agent that could have filed a row.
|
|
2855
2867
|
// Also under the inputs layer (honesty layer 2): its `argument` rows are
|
|
2856
|
-
// filed through the same writer and ride the same domain
|
|
2857
|
-
|
|
2868
|
+
// filed through the same writer and ride the same domain — and under the
|
|
2869
|
+
// results layer (honesty layer 3), whose `period` rows do the same.
|
|
2870
|
+
if (this.findingsOptions !== undefined || this.inputsLayerArmed || this.resultsLayerArmed) {
|
|
2858
2871
|
attachObserver(new EmitBridge_js_1.EmitBridge({
|
|
2859
2872
|
id: 'agentfootprint.findings-bridge',
|
|
2860
2873
|
prefix: 'agentfootprint.findings.',
|
|
@@ -3250,6 +3263,11 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
3250
3263
|
* trace), each stamped with its conversation `turn` — WITHOUT `.findings()`.
|
|
3251
3264
|
* A reader that switches over every row kind must skip one it does not know.
|
|
3252
3265
|
*
|
|
3266
|
+
* THE RESULTS LAYER files here too (honesty layer 3, step 7b): `period` rows
|
|
3267
|
+
* — one per call whose result declared the period its read covered, or whose
|
|
3268
|
+
* tool declares a period argument: `covered`, `partly-held`, `not-held`,
|
|
3269
|
+
* `unknown`, or `undeclared` (the result said nothing about its period).
|
|
3270
|
+
*
|
|
3253
3271
|
* Detached from the execution record (`structuredClone`), so a caller may
|
|
3254
3272
|
* keep or mutate it without touching the run's state.
|
|
3255
3273
|
*
|
|
@@ -3299,6 +3317,11 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
3299
3317
|
* the first run. Detached from the execution record, so a caller may keep
|
|
3300
3318
|
* or mutate it.
|
|
3301
3319
|
*
|
|
3320
|
+
* `periods` (honesty step 7b) — present only when a call's result declared
|
|
3321
|
+
* the period its read covered: one entry per declaring call, `{ toolName,
|
|
3322
|
+
* toolCallId, queried, held, readAt? }`, the period as the tool declared it
|
|
3323
|
+
* — the data twin of the prose block's `Period:` lines.
|
|
3324
|
+
*
|
|
3302
3325
|
* @example
|
|
3303
3326
|
* ```ts
|
|
3304
3327
|
* const agent = Agent.create({ provider, model })
|
|
@@ -3818,14 +3841,28 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
3818
3841
|
const ruledTools = new Map([...registryByName.entries()].filter(([, tool]) => tool.askOrAssume !== undefined || tool.period !== undefined));
|
|
3819
3842
|
const inputsArmed = ruledTools.size > 0 || this.inputsLayerOption === true;
|
|
3820
3843
|
this.inputsLayerArmed = inputsArmed;
|
|
3844
|
+
// ── The results layer (honesty layer 3, step 7b) — armed ONCE, here ──
|
|
3845
|
+
// A registered tool that declares a `ToolPeriod` (the inputs layer's
|
|
3846
|
+
// declaration: which argument sets the period) arms the mount, over the
|
|
3847
|
+
// same catalog: its results owe a period, and a result that declares none
|
|
3848
|
+
// is recorded as silence. `.resultsLayer()` arms it for tools the build
|
|
3849
|
+
// cannot see and for tools that declare a period only on their results.
|
|
3850
|
+
// Unarmed: nothing below is mounted, read or written.
|
|
3851
|
+
const resultsArmed = [...registryByName.values()].some((tool) => tool.period !== undefined) ||
|
|
3852
|
+
this.resultsLayerOption === true;
|
|
3853
|
+
this.resultsLayerArmed = resultsArmed;
|
|
3821
3854
|
if (inputsArmed && ruledTools.size > 0)
|
|
3822
3855
|
seededRuledTools = ruledTools;
|
|
3823
3856
|
// ── The answer layer (honesty layer 4) — armed by its option alone ─────
|
|
3824
3857
|
const answerArmed = this.answerLayerOption !== undefined;
|
|
3825
3858
|
// The run constant names every armed layer; the restore is wired whenever
|
|
3826
3859
|
// one is (adopted Q6) — still value-conditional inside seed.
|
|
3827
|
-
if (inputsArmed || answerArmed) {
|
|
3828
|
-
seededHonestyLayers = (0, armed_js_1.honestyLayersOf)({
|
|
3860
|
+
if (inputsArmed || resultsArmed || answerArmed) {
|
|
3861
|
+
seededHonestyLayers = (0, armed_js_1.honestyLayersOf)({
|
|
3862
|
+
inputs: inputsArmed,
|
|
3863
|
+
results: resultsArmed,
|
|
3864
|
+
answer: answerArmed,
|
|
3865
|
+
});
|
|
3829
3866
|
ledgerRestoreArmed = true;
|
|
3830
3867
|
}
|
|
3831
3868
|
// The gate's admissible set, for the record (9.50.0): declared hops from
|
|
@@ -4240,10 +4277,13 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
4240
4277
|
// trailing positional: the rows this decider files carry the turn
|
|
4241
4278
|
// stamp, and with the evidence gate armed too, the gate's exempt corpus
|
|
4242
4279
|
// gains this turn's assumed values, read from the tools' declarations,
|
|
4243
|
-
// and the values the person gave the layer's batch ask (step 4).
|
|
4244
|
-
|
|
4280
|
+
// and the values the person gave the layer's batch ask (step 4). The
|
|
4281
|
+
// results layer (step 7b) arms the stamp alone — "while any layer is
|
|
4282
|
+
// armed, the one writer stamps the turn" — and nothing else.
|
|
4283
|
+
inputsArmed || resultsArmed
|
|
4245
4284
|
? {
|
|
4246
|
-
...(
|
|
4285
|
+
...(inputsArmed &&
|
|
4286
|
+
this.evidenceGate !== undefined && {
|
|
4247
4287
|
declaredDefaults: (0, route_js_2.declaredDefaultsFrom)((toolName, argument) => {
|
|
4248
4288
|
const rules = (0, declare_js_1.rulesOf)(resolveForLayer(toolName).tool);
|
|
4249
4289
|
if (rules === undefined || (0, declare_js_1.isRefused)(rules))
|
|
@@ -4294,6 +4334,10 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
4294
4334
|
// The inputs layer (honesty layer 2) — the fills, the refusals and the
|
|
4295
4335
|
// note; absent → a ruled tool's call is refused (fail closed).
|
|
4296
4336
|
...(inputsArmed && { inputsLayer: true }),
|
|
4337
|
+
// The results layer (honesty layer 3, step 7b) — read in one place: a
|
|
4338
|
+
// period a result declares with NO layer mounted is dev-warned (nobody
|
|
4339
|
+
// will file its verdict). And the turn stamp, as under any layer.
|
|
4340
|
+
...(resultsArmed && { resultsLayer: true }),
|
|
4297
4341
|
// The answer layer (honesty layer 4) — only the turn stamp on the rows
|
|
4298
4342
|
// this handler files (adopted Q6).
|
|
4299
4343
|
...(answerArmed && { answerLayer: true }),
|
|
@@ -4520,6 +4564,12 @@ class Agent extends RunnerBase_js_1.RunnerBase {
|
|
|
4520
4564
|
...(this.toolMiddleware.length > 0 && { rewrites: true }),
|
|
4521
4565
|
},
|
|
4522
4566
|
}),
|
|
4567
|
+
// The results layer (honesty layer 3, step 7b): `sf-results` at the loop
|
|
4568
|
+
// head, in both builders through one helper, reading each call's
|
|
4569
|
+
// `ToolPeriod` off the implementation that answered it; absent → untouched.
|
|
4570
|
+
...(resultsArmed && {
|
|
4571
|
+
resultsLayer: { toolOf: (toolName) => resolveForLayer(toolName).tool },
|
|
4572
|
+
}),
|
|
4523
4573
|
// The answer layer (honesty layer 4): its stage heads the final branch
|
|
4524
4574
|
// in both builders through one helper, reading only the committed keys
|
|
4525
4575
|
// this agent's arms can write; absent → the branch is untouched.
|