agentlas 0.9.8 → 0.9.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 +25 -0
- package/README.md +19 -0
- package/engine/agentlas-workforce.cjs +18 -4
- package/engine/agentlas.cjs +50 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.9.9 — 2026-07-26
|
|
4
|
+
|
|
5
|
+
- In an explicitly initialized project, ordinary runs, firms, Stormbreaker, and
|
|
6
|
+
Workforce now receive the same local Context Slice from Agentlas OS v1.1.66
|
|
7
|
+
after the task is concrete. The slice carries inherited goals and constraints
|
|
8
|
+
plus exact definitions, backlinks, and structurally related files without
|
|
9
|
+
sending the project map to Hub or Cloud.
|
|
10
|
+
- Read, write, and full task permission no longer doubles as consent to create
|
|
11
|
+
`.agentlas/` or edit `.gitignore`. `agentlas project status` is passive, and
|
|
12
|
+
only the explicit `agentlas project init` boundary creates private project
|
|
13
|
+
state after announcing the side effects.
|
|
14
|
+
- Workload-routing receipts now conform to the public v1 nested schema, treat a
|
|
15
|
+
missing model/runtime pair as unresolved, and fail closed on unknown required
|
|
16
|
+
metadata or ambiguous duplicate model identifiers.
|
|
17
|
+
- The shared architecture seeder is monotonic: it preserves newer or
|
|
18
|
+
unparseable shared state, upgrades older state atomically, and repairs only
|
|
19
|
+
missing built-ins at an equal version instead of flipping the Desktop-shared
|
|
20
|
+
database back to an older Terminal bundle.
|
|
21
|
+
- Interactive output is append-only while a task runs, preserves long streamed
|
|
22
|
+
output and scrollback through resize/cancellation, wraps command meaning at
|
|
23
|
+
narrow widths, and keeps saved runtime, permission, lifecycle, and Korean/
|
|
24
|
+
English status text truthful.
|
|
25
|
+
- Release validation targets the exact Agentlas OS v1.1.66 contract commit
|
|
26
|
+
`3f6f9ac3929b9238330de18c758ba200fb371017`.
|
|
27
|
+
|
|
3
28
|
## 0.9.8 — 2026-07-25
|
|
4
29
|
|
|
5
30
|
- No more silent keyword fallback. When the connected model can't judge a route
|
package/README.md
CHANGED
|
@@ -116,6 +116,25 @@ agentlas import <폴더> # 로컬 에이전트/팀 임포트
|
|
|
116
116
|
agentlas list # 설치된 에이전트/회사 + 활성 런타임
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
+
**프로젝트 의존관계 지도**
|
|
120
|
+
```sh
|
|
121
|
+
agentlas project status
|
|
122
|
+
agentlas project init
|
|
123
|
+
agentlas context refresh
|
|
124
|
+
agentlas context refs resolveHubEntityKind
|
|
125
|
+
agentlas context slice --task "entity kind 라우팅 수정" \
|
|
126
|
+
--target src/package-kind.ts --render
|
|
127
|
+
agentlas context impact --changed src/package-kind.ts
|
|
128
|
+
agentlas context verify --changed src/package-kind.ts \
|
|
129
|
+
--reviewed src/register/route.ts
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`agentlas project init`으로 명시적으로 초기화한 프로젝트에서만 일반
|
|
133
|
+
실행, 팀, Stormbreaker, Workforce가 작업이 구체화된 뒤 같은 로컬 Context
|
|
134
|
+
Slice를 자동으로 받는다. 읽기·쓰기·전체 권한만으로는 `.agentlas/`나
|
|
135
|
+
`.gitignore`를 만들거나 수정하지 않는다. Hub/Cloud 검색에는 코드맵,
|
|
136
|
+
소스 경로, 프로젝트 파일 내용이 전송되지 않는다.
|
|
137
|
+
|
|
119
138
|
**Portable Experience Bundle과 Variant**
|
|
120
139
|
```sh
|
|
121
140
|
agentlas experience list
|
|
@@ -1643,7 +1643,13 @@ function create(deps = {}) {
|
|
|
1643
1643
|
}
|
|
1644
1644
|
|
|
1645
1645
|
async function runModel(runtime, system, prompt, context) {
|
|
1646
|
-
|
|
1646
|
+
const localContextSlice = typeof D.projectContextSlice === "function"
|
|
1647
|
+
? D.projectContextSlice(context.cwd, context.task || "")
|
|
1648
|
+
: "";
|
|
1649
|
+
const effectiveSystem = localContextSlice
|
|
1650
|
+
? `${system}\n\n${localContextSlice}`
|
|
1651
|
+
: system;
|
|
1652
|
+
if (typeof D.runModel === "function") return normalizeModelText(await D.runModel({ runtime, system: effectiveSystem, prompt, context }));
|
|
1647
1653
|
if (runtime.mode === "cli") {
|
|
1648
1654
|
const authorityMode = context.authorityMode || "no-authority";
|
|
1649
1655
|
if (runtime.kind === "codex" && authorityMode === "no-authority") {
|
|
@@ -1658,7 +1664,7 @@ function create(deps = {}) {
|
|
|
1658
1664
|
"Gemini CLI workforce execution is blocked until this host proves an empty built-in and MCP tool inventory",
|
|
1659
1665
|
);
|
|
1660
1666
|
}
|
|
1661
|
-
return normalizeModelText(await D.captureRuntime(runtime.kind,
|
|
1667
|
+
return normalizeModelText(await D.captureRuntime(runtime.kind, effectiveSystem, prompt, {
|
|
1662
1668
|
cwd: context.cwd,
|
|
1663
1669
|
env: context.env,
|
|
1664
1670
|
permission: context.permission,
|
|
@@ -1667,7 +1673,7 @@ function create(deps = {}) {
|
|
|
1667
1673
|
authorityMode,
|
|
1668
1674
|
}));
|
|
1669
1675
|
}
|
|
1670
|
-
return normalizeModelText(await D.runApi(runtime.backend, context.modelPin || runtime.model,
|
|
1676
|
+
return normalizeModelText(await D.runApi(runtime.backend, context.modelPin || runtime.model, effectiveSystem, prompt));
|
|
1671
1677
|
}
|
|
1672
1678
|
|
|
1673
1679
|
async function callHubTool(name, args) {
|
|
@@ -1888,7 +1894,15 @@ function create(deps = {}) {
|
|
|
1888
1894
|
const env = typeof D.buildChildEnv === "function" ? await D.buildChildEnv(db, {
|
|
1889
1895
|
projectPath: ctx.projectPath || null, permission, cwd, lang: ui.lang,
|
|
1890
1896
|
}) : process.env;
|
|
1891
|
-
const modelContext = {
|
|
1897
|
+
const modelContext = {
|
|
1898
|
+
cwd,
|
|
1899
|
+
permission,
|
|
1900
|
+
env,
|
|
1901
|
+
modelPin: ctx.modelPin || null,
|
|
1902
|
+
effortPin: ctx.effortPin,
|
|
1903
|
+
authorityMode: "no-authority",
|
|
1904
|
+
task,
|
|
1905
|
+
};
|
|
1892
1906
|
const prompts = buildPrompts(task, identity);
|
|
1893
1907
|
const runId = `workforce-run:${crypto.randomUUID()}`;
|
|
1894
1908
|
const provider = runtime.mode === "cli" ? runtime.kind : runtime.backend;
|
package/engine/agentlas.cjs
CHANGED
|
@@ -8334,7 +8334,39 @@ function ensureTerminalProjectForExecutionCli(db, projectPath, permission = PERM
|
|
|
8334
8334
|
if (permission === "read") return activeProjectPath(db, { projectPath: root });
|
|
8335
8335
|
return activeProjectPath(db, { projectPath: root, activate: true, reason });
|
|
8336
8336
|
}
|
|
8337
|
-
|
|
8337
|
+
|
|
8338
|
+
function cliProjectContextSlice(projectPath, task) {
|
|
8339
|
+
if (!projectPath || !String(task || "").trim()) return "";
|
|
8340
|
+
try {
|
|
8341
|
+
const coreRoot = resolveCoreRuntimeRoot();
|
|
8342
|
+
if (!coreRoot) return "";
|
|
8343
|
+
const result = captureCoreJsonSync(
|
|
8344
|
+
"agentlas_cloud",
|
|
8345
|
+
[
|
|
8346
|
+
"context", "slice",
|
|
8347
|
+
"--project", projectPath,
|
|
8348
|
+
"--task-stdin",
|
|
8349
|
+
"--no-refresh",
|
|
8350
|
+
"--render",
|
|
8351
|
+
],
|
|
8352
|
+
{
|
|
8353
|
+
cwd: projectPath,
|
|
8354
|
+
input: String(task).slice(0, 12_000),
|
|
8355
|
+
timeout: 4_000,
|
|
8356
|
+
},
|
|
8357
|
+
coreRoot,
|
|
8358
|
+
);
|
|
8359
|
+
return result
|
|
8360
|
+
&& result.schemaVersion === "agentlas.context-slice.v1"
|
|
8361
|
+
&& typeof result.rendered === "string"
|
|
8362
|
+
? result.rendered.trim()
|
|
8363
|
+
: "";
|
|
8364
|
+
} catch {
|
|
8365
|
+
return "";
|
|
8366
|
+
}
|
|
8367
|
+
}
|
|
8368
|
+
|
|
8369
|
+
function cliMemoryContext(db, projectPath, agentId = null, task = "") {
|
|
8338
8370
|
const sections = [];
|
|
8339
8371
|
const arch = loadArch();
|
|
8340
8372
|
ensureMemoryContextColumn(db);
|
|
@@ -8347,6 +8379,8 @@ function cliMemoryContext(db, projectPath, agentId = null) {
|
|
|
8347
8379
|
if (s.trim()) sections.push(`### Project memory (${projectPath})\n${s.trim()}`);
|
|
8348
8380
|
}
|
|
8349
8381
|
} catch { /* ignore */ }
|
|
8382
|
+
const contextSlice = cliProjectContextSlice(projectPath, task);
|
|
8383
|
+
if (contextSlice) sections.push(contextSlice);
|
|
8350
8384
|
}
|
|
8351
8385
|
if (tableExists(db, "memory_entries")) {
|
|
8352
8386
|
try {
|
|
@@ -8514,7 +8548,7 @@ function augmentSystem(db, baseSystem, ctx, withEmitter, request = "") {
|
|
|
8514
8548
|
sys = langDirective(lang) + (sys ? "\n\n" + sys : "");
|
|
8515
8549
|
const connectionSkill = loadGlobalConnectionSkill();
|
|
8516
8550
|
if (connectionSkill) sys += "\n\n" + connectionSkill;
|
|
8517
|
-
const mem = cliMemoryContext(db, ctx && ctx.projectPath, ctx && ctx.agentId);
|
|
8551
|
+
const mem = cliMemoryContext(db, ctx && ctx.projectPath, ctx && ctx.agentId, request);
|
|
8518
8552
|
if (mem) sys += "\n\n" + mem;
|
|
8519
8553
|
if (withEmitter) {
|
|
8520
8554
|
sys += "\n\n" + memoryEmitterPromptFor(request, arch, ctx && ctx.turnId, ctx && ctx.permission);
|
|
@@ -9803,7 +9837,7 @@ function buildHelpers(db) {
|
|
|
9803
9837
|
autoRouteNote: (choice, lang) => autoRouteNote(choice, lang),
|
|
9804
9838
|
autoRoutePreamble: (choice, lang) => autoRoutePreamble(choice, lang),
|
|
9805
9839
|
directSystemPrompt: (lang) => directSystemPrompt(lang),
|
|
9806
|
-
cliMemoryContext: (db_, pp, agentId) => cliMemoryContext(db_, pp, agentId),
|
|
9840
|
+
cliMemoryContext: (db_, pp, agentId, task) => cliMemoryContext(db_, pp, agentId, task),
|
|
9807
9841
|
importLocal: (db_, p) => importLocalFolderCli(db_, p),
|
|
9808
9842
|
// REPL-safe public Hub install: fail()(process.exit) 대신 Error를 throw 해 REPL이 직접 렌더하게 한다.
|
|
9809
9843
|
cloudInstall: async (db_, slug) => {
|
|
@@ -10285,6 +10319,7 @@ function workforce() {
|
|
|
10285
10319
|
fetchHub: (url, init) => fetchHubCli(url, init),
|
|
10286
10320
|
listWorkforceTools: listWorkforceToolsCli,
|
|
10287
10321
|
supportsWorkforceToolAuthority: async () => false,
|
|
10322
|
+
projectContextSlice: cliProjectContextSlice,
|
|
10288
10323
|
prefsLang,
|
|
10289
10324
|
out,
|
|
10290
10325
|
});
|
|
@@ -11949,6 +11984,7 @@ function cmdHelp() {
|
|
|
11949
11984
|
" research <sub> Research Engine: status|gather|search|read|plan",
|
|
11950
11985
|
" career-graph <sub> source routing index: status|list|add",
|
|
11951
11986
|
" ontology <sub> project knowledge: status|list|add (REPL: /ontology)",
|
|
11987
|
+
" context <sub> project map: refresh|locate|refs|slice|impact|verify",
|
|
11952
11988
|
" journal <sub> Stormbreaker run journal: status|verify|repair|gate",
|
|
11953
11989
|
"",
|
|
11954
11990
|
hdr("ACCOUNT & OPS"),
|
|
@@ -12063,6 +12099,17 @@ async function main() {
|
|
|
12063
12099
|
case "memory":
|
|
12064
12100
|
// Phase 1b: 기존 마크다운 메모리 → 공유 agentlas.sqlite 이관(dry-run 기본, --apply).
|
|
12065
12101
|
return require("./agentlas-memory-import.cjs").cmdMemory({ db, args: rest.slice(1), out, fail });
|
|
12102
|
+
case "context": {
|
|
12103
|
+
if (!rest[1]) return fail("usage: agentlas context refresh|locate|refs|slice|impact|verify [options]");
|
|
12104
|
+
const cwd = projectCwd();
|
|
12105
|
+
ensureTerminalProjectForExecutionCli(db, cwd, PERMISSION, "terminal-context");
|
|
12106
|
+
const contextArgs = rest.slice(1);
|
|
12107
|
+
const hasProject = contextArgs.includes("--project");
|
|
12108
|
+
return parity().cmdHep(
|
|
12109
|
+
db,
|
|
12110
|
+
["context", ...contextArgs, ...(hasProject ? [] : ["--project", cwd])],
|
|
12111
|
+
);
|
|
12112
|
+
}
|
|
12066
12113
|
case "evolve":
|
|
12067
12114
|
// Phase 2/2+: 데스크탑 트리거가 만든 성장 제안 검토·적용·되돌리기(공유 DB).
|
|
12068
12115
|
return require("./agentlas-evolution.cjs").cmdEvolve({ db, args: rest.slice(1), out, fail, agentFolder });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentlas",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.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"
|