agentlas 1.0.7 → 1.0.9
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 +41 -0
- package/engine/agentlas-config.cjs +3 -1
- package/engine/agentlas-input.cjs +15 -1
- package/engine/agentlas-workforce.cjs +6 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.9 — 2026-07-27
|
|
4
|
+
|
|
5
|
+
Three repairs of one mistake, found by a live run that a 4-agent task force
|
|
6
|
+
(two of them managers over 8 and 10 sub-workers) completed in full before the
|
|
7
|
+
result was thrown away.
|
|
8
|
+
|
|
9
|
+
- **Field bounds are now stated in the prompt that must obey them.** A nested
|
|
10
|
+
manager wrote a synthesis brief over 2,000 characters and the whole run —
|
|
11
|
+
20 model calls, 14 minutes, every worker's finished output — was discarded
|
|
12
|
+
on a contract error. The engine enforced that ceiling and had never told the
|
|
13
|
+
manager it existed, so the one repair attempt it does allow failed the same
|
|
14
|
+
way. Every enforced bound now appears in the stage's schema requirements
|
|
15
|
+
with headroom (1,900 against a 2,000 ceiling).
|
|
16
|
+
- **An empty worker deliverable reaches its retry.** The corrective re-run had
|
|
17
|
+
always existed but a contract assertion fired first, so it was dead code.
|
|
18
|
+
- **A failed nested team leaves a real ledger.** Nested executions were
|
|
19
|
+
recorded only on success, so a mid-flight failure left `nestedExecutions`
|
|
20
|
+
empty while 20 model calls had already been billed, and the failure receipt
|
|
21
|
+
minted an `invocationId` with `crypto.randomUUID()` that had never named a
|
|
22
|
+
real call. Nested runs are now written as `running` when they start and
|
|
23
|
+
updated per stage; stages that never ran stay `null` rather than invented,
|
|
24
|
+
and failures carry the real invocation id.
|
|
25
|
+
|
|
26
|
+
These four defects (with the verifier overflow in 1.0.7) share one shape: a
|
|
27
|
+
fail-closed assertion placed ahead of the repair path it makes unreachable,
|
|
28
|
+
enforcing a limit the other side was never told. Four regression tests pin it.
|
|
29
|
+
|
|
30
|
+
## 1.0.8 — 2026-07-27
|
|
31
|
+
|
|
32
|
+
- **Arrow keys navigate the slash palette instead of collapsing it.** Moving
|
|
33
|
+
the highlight also wrote the highlighted command into the input line, and
|
|
34
|
+
the candidate list is derived from that line — so the list became a function
|
|
35
|
+
of the selection rather than of what you typed. Typing `/s` offered nine
|
|
36
|
+
commands; two presses of Down rewrote the line to `/switch` and cut the list
|
|
37
|
+
to two, leaving `/spawn`, `/steer`, `/search`, `/storm` and `/swarm`
|
|
38
|
+
unreachable no matter how many keys you pressed. Arrows now move the
|
|
39
|
+
highlight only and leave your query alone. Deleting the line rewrite was not
|
|
40
|
+
enough on its own: readline treats Up/Down as history navigation and a
|
|
41
|
+
prepended keypress listener runs first but cannot suppress that default, so
|
|
42
|
+
the query is now restored if readline moved through history.
|
|
43
|
+
|
|
3
44
|
## 1.0.7 — 2026-07-27
|
|
4
45
|
|
|
5
46
|
- **The selection prompt no longer carries the whole candidate set.** Measured
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/*
|
|
3
3
|
* CLI preferences (separate from the app's SQLite/keychain) — first-run onboarding result.
|
|
4
|
-
* Stored at <userData>/cli-prefs.json: { onboarded,
|
|
4
|
+
* Stored at <userData>/cli-prefs.json: { onboarded, language, runtime, permission }.
|
|
5
|
+
* `lang` is the v1 key for the same value — still read (engine/agentlas.cjs resolveLang)
|
|
6
|
+
* so an upgraded user keeps the language they chose, but never written by v2.
|
|
5
7
|
* Persisted permission is read|write; unrestricted/full is session-only.
|
|
6
8
|
*/
|
|
7
9
|
const fs = require("node:fs");
|
|
@@ -602,13 +602,27 @@ function attachSlashPalette(rl, opts = {}) {
|
|
|
602
602
|
stream.write("\x1b7\x1b[E\x1b[0J" + body + "\x1b8");
|
|
603
603
|
state.visible = true;
|
|
604
604
|
}
|
|
605
|
+
/*
|
|
606
|
+
* 화살표는 강조만 옮긴다 — 사용자가 친 질의는 그대로 둔다.
|
|
607
|
+
*
|
|
608
|
+
* 예전에는 여기서 선택 항목을 입력 줄에 써 넣었다(replaceLine(selectedCommand)).
|
|
609
|
+
* 그러면 후보 목록이 "질의로 거른 결과"가 아니라 "선택의 함수"가 되어 되먹임이 생긴다:
|
|
610
|
+
* `/s` 에서 ↓ 두 번이면 줄이 `/switch` 로 바뀌며 후보가 9개→2개로 접히고,
|
|
611
|
+
* 그 아래 항목(/spawn·/steer·/search·/storm·/swarm)엔 영원히 닿지 못했다.
|
|
612
|
+
* 오너가 본 "방향키 무브 안 됨"의 정체다(PTY 실측).
|
|
613
|
+
*
|
|
614
|
+
* 다만 readline 은 up/down 을 히스토리 이동으로 처리하고, prependListener 로는 그
|
|
615
|
+
* 기본 동작을 막을 수 없다(전파 중단이 없다). 팔레트가 열려 있는 동안 화살표의 의미는
|
|
616
|
+
* 목록 이동이므로, readline 이 줄을 건드렸으면 원래 질의로 되돌린다.
|
|
617
|
+
*/
|
|
605
618
|
function move(delta) {
|
|
606
619
|
const list = rows();
|
|
607
620
|
if (!list.length) return false;
|
|
608
621
|
state.selected = (state.selected + delta + list.length) % list.length;
|
|
609
622
|
state.selectedCommand = list[state.selected].command;
|
|
623
|
+
const query = rl.line || "";
|
|
610
624
|
setImmediate(() => {
|
|
611
|
-
|
|
625
|
+
if ((rl.line || "") !== query) replaceLine(query);
|
|
612
626
|
render();
|
|
613
627
|
});
|
|
614
628
|
return true;
|
|
@@ -1737,6 +1737,9 @@ function buildPrompts(task, identity) {
|
|
|
1737
1737
|
"Choose capabilityBindingPlan.inventory only from POLICY_FILTERED_LOCAL_TOOL_MENU_DATA. Cover every requiredToolCapabilities id exactly once for each slot/release pair. One selected tool row may cover multiple capabilities. If a required capability has no exact ready tool, do not invent a binding; return the best schema-valid plan and allow deterministic validation to reject it.",
|
|
1738
1738
|
"Each bound inventory row must explicitly contain slotId, agentReleaseId, permissionPolicyDigest, provider, toolId, capabilityIds, status=bound. An empty inventory is required when every slot has no required tool capability.",
|
|
1739
1739
|
"synthesis must explicitly author slotId, agentReleaseId, and brief. verifier must explicitly author slotId, agentReleaseId, brief, and a non-empty criteria array. The host will not add, remove, normalize, or substitute a release or field.",
|
|
1740
|
+
// 호스트가 강제하는 상한을 미리 알려준다 — 알려주지 않은 상한은 첫 시도를 반드시
|
|
1741
|
+
// 깨고 교정 1회로도 회복되지 않는다(2026-07-27 라이브 실측, 중첩 매니저 동일 계열).
|
|
1742
|
+
"Field bounds are hard: each packet objective at most 3800 characters, each expectedOutput at most 1900, at most 64 inputs of at most 1900 characters each, each synthesis/verifier brief at most 1900, and at most 32 verifier criteria of at most 450 characters each. Write briefs and criteria tightly.",
|
|
1740
1743
|
].join("\n");
|
|
1741
1744
|
return {
|
|
1742
1745
|
searchSystem: [
|
|
@@ -3149,6 +3152,9 @@ function create(deps = {}) {
|
|
|
3149
3152
|
"Return exactly one agentlas.workforce-team-delegation-plan.v1 object with plannedWorkerIds, packets, and synthesisBrief.",
|
|
3150
3153
|
`plannedWorkerIds and packet ids must be exactly this declared order: ${stableJson(exactWorkerIds)}.`,
|
|
3151
3154
|
"Every packet contains exactly id, objective, inputs, expectedOutput. No worker may be omitted, added, reordered, or substituted.",
|
|
3155
|
+
// 상한을 말해주지 않으면 첫 시도가 반드시 상한을 넘고, 교정 1회로도 못 줄인다
|
|
3156
|
+
// (2026-07-27 라이브 실측: synthesisBrief > 2000자로 4워커 런이 통째로 폐기).
|
|
3157
|
+
"Field bounds are hard: synthesisBrief at most 1900 characters, each packet objective at most 3800, each expectedOutput at most 1900, and at most 64 inputs of at most 1900 characters each. Write briefs tightly; do not restate the packet contents.",
|
|
3152
3158
|
].join("\n");
|
|
3153
3159
|
let attemptPrompt = stableJson({ sharedTask: workOrder.taskBrief, roleSlot: slotById.get(packet.slotId), packet, declaredWorkerIds: exactWorkerIds });
|
|
3154
3160
|
let priorDigest = null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentlas",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Agentlas agent terminal — chat with your installed AI agents and teams from the terminal, Claude Code style. Standalone: no desktop app required.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agentlas": "bin/agentlas.cjs"
|