Commit Graph
80 Commits
Author SHA1 Message Date
Jack Chen 8fa3bb8362 feat(release): add OMA-powered release bot (#483)
* feat(release): add OMA-powered release bot

* fix(release): harden bot execution boundaries

* chore(release): schedule bot for Friday evening
2026-08-10 17:18:29 +08:00
Jack Chen 4f9d7b5803 feat(core): add framework-owned LLM egress policy (#478)
Closes #473
2026-08-10 15:54:43 +08:00
Jack Chen b145fd19e6 feat(core): add pluggable shell executor (#477) 2026-08-10 15:39:08 +08:00
Jack Chen f14708b308 feat(core): support rich tool results (#479)
- 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
2026-08-08 11:49:55 +08:00
Jack Chen 1fca8331a5 feat(core): accept structured agent input (#476) 2026-08-08 11:28:39 +08:00
Jack Chen 083916d932 feat(approval): add durable suspend and resume gates (#480)
* feat(approval): add durable suspend and resume gates (#474)

* test(approval): cover durable validation failures (#474)
2026-08-08 03:40:10 +08:00
Jack Chen 8e83b42415 feat(checkpoint): resume interrupted agent turns (#475)
Persist built-in runner messages, turn accounting, and per-call tool results in checkpoint schema v3.

Replay committed results and rerun only missing calls with stable tool-call IDs.

Closes #312
2026-08-08 03:26:37 +08:00
Aryan Singh K. 32d5e8cf51 feat(agent): restore persisted conversation history (#470) 2026-08-07 16:10:48 +08:00
Jack Chen 5ce8b9428d feat(core): support DeepSeek V4 Flash thinking controls (#455)
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.
2026-07-31 16:35:43 +08:00
Jack Chen c2b4b6f194 chore(deps)!: upgrade OpenAI SDK to v6 and require Node 20 (#453)
* 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
2026-07-29 11:21:27 +08:00
Jack Chen e0e4cf6479 fix(core): make hybrid routing opt-in 2026-07-27 01:03:22 +08:00
Jack Chen 4f6aa35640 fix(core): harden hybrid routing failure handling 2026-07-26 20:23:37 +08:00
Jack Chen 4db96dcfd4 Merge origin/main into feat/hybrid-semantic-routing 2026-07-26 19:49:10 +08:00
Jack Chen 25a9ff3686 Merge remote-tracking branch 'origin/main' into feat/adaptive-recovery-runtime 2026-07-26 15:02:54 +08:00
Jack Chen edc33db1a4 Merge branch 'main' into agent/task-requirements-hard-constraints 2026-07-26 14:16:22 +08:00
Jack Chen f373b638cf feat(core): add hybrid semantic execution routing 2026-07-26 13:56:28 +08:00
Jack Chen b242f61d6d feat(core): add adaptive plan recovery 2026-07-26 11:51:57 +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 cf70e6742c fix(core): reject invalid task dependency graphs 2026-07-26 10:30:37 +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 392ce3be65 feat(core): add composite scheduling and strict assignees (#432) 2026-07-23 16:35:02 +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
Jack Chen 78be4a591e feat(core): make scheduling strategy configurable (#427)
* feat(core): make scheduling strategy configurable

* docs(core): document scheduling strategies in Chinese
2026-07-23 13:41:37 +08:00
Jack Chen e226f0af0e fix(core): handle zero-score agent selection (#425) 2026-07-23 13:35:29 +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 accd8e06d4 fix(core): restore CJK keyword-based agent selection (#426) 2026-07-23 12:59:31 +08:00
Jack Chen 801c398379 feat(tool): flag-and-confirm undeclared consequential runs (#422) 2026-07-23 10:37:00 +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 f0d18817ca fix: run oma through the installed npm bin 2026-07-20 17:20:18 +08:00
Jack Chen a97d37b514 feat(dashboard): surface per-task model/provider/cost in Run Viewer (#411)
* feat(dashboard): surface per-task model, provider, and cost in Run Viewer

Roll each task's descendant LLM spans up into task-level model/provider/cost via the span parent chain (LLM spans carry these but no taskId), so the task panel shows what a task actually used instead of Not recorded. Also render task UUIDs as 8-char short ids (full id kept in tooltip and data-task-id).

* docs(brand): regenerate hero from a real run with cost; add MP4

Inject real DeepSeek list-price cost onto LLM spans in the hero capture, regenerate the Run Viewer snapshot and GIF, and commit the H.264 MP4 (previously written only to a gitignored dir).

* docs(readme): trial inline MP4 hero via jsDelivr CDN

Branch-only experiment to check whether GitHub autoplays a hand-authored video tag; GIF kept as poster and fallback. Revert to the GIF img if autoplay is stripped.

* docs(readme): keep GIF hero (GitHub strips external-src video)

The trial video tag is dropped by GitHub's sanitizer because its src is not a GitHub-hosted asset, taking the fallback img with it. Restore the original GIF img hero.

* feat(dashboard): show tool-call count on task detail; refresh hero

Task detail shows Tool calls: N instead of an N/A Tool row, so the task panel has no remaining Not recorded fields. Re-record the hero GIF/MP4 and refresh the snapshot HTML.

* feat(brand): swap hero demo to a JWT-auth run built by a specialist team

Replace the generic Express CRUD capture with a JWT (HS256) auth module built by five specialists (architect, backend-dev, qa-engineer, security-analyst, reviewer) in a 3-way parallel fan-out (implement + tests + threat-model) converging on an integration review, so the hero reads as work that needs a team. Harden the agent prompts (pinned filenames, minimal per-role tool grants, node --check only) so the capture runs clean on the first pass.

* docs(readme): list packages instead of a table to stop name wrapping

The two-row Packages table squeezed the Package column in the English README and wrapped the package names across lines. GitHub strips <nobr> and inline style, and non-breaking hyphens would break npm install copy-paste, so switch to a bulleted list where each name sits on a full-width line. Applied to README_zh.md too for parity.
2026-07-19 15:34:09 +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 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