Commit Graph
85 Commits
Author SHA1 Message Date
Jack Chen edc33db1a4 Merge branch 'main' into agent/task-requirements-hard-constraints 2026-07-26 14:16:22 +08:00
Jack Chen 0803bab9c8 fix(core): enforce task requirements globally 2026-07-26 11:21:17 +08:00
Jack Chen a183267e8d fix(core): fail closed on invalid coordinator plans 2026-07-26 10:55:20 +08:00
Jack Chen e1d510e20a docs: sync READMEs and scheduling doc with shipped features (#439)
* 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
2026-07-24 01:21:39 +08:00
Jack Chen 555aab4b56 feat(core): add Japanese and Korean routing support (#438) 2026-07-24 00:53:33 +08:00
Jack Chen aee1026daa feat(core): add task-scoped results and handoffs (#435)
Expose per-task results, structured dependency payloads, and bounded task metadata across checkpoints, traces, receipts, and CLI output.
2026-07-23 23:50:00 +08:00
Jack Chen 432b2fa6d1 feat(core): pipeline DAG tasks as dependencies complete (#434) 2026-07-23 19:52:48 +08:00
Jack Chen ed1fbf64ad feat(core): add capability-aware agent selection (#431) 2026-07-23 16:05:09 +08:00
Jack Chen c12b743905 feat(core): trace execution routing decisions (#430)
* feat(core): trace execution routing decisions

* docs: align routing decision source semantics
2026-07-23 15:25:32 +08:00
Jack Chen f6ee234401 feat(core): add pluggable multilingual execution routing (#429)
* feat(core): add pluggable multilingual execution routing

* fix(core): preserve goal-based execution routing
2026-07-23 14:50:20 +08:00
Jack Chen b6c4ae3ee7 fix(core): honor planOnly for governed team runs (#428) 2026-07-23 14:35:43 +08:00
Jack Chen 8c275a717e feat(orchestrator): resolve mode and governance budget conflicts (#423) 2026-07-23 13:47:04 +08:00
LambIessz b183c0adee feat(core): add retryable route fallback (#424)
* feat(core): add retryable route fallback

* fix(core): preserve streamed provider failure classification
2026-07-23 13:30:07 +08:00
Jack Chen 801c398379 feat(tool): flag-and-confirm undeclared consequential runs (#422) 2026-07-23 10:37:00 +08:00
Jack Chen f0c7370492 test(eval): add routing-stability language-neutrality gate (#421) 2026-07-23 10:31:51 +08:00
Jack Chen 26be338ff7 feat(orchestrator): add declared governance and post-execution floor (#420) 2026-07-23 10:28:48 +08:00
Jack Chen 7dcde7d8fc feat(observability): add execution receipt (#418) 2026-07-23 10:25:29 +08:00
Jack Chen 4e4d70eebc docs: streamline README information architecture (#410)
* docs: streamline README information architecture

* docs: fix inbound anchors and restore orphaned API docs (#410)

* docs: restore ecosystem detail and hook, link site comparison, switch commercial contact to email (#410)

* docs: recenter positioning on in-your-environment moat (#410)

* docs: add Engram star count (#410)
2026-07-19 12:26:01 +08:00
Jack Chen feead27b04 feat(core): add reference evaluation scorers (#409) 2026-07-19 10:59:17 +08:00
Jack Chen c2046e04f6 feat(core): add online evaluation sampling (#408) 2026-07-19 10:21:54 +08:00
Jack Chen 56a1fa417b feat(core): add evaluation stores (#407) 2026-07-19 02:06:01 +08:00
Jack Chen b7b0a9804f feat(core): add eval gates and CI enforcement (#406) 2026-07-19 00:33:19 +08:00
Jack Chen 4fad8c19d3 feat(core): add eval CLI and report outputs (#405) 2026-07-19 00:02:29 +08:00
Jack Chen cedbd796e6 feat(core): add EvalSet offline runner (#404) 2026-07-18 23:26:28 +08:00
Jack Chen 452c193eff feat(core): add evaluation scorer contracts (#403) 2026-07-18 22:53:52 +08:00
Jack Chen 5400dcc65a feat(core): add per-run metadata channel (#396) 2026-07-18 15:39:32 +08:00
Jack Chen 4db6756eaf feat(core): add offline run viewer for result and trace data (#394)
* 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
2026-07-18 11:06:27 +08:00
Jack Chen 9338bb4dec chore(observability): complete OBS-5 release readiness (#385)
* chore(observability): complete OBS-5 release readiness

* docs(observability): add v2 architecture to core readme
2026-07-16 18:00:16 +08:00
Jack Chen 6339ee5051 feat(observability): add FileTraceStore reference implementation (#384)
* feat(observability): add FileTraceStore reference

* fix(ci): keep benchmark out of core tarball
2026-07-16 16:50:59 +08:00
Jack Chen 1747afad6f docs(tool-gate): document onToolCall gate + classifier, add runnable example (#383)
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
2026-07-16 16:45:43 +08:00
Jack Chen 91eceeb004 Merge branch 'main' into agent/observability-v2-obs-3-otel 2026-07-16 14:53:47 +08:00
Scarab SystemsandJack Chen fa1606cad2 feat(agent): add generic process backend (#378)
* feat(agent): add process backend

* test(agent): cover process backend orchestration

* feat(agent): expose process backend entrypoint

* docs(agent): add process backend example

* docs(agent): document external backend variants

* fix(agent): harden process backend lifecycle

---------

Co-authored-by: Jack Chen <chenkaijie01@gmail.com>
2026-07-16 14:40:26 +08:00
Jack Chen 0d299213f0 fix(otel): resolve links and bound span state (#376) 2026-07-16 00:53:42 +08:00
Jack Chen 4d818a0b59 feat(otel): add optional OpenTelemetry adapter 2026-07-16 00:22:36 +08:00
Jack Chen fd1f515b69 feat(core): add trace store contract and memory reference 2026-07-15 23:59:18 +08:00
Jack Chen 5e049b95fc feat(core): add trace sink lifecycle 2026-07-15 23:06:02 +08:00
Jack Chen 3d29274b4f feat(core): add span lifecycle and hierarchy
Implement TraceRecord v2 start/event/end records, idempotent lifecycle closure, runtime hierarchy and links, legacy trace compatibility, contract coverage, and a reproducible no-sink benchmark.
2026-07-15 22:08:49 +08:00
Jack Chen 58096804a0 feat(core): add run identity and outcome semantics (#371)
* feat(core): add run identity and outcome semantics

* docs: sync Chinese observability guidance
2026-07-15 20:41:25 +08:00
Jack Chen ffb2905017 feat(agent): orchestrate external coding agents over ACP (#204) (#360)
* feat(agent): orchestrate external coding agents over ACP (#204)

Add an AgentBackend seam so an Agent can run on either the LLM AgentRunner
or an external agent. First backend: an ACP client that drives a coding CLI
(e.g. Claude Code via its ACP adapter) as a first-class team member — same
task DAG, shared memory, cascade, and token budget as LLM agents.

- Extract AgentBackend ({ run, stream }) that AgentRunner already implements;
  Agent.getBackend() branches on AgentConfig.backend.
- AcpBackend spawns the agent over stdio JSON-RPC and maps session updates to
  a RunResult (text, tool calls, usage); handles permissions and abort.
- ACP SDK as a lazy optional peer; new /acp subpath export.
- docs/external-agents.md, a hybrid-team example, and tests (in-process fake
  agent + subprocess integration).

Experimental: ACP is young; token accounting maps ACP's single context
figure and client-side fs proxying is not implemented yet.

* fix(agent): harden ACP backend after review (#204)

Follow-up fixes on the ACP external-agent backend (PR #360):

- Token accounting: usage_update.used is a cumulative context-size gauge, not a
  per-turn delta. Record each turn's increment so summing across a reused session
  telescopes to the latest figure instead of double-counting.
- systemPrompt: ACP has no system-prompt field, so prepend the agent's systemPrompt
  to the session's first turn (once). It was previously dropped and only fed
  coordinator routing.
- Abort: when the signal is already aborted before a turn starts, return empty
  output without prompting (no in-flight turn to cancel).
- Startup: clear the cached start() promise on failure so a later run retries
  instead of re-throwing the same rejection forever.
- Permissions: auto-approve now prefers least-privilege allow_once over a
  session-wide allow_always.

Docs (external-agents.md, CLAUDE.md) updated to match. ACP tests 10 to 15;
lint + full suite (1135) green.
2026-07-10 23:26:40 +08:00
Jack Chen fbc3116bff feat(agent): per-agent scoped tool credentials (#362)
Add AgentConfig.credentials, a per-agent secret bag threaded into
ToolUseContext.credentials. Tool code reads context.credentials?.KEY
instead of closing a shared secret over every tool, so each agent holds
only the credentials it was assigned; a compromised subagent can't reach
another agent's secrets. Per-agent bags flow through the existing config
spread, so no orchestrator changes are needed, and the coordinator (built
field-by-field) never receives user tool secrets.

Addresses the credential-scoping half of #19. Per-call risk gating stays
tracked in #96.
2026-07-10 22:10:31 +08:00
Jack Chen 0fab4bce60 feat(memory): redact secrets on the persistence path via RedactingStore (#339) (#359)
Redaction stopped at the observability layer, so secrets an agent emitted into its answer were persisted verbatim to shared memory and on-disk checkpoints. Add RedactingStore, a MemoryStore decorator that scrubs values on write, plus optional custom patterns on the redaction utilities. One wrap of the durable store closes both persistence sinks.

Closes #339.
2026-07-09 22:25:53 +08:00
Jack Chen f4c7bdd9e2 docs: document orchestrator cost budget and refresh cost example model (#361)
- README_zh.md: add the "Cap estimated cost" section and production-checklist
  row that #358 added only to the English package README, keeping EN/ZH in sync
- consensus.md: extend the budget invariant so maxCostBudget is documented at
  the same verify-hook boundary as maxTokenBudget; standalone runConsensus
  tracks tokens only
- README EN/ZH: switch the cost example to gpt-5.4-mini, pricing matching the
  repo's existing cost-tiered-pipeline example

Follow-up documentation for #358.
2026-07-09 17:16:03 +08:00
Jack Chen 2c6d6009a6 docs: remove MiniMax provider community offer and setup guide (#356)
Reverts the sponsor content added in #219:
- Drop the 'Provider community offers' section and MiniMax offer bullet
  from README.md, README_zh.md, and the packages/core mirrors
- Delete docs/providers/minimax.md (offer-specific setup guide)
- Delete .github/brand/minimax-banner.png (used only by that guide)

MiniMax stays supported as a neutral provider: the provider table in
docs/providers.md, the MINIMAX_BASE_URL note in docs/cli.md, the
examples/providers/minimax.ts sample, and contributor credits are all kept.
2026-07-06 15:08:03 +08:00
tlysanhuoandsanhuo11 ec7deb6ae5 feat(core): add trace span parent linkage (#354)
Closes #340.

add spanId and optional parentId to every TraceEventBase
generate stable agent span IDs so LLM/tool spans can point to their owning agent span
link team-run worker agents under task spans, stream events under worker agent spans, and plan_ready under coordinator decomposition
document the trace parentage model and add focused tests for span linkage

Co-authored-by: sanhuo11 <tlysanhuo@gmail.com>
2026-07-06 10:13:45 +08:00
Jack Chen 79c622a2c2 docs: add plan preview & replay guide and surface it in READMEs (#349) 2026-07-01 22:19:01 +08:00
Jack Chen caef4b31f1 feat(memory): ship FileStore, a zero-dependency durable MemoryStore (#347)
Zero-dependency, filesystem-backed MemoryStore with atomic fsync+rename
writes, so checkpoint/resume survives a process restart out of the box.
Node built-ins only; recommended as the checkpoint store while shared
memory stays in RAM. Includes load-time hardening that rejects non-object
metadata.

Closes #338
2026-07-01 18:27:03 +08:00
Jack Chen 0488362c0d feat(orchestrator): error-aware task retry (classify, jitter, honor abort) (#346)
Error-aware task retry (opt-in via maxRetries > 0):

- Skip retries on provably-terminal failures (4xx client errors except
  408/409/429, token-budget, invalid-message, aborted calls).
- Equal jitter on backoff to avoid lockstep retries against a rate-limited
  provider.
- Honor abortSignal between attempts (no full-backoff sleep or extra attempt
  after cancel).
- Non-streaming path preserves the structured error on AgentRunResult.error so
  classification works off the default runTeam path; test-covered.

Off by default; behavior changes only when retry is enabled.

Closes #337
2026-07-01 17:22:54 +08:00
Jack Chen 98dbc2025e docs(examples): prefix example run commands with packages/core/ (#330)
* docs(examples): prefix example run commands with packages/core/

Examples live under packages/core/, and both READMEs document running them from the repo root (npx tsx packages/core/examples/<path>.ts), but the in-file Run: headers and a few READMEs still used the bare examples/ path. The repo root has no top-level examples/, so copy-pasting those commands from root failed with file-not-found.

Prefixes 67 run/cd commands across 56 files (53 example scripts + examples/README.md + two integration READMEs). Markdown links that use the bare examples/ path are correct relative links and are left unchanged.

* docs: prefix two stale examples/ path references in docs/

context-management.md and tool-configuration.md referenced bare examples/ paths that do not resolve from the repo root. Make the first a relative link (matching the convention in model-routing.md) and prefix the second with packages/core/. Follow-up to the run-command fixes in this PR.
2026-06-24 17:14:23 +08:00
Jack Chen a1986a340a feat(checkpoint): cut snapshot volume and re-run synthesis on runTeam restore (#314)
Cuts the per-task O(N^2) shared-memory snapshot volume (reused-store skip) and re-runs coordinator synthesis on runTeam restore, plus docs/checkpoint.md and README coverage. Closes #20. Refs #294 #312 #313.
2026-06-19 15:23:11 +08:00
Jack Chen 1d37ce6026 refactor(repo): monorepo groundwork for an easier first run (#303)
* refactor(repo): monorepo groundwork for an easier first run

Trying OMA for the first time costs more than it should: a lot to read before anything runs, and no one-command way to watch a team actually work. The plan is to fix that with a `npm create oma` scaffold (a multi-agent demo that runs on the first try) and an npm README that leads with getting started. Neither lands cleanly until core lives in its own package, so this PR does that part first.

This is groundwork, not the payoff: nothing changes for anyone installing `@open-multi-agent/core` today. It turns the repo into an npm-workspaces monorepo with core in `packages/core/`, and splits the README into a GitHub landing page (root) and the npm package page (`packages/core/`). Doing it now, while the repo is small, avoids migrating twice.

The published package is byte-identical: same name, same three runtime dependencies, same entry points, guarded by an isolated-install smoke test. `npm ci` + lint + test (1060) + build pass; the tarball still ships only `dist/`, `README.md`, `LICENSE`, and `package.json`.

* build: restore cross-platform optional deps in package-lock.json

Regenerating the lockfile on macOS pruned the non-host rollup/esbuild optional binaries (npm/cli#4828), so Linux CI could not load @rollup/rollup-linux-x64-gnu and vitest failed to start. Rebuild the lock from the pre-migration base so every platform variant is present again. Verified with npm ci + lint + build + test (1060).

* fix(examples,docs): correct monorepo paths and anchors after the packages/core move

with-vercel-ai-sdk example (pre-existing, surfaced by the move):
- package.json: the @open-multi-agent/core file: link was file:../../, which
  resolves to packages/core/examples (no manifest). Corrected to file:../../..
  (packages/core); predev cd updated to match.
- package-lock.json regenerated: was linking ../.. and pinning a stale core
  1.4.0; now links ../../.. at 1.7.0.
- README: setup paths and the file: note updated.

docs missed by the move:
- docs/cli.md: repo-clone build output is now packages/core/dist/cli/oma.js;
  the quick-start anchor now lives in the package README.
- CONTRIBUTING.md: the architecture anchor and src/ entry-point paths now live
  under packages/core/.
2026-06-18 17:31:52 +08:00