586 Commits
Author SHA1 Message Date
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 337b1dbe9d refactor(core): dedupe agent-default expansion (#402) 2026-07-18 22:16:38 +08:00
Jack Chen 46fee9c388 refactor(core): extract coordinator module (3/3) (#401)
Move the coordinator subsystem out of orchestrator.ts into coordinator.ts:
goal-decomposition parsing, coordinator prompt construction (system prompt,
roster, output format, decomposition), the synthesis pass, and task-spec loading.

The parse helpers are a pure move. The former private class methods become free
functions; two take the orchestrator config explicitly (buildCoordinatorBaseConfig,
runCoordinatorSynthesis) instead of this.config. Prompt string literals are
byte-for-byte unchanged (only code indentation shifts as methods de-indent to
module scope). One type follow-on: runCoordinatorSynthesis gains a
`?? DEFAULT_MODEL` guard because OrchestratorConfig.defaultModel is optional where
the resolved class field was not; it is dead at runtime (callers pass the resolved
config) and mirrors the same guard already in task-execution's executeQueue.

orchestrator.ts drops from 2213 to 1683 lines (57% below the original 3953). Also
updates the AGENTS.md layer map.

Verified with npm run lint, 1385 passing tests, zero diff under tests/, a
byte-identical parse block, all 87 single-quoted and 17 backtick prompt-string
literals identical, and a dist/index.d.ts identical to the pre-split build.

Third of three sequential pure-move PRs; builds on the merged #400 and #397.
2026-07-18 18:24:06 +08:00
Jack Chen 4f0431be43 refactor(core): extract consensus and task-execution modules (2/3) (#400)
Move the orchestration loop and the consensus subsystem out of orchestrator.ts
into two focused modules, with zero behavior change:

- task-execution.ts: the dependency-ordered execution loop (executeQueue),
  delegation team-info, checkpoint saves, and per-task prompt assembly
- consensus.ts: the proposer/judge verification loop (runConsensusCore) and the
  per-task verify hook (runTaskVerify)

orchestrator.ts drops from 3305 to 2213 lines. task-execution depends on
consensus (runTaskVerify); both build on the PR1 foundation modules. The module
graph stays acyclic.

Pure move: extracted bodies are byte-identical to the originals (only an export
prefix added) and the kept region is byte-identical. Verified with npm run lint,
1385 passing tests, zero diff under tests/, and a dist/index.d.ts identical to
the pre-split build.

Second of three sequential pure-move PRs; builds on the merged #397 foundation
modules.
2026-07-18 18:16:38 +08:00
Jack Chen 3b69bc0047 refactor(core): extract orchestrator foundation modules (1/3) (#397)
Move pure module-level helpers out of the 3953-line orchestrator.ts into five
focused modules, with zero behavior change:

- run-context.ts: RunContext/ActiveCheckpoint types, run identity/metadata
  helpers, and the token/error utilities (the dependency-free base)
- budget.ts: token/cost accounting, budget-cap enforcement, run-metrics rollup
- short-circuit.ts: isSimpleGoal / selectBestAgent
- retry.ts: executeWithRetry / computeRetryDelay
- agent-config.ts: buildAgent, default-tool-preset grant, model routing

orchestrator.ts drops to 3305 lines and re-exports isSimpleGoal, selectBestAgent,
computeRetryDelay, and executeWithRetry, so the index.ts barrel and all test
import paths are unchanged.

Pure move: extracted bodies are byte-identical to the originals (only an export
prefix added) and the kept region is byte-identical to origin/main. Verified with
npm run lint plus 1385 passing tests, zero diff under tests/, and a
dist/index.d.ts identical to the pre-split build.

First of three sequential pure-move PRs (PR2: consensus + task-execution;
PR3: coordinator + AGENTS.md).
2026-07-18 18:02:58 +08:00
Jack Chen 5400dcc65a feat(core): add per-run metadata channel (#396) 2026-07-18 15:39:32 +08:00
Jack Chen 6bc55f665a docs: replace README hero GIF with real Run Viewer capture (#395)
* fix(dashboard): pin workspace to the run viewer grid's 1fr row

* docs: replace README hero GIF with real Run Viewer capture
2026-07-18 12:50:48 +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 616a2c4397 test(e2e): add credential-aware DeepSeek canary (#392) 2026-07-17 20:57:21 +08:00
Geonho 002f602087 fix(process): clean descendants after parent exit (#390)
Clean the detached process group when stream consumption stops after the direct child has already exited. Adds a POSIX regression verifying the descendant is terminated. Fixes #387.
2026-07-17 20:22:56 +08:00
Jack Chen 728d550724 chore(deps): refresh form-data, hasown, ws in lockfile (#389) 2026-07-17 19:55:13 +08:00
Jack Chen 0e32527069 chore: release core v1.11.0 + otel v0.1.0 + create-oma-app v0.4.0 (#388)
* chore: release core v1.11.0 + otel v0.1.0 + create-oma-app v0.4.0

* chore: sync create-oma-app 0.4.0 into the lockfile
v1.11.0
2026-07-17 18:55:44 +08:00
Jack Chen 42bd0572c9 feat(examples): add adaptive customer support recipe (#386) 2026-07-17 09:21:07 +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 e6869fdba9 feat(classifiers): add optional classifyBashCommand behind /classifiers subpath (#382)
Ships an opt-in, dependency-free shell risk classifier for the onToolCall gate
(#377). classifyBashCommand(command) returns safe | review | high so users get
the taxonomy from #96 without writing regex tables by hand.

- safe: read-only inspection (ls, cat, grep/rg with a path, git status/log/diff)
- review: context bombs and unknowns (ls -R, find / without -maxdepth,
  grep -r / rg -r without scope, tree, du, unrecognised commands)
- high: destructive/sensitive (rm, sudo, curl | bash, dd, mkfs, chmod 777/-R,
  git push --force, npm publish)

Compound commands are segmented on shell separators and the highest risk wins;
quoted strings are stripped so patterns inside a string do not match. Convenience
heuristic, not a security boundary. Exported only via
@open-multi-agent/core/classifiers so pattern tables never load unless imported.

Closes #379
2026-07-16 16:15:48 +08:00
Jack Chen 86c4b05b6e docs: refresh pull request guidance (#381) 2026-07-16 15:09:30 +08:00
Jack Chen 3c7265bfc8 Merge pull request #376 from open-multi-agent/agent/observability-v2-obs-3-otel
feat(otel): add optional OpenTelemetry adapter
2026-07-16 14:55:58 +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 feab6b9fe2 chore(otel): peer-depend on @opentelemetry/api and restart versioning at 0.1.0
The OTel JS ecosystem convention (official instrumentations, @vercel/otel, @prisma/instrumentation) is a peer dependency on the API so the application owns the single copy; npm 7+ auto-installs it. The package also moves off lockstep-with-core onto its own version track starting at 0.1.0, releasing only when it changes; compatibility is expressed by the ^1.10.0 core range.
2026-07-16 12:46:22 +08:00
Jack Chen 0bdadd63b3 chore: drop the year from LICENSE copyright lines
The root and core files claimed 2025 but the project started in April 2026; the new otel file omitted the contributors wording. Align all three on the year-free form used by projects like React and OpenTelemetry so copies can never carry a wrong year.
2026-07-16 12:46:14 +08:00
Jack Chen 4a47991657 ci(otel): guard the npm tarball and harden the core boundary test
Assert the otel tarball ships only dist/, README.md, LICENSE, and package.json with its entry points present, smoke-test the built entry import, and scan core src for @opentelemetry references since workspace hoisting makes the import-based check toothless.
2026-07-16 12:31:22 +08:00
Jack Chen b955d05f8e fix(otel): make record failure diagnostics precise and pin instrumentation version
span_event and span_end failures previously surfaced as span_start_failed, and the end path double-reported. Each record type now maps to its own diagnostic and ExportResult code. The default tracer instrumentationVersion moves to a PACKAGE_VERSION constant with a guard test against package.json so releases cannot drift.
2026-07-16 12:31:14 +08:00
Jack Chen f123e437f5 docs(core): sync otel notes into package README mirrors
Mirror the root README OTel notes into the packages/core EN/ZH READMEs: lead paragraph, dependencies section, dependency table row, and the observability documentation entry.
2026-07-16 12:20:42 +08:00
Jack Chen b9329675b7 fix(otel): start root spans from ROOT_CONTEXT, not ambient context
With a global context manager registered, batched export made root spans inherit whatever application span was active at flush time. Pin span creation to ROOT_CONTEXT and add a regression test.
2026-07-16 12:20:35 +08:00
Scarab Systems e87080b6f7 feat(core): add per-call tool gate hook (#377)
Part of #96.
2026-07-16 11:45:47 +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 b1848812b8 Merge pull request #375 from open-multi-agent/agent/observability-v2-obs-4a-trace-store
feat(core): add TraceStore contract and in-memory reference
2026-07-16 00:05:02 +08:00
Jack Chen fd1f515b69 feat(core): add trace store contract and memory reference 2026-07-15 23:59:18 +08:00
Jack Chen 1eebfbfa17 Merge pull request #374 from open-multi-agent/agent/observability-v2-obs-2
feat(core): add OBS-2 trace sink lifecycle
2026-07-15 23:31:23 +08:00
Jack Chen 4b819f9765 test(core): support Node 18 observability tests 2026-07-15 23:28:44 +08:00
Jack Chen 5e049b95fc feat(core): add trace sink lifecycle 2026-07-15 23:06:02 +08:00
Jack Chen e75c4e33ec Merge pull request #373 from open-multi-agent/agent/observability-v2-obs-1b
feat(core): add OBS-1B span lifecycle and hierarchy
2026-07-15 22:14:49 +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 7bc6d0fc4e ci: add post-release npm smoke test (#372)
run a post-release smoke test against create-oma-app and core from the public npm registry
scaffold the recommended PR-review cloud starter and verify both its declared and installed core version match the GitHub Release tag
retry registry propagation with online-preferred resolution, then prove the generated demo reaches the expected missing-key gate
use a fresh project directory per retry so failed attempts cannot contaminate later attempts
2026-07-15 21:10:46 +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 394a65ec90 feat(create-oma-app): add production agent templates (#370)
* feat(create-oma-app): add production agent templates

* docs: describe starters from user perspective
2026-07-15 18:05:05 +08:00
Jack Chen b0f308eb53 docs: standardize agent instructions (#369) 2026-07-15 12:51:03 +08:00
Jack Chen 120478d879 docs(readme): tighten the hero copy so the first screen reads faster (#368) 2026-07-12 19:52:55 +08:00
Jack Chen e291f53a7b docs(readme): add Claude Code dynamic workflows comparison and sharpen planning wording (#367) 2026-07-12 00:44:26 +08:00
Jack Chen 44328ad3eb chore: release core v1.10.0 + create-oma-app v0.3.1 (#366) v1.10.0 2026-07-11 14:46:24 +08:00
Jack Chen 04565f6462 docs(readme): surface the website, reorder the comparison, refresh credits & features (#365)
- Add an official-links row (Website / Docs / npm / Discussions) under the
  title in all four READMEs (root + package, EN + ZH), pointing at
  open-multi-agent.com and its docs. The language toggle keeps its own row.
  Chinese links resolve to the /zh/ locale.
- Root only: move "How is this different from X?" from right after Get
  started to after Ecosystem, and trim it to a two-sentence teaser that
  links the full comparison on the package page (it was a verbatim copy).
- Package only: credit four contributors whose PRs merged after the credits
  were last refreshed (2026-06-19).
- Package only: add an "External coding agents (ACP)" feature row; note the
  run-level metrics rollup on the Observability row.

Docs-only; no source changes.
2026-07-11 12:07:28 +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 f0375eebea docs(examples): add Open Design MCP batch fan-out integration example (#364)
Drive Open Design's stdio MCP server from OMA to generate N landing-page
variants in parallel via runTasks(). Each variant's async flow
(create_project, start_run, poll get_run to a terminal status) is handled
by deterministic code, not LLM polling; the worker model only drafts the
design brief. Reference-lane example alongside mcp-github and
mcp-bilig-workpaper, plus its two README index entries.
2026-07-10 22:25:22 +08:00