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 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
- if (typeof D.runModel === "function") return normalizeModelText(await D.runModel({ runtime, system, prompt, context }));
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, system, prompt, {
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, system, prompt));
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 = { cwd, permission, env, modelPin: ctx.modelPin || null, effortPin: ctx.effortPin, authorityMode: "no-authority" };
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;
@@ -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
- function cliMemoryContext(db, projectPath, agentId = null) {
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.8",
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"