mu-agent 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/judge/manifest.json +132 -13
- package/judge/mu/index.js +965 -278
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.2.8] - 2026-10-24
|
|
6
|
+
|
|
7
|
+
**0.2.8 is plain-language board v2: a teammate's update (`headline`, `blocked`, `next`, `agents`), subagent outcomes as they happen, a stall clock, the writer in the person's language, and two races fixed.**
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Plain-language board v2 (`kyrn/docs/features/plain-language-board.md`; contract with the desktop app in §4, codes in `presentation-codes.md`). The writer's prompt now asks for a teammate's spoken update, in this JSON: `headline`, `now`, `blocked`, `next`, `progress`, `agents: [{who, doing}]`, `confirm`, `note`. Its first sentence, "You are the voice of a coding session's status board.", is the new routing marker for tests and the desktop's e2e fake model. Only the example in the board's language is included. The request starts with `FACTS`: the task (clipped to 600 characters), the frame's `currentSubgoal`, the checklist, the stage, the run's and the previous board's age, the permission being waited for, the previous board, what is in flight (the main agent's call and how long since its last output, background jobs, the judge's permission review, the goal check), each subagent on its own line (elapsed time, silence, failed steps, retry, the report's first line, the error), the news (a failed step carries the first error-like lines of its output, redacted with `redactSecrets`), the frame's open questions, the account and the latest steps.
|
|
12
|
+
- The reply parser still reads the four-field reply (its headline is then the first sentence of `now`). It caps the headline at 14 words or 24 CJK characters and every other field at 2 sentences, strips filler in Chinese and English, and keeps `agents` only for names the request listed. A board whose headline equals the one shown, with no news, no note and no pending permission, is not published. Mid-run replies are capped at 600 tokens (`runtime.llm` takes `maxTokens`).
|
|
13
|
+
- `board.update` gains `headline` (with `headlineCode` and `headlineParams` on rules headlines: `now_<phase>`, `still_running`, `helpers_working`, `waiting_permission`), `blocked` (with `blockedCode` and `blockedParams` when filled by rules), `next`, `agents` (built by rules from `activeRuns()`: `who`, `role`, `state`, `doing`, `sinceMs`; the writer's `doing` replaces the rules' summary only for an exact name) and `updatedAt`. `phase` gains `blocked`. `board.note` gains `who`, and the codes `helper_done`, `helper_failed` and `still_running`; `helpers_back` gains `failed`.
|
|
14
|
+
- `board.read` v5: the phase `blocked` ("Waiting on something other than the user"), an `in_flight` state key, failure excerpts in `steps` and `events`, and subagents back, failed or stuck in the `changed` question. Without a judge, a stall reads as `blocked`.
|
|
15
|
+
- A subagent's end is an event and an account line as it happens: the board diffs bee statuses from the swarm tool's streamed snapshots, a one-second tick over the live runs, and the call's final snapshot. `helpers_back` counts the subagents that did not end `done`.
|
|
16
|
+
- Stall clock: while a run is on, an unref'd interval (every `stallMs`/4, 1 to 15 s) finds a main-agent call running, or a subagent's call silent, for 1, 3 and 10 times `stallMs` (default 60000; 0 turns it off). Each crossing replaces one `still_running` line in place (same `sequence` and `at`) and schedules one look. A call waiting for permission doesn't count.
|
|
17
|
+
- When a look decides to update and the stage changed, something is stuck or a permission is pending, a rules headline is presented (not stored) before the writer's board replaces it.
|
|
18
|
+
- The writer writes in the language the person writes in (`writingLanguage` in `src/language.ts`, from their last 1 to 3 messages: kana, Hangul, Han; Latin letters are the app's language only when it is a Latin-script one other than English; a message that tells nothing defers to the one before it, then to `MU_LANG`). Fixed sentences keep following `MU_LANG`. The `language` option's help says so.
|
|
19
|
+
- The terminal widget is at most three lines: `μ <headline>`, then what needs the person or what is blocked, then the latest account line. `/board` shows now, blocked, next, progress, subagents, what waits on the person and the account.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- A look that started before a permission request no longer publishes over it: while `pendingAsk` is set, the board keeps the permission line in `confirm`, `needsUser: true`, `phase: "waiting"` and a `waiting_permission` headline. The board shown when permission is asked now has `phase: "waiting"`; the headline and phase from before come back once it's answered.
|
|
24
|
+
- Writer starvation: a look overtaken by a newer trigger while the judge read skipped the writer even when no board had been written yet. It now writes anyway when there is no board or the shown board is older than `maxStaleMs` (default 15000). The writer's timeout is split: 20 s mid-run, `narrateTimeoutMs` (60 s) at the end.
|
|
25
|
+
|
|
5
26
|
## [0.2.7] - 2026-10-24
|
|
6
27
|
|
|
7
28
|
**0.2.7 adds OpenAI's decision model (`gpt-6-luna`, through the Decisions API) as a judge, and makes `gpt-6.1-sol` the `openai` provider's default model.**
|
package/judge/manifest.json
CHANGED
|
@@ -6592,6 +6592,21 @@
|
|
|
6592
6592
|
"tr-TR": "Panonun dili",
|
|
6593
6593
|
"fa-IR": "زبان تابلو"
|
|
6594
6594
|
},
|
|
6595
|
+
"help": {
|
|
6596
|
+
"zh": "自动:模型写的话跟着你发消息用的语言,看板上固定的句子跟着应用的界面语言。",
|
|
6597
|
+
"en": "Auto: what the model writes follows the language of your messages; the board's fixed lines follow the app's language.",
|
|
6598
|
+
"zh-TW": "自動:模型寫的話跟著你發訊息用的語言,看板上固定的句子跟著應用程式的介面語言。",
|
|
6599
|
+
"ja-JP": "自動:モデルが書く文はあなたのメッセージの言語に合わせ、ボードの決まった文はアプリの表示言語に合わせます。",
|
|
6600
|
+
"ko-KR": "자동: 모델이 쓰는 글은 여러분이 보내는 메시지의 언어를 따르고, 보드의 정해진 문장은 앱의 언어를 따릅니다.",
|
|
6601
|
+
"de-DE": "Automatisch: Was das Modell schreibt, folgt der Sprache deiner Nachrichten; die festen Zeilen der Übersicht folgen der Sprache der App.",
|
|
6602
|
+
"fr-FR": "Auto : ce que le modèle écrit suit la langue de vos messages ; les phrases fixes du tableau suivent la langue de l’application.",
|
|
6603
|
+
"es-ES": "Automático: lo que escribe el modelo sigue el idioma de tus mensajes; las frases fijas del tablero siguen el idioma de la aplicación.",
|
|
6604
|
+
"pt-BR": "Automático: o que o modelo escreve segue o idioma das suas mensagens; as frases fixas do painel seguem o idioma do app.",
|
|
6605
|
+
"ru-RU": "Авто: то, что пишет модель, следует языку ваших сообщений; готовые фразы сводки — языку приложения.",
|
|
6606
|
+
"uk-UA": "Авто: те, що пише модель, відповідає мові ваших повідомлень; готові фрази зведення — мові застосунку.",
|
|
6607
|
+
"tr-TR": "Otomatik: modelin yazdıkları mesajlarınızın dilini izler; panonun sabit cümleleri uygulamanın dilini izler.",
|
|
6608
|
+
"fa-IR": "خودکار: آنچه مدل مینویسد از زبان پیامهای شما پیروی میکند؛ جملههای ثابت تابلو از زبان برنامه."
|
|
6609
|
+
},
|
|
6595
6610
|
"choices": [
|
|
6596
6611
|
{
|
|
6597
6612
|
"value": "auto",
|
|
@@ -6782,19 +6797,123 @@
|
|
|
6782
6797
|
"fa-IR": "حداکثر انتظار برای نوشتن تابلو"
|
|
6783
6798
|
},
|
|
6784
6799
|
"help": {
|
|
6785
|
-
"zh": "
|
|
6786
|
-
"en": "After that, stock phrases are used.",
|
|
6787
|
-
"zh-TW": "
|
|
6788
|
-
"ja-JP": "
|
|
6789
|
-
"ko-KR": "이 시간이 지나면 정해진 문장을 씁니다.",
|
|
6790
|
-
"de-DE": "Danach werden feste Sätze verwendet.",
|
|
6791
|
-
"fr-FR": "Au-delà, des phrases toutes faites sont utilisées.",
|
|
6792
|
-
"es-ES": "Después se usan frases fijas.",
|
|
6793
|
-
"pt-BR": "Depois disso, são usadas frases fixas.",
|
|
6794
|
-
"ru-RU": "После этого используются готовые фразы.",
|
|
6795
|
-
"uk-UA": "Після цього використовуються готові фрази.",
|
|
6796
|
-
"tr-TR": "Sonrasında sabit cümleler kullanılır.",
|
|
6797
|
-
"fa-IR": "پس از آن، جملههای ثابت به کار میروند."
|
|
6800
|
+
"zh": "这是一轮结束时的上限;干活中途最多等 20 秒,再晚写出来也过时了。超时就用固定的句子说。",
|
|
6801
|
+
"en": "This is the limit when a run ends. Mid-run the writer gets 20 s at most, since a later update would already be out of date. After that, stock phrases are used.",
|
|
6802
|
+
"zh-TW": "這是一輪結束時的上限;做事途中最多等 20 秒,再晚寫出來也過時了。逾時就改用固定的句子。",
|
|
6803
|
+
"ja-JP": "これは実行が終わったときの上限です。作業の途中では最大 20 秒しか待ちません。それより遅い更新はもう古いからです。過ぎると、決まった文を使います。",
|
|
6804
|
+
"ko-KR": "실행이 끝날 때의 한도입니다. 작업 중에는 최대 20초만 기다립니다. 그보다 늦은 업데이트는 이미 낡았기 때문입니다. 이 시간이 지나면 정해진 문장을 씁니다.",
|
|
6805
|
+
"de-DE": "Das gilt am Ende eines Laufs. Während der Arbeit wird höchstens 20 s gewartet, weil ein späteres Update schon veraltet wäre. Danach werden feste Sätze verwendet.",
|
|
6806
|
+
"fr-FR": "C’est la limite à la fin d’une exécution. En cours de route, le rédacteur a 20 s au plus, car une mise à jour plus tardive serait déjà dépassée. Au-delà, des phrases toutes faites sont utilisées.",
|
|
6807
|
+
"es-ES": "Este es el límite al terminar una ejecución. A mitad del trabajo se espera 20 s como máximo, porque una actualización más tardía ya estaría desfasada. Después se usan frases fijas.",
|
|
6808
|
+
"pt-BR": "Este é o limite quando uma execução termina. No meio do trabalho, a espera é de no máximo 20 s, porque uma atualização mais tardia já estaria desatualizada. Depois disso, são usadas frases fixas.",
|
|
6809
|
+
"ru-RU": "Это предел в конце запуска. Во время работы ожидание не дольше 20 с: более позднее обновление уже устарело бы. После этого используются готовые фразы.",
|
|
6810
|
+
"uk-UA": "Це межа наприкінці запуску. Під час роботи очікування не довше 20 с: пізніше оновлення вже було б застарілим. Після цього використовуються готові фрази.",
|
|
6811
|
+
"tr-TR": "Bu, bir çalışma bittiğindeki sınırdır. İş sürerken en fazla 20 sn beklenir, çünkü daha geç bir güncelleme zaten eskimiş olur. Sonrasında sabit cümleler kullanılır.",
|
|
6812
|
+
"fa-IR": "این سقف پایان یک اجراست. در میانهٔ کار حداکثر ۲۰ ثانیه صبر میشود، چون بهروزرسانی دیرتر دیگر کهنه است. پس از آن، جملههای ثابت به کار میروند."
|
|
6813
|
+
}
|
|
6814
|
+
},
|
|
6815
|
+
{
|
|
6816
|
+
"key": "stallMs",
|
|
6817
|
+
"kind": "number",
|
|
6818
|
+
"default": 60000,
|
|
6819
|
+
"min": 0,
|
|
6820
|
+
"max": 3600000,
|
|
6821
|
+
"unit": {
|
|
6822
|
+
"zh": "毫秒",
|
|
6823
|
+
"en": "ms",
|
|
6824
|
+
"zh-TW": "毫秒",
|
|
6825
|
+
"ja-JP": "ミリ秒",
|
|
6826
|
+
"ko-KR": "밀리초",
|
|
6827
|
+
"de-DE": "ms",
|
|
6828
|
+
"fr-FR": "ms",
|
|
6829
|
+
"es-ES": "ms",
|
|
6830
|
+
"pt-BR": "ms",
|
|
6831
|
+
"ru-RU": "мс",
|
|
6832
|
+
"uk-UA": "мс",
|
|
6833
|
+
"tr-TR": "ms",
|
|
6834
|
+
"fa-IR": "میلیثانیه"
|
|
6835
|
+
},
|
|
6836
|
+
"label": {
|
|
6837
|
+
"zh": "一步跑多久算卡住",
|
|
6838
|
+
"en": "Time before a long step counts as stuck",
|
|
6839
|
+
"zh-TW": "一步跑多久算卡住",
|
|
6840
|
+
"ja-JP": "1 つのステップが止まったとみなすまでの時間",
|
|
6841
|
+
"ko-KR": "한 단계가 멈췄다고 볼 때까지의 시간",
|
|
6842
|
+
"de-DE": "Zeit, bis ein langer Schritt als hängend gilt",
|
|
6843
|
+
"fr-FR": "Délai avant qu’une longue étape soit jugée bloquée",
|
|
6844
|
+
"es-ES": "Tiempo para dar por atascado un paso largo",
|
|
6845
|
+
"pt-BR": "Tempo até um passo longo contar como travado",
|
|
6846
|
+
"ru-RU": "Через сколько долгий шаг считается зависшим",
|
|
6847
|
+
"uk-UA": "Через скільки довгий крок вважається завислим",
|
|
6848
|
+
"tr-TR": "Uzun bir adımın takılmış sayılması için süre",
|
|
6849
|
+
"fa-IR": "زمانی که پس از آن یک گام طولانی گیرکرده به حساب میآید"
|
|
6850
|
+
},
|
|
6851
|
+
"help": {
|
|
6852
|
+
"zh": "一个命令跑了这么久,或者一个子代理这么久没有输出,看板就记一行「还在跑」,到 3 倍、10 倍时更新这一行,每次都重新看一眼。0 表示不管。",
|
|
6853
|
+
"en": "When a command runs this long, or a subagent has no output for this long, the board adds a line saying it's still running, updates that line at 3 and 10 times this, and checks again each time. 0 turns this off.",
|
|
6854
|
+
"zh-TW": "一個命令跑了這麼久,或者一個子代理這麼久沒有輸出,看板就記一行「還在跑」,到 3 倍、10 倍時更新這一行,每次都重新看一眼。0 表示不管。",
|
|
6855
|
+
"ja-JP": "コマンドがこれだけ長く実行されている、またはサブエージェントからこれだけ出力がないと、ボードに「まだ実行中」の一行を加え、3 倍と 10 倍の時点でその行を更新し、そのたびに読み直します。0 でオフになります。",
|
|
6856
|
+
"ko-KR": "명령이 이만큼 오래 실행되거나 하위 에이전트가 이만큼 출력이 없으면, 보드에 아직 실행 중이라는 줄을 하나 더하고 3배와 10배가 될 때 그 줄을 고치며 그때마다 다시 살펴봅니다. 0이면 끕니다.",
|
|
6857
|
+
"de-DE": "Läuft ein Befehl so lange oder kommt von einem Unteragenten so lange keine Ausgabe, fügt die Übersicht eine Zeile hinzu, dass er noch läuft, aktualisiert sie beim 3- und 10-Fachen und sieht jedes Mal erneut nach. 0 schaltet das ab.",
|
|
6858
|
+
"fr-FR": "Quand une commande tourne aussi longtemps, ou qu’un sous-agent ne produit rien pendant aussi longtemps, le tableau ajoute une ligne indiquant qu’elle tourne encore, la met à jour à 3 et 10 fois cette durée et jette un nouveau coup d’œil à chaque fois. 0 désactive cela.",
|
|
6859
|
+
"es-ES": "Cuando un comando lleva este tiempo en marcha, o un subagente pasa este tiempo sin dar salida, el tablero añade una línea que dice que sigue en marcha, la actualiza al triple y al décuplo de este tiempo y vuelve a echar un vistazo cada vez. 0 lo desactiva.",
|
|
6860
|
+
"pt-BR": "Quando um comando roda por esse tempo, ou um subagente fica esse tempo sem saída, o painel adiciona uma linha dizendo que ainda está rodando, atualiza essa linha em 3 e 10 vezes esse tempo e faz uma nova leitura a cada vez. 0 desativa isso.",
|
|
6861
|
+
"ru-RU": "Если команда выполняется так долго или субагент столько же молчит, в сводке появляется строка о том, что работа ещё идёт; её обновляют при трёх- и десятикратном значении, и каждый раз сводка просматривается заново. 0 отключает это.",
|
|
6862
|
+
"uk-UA": "Якщо команда виконується так довго або субагент стільки ж мовчить, у зведенні з’являється рядок про те, що робота ще триває; його оновлюють при три- та десятикратному значенні, і щоразу зведення переглядається знову. 0 вимикає це.",
|
|
6863
|
+
"tr-TR": "Bir komut bu kadar uzun sürerse ya da bir alt ajan bu kadar süre çıktı vermezse, pano hâlâ çalıştığını söyleyen bir satır ekler, bu satırı 3 ve 10 katında günceller ve her seferinde yeniden bakar. 0 bunu kapatır.",
|
|
6864
|
+
"fa-IR": "وقتی یک فرمان اینقدر طول بکشد، یا یک عامل فرعی اینقدر خروجی ندهد، تابلو یک خط اضافه میکند که هنوز در حال اجراست، آن خط را در ۳ و ۱۰ برابر این زمان بهروز میکند و هر بار دوباره نگاه میکند. ۰ آن را خاموش میکند."
|
|
6865
|
+
}
|
|
6866
|
+
},
|
|
6867
|
+
{
|
|
6868
|
+
"key": "maxStaleMs",
|
|
6869
|
+
"kind": "number",
|
|
6870
|
+
"default": 15000,
|
|
6871
|
+
"min": 0,
|
|
6872
|
+
"max": 300000,
|
|
6873
|
+
"unit": {
|
|
6874
|
+
"zh": "毫秒",
|
|
6875
|
+
"en": "ms",
|
|
6876
|
+
"zh-TW": "毫秒",
|
|
6877
|
+
"ja-JP": "ミリ秒",
|
|
6878
|
+
"ko-KR": "밀리초",
|
|
6879
|
+
"de-DE": "ms",
|
|
6880
|
+
"fr-FR": "ms",
|
|
6881
|
+
"es-ES": "ms",
|
|
6882
|
+
"pt-BR": "ms",
|
|
6883
|
+
"ru-RU": "мс",
|
|
6884
|
+
"uk-UA": "мс",
|
|
6885
|
+
"tr-TR": "ms",
|
|
6886
|
+
"fa-IR": "میلیثانیه"
|
|
6887
|
+
},
|
|
6888
|
+
"label": {
|
|
6889
|
+
"zh": "事情接连发生时,看板最旧多久",
|
|
6890
|
+
"en": "Oldest the board gets while things keep happening",
|
|
6891
|
+
"zh-TW": "事情接連發生時,看板最舊多久",
|
|
6892
|
+
"ja-JP": "次々と動きがあるときのボードの古さの上限",
|
|
6893
|
+
"ko-KR": "일이 계속 일어날 때 보드가 낡아도 되는 최대 시간",
|
|
6894
|
+
"de-DE": "Höchstes Alter der Übersicht, solange ständig etwas passiert",
|
|
6895
|
+
"fr-FR": "Âge maximal du tableau quand les événements s’enchaînent",
|
|
6896
|
+
"es-ES": "Antigüedad máxima del tablero mientras siguen pasando cosas",
|
|
6897
|
+
"pt-BR": "Idade máxima do painel enquanto as coisas continuam acontecendo",
|
|
6898
|
+
"ru-RU": "Насколько устаревшей может быть сводка, пока всё время что-то происходит",
|
|
6899
|
+
"uk-UA": "Наскільки застарілим може бути зведення, поки весь час щось відбувається",
|
|
6900
|
+
"tr-TR": "Sürekli bir şeyler olurken panonun en fazla eskiliği",
|
|
6901
|
+
"fa-IR": "حداکثر کهنگی تابلو وقتی پشت سر هم اتفاقی میافتد"
|
|
6902
|
+
},
|
|
6903
|
+
"help": {
|
|
6904
|
+
"zh": "判定器还在读时又发生了新的事,看板一般等下一次再写;但看板已经比这更旧时照写,免得代理一直在忙、看板一直不更新。",
|
|
6905
|
+
"en": "When something new happens while the judge is still reading, the board usually waits for the next check. If it's already older than this, it's rewritten anyway, so a busy agent can't keep it out of date.",
|
|
6906
|
+
"zh-TW": "判定器還在讀時又發生了新的事,看板一般等下一次再寫;但看板已經比這更舊時照寫,免得代理一直在忙、看板一直不更新。",
|
|
6907
|
+
"ja-JP": "判定器が読み取っている間に新しいことが起きると、ボードは通常次の読み取りまで待ちます。すでにこれより古ければそのまま書き直すので、エージェントが忙しくてもボードが古いままになりません。",
|
|
6908
|
+
"ko-KR": "판정기가 아직 읽는 동안 새 일이 생기면 보드는 보통 다음 확인까지 기다립니다. 이미 이보다 오래됐다면 그대로 다시 써서, 에이전트가 바빠도 보드가 낡은 채로 남지 않습니다.",
|
|
6909
|
+
"de-DE": "Passiert etwas Neues, während der Judge noch liest, wartet die Übersicht normalerweise auf die nächste Prüfung. Ist sie schon älter als dieser Wert, wird sie trotzdem neu geschrieben, damit ein beschäftigter Agent sie nicht veralten lässt.",
|
|
6910
|
+
"fr-FR": "Quand du nouveau arrive pendant que le juge lit encore, le tableau attend en général le prochain coup d’œil. S’il est déjà plus ancien que cette durée, il est réécrit quand même, pour qu’un agent très occupé ne le laisse pas dépassé.",
|
|
6911
|
+
"es-ES": "Cuando pasa algo nuevo mientras el juez aún lee, el tablero suele esperar a la siguiente revisión. Si ya es más antiguo que esto, se reescribe igualmente, para que un agente ocupado no lo deje desfasado.",
|
|
6912
|
+
"pt-BR": "Quando algo novo acontece enquanto o juiz ainda está lendo, o painel costuma esperar a próxima leitura. Se ele já for mais antigo que isso, é reescrito mesmo assim, para que um agente ocupado não o deixe desatualizado.",
|
|
6913
|
+
"ru-RU": "Если что-то новое происходит, пока судья ещё читает, сводка обычно ждёт следующего просмотра. Если она уже старше этого значения, её всё равно переписывают, чтобы занятый агент не оставлял её устаревшей.",
|
|
6914
|
+
"uk-UA": "Якщо щось нове стається, поки суддя ще читає, зведення зазвичай чекає наступного перегляду. Якщо воно вже старше за це значення, його все одно переписують, щоб зайнятий агент не залишав його застарілим.",
|
|
6915
|
+
"tr-TR": "Hakem henüz okurken yeni bir şey olursa pano genellikle bir sonraki bakışı bekler. Zaten bundan eskiyse yine de yeniden yazılır; böylece meşgul bir ajan panoyu eskimiş bırakamaz.",
|
|
6916
|
+
"fa-IR": "اگر وقتی داور هنوز در حال خواندن است اتفاق تازهای بیفتد، تابلو معمولاً تا بررسی بعدی صبر میکند. اگر از این مقدار کهنهتر شده باشد، باز هم بازنویسی میشود تا عاملِ پرمشغله آن را کهنه نگه ندارد."
|
|
6798
6917
|
}
|
|
6799
6918
|
},
|
|
6800
6919
|
{
|