- separate application-owned data from model-visible text, image, and file content
- map rich results across built-in adapters and preserve them through recovery
- retain backward compatibility for string tools and text-only errors
Closes#466
`docs/tool-configuration.md` described the automatic `runTeam()` route as
Hybrid by default and told readers to set
`executionRouting: { strategy: 'deterministic' }` to restore no-profiler
behavior. Both halves are inverted, and they contradict the 1.14.0
Compatibility note in the changelog, `docs/execution-routing.md`, and the
core README.
The text is a leftover from before e0e4cf6 ("fix(core): make hybrid routing
opt-in"), which updated `docs/execution-routing.md`,
`packages/core/README.md`, and `docs/evaluation.md` but not this file.
The implementation agrees that Hybrid is opt-in:
- `types.ts` documents `deterministic` as the `strategy` default.
- The orchestrator resolves `strategy ?? 'deterministic'` for both the
constructor config and the per-run override.
- Semantic profiling is gated on `strategy === 'hybrid'`, so the default
path makes no profiler call.
- `semantic-routing.test.ts` asserts that an orchestrator configured with no
`executionRouting` produces no `semanticRoutingAssessment`.
Point the corrected sentence at `docs/execution-routing.md`, which already
owns the strategy details, and rewrap the paragraph that the stale edit left
broken mid-sentence.
A repository-wide scan found no other occurrence of the inverted claim.
Map OMA thinking controls to DeepSeek's native request shape, keep the provider-specific max effort isolated from other OpenAI-family adapters, and refresh model guidance and canary coverage.
* chore(deps)!: upgrade OpenAI SDK to v7
Require Node.js 22 across packages, starters, and CI. Add real SDK boundary coverage and reject unsupported custom tool calls explicitly.
Refs #391
* fix(core): classify OpenAI user aborts as cancellation
Use the SDK error constructor name because OpenAI v7 APIUserAbortError retains the default Error name. Cover retry and observability classification with the real SDK class.
* chore(deps)!: target OpenAI v6 and retain Node 20
* docs: simplify Node runtime guidance
* docs: sync READMEs and scheduling doc with shipped features
* docs: restore Engram repo link with star count
* docs: formalize Why OMA register in root README
* feat(core): add unified run viewer
* feat(cli): export run viewer from trace store
* docs(core): add deterministic run viewer demo
* fix(examples): resolve workspace paths in typecheck
* fix(dashboard): center detail status labels
* fix(dashboard): remove DAG status rails
* fix(dashboard): enlarge DAG task cards
* fix(dashboard): clarify run summary header
* docs: align readmes with run viewer
Third split of #96 (follow-up to #379). The onToolCall gate shipped in #377 and
the classifyBashCommand classifier in #379; this documents both and adds a
runnable example.
- docs/tool-configuration.md: a "Per-call gating with onToolCall" section (where
it sits, ToolCallContext/ToolCallDecision, deny returns an error ToolResult not
a throw, agent overrides orchestrator default, orthogonal to onApproval,
gated/gateAction/gateReason on the trace with gateReason redacted, not a
security boundary) plus a shell risk classifier subsection.
- examples/patterns/risk-gated-bash.ts: a security-audit agent that classifies
each bash command and routes safe/review/high to allow/human-approval/deny.
- AGENTS.md: cross-links in the tool-layer notes + /classifiers in the exports map.
Closes#380