agentlas 0.6.0 → 0.9.1

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/README.md +220 -4
  3. package/bin/agentlas.cjs +8 -8
  4. package/engine/agentlas-capabilities.cjs +34 -3
  5. package/engine/agentlas-core-harness.cjs +205 -0
  6. package/engine/agentlas-desktop-loadout.cjs +527 -0
  7. package/engine/agentlas-doctor.cjs +1 -1
  8. package/engine/agentlas-experience-exchange.cjs +2151 -0
  9. package/engine/agentlas-experience-intake.cjs +444 -0
  10. package/engine/agentlas-experience-mcp.cjs +1709 -0
  11. package/engine/agentlas-i18n.cjs +10 -10
  12. package/engine/agentlas-input.cjs +5 -4
  13. package/engine/agentlas-mcp-env.cjs +219 -0
  14. package/engine/agentlas-mcp-wrapper.cjs +51 -0
  15. package/engine/agentlas-memory-governance.cjs +1029 -0
  16. package/engine/agentlas-native-host.cjs +129 -39
  17. package/engine/agentlas-parity.cjs +339 -154
  18. package/engine/agentlas-repl.cjs +327 -44
  19. package/engine/agentlas-workforce.cjs +2991 -0
  20. package/engine/agentlas-workload-routing.cjs +523 -0
  21. package/engine/agentlas.cjs +1886 -270
  22. package/engine/bootstrap-schema.sql +1 -1
  23. package/engine/experience-taxonomy-v1.json +49 -0
  24. package/package.json +8 -4
  25. package/scripts/gen-bootstrap-schema.sh +0 -23
  26. package/test/bootstrap-race.cjs +0 -47
  27. package/test/capture-runtime-guard.cjs +0 -122
  28. package/test/cloud-asset-restore.cjs +0 -423
  29. package/test/cloud-cas-client.cjs +0 -333
  30. package/test/cloud-owner-restore.cjs +0 -183
  31. package/test/cloud-runtime-paths.cjs +0 -40
  32. package/test/cloud-save-publish.cjs +0 -453
  33. package/test/credential-env-regression.cjs +0 -52
  34. package/test/login-loopback-security.cjs +0 -115
  35. package/test/mcp-config-isolation.cjs +0 -36
  36. package/test/permission-mapping.cjs +0 -180
  37. package/test/route-regression.cjs +0 -121
  38. package/test/run-api-regression.cjs +0 -322
  39. package/test/runtime-env-protection.cjs +0 -45
  40. package/test/semver-precedence.cjs +0 -39
  41. package/test/smoke.sh +0 -90
  42. package/test/sqlite-driver-probe.cjs +0 -22
  43. package/test/terminal-ui-regression.cjs +0 -472
  44. package/test/timeout-regression.cjs +0 -218
  45. package/test/tool-workspace-boundary.cjs +0 -165
  46. package/test/update-safety.cjs +0 -376
package/CHANGELOG.md ADDED
@@ -0,0 +1,190 @@
1
+ # Changelog
2
+
3
+ ## 0.9.1 — 2026-07-16
4
+
5
+ - Record exactly one compact Memory Ticket receipt for every completed,
6
+ failed, or cancelled user turn, including turns with zero durable memory
7
+ candidates and resumed Claude/Codex sessions.
8
+ - Run semantic curation as a separate no-tools advisory pass, then apply
9
+ deterministic privacy, permission, owner, and scope gates before any durable
10
+ write. Read-only turns keep the central receipt but never write project files
11
+ or durable memory.
12
+ - Add owner-isolated user-global, team, agent, and project timeline lanes with
13
+ idempotent completion and redacted Core-compatible JSONL mirrors. Raw prompts,
14
+ transcripts, secrets, and absolute paths are rejected from logs and payloads.
15
+ - Restrict npm artifacts to the runtime allowlist; tests, fixtures, benchmarks,
16
+ internal docs, credentials, and signing material remain unpublished.
17
+
18
+ ## 0.9.0 — 2026-07-16
19
+
20
+ - Add `agentlas plugin add <slug>` and `agentlas plugin list`. The Hub has
21
+ advertised `npx agentlas@latest plugin add <slug>` on every catalog plugin
22
+ and serves the manifest for it, but the subcommand did not exist, so every
23
+ listing pointed at a command that could not run. (`agentlas install` is
24
+ agent-only and fails with "Hub agent not found" on a plugin slug.)
25
+ - Register a plugin's MCP servers from its published manifest, separating stdio
26
+ launch commands from remote URLs so a mixed entry cannot violate the codex
27
+ config.toml schema and take the runtime down. Reinstalling is idempotent, and
28
+ a plugin that ships no MCP server is refused instead of reported installed.
29
+ - Translate remaining Korean runtime messages to English across the launcher,
30
+ doctor, parity, bootstrap schema, and tests.
31
+
32
+ ## 0.8.5 — 2026-07-16
33
+
34
+ - Preserve the exact bounded, host-authored contract diagnostic in each local
35
+ model's one allowed structured-output repair prompt. The host still never
36
+ mutates model output or replays private stage inputs, but a model can now see
37
+ which exact Selection, WorkOrder, or planner field failed instead of receiving
38
+ only a generic schema error.
39
+ - Keep Codex CLI Workforce execution fail-closed before the first model or Hub
40
+ call because Codex 0.144.4 continued to expose collaboration authority after
41
+ every available isolation flag and an isolated `CODEX_HOME` were applied.
42
+ - Pin both release workflows to Agentlas OS v1.1.45 at immutable commit
43
+ `49752a783e944c898ea023705104661b3beb87b2`, whose finite 23-code Hub
44
+ coverage-gap contract accepts the live aggregate response while rejecting
45
+ unknown or identity-bearing reasons.
46
+
47
+ ## 0.8.4 — 2026-07-16
48
+
49
+ - Make Workforce Ontology the default for ordinary direct, goal-like work on
50
+ new or untouched installs while preserving an explicit `network off` opt-out.
51
+ Sparse legacy role/tool declarations are optional semantic evidence instead
52
+ of accidental zero-candidate hard requirements.
53
+ - Persist every benchmark run as a scorer-ready, private JSON artifact with the
54
+ work order, content-only candidate set, host selection, three MCP receipts,
55
+ and real planner/worker/synthesis/verifier execution evidence.
56
+ - Give the host LLM one bounded schema-only repair attempt per structured phase
57
+ for malformed work orders, selections, or delegation plans, plus at most two
58
+ total semantic WorkOrder refinements from redacted required-cardinality gaps
59
+ or one valid `requestExpansionForSlots` content-expansion decision. Each
60
+ refinement has its own audited phase, re-searches the Hub, and supersedes the
61
+ prior search without exposing candidate identities, content, rankings, or
62
+ history to the refinement prompt. A repeated expansion or exhausted budget
63
+ fails closed; Terminal never fills a missing hard field, coerces expansion
64
+ through schema repair, falls back to a lexical router, or persists raw prior
65
+ model output. Only the idempotent Hub search may replay once after an outer
66
+ transport/JSON ambiguity; validation and preparation remain single-shot.
67
+ - Treat `consumes` and `produces` as exact candidate-profile declaration gates,
68
+ not ordinary workflow handoffs, and explain each hard-skill/tool/artifact or
69
+ entity-kind coverage gap to the same host LLM. General HR decomposition now
70
+ keeps any explicitly named specialized domain with distinct accountability
71
+ in its own slot instead of collapsing it into generic implementation work.
72
+ - Recompute every prepared roster row's domain-separated runtime bundle digest
73
+ from the exact selected release identity and complete directive bundle before
74
+ execution. Only execution-plan v5 with the explicit v4 digest-schema marker
75
+ is accepted. The shared Python/JavaScript domain rejects numbers, lone
76
+ surrogates, unsafe keys including `__proto__`, and non-JSON values; every row
77
+ must expose a nonblank top-level `systemPrompt`, `instructions`, or `agentMd`.
78
+ Directive or identity tampering now fails closed, while the sanitized nested
79
+ runtime package hash remains separate from the AgentRelease upload package
80
+ hash.
81
+ - Execute team releases as their declared manager and every graph worker in
82
+ exact order, followed by manager synthesis. A missing worker, flattened team,
83
+ unparseable manager plan, or fallback plan now rejects the v2 execution
84
+ receipt instead of masquerading as a successful team run.
85
+ - Build the local `tools/list` inventory only after Hub discovery, bind required
86
+ capabilities through the active host LLM, and validate the private inventory
87
+ and capability-binding plan against the public pair-scoped receipt. Raw local
88
+ tool inventory never crosses the Hub boundary.
89
+ - Probe Codex Workforce isolation and fail closed before the first model or Hub
90
+ call when Codex still exposes collaboration authority. Claude workforce
91
+ subprocesses run without inherited tool authority, API and Ollama workers are
92
+ zero-tool, and Gemini workforce execution fails closed until equivalent
93
+ isolation is proven. Required-tool work cannot start without an exact
94
+ policy-filtered native grant.
95
+ - Require direct WorkOrder and Selection objects from the active host LLM and
96
+ reject ceremonial tool-call envelopes, unknown keys, contradictory community
97
+ exclusions, and exhaustive "everything else" exclusion lists. Explicit user
98
+ prohibitions remain hard constraints while unused or adjacent communities do
99
+ not become accidental disqualifiers.
100
+ - Validate every Hub CandidateSet, slot, candidate, semantic snapshot,
101
+ evidence row, and operational card against exact keys before candidate text
102
+ reaches the selection prompt. Candidate metadata remains explicitly
103
+ untrusted data; unknown prompt-bearing fields fail closed. Structured repair
104
+ receipts persist fixed error-code messages instead of fragments copied from
105
+ rejected model output.
106
+ - Parse the Terminal Hub transport's bounded buffered `{ status, headers, text }`
107
+ response shape at the Workforce adapter boundary. This keeps real Hub MCP
108
+ JSON from being misclassified as invalid merely because it is not a native
109
+ Fetch `Response` object, and is covered by an end-to-end adapter regression.
110
+ - Ordinary `/network`, `/taskforce`, and `/workforce` requests now use the
111
+ Agent Workforce Ontology protocol. The active host LLM creates the pinned
112
+ work order and selects exact AgentRelease IDs from the Hub candidate menu;
113
+ Terminal only validates and executes that choice.
114
+ - Require the exact three workforce MCP calls, a real manager plan, distinct
115
+ pinned worker executions, synthesis, verifier, and auditable receipts. Stale
116
+ ontology versions, history or popularity influence, silent substitution,
117
+ planner fallback, and single-model masquerading fail closed.
118
+ - Keep the retired lexical router available only through explicit
119
+ `/legacy-network`. Cross-platform and npm release gates now exercise the
120
+ workforce runtime contract on Agentlas OS v1.1.44 at immutable commit
121
+ `f29381f15c0ee4f244c2bac253bbb992765bc859`, including canonical ontology
122
+ `awo:2026-07-15.2` and its reviewed singular payment/security aliases.
123
+ - This source commit does not prove a GitHub release or npm publication; both
124
+ remain separate immutable-tag gates.
125
+
126
+ ## 0.8.3 — 2026-07-14
127
+
128
+ - Pin all release and npm publication gates to Agentlas OS v1.1.28 commit
129
+ `d741da796289678c38fac1059f0473f271d0f7e9`. Codex, Claude Code, MCP,
130
+ Network, owner Cloud, and Storm plugin contacts now synchronously install the
131
+ same Core-owned project soul memory, code map, ontology runtime, CareerGraph,
132
+ and full `.agentlas/` privacy block before agent work starts.
133
+ - Ship the repository's npm OIDC trusted-publishing workflow. It accepts only
134
+ an exact immutable release tag, reruns the Core contracts and 45-case smoke
135
+ suite, and verifies registry visibility without storing a long-lived npm
136
+ publish token in GitHub.
137
+
138
+ ## 0.8.2 — 2026-07-14
139
+
140
+ - Include the post-`v0.8.1` hardened execution boundary: read-only discovery
141
+ remains passive, while the first real write/full run installs the complete
142
+ Core-owned project soul, memory, code map, ontology, Career Graph, and
143
+ privacy-first `.gitignore` contract.
144
+ - Fail closed when the parent AI's exact model choice is absent from live
145
+ inventory, exceeds a cost ceiling, or lacks required capabilities/context;
146
+ no provider alias or tier-to-model table chooses a model for the AI.
147
+ - Pin the cross-platform release gate to Agentlas OS v1.1.27 commit
148
+ `e024b68821b28aa40c7a22c94ac3832fed4155dd`, including the Windows ACL/POSIX
149
+ mode correction, and require the same Goal + UltraCode prompt bytes on all
150
+ three operating systems.
151
+
152
+ GitHub and npm publication remain separate operations. The registry version is
153
+ authoritative for `npm install -g agentlas` and must be verified after publish.
154
+
155
+ ## 0.8.1 — 2026-07-14
156
+
157
+ - Load the canonical, digest-addressed Stormbreaker Goal + UltraCode harness
158
+ from Agentlas OS instead of maintaining a Terminal-local prompt variant.
159
+ - Verify byte-identical harness behavior across macOS, Linux, and Windows, and
160
+ fail closed when the Core digest or runtime contract does not match.
161
+ - Isolate Windows test hosts and ACL-specific cleanup behavior so successful
162
+ product assertions are not misreported as failures by platform-only process
163
+ or temporary-directory semantics.
164
+ - Select only exact models advertised by the live host inventory; when that
165
+ inventory is unavailable, preserve the active model instead of inventing a
166
+ provider-specific model ID or effort level.
167
+ - Bootstrap canonical Core project memory on the first real write/full Terminal
168
+ execution while keeping read-only and discovery commands non-mutating. The
169
+ complete `.agentlas/` namespace is ignored and owner-only even during the
170
+ compatibility fallback to an older Core.
171
+ - Gate the Terminal release contract on the pinned Agentlas Core
172
+ project-bootstrap surface across macOS, Linux, and Windows.
173
+
174
+ GitHub tag: `v0.8.1`. The npm registry remained on `0.7.0`; the attempted
175
+ `0.8.1` publication was rejected by the registry's OTP gate and was never
176
+ reported as installed.
177
+
178
+ ## 0.8.0 — 2026-07-13
179
+
180
+ - Added separately owned Portable Experience/Taste assets, exact loadout and
181
+ receipt validation, privacy-filtered local experience candidates, and
182
+ explicit Desktop loadout opt-in.
183
+ - Added system-global-first MCP planning with one-pass consent, key-presence
184
+ checks, ordered alternatives, isolated failures, and valid empty-MCP mode.
185
+ - Added AI-authored model allocation receipts with live runtime inventory,
186
+ exact model/effort selection, explicit pins, cost ceilings, and visible
187
+ fallback reasons.
188
+
189
+ GitHub release: `v0.8.0`. npm publication is a separate registry action and is
190
+ not implied by the tag or GitHub asset.
package/README.md CHANGED
@@ -17,6 +17,22 @@ Claude Code style, standalone: **no desktop app required.**
17
17
  Agentlas Terminal is the already-shipped independent terminal product. It is
18
18
  not a Desktop `cli/` mirror and does not require the Desktop app to run.
19
19
 
20
+ > **Current source release candidate (2026-07-16):** `v0.9.1`. The source commit
21
+ > does not prove a GitHub release or npm publication. After the immutable tag
22
+ > and release gates pass, verify the independently published npm version with
23
+ > `npm view agentlas version` before installation.
24
+
25
+ Release tags are published to npm through the repository's OIDC trusted
26
+ publisher workflow. The workflow accepts only an exact immutable `vX.Y.Z` tag,
27
+ runs the Core/project-bootstrap contracts and smoke suite, and verifies the
28
+ registry result after publishing. No long-lived npm publish token is stored in
29
+ GitHub.
30
+
31
+ Release history and the source-versus-registry boundary are recorded in
32
+ [CHANGELOG.md](CHANGELOG.md). A published version must always come from its
33
+ exact tag: post-tag `main` changes are the next version and must never be
34
+ republished under an older version number.
35
+
20
36
  > **We are Agent Trust. Your agent is not a program. It is an asset. — Agentlas —**
21
37
 
22
38
  Agent Trust means owner-scoped, portable, inspectable, and restorable agent
@@ -33,6 +49,19 @@ agentlas
33
49
  Type a task and it auto-routes to the right agent. Your model, your choice:
34
50
  Claude Code / Codex / Gemini CLI subscriptions or BYOK API keys.
35
51
 
52
+ For team, builder, and swarm decomposition, the parent LLM first receives this
53
+ host's privacy-safe **live runtime inventory** and chooses an exact
54
+ `runtimeId`, `exactModelId`, and reasoning effort for every child and final
55
+ synthesis. When both Claude Code and Codex are connected, workers can run in
56
+ parallel across both; a plugin host only exposes the runtimes available in that
57
+ host. Terminal validates that each exact selection is still live, honors
58
+ explicit `/model <id>` and `/effort <level>` pins, and records visible fallback
59
+ reasons if a selected runtime/model disappears. It never derives a new model
60
+ name from task keywords or a fixed role table. Decision receipts contain a task
61
+ hash, not the raw prompt, in the private Agentlas user-data directory.
62
+ Operators can set `AGENTLAS_MODEL_MAX_TIER=economy|balanced|frontier` as a hard
63
+ cost ceiling.
64
+
36
65
  ---
37
66
 
38
67
  **Agentlas 터미널 CLI** — Claude Code(`claude`), Codex(`codex`)처럼
@@ -87,6 +116,157 @@ agentlas import <폴더> # 로컬 에이전트/팀 임포트
87
116
  agentlas list # 설치된 에이전트/회사 + 활성 런타임
88
117
  ```
89
118
 
119
+ **Portable Experience Bundle과 Variant**
120
+ ```sh
121
+ agentlas experience list
122
+ agentlas experience inspect <exact-release-id|bundle-id|upload-id>
123
+ agentlas experience validate <bundle.agentlas-experience.json>
124
+ agentlas experience save <bundle> --base-cloud-id <id> --base-package-hash sha256:<hash>
125
+ agentlas experience publish <bundle> --visibility unlisted \
126
+ --base-cloud-id <id> --base-package-hash sha256:<hash>
127
+ agentlas experience status <bundle-id|upload-id>
128
+ agentlas experience export <bundle-id|upload-id> [--out <file>] [--overwrite]
129
+ agentlas experience unpublish <exact-release-id|bundle-id|upload-id> [--dry-run]
130
+ # withdraw는 unpublish와 같은 exact receipt/revision 계약의 호환 별칭
131
+ agentlas experience withdraw <exact-release-id|bundle-id|upload-id>
132
+
133
+ # 로컬 0600 캐시만 만들고 Hub에는 보내지 않음
134
+ agentlas experience save <bundle> --local-only
135
+
136
+ # 이전 pack-only 로컬 의도 호환 명령
137
+ agentlas experience legacy-list
138
+ agentlas experience legacy-inspect <pack-id|release-id>
139
+ agentlas experience legacy-publish .agentlas/experience-pack.json
140
+ agentlas experience legacy-unpublish <pack-id|release-id>
141
+
142
+ agentlas variant resolve --candidates variants.json --base-release <release-id>
143
+ ```
144
+
145
+ `validate`는 256 items/3 MiB 한도, NFC canonical hash, 비밀값·PII·raw prompt/transcript·
146
+ 로컬 경로·base package·MCP 실행 정의 유입을 모델 호출 없이 검사한다. `save`는 정확한
147
+ Cloud base artifact를 서버에서 확인한 뒤 owner-private `draft-saved`로 저장한다.
148
+ `publish`도 곧바로 공개하지 않고 `verification-requested`까지만 요청한다. evaluator가
149
+ 검증한 새 release와 별도 Variant가 없으면 공개 활성·평판·자동대여 권위가 생기지 않는다.
150
+ 모든 변경 요청은 기존 로그인 세션, Idempotency-Key, exact revision ETag를 사용하고,
151
+ Terminal은 서버 영수증과 별도의 0600 로컬 상태만 보관한다. `--dry-run`은 로그인 확인,
152
+ 네트워크, 로컬 저장을 모두 하지 않는다.
153
+ `list`와 `inspect`는 현재 프로젝트에 저장된 Portable Bundle만 다시 검증해 보여주며,
154
+ owner/account, 로컬 경로, raw content, prompt/transcript, credential은 출력하지 않는다.
155
+ pack ID가 여러 release를 가리키면 최신 것을 임의 선택하지 않고 정확한 release/bundle/
156
+ upload ID를 요구한다. `unpublish --dry-run`은 로컬에서 검증된 exact server receipt와
157
+ revision이 있을 때만 조건부 삭제 계획을 보여주며 네트워크와 로컬 쓰기를 모두 0으로
158
+ 유지한다. 실제 `unpublish`는 그 revision을 `If-Match`로 보내고 서버의 새 `withdrawn`
159
+ 영수증을 검증한 뒤에만 로컬 상태를 전진시킨다.
160
+ `export`는 서버가 돌려준 bundle hash/semantic content/영수증 owner를 다시 검증한 뒤
161
+ 0600 파일로 원자적으로 저장한다. 기본은 기존 출력 파일을 덮어쓰지 않고 symlink는
162
+ 항상 거절하며, 같은 일반 파일을 명시적으로 교체할 때만 `--overwrite`를 사용한다.
163
+
164
+ 이전 pack-only 동작은 `legacy-list|legacy-inspect|legacy-publish|legacy-unpublish`로만
165
+ 명시적으로 접근한다. full Portable Bundle을 `publish`하면 새 서버 교환 경로를 사용한다. Experience Bundle은
166
+ base release를 참조할 뿐 base package를 복사하지 않는다.
167
+
168
+ `variant resolve`도 로컬 호환성 미리보기다. 후보 JSON의 `score`나
169
+ `compatibilityStatus: verified`는 사용자가 직접 쓸 수 있으므로 평판·결제·대여·실행
170
+ 권위로 인정하지 않는다. 실제 자동대여에는 Agentlas Web이 발급·검증한 서버 resolution
171
+ receipt가 별도로 필요하다.
172
+
173
+ **빌드 전 MCP 계획**
174
+ ```sh
175
+ agentlas build "GitHub 이슈를 정리하는 에이전트" --mcp-plan-only
176
+ agentlas build "GitHub 이슈를 정리하는 에이전트" --approve-mcp github
177
+ agentlas build "오프라인 에이전트" --no-mcp
178
+ agentlas build "Windows 셸 에이전트" \
179
+ --experience-base-release <exact-release-id> \
180
+ --experience-pack-release <exact-experience-release-id> \
181
+ --experience-task-signature agentlas.task.v1/debugging \
182
+ --experience-environment agentlas.env.v1/os/windows,agentlas.env.v1/arch/x64,agentlas.env.v1/runtime/terminal
183
+ agentlas run <agent> "Windows 오류를 디버깅해줘" \
184
+ --experience-base-release <exact-release-id> \
185
+ --experience-pack-release <exact-experience-release-id> \
186
+ --experience-task-signature agentlas.task.v1/debugging \
187
+ --experience-environment agentlas.env.v1/os/windows,agentlas.env.v1/arch/x64,agentlas.env.v1/runtime/terminal
188
+
189
+ # Desktop에서 사용자가 이미 승인해 현재 장착된 exact loadout만 명시적으로 사용
190
+ agentlas run <agent> "Windows 오류를 디버깅해줘" --experience-desktop-loadout
191
+ ```
192
+
193
+ 로컬에 호환 Experience가 저장되어 있다는 사실만으로는 장착으로 보지 않는다. 빌드와
194
+ 실행은 사용자가 선택했거나 권위 있는 loadout이 넘긴 정확한 Experience release ID가
195
+ 있을 때만 그 릴리스의 항목을 조회한다. 응답 유실이나 재시작도 다른 릴리스를 대신
196
+ 붙이는 근거가 되지 않는다.
197
+
198
+ Desktop 연동도 자동 장착이 아니다. `--experience-desktop-loadout`을 준 그 실행에서만
199
+ Desktop이 canonical `terminal-bridge/ontology-loadout-v2.json`에 원자적으로 쓴 0600
200
+ 로컬 권위 receipt를 읽는다. 임의 receipt 경로는 지원하지 않는다. Terminal은 로컬 DB의
201
+ exact 설치 에이전트 ↔ Hub base release 결속, Desktop 설치 authority instance와 단조
202
+ sequence를 다시 확인한다. 5분이 지난 receipt, 권한이 넓은 파일, symlink, 손상·변조된
203
+ JSON, 다른 Desktop 설치에서 복사한 receipt, rollback된 sequence, 다른 설치 에이전트,
204
+ 다른 base release는 모두 Experience 없는 안전 모드로 건너뛴다. 이 receipt는 Hub 서버
205
+ 서명이 아니라 같은 로컬 Agentlas DB에 결속된 Desktop 권위 증명이다. 같은 OS 사용자
206
+ 권한으로 DB와 canonical receipt를 함께 완전히 장악한 경우는 로컬 호스트 침해로 간주한다.
207
+ 수동 exact 플래그가 receipt와 다르면 둘 중 하나를 추정하지 않고 Experience를 끈다.
208
+ `--no-experience`가 항상 최우선이다.
209
+
210
+ 설치 에이전트의 성공한 실행이 새 `procedure|decision|risk` Memory를 큐레이션하면,
211
+ Terminal은 exact 에이전트/base release/현재 OS·arch·runtime에 묶인 Operational Experience
212
+ 후보를 기존 로컬 exchange store에 `private + draft + candidate`로 저장한다. 실행 자체는
213
+ 검증 통과로 간주하지 않으므로 후보는 자동 장착·promote·publish·Hub 전송되지 않는다.
214
+ raw prompt/transcript, 로컬 경로, URL, 이메일·전화·고객 식별자, credential, base package
215
+ 재료가 감지되면 내용은 복사하지 않고 reason code만 로컬 run ledger에 남긴다. 같은
216
+ 실행/Memory/base/environment 재처리는 같은 후보를 재사용한다. 실패 실행과 큐레이션된
217
+ 근거가 없는 성공 실행은 RunReceipt만 남기며 후보를 만들지 않는다. `preference`는
218
+ Operational 후보에 섞지 않고 내용 없는 로컬 Taste observation으로만 분리한다.
219
+
220
+ 빌드 전에는 Agentlas 시스템 전역 MCP 레지스트리의 메타데이터를 먼저 읽고, 관련
221
+ MCP·키 필요 여부·키 존재 여부만 한 번에 보여 준다. 승인 뒤에만 정확한 시스템 전역
222
+ DB 행을 다시 읽어 MCP initialize/tools-list 연결을 개별 검사한다. 성공한 행만 private
223
+ structured allowlist로 native 빌더 경계에 전달되며, 자연어 prompt는 실행 권한이 아니다.
224
+ 이 첫 출력은 추천일 뿐이다. 한 번의 명시 동의 전에는 어떤 MCP도 붙이지 않고,
225
+ 네트워크 key probe나 설치도 수행하지 않는다.
226
+ 성공한 Build 승인에는 서버 ID·transport·command·args·키 이름을 묶은 비밀 없는 지문만
227
+ 로컬 영수증으로 남는다. 이후 일반 `full` 턴은 enabled 상태와 이 exact 지문이 모두 맞는
228
+ 서버만 붙이며, 행이 바뀌거나 비활성화되면 자동으로 empty-MCP로 돌아간다. Playwright를
229
+ 포함한 어떤 서버도 legacy 기본값으로 자동 주입하지 않는다.
230
+ 명령·인자는 로컬 host config에만 있고 package/prompt/영수증에는 들어가지 않으며 URL·키
231
+ 값은 전달하지 않는다. LLM provider는 자기 로그인 환경을 유지하지만 실제 MCP 자식은
232
+ Agentlas 소유 wrapper를 거쳐 별도 HOME과 최소 실행 환경을 받는다. 이때 post-consent
233
+ 레지스트리의 `env_keys_json`에 적힌 키 이름만 값이 전달되고, 나머지 process/global/project/
234
+ agent 자격증명은 상속되지 않는다. wrapper 설정과 로그에는 키 값이 기록되지 않는다.
235
+ HOME과 임시 폴더도 서버별 전용 디렉터리다. PATH/OS 실행 필수값 외의 proxy·TLS override·
236
+ NODE_OPTIONS 같은 host-control 변수는 `env_keys_json`에 적혀 있어도 거절한다.
237
+ 최대 3개 probe만 병렬 실행하고 전체 12초 deadline을 적용하므로 8개 서버가 순차로 64초를
238
+ 소모하지 않는다. 한 probe의 timeout/실패는 그 서버에만 남는다. 비대화형 실행은 묻지 않고 기본적으로 아무 MCP도 승인하지 않아
239
+ CI가 멈추지 않는다. 한 MCP가 없거나 키가 없어도 그 기능만 degraded가 되며 빌드는
240
+ 나머지 연결 또는 empty-MCP 모드로 계속된다. `--require-mcp <catalog-id>`는 빌드 전체를 중단시키지 않고
241
+ Variant 대여 판단에서 해당 Variant만 제외하는 계약을 만든다.
242
+ 한 requirement에 승인된 alternatives가 있으면 primary 실패 뒤 같은 12초 deadline 안에서
243
+ 그 그룹만 순차 fallback하며, 다른 requirement의 probe와 결과는 격리한다.
244
+ 시스템 전역 레지스트리를 읽지 못한 경우도 `registry: unavailable`로 명확히 구분하고,
245
+ 설치나 네트워크 폴백 없이 empty-MCP 모드로 계속한다.
246
+ REPL의 `/build`도 top-level `agentlas build`와 같은 계획·한 번 동의·결과 경로를
247
+ 사용하며, MCP 사전 계획을 건너뛰는 별도 builder 지름길은 없다.
248
+ 로컬 promoted Experience도 같은 handler에서 사용자가 고른 exact Experience release,
249
+ exact base release, 현재 프로젝트, task signature, environment constraint가 모두 맞을 때만
250
+ 조회한다. 일반 `agentlas run`의 내부 loadout 경로 역시 설치된 Cloud package marker와
251
+ 로컬의 서버 확인 baseResolution이 hash/slug/release까지 정확히 같고, 권위 있는 loadout이
252
+ 정확한 Experience release ID를 넘긴 경우에만 후보가 된다. 현재 요청은 고정된 양언어
253
+ 키워드 표로 분류하며 허용된 `agentlas.task.v1/<class>` ID가 그 장착 릴리스의 item에 있을
254
+ 때만 조회한다. 환경도 현재 host가 만든 `agentlas.env.v1/os|arch|runtime/...` 태그와 정확히
255
+ 맞아야 한다. opaque hash, `general`, legacy signature/constraint는 저장·교환은 가능하지만
256
+ 활성하지 않고 stderr에 skip reason을 남긴다. 동의어·embedding 추정은 쓰지 않으며 CLI의
257
+ 명시 task class는 자동 분류보다 우선한다.
258
+ 분류표는 `engine/experience-taxonomy-v1.json`의 checksum
259
+ `sha256:413833472e423352518f9591cd0e051c5bc0a7971e53ab3dc7b5aaf7d50c37ab`으로 고정한다.
260
+ OS는 macos/windows/linux/ios/android/unknown, arch는 arm64/x64/unknown만 허용하고 runtime은
261
+ 최소 2자다. 알 수 없는 OS/arch는 해당 item만 `unknown`/ineligible 처리하며 base agent는 유지한다.
262
+ 합계 8개/800
263
+ 추정 토큰을 넘지 않으며, prompt에는 `NO SERVER RENTAL-RESOLUTION RECEIPT`가 표시되어
264
+ 로컬 사용자 증언을 서버 검증 평판처럼 오인하지 않게 한다.
265
+
266
+ API/BYOK 경로의 항상 켜진 Memory emitter는 UTF-8 bytes/3 기준 150토큰 이하 core만
267
+ 주입한다. 전체 Memory Events schema는 기억·메모리 작업에서만, 로컬 credential index
268
+ 안내는 deploy/release/billing/auth/API/cloud 작업에서만 별도로 로드한다.
269
+
90
270
  **내 Agent Cloud 자산**
91
271
  ```sh
92
272
  agentlas cloud save <경로> # 소유자 전용 비공개 저장(공개 심사/라우팅 카드 없음)
@@ -97,20 +277,50 @@ agentlas cloud restore <slug> # 전체 hash 검증 후 이 컴퓨터에 exa
97
277
 
98
278
  비공개 저장도 업로드 전 로컬에서 비밀값, 안전하지 않은 경로, 파일별 hash와
99
279
  전체 package hash를 검사한다. 공개 Hub 발행에만 라우팅 카드와 공개 검토가 붙는다.
280
+ `.agentlas/experience-relations.jsonl`과 `.previous`/hidden temp siblings는 로컬에서
281
+ 재생성되는 Experience 관계 인덱스이므로 base Agent hash와 Cloud bundle에서 제외된다.
100
282
 
101
283
  `agentlas cloud install <slug>`은 기존 호환 명령이며 공개 Hub 설치다. 비공개
102
284
  Agent Cloud 소유자 복원은 반드시 `agentlas cloud restore <slug>`를 사용한다.
103
285
 
104
286
  **실행 엔진**
105
287
  ```sh
106
- agentlas storm "목표" # 견고 파이프라인 라우팅→검증→실행 (Stormbreaker) [--research]
288
+ agentlas storm "목표" # Agentlas 자체 Goal+UltraCode: 계획→런타임/모델/effort 배정→실행→검증 [--research]
107
289
  agentlas swarm "목표" # emergent 에이전트 스웜 [--parallel N]
108
- agentlas network "요청" # A2A 태스크포스로 분해 (hep-network)
290
+ agentlas network "요청" # 상위 LLM이 Workforce Ontology에서 exact-release TF 선발·실행
291
+ agentlas network "요청" --benchmark # child/synthesis/verifier 영수증 누락 시 실패
292
+ agentlas legacy-network "요청" # 이전 hep-network 호환 경로(명시 실행만)
109
293
  agentlas call "a,b" "컨텍스트" # 지정 에이전트 호출 (hep-call)
110
294
  agentlas browser # 실제 브라우저 하드포인트 (hep-browser)
111
295
  agentlas route "요청" # 라우팅 미리보기 (실행 없음)
112
296
  ```
113
297
 
298
+ `swarm`은 먼저 상위 LLM이 독립 작업과 의존성을 나누고, 이 호스트에서 실제 실행
299
+ 가능한 런타임·모델·effort 목록을 보고 각 워커 및 최종 종합의 정확한
300
+ `runtimeId + exactModelId + effort`를 고른다. Claude Code와 Codex가 둘 다 연결돼
301
+ 있으면 둘로 병렬 분배한다. 플러그인 안에서는 그 플러그인을 호스트하는 CLI의 목록만
302
+ 노출한다. 터미널 코드는 이 판단을 키워드 규칙이나 고정 모델명으로 대체하지 않고,
303
+ 선택이 여전히 가능한지·capability·context·비용 상한·명시적 사용자 고정만 검증한다.
304
+ 배정 JSON이 깨지거나 런타임/모델이 사라지면 현재 모델로 폴백하고 그 이유를 화면과
305
+ 비공개 영수증에 남긴다.
306
+
307
+ `network`는 새 Agent Workforce Ontology 경로다. 활성 상위 LLM이 먼저 redacted
308
+ work order와 역할 슬롯을 만든 뒤 Hub MCP의 `workforce.search_candidates`를 직접
309
+ 호출하고, 반환된 직무·skill·MCP/tool·eval 증거 안에서 정확한 release를 고른다.
310
+ 호스트 코드는 팀을 고르지 않고 계약만 검사한다. 선택은
311
+ `workforce.validate_selection`으로 검증하고, `workforce.prepare_execution`이 같은
312
+ release/version/package hash/content digest에 고정한 directive bundle을 반환한 뒤에만
313
+ manager plan → 별도 worker → synthesis → verifier 순서로 실행한다. 후보 밖 release,
314
+ digest 불일치, 실행 불가, 대체 release, 잘못된 planner JSON은 기존 검색이나 로컬
315
+ 에이전트로 폴백하지 않고 실패한다. `--benchmark`는 planner fallback 0건, 모든 child,
316
+ synthesis, verifier 영수증과 verifier pass를 모두 요구한다. 이전 Hephaestus 분해기는
317
+ `legacy-network`로만 명시 호출할 수 있다.
318
+
319
+ 새 설치와 아직 network 설정을 건드리지 않은 설치에서는 일반적인 실작업형 요청도
320
+ 이 Workforce 경로로 자동 진입한다. 사용자가 `/config network off`로 명시적으로 끈
321
+ 값은 업그레이드 후에도 보존된다. 질문·잡담과 이미 특정 에이전트를 고른 대화에는
322
+ 자동 TF를 붙이지 않는다.
323
+
114
324
  **지식 & 리서치**
115
325
  ```sh
116
326
  agentlas research <sub> # Research Engine (status|gather|search|read|plan)
@@ -140,6 +350,12 @@ agentlas cloud <sub> # 자산 저장·공개·복원 (save|publish
140
350
  공통 옵션: `--runtime claude-code|codex|gemini` · `--permission read|write|full`
141
351
  REPL 안에서는 `/`로 명령 팔레트 (`/build` `/search` `/storm` `/network` …).
142
352
 
353
+ `storm`은 외부 CLI의 자동 실행 스위치를 켜는 명령이 아니다. Agentlas Core에서 서명된 동일한
354
+ Goal/UltraCode 하네스를 읽고 SHA-256을 검증한 뒤, Terminal의 부모 플래너가 현재 연결된 런타임과
355
+ 모델 목록을 보고 작업별 `runtimeId`·정확한 모델·effort를 확정한다. 독립 작업은 병렬 실행하고
356
+ 증거 기반 최종 게이트에서 결과를 종합한다. Core 하네스를 읽거나 검증하지 못하면 로컬 문구로
357
+ 대체하지 않고 모델 호출 전에 중단한다.
358
+
143
359
  권한은 이름과 실제 런타임 실행 범위를 일치시킨다.
144
360
 
145
361
  | Agentlas 권한 | Claude Code | Codex | Gemini CLI |
@@ -148,8 +364,8 @@ REPL 안에서는 `/`로 명령 팔레트 (`/build` `/search` `/storm` `/network
148
364
  | `write` | `acceptEdits` | `workspace-write` sandbox | `auto_edit` |
149
365
  | `full` | permission 검사 우회 | approval + sandbox 우회 | `yolo` |
150
366
 
151
- `write`는 무제한 권한의 다른 이름이 아니다. 외부 상태를 바꿀 수 있는 MCP/Playwright
152
- 도구는 `full` 턴에서만 주입한다. 입력창에서 `Shift-Tab`으로 권한을 순환할 수 있지만,
367
+ `write`는 무제한 권한의 다른 이름이 아니다. 외부 상태를 바꿀 수 있는 MCP 도구는
368
+ `full`이면서 exact 동의 지문이 유효한 턴에만 주입한다. 입력창에서 `Shift-Tab`으로 권한을 순환할 수 있지만,
153
369
  `write → full`은 5초 안에 두 번 연속 눌러야 하며 이 변경은 현재 세션에만 적용된다.
154
370
  실행 중 `Ctrl-T`는 Claude Todo/Task, Codex `todo_list`, Gemini `write_todos`가 실제로
155
371
  보낸 체크리스트만 열고 접는다. 일반 Bash/Read 실행을 계획 항목처럼 꾸며내지 않는다.
package/bin/agentlas.cjs CHANGED
@@ -94,7 +94,7 @@ function openSqlite(p) {
94
94
  } catch { /* optional dep 미설치/ABI 불일치 */ }
95
95
  const major = Number(process.versions.node.split(".")[0]);
96
96
  if (major < 22) {
97
- throw new Error(`Node ${process.version} — better-sqlite3가 없으면 Node 22+ (node:sqlite) 필요합니다.`);
97
+ throw new Error(`Node ${process.version} — Node 22+ (node:sqlite) is required when better-sqlite3 is unavailable.`);
98
98
  }
99
99
  const { DatabaseSync } = loadNodeSqliteQuietly();
100
100
  const db = new DatabaseSync(p);
@@ -109,7 +109,7 @@ function bootstrapDbIfMissing() {
109
109
  if (exists(p)) return { created: false, path: p };
110
110
  const schemaFile = path.join(PKG_ROOT, "engine", "bootstrap-schema.sql");
111
111
  if (!exists(schemaFile)) {
112
- throw new Error(`부트스트랩 스키마가 없습니다: ${schemaFile}`);
112
+ throw new Error(`Bootstrap schema not found: ${schemaFile}`);
113
113
  }
114
114
  fs.mkdirSync(path.dirname(p), { recursive: true });
115
115
  const sql = fs.readFileSync(schemaFile, "utf8");
@@ -123,7 +123,7 @@ function bootstrapDbIfMissing() {
123
123
  } catch (e) {
124
124
  db.close();
125
125
  try { fs.rmSync(temp, { force: true }); } catch { /* leave temp for inspection */ }
126
- throw new Error(`DB 부트스트랩 실패: ${e.message}`);
126
+ throw new Error(`Database bootstrap failed: ${e.message}`);
127
127
  }
128
128
  db.close();
129
129
  let created = false;
@@ -132,7 +132,7 @@ function bootstrapDbIfMissing() {
132
132
  created = true;
133
133
  } catch (e) {
134
134
  if (!e || e.code !== "EEXIST") {
135
- throw new Error(`DB 원자 부트스트랩 전환 실패: ${e && e.message ? e.message : e}`);
135
+ throw new Error(`Atomic database bootstrap failed: ${e && e.message ? e.message : e}`);
136
136
  }
137
137
  } finally {
138
138
  try { fs.rmSync(temp, { force: true }); } catch { /* noop */ }
@@ -150,9 +150,9 @@ function main() {
150
150
 
151
151
  let error = null;
152
152
  if (!engineFound) {
153
- error = "엔진이 없습니다 (engine/agentlas.cjs). 재설치: npm i -g agentlas";
153
+ error = "Engine not found (engine/agentlas.cjs). Reinstall with: npm i -g agentlas";
154
154
  } else if (!sqliteDriver) {
155
- error = `Node ${process.version} — SQLite 드라이버가 없습니다. Node 22.5+ 올리거나 'npm i -g agentlas' 재설치(better-sqlite3 빌드)하세요.`;
155
+ error = `Node ${process.version} — no SQLite driver. Upgrade to Node 22.5+ or reinstall with 'npm i -g agentlas' to build better-sqlite3.`;
156
156
  }
157
157
 
158
158
  if (args[0] === "--where" || args[0] === "terminal-where") {
@@ -178,7 +178,7 @@ function main() {
178
178
  try {
179
179
  const boot = bootstrapDbIfMissing();
180
180
  if (boot.created) {
181
- process.stderr.write(`첫 실행: Agentlas 데이터 초기화 완료 (${boot.path})\n`);
181
+ process.stderr.write(`First run: initialized Agentlas data (${boot.path})\n`);
182
182
  }
183
183
  } catch (e) {
184
184
  process.stderr.write(`${e.message}\n`);
@@ -201,7 +201,7 @@ function main() {
201
201
  }
202
202
 
203
203
  child.on("error", (err) => {
204
- process.stderr.write(`Agentlas 엔진 실행 실패: ${err.message}\n`);
204
+ process.stderr.write(`Failed to start the Agentlas engine: ${err.message}\n`);
205
205
  process.exit(1);
206
206
  });
207
207
  child.on("exit", (code, signal) => {
@@ -41,19 +41,50 @@ function runtimeFromSpec(spec) {
41
41
  }
42
42
 
43
43
  // Does this agent's job involve generating/handling images?
44
+ // /그림(?!자)/ — "그림자"(shadow)는 이미지 힌트가 아니다.
44
45
  const IMAGE_HINTS = [
45
- /image/i, /이미지/, /그림/, /\bdesign\b/i, /디자인/, /쇼핑몰/, /상품\s*(사진|이미지|상세)/, /상세\s*페이지/,
46
+ /image/i, /이미지/, /그림(?!자)/, /\bdesign\b/i, /디자인/, /쇼핑몰/, /상품\s*(사진|이미지|상세)/, /상세\s*페이지/,
46
47
  /thumbnail/i, /썸네일/, /banner/i, /배너/, /poster/i, /포스터/, /visual/i, /비주얼/, /illustrat/i, /일러스트/,
47
48
  /로고/, /\blogo\b/i, /사진/, /photo/i, /nano-?banana/i, /imagen/i, /이미지\s*생성/, /그래픽/, /graphic/i,
48
49
  ];
49
50
  // 빌더/메타/조율/거버넌스 역할은 (이미지 에이전트를 *만들* 수는 있어도) 스스로 이미지를 생산하지 않는다.
50
51
  // 이런 역할이 system_prompt에 "이미지/디자인"을 언급한다는 이유로 gemini로 끌려가면 코드/빌드 품질이 떨어진다.
51
52
  const NON_IMAGE_ROLES = new Set(["meta", "builder", "orchestrator", "pm", "curator", "governance"]);
53
+ // 부정/거절 문장("이미지 생성 금지", "영상·이미지 생성은 하지 않는다")은 능력이 아니라
54
+ // 반(反)능력 선언이다 — 그 문장 안의 힌트는 세지 않는다. 단, "묻지 않고 바로 생성한다"처럼
55
+ // 긍정문에 흔한 보조 부정("않고","없다" 단독)은 잡지 않도록 강한 금지 구문만 매칭한다.
56
+ const IMAGE_NEGATION_RE = /(금지|하지\s*않|하지\s*마|말\s*것|거절|불가(?!피)|아니다|refuse|\bnever\b|\bdo(es)?\s+not\b|\bdon'?t\b)/i;
57
+ // 이미지 생성 도구 이름은 단독으로도 이미지 생산 역할의 강한 증거다.
58
+ const IMAGE_TOOL_MARKERS = [/nano-?banana/i, /\bimagen\b/i, /gpt-image/i, /grok\s*imagine/i];
59
+ // 사고(2026-07-12): appbridge CEO 프롬프트의 "코드/디자인/스토어 결정의 owner가 아니다" 속
60
+ // "디자인" 한 단어로 이미지 에이전트 판정 → PPT 요청 세션이 통째로 gemini로 전환됐다.
61
+ // 수리: 정체성 존(이름/태그라인)은 그대로 신뢰하되, 본문 단독으로는 "힌트를 포함한 긍정문
62
+ // 3문장 이상"을 요구한다. 문장 단위로 세므로 "상품 이미지 생성 금지" 같은 한 문장이
63
+ // 겹치는 정규식 여러 개를 동시에 때려도 1클러스터다.
64
+ const MIN_BODY_IMAGE_SENTENCES = 3;
65
+ const BODY_SCAN_CAP = 16000; // 로컬 임포트 상한과 동일 — 클라우드 무제한 프롬프트의 전문 스캔 방지
52
66
  function needsImage(agent) {
53
67
  if (!agent) return false;
54
68
  if (NON_IMAGE_ROLES.has(String(agent.role || "").toLowerCase())) return false;
55
- const hay = `${agent.name || ""} ${agent.name_en || ""} ${agent.tagline || ""} ${agent.tagline_en || ""} ${agent.system_prompt || ""}`;
56
- return IMAGE_HINTS.some((re) => re.test(hay));
69
+ // 정체성 존은 사용자가 선언한 이름/태그라인만 slug는 폴더명에서 기계 파생되므로
70
+ // ("design-system" 리포 임포트 등) 단독 신뢰 대상이 아니다.
71
+ const identity = [agent.name, agent.name_en, agent.tagline, agent.tagline_en].filter(Boolean).join(" ");
72
+ if (IMAGE_HINTS.some((re) => re.test(identity))) return true;
73
+ // 팀 CEO 두뇌(부서 소개·위임 규칙)에서는 body 키워드가 역할 증거가 아니다 — vibecoder처럼
74
+ // "Design and Publishing HQ" 부서명이 10문장씩 나오는 조율용 프롬프트가 이미지 팀으로
75
+ // 오판되던 사례. entity_kind='team'은 사용자가 선언한 정체성 존만 신뢰한다.
76
+ if (String(agent.entity_kind || "").toLowerCase() === "team") return false;
77
+ const body = String(agent.system_prompt || "").slice(0, BODY_SCAN_CAP);
78
+ let clusters = 0;
79
+ for (const sentence of body.split(/[\n.!?。!?]+/)) {
80
+ if (!sentence || IMAGE_NEGATION_RE.test(sentence)) continue;
81
+ if (IMAGE_TOOL_MARKERS.some((re) => re.test(sentence))) return true;
82
+ if (IMAGE_HINTS.some((re) => re.test(sentence))) {
83
+ clusters += 1;
84
+ if (clusters >= MIN_BODY_IMAGE_SENTENCES) return true;
85
+ }
86
+ }
87
+ return false;
57
88
  }
58
89
 
59
90
  // Auto-pick a runtime spec for an agent given installed CLI kinds and the session default spec.