Release Notes
What changed in each AMBA release. The app updates itself; you can also download the latest version.
0.6.2 — 2026-10-30
Added: the agent can put key points on the project board, and the board can go into each chat turn. In a project chat the agent notes a decision, a risk or a follow-up on the Bảng tab (marked "Agent"), even while it is only answering a question. A new project setting, "Đưa bảng vào ngữ cảnh" (Project settings → General, explained in its [?] tip), hands the agent a short digest of the board on every chat turn (pinned, decided, waiting and open items, about 1.5 KB at most), so later turns and new chats in the project keep what was agreed. Off by default while it is measured (TASK-668).
Internal (TASK-668, ADR-079):
note {kind: decision|risk|follow_up, text}(tools/board_note.rs, runnerrunner/board_note.rs; effectContext, policy Allow, offered only in Agent-mode project chat turns, allowed in conversation turns; board itemsdecision/risk/follow_upwithsource: "agent", id<runId>:note:<kind>:<fnv1a(text)>so a retry in the run adds nothing).project_board::digest(pinned first, then open Decided/Waiting/Open newest first, never the log, ≤ 1,536 B cut by whole items with+N more) goes into the turn's own user message (context_build.rs, one call site), so system prompt, tools and history are byte-identical with the setting on or off (tests_board_note.rs); settingboard_digest_in_context:<projectId>withproject_board_get/set_digest_setting. Tool definitions:note+295 B paid for by shorterfinish,read,files,table,workbookandproject_fact_recordwording (chief-of-staff with web tools 25,597 → 25,576 B; profiles without those tools +74–84 B); lowering snapshots updated.Changed: an empty chat offers the agent's own skills as starters. Each built-in agent now has a few skills that fit its role (for example the financial analyst: P&L analysis, invoice and bank reconciliation, payroll audit; the business writer: document and contract review, executive briefing, marketing content), and a new conversation shows them as chips with their icon; a click fills the chat box with a ready request, nothing is sent. A board secretary built on the business writer no longer sees tax or VAT starters. Agents you installed earlier get the skills on the next launch unless you edited them; an agent without skills keeps the previous starters.
Changed: project templates are read when the work needs them, not sent with every message. A project made from a template, and the agent's own skills, are listed by name and a one-line description; the agent opens the full guide before doing that kind of work. Questions and advice no longer carry the template's file list, and a template's required files apply only when you ask for work (TASK-673).
Internal (TASK-673, M119, ADR-080): skills on demand.
runtime::skills::listingbuilds the## Skillssection (pinned skill = the template's skill by id oraliases, thenAgent::skills, each once, id + description, cap 3 KB) appended at one place inrunner/assemble.rsafter the stable head (identity, project context, mode, sandbox, manifest), outside Research mode; no skill body is injected (modes/templates.rskeeps the body only for checks and tests; the TASK-650 partial-request line moved into the listing intro).runner/skills_on_demand.rs:read skills/<id>/…is recorded inRunState::skills_read(metadata.skillsRead, eval lineskillsRead, kept on resume), issues norefand is not a source read; the rules skill is the pinned skill withdeliverables, else the first such skill read;template_gapsapplies only in task turns and to the rules skill. Catalog personas carryskills(meta.json, validated bybuild-agent-catalog.mjs;CatalogAgentItem::skills, version 2.0.0 → 2.1.0; install, eval harness and the template-version flow give them, a skills-only template version upgrades unedited agents); SKILL.md frontmattericonandlocales.<l>.starter;list_agentsreturnsskillCards(AgentListing),ChatAgentIntrochips fromskillChipswith the capability-pack playbooks as fallback. Eval: template-suite scripts read their skill first (build-scenarios.mjs), scorecard section "Skills read on demand (templates suite, task runs)" in the JS and Rust scorers. System prompt per templated project (mock, B): 143,284 → 134,023 in total for the ten; projects without a template list the agent's defaults as id + first sentence (≤ 120 characters; office-v1 mean 12,049 → 12,658 B);readservesSKILL.mdwith onlyname,description,deliverables,outputContractand the body (skills::served_text; input tokens per templates run in the mock 120,623 → 132,827); mock all suites unchanged (Claude 45/46, tier-2 43/46), skills read in 8/8 templates task runs. The bundled catalog changed (persona skills, skill icons and starters); publishing it to R2 waits for the Founder.Fixed: a sheet whose name contains
&,<or>(such asP&L) can be read by its name. The file reader listed it asP&L, so asking for sheetP&Lanswered "no sheet"; editing such a workbook in place keeps the name as it was.Internal (finetune session, M120 Sonnet 10:10 export):
get_xml_attr(context/adapters/shared) resolves XML entities in attribute values (sheet names inworkbook.xml, relationship targets);noInventedFiguresshares a scale word across numbers joined by-,/and~as well (951 / 1.005 / 872 triệu); recheck of the export:conv-explain-figurefail → pass, 61/61.Internal (finetune session, M120 Sonnet baseline): eval check
rowKeys(tpl-payroll-auditAdjustments: column A^NV\d+$exactly NV03, NV06, NV08, replacingrows4–6 that failed a correct sheet with a totals block) andofficeTaskrelaxtotalLabelColumn(stock-reconcile-count: the INV2 "TỔNG" label in B22 when A22 is empty); recheck of the 10-29/10-30 exports changes only Sonnet 05:55stock-reconcile-count(fail → pass) and the replayedtpl-payroll-auditrun passes.Internal (TASK-678, M120, ADR-081): web search through the AMBA account.
SearchProvider::Amba {base, token}+tools/web_amba.rs(POST {gateway}/v1/web/search, device token asAuthorization: Bearer,x-amba-run-id, body{query ≤ 400 chars, max_results}, one retry on 529); refusals become coded tool errors viaproviders::amba::web_error(amba_web_not_enabled,amba_web_quota window=… resets_at=…,amba_web_unavailable,amba_web_account reason=…), none of them a run stop; data-flow recordprovider: amba,detail.viaLEDGER_WEB_VIA("AMBA gateway → Tavily").AccountInfo.webEnabledcachesweb.enabledfrom/meand/redeem(missing block = false).AppState::refresh_web_toolschooses own Tavily > own Brave > AMBA account with web enabled > off (still lazy on first use, no secret at launch) and runs after a search key is set or deleted, an AMBA sign-in, sign-out, gateway change and a/meanswer that flipsweb.enabled; a run keeps its registry snapshot.search_credential_statusaddsamba {signedIn, enabled}andactive: "amba"(commands moved tocommands/web_search.rs). Tavily now gets its key as a Bearer header instead of in the body.Internal (TASK-678, fix): deleting one web search key no longer leaves the deleted key's tool registered while the other key (or the AMBA account) stays unused: the source is chosen again on every key change.
Internal (TASK-678): Settings → Mô hình AI → Tra cứu web shows a third card "Tài khoản AMBA" (in use with today's searches / own key first / not enabled for the account / signed out with a link to the account tab), the badge "Đang dùng qua tài khoản AMBA", and an "own key optional" [?] tip; the AMBA account card shows one web search usage line;
WebUnavailableFixoffers "Đăng nhập tài khoản AMBA" when signed out; mock-IPCamba-accountsearches through the account.Changed: an empty chat introduces its agent instead of a project banner. The "Sẵn sàng làm việc với …" card with file counts is gone; a new conversation shows the agent's name and role and up to four starters suited to it (click one to fill the chat box, nothing is sent), and nothing once the conversation has a turn.
Fixed: the model table in Settings → Mô hình AI (step 2) sits on a card like the sections around it instead of showing the grey page background in light mode.
Added: web search with your AMBA account. Once web search is turned on for your AMBA account, agents can search the web with no Tavily or Brave key of your own: each search costs 1 credit, with a limit per 24 hours and per 30 days (Free 50 / 300, Pro 200 / 1,500). Your own key, when you have one, is always used first. Searches pass through AMBA's gateway to Tavily; the gateway keeps a usage record, never the search words (ships with the desktop part, TASK-678).
Internal (TASK-677, ADR-081): model gateway
POST /v1/web/search(Tavily basic search with the org secretTAVILY_API_KEY, fail closed503 web_unavailable; body{query, max_results?, topic?, time_range?}, extra fields 400; normalised{query, results, provider}only); 1 credit reserved throughAccountQuota(web: true) plus sub-capswebDay/webMonthin searches (429web_day/web_month);GlobalSpendscopewebagainstWEB_DAILY_CAP_USD(10) at USD 0.008 per search, apart from the model caps; failed searches settle at 0; metering rowweb:tavily-basic, no query stored or logged; Tavily 429 → 529, 401/432/433 → 503, other/network → 502;/v1/account/mewebblock;LIMIT_KEYS+ admin plan and override editors; admin overview shows web spend and whether the key is configured (never the key); D1 migration2026-10-30_task-677_web_search.sql(additiveADD COLUMNs, run once); test harness applies migrations statement by statement;tests/web.spec.ts.Internal (TASK-677, ADR-081 phases): phase 1 key pool: Tavily keys entered in the gateway admin (Khóa tìm web: add, replace, disable, delete when unassigned) and assigned per account (account panel → Tìm web,
PATCH /admin/accounts/:id {webKeyId}); D1web_keys(AES-256-GCM, fresh IV, HKDF-SHA256 fromADMIN_SECRET, infoamba-web-keys-v1, last 4 in clear, key write-only) andaccount_settings.web_key_id;/v1/web/searchuses the assigned key, else403 web_not_enabled(uncharged) unlessWEB_SEARCH_GLOBAL = "on"(phase 2, org key); an undecryptable key (after anADMIN_SECRETrotation) shows "needs re-entry" and answers 503;/meand/redeemreportweb.enabled; the admin overview shows global key configured, phase, pool size and accounts with web search; testswebKeys.spec.ts.Internal (TASK-679, ADR-081; site pages held on branch
feat/m120-siteuntil the desktop release): privacy policy ×4 gains "Web search with an AMBA account" (gateway → Tavily under AMBA's account, metering row only, Tavily may keep and use searches) and Tavily as a processor; "Services you connect" now covers own keys only; terms ×4: Tavily's Acceptable Use Policy for web search through AMBA; API-keys manual ×4: a search key is optional with an AMBA account.Internal (TASK-672, ADR-080): the ten project templates are skills
catalog/skills/<id>/SKILL.md(template id = skill id; deliverables, output contracts,deliverableWordsand legacyaliasesin the frontmatter; vi/en/ja/ko names and descriptions inlocales), their directives rewritten fromMUSTrules into guidance (what to gather, what to ask when data is missing, what a good result contains) with every formula, file name and verifier requirement kept. The runtime reads directive text and template data from the bundled skills (modes/templates.rs), still always on and injected where it was;modes/template_data/removed. System prompts of the ten templated projects 102,686 → 99,275 B in total; mock templates suite 9/9 unchanged (input tokens per run 121,052 → 120,179); tool definitions unchanged (25,124 B).Internal (TASK-671, ADR-080): skill format and loader, no prompt or behaviour change.
catalog/skills/<id>/SKILL.md(frontmattername,description,deliverables,outputContract,locales; a JSON-on-one-line YAML subset; optionalreference/,examples/), compiled byscripts/catalog-skills.mjsintosrc/assets/catalog/agents.jsonskills: [{id, files}](bundled and published with the catalog);runtime/skills/parses, validates (sizes, unknown fields kept) and skips invalid skills;readservesskills/<id>/…in a project read-only (a project file at that path wins, with a note), writers refused there by policy confinement;src/domain/skills.ts; one sample skill (invoice-reconciliation, not wired in). Tool-definition bytes unchanged (read1438 B).Added: a "Trao đổi" suite in Settings → Nâng cao → Thử nghiệm → Đo bộ công cụ, next to Cốt lõi, Đầy đủ, Truyền thông and Mẫu dự án: fifteen questions, requests for advice and planning talks (the restaurant automation question from the 0.6.0 Windows run in English and Vietnamese, what to prepare for the annual financial statements, why a figure in a workbook changed, a bonus asked for without a bonus policy, how to organise folders, a change of mind, "tiếp tục" after advice, CPM vs CPC in a media project, Japanese and Korean questions, a weekly summary that should become a process, a question about a lease in Sources, and one request that does ask for a file). Each is scored on what you would see: no file written when none was asked, no figure that is not in your files or messages, a question back when data is missing, the answer in your language, and no "send continue" or wrap-up; Estimate cost prices the suite for Claude, Gemini and GPT profiles (TASK-658).
Internal (TASK-658):
tests/agent-eval/build/conversation*.mjs(15conv-*scenarios, ideal v2 scripts replayed by the gate; an "eager" script for the restaurant case and the "tiếp tục" follow-up that writes placeholder files and invents an award rate, which the gate requires to fail); checkswrites,noInventedFigures,asksBack,answerLanguage,cleanEnding(agent_eval/checks_talk.rs); scenario fieldshistory(earlier chat turns),negativeMocks,rubric(for a model judge; off in the gate and not judged yet); "tỷ lệ" after a number no longer reads as "tỷ"; labSuite::Conversation;pnpm run eval:agent -- --suite conversation; eval bundle 522 → 568 KB (guard 640 KiB unchanged).Internal (TASK-663): conversation scorer fairness after the first live baseline.
noInventedFigures(agent_eval/checks_figures.rs) holds only money amounts and percentages by default (kinds;["money"]for the general-knowledge scenarios bctc-prep, folder-plan, cpm-cpc, ja, ko, cashflow), skips inline code and labelled examples ("ví dụ", "e.g.", "such as", "例:", "예:"), never counts account codes (TK 152, 153), accepts the rounding a figure was written at ("khoảng 1,6%"), and withderivedaccepts worksheet row sums, their change between columns and the shares an explanation uses (the total row set aside); a range or list shares its unit ("từ 180 xuống 60 triệu");asksBackalso takesask_userquestions andtopic+aspects("thưởng" with "tỷ lệ"); conversation scenarios no longer requirefinishfigures;pnpm run eval:agent -- --rescore <runs.jsonl> --recheckscores saved answers again (agent_eval/recheck.rs, no model call). Baseline 2026-10-29 rescored: Sonnet 5.5 6 → 14/15, Gemini 4 Argon 7 → 14/15, GPT-6 Sol 12 → 15/15.Fixed: finished work is no longer reported as failed because the agent forgot to hand in its result. When the agent answers in text instead of handing in the result, or its result is refused twice over bookkeeping (a file left off the list, a figure cited to the wrong cell while the file holds it, too many figures), AMBA checks the files itself: if they are there and pass the same checks, the task ends as done, marked partial with a short note of what could not be verified, instead of "Chưa xong… Nhắn "tiếp tục"". A plain answer to a question ends normally, with no "send continue". You are still asked to continue when something really is left: a file you asked for that was not written, a reply cut off mid-way, or plan steps not done (TASK-661).
Internal (TASK-661):
runner/finish/ending.rssettlesno_finish/finish_refusedstops in one place (work left → incomplete as before; otherwiseverify::check_lenient,runner/finish/verify_lenient.rs: left-out files added, caps applied, unverifiable files and figures noted; a figure cited to one cell whose value no workbook of the run holds, a missing listed file, a requested template deliverable and the file verifiers still fail); runtime-closed results carryverifiedByRuntime: true,status: partial,protocol.resultChannel: "runtime";metadata.protocol.endedWithoutFinish{reason, outcome, workLeft?, problems?, notes?}; eval lines addendedWithoutFinishandverifiedByRuntimeand no longer count a runtime-closed result asendedWith: "finish"; ignoredagent_eval_replaytest (AMBA_EVAL_REPLAY=<jsonl>) replays scripted runs for A/B evidence.Changed: a slide deck or Word document with leftovers from its template is fixed while it is being made, not at the end. When the agent saves a deck that still has a sample slide from the agency template, template prompt text or an empty placeholder (or a Word file with an unfilled field such as
[Date]), it is told right away which slide and how to fix it, so the task finishes without an extra "not accepted" round; the final check before hand-in stays as it was (TASK-661).Internal (TASK-661):
runner/office_guard/write_note.rsreusesoffice_guard::check_file(same source baseline andofficeIntegritycontract asfinish) after each successful v2deck/documentwrite and addsleftovers[] {slide?, kind, why, fix}(max 5,more_leftovers) and a fixingnextto the result;tool_dispatchhook; testsoffice_guard::tests::the_write_note_reports_what_finish_would_refuse,tests_office_write_note.rs(mock: sample slide 8 noted, deleted, finish accepted first try; unfilled Word field; baseline). A/B replay of the 7media-pitch-deckruns refused atfinishfor a sample slide (exports 10-26…10-29): all 7 noted at the first successful deck write, same slide.Internal (TASK-664): eval scorer fairness for the media and templates suites after the M117 baseline.
agent_eval/ask.rsanswersask_useras the scenario's user (userReply; otherwise a neutral reply that never picks an option carrying a figure); the app'sask_useris unchanged. Media: the summary budget counts on any budget/total row, and a "Cần bổ sung" row passes when it names the missing evidence. Templates:finishfigures are not scored when the answer is the result (nofileExistscheck),answerMentionstakesaliases(payroll codes ↔ roster names), a title alone on its row is never a table header, and percentages handed in as fractions with unit "%" are read as percentages. Transcripts keep the text sent with tool calls and answers up to 16 KB. Re-scored without live spend: media GPT-6 Sol 3/5 → 5/5; templates GPT-6 Sol 7/9 → 8/9, Claude Sonnet 5.5 7/9 → 8/9, Gemini 4 Argon 8/9 unchanged.Changed: questions and requests for advice get a plain answer, without files nobody asked for. In Agent mode a chat message now starts as a conversation: the agent answers in your language, may read the project's files and ask you, and does not write files or force a "send continue". When you ask for a file, a filled form or a report (or name a file to create), it switches to a task and the full checked pipeline runs as before. The agent can offer a piece of work as a card under its answer; the card's button starts it. The "continue" line follows your language.
Internal (TASK-660, ADR-078):
runner/turn_kind.rs(turn kinds for user chat turns in Agent mode: task from the start onStartRunRequest::taskor a request naming a file the project lacks; otherwisestart_task), writers refused at dispatch in a conversation like Research mode (same tool offer and prompt, cache-safe), conversation answers via the lean path only (no follow-through detectors, no deliverable guard),finishin a conversation accepted unverified, text sent withfinishkept as the chat answer,propose_task→metadata.taskProposal→TaskHandoffCard,metadata.turn {kind, startedTask}; tool descriptions offinish/propose_process/update_plan/ask_usershortened to fit the two new tools (chief-of-staff with web tools 25,597 / 25,600 B); eval lines carryturnKind/startedTask, task mock scripts start withstart_task.Added: "Tất cả bộ (61)" in Settings → Nâng cao → Thử nghiệm → Đo bộ công cụ: one sweep runs the full core, media, project-template and conversation suites, with pass counts per suite and model at the top of the scorecard and an estimated run time per model before you start.
Internal (M117 scorer fixes):
Scenario::asks_for_change(any check that reads a written or edited file,Check::inspects_output) decidesturnMismatchandanswer_is_result, so the 13 office-v1 in-place edits (officeTask,cellText,colWidths… with nofileExists) are no longer countedchatAsTaskwhen a task is started;noInventedFiguresreads a markdown table's bare numbers in the unit of its column header, top-left cell or a unit note just before or after it ("(Đơn vị: triệu đồng.)"), andderivedadds sums across adjacent columns (the quarter);finishFiguresreads a fraction with a ratio unit (tỷ lệ,ratio,%) as a percentage and accepts the precision written (18,0%for 17.98, not18%for 17.6);--recheckrecomputesturnMismatchandfinishFigures(acceptedfinishcall) and replays anofficeTaskedit from the transcript's acceptedworkbookcalls on the corpus fixture (agent_eval/replay_office.rs).officeTask {relax}(eval only;office-verifyopt-insstyle_from_match: "font_fill",new_row_merges: "ignore", off for the corpus) onstock-reconcile-count: a new column matches its source's font and fill with any numeric format, a merge only in the new TỔNG row is accepted, column widths stay checked; the conditional-format evaluator reads percent literals ($H2<-5%). Run wall limits scale with the model's seconds per turn (scoring/pace.json, over the 12 s default, at most 3×, never below the given limit; lines carrywallLimitSec). M117 export rescored: office-v1 chatAsTask 13 → 0 for every model; office-v1 GPT-6 Sol 28 → 29/32, Gemini 4 Argon 30 → 31/32; conversation Sonnet 5.5 13 → 14/15.Fixed: a finished task's answer is laid out in short lines, a lead sentence, then the key figures and the assumptions as bullet points, instead of one long paragraph packed with numbers; the "Kết quả" block shows it with its bullets too.
Internal (finetune session):
REACT_PLANNING_TEXT"The answer" asks for a Markdownfinishsummary (lead sentence, figure bullets, caveats list, no paragraph over three sentences; tool descriptions unchanged);ChatTurnResultrenders the summary withMarkdownMessage; tests keep the summary's lines throughfinishand read the same figures from bullets as from a paragraph.Fixed: an Excel report touched up by an office script keeps its numbers. When a script edits an existing workbook (for example its conditional formatting), every formula in it is calculated again and saved with its value, so totals no longer show empty in previews and checks.
Internal (finetune session):
office_sandbox/verify.rsin-place xlsx check emits the sharedNO_CACHED_VALUESnote (was "formula cells with cached values: 0/113"), soscript::cache_formula_valuesrunsrecalc_packagefor in-place edits too; testscript_tests::an_in_place_script_edit_gets_its_formula_values_backreplays the tpl-pnl-varianceworkbookops (tests/office-corpus/sandbox/pnl_variance_workbook.json) and an openpyxl-style round-trip.Fixed: SUMPRODUCT with conditions shows its value. A total such as
=SUMPRODUCT((Khu_vuc=A5)*(Thang="2025-07")*Doanh_thu)is now computed when AMBA writes the workbook, so previews and checks no longer see an empty cell.Internal (finetune session):
tools/excel_writer/evaluator_arrays.rsparses SUMPRODUCT arguments as array expressions (comparisons, + - * / ^, unary minus,--, scalar broadcast, whole-column tails); mismatched sizes and per-cell functions such as LEN(range) stay uncomputed and noted.Fixed: a run no longer fails when Claude's server interrupts a reply. Anthropic's temporary "model stream was interrupted" error now pauses the run and resumes it from where it was (searches and steps already done are not repeated), as an overloaded server already did.
Internal (finetune session):
providers/retry.rsclassifies Anthropic's streamapi_errorasServerUnavailable(auto-resume, fallback, then a resumablellm.unavailablefailure); testanthropic/tests_stream.rs::an_interrupted_stream_api_error_is_retried.Fixed: advice sent together with a "start this as a task" card stays in the chat. When the agent answered a question and offered a task card in the same step, the answer showed only as a collapsed thought and the chat bubble held one line about the card; the answer is now the reply, with the card line after it.
Fixed: Excel files written by an office script show their numbers. Formulas a script writes are calculated and saved with values (SUMIFS included), so previews and other apps no longer show blank cells; a script that only inspects a file no longer has to save a copy, so no
check.xlsx/tmp.xlsxis left in the project.Fixed: copying a cell's style no longer narrows the column it is copied to, so a new column's header is not cut off.
Fixed: a ratio handed in with its result is read as a ratio ("30,82%", "tỷ lệ (18%, +80 triệu)"), so a correct result is no longer refused.
Internal (M117 runtime, finetune session):
RunState.answer_preface(turn_kind::text_role/step_text/with_preface) for text sent with protocol-only calls pluspropose_task/propose_process; office_script xlsx outputs without cached values go throughrecalc_packageafter verification,OUTPUTS["dir/x.xlsx"]matches its declared output,outputsoptional (inspect only),INPUTS["dir/x.xlsx"]findsx.xlsx;copy_formatcopies a width only from a whole column and never narrows;finish/verify.rs::ratio_unit(no scale from a ratio unit).Internal (TASK-665):
Suite::All/--suite all(61 scenarios, de-duplicated by id), run lines carrysuiteandturnMismatch(chatAsTask/taskAsChat), multi-suite scorecard section (agent_eval/score_suites.rsandscripts/eval-agent-score.mjschecked againstscoring/expected-suites.md), wall-time estimate fromscoring/pace.json(seconds per turn measured in the 10-24…10-29 exports).Added: a "Bảng" tab beside the chat in every project gathers the project's key points by itself after each turn: what waits for you (an unanswered question, a task or process the agent offered, a task that stopped), what was decided (your answers, accepted offers, preferences recorded for the project), the work done with its files and key figures, what is still open, and a log of the latest 200 turns. Process steps and routines appear there too. Click an item to open its chat at that turn. No extra AI call; existing projects show an empty board until their next turn (TASK-666).
Internal (TASK-666, ADR-079):
runtime/project_board/(modelschema v1,storeatomic writes of<project>/.amba/board.json,apply::apply_runfrom the stored assistant message'sresult,ask_usersteps,taskProposal/processProposaland their acceptance,turn,stopped, and the run's newcontext.jsonpreferences; idempotent per run viaappliedRunsand source-derived item ids; Log and Work keep the last 200, Waiting/Decided/Open are never trimmed); one hook inrunner/finalize.rs::persist_messages(project_board::after_run, no dry runs, emitsproject:board-updated);project_board_getcommand;board.jsonfollows moved files withcontext.json(migrate::rewrite::board_file);src/domain/projectBoard.ts,ProjectBoardPanel,useBoardTurnFocus; mock-IPCboard-liveflag.Added: act on the project board directly. Pin, edit, close and reopen any item on the "Bảng" tab; your wording is kept when the agent later updates the same point. Items waiting for you have their own button: answer a question with the same card as in the chat, start a task the agent offered, or continue a stopped task; the new turn runs in that item's chat. An item that is out of date (the chat has moved on, the question was answered, the task was already started, or the chat is busy) is refused with a short note and never starts a second run (TASK-667).
Internal (TASK-667):
project_board/actions.rs(patch_item: text →userEdited,pinned,closed;claim_waiting: settles a Waiting question/proposal/stopped task before its run, refusingmissing|closed|answered|started|moved_on|busyfromchat_facts= live runs of the chat, the item's stored turn and the user messages after it); commandsproject_board_update_item,project_board_claim(under the store's write lock, emitproject:board-updated); schema v1 gains optionaluserEdited,pinned,closedandask(an unansweredask_user's options); a preference entry recorded again by a later run updates its item in place unless the user edited it; UIBoardItemRow,useBoardActions,BoardRunActionhanded to the chat throughboardFocusand run byProjectChat's own card handlers (handleStartTask,handleContinueRun,dispatchPromptRun);chat/stoppedContinue.tsshared withChatStoppedContinue; mock-IPC Waiting fixtures in the Tờ trình HĐQT chat.
0.6.1 — 2026-10-28
Hotfix for 0.6.0 (TASK-657)
- Fixed: on Windows, a task that saved files can finish again. AMBA recorded the files it wrote as
reports\…while the answer named themreports/…, so it refused its own result ("was neither written nor read in this run", "written but not in files"), the task stopped, and the next turn listed the files as claimed but not written. Tasks left unfinished this way resume normally. - Fixed: a question in a project made from a template gets an answer, not placeholder files. "What documents do you want me to give?", "tư vấn giúp mình cần chuẩn bị gì?" and similar questions no longer require the template's files; they are listed as remaining instead. A project with nothing in its sources and nothing read is never pushed to make them either. A work request that names none of them ("chuẩn bị hồ sơ pitch") still makes them all.
- Fixed: a workbook of headers, labels and formulas no longer asks where its figures come from. Only numbers (including written forms such as
1.234.567,12%,1.500.000 đ) count as figures that need a source. - Internal (TASK-657): one spelling for project-relative paths,
project_files::rel_slash/rel_under/same_rel(/separators, no\\?\verbatim prefix, drive/UNC prefix compared case-insensitively), used where a run records written, read and changed files, deliverables, refs, provenance, figure sources, the office sandbox and tool results; checkpoints are read back in that spelling (RunCheckpointdeserializers);finishtreats a restored PDF companion as the runtime's own, and the ledger'sclaimedNotWrittenleaves out files the run read;request_mentions::advisory(vi/en/ja/ko advice cues, closing?without a polite work request) andtemplate_deliverables::has_inputs;provenance::numeric_text.
0.6.0 — 2026-10-28
Highlights
- New: AMBA account. Enter an invite code to use Claude Sonnet 5.5 and Haiku 5.5 (Opus 5.5 on Pro) with no API key. The account card shows the plan, expiry and 5-hour / weekly / monthly usage. Requests pass through AMBA's server and are not stored. Your own keys work as before.
- Every model uses the same new agent tools: read files page by page, find files, analyse tables in SQL, edit Excel / Word / PowerPoint in place, and hand in a checked result. The "Agent tool set" setting is gone; older agents switch by themselves, and a task in progress resumes on the new tools.
- GPT-6 (OpenAI, Azure) and Gemini 3/4 (AI Studio, Google Cloud) are more reliable and cheaper thanks to caching. Google Cloud has a step-by-step setup guide and Test connection. Claude Sonnet and Haiku 5.5 on Amazon Bedrock switch endpoint by themselves when needed.
- Long tasks: AMBA saves after every step; when the network or the provider fails, press Continue from step N. Up to 60 steps, and long tasks use far fewer tokens. AMBA no longer runs system (shell) commands.
- Real prices (checked 2026-10-25) for every provider and a rebuilt Usage & Costs page. You can set your own prices.
- The 7 built-in agents and 10 project templates use the new tools. Projects made from a template make only the files you ask for; "no slides yet" means no slides; "continue" keeps your earlier request.
- Excel files the agent writes carry values for date formulas, SUMIFS, COUNTIFS and text formulas, so previews no longer show blank cells. Hard PDFs are read from their own text, then OCR on your computer, and only unreadable pages go to AI.
- Removed: local models (Ollama), OpenAI-compatible endpoints (DeepSeek, OpenRouter, Groq…), non-Claude models on Amazon Bedrock, the AMBA Trial, System-One/Jev, ChatGPT import, the MCP Marketplace, "Create with AI", the Memory page, demo projects.
Upgrading from 0.5.14
- On the first launch, providers and models of the removed kinds are deleted together with their saved prices and keychain entries. A project, agent, PDF reading setting or default model that used them follows "Use default" again.
- Projects, conversations, files and run history stay as they are. A task left unfinished in 0.5.14 resumes on the new tools; if its model was removed, it continues on the agent's current model.
- The entries below are the history of this release; some describe intermediate states that later entries reverse (the "Agent tool set" setting was added and then removed).
Media agency eval suite (M116)
- Added: a "Truyền thông" suite in Settings → Nâng cao → Thử nghiệm → Đo bộ công cụ, next to Cốt lõi and Đầy đủ: five media agency tasks in Vietnamese (a media plan from a client brief and rate card, a pitch deck on the agency template, a tender price form, a tender compliance matrix with a technical proposal, and an actual-vs-plan report from Meta, Google and TikTok exports), checked to the đồng (TASK-646).
- Internal (TASK-646):
pptxfixtures, checkssheets,rowCalc,columnShare,rowText,pptxChart,officeClean(cellText.all,formulas.max); a private variant may be a folder of real files that replaces the synthetic inputs, withrequest.txtas the message; the gate replays the suite's ideal scripts;pnpm run eval:agent -- --suite media. - Internal (TASK-649): media suite fairness after the first live run:
media-tender-price-formadds the agency profile (Ho_so_nang_luc_Sao_Viet_Media.docx) as the named source of the bidder's name; text checks (cellText,docxText, answer texts, row labels) ignore sentence punctuation, so "Hai tỷ, ba trăm…" matches;cellText.columnaccepts week numbers under aTuầnheader for "Tuần 1"…"Tuần 8" inmedia-plan-from-brief. - Added: a "Mẫu dự án" suite in Settings → Nâng cao → Thử nghiệm → Đo bộ công cụ, next to Cốt lõi, Đầy đủ and Truyền thông: nine requests in Vietnamese, one per project template the other suites did not cover (invoice and bank statement reconciliation, quarterly P&L with budget overruns, payroll audit with insurance and personal income tax, a board pack for a new branch, a bank loan schedule with DSCR, a 30-day content calendar, a draft contract checked against the agreed quote, a freight tender with a commercial invoice / packing list check, F&B labour cost ratio and weekend staffing), each run in a project made from its template and checked to the đồng; Claude, Gemini and GPT profiles can be measured on it and on Truyền thông, and Estimate cost prices each suite from its own scripts (TASK-656).
- Internal (TASK-656):
tests/agent-eval/build/templates*.mjs(9tpl-*scenarios withtemplate, ideal v2 scripts usingtableload/query/reconcile andwrite_query, replayed by the gate as Claude and in--mockas tier 2); labSuite::Templates;pnpm run eval:agent -- --suite templatesand--dry-run --suite <name>replays and prices that suite; the eval bundle guard is 640 KiB (+113 KB of scenario JSON, about 21 KB gzipped). - Changed: in a project made from a template, asking for one file no longer forces the others. "Chỉ lập media plan" in a Media Planning project gets the media plan without being held back until a pitch deck exists; the template's files you did not ask for are listed as remaining in the answer, so you can ask for them later. A request that names none of them (such as "chuẩn bị hồ sơ pitch") still makes them all (TASK-650).
- Fixed: Excel files the agent writes now keep computed values for date formulas. Formulas with
DATE,YEAR,MONTH,DAY,EDATE,EOMONTH,WEEKDAY,WEEKNUM,DATEDIF,NETWORKDAYSandDAYS(and everything built on them, such as week columns and the totals over them) show their values in previews, Quick Look and other viewers that do not recalculate, as they do in Excel; before, a report with dates written as=DATE(2026,9,7)opened with blank cells there (TASK-651). - Internal (TASK-651):
tools/excel_writer/evaluator_dates.rs(1900 date system with the 1900 leap-year bug,DATEoverflow, ISO date text as a date;TODAY/NOWleft unsupported). The recalc was already per dependency chain: an unsupported function blanks only its transitive dependents; the live run's 203 were most likely its dates plus cells derived from them (a week column) and the SUMIFS and totals over those. - Internal (TASK-650):
runner/template_deliverables.rsdecides whichrequiredDeliverablesa request asks for (name, stem, output path,deliverableWordsintemplates.json, a kind word only one deliverable has, a written file of its type) for bothfinishand the deliverable guard; template directives with required deliverables say a partial request gets only those; agent-eval scenarios taketemplate(validated at load;media-plan-from-briefandmedia-pitch-deckusemedia-planning-pitch), and the run line reportstemplateandopenItems. - Changed: "chưa cần slide" now means no slide. In a project made from a template, a file you rule out or put off ("chỉ làm media plan thôi, chưa cần slide", "no deck yet", "スライドは不要", "슬라이드는 나중에") is no longer counted as asked for, and a follow-up such as "tiếp tục" or "ok làm đi" keeps what your earlier message asked for instead of requiring every file (TASK-652).
- Fixed: Office scripts (
office_script) run again when the app is started in development mode. The sandbox's own security policy stopped it from loading in the macOS webview, so every lab run reported only "worker error"; the policy now lets the sandbox load its own files (still no network, no eval, no outside code), a failure to load now names its cause (the file, its policy and each import), and when the sandbox cannot load the agent is not offered the tool at all (TASK-653). - Internal (TASK-652):
runner/request_mentions.rsreads negation/deferral cues (vi with and without diacritics, en, ja, ko; one cue table) scoped to the clause and the mention next to the cue, andchỉ … thôi/only/だけ/만as "only these";template_deliverables.rsuses it and, for a user's chat turn that names no deliverable, the conversation's latest earlier user message that does (RunState.earlier_requests).
Settings → Mô hình AI layout (TASK-647)
- Changed: step 2 lists the enabled models as a table with search (name, model id, provider) and sorting by model, provider or price; clicking a row no longer makes that model the default, only "Đặt làm mặc định" does.
- Changed: the direct API and cloud provider cards sit three to a row; the AMBA account card spreads plan, expiry, device and models across the full width, with logout and usage in its header.
- Fixed: large gaps between the cards on Tools & MCP in the macOS app (WebKit).
Remove the legacy tool set (M115)
- Changed: every model uses the new agent tools. The "Bộ công cụ agent" setting (Settings → Nâng cao) is gone: Claude, OpenAI, Azure and Gemini all read, write and hand in work with the same tools (read, files, table, workbook, document, deck, edit_file, finish). Older OpenAI and Gemini models that still used the previous tools switch with the update; a choice saved for "Cũ" is removed on the first launch, and a task started on the previous tools resumes on the new ones (TASK-641, TASK-642).
- Changed: Công cụ & MCP no longer shows the old tools. The tools the new set replaced (excel_read, spreadsheet_edit, docx_write, submit_result, …) are no longer listed on the page or in the permissions table: it lists only the tools models are offered, built-in first, then MCP. A task from an earlier version that calls an old tool name still runs for two more releases (TASK-643, ADR-077).
- Internal (TASK-643): legacy tools are dispatch-only aliases:
ToolRegistry::list_definitions/specsleave outtools::v2::REPLACED_BY_V2(tests readdefinitions_with_aliases/specs_with_aliases);spec::version::set_of,ToolListEntry/toolSetand thetools_legacy_*keys (4 locales) removed;list_toolsreturnsToolDefinition; legacy size-ceiling rows removed; lowering goldensclaude_first_party/claude_probed/claude_mantle/openaire-snapshotted on the v2 set,openai_strict.jsonandgemini.jsonremoved; the Claude strict priority names offered tools only. - Changed: Settings → Nâng cao → Thử nghiệm → Đo bộ công cụ measures the new tools only. The tool-set choice (Cũ, Mới, Cả hai) and the per-tool-set rows of the results are gone (TASK-642).
- Internal (TASK-641/642):
ToolsVersion,ToolsMode,ToolsSourceand theAMBA_TOOLS_V2override removed (tools::spec::version::offers/set_of); IPCget_tools_mode/set_tools_moderemoved; one-time data stepdata_step.v1.drop_tools_mode;runs.tools_versionalwaysv2; the legacy guard budget (plan-document guard, keyword drafts, the old wording) and thesubmit_result/report_key_figuresoffers removed; built-in prompts written in the v2 names (v2_prompt::rewriteonly for stored and user text); OpenAI/Azure lowering strict on every native endpoint and the Gemini working-style note whenever tools are offered; admission maps a stored legacy tool to its v2 replacement only;agent_eval--toolsflag removed, scenarios carry one v2 script; the lab plan has notools. - Changed: Gemini 3 and 4 with a Google AI Studio key work like Gemini on Google Cloud. They now use the new agent tools and get the same request as on Google Cloud: tool calls and results kept in the conversation, Gemini's reasoning carried between steps, the working-style guidance, a time limit with one automatic re-send of a silent answer, and a growing wait when Google's quota is reached. The API key is no longer part of the request address (TASK-636).
- Removed: local models (Ollama) and OpenAI-compatible endpoints (DeepSeek, OpenRouter, Groq, Together AI or a custom URL). Settings → Mô hình AI → API trực tiếp now lists Google AI Studio, OpenAI and Anthropic; the Add provider dialog offers the cloud platforms only. Existing providers of these kinds, their models, saved prices and keychain entries are removed on the first launch (TASK-637).
- Removed: non-Claude models on Amazon Bedrock (Nova, Llama, Mistral, …). Bedrock lists and runs Claude models only; profiles of other Bedrock models are removed on the first launch (TASK-637).
- Changed: a project, agent chat, PDF transcription setting or default model that used a removed model follows the app default ("Theo mặc định") again; an agent's model preferences drop it (TASK-637).
- Internal (TASK-637): one-time data step
data_step.v1.remove_legacy_providers;providers::is_bedrock_claude;compat_functionlowering and its golden removed; the eval harnesses acceptAMBA_EVAL_PROVIDER= anthropic, azure, google, openai or bedrock only. - Changed: agents list the new agent tools. Capability packs, the built-in agents and agents created in Agent Studio name the new tools (workbook, document, deck, edit_file, read, files, table); agents saved earlier are updated once on the first launch, and the clock, system-info and document-convert tools they listed are dropped. What an agent may do is unchanged (TASK-640).
- Changed: when Gemini or GPT writes a document or a workbook into its answer instead of saving it, AMBA saves it with the new tools (edit_file, workbook) (TASK-640).
- Fixed: a file built with the Office sandbox (
office_script) can be handed in. With the new agent tools, the agent's final hand-in no longer refuses the deck, document or workbook the sandbox just wrote as "neither written nor read in this run" (TASK-648). - Fixed: a process step whose agent hands in a file it never wrote says which file is missing. With the new agent tools the step now fails as "deliverable missing" with the file names, and the agent's thread gets the error note, instead of a generic "agent failed" (TASK-648).
- Fixed: a task resumed after the app was closed can finish. Resuming from an older save no longer leaves the agent unable to hand in the file it had already made (asked to list it, then refused when it did) (TASK-648).
- Fixed: an answer is no longer replaced by "completed". When the agent first replied with only its plan and then handed in its result, the stored answer was empty; the hand-in summary is now the answer (TASK-648).
- Fixed: a chat without a project that saves a file outside any project can finish. The hand-in no longer asks the agent to list a file it would refuse to list; the file still shows in the run's written files (TASK-648).
- Fixed: decks and Word documents built from a template with the new tools are checked against it. Sample slides left over from the template are flagged, and problems the template already had are not blamed on the agent, as with the previous tools (TASK-648).
- Fixed: the activity timeline shows table work (
table) as analysis rather than exploration (TASK-648). - Internal (TASK-640):
tools::v2::LEGACY_TO_V2(withto_v2,replaced_by,tools_in_v2_names) replacesADMITTED_BY/TABLE_SOURCES; admission maps a declared tool to its counterpart in the other set; one-time data stepdata_step.v1.agent_tools_v2rewritesagents.tools_jsonandpermissions_json; code-block salvage moved torunner/salvage.rs; legacy size ceilings reset to the measured values.
OpenAI GPT-6 with the agent tools (M114 round 0)
- Fixed: GPT-6 models keep their reasoning between tool calls. Each step of a task on GPT-6.1 Sol, GPT-6 Luna or GPT-6 Astra (OpenAI or Azure OpenAI) now continues the model's earlier reasoning instead of starting over, as OpenAI recommends (TASK-620).
- Fixed: OpenAI costs and cache use are shown correctly. Cached input, cache writes (billed at 1.25x input on GPT-5.6 and GPT-6) and reasoning tokens are now counted for GPT-6 models; a mid-task notice no longer breaks OpenAI's prompt cache; a GPT-6 answer no longer stops early on a small output limit (TASK-621).
- Fixed: an OpenAI account out of credit or over its spend limit fails at once with a clear message instead of retrying for minutes; when OpenAI asks to wait, AMBA waits that long. A cut OpenAI-compatible stream is retried instead of being taken as a short answer, and a long GPT-6 turn is no longer cut after 3 minutes (TASK-623).
- Fixed: "Tải về" lists an Azure OpenAI resource's deployments. Settings → Mô hình AI now fetches the deployments that finished deploying (named "deployment → base model (Azure)") instead of showing none; a Foundry project endpoint is told to use the resource's
https://<resource>.openai.azure.comendpoint. A request to a deployment that does not exist now says the model id must match the deployment name exactly, instead of asking to change an api-version that is already recent (TASK-631).
OpenAI GPT-6 with the agent tools (M114 round 1)
- Fixed: GPT-6 on OpenAI and Azure costs less per task. AMBA no longer rewrites earlier tool results in the conversation it sends, so OpenAI's prompt cache reuses the whole history instead of billing it again as a cache write on every step (TASK-627).
- Fixed: the agent can read a file again when its earlier result was trimmed instead of being refused; a refused repeat now says where the earlier result is and what to read instead, and a PDF page error shows the valid page form (TASK-632).
- Fixed: reconciling a table that was never loaded names the loaded tables and gives the exact load call; one retry after fixing the cause no longer counts as going in circles (TASK-633).
- Changed: GPT-6 answers stream live on OpenAI and Azure, and the task's effort sets GPT-6's reasoning effort (TASK-624, TASK-625).
- Internal (TASK-622; Claude's and Gemini's requests unchanged): after the "end with
finish" reminder, OpenAI and Azure are asked for a tool call (tool_choice: required).
OpenAI GPT-6 with the agent tools (M114 round 2)
- Changed: GPT-5 and GPT-6 on OpenAI and Azure use the new agent tools by default. With Settings → Nâng cao → "Bộ công cụ agent" on Tự động, GPT-5, GPT-6 and o-series models (on Azure, a deployment whose name starts that way) now get the same tools as Claude and Gemini on Google Cloud; GPT-6 Sol passed the tool bar on two measurements (12 of 13 tasks, no corrections). Older chat models such as GPT-4o, Azure deployments with other names and OpenAI-compatible endpoints keep the previous tools; choosing "Cũ" still switches back (TASK-628).
Settings and Tools & MCP cleanup (TASK-635)
- Changed: Công cụ & MCP is easier to scan. Page and section explanations moved into [?] tips, and the input schema in the detail pane is collapsed.
- Changed: the new tools (
read,files,table,workbook,document,deck,edit_file,finish) have titles and descriptions in Vietnamese, Japanese and Korean: the translate button appears in the detail pane, and the list shows the localized title next to the tool's name. - Removed: the "Làm mới" button on Settings → Mô hình AI → Tài khoản AMBA; usage is refreshed on Mức dùng & Chi phí. The card still reads the account when it opens and when the window regains focus.
- Removed: the Tools detail pane's duplicate "Loại nguồn / Chính sách chạy" rows (the badges above show both) and the raw source id in the source badge.
- Internal: the "Bộ cũ" group and
list_toolstoolSetthis task added were removed again by TASK-643 before release.
The lab's model picker (TASK-615)
- Changed: "Đo bộ công cụ" picks from the models you enabled in Settings → Mô hình AI → Bước 2. One checkbox per enabled model, with the same names, grouped AMBA / API trực tiếp / Nhà cung cấp đám mây, with its price on one line and the tier-2 tag; models the lab cannot run (local models, non-Claude Bedrock models) are greyed out with the reason in a [?] tip. The extra model ids offered under each profile are gone. The same model through two providers (for example Claude Opus on Anthropic and on AMBA) can run in one sweep and scores as two groups; a remembered selection that is no longer enabled is dropped.
- Internal (TASK-615): a target is a profile and its own model (
claude_profiles::eval_models,EvalModel,providers::amba::account::eval_modelsand the price table'sevalModelsremoved;ClaudeProfile.providerKindadded).resolverefuses another model or two targets with the same (provider, model); items carryprovider, resume and the running-cost estimate key by (provider, model), price overrides byprovider:model(a bare model id still reads).lab_get_statereturnslastTargets.
Gemini on Google Cloud with the v2 tools (M113 round 2)
- Fixed: a report can cite the workbook the same task just built. A Word, PowerPoint or Excel write whose figures come from a workbook the agent created earlier in the task, from the files it read, is no longer refused with "These sources were not read or loaded in this run"; the workbook must still hold exactly what the task wrote, and a file it only edited or filled without a source still needs a read (TASK-611, all models).
- Fixed: Gemini on Google Cloud no longer fails after a "repeating itself" notice with "Requests ending with a model turn are not supported", and that error is no longer shown as "model not offered in this location": a request Google refuses for its shape now says it is an AMBA bug (TASK-616).
- Changed: Google Cloud "quota reached" waits longer before giving up: the agent waits what Google asks (or 10, 20, 40 s, then a minute) instead of a few seconds. In the lab, Google models run at most two at once, and the time a run waits on Google's quota does not count against its run limit (TASK-617).
- Internal (TASK-618, 619; Claude's requests unchanged): Gemini's working-style note asks the
finishsummary to state each key figure with its value; a top-level argument name Gemini wraps in quotes ("path) is read as the plain name (the path is still confined as before).
Gemini on Google Cloud with the v2 tools (M113 round 1)
- Fixed: a fact can cite its cell the way the agent writes it elsewhere.
project_fact_recordaccepted onlyB12; a cell given asSheet!B12orreports/x.xlsx#Sheet!B12is now the same cell when the file and sheet match, and a range gets a clear "cite the one cell" message (TASK-607). - Internal (TASK-606, 608, 609; Claude's requests unchanged): Gemini's flattened op schemas say which fields each op takes; under the v2 tools the Google Cloud adapter adds a short working-style note to the system instruction (independent calls in one turn, write the deliverable, one-cell sources, end with
finish, at most 12 figures), and the turn after thefinishreminder must call a tool (functionCallingConfig: ANY). Gemini's default tool set is unchanged until it meets the v2 bar.
Cleaner prices and usage (TASK-604)
- Changed: Settings → Models step 2 and "Mức dùng & Chi phí" read cleaner. Each model card shows its price on one line ("$2 / $10 /1M token") with a small [?] that holds the input/output and cache prices, where the price comes from and the Bedrock regional +10% note; a user price is marked "đã sửa", and the pencil opens the price editor (with "Về giá mặc định" for your own price) instead of a block of text. On the usage page the subtitle is one short line, card captions and the notes under the table moved into [?] tips (hover, keyboard focus or tap), the "Giá" column became a small tag on each model, and models without a price stay visible as "N mô hình chưa có giá" and a "chưa có giá" chip on the row. Numbers are unchanged.
Models and usage in three tabs (TASK-603)
- Changed: Settings → Models and "Mức dùng & Chi phí" are split into three mini-tabs: AMBA, API trực tiếp (Anthropic, OpenAI, Google AI Studio, Ollama and OpenAI-compatible endpoints such as DeepSeek) and Nhà cung cấp đám mây (Amazon Bedrock, Google Cloud, Azure OpenAI). A dot marks the groups you have connected or used. Settings opens on the tab of your default model the first time, then on the last tab you used; a half-typed key survives a tab switch. The default model, prices and web search stay below the tabs for every provider. The AMBA quota bars are no longer in Settings: the account card has Xem mức dùng, and the usage page's AMBA tab shows the plan, the windows with reset times and credits only, without dollar estimates. The direct and cloud tabs each have their own spend, per-model table and notes (the +10 % regional-endpoint note under cloud). The period, the project, the budget warning and Xóa dữ liệu mức dùng sit above the tabs and apply to all; a group with no usage shows a short empty state with a Kết nối… link to the matching Settings tab.
Slow connections (TASK-601)
- Fixed: long turns on the AMBA account no longer fail on slow connections. On some networks a turn with web search results took a minute to upload and then failed with "error sending request". AMBA now sends each turn compressed to the AMBA gateway, and keeps web search results short (the title, the link and a short excerpt of each page; repeats are dropped), so a turn with five searches is many times smaller. Web search results are also shorter with your own keys; to read a whole page the agent opens it with web fetch.
- Internal (TASK-601):
providers/amba/gzip.rsgzips/v1/messagesbodies over 8 KB (flate2) only for a gateway whose last successful answer carriedx-amba-accepts: gzip, and on a 415 or a 400 "must be JSON" / "not valid gzip" forgets that and resends plain, so the gateway deployed before this change keeps working. The gateway (readBodyLimited) decompressesContent-Encoding: gzipwithDecompressionStream, holds both the compressed and the decompressed size toMAX_REQUEST_BYTES(413), refuses broken gzip (400) and other encodings (415), and sendsx-amba-accepts: gzipon every answer.tools/web_trim.rs:web_searchsnippets collapsed and cut at a sentence or word boundary to 600 characters (truncated: true), titles to 160, repeated URLs and snippets dropped,scoredropped, theresultsarray ≤ 4 KB (omitted_resultscounts what did not fit).web_fetchno longer panics when its character cap falls inside a multi-byte character. Gateway not deployed.
Usage & Costs (TASK-599)
- Fixed: costs use real, current prices. The Usage page used to price every current model (Claude 5.5, Claude in Amazon Bedrock, Gemini 3.x/4, current OpenAI models) at a made-up default of $0.50 / $2.00 per million tokens, so Claude Sonnet 5.5 showed about a quarter of its real cost and Opus less. AMBA now ships one price table (checked 2026-10-25 against Anthropic, Google and OpenAI's pricing pages): Anthropic, Amazon Bedrock (regional endpoints 10 % above global, as AWS bills them), Google AI Studio and Vertex AI, OpenAI and Azure OpenAI, with cache-read and cache-write prices; thinking tokens count as output. A model the table does not know shows "chưa có giá" and is left out of the totals with a note, instead of an invented number. The old built-in prices (GPT-4o, Claude 3.x, Gemini 1.5/2.0) are removed unless you had changed them.
- New: "Mức dùng & Chi phí" is rebuilt: spend this month and in the last 30 days, cost per run, tokens with cache reads and writes (and what the cache saved), spend per provider, and one table by model that says where each price comes from ("Giá mặc định AMBA (cập nhật 2026-10-25)", "Giá bạn nhập" or "Chưa có giá"). Costs on your own keys are labelled as estimates: the real invoice is in AWS, Anthropic or Google. The project budget warning uses the new numbers.
- New: with an AMBA account connected, the page shows the account: plan, the 5-hour, week and month windows (and Opus per week on Pro) with reset times, the credits AMBA counted this month, and this device's estimate in credits at the same prices, marked "theo hạn mức AMBA, không tính tiền thẻ".
- New: Settings → Models, step 2 shows each enabled model's price and its source, with Sửa giá to set your own (input, output, cache read, cache write) and Về giá mặc định. Bedrock models note that regional endpoints cost 10 % more.
- Internal (TASK-599): the price table moved from
tests/agent-eval/prices.jsontosrc-tauri/src/providers/pricing/prices.json, shared by the app (providers::pricing: user price, then the table by provider kind and normalised model id, then none) and the agent eval (Bedrock now priced from it; Opus/Sonnet 5.5 cache reads at 0.05× input; goldens regenerated; the lab's model picker readsevalModels). Migration V050 drops the untouched V007 seed rows and keysmodel_pricingby provider and model with a cache-write price. Commandsget_usage_report,list_profile_prices,set_model_price,reset_model_pricereplaceget_token_analyticsandget_project_token_analytics.
AMBA account (Milestone 112-lite)
- New: Settings → Models → "Tài khoản AMBA". Enter an invite code from AMBA, confirm you are 18 or older and press Kết nối: Claude Sonnet 5.5 and Haiku 5.5 (plus Opus 5.5 on Pro) appear in the model list with no API key. The card shows the account, plan, expiry, this device, usage bars for 5 hours, the week and the month with the time each frees up, and Đăng xuất. One line says it plainly: requests to Claude pass through AMBA's server and are not stored. The device token stays in the OS keychain. BYOK keeps working as before.
- New: the setup wizard offers "Dùng tài khoản AMBA (có mã mời)" first, before the Anthropic API and Amazon Bedrock; it makes Claude Sonnet 5.5 on the account the default model.
- New: a spent AMBA quota stops a task cleanly instead of failing it: the chat says "Đã dùng hết hạn mức 5 giờ, mở lại lúc 14:30" (or the week, the month), and the task can be continued from where it stopped once the window frees up. A task that reaches its cost cap says "Lượt này đã chạm trần chi phí"; when AMBA is at capacity for the day it says to try tomorrow or use your own API key; an expired, disabled or signed-out account says so and opens the account settings.
- New: the data-flow ledger names managed requests "AMBA gateway → Amazon Bedrock" (region us-east-1), with masking as for your own keys. The experimental lab's eval can measure the AMBA account's models through the gateway.
- Changed: the privacy policy and the Security page (English, Vietnamese, Japanese, Korean) describe the AMBA account. What the app sends, that requests pass through
gateway.ambadesk.com(Cloudflare) to Claude on Amazon Bedrock in the US, that the gateway stores and logs no content and keeps per-request usage records (account, device, model, tokens, credits, status, time), what the account holds (no email or password), Cloudflare and AWS as processors, and that your own key keeps requests off AMBA's servers (TASK-655). - Internal (TASK-594): provider kind
amba(providers/amba): the Anthropic adapter's newAmbaGatewaytransport (Bearer device token,x-amba-run-id, bare model ids, InvokeModel capabilities and probe facts, v2 tools byauto), coded gateway errors (amba_quota,amba_run,amba_daily_cap,amba_plan,amba_expired,amba_revoked,amba_auth), the runner's clean stop (runner/account_stop.rs), the commandsamba_account_status|redeem|usage|logoutandamba_set_gateway, and a local wire mock of the gateway for the tests (redeem, me, logout, SSE messages).tests/agent-eval/prices.jsongains theambaprovider (first-party fallback prices). - Internal (TASK-598): the model gateway's
/adminis rebuilt as a console (Tổng quan, Tài khoản, Gói & hạn mức, Lời mời, Nhật ký; light/dark, phone layout, Vietnamese with an English toggle; no external assets under the strict CSP; secret in sessionStorage only, Đăng xuất, confirmed destructive actions). Per-account limit overrides and notes, plan defaults and daily caps now live in D1 (vars and built-in limits as the seed) and apply from the next request; new admin routes for overview aggregates, per-account usage by model, invites (list, revoke unused) and a cursor-paginated request log. Additive migrationinfrastructure/model-gateway/migrations/2026-10-25_task-598_admin_settings.sql; the worker's wrangler is 4.149.0. Not deployed. - Internal (TASK-591): new Cloudflare Worker
infrastructure/model-gateway(not deployed): Anthropic-shapedPOST /v1/messages(streaming passed through chunk by chunk, tools, caching, thinking, betas) to Claude on Amazon Bedrock InvokeModel with SigV4; invite-code accounts with hashed device tokens (/v1/account/redeem,/me,/logout); per-request metering in credits at the Bedrock list price (no bodies stored or logged); per-account quota Durable Object (rolling 5 h / week / 30-day windows, per-run cap, requests per minute, Opus weekly cap) reserved before and settled after each stream; global daily caps ($50 Free, $100 all plans) in a singleton Durable Object; a Founder admin page at/admin. Its tests run in the gate's Vitest tier, and its sources are under the 800-line check.
Agent tools (Milestone 111)
- Changed: Claude now works with the new agent tool set by default. Runs on Claude, through the Anthropic API or Amazon Bedrock, use the v2 tools: one tool each to read files, find files, analyse tables in SQL, edit workbooks, documents and slides in place, and a checked hand-in at the end (
finish). In the lab on the office scenarios they succeeded more often and cost about a third less than the previous set. Other providers (OpenAI, Azure, Gemini, Google Cloud, OpenAI-compatible) keep the previous tools until they are measured; the switch below brings the previous tools back for Claude too. - New: Settings → Advanced → "Bộ công cụ agent": Tự động (khuyên dùng) (the new tools for Claude, the previous ones elsewhere), Mới (v2) or Cũ. A change applies from the next run, without restarting. It replaces the "Dùng bộ công cụ mới" switch of the experimental lab; a switch you had turned on reads as Mới (v2), one turned off as Tự động.
- Changed: asking a question about a spreadsheet no longer leaves a file in your project. The working database AMBA builds to analyse tables now lives with AMBA's own project data (
.amba/analytics.db) instead ofworkings/.analytics.db. An oldworkings/.analytics.dbis no longer used and can be deleted; the next analysis rebuilds the tables from your files. The end-of-day report template no longer needs permission to update that database. - Fixed: a run no longer fails its hand-in over formatting details.
finishasks for the numbers the user asked for or would check (totals, counts, rates); widths, styles and fonts go in the summary. A formatting fact cited to a header cell is told to move to the summary instead of being refused again and again. - Changed: Gemini 3 and 4 on Google Cloud now use the new agent tools under "Tự động", like Claude. Measured in the lab: Gemini 4 Argon 24/26 and Gemini 3.8 Flash 23/26 office scenarios, with all but one ending in a checked hand-in. Gemini through AI Studio and other providers keep the previous tools (TASK-614).
- Fixed: Google Cloud runs keep working after the computer sleeps. The Google sign-in token was timed with a clock that stops during sleep, so after waking the app kept sending an expired token and every request failed with "invalid authentication credentials" (401). Expiry now uses the wall clock, and a cached token Google refuses is replaced and the request sent again (M113).
- Fixed: a reply cut off mid-way is retried instead of read as an answer. When the connection to the model dropped mid-reply (seen on the AMBA account), the agent took the few words it had received as its answer, stopped calling tools and ended unfinished. Such a turn is now sent again, and so is a request that could not be sent at all ("error sending request") (TASK-605).
- Fixed: a result handed in as "Xong một phần" or blocked now offers "Tiếp tục". Before, the open items were listed but there was no button to have the agent carry on; it showed only for runs stopped at the step limit (TASK-602).
- Fixed: a chat answer is no longer replaced by "Đã trả lời trong chat". When Claude answered a question in the chat and then handed in with a short note, the note replaced the answer in the conversation. The chat now keeps the fuller answer (the hand-in note stays in the run's result), and the hand-in asks for the full answer rather than a note (TASK-600).
- Fixed: under the new tools, process steps name
files(by date) instead ofinbox_files, and Research mode no longer mentions the removed knowledge base. - Fixed: ▶ Thử on a process's agent step works with the new tools. A step test ended "chưa xong" because the hand-in did not find the files the test had written in its sandbox, and adding a row to an existing workbook in a test (the history of the daily report) found the workbook empty. A test now edits a copy of the file, checks the hand-in against what it wrote and gives a Markdown report its PDF copy, as a real run does; your project stays untouched.
- Fixed: the Telegram owner assistant on Claude is no longer told to report key figures with a tool it does not have. A reply follows the owner-assistant template, which reports none.
- Changed: other providers can follow the new templates as written. When a model on the previous tools calls a tool the 2.0.0 templates name (
files,table,workbook,read,edit_file), the call runs;finishat the end of a process step hands in the result likesubmit_result, and elsewhere it says to answer in text. - Internal (TASK-578):
runtime/process/actions/tests_smoke_v2.rsruns the demo shop with the financial-analyst 2.0.0 templates and a scripted model through Chạy ngay, the owner assistant on Telegram, the 18:00 schedule and a ▶ step test, on Claude (v2 recorded and offered, prompts name only offered tools,finishaccepted, no guard) and on OpenAI (current set, with the current names and with the v2 names). Dry runs record sandbox writes under the sandbox and map them back withproject_files::dry_run_logical(deliverables, PDF companions, ledger zone;finish,submit_resultandreport_key_figuressources); an allowed overwrite in a dry run starts from a copy of the file; write paths match the canonical project root too. Aconverseturn takes the persona's conversation-template contract; the key-figures directive is added only whenreport_key_figuresis offered. - Internal:
ToolsVersion::resolvetakes the run's provider kind and model; thetools_v2setting isauto/v2/current(one-time data step from the old bool),AMBA_TOOLS_V2still wins. The runner resolves once per run (a resumed run keeps its set) and records it inruns.tools_version(V048) and acontext_buildevent (source: "tools",decidedBy). IPCget_tools_mode/set_tools_mode;lab_set_tools_v2removed. The eval lab sets the tool set explicitly per run.db_pathmay name.amba/analytics.db(the only.amba/file a tool call can have written, by the table engine; no consent or overwrite question).
Built-in agents (Milestones 110–111)
- Changed: the seven built-in agents use the new agent tools (templates 2.0.0). Their instructions and process steps now read files with one reader, total and match tables in SQL, edit workbooks, Word files and decks in place, and end each task with a checked hand-in of the files and key figures, each figure with the cell it comes from. Their steps, rules, Vietnamese wording and output folders are unchanged. Agents you installed from the catalog and did not edit update themselves; an edited agent keeps your text and shows Mẫu có bản mới.
- Changed: filling a contract template (Lead Business Author, Chief of Staff) fills the fields in a copy in
reports/and no longer marks them as tracked changes in Word; compare the copy with the template, and every write can still be rolled back from the file's history. - Changed: the playbook pages list each agent's capability packs as the agent has them (Financial Analyst, Inventory Controller, Strategy Consultant), the Inventory Controller's playbook in the app is the same as on the website, and the example file names in every playbook are marked as examples (4 languages).
- Internal:
routineTemplates[]keepsid,name(s),mode,instruction,outputContract,parametersand a newconverse: true(the owner assistant's directive; a pre-2.0.0 cached catalog is still read by its trigger); the deadtriggers,unattendedPolicy,deliveryandquestionsare gone and the catalog build refuses unknown fields, aplaybook.mdthat differs fromlocales/en.md, and a pack header that differs frommeta.json.workings/.analytics.dbleft the process templates' overwrite lists and.amba/context.jsonthe write policies. New invariant testruntime/catalog_text_tests.rs: every template text names only tools the v2 set offers and writes nothing intosources/or.amba/.inventory-reconciliationis a required persona. - Changed (TASK-583): the ten built-in project templates (Invoice reconciliation, P&L analysis, Payroll audit, Executive command center, Media planning, Capital & debt financing, Marketing content, Logistics, F&B, Document analysis & contract review) now describe the new agent tools. In a Document Analysis project, a contract template is filled field by field into a copy in
reports/(the template in Sources is never changed) and the hand-in tells you to compare the copy with the template in Word; it no longer promises tracked changes, which the new tools do not make.
Agent templates (Milestone 110)
- New: agents installed from a built-in template now receive template updates. When a template gets a new version, an agent you have not edited gets the new instructions and capabilities by itself, at launch or when Agent Studio loads the templates; its name, icon and projects stay. A toast says "Đã cập nhật N agent mẫu".
- New: an agent you edited is never overwritten. Agent Studio marks it "Mẫu có bản mới" and offers Xem khác biệt (line by line, plus capabilities added or removed), Áp dụng (after a confirmation; your edits to the instructions and capabilities are replaced, name, icon and projects stay) and Bỏ qua (this version is not offered again). Custom agents are never touched. Process templates already added to a project are separate copies and do not change.
- Changed: a new app version brings its newer templates even offline: the templates shipped with the app are used when they are newer than the copy last downloaded. Đồng bộ từ Cloud still fetches the latest.
- Internal: V049
agent_template_state(template id, version frommeta.json, hash of the shipped instructions and packs, pending and dismissed versions);runtime/template_updates(launch step 7 and everyget_agent_catalog); installs written before V048 count as unedited only when their text matches the current template or one an earlier catalog shipped (hashes from the catalog's git history), otherwise they are treated as edited. IPClist_agent_template_updates,apply_agent_template_update,dismiss_agent_template_update,take_agent_template_upgrade_notice;AgentCatalogResult.upgradedAgents. Install records the template version instead of 1.0.0; the catalog build checks thatversionis numeric (TASK-567).
The new agent tools, measured on Claude (Milestone 108)
- Changed: Claude gets exact tool inputs where it matters most. On the Anthropic API, strict tool use (inputs guaranteed to match the tool's schema, limited per request) now goes first to finishing a run, the plan, questions to the user and the Office writers whose schemas allow it, then to readers; before, the allowance went to tools in alphabetical order. Amazon Bedrock keeps strict off until the probes below show it works there.
- Internal:
pnpm run probe:claudechecks which Claude request features the Anthropic API and Amazon Bedrock accept (strict tools, tool examples, tool search, system messages mid-conversation,tool_choice: none, eager streaming, progress notes, caching, PDF, the text editor and memory tools, strict limits) and prints the table as JSON and markdown;--savecommits the results into the build. The first time a Claude profile is used in a new version, AMBA checks the uncertain features once in the background with four short synthetic requests (listed under "Data leaving this device" ascapability_probe; no content) and remembers the answer for that version. Without results, requests are unchanged. - Internal (TASK-548): one canonical
ToolSpecper tool (tools/spec/) with typed op tables that generate the workbook op schemas, hints, examples, normalizer and validation hints (thespreadsheet_editandexcel_writeschemas are byte-identical to before); per-provider lowering (providers/anthropic/lowering.rs,providers/lowering.rs: Claude op unions,input_examplesonce probed, OpenAI strict form, Gemini op flattening) with snapshot tests; tool errors in one contract (code,at,expected,example,did_you_mean,applied,retryablenext to the unchangederrortext) for invalid inputs, workbook ops, every tool's argument errors and unknown tool names; a tool-definition size ceiling per pack and agent; thetools_v2flag (AMBA_TOOLS_V2or thetools_v2setting, no UI) andpnpm run eval:agent -- --tools v2. The agent sees the same tools. - Internal (TASK-549): with
tools_v2on, oneworkbooktool replacesexcel_write,spreadsheet_editandaccounting_export_table_to_xlsx(old names still accepted): create, edit in place or fill a template with one op vocabulary (21 ops incl. new Excel tables andwrite_queryfrom the analytics database) through the same engine, verification and revisions; results under 400 bytes;sourcesreplace the file-name grounding guard for it; read handlesRunRefsfor TASK-550. With the flag off nothing changes. - Internal (TASK-550): behind
tools_v2, three Claude-first readers replace 17 model-facing tools:read(one reader for text, CSV, Excel, PDF with the M107 tiers and tier-3 consent, Word, PowerPoint and images; outline first for workbooks, long documents, decks and PDFs, then apartsuch asTB!A1:H60,p3-5,s2or a heading; at most 24 KB with one{cursor, has_more}pair),files(listwith a glob,searchover the workspace index,by_dateover the inbox) andtable(loada CSV, sheet or range into the scratch SQLite,queryas TSV with at most 200 rows and a cursor,reconcile,describe;SELECT <expression>replacesmath_calculate). Every read, load and query carries areffrom the run'sRunRefsregistry (runtime/execution/refs.rs, saved in the resume state). Under v2system_time,system_info,directory_treeanddocument_convertare not offered (today's date opens the request); old names stay accepted at dispatch. The three definitions take 5.96 KB; mock eval v2: 8/9 as expected, 98,254 input tokens per run (current 109,105), 50,154 B of tool definitions for the eval agent (current 58,926). - Internal (TASK-551): behind
tools_v2,documentreplacesdocx_write,document_editandpdf_generate(create from Markdown, replace / insert / delete sections, fill template fields, tables, styles, append;export: "pdf"),deckreplacespptx_writeandpresentation_edit(create from an outline, add / replace / delete slides, text, tables, charts, reorder), andedit_filereplacesfilesystem_writeandreplace_file_contentwith the commands of Anthropic's text editor (view,create,str_replace,insert; Sources viewable, never written; revisions). Both Office tools edit in place, start a new file from the company template, run the same engines, verification and revisions, return under 400 bytes and citesources. On Claude the request offers Anthropic'stext_editor_20250728instead ofedit_fileonce the capability probe confirms it; until then, and on other providers, the custom tool. With the flag off nothing changes. - Internal (TASK-552): behind
tools_v2, every Agent-mode run ends with a verifiedfinish(summary, files with what each one is, key figures with their source, open items, status) in place ofsubmit_resultandreport_key_figures: the runtime checks the files, the figure sources and the deliverable verifiers before the run may end, a text reply gets one reminder, and two refusals end the run as incomplete. The chat shows a compact "Kết quả" block (status, files, figures with their source, open items). - Internal (TASK-553): behind
tools_v2, the runtime verifies instead of patching. One guard-budget table keyed by tool set and provider tier: on Claude (Anthropic API and Claude in Amazon Bedrock) the text tool-call salvage, relaxed parsing, code-block salvage, follow-through nudges,<plan>text fallback, file-name grounding guard, plan-document guard, draft keywords and the old workbook writer's hints are off; it keeps the mode refusal (read_only_mode, one sentence), the stagnation notice, the truncation continuation and the verifiers insidefinish. Gemini, OpenAI and other tier-2 models keep the salvage and nudges. A draft is an explicit run flag (draft). Every v2 guard message and notice is a plain sentence, sent as a mid-conversation system message where the provider takes one. The v2 "How you work" prompt is 2.9 KB (9.1 KB today) and no longer says "no Python" or asks for three linked sheets. With the flag off nothing changes. - New: a "Hạng 2" (tier 2) hint in the Agent-mode model picker. Models other than Claude (OpenAI, Azure OpenAI, Gemini, Google Cloud, local models) run the agent's tools in a reduced form, with more checks and retries; in Agent mode the picker marks them so. A model whose profile says
agentModeSupported: falseis not offered in Agent mode; no model is hidden until the eval has measured them. - Internal (TASK-554): behind
tools_v2, OpenAI and Azure OpenAI send strict tool schemas per tool where they can be expressed within each endpoint's limits (op unions asanyOf, optional fields nullable, open maps as key/value pairs;strict: falsefor a tool that cannot, one non-strict retry on a schema error); Gemini and Vertex receive the op unions flattened with conflicting field types kept, and each op is checked against its own shape before the tool runs. MCP tools stop inflating every request: behind tool search on Claude once the probe confirms it, else at most 8 offered plusmcp_find, which adds the matching ones from the next step; MCP results over 24 KB are paged. With 40 MCP tools the tool definitions go from 63 KB to 41.5 KB. The eval scorecard computes the tier-2 bar (success ≥ 70 % of Claude's at ≤ 1.5× the turns) per model, and--mockalso runs the scripted model as a tier-2 adapter. - Fixed: totals over SUMIF, SUMIFS, COUNTIF(S), AVERAGEIF(S), SUMPRODUCT and IFERROR show their value. A summary built from a detail sheet (
=SUMIFS('Chi tiết'!C:C, …)) and every total over it were saved without a value, so previews, AMBA's own readers and the agent's checks saw empty cells until Excel opened the file. AMBA now computes them when it writes the workbook. - Fixed: the agent finds a sheet whose name it typed differently: another case of a Vietnamese letter (
nl ănforNL ĂN), decomposed accents, or without a trailing space in the name. - Internal (TASK-561): the first live Bedrock eval of v2 (Opus 5.5, 7/13 vs 8/13 current) ended 8 of 13 runs in the stagnation wrap-up after identical reads. An identical repeat of a read on an unchanged file now gets the earlier result back (content capped at 8 KB) with a note on the next step instead of an empty "unchanged"; a read after the file changed is not a repeat; the first repeat of a read gets no stagnation notice, and the notice now follows the repeated call's result instead of preceding it. Under
finish, aworkbook,document,deckoredit_filewrite says to callfinishwhen done, and the finishing rule says to read a file back only for a value.finishevaluates a cited formula cell that has no cached value. Under v2office_scriptand its guidance send decks todeck, Word files todocumentand workbooks toworkbook; after the sandbox worker fails to start, the error says a retry fails the same way and later runs do not offer the tool until a host registers again. Failed eval run lines carrytranscript(each call with arguments and result cut to 1 KB, stagnation notices, the answer; kept in the lab results and theruns.jsonlexport) andofficeSandboxwhen the worker did not start. Mock eval (Claude script): v2 16/17 like current, 3.5 vs 7.1 triggers per 10 runs, 61 k vs 107 k input tokens per run. - Fixed: reading a short file returns its content. With the new tool set, the agent asked for a 5 KB Markdown file and got only its table of headings, asked again three times and the run stopped as "incomplete". A file now comes back whole whenever it fits one result (about 24 KB); a larger file comes back with its outline and its first page, and asking again gives the next page instead of the same answer.
- New: ask the agent which model changed a file. "Ai đã sửa file này?" or "which model wrote reports/bctc.xlsx?" now gets the file's changes made by AMBA runs in this project, newest first: when, which agent, which model profile and model, the start of the request, the tool and the revision to roll back to.
- Internal (TASK-562): v2
readis content first (outline only over the cap, then with the first page, the cursor and a hint with an example call; CSV rows up to the cap instead of 50). An identicalreadafter an outline reads on at its cursor (≤ 8 KB pages,repeat_page, one-sentence note) and does not count as stagnation; replays of content results keep the TASK-561 behaviour with a concrete next call in the note.files {op: "history", path}(v2) andfile_history {path}(current set, always on) list a file's writes from the project's run events, the write ledger, Doc-Ops revisions andruns.model_profile_id(≤ 20, newest first). Mock eval (Claude script): current 16/17, 3.4 turns, 7.1 triggers per 10 runs (unchanged); v2 16/17, 3.5 turns, 1.8 triggers per 10 runs (3.5 before),edit-append-rowswithout a stagnation notice; v2 input tokens 71 k per run (61 k before), mostlyedit-append-rows(320 k): the first read of its 3,000-row sheet now carries a 20 KB first page and the two repeats read on; the other 16 scenarios average 55 k. - Fixed: formulas that build text, and totals over them, get their values. A column such as
="Q"&ROUNDUP(VALUE(RIGHT(A2,2))/3,0)(quarter labels from months) had no value when AMBA saved the workbook, so every SUMIFS that used it as a criterion, and the totals over those, showed empty in previews, in AMBA's own readers and in the agent's checks. Text formulas (&, LEFT, RIGHT, MID, LEN, VALUE, TEXT, TRIM, UPPER, LOWER, CONCATENATE), ROUNDUP, ROUNDDOWN, INT, MOD, AND, OR, NOT, COUNTA and an IF whose other branch would divide by zero are now computed. - Fixed: a summary sheet follows its detail sheet. When the agent changed a detail sheet, the summary sheet that adds it up kept its old (or empty) values until Excel opened the file; every sheet that depends on a changed sheet is now recomputed. A formula AMBA cannot compute is named in the agent's result with the reason (for example the function it does not know).
- Fixed: the agent no longer reads an Excel, Word or PowerPoint file over and over to find its formatting. Reading the content says that formatting comes from the file's structure view, and reading the same content again says so first; the live run that read a stock-count workbook five times and stopped with nothing written now gets that answer the first time it repeats.
- Fixed: the agent can read one sheet, a range or the formatting of a file with Claude. With Claude, the reader received only the file path, never the part or the structure view the agent asked for, so it got the same content again and repeated itself until the run stopped. A large workbook is now read sheet after sheet instead of stopping after the first sheet.
- Fixed: speaker notes in a deck stay on their slides. After slides were added or deleted, reading the deck showed every note one slide late (the file itself was right); the agent can now set the notes of an existing slide.
- Internal (TASK-570): from the 2026-10-23 16:01 UTC live Bedrock eval (v2 11/13, 23 repeatNoop, 10 stagnation). Root cause of 38/38 v2
readcalls withpathonly:readwent outstrict: true, the strict grammar writes properties in the wire order (name-sorted:cursor,detail,max_bytes,part,path), so afterpathnothing could follow; the current set showed the same on strictdocx_write(nevercontent). Claude strict now only for fully required schemas (Capabilities.strict_optional, off); Claude v2 lowering snapshot. An identical read after its replay getsrepeat_call(retryable false). Eval:pptxSlides/docxTextapply a unit stated in a table's header row, first column or top-left cell ("(triệu đồng)", "(tỷ đồng)", "(million VND)"). Deck reader: slide order fromr:id(was archive order) and notes by relationship;deck create {title, slides}keeps the deck title as the cover. - Internal (TASK-564): from the 2026-10-23 live Bedrock eval of Opus 5.5 (v2 10/13, current 9/13). Engine: values carry text, criteria match text results, recalculation covers dependent sheets and uncached formulas (
office/xlsx/recalc.rs,tools/excel_writer/evaluator*.rs);workbookwarns whenwrite_querywrites formula-looking text.finishrefuses a figure cited from a cell of a workbook written in the run that has no saved value (the narrative run was accepted on an in-memory value while the file showed an empty total), withat/expected/example.readhint and repeat notice for Office files; tool-definition ceiling of the v2 eval profile +151 B. Eval: the deck grader reads3.410 triệu,3,41 tỷ,3.41 billion,3,410 millionas 3,410,000,000 (the unit word decides the decimal mark; rounding to the written precision up to 1.5 %); transcripts are kept for runs that failed, did not complete or needed a guard, with up to 16 KB per argument and result (768 KB per run, else 1 KB). The Office sandbox client reports an empty worker error event as a worker script that did not load. - Fixed: columns and rows the agent inserts look like the rest of the sheet. Inserted columns take the format of the column to their left (font, size, borders, fill, width) and inserted rows that of the row above, as in Excel; when the figures on the other side use another number format, the new cells keep the General number format instead of, say, a percentage. Changing a number format keeps the cell's font and borders. Before, a column inserted into a formatted count sheet came out in the default font without borders.
- Fixed: the agent can hand in a percentage it read from a ratio cell. "−2,4%" (or −2.4 with the unit %) cited from a cell holding −0.0242 was refused as "holds −0.0242, not 2.4"; it is now accepted within the rounding of what was written, and a real mismatch is still refused with its sign.
- Changed: the agent no longer pages through a long sheet to add rows or a total. Reading a large workbook shows the last rows of its long sheets and says that new rows go after them by themselves and that totals or lookups are computed with a query; reading on page by page is for when every row is needed.
- Fixed: the agent can remember a choice you made in its question. After you picked an option (or typed an answer) in the agent's question, recording that decision for later runs was refused because your answer did not count as your own words; the option you chose and what you typed now do, while a quote you never said is still refused.
- Changed: the agent writes a formula down a whole column in one step. A column of 2,000
=D2*E2-style formulas used to take ten writes of 200 rows; it is now one fill, like Excel's fill-down (references move with each row,$references stay), with every value computed. - Fixed: a query whose text contains a semicolon is no longer refused. A SQL query that used
'; 'as a separator, or ended with;or a comment, was refused as "multi-statement"; two statements are still refused. - Internal (TASK-573): from the 2026-10-24 full Bedrock eval (v2 13/13, triggers 2.31 per 10 runs).
bctc-tb-full: twoproject_fact_recordrefusals of theask_useranswer ended in a stagnation notice; answers now count as the user's words (RunState.user_answers), the fallback answer picks the recommended option, fact refusals carryretryable, and a content refusal (retryablewithout a contractcode) resent with new arguments gets one same-error turn more; schema and op errors keep the two-turn count (runner/turn_errors.rs).edit-formula-column:workbookopfill {sheet, range, formula}(office/xlsx/fill.rs).stock-next-day: thefinishrefusal was a wrong citation (NL NƯỚC!E22is empty; the sheet ends at row 10 and every formula of the written copy had its value, now tested on the fixture); refusals name the cell of that sheet holding the figure.tableSQL check masks literals and comments (tools/read_only_sql.rs). Tool definitions:fillpaid for by shorterworkbook,ask_userandproject_fact_recordtexts (v2 chief-of-staff 25,509 → 25,501 B; every profile −8 to −100 B). - Fixed: the agent can hand in a total or a count it read from a range. A figure cited from
Bán hàng!G3002:G3004(the total of three new invoices) orTồn kho!F2:F2001(2,000 formula rows) was refused as "not a cell"; it is now accepted when it is the sum of the range, the number of its filled cells, or the number of rows or cells it spans. Otherwise the refusal says what the range adds up to and counts, so the agent corrects it at once. A source with a note after it (thong_tin_hop_dong.md (Phí dịch vụ)) and a line of a text file (thong_tin_hop_dong.md#L8) are accepted too. - Changed: a write with figures no longer stops when the agent forgot to name its sources. Once the agent has read or loaded files in the run, an Excel, Word or PowerPoint write without
sourcesgoes through, attributed to the files it read, and the agent is told to name them; the file's history ("Ai đã sửa file này?") says the sources were attributed by AMBA. A write in a run that read nothing is still refused, so figures cannot be made up. - Changed: an agent that has written nothing yet is told which file to write and how. When a reply is cut off at the output limit, or ends without handing in the result, before any file is written, the reminder names the file the request asks for (for example an Excel file in
reports) and the exact call that writes it, instead of "continue where it stopped". - Internal (TASK-575): from the 2026-10-24 Bedrock evals of Haiku 5.5 (v2 11/13, 14.6 triggers per 10 runs) and Sonnet 5.5 (v2 13/13, 2.3).
finish(runner/finish/verify_source.rs): range sources match the sum (single-cell precision rules), the non-empty count or the size; one trailing note ((…),— …) is dropped when the source as written is refused;path#L12/#L12-14on text and Markdown files must hold the figure, and the refusal names the lines that do. Provenance (modes/provenance.rs): with refs, a writer call withoutsourcesreturnsGrounding::Attributed(every ref except reads of the file being written), and its result getssources: {refs, attributed: "auto"}and a warning (not counted as a guard trigger);file_historyentries carrysourcesandattributed(modelorauto). Follow-through (runner/finish/nudge.rs): with nothing written and a deliverable named by the request or plan (an output path, or a kind of file with a write verb, in the folder it names), the truncation continuation and thefinishreminder name it and the writer call; their counts are unchanged. Eval transcripts keep text replies between tool calls (2 KB each). Scorecard: a baseline-relative bar line for a model without a baseline group reads "n/a (no baseline for this model)" (was "84.6 % vs —", "199504 vs 0", "0.0182 vs undefined") in the card, the Markdown and the lab; scorer goldens rebuilt. - Internal (TASK-572): v2 tool definitions within 25 KB per agent (chief-of-staff 34,191 → 25,509 B; eval sets 21.4–24.9 KB): shorter descriptions and property texts (shared tools too), one example fewer on the Office tools, op unions as
op: {const}without per-optype/additionalProperties(added by the strict lowerings; runtime checks useclosed_variant); the 25 KB budget test runs for every v2 agent and eval profile.workbookofferscopy_style {sheet, from, to};sheet_defaultsis accepted but no longer offered. Office reads drop the repeated "Formula Dependency Graph". Eval oracle (office-verify):cf_addedcompares the rows the rules highlight (cellIs, AND/OR/NOT expressions) when a rule is written another way,col_widthstakes{min}(INV2/INV2N: 80 % of the reference), blank formatted cells in a row the task creates are accepted; the livestock-reconcile-countops replayed on the fixture pass INV2, and every app xlsx corpus task still passes.
Google Cloud (TASK-580)
- Changed: Vertex AI is now "Google Cloud — Gemini Enterprise Agent Platform (trước đây là Vertex AI)", Google's new name since April 2026. Existing providers and profiles keep working unchanged (the provider kind stays
vertex). - New: a step-by-step guide in Settings → Models → Add Cloud Provider → Google Cloud, open until a key is pasted: choose a project with billing, enable the Agent Platform API, create a service account with the role Agent Platform User (
roles/aiplatform.user), create a JSON key, what to do when the organization blocks key creation, and paste. Each step has a button that opens the Google Cloud Console page in your browser (4 languages). - New: the pasted JSON key is checked at once. An API key, an OAuth client JSON (
installed/web) or a cut-off paste is named as such; a valid key fills in the project ID and shows its service account (read only). Saving refuses an invalid key too. The key is still stored only in the OS keychain and never shown back. - New: Thử kết nối in the dialog gets a token with the service account and sends a one-word request before you save. A disabled API, a missing role, billing off, an unknown project, a model not offered in the location or a deleted key each get a clear message; failed runs carry the same hint.
- New: location
global(default), the multi-regionsusandeu, and a short list of regions that serve the current Gemini models; any other location can still be typed.globalusesaiplatform.googleapis.com,us/euuseaiplatform.{us,eu}.rep.googleapis.com, regions keep{region}-aiplatform.googleapis.com. - New: Fetch on a Google Cloud provider lists the current Gemini models: Gemini 4 Argon, 3.8 Flash, 3.5 Flash, 3.5 Flash-Lite and 3.1 Pro (preview). Other model ids can still be added by hand.
- Internal:
providers/vertex/{key,errors}.rs, IPCtest_vertex_connection(credential checked, nothing stored),num-bigintas a test-only dependency for a throwaway RSA key in the token-flow test. Manual (4 languages) and the security pages renamed. - Fixed (TASK-582): Gemini on Google Cloud can use tools again across turns. Every run that used a tool stopped after its first step with a 400 error ("Invalid value at …function_response.response" or "Function call is missing a thought_signature"). A tool result now always goes back as an object named after its function, and Gemini's thought signatures go back unchanged on the part they came with, also after a resumed run.
- Internal (TASK-582):
providers/vertex/parts.rs. Signatures are stored asContentBlock::Thinking(providervertex, payload typegemini_thought_signature, keyed by call id), so they persist in the run history andruns.resume_state_json; replayed only to the same model. A firstfunctionCallof a step in the current turn that has no signature gets Google's documentedskip_thought_signature_validator. A tool result whose call is no longer in the history goes as text. Vertex wire golden updated (functionResponse.name). - Fixed: a saved Google Cloud provider no longer shows the generic "Base URL" and "API key" fields, where saving replaced its service-account key with whatever was typed. Its card now shows the project, the location and the service account (read only), Thử kết nối with the saved key, and Thay khóa JSON, which opens the same fields and checks as Add provider. Every way of saving a key for a Google Cloud provider now checks it (TASK-581).
- Internal (TASK-581): IPC
vertex_provider_info(project, location,client_email; no secret) andtest_vertex_provider(the saved key);set_provider_credentialvalidates avertexprovider's value likesave_model_provider. - Fixed (TASK-586): Gemini sees every tool result of its run. On Google Cloud (and every provider other than Claude), the runner shortened all tool results older than the last four messages, so of seven files read in one step the model saw only four, then re-read and re-queried what it had lost. The latest results are never shortened now, and Gemini on Google Cloud keeps the whole run as it was said, like Claude.
- Changed (TASK-586): Gemini on Google Cloud costs less per run and the cost shown is right. Requests of a run now start with the same bytes (instructions, tools and the conversation so far; a runtime reminder stays where it was said), so Google's automatic context cache applies; the cached part (
cachedContentTokenCount) is counted as cache read and Gemini's thinking tokens (thoughtsTokenCount) as output. Before, every run showed 0 cached tokens and no thinking. The same usage fix applies to Gemini through AI Studio. - New (TASK-586): the
tabletool saves a query as a table (loadwithnameandsql): six monthly bank statements become one table forreconcile, or a signed amount column is added, instead of the agent copying 45 rows into a CSV by hand (both Gemini models did, one with changed descriptions). - Internal (TASK-586):
providers::google::gemini_usage(AI Studio final and stream, Vertex);VertexProvider::requires_append_only_history→ true; mid-runsystemmessages go in place as user text (wire golden updated);skip_thought_signature_validatoron every unsigned step, not only the current turn (prefix stays byte-stable);prune_tool_observationskeeps the latest batch. Eval:tests/agent-eval/prices.jsonprices Gemini 4 Argon ($4 / $0.20 cached / $20) and Gemini 3.8 Flash ($1.50 / $0.15 / $7.50) per million tokens at Google's standard global list price (source in the file), an entry'scacheReadwins overcacheReadMultiplier, a lab price override keeps the model's cached share (optionalcacheRead); the metrics judge a tier-2 v2 call as the runner reads it back (read_tier2_call), so Gemini's[{key, value}]map pairs are no longer counted as invalid calls or op-shape repairs (Argon's 2.7 validation errors per 50 calls were all such pairs). - Fixed (TASK-587): Gemini on Google Cloud no longer hangs on a request and answers sooner. Answers now stream as they are written. When Google sends nothing for 120 seconds (or stops for 90 seconds mid-answer), AMBA sends the request once more and then stops the step with "Google không trả lời trong N giây", which the run retries and can resume; before, one Gemini 3.8 Flash request never returned and its run sat for 10 minutes without a step. The connection test waits at most 180 seconds.
- Changed (TASK-587): Gemini thinks at a set level instead of Google's default: Gemini 3.8 Flash (and other Flash models) low, Gemini 4 Argon (and Pro) medium. Long answers are no longer cut off: Gemini's thinking counts against the answer length, which two Argon answers hit at exactly 4,096 tokens; Gemini models now get at least 32,768 output tokens.
- Internal (TASK-587):
providers/vertex/{stream,generation}.rs.streamGenerateContent?alt=sseon the global, multi-region and regional hosts; chunks map to text deltas, wholefunctionCalls in order (signatures throughPartCollector) and usage from the last chunk;streams_incrementally→ true. First-byte 120 s and idle 90 s (stream::FIRST_BYTE_TIMEOUT,IDLE_TIMEOUT), one re-send while nothing usable went out, thenvertex_timeout: … timed out(TransientNetwork,llm.timeout); while waiting for the first byte the stream reports hidden thinking (Alive { progress: true }).chat()has a 180 s overall limit (CHAT_TIMEOUT).generationConfig.thinkingConfig.thinkingLevelon Gemini 3+ (LOW/MEDIUM; effortXhigh/Max→HIGH,Low→LOW; neverthinkingBudget),maxOutputTokensclamped to 32,768–65,536 on Gemini 2.5+. New wire goldenvertex_gemini.json; the Vertex runner mocks stream SSE.
Legacy cleanup (Milestone 109)
- Changed: the Setup Wizard is one step: connect Claude. Choose Anthropic API (paste the key) or Amazon Bedrock (AWS region and a Bedrock API key); the key is checked and stored in the keychain exactly as in Settings, and Claude Opus 5.5 becomes the default model. The Gemini, OpenAI and Tavily steps, the offline demo and the sample prompts are gone; those providers and the web search keys stay in Settings.
- Changed: the web search keys (Tavily, Brave Search) have their own "Tra cứu web" section in Settings → Models, with the same keys as before.
- Changed: with no projects, the project list shows a simple empty state with Tạo dự án and the starter templates. No demo dialog opens by itself.
- Removed: System-One / TypeSafe AI "Jev": the "Step 3" card in Settings → Models, the composer's Auto button and "Jev" badge, and the routing step before each run. The mode you pick (Research, Plan, Agent) is the mode the run uses. On upgrade the experimental setting and a saved TypeSafe key are deleted once.
- Removed: the AMBA Trial (Gemini 2.5 Flash-Lite, 3 free runs): the "AMBA Trial" model, the trial badge and the "trial limit reached" dialog. On upgrade the trial model is removed; a project, agent or app default that used it falls back to "Theo mặc định" or asks you to pick a model.
- Removed: Import ChatGPT conversations (Settings → Vault & Security). The conversations it imported were never shown anywhere; on upgrade they are deleted with their messages.
- Removed: the demo sandbox projects ("Explore Demo Sandbox" and the welcome dialog). Demo projects you already created stay as ordinary projects.
- Removed: "Lưu vào tri thức" under answers and the Memory page (Settings → Advanced → Memory). What agents should know about a project lives in Những gì agent biết. Notes saved before are kept and still recalled; Memory used (n) and the session reset can remove them. Agents no longer get the
knowledge_store/knowledge_searchtools. - Removed: the read-only Models and Skills pages under Settings → Advanced. Models are managed in Settings → Models.
- Removed: AMBA no longer has a way to run system commands. The
shell_executetool is gone, with the "Thực thi lệnh hệ điều hành (shell)" switch in Create project → Advanced and "Chạy lệnh hệ thống (Terminal)" in Project settings → Permissions & Security. An agent or an old chat that still names the tool gets "tool not available". Projects that had the switch on keep working; the setting is no longer read. The security page says so (4 languages). - Removed: the Marketplace tab in Advanced → Tools (five developer MCP servers). Connecting your own MCP servers under MCP is unchanged, and servers you added from the Marketplace stay.
- Removed: the "Tạo bằng AI" (AI Co-Creation) tab in Agent Studio. It filled a template from keywords without asking a model; start from a template or from scratch in the editor instead.
- Removed: the "Kỹ thuật & Công nghệ" suite (code audit, performance, API refactor) from the chat's playbook menu.
- Removed: the "convert this large document to Markdown first?" question before a run. AMBA now reads large Office and PDF files in pages, so the run starts right away.
- Removed: Zalo from the list of services you can connect in the privacy policy (4 languages); the Zalo connector itself was removed in 0.5.14.
- Internal: one-time upgrade step
runtime/upgrade/m109.rs(ChatGPT imports, the System-One setting and keychain entry, theamba-cloudprovider and profiles; the knowledge tools joinREMOVED_TOOLS, whose rows the seed deletes), idempotent and tested. 13 IPC commands removed (import_chatgpt_conversations,get_systemone_status,set_systemone_experimental,test_systemone_connection,check_trial_quota,provision_demo_sandbox,ingest_knowledge,list_project_ingested_sources,list_memories,upsert_memory,make_memory_global,search_memories,clear_all_memories). Saving a Bedrock provider now adds its Claude in Amazon Bedrock profiles. ADR-049 and ADR-045 are withdrawn. - Internal: the feedback worker no longer serves
/v1/trial/*(404); deploying it needs a separate Founder approval. - Internal: deleted dead code:
runtime/hybrid_engine.rs,ResponseCache(runtime/cache.rs, its storage helpers; theresponse_cachetable goes next release), the live-follow half ofuseRoutineLive(routine history still renders),packages/examples/, the IPClist_marketplace_extensions,detect_conversion_candidateandconvert_project_document, theExecutetool effect andRunIntent.attachments. The launch seed deletes the oldshell_executetool and permission rows;projects.allow_shellstays in the schema, unread.
PDF
- New: AMBA reads hard PDFs by itself (Milestone 107). Tax and public-service forms such as "Giấy nộp tiền vào NSNN", scans, and files with broken fonts now reach the agent as correct text. There is nothing to set up, no button and no per-file question:
- The file's own text first. Filled-in form values (amounts, tax codes, dates, account numbers) are read next to their labels, in reading order. Before, AMBA read only the printed labels of these forms and the agent answered as if they were blank; some of them could not be opened at all. Pages whose text is garbled (a damaged font encoding) are recognised and are not handed to the agent as text.
- Then text recognition on this computer for every page without usable text: a scan, several images, a page drawn as shapes, a font AMBA cannot decode. Vietnamese first, then English. A form whose text lacks its filled-in values gets them from the page image. macOS uses Apple Vision, warmed up quietly after an install so the first scan is not slow. Windows uses its own text recognition when Vietnamese is installed (not yet verified on a Windows machine). Linux has no on-device recognition yet.
- Then AI, only for the pages this computer cannot read (Linux, a missing language pack, a faint scan). Just those pages go to the project's AI model, once: Claude Haiku 5.5 on Anthropic and Amazon Bedrock, the project's own vision model on OpenAI and Azure OpenAI. In a project that masks identifiers, AMBA first asks once, in the chat: "Cho phép AMBA nhờ AI đọc các trang PDF khó trong dự án này?" (Cho phép / Chỉ đọc trên máy). Background work never asks. The answer can be changed under Project settings → Permissions & Security → Cho phép AI đọc trang PDF khó.
- Each page is read once. The result is stored with the project, so opening the file again, other agents and workspace search reuse it and no page is sent twice. When a better way becomes available (the Vietnamese language pack is installed, the owner allows AI reading), pages left unread are read again in the background, a few at a time.
- The agent says what it could not read, for example "trang 3 không đọc được: máy chưa có gói OCR tiếng Việt", instead of guessing values.
- In Nguồn, a PDF's Lịch sử file shows one muted line on how it was read: "Đọc bằng: chữ trong file", "OCR trên máy", "AI (Haiku 5.5)" or "Một số trang chưa đọc được".
- Each page sent to AI is listed under "Data leaving this device" (
vision_ocr: model, file, page count, size, tokens; never content), and its tokens count in the usage view. Privacy policy updated (4 languages).
- Fixed: a damaged PDF that made the page renderer fail no longer shows a crash notice at the next launch.
- Internal: one PDF text engine for all 9 readers (
runtime/pdf_text: Form XObjects, widget appearances, tolerant ToUnicode CMaps, reading order) with a per-page quality verdict (good, partial, garbage, empty).pnpm run eval:pdfcompares it with a reference on local, private PDFs. - Internal: page renderer
runtime/pdf_render(pure-Rusthayro, compiled in, about 2 MB per installer, no native library); tier 2runtime/pdf_ocrbehindOcrEngine(Apple Vision in process throughobjc2-vision,Windows.Media.Ocr, none on Linux), cached per file hash, page, engine, version and dpi. - Internal: tier 3 (ADR-075)
runtime/pdf_transcribe: one-shot request (a sub-PDFdocumentblock for Anthropic / Claude in Amazon Bedrock, PNG parts for OpenAI / Azure), cached as engineai:<model>, never in chat history;refusal/max_tokens→ocr.ai_refused/ocr.ai_truncated; skips reportocr.ai_consent_needed,ocr.ai_local_only,ocr.ai_unavailable. The ledger gainsdetail_json(V046); the egress guard allows page media only inruntime/pdf_transcribe/.pnpm run eval:pdf:aimeasures real tokens per page with the owner's own key (opt-in). - Internal:
pdf_readandfilesystem_readon a PDF report per pageverdict,source(text,ocr:<engine>,text+ocr:<engine>,ai:<model>,none),ocrConfidenceandunreadableReason, plus a plainreadingNotefor the agent; tier 3 runs after both (TASK-541).runtime/pdf_refreshre-reads refreshable cached pages from the scheduler tick (every 15 min, 4 OCR + 4 AI pages per pass, never asks) and re-indexes the file;tools/ocr/warmupmakes one tiny Vision call per app and engine version. IPCsource_pdf_reading.
Amazon Bedrock
- Fixed: Claude Sonnet 5.5 and Claude Haiku 5.5 work on Amazon Bedrock when Bedrock's newer Claude endpoint (Mantle) does not offer them to your account. AMBA now switches by itself to the endpoint the Bedrock playground uses (InvokeModel) and remembers that for the model, so later chats go there directly. Before, these models failed with a wrong "enable model access in the AWS console" message. When InvokeModel also refuses a model, the error now says plainly that access is missing, for which model and region.
- New: the Amazon Bedrock provider form has Cổng gọi Claude (Claude endpoint): Tự động (default: Mantle first, InvokeModel when Mantle does not serve the model), Mantle or InvokeModel.
- Internal (TASK-560): a third Anthropic transport,
bedrock_invoke(bedrock-runtime/model/{inference profile}/invoke-with-response-stream,anthropic_version: bedrock-2023-05-31, betas inanthropic_beta, SigV4 forbedrockor the API key as a bearer token, AWS event stream decoded into the same Claude stream parser); the settingbedrock_claude_endpoint:<provider>, the remembered switchclaude_endpoint_choice:<profile>:<model>per app version; the capability probe, the background self-check and the lab's "Dò tính năng Claude" run on it and show the transport. The data-flow ledger recordsbedrock-runtime.{region}.amazonaws.comonce the switch is remembered.
Experimental
- New: Settings → Advanced → "Show experimental features" (off by default) opens an Experimental lab for trying new features with the keys AMBA already stores, no terminal: Probe Claude features checks which request features each Claude profile (Anthropic API, Amazon Bedrock) accepts, about $0.05 per platform, shows the table with exact errors, applies the result to that profile right away and exports it (Markdown or JSON); Measure the tool set runs the sample office tasks (core 13 or full 32) on the chosen models (Claude, or OpenAI and Gemini as "tier 2" with the recommendation whether to keep them in Agent mode) in temporary projects, only after a cost estimate and your confirmation with a required budget cap, with progress, Stop, a scorecard against a saved baseline, Save as baseline and Export results; New tool set (v2) turns the beta tool set on or off. Probe requests and eval model calls are listed under "Data leaving this device" (
capability_probe,tool_eval; synthetic text only). - New: Measure the tool set can re-run only some scenarios ("Bài chạy": Tất cả / Chỉ các bài lỗi lần trước / Tự chọn). "Failed last time" preselects the scenarios that did not pass, did not finish or ended with a wrap-up in the last run, for the models and tool sets you picked, and shows their names; "Choose" lists the suite's scenarios as checkboxes. The estimate and the budget cap cover only the picked scenarios. The result shows Chạy lại N/13 bài, compares each re-run scenario with the baseline's result for the same scenario, tools and model, and marks suite-wide success-bar lines "n/a (subset run)"; Lưu làm baseline is off for such a run. A merged view (labelled as not a single run) shows the last full run with the re-run scenarios replaced by their newest results; its success bar is measured only where every scenario has a result. The export adds
merged-scorecard.json/.md. - New: Measure the tool set can mix models from several profiles in one run. The single "Hồ sơ" list is gone: the models are grouped by profile, and you tick models in any of them (up to 6), for example
us.anthropic.claude-sonnet-5-5from the Sonnet profile andus.anthropic.claude-haiku-5-5from the Opus profile. Each model runs with its own profile's connection and key; a model ticked under one profile is greyed out under the others. The estimate lists each model with its profile; the cap, the scorecard groups, "Chỉ các bài lỗi lần trước", the merged view and the export work across profiles. A Bedrock profile written with an inference-profile prefix (us.,eu.,global.) now offers the other Claude models with the same prefix instead of the bareanthropic.claude-…ids; a profile whose own model is a bare id keeps them, marked Mã trần with a note that such an id may not be callable on demand. Internal (TASK-574):EvalPlan.targets [{profileId, model}]; the oldprofileId+modelsshape is still read (stored runs, older callers); unknown profile or model refused by name; the job and items carry the profile;lab_get_stateno longer returnspriceModels(profiles carryevalModels). - New: Measure the tool set no longer loses results and is easier to steer on a long run (Settings → Advanced → Experimental):
- Saved after every run. If AMBA closes mid-run, the next time you open the lab that run shows as Bị gián đoạn with its partial scorecard, which you can export.
- Tiếp tục lượt bị dừng: after Dừng, the budget cap or a closed app, continue the same run. Only the tasks without a result run, and the scorecard covers all of them. You can raise the cap for the whole run before continuing.
- Bỏ qua bài này: skips the task that is running. It is listed as skipped in the scorecard, counted neither as a pass nor a fail, and the next task starts.
- Song song: run up to 4 tasks at once (3 by default). The budget cap still holds; when the provider slows AMBA down (429), it waits and runs fewer at once.
- Time limit per task (10 minutes by default): past it the task counts as an error (timeout) and the next one starts. The progress list shows each running task with its elapsed time, marks it chậm after 5 minutes, and puts Bỏ qua bài này next to it.
- Ghép kết quả: build one scorecard from several runs of the same suite, for example a stopped run and a later run of the rest. For each task, tool set and model the newest result counts. The scorecard is labelled as combined, lists the runs it comes from, and exports like the merged view.
- Changed: the Experimental lab is tidier (TASK-585): three tabs, Đo bộ công cụ (one form: models, Bộ kịch bản, Bộ công cụ Cũ / Mới / Cả hai, Bài chạy, Trần chi phí; repetitions, runs at once, time limit and typed prices under Tùy chọn nâng cao; a running sweep's progress card replaces the form), Kết quả (the latest sweep first with success per scenario and the success-bar lines folded, the subset comparison and merged/combined views folded, the recent sweeps with Ghép kết quả; Lưu làm baseline only for a whole-suite run) and Dò tính năng Claude; the last tab is remembered. Long explanations moved behind an info icon, the inputs use the app's form styling, and the leftover "New tool set (v2)" card is gone (the switch is Settings → Advanced → "Bộ công cụ agent"; the "success bar last met" line is now under the results). Internal:
lab_get_statereturnsbarMetinstead oftoolsV2and no longerbundleBytes.
Long agent runs
- Fixed: large spreadsheets no longer stall a run. After the agent wrote or edited a big workbook (50,000 rows, say), the check that compares the report's figures with the workbook, and the check of the figures handed in at the end, could keep AMBA busy at full CPU for hours while the run showed no progress. They now take seconds on such a file. Each of these checks also has a time limit (20 seconds for the figure checks of the files, 30 seconds for the final check) and a size limit (200,000 cells per workbook for the figure comparison): past it the check is skipped with a note in the run's details, never a hang, and Stop ends a check at once.
- Fixed: the agent can save a report built from the files it read. On a project with many source files, writing a report workbook (say 160 rows of a BCTC) was refused again and again with "CHƯA ĐỌC dữ liệu thực từ file nguồn …", each time naming a different file of the project, until the run gave up. AMBA now checks only the files the report comes from (the ones you name and the ones the report mentions), and counts any way the agent read them: one sheet or a range, a page of a CSV or PDF, a table loaded with AMBA's table tools and queried, or a working copy made from the file. A report written with nothing read at all is still stopped once; after that the file is saved with a warning to check the figures, so the run never stalls on it.
- Fixed: a run that could not save its file no longer ends as done. When the agent never manages to write the file it promised, the answer keeps its last real summary, ends with "Chưa lưu được file: …", and the turn shows "Chưa tạo được" with the file name. Before, a one-line progress note replaced the summary and the run reported success with no file.
- Fixed: long tasks no longer stop while the agent writes a big Excel file. While Claude (Anthropic or Amazon Bedrock) wrote a large tool call — an 11 KB
excel_write, say — it sent no visible text for over a minute, and AMBA took the healthy connection for a stalled one: "LLM stream timed out … (connection stalled)", three retries that died the same way, then a failed run. AMBA now counts everything the model sends (tool arguments, hidden reasoning, keep-alive pings) as progress, for Claude, OpenAI-compatible and local servers and Gemini; only 90 seconds with no data at all counts as a stall, and one model turn may run up to 15 minutes. OpenAI, Gemini, Azure, Vertex and Bedrock (Converse) answers are no longer cut off after 2 minutes. - New: "Tiếp tục từ bước N" picks up where the run stopped. AMBA now saves a run after every finished step. When the AI provider or the network fails mid-run, AMBA first waits 30 seconds and tries that step once more by itself; if it still fails, the error card offers one button, Tiếp tục từ bước 13 (the step that failed): the run continues from there with everything it already read and wrote — no step is done twice and no tool runs again. A failure that retrying cannot fix (a refused API key, a wrong setting) still offers Thử lại. Migration V046 adds the column; saved steps are dropped when the run finishes.
- Fixed: a long run that reaches its step limit ends with a real summary. A chat run may now take 60 steps (was 30). When it uses them all, AMBA asks the agent once more, with no tools, for the final answer: what was done, the files written, the key figures and what is still open. Before, the run showed its last progress note ("Bước cuối: thêm sheet ghi chú …") as the answer. If plan steps are left, the answer ends with "Đã dừng ở giới hạn 60 bước …" and a Tiếp tục từ bước N button starts a follow-up turn in the same chat.
- Fixed: a run that got stuck says so instead of ending as done. A run stopped because it kept repeating a failing action, or that ends without an answer of its own, is shown as not finished: what it tried, why it stopped, the last error, and "Nhắn tiếp tục" with a Tiếp tục button. It never shows an earlier answer from the same chat as its own.
- Fixed: formatting an existing workbook works on the first try.
excel_writenow shows the agent every edit op with its exact fields and an example, accepts the shapes agents often guess (set_column_widths,widths,col+width, aformatstring for a number format), reports every wrong op at once with the expected form, and edits the workbook itself instead of a test copy. An agent fixing a call field by field is no longer stopped as "stuck"; the same error repeated still is. - Changed: long runs cost far less. On a run like an accounting close with 43 source files, a large working workbook, six bank statements and several workbook updates, the agent now sends about a quarter of what it sent before (measured on a replay of a real 26-step run: from about 10.3M to 2.5M input tokens), with the same result:
- The agent no longer gets the content of every project file at the start; it gets a short list of the files (kind, size, date, the sheets of a workbook, the pages of a PDF and whether they are scanned) and reads what it needs. Small files you name in your message are still read in up front.
- Large files are read in pieces: a big workbook first shows its outline (sheets, sizes, first rows), then the agent reads one sheet or a cell range; a bank statement CSV shows its header, row count and first rows, and totals or matching go through AMBA's table tools; long PDFs and documents are read page by page.
- A workbook the agent already wrote is updated in place (just the changed cells, sheets, formulas or formats), instead of being written again in full; formulas stay calculated. Repeating the exact same write or read on an unchanged file no longer runs it again.
- New: see how much came from the prompt cache. Under an agent's answer the token count now says, for example, "10.33M tok · 9.6M from cache" ("9.6M từ cache"); Usage shows cache reads and writes in total and per model, and the estimated cost prices cached tokens at the provider's lower cache price instead of the full input price.
- Changed: the progress view stays smooth however long the run. The live turn no longer redraws every finished step and tool row on each streamed word and each clock second; streamed text is drawn once per frame and large tool results are kept out of the live view's bookkeeping.
- Internal (TASK-543): first-turn file manifest (
context/manifest.rs,runner/file_context.rs: ≤ 200 entries / 10 KB, deterministic for prompt caching; named files ≤ 1 MB, at most 4, 12 KB each). Per-call reader captools/read_cap.rs(24 KB,max_bytes2–64 KB) withtruncatedandnext_offset/next_start_line/next_page(pdf_readfrom_page) /next_from/next_slide;excel_readmoved totools/excel_read.rs(outline / rows / range modes, content no longer duplicated).spreadsheet_editopset_range;excel_writereportsoverwrote_existing.runner/repeat_guard.rsanswers identical repeats on unchanged files. Usage keepscacheReadInputTokens/cacheCreationInputTokensin step activities, run usage, resume state, the ledgerdetail_jsonof every model call and the token analytics (storage/db/token_tally.rs, cache-aware pricing); Bedrock Converse and OpenAI cached tokens are parsed. Token benchruntime/execution/tests_token_bench.rs; research notedocs/ARCHITECTURE/context-trimming-research.md(no server-side context editing yet). - Internal (M108 TASK-546): scenario eval of the agent,
pnpm run eval:agent: 30 Vietnamese office scenarios (tests/agent-eval/) through the real runner with deterministic verifiers and per-run metrics (first-try valid tool calls, error results, guard/nudge/salvage triggers, turns, tokens incl. cache, tool-definition bytes, list-price cost); a scripted subset runs in the gate; live sweeps on Bedrock, Anthropic, OpenAI or Gemini use keys from the environment only and stop at--budget-usd.
Sources
- Changed: classify a file from its "Chưa phân loại" label. In a source's history, each unclassified file's "Chưa phân loại" label now opens that file's "File này là loại gì?" question (answering it still classifies every file of the same structure); the separate Phân loại button under the entry is gone. The question popover, and the day popover in the file tree, now always fit the window and scroll, so a long list no longer runs off the screen.
- New: change a file's kind after it was classified. In a source's history, a classified file's kind is now a button: Đổi loại moves it (and every file with the same structure — "Áp dụng cho cả N file cùng cấu trúc") to another kind or a new name, Đổi tên loại này renames the kind for all its files, and Bỏ phân loại sends the files back to "Chưa phân loại" so AMBA asks again. Answering the same structure twice now moves it instead of leaving it in both kinds; a kind left with no files is hidden from the pickers and its name can be reused.
Release tooling
- Internal:
release-all.ymlis the only release workflow (pick one platform to re-release it); the per-platformrelease-*.ymlworkflows, which passed bundles as GitHub workflow artifacts and hit the storage quota, are removed.scripts/release-deploy-local.shruns the R2/D1 distribute and smoke steps on a local machine when a run's builds staged their bundles but Actions cannot start the deploy job.
Website
- Changed: ambadesk.com speaks to SME finance and operations teams in English, Vietnamese, Japanese and Korean: the home page keeps its layout with features that exist today (sources and workspace, scheduled processes, hard PDFs and scans, your choice of model) and the catalog's real agent templates; new About and Security & architecture pages, a site-wide footer, and per-page titles, descriptions, Open Graph image, canonical and language links. Stale claims (agency pitches, "Executive Dossier", "10–25 minutes", "0% error") are gone (TASK-563).
0.5.14 — 2026-10-19
Processes
- Fixed: a file sent today counts as "có file", whatever date its name carries. A report sent today under an old name (a reused template, "Tồn kho LHP 3-10.xlsx" sent on 19/10) was counted for the day in its name, so the process took the "chưa có file" branch and told the owner nothing came. Now any file sent or received today counts for today (files named for today still count, each file once), the agent step gets it, and a "có file hôm nay?" check after a second fetch sees what that fetch brought.
- New: the agent checks the files against earlier data. For each file counted today AMBA records the date in its name, an identical earlier file (same content, e.g. "giống hệt file nhận ngày 15/10") and the previous reports from the same person; a Nhờ agent step working on fetched files gets these facts and is asked to compare the figures and to tell the owner plainly when the data repeats an earlier report or the file name or date looks wrong — it still does the report. Lịch sử chạy shows them on the Lấy file step: each file, "tên ghi ngày 3/10", "giống hệt file nhận ngày 15/10".
- New: a step warning when a file check after a wait still counts files fetched before the wait ("Bước kiểm tra này đếm file lấy trước lúc đợi đến 17:00…"); Nhờ AMBA kiểm tra lại proposes the fix (fetch again right after the wait and count that fetch).
- New: a process remembers what you asked for. A process made with "Tạo bằng một câu" keeps your sentence, every Chỉnh thêm… sentence and every Sửa bằng một câu change you apply later (the last 10) with it, shown at the top of its steps as Yêu cầu ban đầu (the changes folded under "N lần chỉnh thêm"). Nhờ AMBA kiểm tra lại now compares the process with those words, not only its name and steps, and points out a step that goes against or leaves out something you asked for. Processes made by hand or before this update have no Yêu cầu ban đầu and are checked as before. Migration V045 adds the column; nothing else changes on upgrade.
Cleanup (Milestone 106)
- Fixed: the agent can search your project files again.
workspace_searchnow finds text in the project's Markdown, text, CSV, JSON and HTML files and in Word, Excel, PowerPoint and PDF files with a text layer, in Sources and the workspace. AMBA indexes them on this computer (nothing leaves it) in the background when a project opens and whenever its files change; only new or changed files are read again, deleted or renamed files drop out of the results, and.amba/, hidden and build folders and files over 5 MB of text are left out. Before, the search always came back empty. - Removed: the Chốt & Xuất bản (Finalize & Publish) button on the plan card and in the plan file preview, and its confirmation. When the drafts are right, ask the agent in chat for the final version; it writes it to
reports/. Xem kế hoạch and Tạo bản nháp are unchanged. - The sidebar's "Processes on" indicator shows the next scheduled process run again (name and time; a click opens that process), and quitting AMBA from the tray while a process run is in progress asks first, as it does for a chat run.
- Internal: dead frontend code from before processes removed (unused routine, pipeline and connector wrappers, mock handlers, types and components) and duplicate text/format helpers merged; nothing changes on screen.
- Internal: the retired routine runtime (executor, gate, dry runs, routine proposals, 13 routine IPC commands) and the legacy pipeline sync, Telegram fan-out and Zalo connector are removed (21 more unused IPC commands with them); what processes and sources share moved to
runtime/schedule,file_events,arrivals,delivery. Migration V043 renamesroutine_arrivalstoarrivals; watcher settings keys, theprocess_set_flagandpropose_processtools (old names still accepted),process:changedandbackground_status.activeProcessesdrop the routine names. Databases from 0.5.12 still upgrade on their first launch. - Internal: release and CI workflows pinned to Ubuntu 24.04 (Linux builds stay on 22.04) and moved to Node 24 GitHub actions; the agent catalog is published from the bundled
src/assets/catalog/agents.json(nodist-catalog/copy), and the gate fails when the catalog or the site's playbook pages drift fromcatalog/playbooks/; code highlighting loads only the languages it shows. - Internal: oversized source files split into small modules with no behaviour change (filesystem tools, document ops, planning and one module for answer markup cleaners, legacy Office parsers, seeds, model types, the Telegram wire types, the Excel formula tokenizer, the engine tests and the feedback worker's routes); the 800-line file check now also covers the feedback worker.
0.5.13 — 2026-10-18
Claude-first agent protocol (Milestone 105)
- New: give an agent "Tra cứu web". An agent's capabilities are now switches, in the project agent's ⋯ → Cài đặt agent and in Agent Studio on an installed agent, with Tra cứu web (web search and opening pages) first. A switch saves at once and says Áp dụng cho agent này ở mọi dự án dùng nó; the agent's other tools and the clarifying question tool are kept. Where web search is missing because of the agent, one click fixes it: a "Nhờ agent" step that failed with "agent này chưa được bật Tra cứu web" shows Cho agent tra cứu web in Lịch sử chạy, in the step panel and in the agent's conversation, then Thử lại; the builder's Nhờ agent form warns as soon as Cho phép tra cứu internet is on for such an agent, with the same button. A step stopped for a missing search key has a button to Cài đặt → Tài khoản kết nối. In chat, an agent without Tra cứu web (while a search key is set) now says it cannot look things up and that the owner can turn it on in the agent settings, instead of guessing figures or being pushed to call a web tool it does not have. The Chuyên gia Phân tích Tài chính & Kế toán and Chuyên viên Đối soát Tồn kho & Hao hụt templates now include Tra cứu web (exchange rates, gold, commodity and supplier prices); agents already installed from them get it once on update, only if their capabilities were never changed since install.
- New: Nhờ AMBA kiểm tra lại on a saved process. When a step has a warning or an error, or Bật was refused, the process tab offers Nhờ AMBA kiểm tra lại; it is also always in the tab's ⋯ menu. AMBA checks each situation of the process as it is now against what it is for, and answers AMBA thấy quy trình đúng ý, AMBA đề xuất sửa: with the lines that would change (Áp dụng saves it like any step edit and asks for consent first if it lets the process do something new; Bỏ qua keeps it as it is), or one short question to tap. Nothing is saved before Áp dụng. If the model fails, AMBA says why and still shows the warnings and situations. The free Kiểm tra lại next to a Bật error still only re-reads the process.
- New: "Tạo bằng một câu" is a conversation you can keep refining before anything is saved. Under AMBA's proposal, Chỉnh thêm… takes another sentence ("gửi lúc 5h chiều", "khi gửi xong thì nhắn Anh Hùng"): AMBA applies it to the draft — remembering your first sentence and every earlier change — runs the same checks again (Xem diễn biến, the step warnings, AMBA đã tự sửa, questions) and answers with an updated card that lists what changed. Earlier cards fold to one line and open on tap. Tạo quy trình saves the latest draft, off, as before. Until then nothing is saved: closing the screen or its tab leaves no draft behind, and once you have refined it AMBA asks before discarding your work. A change AMBA cannot apply says so and keeps the previous draft with your words still in the box; up to 10 changes per draft.
- New: a process made from a sentence is checked against what you said before you can turn it on. Xem diễn biến shows what it does in each situation — files in at the first fetch, files only before the cutoff, no files all day — as a timeline ("20:00 lấy file từ Nhóm Kế toán → có file → tổng hợp báo cáo → gửi báo cáo cho Chị Lan"), walked without fetching or sending anything, with Không ai được báo on a situation where the report's recipient hears nothing; it is also under the steps of every process. Common mistakes show on the step: a wait and a second fetch outside the "chưa có file" branch ("luôn chạy kể cả khi đã có file"), a "có file" check without Nếu không ("nếu không có file, người nhận không được báo"), a reminder whose time differs from the wait, a fetch nothing uses, and an agent that is not in the project (with Giao cho … to pick one of the project's agents). AMBA then asks the same model once more to compare the situations with your sentence: it fixes what does not match and shows AMBA đã tự sửa: with the changed lines, or asks one tap-question; if that check cannot run, the draft is kept with a note. Bật is refused while an error is left, and with warnings left it asks once (Vẫn bật). "Sửa bằng một câu" goes through the same checks, and "Tạo bằng một câu" now puts the reminder, the wait and the second fetch inside the "no files yet" branch and tells the recipient when no files came.
- Changed: the default model in Cài đặt → Mô hình AI (Bước 2) is now the base for everything, and an explicit choice overrides it: the model picked in an agent's chat, then the project's model, then the default. "Tạo bằng một câu" and routine drafting used the project's model or else the first model in the list and ignored the default; they now follow the same order, as do chats, process steps, step tests and routines. New projects start on Theo mặc định (…) (the project's model is shown in Cài đặt dự án → Chung → Model AI with that option first), so changing the default moves every project left on it. Picking a model in a chat no longer changes the project's model silently: it is saved to that chat's agent (the first "Bot 1" too), and Theo mặc định (…) at the top of the picker removes the agent's own choice. "Tạo bằng một câu" and the builder's "Nhờ agent" step show which model runs and why ("Opus 5.5 (Amazon Bedrock) · mặc định", "· dự án", "· agent"). Projects and agents keep the model they already have; Cho tất cả dự án dùng model mặc định under Bước 2 puts them all back on the default after a confirm that says how many projects and agents change.
- New: Claude in Amazon Bedrock. With an AWS Bedrock provider (Cài đặt → Mô hình AI → AWS Bedrock, a Bedrock API key or an IAM access key), Claude Opus 5.5, Sonnet 5.5 and Haiku 5.5 run through AMBA's Claude adapter on Amazon Bedrock's Messages API, billed to your AWS account: thinking summaries, effort, prompt caching and native tool calls work as with an Anthropic key. Adding models for a Bedrock provider now offers them as "(Claude in Amazon Bedrock)" even when the key cannot list models, and existing Bedrock providers get the three 5.5 models once. A request for a model whose access is not enabled says so and points to Amazon Bedrock → Model access in the AWS console. Older Bedrock Claude ids such as Claude Sonnet 4.5 (
us.anthropic.claude-sonnet-4-5-20250929-v1:0) and non-Claude Bedrock models keep working exactly as before. On Bedrock, AMBA does not use Anthropic's server-side retry of declined requests or strict tool schemas (not offered there). The "Dữ liệu rời khỏi máy này" panel shows these requests going tobedrock-mantle.<region>.api.aws. - New: every agent turn has a Suy nghĩ line above its work: the model's own short summary of how it reasoned (Claude's reasoning summary), folded by default with the time it spent — open it to read it. While the agent works it streams live with a running clock, and short progress notes ("Đang viết phần đề xuất cho từng khoản.") appear under the running step. AMBA never shows raw reasoning; answers saved without a summary show no Suy nghĩ line.
- New: the plan card of a turn is the checklist the agent keeps while it works (with its one-line explanation), ticked step by step; answers saved before this update keep their plan. A turn without a plan lists Các bước đã làm instead — one line per action it actually ran, with its result — drawn lighter than a plan. The agent's own bookkeeping calls (keeping the plan, handing in the result) no longer appear as tool rows or in the tool count.
- New: a process step or routine that hands in its result shows it under the answer as Kết quả with its files as chips; a click opens the file.
- Fixed: when the agent's answer had no text besides its plan markup, the turn said "Task completed." in English. It now says "Đã hoàn thành công việc." (or the English, Japanese or Korean equivalent) in your interface language, and a Telegram delivery uses its localized empty summary instead of English text.
- New: Claude is the reference model family. Claude Opus 5.5 (the default Claude model), Sonnet 5.5, Haiku 5.5 and Fable 5.1 are available in Cài đặt → Mô hình AI (existing databases get them once; the Claude 3.x entries stay but are marked Legacy). With Claude, agents use the provider's native tool calls and thinking: the turn records Claude's reasoning summary as the agent's thinking, long reasoning no longer trips the 90-second stall check, repeated parts of the conversation are served from Anthropic's prompt cache (cheaper and faster on long runs), and a tool call whose input arrives incomplete is answered with an error instead of being run. Chat uses medium reasoning effort and lets Anthropic retry a declined request on its recommended model; processes and routines use high effort and never switch models — a declined request is reported as "Anthropic declined the request (category)". Other providers send exactly what they sent before.
- Changed: agents keep their plan and their reasoning out of the answer. The plan of a multi-step task is recorded by the agent as a checklist (shown with the turn) instead of being written into the reply, so chat answers, Telegram messages, reports, the run list, the owner's conversation under a process and exported conversations show the answer only — including answers saved before this update. Agent instructions were rewritten for current Claude models: shorter, without capitalised commands, and without asking the model to write its reasoning in the text; the rules about Sources, deliverables, Office files, figures and language are unchanged. In Plan mode the agent records the plan and AMBA writes the dated plan file from it, as before.
- New: a process's "Nhờ agent" step and a routine end by handing in their result — the message people receive, the files written and the key figures. AMBA checks that every file it names exists before the step succeeds (otherwise "Agent báo đã tạo file nhưng không có: …"), and the step's summary, files and figures come from it. An agent that forgets is reminded once; if it still does not, its last answer is used as before.
- Fixed: the result of a "Nhờ agent" step no longer carries the model's
<plan>/<thought>markup into messages, reports and the step panel. - New: a process's "Nhờ agent" step can look things up online. Turn on Cho phép tra cứu internet on the step (or describe it in the sentence: "tra giá vàng", "xem tin tức"): the agent then searches the web like in chat, using the search provider set up in Cài đặt — only the search queries leave the computer, as in chat. Turning it on in a running process asks first ("Quy trình sẽ cho agent tra cứu internet — Đồng ý"), the step reads "… (được tra cứu internet)" and AMBA sẽ lists it. Other steps of the process stay offline. Without a search key, or with Internet off for the project, the step stops with "agent chưa tra cứu internet được" and says where to set it up, instead of the agent being refused mid-run.
- Fixed: when the agent wrote its own plan before acting, the first row of its work showed that plan as text ("🎯 Mục tiêu: …"). The plan now appears only in the plan card.
Processes (Milestone 104)
- New: a process schedule can end. In the Lịch step choose Kết thúc: Không kết thúc (as before), Chỉ hôm nay or Đến ngày… with a date. "Every 5 minutes until 22:00, only today" now runs its last repeat at 22:00 and does not start again tomorrow; a daily time until a date runs through that date. After its last run the process turns itself off (Tắt, history kept) and the run history and the next-run card say "Lịch đã kết thúc ngày 16/10"; before that the card says "Lần cuối: 22:00 hôm nay" when the next run is the last one. Turning it back on asks to extend the date or remove it. Runs missed while the app was closed are not made up after the end date. Sentences like "chỉ hôm nay", "hôm nay thôi", "đến hết ngày 20/10" or "until Friday" set the end date too.
- New: a process's "Nhờ agent" step is now a real turn in the agent's session for that process, followed live. Each run (on schedule, Chạy cả quy trình, ▶ on the step, a retry) shows the exact request the agent received under "⏰ <quy trình> · <bước> · <cách chạy> · HH:MM", then the agent's plan, the files it reads and writes and its answer as they happen — the same view as a chat turn — and the session keeps every run. "Xem agent làm việc" on a running step, in the ▶ panel, on a running row of Lịch sử chạy and in the run inspector opens the session at that run; the agent's chip pulses while it works and its chat says "Đang làm: <quy trình> · Xem". A failed run says why in the session ("Agent nói đã tạo bao-cao.xlsx nhưng không có file" with a hint to check the model, or the model error) with Chi tiết, and the step panel and history show the cause ("Agent báo đã tạo file nhưng không có: …") instead of "trợ lý chưa làm xong việc".
- New: when a process's agent step fails because of the AI model (key refused, quota used up, request rejected, model gone, connection lost), the people waiting for the result are told right away on the process's Telegram ("⚠️ Báo cáo cuối ngày hôm nay chưa xong: Google từ chối yêu cầu. AMBA sẽ thử lại lúc 22:30."), and AMBA tries the step again twice, 30 minutes apart, in the same run; when the tries run out they get a closing message. No other model is used: process steps and routines no longer switch to an agent's backup model after a failure (chat still does). A model that is missing or has no key is reported at once and not retried. Lịch sử chạy shows "Lỗi model: … · thử lại lúc 22:30" with Chi tiết, who was told and a link to Cài đặt → Mô hình AI; the next-run card shows "Đang chờ thử lại lúc 22:30 · Huỷ", and a desktop notification appears. Repeats faster than 30 minutes do not wait: the next repeat is the retry.
- Fixed: a process step done by a project agent ran on the project's first model (for example Gemini) instead of the model picked in that agent's chat. The model you pick in an agent's chat is now saved to that agent and used everywhere it works — its chat, its process steps, step tests and routines; the process builder shows it on the "Nhờ agent" step ("Kế toán đối soát · gpt-6-astra (Azure OpenAI)") and the run history shows the model each agent step used. A picked model that can no longer run (deleted, or its API key removed) stops the step with "mô hình … chưa chạy được" instead of switching to another provider. Agents whose model was never picked keep using the project's model until you pick one in their chat once.
- Fixed: agent steps and chats on Google Gemini / Vertex failed with "Invalid JSON payload … Proto field is not repeating" because some tool schemas use JSON Schema type lists; they are now sent as one type (
nullablefor null), and Vertex sanitizes tool schemas like Gemini.
v0.5.13 turns routines into Processes you describe in one sentence (Milestone 100) and gives every project Sources — the files your team sends, kept exactly as sent, classified and shown by day — plus step-by-step testing of a process before it runs for real (Milestone 101). Both changes migrate existing data once, on the first start after the update (see "Upgrading from 0.5.12" below). The Milestone 98 features (end-of-day report, owner assistant on Telegram, reliable Telegram/Drive arrivals, business days of files) and the Milestone 97 project context ship in this release too, now running as processes.
Upgrading from 0.5.12 (runs once, automatically)
- Database schema V024–V041 (arrivals, inbox manifest, memory scope v2, processes and their runs, project sources, process sends, source kinds and usage, file model v2, file states, process test runs, source ingestion history, removed sources, failed-download retries, source layout).
- Routines → processes (Milestone 100): every routine, intake routine and "Data Sources & Sync" binding becomes a process or a file source in one transaction; the bot's Telegram position is kept, so no message is read twice.
- Project files → Sources (Milestone 101), right after step 2 and again when a project is opened: files in
input/move tosources/(arrivals to their source's day, the rest tosources/uploads/keeping sub-folders); every stored path (inbox, arrivals, process specs, messages, facts, revisions, templates) is rewritten in the same transaction;workings/andoutput/stay as ordinary workspace folders. A project whose target holds a different file is left untouched and reported; the move can be re-run and resumes after an interruption. A one-time notice in each project says how many files moved.
Routines are now Processes (Milestone 100)
- Describe a process in one sentence (Project → Quy trình). Each project has a "Quy trình" tab next to its agents. Write how the work runs, the way you would tell a colleague ("2h chiều thu báo cáo từ team kế toán, 3h chưa có thì nhắc, 4h tổng hợp gửi tôi"); AMBA shows it back as your own lines and asks at most three short questions with tap answers (which group "team kế toán" is, how many reports make "đủ"). A missing connection is set up in the same place — pick a group the bot has seen, turn a group into a file source, or connect a new Telegram group. The "AMBA sẽ …" line lists what it will read, who it will message and which files it creates; Bật turns it on, Xem thử runs it once without sending anything. No form, no template gallery; three example sentences show how to start.
- The card is the process. Each card shows the same lines with today's status ("✓ 14:02 đã nhận 4/4", "⏳ chờ 16:00"), the next run and the last result in words, and Chạy ngay · Tạm dừng / Tiếp tục. Change it with a sentence ("dời tổng hợp sang 5h") or tap a line to change its time, days or recipient — "+1 giờ" then Áp dụng moves 18:00 to 19:00 in three clicks; the change is shown as a line diff first. ⋯ holds Lịch sử (each day's run and what each step did), Nâng cao (the process spec, an editor checked like any edit, version history) and Xoá. The owner's Telegram conversation ("Trao đổi với Chị Lan") sits under its card instead of an agent tab.
- Edits apply without a test run when they are safe. Changing the time or days, pausing, removing a recipient or rewording a reminder applies at once. Adding someone the project already sends to on the same bot applies at once; adding a new person first sends them "AMBA sẽ gửi báo cáo cho bạn tại đây: <quy trình>" and applies only when that message arrives. Changing what the report contains, the file sources or what AMBA may do shows the changed lines, offers a preview run (nothing is sent, files go to
workings/.dry-run/) and applies when you press Bật; until then the previous version keeps running. - "Cần xử lý" tells you what to fix, in your language. A process card shows Chưa xong / Đang xem trước / Đang bật / Tạm dừng (by you or from the menu bar) / Cần xử lý, the next run, and the last result ("Đã gửi cho Chị Lan", "Không gửi vì …", "Lỗi: …"). Cần xử lý names one cause with a button that opens the right screen: Google needs sign-in again, the bot is not connected or cannot read the group, a file source failed or its folder is gone, a recipient is not chosen or has no chat yet, the last three runs failed, files are waiting for you to choose their date, or a converted routine needs a look. Every error AMBA reports has wording in English, Vietnamese, Japanese and Korean — no codes or English left in the Vietnamese interface.
- Removed: the routine panel, routine editor, template chips and run monitor, and "Data Sources & Sync". Automations live only in the Quy trình tab; the sidebar shows "Quy trình đang bật: N" and opens it, and the tray menu speaks of processes. Ingestion rules, the daily sync schedule and "Send deliverable" to a channel are gone — file sources and recipients are part of a process. "Hộp file đến" now opens from the file tree: the project's file sources with their health (Đang nhận, Chưa nhận file nào, Cần đăng nhập lại, Bot không đọc được nhóm) and Kiểm tra, then files by business day. Uploading files from the computer stays in the input folder menu. An automation the agent proposes in chat opens in the Quy trình tab with your words, and after the update a one-time note in the tab says what was converted and what could not be.
- Routines are now Processes; existing ones were converted. On the first start after the update, every routine becomes a process with the same schedule, agent, playbook template, recipients and sections: the end-of-day report keeps running at its time, conditional sends ("only when the loss is over the threshold") stay conditional, and an active routine stays on without asking again. The owner assistant on Telegram becomes "Chị Lan có thể hỏi lại / duyệt qua Telegram" of the report it belongs to; it may still only record the decisions its playbook allows (for example approving a bonus). Intake routines (files from a Telegram group or a Drive folder) and the rules of "Data Sources & Sync" become the project's file sources, keeping their position so no file is downloaded twice; files now land in the Inbox (
input/). Chats you sent to become named people and groups of the project. Old routines are kept, read-only, for one release and no longer run; what could not be converted (Zalo, a deterministic routine that sent files) is listed with the reason. Folders on your computer from "Data Sources & Sync" (also outside the project) become file sources too: new files there are copied into the Inbox; files already in the folder are not imported again. - What this means for the features above. The end-of-day report, the owner assistant on Telegram, file arrivals, business days of files (now shown in Nguồn) and running in the tray (Milestone 98) ship in this release as processes: set them up with one sentence in the Quy trình tab instead of "New routine → Start from template", and read "routine" in those notes as "process". The user manual has a new "Processes" page in all four languages, and the end-of-day report guide follows the new flow.
- Add a Google Drive folder or a folder on this computer as a file source. Nguồn ⋯ → Thêm nguồn offers a Telegram group, a Google Drive folder or a folder on this computer. For Drive, sign in to Google right there if needed, open folders by name (My Drive, shared drives, "Shared with me"), choose Lấy cả file đã có to also take the files already there and how many subfolder levels to watch (0–3); nothing to type. A folder on this computer is chosen with the system picker; one outside the project is watched too, its new files copied into Sources (a note says so). The new source shows at once with its status and Kiểm tra. A process sentence that names a Drive folder or a folder ("lấy báo cáo trong thư mục Drive Kế toán") offers the same two choices in its question, so the process is ready without leaving the conversation.
- Import files once from Google Drive — into a Drive source. Open a Google Drive source and click Nhập file một lần… at the top of its tab: pick files by name anywhere in that Google account (Google Docs/Sheets arrive as Office files); they are copied into that source, dated and classified like the files it receives, and its history shows "Nhập một lần: N file" (Milestone 102).
Your files stay as you sent them: Sources (Milestone 101)
- One folder for everything that comes in. Every project now has a
sources/folder ("Nguồn"): files from a Telegram group, a Google Drive folder or a folder on this computer land insources/<source>/<day>/(the business day the file is about, orundated/), and files you add by hand insources/uploads/. Nothing is ever overwritten: a different file with the same name becomes "name (2)", the same file again is kept once. Everything else in the project is your workspace — organise it as you like; new projects no longer getinput/,workings/andoutput/folders. - Agents never change your sources. No agent, process or Office tool can edit, overwrite, rename, move or delete a file in Sources (or AMBA's own
.amba/data), in any mode and whatever is approved; results always go to a new file in the workspace. The app's editor does not edit source files either (you can still delete one). - You can fix a source file — AMBA keeps the old version. If you edit a file in Sources yourself (in Excel or Finder), AMBA notices, keeps the previous version, updates the day's files and marks figures taken from the old version as "needs re-check".
- Existing projects move once, automatically. On the first start (or when a project is opened), files in
input/move into Sources — files that arrived from a group or folder under their source and day, everything else undersources/uploads/with its sub-folders — and everything AMBA remembered about them follows: the Inbox, dates you confirmed, questions asked, facts, edit history, process folders, file mentions in chats and your company templates.workings/andoutput/stay where they are. If a file with the same name but different content is already in Sources, the project is left unchanged and reported instead. - Polish. The studio footer counts files in Sources and in the workspace (it used to say "N in · 0 out"), and the chat's welcome line no longer mentions the old
workings/folder.
Organise your workspace your way; "final" is a mark, not a folder (Milestone 101)
- No more fixed
input/·workings/·output/folders. Agents, playbooks and processes now read your Sources (the files of a day, by source) and write everywhere else as you like. Reports go where you ask; without a folder named they go toreports/(scheduled reports toreports/<YYYY-MM>/). Drafts and working files stay inworkings/. Older projects keep theiroutput/folder as an ordinary folder. - Agents never ask to write into Sources any more. Every agent instruction, playbook, template and tool description now says Sources are read-only and points results at the workspace.
- A file is final when it is delivered or when you say so. Files a process sends to people become final automatically; you can mark or unmark any workspace file as final. "Finalize and export" on drafts publishes them to
reports/and marks them final. Final files lead the list of deliverables agents see. - Deliverables are checked wherever they are written. The check that a run really produced the files it claims (and that they are valid Office/PDF files) now covers every file the run wrote and declared in the workspace, not only
output/. - Process review says "create files in the workspace". Processes may create files anywhere outside Sources and
.amba/; existing processes keep the folders they were approved for and read the migrated Sources without asking again. - Open an earlier version of a source file. A kept version of a Sources file you edited can be opened as a read-only copy.
Sources know what each file is and whether it was used (Milestone 101)
- AMBA learns your kinds of files. Each file that arrives is recognised by its layout (sheet columns and their types, document headings), not by its name: "bao cao.xlsx", "Book1 (3).xlsx" and a sales CSV are all "Doanh thu" once you have named that layout. A new layout is asked about once — in the app and, for Telegram files, to the owner's chat ("File này là loại gì?") with suggested names — never once per file. Photos are "Ảnh" by default. Kinds can be renamed and merged.
- See which report used a file. Every source file now records the process run or agent conversation that read it and the report it produced ("used in <report> at <time>"), from what the run actually read.
- Nguồn replaces the Inbox screen. The file tree has two parts — Nguồn (never changed by agents) and Làm việc (organise freely; delivered or approved files carry Bản cuối, and you can mark or unmark a file as final) — and shows once how many files moved into Sources after the upgrade.
- Each source is an item of the file tree (Milestone 102). Under Nguồn, every source is its own item — "Telegram · Nhóm Kế toán", "Drive · Báo cáo chi nhánh", "Thư mục · Hoá đơn" — with a health dot (green receiving, amber needs a look, red stopped: sign in again, the bot cannot read the group, the folder is gone), its days below it and the files of each day. Files you add yourself are under Bạn tải lên. The separate "Nguồn" tab and its "Xem theo ngày" button are gone.
- Each day says whether the agent did its job, per source. A small badge on each day — computed from that source's files only — shows ✓ (used in a report: which one, when, which run), "N chưa rõ loại" (name the new kind right there), "N cần chọn ngày" (choose the day) or ⚠ (files but no report yet — the process did not run, stopped with a problem, waits for files, needs a sign-in — or a file changed after its report) with the fix one click away. A file of a new kind carries a dot, and a Sources file's own menu shows Lịch sử file: the reports that used it and the older versions AMBA kept.
- Open a source like a file: its ingestion history. Clicking a source opens it as a tab next to your file tabs. Lịch sử nạp file lists every check, newest first, by day: "✓ 3 file mới" with who sent each file, "– không có file mới" (a run of quiet checks is one line: "(17 lần)"), "⚠ bỏ qua 1 file" with the reason (same content as a file already there, over Telegram's 20 MB, an installer, an Office temp file
~$…, a Google file that cannot be downloaded) and "✗ Google cần đăng nhập lại" with Đăng nhập lại (a repeated error is one line: "Lặp lại 12 lần từ 06:00"). Files of a new kind have Phân loại in place. History is kept 90 days. Bạn tải lên opens as a tab too, listing what you added by time. - Setup beside the history, when you want it. The Thiết lập button in the tab shows or hides the source's setup (AMBA remembers your choice; a new source opens with it): Telegram — bot, group by name, who is asked for an unclear date, ask the kind of a new file on Telegram; Drive — the Google account (sign in again right there), the folder by name, take the files already there, subfolders; folder on this computer — its path, take the files already there. Kiểm tra, Tạm dừng / Tiếp tục and Xoá nguồn (the files already received stay; a source a process still reads cannot be removed until that process is paused or changed).
- Add a source from the tree. Nguồn ⋯ has Tải file lên and Thêm nguồn ▸ Telegram · Drive · Thư mục. Thêm nguồn opens a new tab ready to set up; once saved, the source appears in the tree. A Telegram group added as a source is also saved, once, in the project's people & groups, so processes can name it. Loại file (rename or merge kinds) moved to project settings. The cutoff-hour setting for undated files is gone (files arriving before 10:00 count for the previous day; unclear files still ask for their date).
- A source owns its files: remove it with them (Milestone 102). Xoá nguồn now asks "Xoá luôn N file đã nạp từ nguồn này (size)", ticked by default: the files, the earlier versions AMBA kept and their history go, and the dialog says which facts and reports will need a re-check. Untick it to keep the files under "Nguồn đã xoá · <name>", which you can delete later. A source a process still reads is never removed; a file another app keeps open is named and retried on the next start. Files imported once from Drive before this release move into the Drive source of the same Google account when there is exactly one; otherwise they show as "Nhập từ Drive (cũ)" with Chuyển vào nguồn… and Xoá — no part of the Nguồn tree is stuck any more.
Sources are read when you ask: "Lấy file" (Milestone 102)
- No more background reading of sources. AMBA no longer checks Telegram groups, Drive folders or folders on this computer on its own. Press Lấy file at the top of a source's tab (or ⋯ → Lấy file / right-click on the source in the tree) to read it once: a spinner while it runs, then "Đã lấy N file mới" or "Không có file mới", and the history gains a "Lấy file thủ công" entry. ⋯ → Lấy file từ tất cả nguồn on Nguồn reads every active source of the project in turn. Telegram groups on the same bot are read together (one shared position, so no message is skipped); processes that read a source still start when fetched files arrive. A second press while a fetch runs just shows "Đang lấy file…". Scheduled fetching will come later through processes.
- Telegram's 24-hour limit is shown. Telegram keeps a bot's messages only about 24 hours: a Telegram source not fetched for 20 hours shows "Lần lấy gần nhất: N giờ trước — Telegram chỉ giữ tin khoảng 24 giờ" and an amber dot; after 24 hours the dot turns red with "Có thể đã mất tin cũ hơn 24 giờ".
- Paused until fetching is automatic again: AMBA sends no questions on Telegram (a file's date or kind is asked in the app), process conversations with the owner on Telegram and process questions (
ask) do not wait for replies; the process shows them as "Tạm ngừng (cần lấy tin tự động)". Existing processes stay valid.
Build a process step by step, on one screen (Milestone 104)
- A process is a schedule that presses the app's own buttons, in order. Its tab is now one screen: the Lịch row (every day, Mon–Fri or chosen days at a time, or every N minutes / hours), then the steps — Lấy file, Kiểm tra (with Đúng → and Sai → branches), Nhắn tin, Nhờ agent, Gửi file, Đợi đến — each with a one-line summary, its agent and ▶ to run that step alone (test mode, with its result panel; "Gửi thử cho tôi" on steps that send).
- Build by hand, no ids to type. "+" next to Quy trình offers Tạo bằng tay (an empty process with only its Lịch row) or ✨ Tạo bằng một câu. + Thêm bước between steps and at the end of each branch adds a step with sensible defaults and opens its settings on the right: sources to tick, a group or person to message, an agent to ask (with today's files or what an earlier Lấy file brought), recipients and what to send, conditions in words ("Chưa có file của Anh Minh hôm nay", "Lấy được ≥ 3 file từ Nhóm Kế toán", a figure from the agent; và / hoặc). Move a step up or down, or delete it, from the same pane.
- Every change is saved when its field closes and takes effect on the next run — no apply button, no test run needed. On a process that is on, a change that lets it do more (a new source, recipient or agent) asks once, in the pane: "Quy trình sẽ gửi tin cho … — Đồng ý".
- One switch: Bật / Tắt, plus ▶ Chạy cả quy trình (it asks first, because it sends for real). Tạm dừng, the Thiết lập pane and the Các bước/Thiết lập split are gone; the tree's ⋯ is Mở · Chạy cả quy trình · Bật/Tắt · Đổi tên · Xoá. A process created from a sentence now opens in the editor off — review its steps, then Bật.
- Steps from older processes (thu báo cáo, chờ đủ, sắp xếp, hỏi, dừng) keep running and show as Bước nâng cao; edit them with a sentence, or replace them with the new steps.
- New step "Lấy file". A process step fetches the files of the sources you pick (or all of them) exactly like pressing Lấy file, at that moment, and tells the next steps how many files came, from which source and from whom. ▶ on that step fetches for real and says so; a preview fetches nothing.
- Check who has not sent yet. A Kiểm tra (IF) step can ask "chưa có file của Minh hôm nay?" (files fetched earlier that day count too, also by pressing Lấy file yourself) or "có ít nhất 3 file từ Nhóm Kho trong lần lấy này?" about an earlier Lấy file step, with a branch for yes and for no — for example remind the group, wait until 17:50, fetch again.
- Huỷ lần chạy. A run that is waiting (for example until 17:50 because a file is missing) or still running can be cancelled from the process header ("Đang chờ đến 17:50 · Huỷ") or from its row in Lịch sử chạy, after a one-line confirmation. Its remaining steps do not run and the day is free, so ▶ Chạy cả quy trình works again right away (before, a waiting run blocked every other run that day).
- The right person, whatever their Telegram name. "Chưa có file của Anh Minh" now recognises Anh Minh by his Telegram account, so a sender called "Kế toán Minh" on Telegram counts as him and no wrong reminder goes out. The person list of a Kiểm tra step also offers people who have already sent the bot something; picking one adds them to the project's people with their Telegram account. Without a Telegram account (and in processes written from a sentence, which name the person) AMBA matches names, ignoring titles such as anh, chị, em, cô, chú, bác, ông, bà, Mr, Mrs, Ms and a role in brackets ("Anh Minh (Kế toán trưởng)").
- Sentences in the new steps. "Mỗi 5 phút lấy file…", "nếu chưa có file của X thì nhắc…", "lấy file lúc 17h rồi tổng hợp gửi chủ" and "chưa đủ" (fewer than the usual number of files) become the new steps; "chủ", "sếp" and "the owner" mean you.
- Every N minutes or hours. A process can run every 5 minutes up to every 24 hours (aligned to the clock, optionally only on some days). Every scheduled time now runs once: moving today's time to later today runs it again at the new time. While a run is still going, the next times are skipped quietly (one note in the history).
- "Every 5 minutes, until 9" ends on the schedule. Lặp lại in Lịch now has Từ … Đến … and the days: "mỗi 5 phút, từ 07:00 đến 09:00, thứ 2–6" runs 25 times a day (09:00 included) and stops by itself; "… tới 9h thì dừng" in a sentence becomes that window. A repeat now waits only for the previous run: if it is still open the repeat is skipped, but a run left waiting no longer blocks the rest of the day. Đợi đến is greyed in a repeating process, and a Đợi đến or stop step already in one shows a warning on its step (it keeps each run open, and stop ends only that run, not the process).
- Scheduled processes start on time while AMBA is in the background. While a process is on with a schedule, or a run is open, AMBA asks the OS not to slow it down in the background (macOS App Nap, Windows 11 power throttling; the computer may still sleep), and the scheduler now wakes right after each minute instead of on a drifting one-minute timer, so a 12:30 process starts in the 12:30 minute rather than a few minutes late. Windows battery saver, or "Efficiency mode" set for AMBA in Task Manager, still takes precedence. While a time has come and its run is starting, Lần chạy tiếp theo shows "12:30 · đang bắt đầu…" instead of tomorrow's time, and the card and Lịch sử chạy re-read as soon as you come back to the window.
- Lịch sử chạy, compact. On top, Lần chạy tiếp theo says what happens next: "08:30 hôm nay · còn 3 phút" with what it will do, the run in progress ("Đang chờ đến 09:00", Huỷ), or why nothing is coming ("Quy trình đang Tắt", "Hết khung giờ hôm nay — lần tới 07:00 mai"); the same line sits under the header of Các bước. Below, one row per run grouped by day: time, how it started, a status dot and the result in words; skips in a row fold into "Bỏ qua 7 lần (lần trước còn đang chạy)"; a row opens its steps in place; Chỉ lỗi keeps the failures. New runs appear without reloading.
- Lịch sử chạy keeps up by itself, also when you come back to its tab. Switching to another studio tab (an agent, a file, a source) and back now shows the runs that came meanwhile; before, only switching Các bước ↔ Lịch sử chạy did. A run in progress shows a spinner and where it is ("Bước 2/3: Nhắn tin…") on its row and in Lần chạy tiếp theo; its opened row ticks through the steps as they finish; a new run comes in on top with a short highlight. The process tab, its row in the explorer, the tab title and the agents' busy dots change at the same moment. After ▶ Chạy cả quy trình, Lịch sử chạy opens at the new run; in Các bước the run's line has Xem, and the last result opens its run.
- Edit one step at a time. Adding, changing, moving or removing a step (also inside a Kiểm tra branch) is saved at once; a step that lets the process read a new source or message someone new asks for your consent first (a new person gets the test message), and a process that is off just saves it until you turn it on. "+ Thêm quy trình" can start an empty process (every day at 17:00) to build by hand.
Processes fetch their own sources; agents do the steps (Milestone 103)
- Scheduled fetching is back, through processes. When a process runs at its time (or you press Chạy ngay), its first step reads the Telegram groups, Drive folders and folders it collects from — exactly like Lấy file — before counting the day's files, so "14:00 thu báo cáo" sees what the team sent since the last fetch. A process that waits ("15:00 chưa đủ thì nhắc") reads them once more when the wait ends, so nobody is reminded about a file that already arrived. The source's history shows these entries as "Quy trình <tên> lấy file". A preview run, ▶ Thử and a process started by arriving files read nothing on their own; ▶ Thử can read first when you ask it to.
- Each agent has its own conversation for each process. A process step done by an agent runs in that agent's conversation for the process ("Báo cáo cuối ngày · Financial Analyst"), so the agent keeps the context of earlier days; a process from before this update keeps its conversation.
- An agent never does more than the process allows — and never more than the agent itself may do. A process step can use only the agent's own tools, and only within what you agreed to when you turned the process on.
- A leaner studio: agents in the tab bar, processes in the explorer. The project's agents are chips at the start of the tab bar (initials and name, a pulsing dot while one works, + to add one); each chip's ⋯ (or right-click) has Cài đặt agent, Quy trình tham gia and Phiên trước, and beyond five agents the rest sit under Agent ▾. The agent list left the explorer, which now reads Nguồn → Quy trình → Làm việc (each section folds and is remembered). Every process is an item there with its status (on, paused, needs attention, not finished) and a mark while it runs; ⋯ or right-click has Mở · Chạy ngay · Tạm dừng/Tiếp tục · Đổi tên · Xoá.
- Each process opens as a tab, like a source. Các bước shows its lines with today's status and the agent doing each step — click the agent to open its conversation for this process — with ▶ Thử, Lấy file trước khi thử, and editing by one sentence at the bottom; Lịch sử chạy lists the runs and opens what each step did. The Thiết lập pane on the right (hide it with one click; AMBA remembers) has Khi nào chạy, Lấy file từ, Người làm, Gửi cho, "AMBA sẽ…", Bật/Tắt and Xoá quy trình. + next to Quy trình opens a new tab where you write the process in one sentence; the chat's "Tạo quy trình" card opens it with your words, and "Quy trình đang bật" in the sidebar opens the next process and shows it in the explorer. Above an agent's chat, Quy trình tham gia lists its processes. The single "Quy trình" tab and its cards are gone.
- Two agents made from the same base agent are two agents. Creating a second project agent from an agent another one already uses (or switching one to it in its settings) gives it its own copy, named after it: its own steps under Người làm, its own process sessions and its own busy dot. Its copy goes away with its last chat. Agents' process sessions — also those of a deleted process — never appear as extra agents in the tab bar.
- One report per business day. Files that come in after Chạy ngay (or the schedule) has made today's report — including files that run's own fetch brought — no longer start the process again for that day; press Chạy ngay to make it again. A run that failed or was cancelled leaves the day to the next arrival.
- On a narrow window the active agent stays in view in the tab bar.
Choose how a source's files are arranged: "Cách xếp file" (Milestone 102)
- By day, month, year, or the original folders. Each source's setup has Cách xếp file: Theo ngày (as before, the default), Theo tháng (
2026-10), Theo năm (2026), or — for a Drive folder or a folder on this computer — Giữ nguyên thư mục gốc, the same folders as in the source. Files without a known date still go to "Chưa rõ ngày". A file's business date, its kind and the day badges do not change with the arrangement; month and year folders in the tree carry the badge of their days, and with months, years or the original folders the source's tab shows Theo ngày số liệu with each day's badge. - Sắp xếp lại. Changing the arrangement and saving asks whether to Sắp xếp lại ngay the files already there or apply it to new files only; ⋯ → Sắp xếp lại… (on the source in the tree or in its tab) does it any time, after a preview: "Sẽ chuyển N file vào M thư mục". Two files with the same name keep both ("(2)"); facts, reports, file history, mentions in chats and the search index follow the files. An interrupted move finishes on the next start.
- Every subfolder is read. The "Thư mục con" depth option is gone: Drive folders and folders on this computer are read at every level (a folder that links back up is read once). One Lấy file takes at most 5,000 files and says so — press it again for the rest. Database schema V041 drops the old option.
Test a process step by step (Milestone 101)
- Test a process step by step (engine). Each line of a process can be tried on its own — with today's files, another day's, or the result of an earlier step from a real run or an earlier test — with simulated conditions ("15:00 still missing Minh", "a loss today"), from the start up to a line, or again from a failed run. A test sends nothing (it shows the exact message and who would get it), writes only into a test folder, remembers no facts and never counts as a run; "Send me a test" sends one copy, marked "[Thử]", only to your own chat. Tests expire after 7 days.
- ▶ Thử on every process line. On a process card (and on the review while creating one), each line has ▶ Thử: a panel opens under it with what the step took in (the day, its files with their kind, who is missing), what it produced (counts, figures, the report file — opens in the preview), what it would send (the exact Telegram message and attachments, to whom; nothing is sent) and any error with its fix. Pick the data (Hôm nay, a day that has files, or the previous step's result so a later line is tried without re-collecting), Giả lập a condition (someone missing, a loss — the bonus section follows —, the time), Chạy tới đây to try every line up to one, and Gửi thử cho tôi to get one [Thử] copy on your own Telegram. In Lịch sử, a run's line shows what it took in, produced, sent or failed on, with Thử lại bước này.
- Tests can never touch your Sources either. A step test follows the same rule as a real run: an agent's attempt to write into Sources or AMBA's own project data is refused with the same message as in a real run, so a test never passes where the real run would be refused.
Talk to the agent on Telegram (Milestone 98)
- Paused in this release (Milestone 102): replies to the bot on Telegram are not answered for now, because files and messages are read only when you press Lấy file. Ask the agent inside AMBA instead (the agent chip on a process's "Nhờ agent" step opens its session). The items below describe the feature as it will work again.
- The owner can reply to the report and get an answer in the same chat. A new routine template, "Owner assistant on Telegram" (Senior Financial Analyst & Controller), answers every text message the owner sends to the bot — "sao hôm nay chi phí cao?" — in that chat, in Vietnamese and in a few lines, from the project's files, the history workbook and the latest report, with figures read by tools; when a file or a day is missing it says so instead of guessing. Messages from other chats, from bots and replies to the "File … thuộc ngày nào?" question never start it; messages sent while it is answering are answered together, in order.
- Decisions are remembered with the owner's words. "duyệt phương án 2", "ok 1,5 triệu" or "không thưởng" is recorded as a decision with the exact message (shown in "What the agent knows" as "<name> on Telegram: “…”"), the amount is written into "Bonus approved" of that day's row in the history workbook, and the agent confirms in one line.
- The thread lives in AMBA. Each Telegram chat gets its own conversation in the project, "Telegram — <name>", so follow-up questions keep the context and you can read the exchange on the PC; messages from Telegram are marked "From Telegram · <name>".
- Set the owner chat once. The report and the assistant share the owner's chat: whichever you add second starts with the chat already filled. Once the assistant is active, the 18:00 report ends with one line telling the owner they can reply. Any Telegram trigger can also be switched to "Answer every message in this chat" in the routine editor.
Routines: end-of-day business report (Milestone 98)
- New routine template "End-of-day business report" for agents installed from the Senior Financial Analyst & Controller playbook (New routine → Start from template). Every day at 18:00 (Asia/Ho_Chi_Minh) or on Run now it reads the day's sales and cost files from
input/YYYY-MM/DD/, computes revenue, costs, gross and net profit (by branch and product when the files have them) with queries and workbook formulas, compares with the previous day and the 7-day average, writesoutput/YYYY-MM/YYYY-MM-DD_Bao_cao_kinh_doanh.xlsxand a short PDF report, and sends both to the owner's Telegram chat. You only answer which chat receives it; dry run it before activating. - A history of every business day. The routine keeps one row per day in
workings/lich_su_kinh_doanh.xlsx(revenue, costs, profit, staff hours and cost when available, bonus proposed, bonus approved). Running the same day again replaces that day's row and its own report files instead of failing or adding a duplicate; it still cannot overwrite any other file. - Bonus advice, not a decision. On a profitable day the report adds 2–3 bonus options with their cost, share of profit, effect on the staff cost share and a split by hours, shift or role, explained from the history and with caveats. The owner decides; "bonus approved" stays empty until then.
Routines: the owner's Telegram report reads well and is checked (Milestone 98)
- Clean messages on the phone. The routine summary arrives on Telegram formatted — bold headings, bullet lists, links — instead of raw
**and|characters. Small tables are aligned with numbers on the right; wide tables become one line per row. Long reports are split into several messages without breaking the formatting, and if Telegram ever refuses the formatting the message is sent again as plain text. - The right files, with a proper caption. The report attaches exactly the files the run created (the workbook and its PDF), not files picked by name, with a caption such as "📊 Báo cáo kinh doanh ngày 11/10/2026". Files over Telegram's 50 MB limit and anything beyond 6 files are listed in the run instead of failing silently.
- Wrong numbers are never sent. Before sending, the summary's figures are compared with the run's Excel file. If a figure contradicts it (for example a thousand times too large), the owner receives a short warning instead of the wrong text, and the run shows why under "Delivery notes".
- Bonus options only when there are some. The end-of-day report's bonus part reaches the owner only on days the agent actually proposed options, and the report must state revenue and net profit as key figures.
Each file finds its business day (Milestone 98)
- AMBA works out which day a file belongs to. Files arrive late, misnamed, with several days in one sheet or as revised copies. AMBA now reads the date column and title inside the file, the file name ("0710", "7.10", "ngay7"), the message sent with it ("hôm qua") and when it arrived (before 10:00 counts as the previous day), and files every file in
input/under its business day with how sure it is. Nothing is guessed by the AI. - The end-of-day report uses the right files. The report routine asks for "the files of day D" instead of a folder: it uses only that day's rows of a multi-day file, ignores duplicates and older versions of a re-sent report, and lists the files whose day is unclear under "Cần xác nhận" instead of counting them.
- Asked once, answered on Telegram. When a file's day cannot be told (a photo without a caption, say), AMBA asks once in the owner's chat "File … thuộc ngày nào?". Replying to that message with a date ("07/10", "hôm qua") files it and AMBA confirms; the reply does not start the routine. The question can go to the group instead or be turned off in the trigger.
- See and correct it in the app. In the routine panel, "Inbound files by business day" lists every file by day with its confidence, why AMBA chose that day, duplicates and older versions; "Set date" fixes a file's day or marks it as not tied to a day (a staff list), and you can change the 10:00 cut-off.
Telegram files arrive reliably (Milestone 98)
- Files with the same name no longer overwrite each other. When the accountant sends "doanh thu.xlsx" twice in one day, the second version is kept as "doanh thu (2).xlsx". Sending exactly the same file again is recognised and not saved twice (and does not start the routine again). File names are cleaned so they always work on Windows (characters such as
:or?, names likeCON, very long names and paths), and Vietnamese names keep their accents. - Files over 20 MB are reported instead of silently missing. Telegram bots cannot download files above 20 MB; AMBA no longer tries, and the routine's run in the chat lists such files — together with duplicates, renamed files and failed downloads — under "Received files to check".
- The chat picker keeps your groups. The trigger editor still lists the accounting group and the owner's chat after the routine has started receiving messages.
- A bot used by a routine is no longer emptied by the old sync. "Data Sources & Sync" no longer syncs a Telegram bot that a routine receives files from (it shows "Managed in Routines"), so the two never take messages from each other.
Google Drive is ready for daily files (Milestone 98)
- Sign in with Google works on Windows and in release builds. The browser opens correctly on Windows (the sign-in address was cut off before), AMBA uses PKCE and listens only on your own computer (
127.0.0.1) during sign-in, and you have 5 minutes to finish. When sign-in fails, AMBA says why in your language: the account is not on the app's test-user list, a company administrator blocks the app, the build has no valid Google setup, and so on. - No silent stop after a week. When Google stops accepting the saved sign-in (after 7 days while the app is in Google's testing phase, or when access is removed), the account shows "Needs sign-in", Connected Accounts shows a banner with "Sign in again", and the routine's next run says that Drive files are not being received. Signing in again with the same account resumes the same routines. A refreshed sign-in is reused while AMBA runs, so AMBA no longer asks Google for a new one on every check.
- Google Sheets, Docs and Slides arrive as Excel, Word and PowerPoint files (
.xlsx,.docx,.pptx) instead of files without an extension (Docs were PDF before in "Data Sources & Sync"). Shortcuts are followed to their file; broken shortcuts and Google Forms are listed under "Received files to check". - New trigger options: "Include files already in the folder" saves the files already there once when you set up the routine (off by default: only new files), and "Subfolders" also watches up to 3 levels of subfolders. Folders with many files are read completely.
- Drive files get their business day too: the subfolder name ("Tháng 10/07-10") and when the file was put in Drive count as evidence; confirm unclear files in the Inbox dialog.
Routines keep running when you close the window (Milestone 98)
- AMBA stays in the tray while routines are active. Closing the window no longer stops the 18:00 report or the Telegram/Drive arrivals: AMBA keeps running in the notification area (menu bar on macOS) and says so the first time. The tray menu opens AMBA, shows how many routines are active, pauses or resumes them all, and quits — asking first when a run is in progress. Turn it off in Settings → General → "Background & routines".
- The computer stays awake for scheduled runs. From 2 minutes before a scheduled routine until its run ends, Windows and macOS do not go to sleep on their own (the screen may still turn off). AMBA cannot wake a computer that is already asleep or switched off; a missed run still catches up within 24 hours. Not yet available on Linux.
- Start AMBA when you sign in. A new setting starts AMBA hidden in the tray when you sign in, so routines survive a restart. The end-of-day report guide recommends turning it on.
- See that routines are armed. The sidebar shows "Routines active: N" with the next scheduled run; click it to open that routine's panel. Opening AMBA a second time brings the running window to the front instead of starting another copy.
Project context v2 (Milestone 97)
Removed: the auto-generated Living Blueprint. The "Living Blueprint" chip in the project chat and the
workings/PROJECT_DECLARATION.mdfile AMBA rewrote after every run are gone: the file was guessed from keywords, kept repeating old assumptions and overwrote your edits. Agents no longer read it, so answers rely on your project files and instructions instead. Projects created before keep the file inworkings/; you can delete it.Memory no longer keeps copies of your conversations. Earlier versions saved every question and full answer (figures and names included) into memory after each run. Now nothing is saved automatically: memory holds only notes you save with "Save to knowledge" (or an agent saves with its knowledge tool) and searchable excerpts of documents a connector delivers. On the first start after the update, conversations saved by earlier versions are exported once to
~/.amba/exports/memory-<date>/(one file per project, API keys and card numbers removed) and then removed from memory; a notice offers "Open export folder".Memory stays inside its project. An agent sees only its own notes in this project, notes shared with the project, project documents, and knowledge you saved outside any project — never another project's memory, and never another agent's private notes. "Clear memory" in the session reset clears only this agent's memory in this project. Notes are cleaned of API keys and card numbers before they are saved, and long notes are split into parts of at most 4 KB.
See which notes an answer used. An answer that recalled saved notes shows "Memory used (n)": open it to see each note with its kind (note or document excerpt) and remove one that is wrong or outdated. A link next to it opens "What the agent knows", so the two sources stay clear: project context = facts from your files, memory = notes you saved. Nothing is shown when no note was used.
"Save to knowledge" asks who may use the note: all agents of this project (default) or only the agent that answered.
A clearer Memory screen. Filter by project (or knowledge for all projects) and by agent; search uses the same filters. Each note shows a readable title instead of an internal key, whether it is a note or a document excerpt, who can use it, where it came from and who created it; the key is only in the details. Edit or delete a note, or "Mark as global knowledge" so every agent in every project can use it (document excerpts stay in their project). "Clear" removes exactly what the filters show — this agent in this project, the whole project, or everything — after you confirm. The "New note" and "Clear" buttons, missing from the screen before, are back.
Agents know your project — and say when they are not sure. Every agent run now starts with a short, sourced picture of the project that AMBA builds from your files: which sheets and columns each workbook has, its date range and totals row, document headings, business dates of inbound files, your currency and number format. Figures an agent checked in a file are remembered with their source (file, sheet and cell; the cell is read to confirm the value), and rules you state in chat ("our fiscal year starts in April", "always VND, no decimals") are remembered with your words. When a file changes, the figures taken from it are marked "needs re-check" and the agent reads the file again instead of reusing an old number; anything not known is read from the files or asked, never guessed. See it in the project header → "What the agent knows", where you can also remove a wrong entry. It is stored in the project folder (
.amba/context.json), so it moves with the project. The "Project Mission & Context" field of an agent's settings is replaced by it; existing text was moved in automatically.
Fixed (Milestone 102)
- No file is skipped when it lands during "Lấy file". A file saved into a source folder on this computer while a fetch was running (even in the same millisecond) was never fetched afterwards; it is now fetched on the next press, and files already taken — including AMBA's own copies — are still never taken twice. A Google Drive file changed in the same millisecond the source was added is no longer mistaken for an old file on the first fetch.
- A file that failed to download is tried again. When a Telegram, Google Drive or computer-folder file could not be downloaded during "Lấy file" (network drop, timeout, Telegram or Google briefly failing, a file locked by another program), it was recorded as failed and never fetched again. AMBA now keeps it on a retry list: the history shows "Không tải được N file — sẽ thử lại khi Lấy file", every later "Lấy file" tries it first, and a later success shows "Tải lại được N file" and is filed under its original day (from the message or Drive time). After 5 failed retries the file is given up with its name and a "Thử lại" button. Files skipped on purpose (duplicates, too large, unsupported, Office temp files) are still never retried.
Fixed (Milestone 99)
- Telegram sources say why no file arrives, and recover without a restart. A bot connected before 0.5.12 could stop delivering files with only "Temporary error, will retry": its token is kept in an older keychain entry, and when macOS denied the first read AMBA treated the token as missing until the app restarted. The source tab and its setup pane now name the real cause with its fix — Allow keychain access (retries the read once; choose Always Allow), Enter the bot token again (missing or revoked token), Turn off webhook (after a confirmation), another program reading the bot, Telegram refusing the bot — and only a short network or Telegram outage reads "Temporary error". Check, opening the group picker or saving the bot again retries a denied keychain read once; background polls never ask again. The group picker fetches the bot's groups live and explains an empty list; the bot selector lists every bot by username and says which one the source uses (switching bots reads the group again from the start).
- Sources update while files arrive. Files that reached a Telegram group, a Drive folder or a folder on this computer in the background did not show until you switched windows or tabs: the open source tab's history, the Nguồn tree (new day folders and files, health dots, day badges), the file tree and the counters stayed as they were. They now update within a moment of each change — a new entry appears at the top of the history without losing the pages you loaded or your place in the list, a quiet check only updates its "(N lần)" line, and a source that starts receiving again turns green. Kinds learned in the background, dates confirmed by Telegram replies and processes that read a source refresh the same way; coming back to the window re-reads once as a fallback.
- macOS no longer keeps asking for keychain access. AMBA reads its single keychain entry once per launch and now writes it only when a key or sign-in really changes: Google Drive's hourly sign-in refresh stays in memory instead of being saved back (each save could raise up to three "AMBA wants to use your confidential information" prompts), saving an unchanged key does nothing, and keys already moved from older versions are not deleted again on every save. Choose Always Allow once; Settings help explains which entry ("amba") it is. For developers: a stable local signing identity (
AMBA_DEV_SIGN_IDENTITY, seedocs/ARCHITECTURE/platforms.md) keeps Always Allow acrosstauri devrebuilds. - Connected accounts: adding an account and signing in to Google again work cleanly. The add/edit dialog was blurred by a leftover backdrop layer; the provider tabs no longer wrap and spill over; "Save" stays disabled until there is something to save (a token, a folder or a Google sign-in) instead of creating an empty account; after signing in with Google, "Save" updates the account the sign-in created instead of adding a second "Google Drive" entry without a sign-in; the "signed in with old permissions" warning no longer appears right after a fresh sign-in; account status shows in your language ("Đang hoạt động", "Cần đăng nhập lại", "Lỗi kết nối") and the Telegram setup steps are no longer numbered twice.
- The macOS keychain prompt names AMBA's entry clearly. The access prompt now says "AMBA – saved API keys and connections" instead of "amba", and Keychain Access shows the comment "Used by AMBA to keep your AI provider keys and connected accounts on this Mac." Existing entries are renamed the next time a key or sign-in is saved; AMBA does not write to the keychain just to rename it.
Fixed (Milestone 98)
- Dates in Excel files are read on the right day. Date cells of
.xlsx/.xlsfiles were read one day early (07/10/2026 showed as 06/10/2026) when the agent loaded or read a workbook; they now match what Excel shows. - Vietnamese amounts in CSV files are summed correctly. Amounts like
1.234.000,25.000,1.234.000 ₫,1,234,000.50or(1.234)were loaded as text (or25.000as 25), so totals were wrong. Each column's decimal mark is now detected and the amounts become numbers; a cell that is not an amount (for example "chưa có") stays as text and is listed so the agent reports it instead of counting it as zero. - A missed evening routine reports the right day. When the app was closed at a schedule's time and the run caught up the next morning, it used the next day's date for its input folder, output folder and files. It now uses the date of the missed run and tells the agent which business date it works on.
- Appending the first row under a frozen header works. Adding rows to a sheet that had only its frozen header row was refused by the workbook check because the frozen pane moved; the pane now stays put.
Processes core (Milestone 100, internal)
- One canonical spec for automations, validated in Rust (TASK-481, ADR-071).
src-tauri/src/runtime/process/: serde types foramba.process/v1, a single validator that returns coded issues{code, path, params}(refs resolved in execution order, the 6 v1 actions with typedwith, limits of 30 steps / depth 3 / waits ≤ 48 h, wait timeline, people and sources only asperson:/group:/source:references), the effective policy (effects + sources + paths + recipients) with widening detection for renewed consent and a projection onto the existing unattended policy, and storage in new tablesprocesses/process_versions(migration V029; versions immutable, consent recorded once). Schema ↔ validator parity tests run every published example and 27 negative fixtures against both. Nothing runs processes yet (TASK-482/483). - Durable process runs (TASK-482, ADR-071 §4).
runtime/process/{engine,exec,resolve,clock,inputs,converse,action,run_model,run_store}.rs+ migration V030 (process_runs,process_stepsjournal). A run has a business date (process timezone), its trigger (schedulewith the routine catch-up rule,manual,inputsArrived,fileEvent), a state (queued/running/waiting/succeeded/failed/cancelled/skipped), the step it is on, a durable wait (waitUntil,waitForuntil inputs are complete or the deadline, retry backoff, waiting action) and alateflag. The interpreter replays the journal on every drive: decided branches are kept, succeeded steps — and their external effects — are never repeated, a non-idempotent action found running after a restart fails withprocess.interrupted, retries keep one idempotency key per(process, run, step). One run per process per business date, at mostmaxOpenRuns(default 2) open. Runs move on the shared 60 s scheduler tick (also feeding keep-awake); hookson_inputs_arrived(sources),on_file_event,wake_run, theActionHandlerrun/resume contract (TASK-483) and theconverseentry point. IPCprocess_run_now,process_runs_list,process_run_get. No action is attached yet, so a run reaching an action fails withprocess.action_unavailable(TASK-483). - File sources and the people & groups directory (TASK-484, ADR-071, contract §5).
src-tauri/src/runtime/sources/+ migration V031 (project_sources,project_people;routine_arrivalsgainssource_id,routine_idbecomes nullable). A project source (Telegram group, Drive folder, project folder) is an arrival watcher on the existing code path — the Telegram poll (onegetUpdatesand one offset per bot for routine triggers and sources together; a source also keeps the legacy "Data Sources & Sync" off the bot), the Drive listing (seen-set and baseline on the source row) and thefile_eventwatcher (project folders) — so there is still no second poller. Its files land ininput/and the Inbox with the source id and the sender id; processes reading the source are told per business date (RoutineHooks::inputs_arrived→ TASK-482). A group upgraded to a supergroup is followed automatically (directory + sources). The directory holdsperson:/group:entries with their Telegram bindings and roles (owner receives the "which day is this file" question), detected from chats the bots have seen and senders of arrived files.runtime/process/directory.rsresolves references: unknownperson:/group:/source:→process.ref_unknownat its path, resolved recipients → unattendeddeliverTo(unreachable ones stay out). "Đủ chưa" for a process input is computed from the Inbox (explicitexpect, or count/senders learned from the last 14 days; duplicates, superseded and low-confidence files never count) and plugs into the executor asInboxInputs. Source health is derived (receiving,no_files_yet,needs_sign_in,bot_cannot_read,group_migrated,poll_failed, …) andsources_testchecks the bot can read the group (getMe/getChat/getChatMember, privacy mode) and waits for a test message. IPCsources_*,directory_*. No UI yet (TASK-488); routine channel triggers keep working side by side until TASK-487 migrates them. - Process actions (TASK-483, ADR-071 §3).
src-tauri/src/runtime/process/actions/attaches the six v1 building blocks at app start, on the existing primitives:collect(the business day's counted files, count and missing names from the Inbox),organize(manifest re-sync; ask-once date questions to the input'sbusinessDate.askTo),remind(Telegram HTML to a directory person/group),agent-task(the agent engine through the run settle point, unattended under the consented policy; playbook template directive, the day's files and the flags later steps read in the input; outputs summary, files, key figures, flags),deliver(the routine delivery: HTML with flag-gated sections, numeric guard — a wrong figure is replaced by an alert and fails the step —, the run's workbook with caption, "reply" line when the person can converse) andask(question with choices, durable wait, reply recorded by the poller, decision fact).stop.notifysends throughremind; theconversehandler answers like the owner assistant (chat conversation, grounded directive, decisions as facts with the person's words). Every recipient must be in the directory and in the consented policy (fails closed); every message is sent at most once per step and recipient (newprocess_sendsledger, migration V032) and recorded in the data-flow ledger. Coded errorsprocess.action.*. Not routed yet: Telegram messages toconverse(TASK-487). - Processes read as the owner's own lines (TASK-485, ADR-071 §1, contract §3–§4).
runtime/process/render/: a deterministic, pure renderer (validated spec + directory names + locale → structured lines{key, kind, depth, when, text, parts[], steps[]}; phrases for every action, condition, trigger and status in en/vi/ja/ko compiled fromrender/locales/*.json). Waits fold into the time column ("14:00 mỗi ngày", "Khi đủ", "Luôn"),waitFor+if chưa đủ → nhắcbecomes one "Nếu chưa đủ → nhắn nhắc …" line, an agent task and the delivery of its result share a line, conditions and days are words ("thứ 2–6", "ngày 1, 15 hằng tháng"), a stepname(the owner's phrasing) wins over the generic phrase, and anything unresolved shows a placeholder ("(chưa chọn người nhận)"), never an id. Also the "AMBA sẽ: …" consent line from the effective policy (reads, messages, sends, created/overwritten files, remembered decisions), widening phrases ("thêm người nhận: Anh Hùng"), edit diffs ("Tổng hợp báo cáo → gửi Chị Lan: 16:00 → 17:00", added/removed lines, changed reminder wording) and the card overlay from a run journal ("✓ 14:02 đã nhận 4/4", "⚠ chưa đủ, đã nhắc lúc 15:00", "⏳ chờ 16:00", "✗ lỗi: …" with the code kept for the UI). IPCprocess_render,process_render_diff,process_render_card(invalid specs return their coded issues); TS wrappers inservices/api/processRender.ts. 23 golden cases × 4 locales, plus a test that vi/en output never contains code words or raw references. No UI yet (TASK-488). - A process from one sentence (TASK-486, ADR-071 §1, contract §3).
runtime/process/compile/: the owner writes "2h chiều hằng ngày thu gom báo cáo từ team kế toán, 3h chưa có thì nhắc, đủ thì tổ chức file gọn gàng, 4h chiều tổng hợp báo cáo"; the project's model (any provider, masked and recorded in the data-flow ledger) proposes anamba.process/v1spec from a prompt built in Rust (spec shape, the action catalog generated from the registry, the project's people/groups/sources by name, agents and templates, learned "đủ", Vietnamese and English examples). The validator's coded issues get one automatic repair round; whatever is still unknown becomes at most three tap-questions, never a guess ("Team kế toán là nhóm nào?" with the directory's groups and "Kết nối nhóm Telegram mới", "Gửi báo cáo cho ai?", "Thường có mấy báo cáo mỗi ngày?" only when it cannot be learned, "4h là sáng hay chiều?" only without any am/pm cue). Answers apply without another model call; the review lines come from the deterministic renderer and reuse the owner's verbs ("Tổ chức file gọn gàng"). Edits are sentences too ("dời tổng hợp sang 5h", "thêm gửi cho anh Hùng", "thứ 7 không cần") and return the line diff with what the change newly allows. Nothing is saved or activated by the compiler. IPCprocess_compile,process_compile_answer,process_compile_edit; TS wrappers inservices/api/processCompile.ts. Eval settests/process-eval/(31 Vietnamese + 5 English sentences from restaurants, shops, accounting, HR and an agency; 7 ambiguous ones must ask) checked incargo testwith an oracle model and against a real model withpnpm run eval:process. No UI yet (TASK-488). - Migration and cut-over (TASK-487, ADR-071 §6).
runtime/process/migrate/runs at app start after the schema migrations: one snapshot (routines with lifecycle, pipeline bindings, directory, sources, discovered chats, cursor settings) → a plan (routine → spec: triggers →on, agent mode →amba/agent-taskwith the routine's agent, template and write globs, deliveries →amba/deliverper destination withwhen.onOutputFlag→if: {output}, quorum reminder →if incomplete → amba/remind+waitUntil; intake routines and inbound bindings → sources with Drive seen-set/baseline and Telegram offset carried; outbound bindings and recipients → directory entries named from the chat cache; owner assistant →converseof the matching report with the playbook'scanDecide) → every spec validated and ref-checked → one transaction (processes + consented versions, sources, people, settings,process_migration_reportV033, cut-over flag). Idempotent; dry run via IPCprocess_migration_preview, stored reportprocess_migration_report. After the cut-over no routine executes (scheduler, catch-up, quorum reminders, arrivals, file triggers, manual/dry runs; routine edits answerroutine.retired) and migrated legacy bindings are not synced (pipeline.migrated_to_source). Telegram messages from aconverseparty reachProcessEngine::converseon the one poll per bot; ask replies are recorded whenever the bot is polled; processon.fileEventfolders are watched (process:<id>). New run originprocess {processId, runId, stepKey, canDecide};project_fact_recordrefuses a decision outsideconverse.canDecide(process.converse.decision_not_allowed);routine_set_flagkeeps its name for process flags. Catalog playbooks gainprocessTemplates(validated bybuild-agent-catalog.mjsand the Rust validator);routineTemplatesstay readable for one release.amba/deliver@v1gains optionalincludeWorkings; an agent task's instruction may be up to 20 000 characters. - Status view, code catalog and risk tiers (TASK-489, ADR-071, contract §4/§6/§7).
runtime/process/status/derives per process{state, view, pausedBy, nextRun, lastResult, attention {code, params, fix {action, target}}, pendingVersion, previewRunId}(never stored; attention priority: connection → source health → unresolved people/sources → 3 failed runs / error → Inbox dates → migration notes).runtime/process/lifecycle/saves edits through the D1 tiers (applied | needs_test_message | needs_consent | needs_preview), stores consent-needing edits as a pending version, sends the test message to a new recipient through the remind path (data-flow ledger) and runs previews through the real engine in dry-run mode (trigger.occurrence = preview; waits pass, nothing sent —wouldSendrecorded —, agent writes sandboxed underworkings/.dry-run/; previews never block or count as runs). IPCprocess_status,process_create,process_get,process_save_version,process_consent,process_set_paused,process_delete,process_preview_run,process_versions_list; TSservices/api/processStatus.ts. One catalogsrc/locales/codes/{en,vi,ja,ko}.json(221 codes) read by Rust (runtime/codes, used by the card's failed-step line and the test message) and the UI (utils/formatCode.ts); a Rust test scans the sources and fails on any emitted code without a phrase in all four locales. Inbound local-folder bindings left unmigrated by TASK-487 are migrated again aslocal_foldersources (absolute folders watched from their parent, files copied into the Inbox). - Acceptance against the automation contract §11 (TASK-490).
tests/usability/process-founder-sentence.spec.tsreplays the Founder's sentence in the real Project Studio over the mock-app IPC and counts what the owner does (1 field + 2 tap-answers, 5 taps to an active process; from zero accounts the inline Telegram setup adds only the token paste; a time change in 3 clicks without a preview run; Drive sign-in expiry → "Cần xử lý: Google cần đăng nhập lại" within one 30 s poll and the fix signs in again; a vi DOM scan of every process screen for English, code words, raw codes and references), so regressions fail the gate. Mock:expireDriveSignIn(). Visual baselines re-recorded for the screens M100 changed outside the process scenarios (tab strip, wording). Site manual: new Processes page ×4, connector and playbook pages moved off routines and "Data Sources & Sync". - Coded errors keep their params over IPC (TASK-493, ADR-071).
AppError::Coded {code, params}crosses Tauri IPC as{code, params, message}(every other error is still the plain message string), soformatErrorfills placeholders: "Chạy ngay" over the open-run limit reads "Đang có quá nhiều lượt chạy dở (tối đa 2)", and a card's Bật whose test message fails names the recipient. Process, source, directory, migration cut-over, compiler and lifecycle errors use it (process.not_foundandsource.not_foundreplace "not found: process …" strings);process.max_open_runsandprocess.compile.sentence_too_longgained{max}. Keychain and Google sign-in codes staycode: detailstrings (they reach many generic message sites);credentialErrors.tsreads both shapes.
Demo kit (Milestone 98, internal: docs/demo)
- docs/demo: synthetic demo dataset
demo/daily-owner-report/(fictional coffee shop, 2 branches, 14 days of chaotic Telegram/Drive files, staff list, history workbook, answer key, deterministic generator with--endfor the demo day), end-to-end regression testtests_demo_e2e(mock Telegram, Drive and model: arrival → business dates 43/43 → 18:00 report with bonus advisory, loss-day catch-up without it, owner question and decision), Founder runbook and Windows rehearsal checklist indocs/DEMO/; the outdated accounting Telegram SOP (SOP-OPS-062) is retired. Visual harness: Inbox dialog, "What the agent knows", the owner's Telegram tab and the background settings card added; baselines re-recorded. - The end-of-day report and the owner assistant can load the day's files every day. From the second run on, loading a sales or cost file was refused because the loader's working database (
workings/.analytics.db) already existed; both templates now allow AMBA to update that database (only it, besides their own files).
Build hygiene (Milestone 99, internal: developer builds only)
- Smaller
src-tauri/target, fewertauri devrebuilds. The library is built asrlibonly (no 870 MB staticlib / cdylib), the integration tests are one binary (src-tauri/tests/it/, test names<module>::<test>), dependencies are built without debug info in the dev/test profiles,src-tauri/.taurignorestopstauri devfrom rebuilding when tests, docs or run-time files change, andpnpm run clean:buildfrees incremental caches and our own crate's artifacts while keeping compiled dependencies (scripts/README.md). No change to the app or the release bundles.
0.5.12 — 2026-10-11
Security (Milestone 96)
- Research and Plan modes can no longer change your files. In these read-only modes the agent could still edit workbooks, decks and Word documents in place or run an Office script, because the guard only knew the older file-writing tools. Every tool now declares whether it reads or writes, and the read-only modes refuse anything that writes, runs commands or calls a connected MCP tool — before asking you for permission. Previewing a deck or Word edit without saving it still works; Plan mode can still save its plan.
Privacy (Milestone 96)
- Scanned files and images are read on your computer, and pictures never go to the AI provider. We checked every path: text in scanned PDFs and images is recognised on the device (Apple Vision on macOS), and only that text can reach the model, where identifier masking applies to it. An unused code path that could have sent page images to a cloud model has been removed, and a test now fails if one is added without a per-project consent gate. The privacy policy (English, Vietnamese, Japanese, Korean) now says that files reach the AI provider as text only, and that on Windows and Linux a scanned page without a text layer is reported as unreadable.
Fixed (Milestone 96)
- macOS no longer asks for keychain access over and over. AMBA read the keychain every time it needed a key, and each key was a separate keychain entry, so one chat could show "AMBA wants to use your confidential information" several times. AMBA now keeps all its keys in a single keychain entry, reads it at most once while it runs, and no longer reads any key at launch; keys saved by earlier versions move into that entry the first time they are used (the old entries are removed only after the move is confirmed). Choose Always Allow to stop the prompt for good. Windows and Linux keep working as before.
Office: decks that fit their slides (Milestone 96)
- New decks no longer run off the slide. When AMBA writes a deck in a dense company template, text that does not fit a slide is shrunk the way PowerPoint's own "shrink text on overflow" does (never below 70 % or 10 pt). It is shrunk only if the template allows it. Otherwise it continues on the next slide with the same layout, titled "(1/2)", "(2/2)". Before, bullets could spill past the bottom edge on most slides of such a template.
- AMBA checks the layout of every deck and Word document it delivers. It looks for text overflowing its box or the slide, text hidden under another shape or picture, text smaller than 10 pt, and pictures, tables or long unbroken values wider than the Word page. The check runs on your computer and nothing is sent anywhere. Problems are recorded as warnings with the run's deliverables, and a playbook can make them block delivery until fixed. The agent sees the same estimate when it reads a deck or document, so it can fix a slide before handing it over. Only problems the run itself added are reported, never what was already in your file or template.
Office: PowerPoint decks and templates edited in place (Milestone 90)
- AMBA can now edit your own PowerPoint decks and fill your company template instead of rebuilding them. Give it a deck (.pptx) or a template (.potx) and it changes only what you asked: replace text while keeping each word's formatting (even when PowerPoint split it into pieces), add slides from the template's own layouts, duplicate, delete or reorder slides, fill and extend tables, update chart numbers together with the chart's built-in Excel data, turn on chart data labels, add pictures and speaker notes. Masters, layouts, theme and every slide you did not mention stay exactly as they were; a template saved as .pptx becomes a normal presentation. Placeholders left empty on new slides are removed, so no "Click to add text" is left behind.
- Every deck edit is checked before it is saved. If anything outside the requested change would differ, a chart's numbers would not match its data, or a deleted slide would leave pieces behind, nothing is written and the agent is told why. Overwriting an existing deck keeps the previous version for rollback, and the agent can preview an edit without writing it.
- New decks are built on a real template — yours if you set one. In project settings (General) you can choose your company's PowerPoint template (.potx or a .pptx used as one); it is kept in the project's
input/templates/folder (a file chosen elsewhere is copied there) and nothing leaves your computer. Every new deck AMBA creates then uses that template's layouts, theme, fonts and footers; without one, AMBA uses its own neutral 16:9 template with proper slide masters and layouts instead of the old hand-made slides. Outlines can now have nested bullets, tables, pictures, code blocks, speaker notes and section slides next to titles, bullets and KPI cards, and Vietnamese, Japanese and Korean text uses suitable fonts. Starting a deck from a customer's sample deck removes its sample slides (or keeps the ones you name) and leaves the original file untouched.
Office: Word documents and templates edited in place (Milestone 90)
- AMBA can now edit your own Word documents and fill your company's Word templates instead of rebuilding them. Give it a contract, report or form (.docx) or a template (.dotx) and it changes only what you asked: fill fields and replace text while keeping each word's formatting (even when Word split it into pieces or it sits next to a link), set the text of bookmarks and content controls, insert paragraphs and lists in the document's own styles (it refuses styles the document does not have), replace one section or the whole body of a template, fill tables and add rows formatted like their neighbours, delete rows, and set headers and footers with page numbers. Styles, numbering, sections, comments and every other paragraph stay exactly as they were; a new table of contents is marked to update when Word opens the file. Vietnamese, Japanese and Korean text are handled like any other.
- Edits can be tracked changes for review. With tracked changes on, every edit appears in Word as a revision by "AMBA" (deleted text struck through, new text underlined, new and deleted rows and paragraphs, style changes), so your team can accept or reject each one; accepting all gives exactly the requested document. The check before saving also verifies that, and nothing outside the requested change may differ — otherwise nothing is written and the agent is told why. Overwriting an existing document keeps the previous version for rollback.
- New Word documents are built on a real template — yours if you set one. In project settings (General) you can now also choose your company's Word template (.dotx or a .docx used as one), kept in the project's
input/templates/folder like the deck template. Every new Word file AMBA writes then uses that template's styles, lists, fonts, page setup, headers and footers, without copying its sample text; without one, AMBA uses its own neutral A4 template (proper headings, lists, quotes, code, captions, tables and a page-number footer) instead of the old hand-made file. Documents can now have nested and numbered lists, code blocks, pictures, links, strikethrough and a table of contents that updates when Word opens the file. When filling a template, the yellow highlighting that marks its fields can be removed from the filled-in text.
Office: decks and Word files are checked before the run finishes; better previews (Milestone 90)
- Decks and Word documents with template leftovers are sent back to the agent. A finished deck or Word file is read back before the run completes: leftover template text ("Click to add title", "[Company Name]", "[Fill in …]", "Lorem ipsum"), sample slides kept from the template the deck was built from, empty placeholders on a slide or Word fields still showing their placeholder, styles the document does not have, and broken or left-behind parts make the agent fix the file in place; if it does not, the run fails and names the problem. Problems your own file already had before the run are not blamed on it. A playbook can add its own prompt texts, ignore some, or turn individual checks into warnings.
- Decks can no longer contradict the workbook. The workbook number check now also reads PowerPoint decks — slide text, KPI cards, tables, speaker notes and the numbers behind native charts — and the tables of Word documents. A deck whose chart says 95,238,095 clicks when the plan has 95,238 is sent back for correction like a Markdown proposal.
- Slide and Word previews look like the file. The slide preview now fills the preview pane in the slide's real shape (16:9, 4:3, 16:10 …), shows the slide list only when the pane is wide enough, and places text boxes, KPI cards, pictures and tables where the layout puts them (instead of stacking them at default positions), with the layout's and master's background, accent shapes, logos and font sizes. The Word preview no longer shows a grey band above the page, and at 100 % the page fits the pane width; page size, margins, headers and footers come from the document.
Office playbooks: pitch decks, Word briefs and contract fills in your templates (Milestone 90)
- The media pitch is now a PowerPoint deck in your agency's template. The Media Planning & Agency Pitch template builds
Media_Pitch_Deck.pptxon the company deck template from project settings (or a client template you name ininput/), with native PowerPoint charts and tables whose numbers come from the media plan workbook; the deck is checked against the workbook and for template leftovers. The Markdown proposal is now optional, written only when you ask for it. - The executive brief is a Word document in your company Word template. The Executive Chief of Staff template writes
Executive_Master_Briefing.docxin your template's own styles, opening with the key figures taken from the financial model, and checks the brief and the strategy deck against the workbook. The Senior Financial Analyst playbook can now write Word briefs too, and the Executive Strategy Consultant can read workbooks so deck charts use their numbers. - Fill NDAs, SOWs and service contracts from your own template. The Document Analysis & Contract Review template (and the Lead Business Author playbook) fills only the fields of a contract template — names, addresses, dates, amounts — from your message and the files in
input/, asks you for anything it cannot find instead of guessing, never changes a clause, and writes every filled field as a tracked change by "AMBA" so you can accept or reject it in Word. A contract that still has a blank such as[Company Name],[Date],[●]or[Tên công ty]is sent back before the run finishes, and the answer ends with a table of each filled field, its value and where it came from. - New manual pages (English, Vietnamese, Japanese, Korean): the pitch deck in your template, the executive brief in your Word template, and contract fill with tracked-changes review in Word.
0.5.11 — 2026-10-10
Deliverable accuracy (Milestone 95)
- Every answer now lists the files it actually wrote. Below the answer, a "Files written" list shows each file the run created or updated (output files first) with its size, an "auto" badge for PDFs made automatically from Markdown, and a note when a file is not mentioned in the answer; click a file to open it. Files the answer mentions but this run did not write are listed too, next to the existing "Not produced" note. The list comes from what is on disk, not from the agent's wording, and stays after reopening the conversation.
- Key figures above the files. The Inventory Reconciliation and Financial Analyst playbooks now ask the agent for the headline numbers of the result (for example total loss, shrinkage %, items over the threshold); they appear as "Key figures" above the file list. A figure that points at a file is only accepted if that file was written in the run.
- Reconciliation pairs rows deterministically and can no longer report invented matches. The reconciliation tool now pairs each row with at most one row on the other side — by exact ID, normalized ID (case, separators, leading zeros), an ID found in the other side's reference text, or amount within tolerance and date within a window — and keeps the full result (matched pairs with the rule used, discrepancies, every unmatched row on both sides, unreadable values) instead of a 20-row sample. Amounts are read the way they are written (
1.234.000 ₫,1,234,000,(1,234),VND 12,500); a value that cannot be read is reported, never counted as 0. The Invoice Reconciliation template and the Financial Analyst playbook export these tables into the report, and a report whose "Matched" rows do not exist in the source files, do not carry the source amounts, or do not add up to the engine's count now fails with the exact rows named. Spreadsheet loading no longer turns a decimal comma such as1,5into 15. - Proposals and briefings must use the workbook's numbers. When a run writes both a workbook and a Markdown/Word narrative, every significant number in the narrative (money, percentages, counts such as clicks or impressions, Vietnamese and English formats like
95.238 lượt click,1,2 tỷ,95.2M) is checked against the workbook's calculated values. A number that is off by a factor of 1,000 or more (for example clicks quoted as "95,238,095" when the plan has 95,238) or that contradicts a reported key figure sends the agent back to fix the document, and the run fails if it does not; other numbers not found in the workbook are listed as warnings only. Years, dates, phone numbers, versions and page numbers are ignored. The Media Planning playbook now reads its workbook back before writing the proposal, totals each metric separately, and a total that adds different metrics (impressions + clicks) is rejected. - PDFs with emoji stay small and render the same on every computer. A short report with emoji could become an 11 MB PDF because the emoji pulled in the system colour-emoji font. PDFs now use only the fonts bundled with AMBA (Noto Sans regular and bold, plus Fira Mono for code) for Vietnamese and Latin text, and system fonts only for Japanese, Korean, Chinese, Arabic, Thai and Devanagari; colour-emoji fonts are never embedded. Common status emoji become text (✅ → √, ❌ → ×, ⚠️ → (!), 📈 → ↗, 🟢 → ●, 🇻🇳 → VN) and other emoji are left out. Lines in paragraphs, code blocks and table cells no longer overlap or drift apart, bold text is always bold Noto Sans, and Vietnamese characters in code keep their accents.
pdf.generatereports the file size and a warning when a short document produces an unexpectedly large PDF. - F&B template reports the ratio your brief defines. When the brief defines a labour cost ratio (for example company-wide wages ÷ revenue for the period), the F&B Operations template now computes exactly that ratio, puts it in the workbook and reports it as the headline key figure, with per-store ratios as a breakdown; a run that reports only per-store ratios is asked again. The template no longer applies built-in benchmark ranges (such as "25–35%") that could contradict your own targets, and the labour workbook and operations briefing are now required deliverables. A request that names
output/files is no longer treated as a draft just because it says "draft the memo".
Robustness (Milestone 95)
- Projects whose folder was deleted or moved are marked instead of shown as normal. The project list used to keep every project AMBA ever registered, even after its folder was gone. A project whose folder no longer exists now shows "Folder missing" on its card (and when you open it) with two choices: Locate folder… to point AMBA at the folder you moved (it must contain
input/,output/orworkings/), or Remove from list, which asks first and only removes the project from AMBA — no files are deleted. - AMBA tells you when it closed unexpectedly. If the app is closed by a crash that leaves no error record (for example inside the system web view on Linux), the next launch says "AMBA closed unexpectedly last time" and, with your crash-report setting on Ask, offers to send a minimal report through the existing consent dialog: app version, operating system and time only. With Always send it is sent automatically; with Never nothing is sent. Running AMBA twice at the same time does not trigger it.
- Pasting an API key cleans it. Spaces, line breaks and invisible characters in a pasted key are removed in the key field; a key with unusual characters (smart quotes, look-alike letters) shows a warning to copy it again.
- Linux: typing with Vietnamese or CJK input methods no longer drops characters. Project, agent and file name fields (and the descriptions and rename prompts) no longer lose characters while ibus or fcitx is composing, and Enter that confirms an input-method candidate no longer submits the form. Dropdowns on Linux are drawn by AMBA so the chosen value stays readable, and the model selector in the new-project dialog always shows a real model when the saved default no longer exists.
UI (Milestone 93)
- The whole app speaks your language, with local number and date formats. About 450 labels, buttons, tooltips, placeholders and messages that were still in English (command palette, History, Usage, Memory, Models, Skills, Settings → Models provider cards and messages, Diagnostics self-test, update prompt, spreadsheet pager, slide previews, file menu, permission prompt, data sources) are now translated in English, Vietnamese, Japanese and Korean, and Vietnamese labels use sentence case. Dates and times, counts, costs, file sizes and durations follow your language (for example "6,70 US$" and "1,5 KB" in Vietnamese); costs show two decimals instead of four. Release notes in the update prompt are shown as formatted text. Finished tool steps no longer read "Searching…"/"Đang…", routine runs show "Sent" in your language, a routine proposal shows "(not set)" instead of "?", the Telegram bot name no longer shows "@@", and the data sources overview lists the channels you actually connected.
- Agent Studio, Tools & MCP and the project studio are translated too. The agent library and editor, the MCP server form, server list, tool registry and tool permissions, the studio status bar ("Ready", files in/out), the file filter, tab and tree tooltips, the drop-files hint and the live run status (waiting for permission or your answer, rate-limit retries, repeated-action recovery) now follow your language. The new-project dialog shows template names, badges and the starting description in your language. Tool policies show as Allow / Confirm / Deny in your language, and agent cards no longer show the instruction length twice.
- Safer permission prompts. When an agent asks to use a tool that needs your approval, the prompt is now a proper dialog: Esc means Deny, keyboard focus stays inside it, and it appears above any window you have open (for example Settings) and returns you there afterwards. Requests that would delete, move or rename files, overwrite an existing file outside
workings/andoutput/, or write outside the project folder are marked with a warning and start on Deny; the prompt shows the tool, the file paths and the policy's reason, with a button to copy the details. Several requests at once are shown one after another in order, and prompts from a run that has ended or was cancelled disappear. - Command palette (⌘K / Ctrl+K) behaves like the other dialogs. Keyboard focus stays inside it while it is open and returns to where you were when it closes; Esc or a click outside closes it; the highlighted result is clearly marked and stays in view while you move with the arrow keys, and screen readers announce the highlighted result. It no longer opens on top of another open dialog (close that one first), so it cannot hide or interfere with unsaved work there.
0.5.10 — 2026-10-10 — Hotfix: credentials and honest results
Upgrade notes
- Please re-enter API keys and connector credentials you saved after updating to 0.5.9. 0.5.9 reported them as saved but did not keep them across restarts. Keys saved in 0.5.8 or earlier are moved into your system keychain automatically on first launch.
- Linux: saving keys now requires a running system keychain (GNOME Keyring, KWallet ≥ 5.97 or KeePassXC). Without one, AMBA shows a clear error instead of pretending to save. Settings → System Diagnostics shows the keychain status.
- Includes the UI integrity work from Milestone 93 (consistent dialogs, restored hover states and tints, 12px minimum text, offline icons).
Security / Fixed (Milestone 94)
- API keys and credentials are now actually stored in the OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service). In 0.5.9, keys saved after updating were lost on restart — please re-enter them. Keys saved before 0.5.9 are migrated automatically.
- Saving a key now fails with a clear message instead of showing "saved" when the keychain did not keep it. On Linux without a running keyring (GNOME Keyring or KWallet), saving shows "No system keychain is available" — AMBA never falls back to storing keys unencrypted.
- Pasted keys are trimmed; keys containing line breaks, invisible or non-ASCII characters are rejected with a hint to paste again.
- Settings → Diagnostics shows which keychain is in use and whether it is available.
- Runs no longer report files that were not produced. If the agent says it created files that are not on disk and cannot fix it (including when the model service fails during the fix-up attempt), the run now ends as failed and the chat shows "Not produced: …" with the missing files, also after reopening the conversation. Requests that only mention a draft (e.g. "review the draft budget in input/") no longer switch into draft mode, and draft runs say that their files were saved in
workings/drafts/. - Clearer error when a folder is given instead of a file. Loading data, reading files or inspecting workbooks with a folder (or an empty path) now fails right away with a message listing the files in
input/to choose from, instead of "Unsupported file format". - PDFs are refreshed when their Markdown changes. A rewritten Markdown deliverable in
output/now gets a new PDF instead of keeping the outdated one.
Docs, site and packaging (Milestone 94)
- The website and manual now describe how keys are really stored. Every page (4 languages) says keys live only in the OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service: GNOME Keyring, KWallet 5.97+ or KeePassXC), that there is no plaintext or database fallback, that Linux without a running keyring cannot save keys (and what to install), and that keys saved after updating to 0.5.9 must be entered again. The old claim of an "encrypted SQLite fallback" is gone.
- More accurate claims. "Zero Math Hallucinations" became "Computed, Not Guessed": calculations run in deterministic tools and you should still review the numbers. The playbook pages no longer state a wrong number of built-in playbooks (there are seven).
- New Release Notes page on the website (nav and footer, all languages), generated from this changelog at every site build.
/playbooksnow redirects to the playbook library, and the old/download/<os>links (which pointed to 0.4.5 files that no longer exist) go to the download section. - Linux packages: the
.debnow depends onlibdbus-1-3and recommendsgnome-keyring | kwalletmanager(the.rpmrequiresdbus-libsand recommendsgnome-keyring), drops a duplicate WebKitGTK entry, and AMBA appears under Office/Productivity in application menus. The install guide usessudo apt install ./AMBA_*_amd64.deband no longer listslibssl3. - Download page shows only current files. The release manifest no longer keeps installers from older versions (0.4.x installers and a 0.5.4
.rpmwere still listed); the new.rpmis mapped correctly.
UI (Milestone 93)
- Readable, theme-consistent text and colours everywhere. No text is smaller than 12px any more (badges, counters, footers and helper text were 9–11px in places). Status colours (success, warning, error, info) now come from the app theme, so they read well in both light and dark mode instead of fixed colours that were too faint on white or too bright on dark; filled badges and buttons with white text have enough contrast. Code blocks, diagrams and document viewers that ignored the light theme now follow it. Leftover styles from an older UI kit were removed, so buttons, badges and form fields look like the rest of the app.
- Hover states, selected states and soft tints are back. Many buttons, list rows, badges, cards and dividers were designed with semi-transparent theme colours that never took effect, so hover feedback was missing, selected items were not highlighted, and some dividers showed as bright lines in the dark theme. They now render as designed in both light and dark themes. The file filter box in the project explorer is no longer white in the dark theme.
- Consistent dialogs and in-app confirmations. Project Configuration, Delete project, New project, the welcome sandbox, Help & Guide, Clean up session and the trial-limit dialog now behave like every other dialog: Esc closes them (or goes Back), keyboard focus stays inside, and only one dialog is shown at a time — Delete project has a Back button to Project Configuration. Every "Are you sure?" question, error message and the new-file name prompt is now an in-app dialog in your language and theme instead of a plain system pop-up; deleting asks with a red button and starts on Cancel. Backup and restore in Settings use the normal save/open file pickers instead of asking you to type a path. The Settings row in the sidebar and the collapsed-sidebar expand button work with the keyboard and screen readers; the crash-report dialog shows a readable time and starts on Send; the routine run history keeps its filters on one row; the data-flow table fits inside Project Configuration.
- Quick setup is reachable with the sidebar collapsed. The collapsed sidebar (narrow windows, or after collapsing it) now has a Setup Wizard icon next to Help and Feedback, so the setup wizard no longer requires expanding the sidebar first.
0.5.9 — 2026-10-09 — Milestones 76–92
First release since 0.5.6 (0.5.7 was tagged but never distributed).
Upgrade notes
- Keychain prompt on first launch (macOS): API keys and connector credentials previously stored as plaintext in the local database are moved into the OS keychain and removed from the database; macOS may ask once for keychain access. Correction (0.5.10): this did not work in 0.5.9 — keys saved after updating to 0.5.9 were lost on restart and older keys stayed in the database. Fixed in 0.5.10; see its notes.
- Backups no longer contain credentials: restoring a backup on another machine requires re-entering keys.
- Routines: existing routines are migrated automatically and keep their permissions; "weekdays" schedules no longer fire on weekends; new or edited routines need a successful dry run before activation.
- Overwrites: agents now ask before overwriting existing files outside
workings/andoutput/; unattended routines are denied such overwrites unless the path is allowed in the routine policy. - HTML previews render statically (scripts disabled); open externally for interactive pages.
- Crash reports are sent only with your consent (Settings → Security).
- Installer is ~10 MB larger (bundled offline Office sandbox and icons).
UI (Milestone 93)
- Fixed: icons are visible again in the installed app, and they work offline. Icons were downloaded from a third-party icon server each time the app started; the app's security policy blocks that, so the installed app showed no icons. All icons now ship inside the app and nothing is fetched from a third-party server to draw the interface.
Chat (Milestone 88)
- File mentions in chat now only ever point inside the project folder. When you write
@fileor@folder/, the app (not the chat window) finds the matching project files, and a mention that resolves outside the project folder or to a missing file is ignored. Project instructions, automatic mode selection (TypeSafe AI Jev) and the large-document conversion check also moved into the app runtime; how chat looks and behaves is otherwise unchanged. One visible difference: after a reload, a message sent after converting a document also shows the "converted to Markdown" note. - Stop now works while the agent is waiting for you. Stopping a run while it is asking for permission or asking you a question now ends the run right away. Before, the run stayed open until the prompt was answered, or kept working on the remaining steps of that turn.
- Agents remember earlier conversations again. Memories saved after a run are now found in later runs. Before, a project that uses a catalog agent saved its memories under that agent but searched under the default assistant, so it never found them. New chats started inside a project are now also linked to that project from their first message, so project search, project-scoped memory and the project file refresh after a run work in the first conversation too.
- Repeated questions get a fresh answer. A run no longer replays an AI reply that was saved from an earlier run with identical wording (this could happen with low-creativity model profiles such as "Coding & Architecture").
- More reliable deliverable retries. When the app asks the agent to redo a missing deliverable, the files it reads or writes in that retry now show in the timeline and in the changed-files list. A second retry also no longer fails at the AI provider because of an unanswered tool step.
- Chat follows running agents live instead of checking every few seconds. Sending a prompt returns immediately and the answer, tool steps, errors and Stop all update from the agent's own progress messages. Reopening a chat or switching back to an agent while it is still working picks the run up where it is, and a run that finished while you were away is shown as finished instead of "working". The final answer now keeps its saved message id right away, so "Save to project knowledge" works on it without reloading the chat.
- Agents now only use the tools you gave them. Every agent can still read the files in your project (open, search and list files, read PDFs and spreadsheets), ask you a question and read the clock. Writing files, creating Office documents, accounting, web search and system tools now need the matching capability pack or an explicit tool on the agent. Before, almost every agent got all of these whatever its configuration. Example: an agent built only with "Executive Presentations" reads your project files and builds decks, but cannot write other files until you add "Document Authoring". Project settings still apply on top (internet, MCP, shell). Connected MCP tools stay available to every agent in projects that allow MCP. Older agents with no tools or packs configured keep access to every tool. Changing an agent's packs in Agent Studio no longer removes tools it had outside those packs.
Routines (Milestone 91)
- Routines are now stored in the app database and run one at a time. Existing routines (and the old hidden daily project schedule) are moved over automatically on first launch and keep their schedule, Telegram/Google Drive inbound and outbound settings. "Weekdays" routines now really skip Saturday and Sunday. If a routine is triggered while it is already running, one extra run waits and starts right after; further triggers join that waiting run instead of running in parallel. Pressing Run Now no longer cancels that day's scheduled run. A scheduled run that is still missing required files is recorded as skipped. After three failed scheduled runs in a row a routine stops (error state) until you resume it.
- Routines can now start when files or messages arrive, and catch up after the app was closed. A routine can watch a project folder (for example
input/, with a filter such as*.xlsx): once new or changed files stop arriving for 30 seconds (adjustable), it runs once for the whole batch and works on exactly those files; a minimum number of files can be required. Files the routine writes itself never start it again, and files dropped while the app was closed are picked up on the next launch. A routine can also start when a matching Telegram message or file arrives in a chosen chat (filter by sender, text, attachment or file name), or when a new file appears in a Google Drive folder: the files are saved toinput/first, then the run starts. If the app was closed when a scheduled routine should have run, it runs once when you reopen the app within 24 hours; older missed runs are listed as skipped ("missed while app closed"). Schedules can use a time zone (UTC, an offset such as+07:00, or zones such asAsia/Ho_Chi_Minh); the default is the computer's time zone. The run block shows what started the run (schedule, file names, message). Zalo cannot start routines yet (the app explains this when saving). - Routines now stay inside the limits you set when nobody is watching. Each routine has a policy of what it may do on its own: which folders it may read and write, whether it may replace existing files (or only specific ones, such as
output/media_plan.xlsx), whether it may use the web or specific MCP tools, and where it may send results. The app enforces it on every run and lists anything it refused in the run's result; anything that would normally ask for your confirmation is refused. Before an existing Office file is replaced, a revision is kept so it can be rolled back. A new routine must pass a dry run before it can be switched on: the dry run works on your real current files but writes only intoworkings/.dry-run/, sends nothing, and shows what it would have sent (destination, size, a preview). Editing a running routine keeps the current version running until you run the new version dry and confirm it. Existing routines keep working as before (they may read the whole project, replace files in their output folders and use the web and MCP tools when the project allows them) and need no dry run. Routine deliveries, Telegram/Google Drive checks for new messages (grouped per hour) and routine model calls now also appear in "Data leaving this device", linked to the routine run; describing a routine in your own words is masked like any chat when the project masks identifiers. - Describe a routine in your own words and get a proposal to check, test and switch on. Ask the agent in chat for something that should happen on its own ("every Monday at 8…", "whenever the accountant drops a bank statement into input/bank…", "khi có file mới…", "毎朝…") and it shows a routine proposal card instead of doing the work right away: the name, what it does, when it runs, where it sends results and what it may do while you are away, all in plain language. Anything the app cannot know for sure is asked, never guessed — for example which of several matching folders, which Telegram chat (picked from the chats your bot knows), which file it may update, or to connect Telegram first. Answer and click "Answer & refine"; then "Run dry run" tests it on your real files without sending anything, and "Activate" becomes available once that dry run of exactly this version succeeds. "Edit in editor" opens the routine editor prefilled. The old "schedule proposal" card in chat is replaced by this card.
- New routine panel, editor and run history — routines now live only with their agent. The routine panel beside each agent's chat lists that agent's routines with their state (draft, active, paused, error, edit waiting for confirmation), when they run next or how the last run went, and buttons to Run now, Pause/Resume, Dry run and edit; with no routine yet it offers to describe one in chat or create it. The editor shows what the routine does, a trigger builder (schedule with time zone, files arriving in a project folder, a Telegram or Google Drive message, or only Run now — up to three), what it may do while you are away with a plain-language summary that updates as you edit, up to three places to send results, and its versions; mistakes are shown next to the field they concern. "Describe in plain language" in the editor fills the form from your own words (the same proposal as in chat). Save draft → Dry run (result shown inline: files written in the sandbox, what would be sent, anything refused) → Activate; editing an active routine keeps the running version until you confirm the edit after its dry run, or discard it. Run history shows every run of the agent's routines with filters (routine, status including skipped and cancelled, dry runs), what started each run, and a link to the run in the conversation. Run now is not available for drafts (use Dry run). The old schedule section of the agent settings and the old routine editor with its "AI assistant" are removed; all of this updates live without refreshing.
- Send a routine's result only when it matters. Each destination of a routine has a "Send only when…" field: give it a flag name (for example
over_threshold) and say in the routine's instruction when it applies ("…set over_threshold when an item loses more than 5 %"). The routine then sends to that destination only when the run raised the flag; other destinations and error alerts are sent as before. The dry run shows "would skip: flag … not set to true" or that the flag was raised, and run history lists such deliveries as skipped (condition not met). - Start a routine from your agent's playbook. Agents installed from a playbook that ships routine templates (such as the Inventory Reconciliation & Shrinkage Controller) offer them as "Start from template" in the routine proposal card and in the routine editor, and use them when you describe a similar routine in chat. A template becomes a normal proposal: folders and thresholds come from the playbook, anything it cannot know (such as your Telegram chat) is asked, and it still needs a dry run before you switch it on. The inventory template now sends its summary only when something is over the threshold, and the opening-stock template adds rows for new items instead of only listing them.
Privacy (Milestone 92)
- See every time project data left your computer. Project Configuration → Permissions & Security now has a "Data leaving this device" panel listing each outbound request — AI model calls (including the provider's region for Bedrock and Vertex), web searches and page fetches, remote MCP servers, deliveries to Telegram or Google Drive, feedback, crash reports and update checks — with destination, size, status and what was masked before sending. Only this metadata is recorded, never the content. "Export evidence" writes a CSV and a short summary into the project's
output/compliance/folder for audits. Entries are kept on your device for 365 days. - Mask client identifiers before they reach the AI model. In Project Configuration → Permissions & Security you can turn on masking for a project: e-mails, phone numbers, bank accounts, card/IBAN numbers, API keys, plus national ID, tax and business numbers for the markets you pick (Vietnam, Japan, Korea, Singapore, Thailand) and any terms you list, such as client names, are replaced with placeholders like ⟦CLIENT_1⟧ before a request is sent. The answer you see and the files the agent writes contain the real values again, restored on your computer. "Strict" uses every market and also masks any number with 9 or more digits. The "Data leaving this device" panel shows how many items of each kind were masked per model call (never the values). Off by default; masking can reduce answer quality for tasks that need the exact values, and local models (Ollama) are never masked because nothing leaves the device.
- Fixed: the "Data leaving this device" panel and data source setup can be opened again. Both lived in a window that no button opened any more. The data-flow panel is now in Project Configuration → Permissions & Security, next to identifier masking. Connecting Google Drive folders, local folders and Telegram chats to Source Documents (with recent sync activity) opens from the Source Documents pane menu → "Data Sources & Sync".
- Fixed: "Manage Inbound Sources" opens properly from Data Sources & Sync. The inbound source setup (Google Drive folder, local folder, Telegram chat) used to open underneath the Data Sources & Sync window and could not be used. It now replaces that window, with a Back button (or Esc) to return to it. Both windows were also tidied up: consistent spacing, headers and buttons, readable text in light and dark themes, only the middle part scrolls, and localized sync status labels. The update prompt now also stays usable when it appears while another window is open.
Excel (Milestone 89)
- Excel files created by agents can now include charts, conditional formatting, Excel tables and drop-down lists. When an agent builds a new workbook it can add native charts (column, bar, line, area, pie, doughnut, scatter, stacked, and combined column + line charts with a second value axis, including charts that read data from another sheet), conditional formatting (highlight rules, formula rules, colour scales, data bars, icon sets), Excel tables with a style, a totals row and calculated columns (
[@Qty]*[@[Unit Price]]), drop-down lists and number limits for input cells, sparklines, frozen panes per sheet, column widths, merged and two-row headers. Number formats can follow the market: VND, JPY, KRW, SGD, THB or USD currency and the local date order (e.g. dd/mm/yyyy in Vietnam, yyyy/mm/dd in Japan); ISO dates such as2026-01-31become real Excel dates in date columns. Invalid chart, table or validation settings are now reported to the agent with the exact problem instead of producing a broken file. - Agents can now edit your own Excel workbooks in place without breaking anything else. Asked to update figures, add a month column, insert a transaction, rename a sheet or add a summary sheet with a chart, an agent now changes exactly those cells and objects in your existing file: formats, charts, pictures, notes, Excel tables, pivot tables, macros and every sheet it does not touch stay exactly as they were. Inserting or deleting rows and columns, renaming or deleting sheets moves every formula, name, chart range, table, pivot source, merged range and conditional format that refers to them, like Excel does; changes that would break formulas (
#REF!) are refused unless you ask for them. Before saving, the app checks the result opens and that nothing outside the requested change differs — if anything else changed, nothing is written. Replacing a file in your project asks for confirmation as before, and the previous version is kept so the change can be rolled back. Agents can also start a new workbook from your template (the template is copied and filled, not rebuilt), and the agent can first look at a workbook's structure (sheets, tables, names, charts, formulas). Large files work: correcting values at the end of a 50,000-row sheet takes about a second. - Fixed: Excel generation no longer hangs on cross-sheet formulas. Creating a workbook with a formula such as
=SUM(Ledger!D2:D3)used to freeze the agent run. Formulas that point to another sheet (Ledger!D2,'P&L'!B3,Ledger!$D$2:$D$9, whole columns likeLedger!D:D) are now calculated correctly, so the saved file shows their values right away. Opening customer spreadsheets with very large ranges or merged areas is also protected: such formulas are left for Excel to calculate instead of blocking the app. - New agent template: Inventory Reconciliation & Shrinkage Controller (draft). For teams that keep stock in Excel: it builds tomorrow's opening stock from today's count in a copy of your stock file, reconciles the count in place (variance value and shrinkage % columns, a totals row, red highlights below your thresholds — default −5 %), adds a sheet comparing the loss with the day's revenue from your accounting report, and a weekly sheet with the trend per item. Your fonts, colours, filters and notes stay as they are; notes typed next to the table are moved, not overwritten. It finds columns by their headers, so branches with different layouts work, and it asks for figures that your report only shows as screenshots instead of guessing. The template includes two routine drafts to review before use: reconcile when a new count file arrives (with a short Telegram summary) and build the opening stock every morning.
- Fixed: totals on a summary sheet no longer show 0 before Excel recalculates. After an in-place edit, a total such as
SUM()over formulas that read another sheet could be saved with a wrong value (0 or a partial sum) until the workbook was opened in Excel; it now waits for those values. - Agents can add new rows to a list that has a totals row, and the totals grow with it. When a new item shows up (for example an item counted today that is not in yesterday's stock file), the agent adds its row right above the TOTAL row with the same formats and formulas as the row above; every sum, filter, highlight rule, drop-down, name and chart that covered the list now also covers the new row. It finds the totals row by its formulas, so it works whatever the row is called.
- Sheet names with a stray space are found. A sheet named
NL ĂN(with a trailing space) is now found when the agent writesNL ĂN, as long as only one sheet matches; formulas the agent writes point to the exact sheet name. If two sheets match, the agent is told both names instead of picking one. - Fixed: numbers with many decimals are written exactly. Values such as
111.50000000000003(typical for weighed quantities) could be stored one digit off in the last place, so totals differed from the source file in the 15th decimal.
Office sandbox (Milestone 89)
- Agents can now build decks from your own template and handle complex Word documents with Python, offline. A new tool,
office_script, lets an agent write a short Python script (openpyxl, python-docx, python-pptx, XlsxWriter) that runs inside a sandbox in the AMBA window: no internet, no access to your disk, no access to the app — it only receives the files the agent names and returns new file contents. AMBA checks every result before saving: the file must open and be valid, and when an existing file is edited, nothing outside the parts the agent declared may change (for existing Excel workbooks, any lost chart, shape or formatting rejects the edit and the agent is told to use the in-place spreadsheet editor instead). All results are saved together or not at all, and every overwrite can be rolled back. Overwriting your own files still asks for confirmation, and routines follow their file rules. The sandbox starts on first use (about 2 seconds) and needs the AMBA window to be open; Settings → Diagnostics has a self-test. Nothing leaves your device. The app download grows by about 10 MB.
Security (Milestone 85)
- API keys and connector/account credentials are now stored only in the OS keychain. Previously a plaintext copy was also written to the local database. On first launch, existing plaintext copies are moved into the keychain and deleted; database backups no longer contain any credentials. If the system keychain refuses to save a key, AMBA now shows an error instead of silently saving it in plaintext.
- Hardened the app window against malicious content. A strict Content Security Policy is now enforced, and all AI replies, code blocks, diagrams and slide text are sanitized before display, so text from an AI model or an opened file can no longer run scripts inside AMBA. Diagrams use Mermaid's strict mode. HTML file previews are now shown as static pages (scripts inside the previewed file do not run; open the file externally for interactive pages), and remote images are not loaded inside chat content.
- Agents can no longer read or write files outside the project folder through a second path or a shortcut link. Every file path a tool receives (not just the first one) is now checked against the project folder, after resolving shortcuts/symlinks, so e.g. converting a project file into a location outside the project is blocked. File tools called without a path are refused. Writing new files anywhere in the project and updating files in
workings/andoutput/work as before; overwriting an existing file elsewhere (for example ininput/) now asks for your confirmation, and in scheduled routines such an overwrite is refused because nobody is there to confirm. - Abuse protection for AMBA's online services. The free trial service now also limits usage per network (in addition to per device), caps request and reply sizes, and only uses approved AI models; feedback submissions are rate-limited per network; update checks reject malformed requests. Networks are identified only by a one-way hash — IP addresses are never stored. If the trial limit for your network is reached, AMBA asks you to add your own API key, as it already does when your device's free runs are used up.
- Secrets no longer end up in the local run history, and feedback/crash reports hide more personal data. API keys, tokens, passwords and private keys that appear in tool inputs or results are now masked before a run's steps are saved, and very large tool inputs/results are shortened when saved (the live view while a run is working is unchanged; after a reload such rows show
[REDACTED_SECRET]or a "truncated" note). File paths and your document content stay visible in the history. Feedback and automatic crash reports now also hide email addresses, phone numbers (international and Vietnamese formats) and Vietnamese citizen ID (CCCD) numbers, in addition to user folder paths and API keys. - Privacy policy rewritten to match what the app actually sends (English, Vietnamese, Japanese, Korean). The old "zero telemetry / no servers" wording is gone; the policy now lists every network flow — AI requests with your own key, the free trial relayed to Google Gemini, feedback, automatic crash reports, update checks and the template catalog — with what is sent, where it goes and how long it is kept, plus how to request deletion. The website's FAQ, footer, security diagram and terms were corrected where they contradicted this (including the outdated Linux "encrypted SQLite fallback" for API keys).
Privacy (Milestone 85)
- Crash reports are now sent only with your consent. After an unexpected close, AMBA shows exactly what the report contains (error, code location, stack trace, app version, OS) and asks: Send, Don't send or Always send. A new Crash reports setting in Settings → Vault & Security lets you choose Ask (default) / Always send / Never. The local crash file is deleted once you send or decline it.
- Your feedback contact address is no longer copied into the report text. It is sent as a separate field, stored only in AMBA's feedback database, and never appears in the public GitHub issue or team chat alerts.
- Real feedback reference IDs. After sending feedback you now see the reference ID issued by AMBA's server (e.g.
AMBA-FB-3F2A9C1B) instead of a random number that was never recorded. If the server cannot be reached, the dialog says the feedback was only saved on your device instead of showing an ID. - Automatic data retention on AMBA's servers. Feedback and crash reports are deleted 180 days after the issue is resolved or closed (and at most 365 days after submission); free-trial device records are deleted after 90 days without use. The privacy policy (4 languages) was updated to match.
Release pipeline (Milestone 86)
- Releases can no longer look successful without actually being distributed. Pushing a version tag now runs the full release automatically. Each release job uploads to the download server, checks that every file can be downloaded, registers the version with the update service, and only then publishes the update manifest. A final check confirms that the update service offers the new version and that each offered download works. Missing credentials, an unreachable file or a failed registration now fail the release instead of being skipped silently, which is how v0.5.7 ended up tagged but never distributed. Registration also no longer re-registers older installers from the merged manifest. That had made the Intel-Mac updater offer v0.4.0 instead of the newest Intel build.
- The app version is now defined in one place. The version shown in Help and in the feedback form now always matches the installed build, and the Linux installation guide no longer names a specific (possibly outdated) installer file. Release preparation is one command (
pnpm run release:bump X.Y.Z), and the quality gate fails if any version copy disagrees. - Website: no more pages for things the app doesn't ship. The Business Playbooks section now lists the six agent playbooks that ship in the built-in catalog (several of them were missing from the menu). It also lists six walkthroughs, each built on a project template the app really has, with a note that their figures and run times are examples. A duplicate reconciliation page was removed, and the Vietnamese reconciliation guide no longer points to the removed Pipelines tab (it now describes Routines). Button names in the Connected Accounts guide now match the app in all four languages. The site also publishes a sitemap, and the build fails if any link points to a missing page.
Agent Chat Timeline Rework & Routine Self-Work Streaming (Milestone 84)
- Routines now appear as the agent working on its own — no more fake "user message" for a scheduled routine. Pressing Run now shows the routine block immediately and streams its progress live (checking sources → working → delivering), instead of a spinner on a button followed by everything appearing at once.
- Redesigned agent turns, coding-agent style: a collapsible "Working · 00:42 → Worked for 1m 12s · 5 tool calls" group with per-tool rows (status, duration, start time, expandable details), thoughts folded to one line, and the answer streaming live below.
- Clear timing: every turn shows its start time (hover for the full timestamp), recent turns show "2m ago", and days are separated in the timeline. Scroll/elapsed timers now follow the real run start.
- Fixed cross-talk: a run in one agent can no longer leak into another agent's window; routines run in (and report to) the agent that owns them.
- Older routine history is displayed in the new format automatically (no data migration).
- Routine block shows status (Running → Completed / Failed), execution mode, trigger (manual or scheduled), and a collapsed "Task instruction" — deterministic routines show live steps too.
- Polish & accessibility: readable 12px minimum text in the chat, subtle date-separator rules that now render in both themes, a neutral "Stopped" state for cancelled runs (no endless spinners), full keyboard navigation with visible focus rings (message copy/edit actions also appear on keyboard focus), screen-reader-friendly timestamps, and "Reduce motion" support.
- Remaining English strings in the chat (edit-prompt hint, token tooltip, "Saved locally") are now translated in Vietnamese, Japanese and Korean.
Bug Fixes (Milestone 83 follow-up)
- Agent list is visible again above the file tree in Project Studio (finished the "bot"→"agent" rename that had hidden it).
- Switching agents restores each agent's chat scroll position reliably instead of jumping.
- Routines run in their own conversation (never in whichever conversation was opened last), and finishing a routine no longer pulls you away from the agent you are viewing.
- Deleting an agent also deletes its routines, so orphaned routines no longer keep running.
Routine Identity Unification + "bot"→"agent" Rename (Milestone 82)
- Routines now belong to each agent conversation (not a shared template), so switching between agent tabs instantly shows that agent's own routines with its own open/close state, and two agents built from the same template no longer share routines. Fixes the "sidebar stays put / don't know whose routines" behavior.
- Fixed a mount-time race and project-switch inconsistency in the agent chat state.
- Removed leftover dead "executive roster" modal code.
- Terminology: "bot" → "agent" throughout the app (UI text, identifiers, API, and settings). Persisted agent configurations are migrated automatically on launch (no data loss). Telegram's own "bot" terms (e.g. BotFather, bot token) are unchanged since they refer to Telegram bots.
Per-Agent Routine State Isolation (Milestone 81)
- Switching agents now cleanly swaps the routine sidebar to that agent's own routines — the sidebar remounts per agent, so no state leaks between agents, and the header shows which agent you're configuring.
- Switching projects resets the chat + routine state cleanly (no stale agent carried over from the previous project).
- The routine sidebar is now a config-only surface — the execution history list was removed from it; run history lives in the agent's chat timeline, with the "View logs" button opening the detailed run monitor on demand.
Agent Routine Rework (Milestone 78)
- Run Now reliably pulls Telegram files, or tells you why not. A routine with inbound collection enabled now requires an account + channel (validated on save), so it can no longer silently pull nothing. The Telegram fetch persists a per-account offset so a prior sync no longer empties the backlog.
- Execution logs are reachable. A new "View logs" button in the Routine sidebar (per routine and for all) opens the run history. Deterministic (default-mode) runs now record step events (inbound fetch, file counts, errors), so every run is observable — not just agent-mode runs.
- New Telegram routines default to inbound ON with the account pre-selected, so "Add new → pick channel → Run Now" works out of the box.
- Legacy cleanup. Removed the redundant per-agent "Schedule" settings tab (routines are configured from the sidebar — the single source of truth), deleted the orphaned Pipelines tab, retired the dead background poller loop, and stopped the migration that kept resurrecting a deleted accounting task.
Multi-Cloud Provider Adapters + OpenAI Responses API (Milestones 76 & 77)
Added
- Bring-Your-Own-Key for enterprise clouds (Milestone 76): configure AWS Bedrock, Azure OpenAI, and GCP Vertex AI directly from the Cloud Provider Hub, reaching their full model catalogs (not just OpenAI-compatible gateways).
- AWS Bedrock (full catalog): native Converse API adapter reaching Claude, Llama, Titan, Mistral and more, with live model discovery via
ListFoundationModels. Two auth modes, chosen with a toggle in the Bedrock form:- Bedrock API key (recommended) — paste a single Amazon Bedrock API key (Bearer); the simplest setup for end users.
- IAM Access Key + Secret — SigV4 signed per request (session token supported for temporary credentials); signing happens per request, eliminating the "Signature expired" errors seen with cached credentials.
- Inference-profile-aware discovery — model discovery lists invocable cross-Region inference profiles (e.g. Claude Sonnet 4.5) alongside on-demand foundation models, and hides bare IDs that return "on-demand throughput isn't supported".
- Reactive inference-param recovery — when a model rejects an
inferenceConfigfield (e.g. OpenAI models on Bedrock that don't accepttemperature), AMBA removes the offending field named in the error and retries automatically. Model-agnostic, so new restrictions are handled without code changes.
- Azure OpenAI: deployment-routed chat completions with
api-keyauth and configurableapi-version. Shares OpenAI's reactive 400-recovery, so Azure deployments of restricted models (e.g. gpt-6-astra) self-heal — whenreasoning_effort: 'none'is rejected, AMBA switches to a supported value the error lists (low/medium/high/xhigh) instead of failing. - Reasoning models + function tools on OpenAI/Azure via the Responses API (Milestone 77): reasoning models (gpt-6-astra, terra, o-series) are automatically routed to the
/v1/responsesAPI, where function tools are supported — so agent sessions on OpenAI and Azure now work with these models. Non-reasoning models and OpenAI-compatible gateways keep using/v1/chat/completionsunchanged. (If a reasoning model is ever reached over a chat/completions-only gateway, AMBA still returns a clear error suggesting an AWS Bedrock profile.) - GCP Vertex AI: Gemini
generateContentwith service-account OAuth2 (short-lived tokens minted and cached per session). - Per-provider credential forms: dedicated secure input fields per cloud (AWS keys + region, Azure endpoint + version, Vertex service-account JSON + project/location), stored in the OS keychain. Existing API keys continue to work unchanged.
- 1-click presets: AWS Bedrock, Azure OpenAI, and GCP Vertex added alongside the existing DeepSeek/OpenRouter/Groq/Together presets.
- AWS Bedrock (full catalog): native Converse API adapter reaching Claude, Llama, Titan, Mistral and more, with live model discovery via
0.5.7 — 2026-09-30
> Tagged only — never distributed (updater, R2 and download portal stayed on 0.5.6); superseded by the next release.
Added
- High-Fidelity In-Tree Excel Formula Engine & Auto-Evaluation (Milestone 55):
- Rust In-Tree Formula Evaluator: Pure Rust recursive descent formula engine (
evaluator.rs) supporting arithmetic operations, parenthesized expressions, and standard business functions (SUM,AVERAGE/AVG,COUNT,MAX,MIN,ROUND,ABS,IF). - Zero-Zero Invariant Guarantee: Evaluates formulas at generation time and writes computed results via
worksheet.set_formula_result(), ensuring Excel displays authentic values immediately without showing<v>0</v>. - Auto-Recalculation on Read: Automatically evaluates formulas when reading
.xlsxspreadsheets where cached values are0or empty, keeping spreadsheet previews accurate and responsive. - Resilient Cell Parsing: Supports formula strings missing leading
=, object cells ({"formula": "...", "value": ...}), and auto-evaluates formulas embedded inside Markdown tables and CSV files.
- Rust In-Tree Formula Evaluator: Pure Rust recursive descent formula engine (
- Conversational Flow, Turn-Scoped Deliverables & Surgical Core Tools (Milestone 54):
- Turn-Scoped Deliverables: Cleanly isolates draft deliverable cards per conversational turn in
ProjectChat.vue, eliminating ghost file cards from previous turns. - Surgical Tool
replace_file_content: Native Rust tool for exact string replacement with line-range constraints (start_line,end_line), occurrence counting, andallow_multipleguards. - Structural Tool
directory_tree: Fast ASCII hierarchy generator for file tree exploration with depth limiting and noise filtering (.git,node_modules,target, etc.). - OpenAI gpt-5.6-terra Auto-Recovery: Intercepts reasoning model 400 errors and automatically adjusts
reasoning_effort: "none"for/v1/chat/completionsfunction-calling compatibility.
- Turn-Scoped Deliverables: Cleanly isolates draft deliverable cards per conversational turn in
- Google Gemini 429 Self-Healing & Context Token Blast Cap (Milestone 53):
- Exponential Backoff with Header Parsing: Automatically extracts
Retry-Afterdelay directives from Gemini 429 rate limit responses with a safe 35-second ceiling. - Anti-Context Blast Cap: Protects users against sudden API cost spikes by bounding context injection to budget limits.
- Exponential Backoff with Header Parsing: Automatically extracts
- Real-Time Token Telemetry & ReAct Loop Metrics (Milestone 52):
- Step-Level Token Badges: Real-time display of input/output token usage in thought steps, activity trays, and assistant message action bars (
⚡ 1.5k tok (↓1.2k ↑350)).
- Step-Level Token Badges: Real-time display of input/output token usage in thought steps, activity trays, and assistant message action bars (
- Offline Document Conversion Engine & Anti-Token-Blast Guard (Milestone 51):
- Local Document Conversion (
document_convert): Zero-token offline conversion of Office formats (.docx,.xlsx,.pptx) to clean Markdown representations. - Anti-Token-Blast Guard: Automatically intercepts massive documents in
filesystem_readand offers 1-click conversion to protect the model's context budget.
- Local Document Conversion (
- Local Workspace Indexer & Hybrid Retrieval Engine (Milestone 50):
- SQLite FTS5 Full-Text Indexer: Embedded full-text search with incremental chunking and
unicode61diacritics removal. - Hybrid Search Tool (
workspace_search): Combines BM25 lexical precision with semantic vector search via Reciprocal Rank Fusion (RRF). - Surgical Line Slicing: Added
start_line,end_line, andshow_line_numberstofilesystem_readto reduce token consumption by > 90%.
- SQLite FTS5 Full-Text Indexer: Embedded full-text search with incremental chunking and
- Large Document Streaming Parser & Token-Budgeted Grounding (Milestone 49):
- Resilient Streaming DOCX Parser: Non-blocking chunked XML streaming with pure-text fallback recovery for corrupted documents.
- Anti-Binary Guard Invariant: Strictly prevents Office document formats from falling through to raw binary byte checks.
- Query-Grounded Filtering & TOC Outlines: Extracts structured Table of Contents maps and semantic paragraph excerpts with context windows.
0.5.6 — 2026-09-25
Added
- Unified Modal Design System & Pro-Desktop Dialog Experience (Milestone 48):
- Streamlined 3-Tab Project Settings: Reduced project configuration from 5 tabs down to 3 (
general,security,danger), eliminating horizontal tab scrolling and dialog jumping. - Non-Technical Permissions & Security Matrix: Intuitive Allow/Deny segmented controls for Filesystem Sandbox, Web Search, Terminal Commands (blocked by default), and MCP Plugins.
- Authoritative Modal Standards: Standardized dialog geometry (
max-w-[720px],rounded-2xl, standard Tailwind padding) acrossAccountSetupModal,FeedbackModal,ProjectCreateModal,ProjectDeleteModal,ResetSessionModal, andProjectOperationsModal.
- Streamlined 3-Tab Project Settings: Reduced project configuration from 5 tabs down to 3 (
- Two-Layer Executive Agent Architecture & Agent Studio (Milestone 44):
- Agent Studio Marketplace: Dynamic catalog synced directly from Cloudflare R2 (
https://r2.ambadesk.com/alpha/catalog/agents.json) with duplicate-safe installation and 1-click cloud sync. - 6 Canonical Specialist Personas: Pre-trained personas compiled from Single Source of Truth playbooks (
catalog/playbooks/): Financial Analyst, Business Writer, Strategy Consultant, Market Researcher, Data Analyst, and Chief of Staff. - AI Co-Creation Wizard: Interactive
🪄 Co-create with AIflow for structuring custom specialist agents from natural dialogue. - Multi-Agent Project Roster: Visual sidebar agent grid, 0ms instant tab switching with preserved chat history, open file preview, and scroll position.
- Agent Studio Marketplace: Dynamic catalog synced directly from Cloudflare R2 (
- TypeSafe AI (Jev — System 1 Decision Engine) (Milestone 43):
- Sub-second intent classification and automatic cognitive mode routing (
Research,Plan,Agent) with real-time latency badges (Jev · 68ms). - Integrated into Step 3 of Model Settings alongside OpenRouter.
- Sub-second intent classification and automatic cognitive mode routing (
- Cross-Lingual Reasoning Boundary (ADR-020):
- Internal chain-of-thought and calculation reasoning inside
<thought>blocks strictly conducted in Technical English to eliminate arithmetic and parameter hallucinations. - Deliverables and UI communications compiled natively in active project locale (
en,vi,ja,ko).
- Internal chain-of-thought and calculation reasoning inside
- Documentation & Homesite Parity:
- Replaced ASCII architecture diagrams with responsive, theme-aware
<ExecutivePersonasFlow />component. - Full multilingual parity across all concept docs, getting-started guides, and playbooks.
- Replaced ASCII architecture diagrams with responsive, theme-aware
0.5.5 — 2026-09-18
Added
- Frictionless Onboarding, Zero-Typing Sandboxes & Managed Trial Gateway (Milestone 37):
- Zero-Typing Interactive C-Suite Demo Sandboxes: Added interactive sandbox picker modal (
WelcomeSandboxModal.vue) pre-seeding realistic business projects for Chief of Staff, Accounting & Finance, and Operations with zero API keys required. - Cloudflare Edge Trial Gateway: Deployed edge trial gateway with anonymous client token enforcement, rate limiting, and device quota protection.
- Desktop Runtime
AmbaCloudProvider: Implemented managed trial provider fallback with transparent BYOK handoff dialog when quota expires. - Deep File Mention & Categorized Playbook Suites: Enhanced chat dock with quick
@filementions and domain-categorized prompt libraries.
- Zero-Typing Interactive C-Suite Demo Sandboxes: Added interactive sandbox picker modal (
- Office Presentation Fidelity & Virtual Artboard Projection (Milestone 30/37):
- 16:9 Vector Slide Artboard Engine: Introduced fixed virtual artboard presentation viewer (
PresentationViewer.vue) with CSS percentage coordinates, auto-scaling typography, and vector shape rendering. - Rich PPTX Formatting: Added full support for rich text runs (bold, italic, colors), bullet dots, multi-level indentations, and theme background reference resolution (
bgRef).
- 16:9 Vector Slide Artboard Engine: Introduced fixed virtual artboard presentation viewer (
- Two-Stage Plan Execution & Chronological Blueprints (Milestones 35 & 36):
- Chronological Plan Blueprints: Structured agent plans into
plans/YYYYMMDD_<slug>.mdwith organized deliverable outputs underdeliverables/. - Lean Triad Cognitive Modes: Streamlined execution into three high-signal modes:
explore,plan, andexecute. - Pro Markdown Editor: Integrated direct raw source editing with line numbers, word-wrap toggles, and instant disk synchronization.
- Chronological Plan Blueprints: Structured agent plans into
- Multilingual UI & Documentation Consistency:
- Standardized English as primary language across homesite manuals with zero Vietnamese residual text.
- Replaced Mermaid diagram with Unicode box-drawing raw text block on documentation site.
- Canonical language selector ordering (
en,ja,ko,vi) without hardcoded bias. - Added full localization for desktop sidebar navigation ("Show more" / "Show less" and collapse toggles).
Distribution
- Version Alignment: Aligned release version strings to
0.5.5across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
0.5.4 — 2026-09-17
Added
- Version-Partitioned Object Storage & Cloudflare R2 Distribution Architecture:
- Implemented version-partitioned binary storage under
alpha/vX.Y.Z/across all release workflows (release-windows.yml,release-macos-arm.yml,release-macos-intel.yml,release-linux.yml, andrelease-all.yml). - Added dedicated snapshot manifest generation (
alpha/vX.Y.Z/latest.json) preserving historical release states. - Maintained top-level
alpha/latest.jsonpointer manifest withno-cacheheader for zero-lag live OTA updater detection and homesite download resolution.
- Implemented version-partitioned binary storage under
- Windows Release Pipeline Hardening:
- Eliminated silent
continue-on-errormasking on Windows runner deployment. - Added automated CLI environment provisioning for
ghandawstools on Windows self-hosted and cloud runners. - Fixed cross-platform directory separator traversal in bundle collection.
- Eliminated silent
Distribution
- Version Alignment: Aligned release version strings to
0.5.4across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
0.5.3 — 2026-09-17
Added
- Flexible Runner Environment for macOS Intel CI/CD:
- Added runner environment selection (
self-hostedvsgithub-hostedmacos-13) to.github/workflows/release-macos-intel.ymland unified multi-platform release.github/workflows/release-all.yml. - Enables zero-quota local execution on dedicated Mac Pro runners while preserving cloud fallback elasticity on GitHub Actions.
- Added runner environment selection (
Distribution
- Version Alignment: Aligned release version strings to
0.5.3across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
0.5.2 — 2026-09-17
Added
- Dual-Destination Edge Distribution & D1 Catalog Sync (ADR-043, Milestone 32):
- Deployed
release_artifactsedge metadata catalog on Cloudflare D1 with secure management token verification (X-Release-Secret). - Added CLI synchronization tool (
scripts/register-release-artifacts.mjs,pnpm run release:sync-d1) supporting atomic dual-sync from Cloudflare R2 to D1. - Extended Cloudflare Worker with authenticated ingestion
POST /v1/releases/artifactsand public distribution endpoints (/v1/releases/latest,/v1/releases/download/:platform). - Codified R2 bucket storage hygiene and automated D1 registration across all GitHub Actions release workflows (
release-*.yml).
- Deployed
Distribution
- Version Alignment: Aligned release version strings to
0.5.2across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
0.5.1 — 2026-09-17
Fixed
- Hybrid Scanned PDF OCR Adapter Hardening: Enhanced explicit memory buffer typing and bounds safety in scanned PDF text extraction adapter (
src-tauri/src/context/adapters/pdf.rs).
Distribution
- Version Alignment: Aligned release version strings to
0.5.1across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
0.5.0 — 2026-09-16
Added
- Modern Pro-Desktop UI Core & Tailwind CSS Migration: Complete transformation of the UI system to Tailwind CSS with semantic tokens, full dark/light theme support, and shadcn-vue primitives (
AppShell,ProjectStudio,Tabs,Dialog,DropdownMenu). - Studio Resizable Panes & Workspace Ergonomics: Integrated draggable splitters (
ResizablePanelGroup) across File Tree, Chat, and Deliverable Viewers with persistence and zero flicker. - Headless Document Core & Doc-Ops Mutation Engine (ADR-041): Rust canonical document mutations with atomic checkpoint snapshots (
.revisions/), instant rollbacks, and visual diff reviews (DiffReviewBar). - Interactive Spreadsheet Viewport & Co-Editing: Viewport windowing IPC streaming for massive spreadsheets with inline editing intent emission, formula bar (
fx), multi-sheet tabs, and cell diff highlighting. - High-Fidelity Document Viewers Suite: Native rendered and raw source toggle projections for Markdown, Word (
.docx), PowerPoint (.pptx), HTML, and Vector PDF documents with clean unified Pro-Desktop header bars. - Office Fidelity, Editable Source & Native Context Menu: Direct file inspection, desktop OS app launching, clipboard copying, and native context menu suppression in Tauri desktop runtime.
- Hybrid Scanned Document Ingestion & Multimodal Vision Engine (ADR-042): Scanned PDF OCR extraction via Apple Vision / Rust heuristics with automatic fallback and grounded reasoning guardrails.
- Delivery Channels & Local Folder Connector: Bi-directional file dispatching with Local Folder Inbound connector, Telegram outbound file routing, and resilient MIME resolution.
- Fully Responsive Feedback & Support Modal: Roomy responsive grid, sentiment rating strip with multiline truncation safeguards, and compact touch-friendly mobile layouts.
- Complete Four-Locale Localization: Harmonized translation coverage across English, Vietnamese, Japanese, and Korean across all panels, settings, and documentation.
- Closed-Loop Resolution: Formally resolves and closes GitHub issues #8 and #9 delivered in the v0.5.0 milestone (closes #8, closes #9).
Quality
- 465 Vitest unit tests passing across 73 suites (100%).
- 309 Rust unit and integration tests passing (100%).
- 0 TypeScript compiler errors (
vue-tsc --noEmit). - Clean VitePress documentation build (
pnpm site:build).
0.4.23 — 2026-09-13
Added
- Google Drive Native Docs Export Engine (TASK-111): Google Sheets (
application/vnd.google-apps.spreadsheet) are automatically exported to.xlsx(OOXML) format via the Drive export API; Google Docs (application/vnd.google-apps.document) are automatically exported to.pdf. Eliminates HTTP 403 Forbidden errors that previously blocked native Workspace file downloads. - Checksum Deduplication for Exported Files (TASK-111): Exported files lack Drive MD5/size metadata; deduplication now compares local file modification time against remote
modifiedTimeto prevent redundant re-downloads. - Auto-ingest Exported Spreadsheets (TASK-111): Exported
.xlsxfiles are automatically loaded into the project's.analytics.dbviaload_spreadsheet_into_tablefor immediate analysis. - Storage Reactivity & Instant File Tree Updates (TASK-111):
sync_pipeline_bindingandsync_account_pipelinesnow re-index theproject_filesSQLite table viaresync_files_in_storageand emitproject:files-updatedimmediately after sync — files appear in the SOURCE DOCUMENTS pane without requiring an app reload. - On-Demand Google Drive Sync Badges (TASK-112):
CloudImportModalnow displays an⚡ On-Demand Sync & 08:00 Schedulebadge and informational description explaining the governed on-demand fetch model across all 4 locales (en/vi/ja/ko). - Transparent Sync Progress & Feedback (TASK-112): The "Save & Sync Folder Rule" button now shows a
mdi:loadingspinner with thecloud_saving_and_syncinglabel while syncing. On success, a toast displays the exact number of files fetched and bytes transferred. On failure, a clear warning toast shows the actionable error message — replacing the previous silentcatch {}. - Quick Sync All-Sources Button (TASK-112): SOURCE DOCUMENTS pane header now shows a dedicated quick-sync button with
dossier_quick_sync_tooltip("Sync all data sources (Google Drive & Telegram)") that triggers synchronous fan-out across all active Google Drive and Telegram pipeline bindings. - Hermetic Export Test (TASK-111):
test_google_drive_export_spreadsheet_to_xlsxadded toservices::connectors::testswith an in-process mock HTTP export server validating the full Sheets →.xlsxexport and deduplication flow.
Quality
- 359 Rust unit + integration tests passing (100%).
- 300 Vitest tests passing across 46 suites (100%).
- 0 TypeScript errors (
vue-tsc --noEmit). - Clean VitePress documentation build (
pnpm site:build).
0.4.17 — 2026-09-10
Added
- Milestone 14: Telegram Multi-Group Operations & Rule-Based Workspace Organizer (ADR-033)
- Telegram Bot Long Polling Engine: Zero-port local sync directly inside Tauri Rust runtime (TASK-79)
- Multi-Group Rule Router: Deterministic mapping of Telegram departmental chats to project zones (e.g. Accounting to
data/accounting, Operations toworkings/operations) with automated SQLite table loading and vector memory chunking (TASK-79) - Interactive Chat Discovery: One-click "Scan Active Chats" probe resolving numerical Telegram Chat IDs into group names (TASK-79, TASK-80)
- Multi-Group Configuration UI: Group-to-Folder mapping table, presets, auto-ingestion toggles in ConnectorSetupModal and ProjectConnectorsTab (TASK-80)
- Two-Tier Connector Architecture: Promoted Telegram & Google Drive to Core Global Connectors; demoted Zalo OA to Regional Extensions (Vietnam) (TASK-81)
- Hermetic Telegram Mock Integration Suite: End-to-end multi-group sync, deduplication, and sandbox traversal test harness (TASK-82)
0.4.16 — 2026-09-10
- External Connectors & Sandboxed Sync Pipeline (TASK-73, TASK-74, ADR-032, closes #6):
- Introduced local-first external connector runtime architecture supporting Google Drive and Zalo Official Account (OA).
- Stored sensitive OAuth tokens, client secrets, and refresh tokens strictly in OS Keychain (
connector:<id>), ensuring zero token leakage in SQLite or plaintext configuration. - Implemented Google Drive Connector with automatic token refresh, folder-scoped querying, stream downloading into
<project_root>/connectors/google_drive/, path traversal defense guards, and MD5/SHA-256 checksum deduplication skipping unchanged files with 0 bytes transferred. - Implemented Zalo OA Connector with OpenAPI OAuth refresh, transactional message attachment querying, download streaming into
<project_root>/connectors/zalo/, and size/hash deduplication. - Recorded detailed audit trails for all sync operations in
connector_sync_logstable (status, files fetched, bytes transferred, duration, per-file actions).
- Rule-Based Auto-Ingestion Router & Persistent Knowledge UI State (TASK-75, ADR-032):
- Implemented automated rule-based file ingestion router dispatching synced files from
connectors/into designated project zones:- Spreadsheets (
.xlsx,.xls,.csv,.tsv) $\rightarrow$data/<filename>and automatically parsed and loaded into analytical SQLite tables inworkings/.analytics.db. - Documents (
.pdf,.docx,.md,.txt) $\rightarrow$context/<filename>and chunked intosemantic_memoriesfor grounded semantic retrieval. - Images (
.png,.jpg,.jpeg) $\rightarrow$workings/receipts/<filename>.
- Spreadsheets (
- Audited and persisted all ingested sources into SQLite
project_ingested_sourcestable. - Fixed Knowledge UI Button Reset Bug: persisted
source_idintoproject_ingested_sourcesacross project switches inProjectChat.vue, permanently restoring green "Ingested" (Đã lưu) state. - Added real-time Tauri IPC notification event
project:file_ingested.
- Implemented automated rule-based file ingestion router dispatching synced files from
- Scheduled Daily Executive Dispatch Engine (TASK-76, ADR-032):
- Built lightweight in-tree scheduler running inside single-process
tauri::async_runtime::spawnwith zero cron daemons or node sidecars. - Implemented 5-step automated executive dispatch sequence: (1) sync all active connectors, (2) auto-ingest pending files into project zones, (3) execute agent reasoning in
AgentMode::Exec, (4) promote draft deliverables fromworkings/drafts/tooutput/with companion vector.pdfauto-compilation, (5) trigger desktop notification eventproject:scheduled_run_completed. - Implemented run-once-per-day idempotency tracking via
project_schedule_last_run:<project_id>with 24-hourHH:MMtime matching. - Added Tauri IPC commands:
get_project_schedule,set_project_schedule, andtrigger_scheduled_run_now.
- Built lightweight in-tree scheduler running inside single-process
- Connector Management & Sync Status UI (TASK-77, ADR-032):
- Built
ConnectorSetupModal.vuewith tabbed selector for Google Drive and Zalo OA, credential reveal/hide toggles, diagnostic "Test Connection" button, and OS Keychain persistence. - Built
ProjectConnectorsTab.vuefeaturing connector cards (status pills, folder/OA ID, filters, last synced time, "Sync Now" with spinning state, "Configure", "Delete"), Daily Schedule Card (enable toggle, time picker 24h, playbook selector dropdown, custom dispatch prompt, "Save Schedule" and "Run Now" triggers), and Recent Sync Activity table. - Integrated
ProjectConnectorsTab.vuedirectly intoProjectStudio.vueworkspace tab bar. - Added complete localization strings across English, Vietnamese, Japanese, and Korean.
- Built
- E2E Connector QA Suite & Integration Verification (TASK-78, Milestone 13 Complete):
- Created comprehensive hermetic integration test suite
src-tauri/tests/connector_tests.rs:test_google_drive_e2e_sync_and_deduplication: Verified mock Google Drive sync, landing inconnectors/google_drive/, audit logging, and secondary syncskipped_unchangedassertion with 0 bytes transferred.test_zalo_oa_attachment_ingest: Verified mock Zalo OA transaction attachment fetch, local receipt storage, and hash deduplication.test_rule_based_auto_ingestion_routing: Verified automatic routing of.xlsxintodata/and table loading in.analytics.db,.pdfintocontext/with semantic chunks, and.pngintoworkings/receipts/.test_scheduled_dispatch_execution_flow: Verified daily time validation, run-once-per-day idempotency, mock execution inAgentMode::Exec, and deliverable promotion tooutput/with companion.pdf.
- Verified 100% test pass rate across 313 Rust tests (296 lib + 17 integration tests), 254 Vitest tests (36 suites), 0 TypeScript errors, and clean VitePress build.
- Created comprehensive hermetic integration test suite
- Version Alignment:
- Synchronized version
0.4.16across the authoritative 16-file release checklist.
- Synchronized version
0.4.15 — 2026-09-10
- Bidirectional Office Fidelity & Visual Mirroring (TASK-70, ADR-031):
- Upgraded
excel_writerwith professional C-Suite design presets: Corporate Navy header fills (#1F4E79), bold white typography, subtle borders, freeze panes (row 1 pinned), auto-fitted column widths clamped between 12 and 45 characters, and visible gridlines. - Enhanced number formatting engine with native support for accounting currency (
$#,##0,$#,##0.00) and percentages (0.0%,0.00%). - Upgraded
pptx_writerwith 16:9 widescreen layout (12192000 x 6858000EMUs) and executive KPI callout cards featuring light slate container accents (#F8FAFC), subtle borders (#CBD5E1), 36pt bold figure typography, and color-coded delta indicators (Emerald Green#16A34Afor positive gains and Crimson Red#DC2626for negative deltas).
- Upgraded
- In-App Formula Bar (
fx) & Cell Inspector UI (TASK-68, ADR-031):- Added pinned In-App Formula Bar (
fx) inSpreadsheetViewer.vuewith active cell coordinate box (A1,C10), stylized italic boldfxbadge, and formula/value inspection input. - Added active cell selection state highlighting clicked cells with high-visibility primary outline.
- Added "Show Formulas" view mode toggle and global shortcut (
Ctrl + ~/Cmd + ~), revealing raw formula strings and subtle tinted styling across all formula cells. - Localized formula inspection controls across English, Vietnamese, Japanese, and Korean.
- Added pinned In-App Formula Bar (
- Formula Graph Engine & Grounded Agent Reasoning (TASK-67, TASK-69, ADR-031):
- Enhanced OpenXML streaming parser (
xlsx_zip.rs) to extract<f>...</f>formula tags into structuredSpreadsheetCellmodels without discarding formula logic. - Implemented formula-aware Markdown table rendering (
render_sheet_markdown) enriching cells with[fx: <formula>]annotations and generating automatic### 📐 Formula Dependency Graphsections. - Codified Section 16 ("Spreadsheet Formula Integrity & Dependency Graph Reasoning") into agent planning instructions across all cognitive modes (
Auto,Exec,Ask,Study).
- Enhanced OpenXML streaming parser (
- Golden Benchmark Suite & Office Turing Test QA (TASK-71, Milestone 12 Complete):
- Created comprehensive hermetic integration test suite
src-tauri/tests/office_roundtrip_tests.rs:test_excel_roundtrip_formula_ast_preservation_and_styling: Verifies mathematical and formula AST invariance across 3-sheet corporate financial models, ensuring 100% of formulas are preserved with leading=, values match, and freeze panes, column widths, and styles remain intact.test_powerpoint_roundtrip_widescreen_and_kpi_cards: Verifies OpenXML slide containers, 16:9 widescreen layout dimensions, KPI card shapes, and semantic extraction viaPptxAdapter.
- Verified 100% pass across 285 Rust tests, 223 Vitest tests, 0 TypeScript errors, and clean VitePress build.
- Created comprehensive hermetic integration test suite
- Version Alignment:
- Synchronized version
0.4.15across the authoritative 16-file release checklist.
- Synchronized version
0.4.14 — 2026-09-10
- Dynamic Edge Updater Protocol & Architecture (TASK-62, TASK-63, ADR-030):
- Deployed dynamic Tauri v2 auto-updater edge route
GET /v1/update/:target/:current_versionon Cloudflare Workers backed by D1 (release_artifacts), returning HTTP 200 with JSON payload when updates exist or clean HTTP 204 No Content when up-to-date. - Implemented atomic CI artifact registration endpoint
POST /v1/releases/artifactwith cryptographic Bearer auth, upserting multi-platform binaries without file locks or race conditions. - Preserved backward-compatible monolithic manifest
GET /v1/releases/latest.jsondynamically aggregated across active platform builds. - Hardened desktop client updater (
commands/updater.rs) to gracefully intercept missing platform fallback errors and 204 responses, eliminating false-positive error modals.
- Deployed dynamic Tauri v2 auto-updater edge route
- Two-Stage Deliverable Lifecycle & Draft Finalization (TASK-64, closes #5 Part 1):
- Enforced two-stage deliverable progression: exploratory and preliminary drafts ("nháp", "tính thử", "draft", "sơ bộ") are routed exclusively to
workings/drafts/<filename>. - Added strict path guard preventing unauthorized preliminary writes directly into client-facing
output/. - Added Executive Draft Review Card in
ProjectChat.vuewith branded document icons, live preview, and one-click "Chốt & Xuất Bản Chính Thức" action promoting approved drafts intooutput/with companion vector.pdfcompilation. - Added draft artifact tracking in
RunCheckpointpreserving draft state across multi-step execution interruptions.
- Enforced two-stage deliverable progression: exploratory and preliminary drafts ("nháp", "tính thử", "draft", "sơ bộ") are routed exclusively to
- C-Suite Analytical Depth Engine for Excel & PowerPoint (TASK-65, closes #5 Part 2):
- Codified Anti-Skeleton Protocol in agent planning instructions and system prompts: mandated interconnected 3-sheet architecture for financial workbooks (
Assumptions & Drivers,Financial Model P&Lwith 15-20+ granular rows, andCash Flow & Sensitivity). - Mandated 5-slide C-suite narrative architecture for presentations (
1: Strategic Thesis,2: Problem & Context,3: Unit Economics & KPI Cards,4: Operational Matrix,5: Governance & Milestones). - Added runtime density heuristics in
ExcelWriteToolandPptxWriteToolwarning against skeletal single-sheet tables or under-developed slide decks.
- Codified Anti-Skeleton Protocol in agent planning instructions and system prompts: mandated interconnected 3-sheet architecture for financial workbooks (
- CI Modernization & Version Alignment:
- Modernized all 5 platform release workflows with automated edge artifact registration.
- Synchronized version
0.4.14across the authoritative 16-file release manifest.
0.4.13 — 2026-09-09
- The Virtual Cabinet 3-Stream Orchestrator & Run Checkpoint Engine (TASK-60, TASK-61):
- Implemented run state checkpointing and automatic resumption engine, allowing interrupted multi-step agent executions to resume deterministically without data loss (closes #2).
- Engineered "The Virtual Cabinet" 3-stream orchestrator managing lifecycle transitions across Source Documents, Assistant's Workbench, and Final Deliverables (closes TASK-60).
- Hardened guardrail tool invocations with auto-spool fallback and secure asynchronous telemetry dispatch (closes #1, closes #4).
- Added end-to-end integration test suite verifying checkpoint resume, panic recovery, and virtual cabinet stream integrity (closes TASK-61).
- Version Alignment:
- Aligned release version strings to
0.4.13across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.12 — 2026-09-09
- Release Governance Standard Operating Procedure & 16-File Protocol:
- Codified the authoritative Release Governance SOP mandating atomic synchronization across all 16 configuration, manual, and runtime files for every release cycle.
- Embedded the Mandatory Release Protocol and 16-File Checklist into the root developer contract (
AGENTS.md) and documentation index (docs/INDEX.md).
- Version Alignment:
- Aligned release version strings to
0.4.12across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.11 — 2026-09-09
- Native Crash Resilience & Panic Tombstone Recovery (ADR-028, Milestone 9):
- Implemented zero-allocation synchronous panic hook in Rust (
security/panic.rs) writing structured, privacy-scrubbed crash tombstones (last_crash.json) during fatal process aborts. - Added startup crash recovery service (
services/crash_recovery.rs) to detect prior abnormal exits, dispatch redacted telemetry to the edge buffer, and purge tombstones from disk. - Sanitized panic backtraces and messages using linear regex masking to guarantee zero credential or user path leakage in crash logs.
- Added comprehensive integration test suite (
tests/crash_recovery_tests.rs) covering panic hook capture, mock server telemetry dispatch, corrupted tombstone purge, and crash payload fidelity.
- Implemented zero-allocation synchronous panic hook in Rust (
- Version Alignment:
- Aligned release version strings to
0.4.11across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.10 — 2026-09-09
- Windows CI/CD Hygiene & Self-Hosted Artifact Isolation:
- Added aggressive cleanup of previous bundle artifacts (
win-artifactsandsrc-tauri/target/.../bundle) in.github/workflows/release-windows.ymlto prevent artifact contamination across self-hosted runner cycles.
- Added aggressive cleanup of previous bundle artifacts (
- Updater Sanitization & Infinite Loop Prevention:
- Enhanced
scripts/update-latest-json-r2-local.mjsto verify platform versions against rootjson.version. - Automatically purges platform entries from updater manifest when platform version does not match root version, preventing infinite update download loops.
- Enhanced
- Version Alignment:
- Aligned release version strings to
0.4.10across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.9 — 2026-09-09
- Automated Feedback & Closed-Loop Issue Triage (ADR-027, Milestone 8):
- Added 1-click incident reporting button in
ProjectChat.vuewith automated context capture (active playbook, failed tool, error classification, redacted log excerpts). - Implemented client-side privacy redactor in Rust (
services/telemetry_redaction.rs) that scrubs IPv4/IPv6, email addresses, JWTs, bearer tokens, and local file system paths (/Users/...,C:\...) before transmission. - Implemented offline SQLite spooling queue (
user_feedbacktable) to guarantee zero report loss during network dropouts. - Deployed Cloudflare Edge Buffer Worker and D1 Database (
amba-feedback-db) athttps://api.ambadesk.com/v1/feedback. - Added SHA-256 defect fingerprinting and multi-client deduplication with zero Git thrashing.
- Added maintainer autonomous triage endpoint
GET /v1/triageand CLI triage tool (scripts/triage-telemetry.mjs) to generate daily decision dossiers for maintainers. - Published Maintainer Telemetry API reference (
docs/API/FEEDBACK_TELEMETRY_API.md) and Issue Triage SOP (docs/DEVOPS/ISSUE_TRIAGE_AND_INCIDENT_SOP.md).
- Added 1-click incident reporting button in
- Repository Governance & Cleanliness:
- Removed legacy sprint documentation (
docs/SPRINTS/) in favor of.agent/PLAN/milestone governance. - Synchronized Master Timeline Index and Kanban strict protocol across all agent guidelines.
- Removed legacy sprint documentation (
0.4.8 — 2026-09-09
- Site Core Concepts refresh & native Mermaid diagrams:
- VitePress now renders Mermaid fences as interactive diagrams (light/dark theme, zoom, copy source) instead of Shiki code blocks.
- Cognitive Modes documentation covers the 5-mode lifecycle (Auto, Ask, Study, Plan, Exec), the in-tree artifact factory, and 1+1 deliverable packs across English, Vietnamese, Japanese, and Korean.
- Security architecture diagrams are localized in all four languages, including Linux Secret Service and encrypted SQLite keychain fallback.
- Mermaid diagrams keep native readable type, expand clipped
foreignObjectlabels, and use compact vertical flowcharts so the last node is fully visible.
- Homepage app-icon parity:
- Navbar, favicon, hero, and footer now use the desktop 3D “A” icon (
src-tauri/icons/icon.png) instead of the legacy gold-star SVG.
- Navbar, favicon, hero, and footer now use the desktop 3D “A” icon (
- Executive Dossier commercial rebrand (ADR-026):
- Homepage, playbook showcase, and user-manual concept pages now present the 3-chamber Executive Dossier (Source Documents, Assistant's Workbench, Final Deliverables) across English, Vietnamese, Japanese, and Korean.
0.4.7 — 2026-09-08
- Business Deliverable Pack & Rigorous Verification Gate (ADR-025):
- Enforced mandatory 1+1 Deliverable Pack (Structured Model + Strategic Narrative) across autonomous playbooks.
- Implemented OpenXML sheet count verification gate in runtime runner to ensure generated workbooks meet declared structural depth.
- Added automatic companion vector PDF generation (
auto_compile_pdf_sibling) alongside Markdown briefings inoutput/. - Hardened deliverable extraction to filter out hypothetical recommendations or example file references.
- Brand Asset Refresh:
- Refreshed high-resolution application icons (
.icns,.ico,.png, and mobile icon suites).
- Refreshed high-resolution application icons (
- Version Alignment:
- Aligned release version strings to
0.4.7across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.6 — 2026-09-07
- Homepage & Site Component Overhaul:
- Refactored
HomeFooter.vuewith streamlined layout and improved visual hierarchy. - Enhanced
PlaybookShowcase.vuewith richer content and improved interactivity. - Added
ReleaseDownloads.vuecomponent for structured release asset presentation. - Expanded
custom.csswith additional responsive styles and visual polish. - Updated hero content in all locale index pages (
en,vi,ja,ko).
- Refactored
- Version Alignment:
- Aligned release version strings to
0.4.6across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.5 — 2026-09-07
- In-Tree Artifact Factory Industrialization & Roundtrip Harness (ADR-024):
- Added bi-directional roundtrip test suite (
tests/factory_roundtrip_tests.rs) verifying content invariance for native DOCX, PPTX, and Excel workbooks. - Implemented parameter tolerance across all factory tools: gracefully parses stringified JSON, 1D flat arrays, key-value rows, and loose LLM payload formats.
- Enhanced phantom-write guardrail: automatically intercepts script generation and guides the agent to invoke native artifact writers directly.
- Added bi-directional roundtrip test suite (
- In-App Factory Self-Test & Diagnostic Telemetry:
- Upgraded native diagnostic command
run_diagnostic_selftestindiagnostics.rsto execute live end-to-end generation and integrity verification for.xlsx,.docx, and.pptxfiles. - Added frontend diagnostics API (
runFactorySelftest) and verified with unit tests.
- Upgraded native diagnostic command
- Runtime Sandboxing & Relative Path Normalization:
- Automatically resolves relative paths against
scope.root_directoryfor deliverable generation across all execution modes.
- Automatically resolves relative paths against
- Version Alignment:
- Aligned release version strings to
0.4.5across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.4 — 2026-09-07
- Commercial Footer Architecture & Feedback Bridge (
ambadesk.com):- Overhauled
HomeFooter.vuewith Architecture & Feedback column linking directly to Project Harness (3-zone sandbox), Cognitive Modes, Live Release Manifest, and direct mail feedback bridge. - Purged all remaining third-party repository links from Privacy Policy (
privacy.md) and Terms of Service (terms.md), standardizing contact onambadesk.comand[email protected]. - Documented Cloudflare Pages deployment configuration in
site/DEPLOYMENT.md.
- Overhauled
- Version Alignment:
- Aligned release version strings to
0.4.4across core runtime, UI clients, manuals, and Cloudflare R2 distribution manifests.
- Aligned release version strings to
0.4.3 — 2026-09-07
- In-Tree Artifact Factory & Autonomous Autopilot Suite (ADR-021, ADR-023):
- Native DOCX compiler (
docx_writer.rs) for corporate documents, contracts, and administrative briefs with zero Python or LibreOffice dependencies. - Native PPTX compiler (
pptx_writer.rs) for executive slide decks with zero external runtime dependencies. - Dual-World filesystem bridge (
workings/working directory vs.output/user-facing deliverables) with auto-compilation and deliverable honesty guardrail.
- Native DOCX compiler (
- Hermetic SQLite-Vec Hybrid Engine & Dense Vector Retrieval (ADR-022):
- Embedded native
sqlite-vecextension (V009__sqlite_vec_memory.sql) enabling C-speed SIMD vector cosine distance and KNN search directly inside SQLite. - Hybrid RRF (Reciprocal Rank Fusion) combining keyword search with dense vector embeddings in
hybrid_engine.rs.
- Embedded native
- Interactive Code Block & Mermaid Diagram Viewers:
- Added
CodeBlockViewer.vueandCodeDocumentViewer.vuewith syntax highlighting, line numbers gutter, and 1-click copy. - Added client-side
MermaidDiagram.vuewith SVG vector rendering, error boundary, and raw source switcher.
- Added
- Homepage & Documentation Parity (
ambadesk.com):- Upgraded commercial landing page hero, feature showcase, and localized footer (
HomeFooter.vue). - Added Privacy Policy (
privacy.md) and Terms of Service (terms.md) across all 4 locales (en,vi,ja,ko). - Fixed CI/CD release updater pipeline across macOS, Windows, and Linux.
- Upgraded commercial landing page hero, feature showcase, and localized footer (
0.4.2 — 2026-09-06
- Built-In Fixture Diagnostic Self-Test (TASK-23):
- Added native Rust diagnostic command
run_diagnostic_selftestinsrc-tauri/src/commands/diagnostics.rsrunning a hermetic end-to-end reconciliation fixture locally (SQLite table ingestion, $50 discrepancy detection,.xlsxspreadsheet writing, vector.pdfcompilation, and sandbox path traversal guardrail). - Verifies host OS compatibility with zero external LLM API keys and 0 cloud token spend.
- Added interactive System Health Self-Test card in Settings (
SettingsPanel.vue) with 4-point live status checkmarks, execution duration (ms), and OS telemetry across all 4 locales (en,vi,ja,ko).
- Added native Rust diagnostic command
- Tool Display Localization & Translation Badges:
- Implemented internationalized display names, descriptions, and argument summaries for built-in tools across English, Vietnamese, Japanese, and Korean.
- Added
LocaleTranslateBadge.vueto indicate localized system tools cleanly in the UI.
- Linux Installation Documentation & Secret Service Parity (TASK-24):
- Added dedicated Linux installation guides (
.deb, standalone.AppImage) tosite/manual/getting-started/installation.mdacross all 4 locales (en,vi,ja,ko). - Documented Linux system requirements (
libwebkit2gtk-4.1-0,libssl3) and FreeDesktop D-Bus Secret Service integration with automatic fallback to local encrypted SQLite storage for minimal window managers (i3, sway, bspwm). - Aligned release version strings across client UI (
FeedbackModal.vue), locales, andsite/package.jsonto0.4.2.
- Added dedicated Linux installation guides (
0.4.1 — 2026-09-05
- Dedicated Multi-Platform CI/CD Pipeline & Architecture Independence:
- Separated release workflows into 4 independent pipelines: macOS Intel (
release-macos-intel.yml), macOS Apple Silicon (release-macos-arm.yml), Windows (release-windows.yml), Linux (release-linux.yml), and a unified All-in-1 orchestrator (release-all.yml). - Solved cross-compilation resource starvation on memory-constrained Intel runners by decoupling Apple Silicon builds to native ARM cloud environments.
- Eliminated interactive Keychain authorization and cache prompts on self-hosted macOS runners with automated headless keychain lifecycle and restored default keychain.
- Core framework production hardening and performance optimizations.
- Separated release workflows into 4 independent pipelines: macOS Intel (
0.3.9 — 2026-09-04
- Smart Multi-Platform Manifest Merge & Accurate Portal Download Links:
- Upgraded
scripts/update-latest-json-r2-local.mjsto fetch and merge existing remote platforms from Cloudflare R2, ensuring independent self-hosted builds never overwrite or wipe out other OS platform binaries. - Fixed portal download matrix (
ReleaseDownloads.vue) to resolve exact live versions per platform, preventing 404 errors for platforms pending independent build.
- Upgraded
0.3.8 — 2026-09-04
- Dedicated Multi-OS Self-Hosted Pipelines (macOS, Linux, Windows):
- Added dedicated macOS Self-Hosted release workflow (
release-macos-self-hosted.yml) running on[self-hosted, macOS, X64]with Intel x64 and cross-compiled Apple Silicon aarch64 support, Apple code signing, and notarization. - Added dedicated Linux / Ubuntu Self-Hosted release workflow (
release-linux-self-hosted.yml) running on[self-hosted, Linux, X64]with.deband.AppImagedistribution. - Decoupled self-hosted flows independently: all 3 OS platforms can now build on private self-hosted infrastructure with 0 GitHub Actions quota minutes consumed and automated Cloudflare R2 artifact synchronization.
- Added dedicated macOS Self-Hosted release workflow (
0.3.7 — 2026-09-04
- Full 4-Language Localization Parity (EN, VI, JA, KO):
- Added full Japanese (
ja— 日本語) and Korean (ko— 한국어) localized dictionaries, matching the commercial portal and user manual documentation (ambadesk.com). - Modularized locale dictionaries into
src/locales/{en,vi,ja,ko}.tsand exportedSUPPORTED_LANGUAGES. - Upgraded
AppShell.vuequick language segmented switcher (EN, VI, JA, KO) andSettingsPanel.vueappearance language cards. - Expanded unit test coverage in
useI18n.spec.tsto verify all 4 languages, dynamic parameter substitutions, and reactive locale switching.
- Added full Japanese (
- History vs Usage Navigation Decoupling & Execution Runs Pagination:
- Separated token analytics and cost tracking into a dedicated Usage (
/usage) view (UsagePanel.vue), while dedicating History (/history) to execution traces and event inspections (HistoryPanel.vue). - Added full pagination (10/25/50 items per page), status and project filtering, and query search for execution history.
- Separated token analytics and cost tracking into a dedicated Usage (
- Capital & Debt Financing Executive Suite:
- Added
capital-debt-financingproject template and runtime system directives for capital structure modeling, debt repayment schedules, and investor pitch deck preparation.
- Added
- Modal Reactivity & Global UI Spacing Standardization:
- Restored teleportation and tab switching reactivity across project configuration modals.
- Standardized fractional padding classes in
main.scss(p-3.5,gap-2.5, etc.) across all screens.
0.3.6 — 2026-09-03
- Portal Download Grid & Unified Action Button Styling:
- Re-designed download table with full grid borders and centralized action buttons.
- Standardized transparent ghost download buttons with hover effects and localized platform-specific labels.
0.3.5 — 2026-09-03
- Portal Download Section UI & Table Formatting Polish:
- Re-architected download matrix table with fixed layout, clean status badges, platform icons, and distinct primary/secondary download button styling.
- Enhanced responsive mobile view and typography across all 4 localized portals.
0.3.4 — 2026-09-03
- Full Multi-OS Download Matrix & Edge Proxy Resolution:
- Upgraded
ReleaseDownloads.vuematrix to directly support all 6 OS binary formats (macOS Apple Silicon, macOS Intel, Windows EXE, Windows MSI, Linux AppImage, Linux DEB). - Added Cloudflare Pages edge proxy
/api/latest.jsonto eliminate CORS issues and optimize client-side release manifest caching.
- Upgraded
0.3.3 — 2026-09-03
- CI Runner Disk Space & Cache Optimization:
- Added pre-build disk freeing step on Ubuntu runners (
ci.yml&release.yml) to prevent runner storage exhaustion. - Standardized on
swatinem/rust-cache@v2across all workflows.
- Added pre-build disk freeing step on Ubuntu runners (
0.3.2 — 2026-09-03
- Commercial Portal & Dynamic Cloudflare R2 Downloads Integration:
- Integrated dynamic
ReleaseDownloads.vuecomponent querying livehttps://r2.ambadesk.com/alpha/latest.jsonfor automatic real-time download resolution. - Complete 4-language VitePress site (
site/) with zero external GitHub references, enterprise business-first positioning, and 9 comprehensive user manual guides. - Added pilot distribution and deployment documentation (
docs/STRATEGY/anddocs/DEVOPS/).
- Integrated dynamic
0.3.1 — 2026-09-03
- Commercial Homepage & Manual Overhaul (Business-First, Zero-GitHub, Full i18n):
- Zero-GitHub Clean Surface: Purged all GitHub repository links, social icons, and release pointers across the entire commercial portal, replacing them with official direct desktop application downloads on
ambadesk.com. - Enterprise Business Target Alignment: Completely re-architected landing page value propositions and FAQ for non-technical enterprise users (CEOs, CFOs, Controllers, Media Agency Leads), focusing on 100% local privacy, zero-hallucination deterministic math, and ready-to-use business playbooks.
- 4-Language Multi-Lingual Architecture: Full VitePress internationalization for English, Vietnamese (
/vi/), Japanese (/ja/), and Korean (/ko/), translating the landing page and all 9 user manual guides and executive playbooks.
- Zero-GitHub Clean Surface: Purged all GitHub repository links, social icons, and release pointers across the entire commercial portal, replacing them with official direct desktop application downloads on
- Template Naming & Plan Review UX Refinements:
- Refined domain template labels and Vietnamese localization strings.
- Formatted Rust codebase according to standard
rustfmtguidelines. - Enhanced document viewer and plan referral card styling.
0.3.0 — 2026-09-03
- Milestone 2 — B2B Enterprise & Deterministic Accounting MCP Architecture:
- Deterministic SQLite Analytical Engine: Built native accounting calculation tools (
accounting_load_file,accounting_sql_query,accounting_reconcile_sheets) enabling 100% deterministic arithmetic aggregation, zero-mental-arithmetic guardrails, and automated invoice/bank reconciliation. - Persistent MCP Server Lifecycle Management: Configured SQLite storage (
V008__mcp_servers.sql), auto-reconnection on application launch, and complete ToolsPanel management controls. - Unified "Job & Brain" Paradigm Across Full Lifecycle: Replaced legacy "Assigned Agent" dropdowns with domain project templates (
executive-command-center,invoice-reconciliation,pnl-analysis,payroll-audit,media-planning-pitch) and hot-swappable cognitive brain models. - Cursor-Style Physical Plan Generation (
workings/plans/): Auto-exports structured plans toplan_{slug}_{hash}.md, displays compactPlanReferralCardin chat, and provides dedicated ⚡ Build / Execute Plan action in the file viewer. - Streamlined Cognitive Modes & Zero Thought-Dumping Clutter: Mode-gated auto-export strictly to
Planmode, eliminating scratchpad clutter inAskandStudymodes. - Calculation Audit Trail: Real-time verified badges, SQL code copying, and returned row counts in the Activity Tray.
- Deterministic SQLite Analytical Engine: Built native accounting calculation tools (
0.2.18 — 2026-09-03
- Context Prefetching & Heuristic Knowledge Distillation Hardening:
- Enhanced context prefetch error handling and adapter robustness in Rust runtime.
- Refined heuristic distillation tag generation and whitespace cleanup across multi-language prompts.
- Fixed unused warning imports in updater and memory IPC commands.
0.2.17 — 2026-08-31
- Automated Cloudflare R2 Deployment Pipeline (
deploy-r2):- Added automated
deploy-r2job in release workflows to sync release bundles,.sigsignatures, and rewrittenlatest.jsondirectly to Cloudflare R2 (https://r2.ambadesk.com/alpha/). - Optimized cache-control policies (
no-cacheforlatest.json, 1-year immutable cache for binaries). - Added
scripts/update-latest-json-r2-local.mjsfor local asset URL rewriting.
- Added automated
0.2.16 — 2026-08-31
- Automated Cloudflare R2 Download URL Rewriting in latest.json:
- Implemented
scripts/rewrite-latest-json-r2.mjsto automatically rewrite asset download URLs inlatest.jsonfrom GitHub releases tohttps://r2.ambadesk.com/alpha/<filename>. - Integrated into both
release-windows-self-hosted.ymlandrelease.ymlworkflows.
- Implemented
0.2.15 — 2026-08-31
- In-App Auto-Update Verification Release:
- Incremented version for end-to-end testing of OTA in-app updater download, signature check, and SQLite WAL-safe restart workflow.
0.2.14 — 2026-08-31
- Dedicated R2 Alpha Updater Endpoint Integration:
- Updated in-app auto-updater endpoint to
https://r2.ambadesk.com/alpha/latest.jsonfor high-availability CDN-accelerated OTA updates.
- Updated in-app auto-updater endpoint to
0.2.13 — 2026-08-30
- In-App Auto-Update Packaging Artifacts & Minisign Key Hardening:
- Configured
bundle.createUpdaterArtifacts: trueintauri.conf.jsonto generate compressed OTA update bundles (.tar.gzand.sigsignatures). - Hardened private key password handling (
TAURI_SIGNING_PRIVATE_KEY_PASSWORD) in release workflows. - Added
.gitignorerule for public/private key pairs (*.key.pub).
- Configured
0.2.12 — 2026-08-30
- Manual Deploy Workflow Dispatch Control:
- Temporarily commented out automatic tag push triggers across release workflows.
- Releases are dispatched manually on-demand from GitHub Actions UI to prevent unwanted quota consumption.
0.2.11 — 2026-08-30
- Windows Self-Hosted Toolchain & Git Bash Hardening:
- Automatically locates and adds Git Bash (
bash.exe) intoGITHUB_PATHon on-premise Windows runners. - Standardized on
actions-rust-lang/setup-rust-toolchain@v1with explicitstable-x86_64-pc-windows-msvctarget enforcement for Windows self-hosted builds.
- Automatically locates and adds Git Bash (
0.2.10 — 2026-08-30
- Dedicated Standalone Self-Hosted Windows Release Workflow:
- Separated self-hosted Windows packaging into a standalone workflow (
.github/workflows/release-windows-self-hosted.yml) that bypasses GitHub-hosted runner quota limitations completely. - Runs directly on on-premise Windows runners (
['self-hosted', 'Windows', 'X64']) with 0 GitHub Actions quota minutes consumed.
- Separated self-hosted Windows packaging into a standalone workflow (
0.2.9 — 2026-08-30
- Self-Hosted Windows Runner Pipeline Integration:
- Added support for dedicated self-hosted Windows runners (
['self-hosted', 'Windows', 'X64']) alongside standard GitHub-hostedwindows-latestrunners. - Interactive platform selection allows dispatching dedicated builds directly to local/on-premise Windows runners while maintaining GitHub Actions standard runners as default for automated releases.
- Added support for dedicated self-hosted Windows runners (
0.2.8 — 2026-08-30
In-App Auto-Update & Over-The-Air (OTA) Release Architecture (ADR-019):
- Self-Updating Without Reinstallation: Desktop app can now check, download, and install updates in-place without requiring the user to re-download
.dmg,.exe, or installer packages manually. - Cryptographic Minisign Verification: Every update payload is cryptographically validated using Ed25519 signatures before execution, safeguarding against unauthorized or tampered binaries.
- Safe Database Restart: Implemented atomic SQLite WAL checkpoint flushing (
PRAGMA wal_checkpoint(TRUNCATE);) before app relaunch to ensure 0 database corruption. User projects (~/AMBA/Projects), local databases, and keychain credentials are 100% preserved across updates. - Interactive Update Modal (
UpdateModal.vue): Displays version change badges, release notes preview, and real-time streaming download progress bar with byte counts and percentage. - Settings Integration: Added manual "Check for Updates" button, last checked timestamp, and auto-check toggle on startup under Settings > Advanced.
- Complete Bilingual Localization: Fully translated in English and Vietnamese.
- 100% Verification: 144 Rust unit tests passing and 94 Vitest tests passing with 0 clippy warnings.
- Self-Updating Without Reinstallation: Desktop app can now check, download, and install updates in-place without requiring the user to re-download
High-Fidelity Excel & Multi-Sheet Preview Engine Hardening:
- Shared OpenXML Relationship Resolution: Unified
read_project_spreadsheet,read_project_docx, andread_project_presentationincommands/projects/readers.rsto reuse the battle-tested shared context adapter engine (parse_xlsx_workbook_from_zip,parse_legacy_spreadsheet_file). - Fixed Sheet Mismatch in Preview: Resolved the critical issue where
workbook.xml.relsrelationship IDs (r:id) were ignored by the preview command, which previously led to sheets being displayed out-of-order and mapped to incorrect worksheet XML files. - Accurate Cell Coordinates & Blank Gap Handling: Replaced split-based cell parsing with exact
r="A1"coordinate positioning, eliminating column left-shifts and alignment corruption. - Support for Multi-Format Spreadsheets: Extended in-app preview support to
.xlsx,.xlsm,.xltx,.xls,.xlsb,.ods,.tsv, and.csv. - 100% Verification: All 136 Rust tests and 84 Vitest tests passing with 0 clippy warnings.
- Shared OpenXML Relationship Resolution: Unified
Master Release Plan Execution & Modular Architecture Hardening (Sprint 37):
Comprehensive Rust Runtime Modularization (Wave 1):
- Split
runtime/execution.rs(3478 lines) intoruntime/execution/(runner.rs,planning.rs,modes.rs,tools.rs,callbacks.rs,streaming.rs,tests.rs). - Split
storage/db.rs(2492 lines) intostorage/db/(mod.rs,migrations.rs,agents.rs,models.rs,conversations.rs,runs.rs,projects.rs,memory.rs,policy.rs,tests.rs). - Split
context/adapters/shared.rsintocontext/adapters/shared/(tables.rs,xlsx_zip.rs,docx_zip.rs,pptx_zip.rs,tests.rs). - Split
tools/pdf_compiler.rsintotools/pdf_compiler/(parser.rs,fonts.rs,rendering.rs,tests.rs). - Split
commands/projects.rsintocommands/projects/(crud.rs,files.rs,readers.rs,watchers.rs,export.rs,tests.rs).
- Split
Ask Mode Knowledge Ingestion & Web Search Enhancement:
- Enabled
web.search,web.fetch, andknowledge.searchinAskmode for general information retrieval. - Added interactive "📖 Study & Ingest Knowledge" button on assistant messages in
ProjectChat.vueto easily transition insightful chat responses into the project's permanent knowledge base.
- Enabled
Release Governance & Open Source Standards (Wave 2 & Wave 3):
- Fixed duplicate ADR numbering by renumbering workspace default directory ADR to
ADR-018. - Added
CONTRIBUTING.mdandCODE_OF_CONDUCT.mdat repository root. - Created GitHub issue templates (
bug_report.md,feature_request.md,security.md) and standard pull request templatePULL_REQUEST_TEMPLATE.md. - Created root
SECURITY.mdand completed full audit report indocs/SECURITY-AUDIT.md.
- Fixed duplicate ADR numbering by renumbering workspace default directory ADR to
Full Test Suite & Quality Verification: All 135 Rust unit tests and 84 Vitest tests passing with 0 warnings on
cargo clippy --all-targets -- -D warnings.Replaced 3-Mode System: Upgraded the previous
Analyze/Draft/Finalizesystem into 4 distinct cognitive modes tailored to professional knowledge workflows:- 🗣️ Ask Mode (
ask): Conversational Q&A, brainstorming, concept explanation. Zero filesystem side effects; file writes, web tools, and knowledge storage are strictly blocked. - 📖 Study Mode (
study): Deep research, reasoning, document inspection, and knowledge discovery from all available sources. Autonomously callsknowledge.storeto ingest facts and domain concepts into the project's long-term memory. Allows writing notes and summaries toworkings/. - 📋 Plan Mode (
plan): Analyzes requirements and produces structured<plan>blocks with numbered steps and deliverable definitions. Writes plan artefacts toworkings/plan.md. Direct writes tooutput/and PDF compilation are blocked. - ⚡ Exec Mode (
exec): Follows the approved plan, reads source files (input/) and working papers (workings/), produces intermediate artifacts, and writes final approved deliverables intooutput/. Full write access, PDF generation, and policy-gated shell enabled.
- 🗣️ Ask Mode (
Strict Rust Runtime Permission Matrix (
runtime/execution.rs): Hard engine-level guards block disallowed tool calls per mode before execution, with explanatory violation messages guiding the model to the appropriate workflow.Backward-Compatible Migration: Automatic deserialization and localStorage migration for legacy mode strings (
"analyze"→Ask,"draft"→Plan,"finalize"→Exec).Initial Mode Selection Wizard (
ProjectCreateModal.vue): Users choose their preferred initial agent mode when creating a new project, with persistent last-used mode per project thereafter.Execute Plan UI Banner & 4-Button Toolbar (
ProjectChat.vue): Replaced the 3-button segmented controller with 4 mode buttons and updated the confirmation banner to "Execute Plan" when structured plans or workings files are ready.Full Bilingual Localization & ADR-012 Update: Added comprehensive English and Vietnamese translations and updated ADR-012. All 134 Rust tests and 84 Vitest tests passing.
Session Clean Up & Semantic Memory Reset Architecture (Sprint 35):
- Granular Session & Memory Management: Added a dedicated Clean Up Session & Memory modal (
ResetSessionModal.vue) across Project Studio and Agent Studio for clean, isolated prompt re-testing. - Customizable Reset Granularity: Users and developers can choose between:
- 💬 Clear Chat Messages: Wipes conversational message history and tool activity in the active session.
- 🧠 Wipe Project Semantic Memory: Erases all auto-stored RAG semantic memories attached to the project (with live entry count preview) to prevent the agent from recalling stale prior context or old instructions.
- ➕ Start New Clean Session: Creates and switches to a fresh new session in one click.
- Memory Panel Clean Up Tools: Added 1-click Clear All Memories in
MemoryPanel.vueto wipe long-term knowledge across all agents/projects. - Backend Storage & IPC Commands: Implemented
clear_project_memories,clear_agent_memories,clear_all_memories,count_project_memories, andreset_sessionwith atomic SQLite execution and 100% test coverage. - Full Bilingual Localization: Added complete English and Vietnamese translations for all reset actions, modals, and notifications.
- Granular Session & Memory Management: Added a dedicated Clean Up Session & Memory modal (
Interactive Agent Clarification & Direction Confirmation (
ask_userFeature — Sprint 34):- Cursor / Antigravity Style Clarification: AI agents can now pause and ask the user structured multiple-choice questions with recommended directions and custom write-ins whenever requirements have multiple paths, ambiguous parameters, or high-impact decisions.
- Non-Blocking Runtime Suspension: Execution loop non-blockingly suspends on
ask_user/ask_question, transitionsRunStatustoawaiting_input, and emitsrun:questionIPC event over an asynctokio::sync::oneshotchannel without occupying background execution threads. - Inline Interactive Question Card (
InteractiveQuestionCard.vue):- Displays bold question prompt and background context block.
- Multiple-choice option cards with
⭐ Recommendedbadges, radio/checkbox selectors, and detailed option descriptions. - Custom write-in input field for freeform guidance.
- "Confirm & Continue" button to resolve question and seamlessly resume the agent's ReAct execution loop.
- Post-submission freeze state showing a neat confirmation checkmark and user note summary.
- Comprehensive Multi-Language & Test Coverage: Added English and Vietnamese localizations, 3 new Rust unit tests (129 total), 5 new Vitest unit tests (74 total), and strict TypeScript typechecking.
Comprehensive Office Document & Data Parsing Architecture (Sprint 33):
- Zero-Copy Streaming SAX XML Engine: Replaced fragile string splitting across all OpenXML parsers with high-performance
quick-xmlevent loops. - High-Accuracy Spreadsheet Engine (
.xlsx,.xlsm,.xltx,.xls,.xlsb,.ods):- Full
xl/sharedStrings.xmlparser supporting rich text<r><t>and standard<si><t>. - Merged cell rectangular expansion (
<mergeCells>) propagating top-left cell values across merge ranges. - Number format resolution (
xl/styles.xml+ standard & custom<numFmts>) for currency ($#,##0.00,₫,€), percentages (0.0%,0.00%), dates, times, comma integers, and decimals. - Multi-sheet discovery and table extraction with configurable row limits.
- Pure-Rust legacy spreadsheet parsing (
.xlsBIFF8/OLE2,.ods,.xlsb) viacalamine.
- Full
- Structured Word Document Engine (
.docx,.docm,.dotx,.doc):- Semantic structure extraction with Markdown headings (
#,##,###), nested bullet/numbered lists (-), bold (**), and italics (*). - Table matrix extraction and Markdown table formatting with pipe escaping.
- Ancillary text stream recovery: headers (
word/header*.xml), footers (word/footer*.xml), and footnotes (word/footnotes.xml). - Legacy Word 97-2003 binary stream parsing (
.doc) viacfbOLE2 reader.
- Semantic structure extraction with Markdown headings (
- Presentation Engine (
.pptx,.pptm,.potx,.ppt):- Slide sequencing and structure extraction (
ppt/presentation.xml,ppt/slides/slide*.xml). - Slide titles, body paragraphs, bullet points, and embedded table matrices.
- Speaker notes extraction (
ppt/notesSlides/notesSlide*.xml). - Legacy PowerPoint binary stream parsing (
.ppt) viacfb.
- Slide sequencing and structure extraction (
- Enhanced RFC-4180 CSV / TSV Engine (
.csv,.tsv,.tab):- Multi-line quoted string support with escaped quotes (
""). - Automatic delimiter detection (
,,;,\t).
- Multi-line quoted string support with escaped quotes (
- Enhanced PDF Context Ingestion (
.pdf):- Tabular line alignment detection heuristics with Markdown table formatting.
- Page boundary annotations (
--- Page N ---) and scanned image detection fallback.
- Unified Agent Tools & UI Previews:
filesystem_readtool routes all office formats to appropriate structured context adapters.- UI preview commands (
read_project_spreadsheet,read_project_docx,read_project_pptx) deduplicated to use shared parsing engine.
- 126 Passing Rust Unit Tests & 69 Passing Vitest Tests: 100% clean test passes with 0 compiler warnings.
- Zero-Copy Streaming SAX XML Engine: Replaced fragile string splitting across all OpenXML parsers with high-performance
Live Loop Streaming & Expandable Activity/Reasoning Tray (Cursor/Antigravity Style):
- Real-Time Step Activity Stream: Upgraded execution loop to stream intermediate model thoughts (
<thought>...</thought>) and live tool invocations (filesystem_read,filesystem_write,web_search,mcp, etc.) into an interactive timeline instead of wiping stream buffers. - Expandable Activity Tray (
AgentActivityTray.vue): Built a sleek, collapsible activity tray inside the assistant chat bubble:- Live pulsing spinner and step counter during execution (
Step 2/8: Reading source files...). - Collapsed summary badge upon completion (
⚡ 3 actions executed • 4 steps • Thought for 4.2s). - Expandable timeline of steps with full thought inspection, tool action cards with status badges (
Success,Running,Error), and 1-click syntax-highlighted JSON payload viewer. - 1-Click Copy full execution activity log.
- Live pulsing spinner and step counter during execution (
- Clean Deliverable Isolation: Main chat bubble renders only final clean Markdown deliverables without leaking raw XML tags or intermediate tool dumps.
- Historical Activity Persistence: Preserved structured step activities in SQLite
messages.metadata["steps"], ensuring past conversations reload the full activity timeline across app restarts. - ADR-017: Documented architecture and design decisions in
docs/DECISIONS/ADR-017-live-loop-streaming-and-expandable-activity-tray.md.
- Real-Time Step Activity Stream: Upgraded execution loop to stream intermediate model thoughts (
Token & Context Management Architecture (Sprint 32):
- Database Migration V007: Added
runs.project_id,model_pricingseed table with 11 default frontier models across OpenAI, Anthropic, and Google, and project budget threshold columns (token_budget_warning_threshold,cost_budget_usd_threshold). - Dynamic Real-Time Pricing Engine: Rust runtime computes accurate USD costs per run and per project dynamically from the
model_pricingdatabase table. - Per-Project Token Isolation & Analytics: Added
get_project_token_analytics,list_model_pricing,update_model_pricing, andset_project_budget_thresholdsTauri IPC commands. - Context Budget Breakdown: Added
calculate_context_breakdownandget_context_breakdowncalculating real-time token saturation across System instructions, User prompt, Project files, Conversation history, and RAG semantic memory. - Interactive In-Studio Context Meter: Added
ContextMeter.vuetoProjectHeader.vuedisplaying live context window utilization and project cumulative cost badges. - Context Inspector Modal: Built
ContextInspectorModal.vuefeaturing a multi-segment progress bar and token usage breakdown by layer with available headroom metrics. - Activity Panel Project Scoping & Quota Alerts: Enhanced
ActivityPanel.vuewith a Project Filter dropdown and warning alert banners when project token or cost thresholds are exceeded. - 116 Passing Rust Tests & 62 Vitest Tests: Verified full test suite with 100% clean passes.
- Database Migration V007: Added
Harness Architecture Hardening & Quality Audit (Sprint 31):
- Comprehensive Multi-Layer Audit: Verified 100% architectural conformance across Rust ReAct execution engine, 3-zone harness file management (
input/,workings/,output/), stagnation detection, autonomous nudging, and sandboxing. - Unified Mode Routing Guard: Extended Rust runtime routing intercept to enforce strict
output/write blocking onpdf_generatein Draft mode alongsidefilesystem_write. - Standalone Execution Scope: Added
projectIdtoStartRunRequestallowing project sandbox scoping for direct API/CLI execution without pre-existing conversations. - Type & Navigation Fixes: Fixed
HistoryView.vuerouting to displayActivityPanel.vue, and addedprojectIdtoConversationdomain model. - 114 Passing Rust Tests: Added new test fixture for
pdf_generatedraft mode output routing.
- Comprehensive Multi-Layer Audit: Verified 100% architectural conformance across Rust ReAct execution engine, 3-zone harness file management (
OpenAI Reasoning & Modern Models Compatibility (
max_completion_tokens):- Replaced legacy
max_tokenswith standardmax_completion_tokensacross all OpenAI Chat Completions requests. - Added native support for OpenAI reasoning models (
o1,o3-mini,o1-mini,o1-preview):- System prompts automatically mapped to the
developerrole. - Omitted custom
temperatureparameters for reasoning models to eliminate 400 Bad Requestunsupported_parametererrors.
- System prompts automatically mapped to the
- Replaced legacy
Dynamic Provider Model Discovery & Custom Model Creation:
- Added live
GET https://api.anthropic.com/v1/modelsfetching infetch_provider_models. - Added custom model ID creation input in Settings for all providers.
- Added live
0.2.7 — 2026-08-24
Apple Developer ID Code Signing & Automatic Notarization Pipeline:
- Integrated full Apple Developer ID code signing into GitHub Actions workflow (
.github/workflows/release.yml) for macOS Apple Silicon (aarch64) and Intel (x86_64). - Automated Apple Notary Service (
notarytool) submission and ticket stapling, eliminating Gatekeeper quarantine blocks and "damaged app" warnings on modern macOS (Sequoia, Sonoma, Ventura). - Configured secure keychain management in CI for
.p12certificates and Apple Team credentials.
- Integrated full Apple Developer ID code signing into GitHub Actions workflow (
Linux Packaging Dependency Fix & CI Speed Boost:
- Updated Debian packaging dependencies in
tauri.conf.jsonto use modernlibayatana-appindicator3-1. - Integrated
swatinem/rust-cache@v2into.github/workflows/release.ymlwith per-target workspace caching, reducing Rust compilation times on CI by ~70-80%. - Added pnpm store caching (
cache: 'pnpm') in GitHub Actions to accelerate Node.js dependency installations. - Standardized NSIS Windows installer languages (
English,Vietnamese).
- Updated Debian packaging dependencies in
Standardized Universal
snake_caseTool Naming Architecture:Replaced dot-notation tool names with standard
snake_case(filesystem_read,filesystem_write,filesystem_glob,pdf_read,pdf_generate,shell_execute,web_search,web_fetch,math_calculate,system_time,system_info,knowledge_store,knowledge_search).100% universal compatibility across all LLM providers (Anthropic Claude
^[a-zA-Z0-9_-]{1,128}$, Google Gemini^[a-zA-Z0-9_]+$, OpenAI, Ollama, DeepSeek).Built-in bidirectional alias fallback in
ToolRegistryandPolicyEngineensuring seamless backward compatibility for legacy packages and prompts.Updated package validator, agent manifests (
packages/examples/), and system prompt planning instructions.Hard 20MB Safety Guard:
- Hard preview limits (
MAX_IN_APP_PREVIEW_SIZE_BYTES = 20MB) enforced in all Rust commands and frontend router to protect system memory and prevent UI freezes when users encounter multi-hundred-megabyte or gigabyte files. - Large files display a dedicated 1-click fallback card to launch in the OS default desktop application or show containing folder.
- Hard preview limits (
Word Document Viewer (
WordDocumentViewer.vue):- Formatted document viewer for
.docxand.docfiles extracting paragraphs, headings (H1-H3), and tables from OpenXMLword/document.xml. - Document statistics (word count, paragraph count, reading time) with 1-click copy and open in Microsoft Word.
- Formatted document viewer for
PowerPoint Presentation Viewer (
PresentationViewer.vue):- Multi-slide deck viewer for
.pptxand.pptwith slide thumbnails sidebar, 16:9 canvas layout, slide navigation controls, and full outline export.
- Multi-slide deck viewer for
Interactive Spreadsheet Viewer (
SpreadsheetViewer.vue):- Multi-sheet workbook navigation (
.xlsx,.xls,.csv,.tsv), real-time keyword filtering, column sorting, pagination, and copy as Markdown table / CSV.
- Multi-sheet workbook navigation (
0.2.3 — 2026-08-22
Smart Multi-Platform Matrix Dispatch & Selective Re-run (
.github/workflows/release.yml)- Added interactive
workflow_dispatchplatform selector: 1-click build all 4 targets simultaneously (all) or trigger individual OS rebuilds (windows,macos-apple-silicon,macos-intel,linux) on demand. - Zero-second skip optimization: skipped platforms exit immediately in 0 seconds without consuming GitHub Actions runner minutes.
- Native
fail-fast: falseresilience: successful OS installer artifacts remain preserved and uploaded to GitHub Draft Releases even if one platform encounters a transient failure.
- Added interactive
WebView Print PDF Export (ADR-016)
- User-facing PDF export now uses the browser's native print pipeline via an isolated print window, guaranteeing visual fidelity with the Markdown preview. Preview and PDF share the same parser (
MarkdownMessage.vue), CSS, fonts, and layout engine. - Typed
PdfOptionsmodel: page size (A4, A5, Letter, Legal), orientation (portrait/landscape), configurable margins, scale, print backgrounds, headers/footers. - Print CSS with standard
@pagerules, page-break control for headings/code/tables, and proper print typography. - Comprehensive regression test fixture suite: 18 Markdown fixtures covering basic, headings, lists, tables, code, blockquotes, links, long documents, images, math, edge cases, and internationalization (Vietnamese, Japanese, Chinese, Korean, Arabic, emoji).
- Rust
PdfExportertypes with platform abstraction (pdf_export.rs): structured errors, cross-platform capability info, serde-compatible options. - 15 new Rust tests (fixture validation + PDF compilation) and 11 new Vitest tests.
- The Rust
printpdf+cosmic-textcompiler remains available for the agent API (pdf.generate), where no WebView is available. - Cross-platform: macOS uses native
WKWebView.printOperationon the isolated print window (window.print()is a no-op in WKWebView); Windows uses WebView2window.print()("Microsoft Print to PDF"); Linux uses WebKitGTKwindow.print()("Print to File"). PDFs are not pixel-identical across platforms because the underlying WebView engines differ. - The print window is a scrollable preview with Print / Save PDF and Close. It does not auto-print. Payload is delivered via Tauri events (
print-ready/print-document), notsessionStorage. - Known limitations: page numbering not supported via CSS (relies on the browser's native print header/footer); the print dialog requires user interaction.
- User-facing PDF export now uses the browser's native print pipeline via an isolated print window, guaranteeing visual fidelity with the Markdown preview. Preview and PDF share the same parser (
Multi-Platform OS Support & Automated Release Pipeline (ADR-015)
- Windows 10/11 Packaging: Configured user-friendly NSIS installer (
.exe) with multi-language setup (English & Vietnamese) and enterprise WiX (.msi) deployment target. - Cross-Platform Release Automation (
.github/workflows/release.yml): Automated 4-way CI/CD build matrix bundling native binaries for Windows x64, macOS (Apple Silicon & Intel), and Linux (.AppImage,.deb). - Platform Architecture Guide (
docs/ARCHITECTURE/platforms.md): Comprehensive specifications covering runtime path normalization, Credential Vault integration across OSes, and local build instructions.
- Windows 10/11 Packaging: Configured user-friendly NSIS installer (
Native vector PDF compiler (ADR-014)
- Export PDF and
pdf.generatecompile markdown to a real vector PDF: selectable Unicode text, embedded subset fonts, tables, code, lists, quotes, links, bookmarks, and local images. - WKWebView print-to-PDF was withdrawn after it hung the app and wrote huge broken files. html2canvas snapshots are no longer on the export path.
- Vietnamese, Japanese, and other OS-available scripts use bundled Noto Sans plus system fonts. CJK megafonts are still not bundled (ADR-009).
- If the compiler fails, export falls back to the cosmic-text JPEG rasterizer.
- Community in-process crates were measured and not adopted:
markdown2pdfdropped Japanese (macOS.ttcfonts); Typst passed Unicode but added ~39 MB to a stripped release binary.
- Export PDF and
Interactive HTML Webpage & Native PDF In-App Document Previews (ADR-013)
- Interactive HTML Viewer (
HtmlDocumentViewer.vue):- Embedded sandboxed webpage rendering for
.htmland.htmdeliverables. - Responsive Viewport Toggles: Desktop (100%), Tablet (768px), and Mobile (375px) device preview frames.
- Dual View Modes: Segmented toggle between Webpage View (Rendered iframe) and Source Code (Raw HTML with syntax styling).
- Interactive Controls: Reload frame, 1-click Copy HTML, Open in Default Browser, and Maximize/Fullscreen mode.
- Embedded sandboxed webpage rendering for
- Native Lightweight PDF Viewer (
PdfDocumentViewer.vue):- Directly embeds PDF deliverables into Project Studio via native webview blob rendering with zero external library overhead.
- Full native PDF feature support: zoom, in-document search, page navigation, print, and download.
- Binary File Preview API (
commands/projects.rs,services/api/projects.ts):- Added
read_project_file_base64Tauri IPC command for fast binary streaming of PDF and document assets.
- Added
- Interactive HTML Viewer (
Unicode PDF export for markdown deliverables
- Historical note: preview capture previously used html2canvas + per-script system fonts; agent
pdf.generatepreviously rasterized via cosmic-text. Both are superseded as the primary path by the vector compiler (ADR-014). The rasterizer remains a fallback. - Known limitation: machines without CJK (or Arabic/Thai) system fonts may still show missing glyphs for those scripts; AMBA does not bundle CJK megafonts (ADR-009).
- Historical note: preview capture previously used html2canvas + per-script system fonts; agent
Project-Scoped Semantic Memory Isolation & Cascade Deletion
- Two-Tier Scoped Memory Engine (
runtime/memory.rs,runtime/rag.rs,runtime/execution.rs):- Project-Scoped Memory (
project:{project_id}:*): Interaction history and RAG memories generated within a project are tagged withprojectId. RAG retrieval within a project only queries the active project's memories plus global user knowledge, strictly isolating projects and preventing cross-project context bleeding. - Global Memory (
global:*): Non-project conversations only retrieve global knowledge, preventing project scratchpad data from polluting general workspace chats.
- Project-Scoped Memory (
- Automatic Memory Cascade Deletion (
storage/db.rs,commands/projects.rs):- Deleting a project automatically purges all semantic memory entries, embeddings, and interaction logs belonging to that project (
DELETE FROM semantic_memory WHERE key LIKE 'project:' || ?1 || ':%' OR json_extract(value_json, '$.projectId') = ?1).
- Deleting a project automatically purges all semantic memory entries, embeddings, and interaction logs belonging to that project (
- Two-Tier Scoped Memory Engine (
Native In-App Markdown Document Viewer & Reader Mode (ADR-013)
- Document-Grade Markdown Viewer (
MarkdownDocumentViewer.vue):- High-quality document typography for reading agent-generated reports, meeting notes, and analysis documents directly inside Project Studio.
- Formats headings (
H1-H4), tables, task lists, blockquotes, and code blocks with 1-click copy. - Reading Controls: Toggle between Document View and Raw Source, dynamic Table of Contents (TOC) navigation, word count & reading time calculation, 1-click Copy Document, and Maximize/Fullscreen mode.
- Inline Deliverable Integration (
DeliverablePreview.vue):- Automatically detects
.md,.markdown, and.txtfiles ininput/,workings/, andoutput/and renders the rich viewer inline instead of requiring external OS software.
- Automatically detects
- Backend Safe File Content API (
commands/projects.rs):- Added
read_project_file_contentTauri command with canonical path traversal validation and 10MB memory safety limits.
- Added
- Document-Grade Markdown Viewer (
Dual-Option Project Deletion Modal & Physical Disk Removal
- Dedicated Project Deletion Dialog (
ProjectDeleteModal.vue):- Replaced browser
confirm()with a custom modal asking the user to choose their deletion method. - Option 1 (App-Only / Safe): Removes the project tracking from AMBA while preserving all physical files on disk.
- Option 2 (Full Physical Deletion / Danger): Completely deletes the project from AMBA and permanently removes the project folder and all contained files on disk.
- Replaced browser
- Backend Disk Cleanup Guard (
commands/projects.rs):delete_project(project_id, delete_files: bool)safely resolves the directory path and performsstd::fs::remove_dir_allwith guard checks against deleting system roots or user home directory.
- Dedicated Project Deletion Dialog (
Strict Agent Execution Modes & Two-Stage Output Finalization Gate (ADR-012)
- Three-Stage Agent Workflow Modes (
AgentMode):analyze(Analyze Only): Pure chat exploration & Q&A. Writing files is forbidden at runtime.draft(Draft & Workings — Default): Agent prepares intermediate spreadsheets, calculations, and drafts inworkings/. Writing directly tooutput/is blocked with hard runtime enforcement.finalize(Approve & Finalize): Agent inspects working drafts, automatically receives allworkings/files as context, and generates polished final deliverables inoutput/.
- Project Studio Mode Controller & 1-Click Finalization (
ProjectChat.vue):- Mode segmented button group above chat input with project-level persistence.
- Automatic "Working Drafts Ready for Review" banner with 1-click "Approve & Finalize" action button when files are discovered in
workings/.
- Hard Enforcement at Rust Runtime (
runtime/execution.rs):- Intercepts
filesystem.writetool requests before dispatch and returns actionable mode-routing error feedback to guide the LLM.
- Intercepts
- Three-Stage Agent Workflow Modes (
Central Default Workspace Directory & 1-Click Project Scaffolding (ADR-018)
- Default Workspace Root (
~/AMBA/Projects/~/Documents/AMBA Projects):- Centralized project root managed in SQLite and configurable via Settings (
SettingsPanel.vue). - Added Tauri commands
get_default_workspace_dirandset_default_workspace_dir.
- Centralized project root managed in SQLite and configurable via Settings (
- Dual-Mode Project Creation Wizard (
ProjectCreateModal.vue):- Mode 1 (Auto Workspace — Default): Automatically derives sanitized folder names from project title (
<WorkspaceRoot>/<Project-Name>) with live path preview and creates directories automatically on submit. - Mode 2 (Custom Location): Power-users can link existing Git repositories, external hard drives, or custom folders on disk.
- Mode 1 (Auto Workspace — Default): Automatically derives sanitized folder names from project title (
- Workspace Settings in Advanced Tab (
SettingsPanel.vue):- Displays current workspace directory with 1-click "Change Location…" dialog and "Open Folder" OS launcher.
- Default Workspace Root (
Project File Management & Real-time Auto-Sync with VS Code-Grade Drag-and-Drop
- Real-time Project File Watcher (
notify = "6.1",runtime/watcher.rs):- Automatic non-polling filesystem watcher detects file creation, modification, deletion, and renaming across all project directories (
input/,workings/,output/). - Debounces bursts (300ms window), synchronizes SQLite records, and broadcasts
project:files-updatedTauri events to all active windows. - Added live "LIVE" sync indicator badge in the Harness Explorer header.
- Automatic non-polling filesystem watcher detects file creation, modification, deletion, and renaming across all project directories (
- VS Code-Grade Hierarchical File Explorer (
FileTreeItem.vue,buildFileTree):- Replaced flat lists with deep nested folder trees supporting arbitrary subdirectories.
- Expandable/collapsible directories with icon states and indentation guidelines.
- Quick action toolbars on hover:
+ New File,+ New Folder,Rename,Delete,Open in OS.
- Full Drag & Drop Capabilities:
- External OS Drop: Drag files and folders directly from Finder / File Explorer / Desktop into specific zones or nested directory nodes.
- Internal Reorganization: Drag files/folders between zones or into subfolders to move them on disk (
move_project_path). - Drag-to-Chat Context Injection: Drag any file node from the explorer tree directly into the Chat prompt area to automatically insert context
@<relative_path>tags.
- Comprehensive File Operations API:
- Added Tauri commands
create_project_file,create_project_folder,rename_project_path,delete_project_path,move_project_path, andimport_project_fileswith strict path traversal validation.
- Added Tauri commands
- Real-time Project File Watcher (
Security & Permission Matrix — Granular Capability Scopes (ADR-010)
- Orthogonal Permission Matrix: Deprecated linear hierarchical scope levels in favor of 4 independent capability dimensions:
- Filesystem Access Scope:
Project Sandbox Only(strictly restricted toinput/,workings/,output/) vs.Full Local Disk. - Network & Web Search (
allow_internet: bool): Independent toggle allowing the Agent to safely search the web and fetch online documentation from within the sandbox without requiring full OS privileges. - Terminal / Shell Execution (
allow_shell: bool): Independent toggle gatingshell.executecommands (default disabled with security alerts). - External MCP Plugins (
allow_mcp: bool): Independent toggle gating external Model Context Protocol tool invocations.
- Filesystem Access Scope:
- Interactive Security UI (
ProjectHeader.vue&ProjectCreateModal.vue): Added quick security capability badge chips in the Project Studio header and an on-the-fly Security & Capabilities modal for toggling individual permissions during active sessions.
- Orthogonal Permission Matrix: Deprecated linear hierarchical scope levels in favor of 4 independent capability dimensions:
Phase 8: Production Polish & Performance Scale — Sprint 29: Advanced Desktop UI & Keyboard Navigation
- Command Palette (
CommandPalette.vue): Power-user universal search triggered byCmd+K/Ctrl+K. Instant fuzzy search across project harnesses, pages, quick actions (switch theme, collapse sidebar, create project, export), and direct keyboard navigation with Arrow keys and Enter. - Global Keyboard Shortcuts (
useKeyboardShortcuts.ts): Fast desktop shortcuts forCmd+K(Search & Command Palette),Cmd+/(Toggle Sidebar),Cmd+N(New Project/Session), andEsc(Modal dismiss). - Drag-and-Drop File Context Injection (
ProjectChat.vue): Dragging external files over the Project Studio Chat triggers a visual drop zone overlay, automatically injecting the attached files into the prompt query. - Native Desktop Notifications (
services/notification.ts): Dispatches system desktop notifications when long-running agent workflows or file parsing tasks finish in the background.
- Command Palette (
Phase 8: Production Polish & Performance Scale — Sprint 28: Extension & MCP Skill Hub (1-Click Install)
- Curated MCP Extension Marketplace (
ToolsPanel.vue,tools/marketplace.rs): 1-click catalog featuring certified extensions (Python Data Engine, GitHub MCP, PostgreSQL Explorer, Puppeteer Web Browser, SQLite Inspector). - Category Filtering & Search: Instant filtering across Data & Analytics, Developer Tools, Databases, and Web Automation.
- Pre-Configured Transports: Auto-fills command executable, CLI args, default endpoints, and provides secure secret inputs for API tokens.
- Curated MCP Extension Marketplace (
Phase 8: Production Polish & Performance Scale — Sprint 27: Export, Import & Database Backup
- 1-Click Conversation Export (
ProjectChat.vue,commands/backup.rs): Export complete conversation histories, tool invocation records, and system context into structured GitHub Flavored Markdown (.md) or schema-compliant.json. - Full Workspace SQLite Database Online Backup & Restore (
commands/backup.rs,SettingsPanel.vue): Atomic live database backups usingrusqlite::backupwithout stopping the runtime, with validation safeguards during restore. - ChatGPT Conversation Import (
commands/backup.rs,SettingsPanel.vue): Seamlessly importconversations.jsonfrom ChatGPT data archives into AMBA workspace sessions.
- 1-Click Conversation Export (
Phase 8: Production Polish & Performance Scale — Sprint 26: Performance & Caching
- SQLite WAL Mode & High-Throughput Pragmas (
storage/db.rs,V004__caches.sql): EnabledPRAGMA journal_mode = WAL,synchronous = NORMAL, andbusy_timeout = 5000providing 5x–10x concurrent read/write throughput and eliminating database locking during intensive streaming. - Document Parsing Hash Cache (
context/engine.rs): High-performance Sha256-based document caching (document_cachetable) ensures that unchanged PDFs, spreadsheets, and Word documents load instantly (<1ms) without repeated parsing and decompression overhead. - Deterministic Model Response Caching (
runtime/cache.rs): Automatic prompt-hash response cache (response_cachetable) for low-temperature runs (<= 0.1), eliminating redundant API requests and token expenditures for repetitive tasks. - Frontend Chat Virtualization & DOM Containment: Applied
content-visibility: autoandcontain-intrinsic-sizeto chat messages inProjectChat.vueandAgentWorkspace.vuefor silky-smooth 60fps scrolling across 1000+ turn conversation histories.
- SQLite WAL Mode & High-Throughput Pragmas (
Phase 8: Production Polish & Performance Scale — Sprint 25: Robust Error Handling & Retry Engine
- Provider Exponential Backoff & Jitter (
providers/retry.rs): Automatic retry loop with configurable exponential backoff (base_delay * 2^attempt + jitter) for handling HTTP 429 rate limits and transient network disconnects without user interruption. - Granular Error Classification (
classify_error): Accurately differentiates between retryable transient errors (429, 500/502/503/504, connection timeouts) and fatal client/auth issues (401, 403) to prevent wasteful retries. - Automatic Secondary Model Fallback: When an upstream provider suffers a persistent outage or quota limit, the execution engine seamlessly degrades to the agent's secondary preferred model (e.g. falling back from GPT-4o to Claude 3.5 Sonnet or Gemini 2.0 Flash) from
agent.model_preferences. - Live UI Diagnostics & Retry Telemetry:
- Emits real-time
RunEventType::RetryAttemptandRunEventType::ModelFallbackevents. - Added retry countdown badge ("Rate limit detected. Retrying in 2s (Attempt 1/3)...") and prominent Model Fallback notification banners in
ProjectChat.vueandAgentWorkspace.vue.
- Emits real-time
- Provider Exponential Backoff & Jitter (
Phase 7: Autonomous Reasoning & Extended Memory — Sprint 24: Planning & ReAct Reasoning Loop
- Dynamic Plan Inspector UI (
PlanInspector.vue): Embedded plan tracker widget rendered inProjectChat.vue. Displays current goal, progress percentage bar, dynamic step status checklist (pending,in_progresswith spinner,completed,failed), and expandable Thought reasoning drawers. - ReAct Reasoning Protocol (
runtime/agent.rs&runtime/execution.rs): Integrated step-by-step planning instructions into system prompt. The agent decomposes complex tasks into<plan>blocks with granular<step>items and<thought>reflections. - Live Plan Telemetry (
RunEventType::PlanUpdate): Execution engine automatically parses XML plan structures from model responses and emits real-timeplan_updateevents for live UI progress updates. - Self-Correction on Tool Errors: Agents observe tool failure observations and update their plans to test alternative approaches or self-correct parameters.
- Dynamic Plan Inspector UI (
Phase 7: Autonomous Reasoning & Extended Memory — Sprint 23.5: Project Harness Paradigm & 3-Column Studio UI (ADR-008)
- Project Harness Paradigm: Transitioned AMBA from session-centric chat into a project-based local harness. Every project encapsulates a dedicated local directory with three standard subdirectories:
input/(Read-only data context: attendance sheets, spreadsheets, raw PDFs, invoices).workings/(Working Papers & Drafts: calculations, versioned spreadsheets, drafts, intermediate data; backwards-compatible with legacytemp/).output/(Deliverables: finalized payroll spreadsheets, generated summary reports, export archives).
- 3-Column Project Studio UI (
ProjectStudio.vue):- Harness File Explorer (Left Column): Real-time tree view of
input/,workings/, andoutput/directories, file size metrics, file type icons (Excel, Word, PDF, CSV, JSON), and 1-click OS open. - Project Chat & Execution (Middle Column): Project-scoped conversation history, auto-injected input files context, live tool execution telemetry, and goal/plan banners.
- Deliverable Preview (Right Column): Dedicated inspector for previewing generated files, quick overview of project deliverables, and 1-click launch in default OS apps.
- Harness File Explorer (Left Column): Real-time tree view of
- Projects Dashboard & Creation Wizard (
ProjectListView.vue,ProjectCreateModal.vue):- Filterable projects grid by template (Payroll, Financial Analysis, Document Analysis, Custom).
- 3-step project setup wizard (Template & Metadata → Assigned Agent & Model → Local Directory Picker with auto-scaffolding).
- Tauri IPC Endpoints & Database (
commands/projects.rs,storage/migrations/V002__projects.sql): 11 new commands for project lifecycle, directory scaffolding, filesystem sync, and project-scoped sessions.
- Project Harness Paradigm: Transitioned AMBA from session-centric chat into a project-based local harness. Every project encapsulates a dedicated local directory with three standard subdirectories:
Phase 7: Autonomous Reasoning & Extended Memory — Sprint 23: Explicit Memory Tools & Memory Inspector UI
- Memory Inspector UI (
/memory/MemoryPanel.vue): Full-featured dedicated interface for browsing, inspecting, editing, creating, and deleting long-term semantic memories. Includes live semantic similarity vector search with threshold filtering, similarity match score badges, metadata tagging, and raw JSON/Markdown preview. - Explicit Agent Memory Tools (
tools/knowledge.rs):knowledge.store: Native tool allowing autonomous agents to self-record important facts, preferences, guidelines, and entity details into long-term vector storage.knowledge.search: Native tool enabling agents to actively query their semantic knowledge base by natural language query with custom score thresholds.
- Memory Management IPC Endpoints (
commands/memory.rs):list_memories,upsert_memory,delete_memory,search_memories. - Domain Model & Seeding (
models/mod.rs,storage/seed.rs): AddedMemoryEntry,ScoredMemoryEntry,UpsertMemoryRequest, and registered knowledge tools & permissions forassistant-agentandresearch-agent.
- Memory Inspector UI (
Phase 7: Autonomous Reasoning & Extended Memory — Sprint 22: RAG Memory Auto-Injection & Semantic Recall
- RAG Pre-Prompt Memory Injection (
runtime/rag.rs&runtime/execution.rs): Automatic cosine-similarity search against SQLite semantic memory before model request. Top memories exceeding similarity threshold (0.35) are formatted and injected as authoritative background context in system prompt. - Interaction Auto-Storage (
auto_store_interaction): Automatically captures and embeds meaningful User prompt + Assistant response pairs upon run completion, ensuring continuous long-term recall across sessions. - Live Runtime Memory Telemetry: Emits
RunEventType::ContextBuildevents containing memory count and keys to provide frontend visibility into what the agent recalled. - Scored Semantic Search API (
search_scored): ExtendedSemanticMemoryStoretrait andSqliteSemanticMemorywith threshold-gated, score-ranked retrieval.
- RAG Pre-Prompt Memory Injection (
Streamlined Provider & Model Management in Settings (
SettingsPanel.vue):- Inline Expandable Model Selection: Merged model selection into Step 1 as an expandable, interactive checkbox accordion directly under each connected provider.
- Single Step 2 for Default Model: Step 2 is now dedicated to selecting the Default Model, strictly listing the inner join of enabled models from connected providers (+ Offline Demo).
- Quick Reset Actions: Added 1-click
Reset Flagships(resets to curated flagship profiles) andReset All Selected(clears model selections). - Removed Clutter: Removed Manifest Editor JSON modal and Custom Model form for a cleaner, intuitive end-user experience.
Phase 6: Advanced Tool Ecosystem & MCP Expansion (Sprints 19–21)
- Remote MCP over SSE/HTTP (
tools/mcp.rs): ImplementedSseMcpClientallowing AMBA to connect to remote MCP endpoints over Server-Sent Events with Bearer token authentication. - MCP Resources Support: Added
resources/listandresources/readmethods to inspect live data from MCP servers. - Builtin Utility Tools (
tools/utility.rs):system.time: Real-time clock, timezone offset, weekday, and Unix timestamps.math.calculate: Deterministic, safe mathematical expression evaluator (+, -, *, /, %, ^, sqrt, abs, ceil, floor, round, sin, cos, tan, log, exp, pi, e).filesystem.glob: Pattern search across workspace directories.system.info: OS, CPU architecture, platform metadata.
- Tools UI Updates (
ToolsPanel.vue): Added Stdio / Remote SSE transport switcher with Bearer token inputs and presets.
- Remote MCP over SSE/HTTP (
Sprint 18: Structured Output & Rich Rendering
- Rich Markdown Engine (
MarkdownMessage.vue): Replaced raw text message rendering with a modular Markdown parser. - Fenced Code Blocks & 1-Click Copy: Renders code blocks with dark theme styling, language badge tags, and an interactive copy button with visual confirmation.
- Markdown Tables & Blockquotes: Formats tables with clean bordered responsive layouts, callout quotes, bold/italic, inline code, and clickable external links.
- Structured JSON Support: Added
response_formattoModelRequestwith OpenAI & Google provider integration for deterministic JSON output.
- Rich Markdown Engine (
Sprint 17: Smart Token-Aware Context Window Management & Auto-Summarization
- Token Estimation & Budgeting (
runtime/context_budget.rs): Replaced naive message-count sliding window with token-aware budgeting using weighted character/word BPE approximation. - Automatic Session Summarization: When conversation turns exceed the token budget threshold (>6,000 tokens or >8,000 token history), earlier turns are summarized into a concise structured digest (
[Summary of Earlier Turns in this Session]) and prepended as a system note. - Tool-Call Pair Preservation: Smart split algorithm protects assistant
tool_callsand correspondingtoolresult pairs from being broken across pruning boundaries. - Runtime Event Notification: Emits
RunEventType::ContextBuildwith auto-summarized metadata to notify frontend trace inspector.
- Token Estimation & Budgeting (
Sprint 16.4: Interactive 3-Step Model Discovery, Multi-Select Curation & Default Picker
- Step 1 — Connect AI Providers: Input API keys for Google Gemini, OpenAI, and Anthropic. Direct live model discovery fetches all upstream models straight from provider APIs.
- Step 2 — Pick Models to Enable (Multi-Select Curation):
- Provider Tabs (
All Connected,Google Gemini,OpenAI,Anthropic). - Real-time search filter and quick action buttons (
✨ Select Flagships,Select All,Deselect All). - Interactive checkbox selection of discovered models with Flagship badges, context window size tags, and descriptions.
- Saves user-curated model choices directly into SQLite via
sync_selected_model_profiles.
- Provider Tabs (
- Step 3 — Select Default Model (Single Pick):
- Displays only the inner join of enabled models from connected providers (+ Offline Mock).
- 1-click default model selection for agent workspaces.
- Step 4 — Web Search & Internet Tools (Optional): Tavily / Brave Search integration with live status indicator.
Sprint 16.3: Configurable Model Manifest Architecture & Live Editor
- Dynamic Model Registry (
~/.amba/models.manifest.json): Replaced hardcoded model configurations with a decoupled, declarative JSON manifest schema (ModelManifestItem/ModelManifest). - Live Manifest Editor Modal: Added an interactive in-app JSON editor in Settings allowing power-users and developers to update model IDs, modify temperatures, adjust context window sizes, add new flagship models, or reset to template defaults without recompiling.
- Manifest-Driven Seeding & Persistence:
seed_profilesand backend storage load directly from the active manifest; changes applied in Settings immediately refresh the database and workspace dropdowns. - Tauri IPC Manifest Endpoints:
get_model_manifest,save_model_manifest, andreset_model_manifest_defaults.
- Dynamic Model Registry (
Sprint 16.2: Clean Flagship Model Curation, Noise Filtering & Provider Grouping
- Smart API Model Curation (
fetch_provider_models): Replaced raw, noisy API dump (30–50 experimental/dated checkpoints) with an intelligent whitelist filter keeping only canonical flagship aliases (Gemini 2.0 Flash,Gemini 2.5 Flash,Gemini 1.5 Pro,GPT-4o Mini,GPT-4o,o3-mini,o1,Claude 3.7 Sonnet,Claude 3.5 Sonnet,Claude 3.5 Haiku). - Obsolete Model Pruning & Reset: Added
prune_profiles_by_providerandreset_curated_model_profilesTauri command to cleanly remove clutter/deprecated snapshots and reset to pristine flagship models with 1 click. - Provider-Grouped Model Dropdown:
AgentWorkspace.vuenow organizes model options into intuitive<optgroup>categories (Google Gemini,OpenAI,Anthropic Claude,Offline / Testing) with status indicators. - Settings UI Enhancement: Added 1-click "Reset to Curated Models" button in Settings with clear feedback alerts.
- Smart API Model Curation (
Sprint 16.1: End-User Onboarding Wizard, Help & Guide Center, and In-App Feedback System
- Interactive Setup Wizard (
/onboarding): 3-step setup guide for non-technical users to connect AI Providers (Google Gemini Free Tier, OpenAI, Claude, or Offline Demo), configure Web Search (Tavily), and jumpstart with 1-click sample prompts. - Help & Guide Center Modal (
HelpGuideModal.vue): Comprehensive, non-technical guide with Quickstart steps, AI Provider comparison, Security & Local-First overview, and FAQ solving common questions (e.g. why agent needs search keys, local data safety). - Built-in Feedback Center (
FeedbackModal.vue): In-app feedback dialog with emoji/star ratings (1–5), category chips (Idea, Bug, Question, General), contact info, 1-click copy formatted feedback, and SQLite persistence. - Backend Feedback Engine: SQLite
user_feedbacktable withinsert_feedbackandlist_feedbackstorage APIs, registeredsubmit_feedbackandlist_feedbackTauri IPC commands. - Sidebar Access: Added 1-click "📖 Hướng dẫn sử dụng", "💬 Góp ý & Báo lỗi", and "🚀 Setup Wizard" buttons in sidebar footer.
- Workspace Quick-Start:
AgentWorkspace.vueauto-fills query prompt from onboarding into input box for instant execution. - 45 Rust unit tests + 3 Vitest tests passing cleanly.
- Interactive Setup Wizard (
Sprint 16: Web Search & Fetch Tools (Internet Querying & SSRF Protection)
WebSearchTool(web.search): query the live web via Tavily (AI-native search API) or Brave Search with title, URL, snippet, and relevance scoring.WebFetchTool(web.fetch): bounded webpage retrieval (32KB cap) with fast HTML-to-text conversion, tag stripping, script/style pruning, entity decoding, and text formatting.- SSRF Protection (
assert_url_safe): strict validation blockinglocalhost,.local, link-local, loopback, private IPv4/IPv6 ranges (RFC 1918, RFC 6598 CGNAT, RFC 5736), and non-HTTP protocols. - Policy Engine defaults:
web.searchandweb.fetchdefault toConfirmpolicy for explicit user permission. - Search Provider Credentials: OS keychain + SQLite fallback storage via
set_search_credential,delete_search_credential,search_credential_statusIPC commands. - Settings UI: Added Step 3 "Web Search & Internet Tools" card with Tavily & Brave Search key management, status indicators, and direct API link buttons.
- Tool Status formatting in Workspace: human-readable real-time indicators for
🔍 Searching web,🌐 Fetching,📄 Reading file,✏️ Writing file,⚡ Executing shell. - 44 Rust unit tests + 3 Vitest tests passing cleanly.
Sprint 15: Multi-turn Conversation History Engine & Model Optimization
- Multi-turn context loading:
ExecutionEnginenow automatically creates sessions and loads previous conversation turns intoWorkingMemoryfor multi-turn LLM memory. - Context sliding window: limits conversation history to a 20-message token budget preventing context window overflow.
- Dynamic model parameters:
StartRunRequestsupportstemperature,max_tokens, andsystem_prompt_override. - SQLite Conversation CRUD: added
get_conversation,list_conversations_by_agent,delete_conversation,rename_conversation,clear_conversation_messageswith cascade deletion. - Workspace Sessions & Tuning: collapsible Sessions sidebar (New Chat, switch, rename, delete), Model & Context Tuning drawer (temperature slider, max tokens, custom instructions), copy message button, latency & model telemetry indicators.
- Upgraded Conversation History View: real-time search, filter by agent, "Resume Chat" in Workspace, full conversation markdown export, clear & delete controls.
- 35 Rust unit tests + 3 Vitest tests all passing cleanly.
- Multi-turn context loading:
Sprint 14: Real LLM Providers & Concrete Model Selection
- Concrete Model Profiles seeded for OpenAI (
GPT-4o Mini,GPT-4o), Anthropic (Claude 3.5 Sonnet,Claude 3.5 Haiku), and Google (Gemini 2.0 Flash,Gemini 1.5 Pro). - Production Anthropic model IDs updated to official snapshots (
claude-3-5-sonnet-20241022,claude-3-5-haiku-20241022). - Settings persistence for
default_model_profile_idvia SQLitesettingstable and IPC commands. - Auto-detection of configured provider credentials and smart model dropdown selection in Workspace and Settings.
- Concrete Model Profiles seeded for OpenAI (
Sprint 13: Token Usage & Analytics Dashboard
- Backend Analytics API: added
get_token_analyticsquery onSqliteStorageto aggregate run token usage (input_tokens,output_tokens) and calculate estimated USD cost across LLM models. - Registered
get_token_analyticsTauri IPC command insrc-tauri/src/commands/runs.rsandlib.rs. - Frontend Analytics UI (
ActivityPanel.vue): added KPI summary cards (Total Tokens, Input/Output Split, Estimated USD Cost, Executed Runs) and per-model usage breakdown table. - Added unit test for token analytics aggregation in
db.rs(33 Rust unit tests total, all passing).
- Backend Analytics API: added
Sprint 12: MCP Server Management UI & Security Policy Manager
- Frontend API wrappers (
src/services/api/tools.ts):connectMcpServer,disconnectMcpServer,listPermissions,setPermission. - Tabbed Tools Panel UI (
src/features/tools/ToolsPanel.vue):- Tool Registry tab: Live view of registered Native & MCP tools and JSON schemas.
- MCP Servers Manager tab: Connect form (
server_name,command,args), quick presets (filesystem,git,memory), list of connected servers, disconnect button. - Security & Permissions Manager tab: Real-time policy decision toggles (
Allow,Confirm,Deny) for all registered tools.
- Frontend API wrappers (
Sprint 11: Document Context Adapters (PDF, DOCX, XLSX, CSV)
CsvAdapter: parses CSV files and formats records into clean Markdown tables.DocxAdapter: parses Microsoft Word.docxZIP archives and extracts paragraph text fromword/document.xml.XlsxAdapter: parses Microsoft Excel.xlsxarchives, resolves shared strings (xl/sharedStrings.xml), and formats sheet cell grids into Markdown tables.PdfAdapter: parses.pdftext streams (BT...ET) into readable text content.- Registered all 4 document adapters in
ContextEnginedefault adapters. - Added unit tests for CSV, DOCX, XLSX, and PDF parsing (32 Rust unit tests total, all passing).
Sprint 10: Semantic Memory
- SQLite table migration
semantic_memoryfor storing key, JSON values, vector embeddings, and timestamps. LocalEmbeddingGenerator: fast offline feature-hashing & n-gram normalized vector generator.- Cosine similarity vector search ranking (
cosine_similarity). SqliteSemanticMemory: implementsSemanticMemoryStoretrait (upsert,get,search).- 3 new unit tests for embeddings, cosine similarity, and SQLite semantic memory roundtrip (28 Rust unit tests total, all passing).
- SQLite table migration
Sprint 9: Write Tools + Policy-Gated Shell
filesystem.write: full implementation with path security (sanitize_path), automatic parent directory creation, content append support, and unit tests.shell.execute: process execution viatokio::process::Command, CWD path security, timeout enforcement (default 30s, max 120s), and unit tests.- Policy & Permissions IPC: added
list_permissionsandset_permissionTauri commands registered inlib.rs. - 3 new unit tests for
filesystem.writeandshell.execute(25 Rust unit tests total, all passing).
Sprint 8: Streaming Tool-Call Assembly
- OpenAI provider streaming: chunk assembly for
tool_callsdeltas,include_usageSSE options, token usage extraction, andDoneevent generation. - Anthropic provider streaming: full SSE event parsing (
message_start,content_block_start,content_block_delta,content_block_stop,message_delta,message_stop),tool_useJSON buffer accumulation, token usage tracking. - Google provider streaming:
streamGenerateContentSSE parser for text deltas,functionCallparts,usageMetadata, andDoneevent. - Execution Engine (
stream_or_chat): properModelStreamEvent::Usagecollection and token usage propagation without extra non-streamingchat()fallback calls.
- OpenAI provider streaming: chunk assembly for
Sprint 7: Real MCP Client (stdio JSON-RPC 2.0)
StdioMcpClient: spawns MCP server process, handles initialize handshake,tools/list,tools/callwith 5 s / 10 s / 30 s timeouts- Background stdin writer + stdout reader tasks; graceful drain on server exit
McpToolAdapter: wraps MCP tools as nativeToolso they live inToolRegistry- Tool names prefixed
mcp.<server_name>.<tool_name> connect_mcp_server/disconnect_mcp_serverTauri commandsStubMcpClientretained for tests and fallback- 7 new unit tests (JSON-RPC parsing, adapter delegation, error propagation)
- 19 Rust tests total, all passing
GitHub Actions CI pipeline (
.github/workflows/ci.yml)Phase 2 roadmap: Sprint 7–10 planning in
ROADMAP.md
0.1.0 — 2026-08-10
Added
- Local-first Tauri 2 desktop app with Vue 3 presentation layer
- Single-process Rust Agent Runtime (execution, tools, policy, providers, context, memory, packages)
- Governance documentation (
AGENTS.md, architecture, ADRs, sprint docs,.agent/*) - Navigation: Agents, Skills, Tools, Models, Memory, Activity, Settings
- Agent workspace with streaming, tool status, execution trace, permission prompts
- SQLite persistence with migrations (agents, skills, tools, conversations, runs, events, policies)
- Model providers: OpenAI, Anthropic, Google + offline Mock profile
- Secure API key storage via OS keychain
filesystem.readtool with path traversal protection- Permission engine (allow / confirm / deny)
- Local agent/skill package install from folder
- Builtin Assistant Agent + example packages under
packages/examples/ - Activity page for past runs
- Unit tests (Rust domain/policy/execution; Vitest API wrappers)
