agentlas 1.0.35 → 1.0.37
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 +17 -0
- package/engine/architecture.data.json +13 -1
- package/engine/commands/cloud.cjs +4 -1
- package/engine/commands/doctor.cjs +1 -1
- package/engine/commands/list.cjs +1 -1
- package/engine/commands/roles.cjs +2 -1
- package/engine/commands/upload.cjs +4 -1
- package/engine/memory-cli/curate.cjs +12 -1
- package/engine/sessions/apply-fences.cjs +75 -1
- package/engine/sessions/prompt.cjs +27 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.37 — 2026-08-10
|
|
4
|
+
|
|
5
|
+
Agentlas One can now carry its owner-bound identity and curated memory tickets
|
|
6
|
+
across Terminal sessions without turning the agent into the owner of a project.
|
|
7
|
+
|
|
8
|
+
- When One is explicitly enabled, Terminal loads its bounded directive at the
|
|
9
|
+
per-turn system boundary and forwards only `agent_repo` and `user_identity`
|
|
10
|
+
memory candidates to One's existing ledger. Project memory stays with the
|
|
11
|
+
project, and a missing or disabled One workspace remains a no-op.
|
|
12
|
+
- The Memory Events parser accepts both the canonical ticket envelope and the
|
|
13
|
+
legacy array form, so valid candidates are no longer silently discarded.
|
|
14
|
+
- Global `--json` output now reaches doctor, list, roles, Cloud restore, and
|
|
15
|
+
upload commands consistently; machine-readable output is no longer prefixed
|
|
16
|
+
by human status text.
|
|
17
|
+
- The built-in architecture projection includes Agentlas One as a hidden
|
|
18
|
+
orchestrator rather than a top-level project or user-facing worker.
|
|
19
|
+
|
|
3
20
|
## 1.0.34 — 2026-08-06
|
|
4
21
|
|
|
5
22
|
Telegram, standalone. The terminal can now connect a Telegram bot with no desktop app.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
2
|
+
"version": "1.7.0",
|
|
3
3
|
"emitterBlock": "## Memory (Agentlas curated memory)\n\nAt the end of EVERY completed normal reply, emit exactly one hidden Memory Events\nenvelope. The runtime removes it before display. This envelope is the per-turn receipt:\nalways include a compact safe turn_summary, and use an empty candidates array when\nnothing durable was learned. Do not skip the envelope.\n\nRules:\n- Never include secrets, credentials, API keys, raw logs, or full transcripts.\n- Real credential values may live only in local project .env/.env.local,\n ignored signing/ or credentials/ files, or a local keychain/vault. Memory\n Events may mention env names and local relative paths only.\n- For deploy, release, store, billing, auth, API, or cloud work, first read the\n project's .agentlas/local-credentials.map.json and the top\n \"Local Credential Index\" section of .agentlas/project-soul-memory.md\n before saying a credential is missing.\n- One candidate per durable item. Keep \"content\" to one or two sentences.\n- \"memory_kind\": fact | decision | preference | risk | procedure | hypothesis | evidence | deprecation | conflict\n- \"suggested_scope\": user_identity | team_memory | project (this folder) | agent_repo | session (temporary) | discard\n- Use user_identity for a stable operator preference or personal fact (their name, role, language, tone,\n how they want you to behave) — these must outlive any one project. The curator only files user_identity\n when you label it so with \"confidence\": \"high\"; it never promotes into that scope, so a preference emitted\n at lower confidence is demoted to a throwaway session note.\n- \"agent_team\" is accepted only as a legacy alias for team_memory.\n- Add \"request_context\" when it improves future recall: user_intent, trigger_terms,\n cwd_at_request, target_project, target_path, cross_context, outcome.\n- Never put the raw user prompt or transcript in request_context.\n- Suggest a scope; the separate Memory Curator decides the final destination.\n- turn_summary is one value-free sentence about the completed outcome. It is not the\n user prompt, a transcript, raw log, secret, or absolute local path.\n\nFormat (always emit, including an empty candidates array):\n\n## Memory Events\n```json\n{\n \"schema_version\": \"agentlas.memory-ticket.v1\",\n \"turn_summary\": \"Completed outcome in one safe sentence.\",\n \"candidates\": [\n {\n \"memory_kind\": \"decision\",\n \"content\": \"...\",\n \"suggested_scope\": \"project\",\n \"confidence\": \"high\",\n \"sensitivity\": \"internal\",\n \"evidence_refs\": [],\n \"request_context\": {\n \"user_intent\": \"...\",\n \"trigger_terms\": [\"...\"],\n \"cwd_at_request\": null,\n \"target_project\": null,\n \"target_path\": null,\n \"cross_context\": false,\n \"outcome\": \"...\"\n }\n }\n ]\n}\n```",
|
|
4
4
|
"eventsHeading": "## Memory Events",
|
|
5
5
|
"memoryDir": ".agentlas",
|
|
@@ -138,6 +138,18 @@
|
|
|
138
138
|
"visibility": "background",
|
|
139
139
|
"tone": "amber",
|
|
140
140
|
"systemPrompt": "# Task Bias Curator (Agentlas built-in)\n\nYou reduce TASK BIAS in multi-surface projects — the tendency to keep working on\nsurfaces that are recent, salient, or easy to measure while other surfaces stay\nuninspected. You are a SECOND-ORDER control role: you adjust the rules of work\nallocation and evidence review; you do not implement product work yourself, and you\ncannot mark a node \"complete\".\n\n## External state: the AI Sitemap\nThe project's shared external state lives in .agentlas/sitemap.json. Each\nnode carries: node_id, kind, status (unknown|todo|in_progress|blocked|validated|revalidate),\ncompletion_score (0..1, evidence-backed), risk_level, last_modified, last_tested,\ndependencies, acceptance_checks, evidence, provisional.\n\n## What you do\n1. Read/maintain the sitemap. Create provisional nodes for newly discovered surfaces.\n2. Choose the next bounded task from a VISIBLE priority policy, not recent chat context:\n prioritize high risk, low completion_score, stale last_tested, and blocking dependencies.\n3. Audit for bias: which surfaces are over-worked vs never inspected? Name them.\n4. Audit validation: flag completion claims without evidence or with weak evidence;\n require revalidation and name the missing evidence.\n5. Produce a compact, reversible curator decision record. Escalate mission-level changes\n to the user.\n\n## Boundaries\nCannot mark a node complete. Cannot erase evidence (only supersede it with a logged\ndecision). Cannot expand the project mission without explicit user approval.\n\nKeep outputs small: a policy/priority recommendation, a revalidation request, a\nsitemap update proposal, or a provisional-node decision."
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "builtin-agentlas-orchestrator",
|
|
144
|
+
"slug": "agentlas-one",
|
|
145
|
+
"name": "Agentlas One",
|
|
146
|
+
"nameEn": "Agentlas One",
|
|
147
|
+
"tagline": "오너 전속 개인 에이전트 — 전문가·도구·기억을 필요할 때만 꺼내 쓴다",
|
|
148
|
+
"taglineEn": "Owner-bound personal agent that pulls in specialists, tools, and memory on demand",
|
|
149
|
+
"role": "orchestrator",
|
|
150
|
+
"visibility": "background",
|
|
151
|
+
"tone": "green",
|
|
152
|
+
"systemPrompt": "# Agentlas One (Agentlas built-in)\n\n너는 채팅 어시스턴트가 아니라 오너 전속 개인 에이전트다. 세션·프로젝트·런타임을 넘어\n같은 정체성을 유지한다. 자기소개를 반복하지 않는다.\n\n## 일하는 법\n- 전문가가 필요하면 새로 고르기 전에 이미 묶인 로스터를 재사용한다. 채용은 가산이다.\n- \"못 한다\"고 말하기 전에 보유 수단(로컬 에이전트·오너 클라우드·Hub·플러그인)을 실제로 조회한다.\n 호출하지 않은 도구를 호출한 척하지 않는다.\n- 되돌리기 어려운 일(파일 삭제·발송·결제·공개) 직전에는 기억보다 실측을 우선한다.\n 확인이 안 되면 진행하지 말고 오너에게 묻는다.\n- 기억이 서로 모순되면 하나를 골라 단정하지 말고 충돌을 그대로 말한다.\n- 막히면 멈추지 말고 남은 수단을 순서대로 시도하고, 다 막히면 어디서 왜 막혔는지 기계 근거로 한 줄.\n\n## 기억\ndurable 기억을 직접 쓰지 않는다. 관찰은 Memory Events 로 내고 런타임이 티켓으로 포장해\n큐레이터에 넘긴다. 증거 없는 fact/decision/procedure 는 hypothesis 다.\n\n## 경계\n허브·클라우드에 업로드되지 않는다. 오너의 원시 기억·자격증명·전사를 외부로 내보내지 않는다."
|
|
141
153
|
}
|
|
142
154
|
]
|
|
143
155
|
}
|
|
@@ -7,7 +7,10 @@ const { runCloud } = require("../cloud-assets/commands.cjs");
|
|
|
7
7
|
|
|
8
8
|
async function run(ctx, args) {
|
|
9
9
|
try {
|
|
10
|
-
|
|
10
|
+
const commandArgs = ctx.output?.format === "json" && !args.includes("--json")
|
|
11
|
+
? [...args, "--json"]
|
|
12
|
+
: args;
|
|
13
|
+
return await runCloud(ctx, commandArgs);
|
|
11
14
|
} catch (e) {
|
|
12
15
|
ctx.err(String((e && e.message) || e));
|
|
13
16
|
return 1;
|
|
@@ -27,7 +27,7 @@ function roleDetail(selection, role, en) {
|
|
|
27
27
|
function run(ctx, args = []) {
|
|
28
28
|
const en = ctx.lang === "en";
|
|
29
29
|
// clig.dev: 스크립트 소비자를 위한 기계 계약. 사람용 줄과 같은 사실만 담는다.
|
|
30
|
-
if (args.includes("--json")) {
|
|
30
|
+
if (ctx.output?.format === "json" || args.includes("--json")) {
|
|
31
31
|
const db = ctx.db();
|
|
32
32
|
const clis = listAvailableCliRuntimes().map((c) => ({ kind: c.kind, path: c.path, authEvidence: runtimeAuthEvidence(c.kind).status }));
|
|
33
33
|
const active = activeRuntimeRow(db);
|
package/engine/commands/list.cjs
CHANGED
|
@@ -36,7 +36,7 @@ function run(ctx, args = []) {
|
|
|
36
36
|
|
|
37
37
|
// clig.dev: 스크립트 소비자는 사람용 표를 파싱하게 두지 말 것 — --json 은
|
|
38
38
|
// 사람용 출력과 같은 사실을 기계 계약으로 준다.
|
|
39
|
-
if (args.includes("--json")) {
|
|
39
|
+
if (ctx.output?.format === "json" || args.includes("--json")) {
|
|
40
40
|
const orchestrator = resolvedModelRole(db, "orchestrator");
|
|
41
41
|
const worker = resolvedModelRole(db, "worker");
|
|
42
42
|
ctx.out(JSON.stringify({ agents, firms, modelRoles: { orchestrator, worker } }, null, 2));
|
|
@@ -38,7 +38,7 @@ function fmt(selection, en) {
|
|
|
38
38
|
function show(ctx, args = []) {
|
|
39
39
|
const en = ctx.lang === "en";
|
|
40
40
|
const db = ctx.db();
|
|
41
|
-
if (args.includes("--json")) {
|
|
41
|
+
if (ctx.output?.format === "json" || args.includes("--json")) {
|
|
42
42
|
ctx.out(JSON.stringify({
|
|
43
43
|
orchestrator: resolvedModelRole(db, "orchestrator"),
|
|
44
44
|
worker: resolvedModelRole(db, "worker"),
|
|
@@ -177,6 +177,7 @@ function set(ctx, args) {
|
|
|
177
177
|
|
|
178
178
|
function run(ctx, args = []) {
|
|
179
179
|
const en = ctx.lang === "en";
|
|
180
|
+
if (ctx.output?.format === "json" && !args.includes("--json")) args = [...args, "--json"];
|
|
180
181
|
const [sub, ...rest] = args;
|
|
181
182
|
if (!sub || sub === "show" || sub === "list" || sub === "--json") return show(ctx, sub === "--json" ? ["--json"] : rest);
|
|
182
183
|
if (sub === "set") return set(ctx, rest);
|
|
@@ -8,7 +8,10 @@ const { runUpload } = require("../cloud-assets/commands.cjs");
|
|
|
8
8
|
|
|
9
9
|
async function run(ctx, args) {
|
|
10
10
|
try {
|
|
11
|
-
|
|
11
|
+
const commandArgs = ctx.output?.format === "json" && !args.includes("--json")
|
|
12
|
+
? [...args, "--json"]
|
|
13
|
+
: args;
|
|
14
|
+
return await runUpload(ctx, commandArgs);
|
|
12
15
|
} catch (e) {
|
|
13
16
|
ctx.err(String((e && e.message) || e));
|
|
14
17
|
return 1;
|
|
@@ -96,7 +96,18 @@ function parseMemoryEventsCli(text) {
|
|
|
96
96
|
const after = text.slice(idx + heading.length);
|
|
97
97
|
const fence = after.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
98
98
|
let events = [];
|
|
99
|
-
|
|
99
|
+
// 봉투 두 형태를 모두 받는다. Desktop `electron/memory/events.ts:128,156` 과 같은 계약이다.
|
|
100
|
+
// · 정본: {"schema_version":"agentlas.memory-ticket.v1","candidates":[...]} ← 이미터가 지시하는 형태
|
|
101
|
+
// · 레거시: [...] (최상위 배열)
|
|
102
|
+
// ★배열만 받던 시절 정본 봉투는 **조용히 버려졌다**(실측: 터미널이 후보 5건을 냈는데 파서 결과 0건).
|
|
103
|
+
// 형태가 낯설면 버리지 말고, 최소한 왜 못 읽었는지 남길 수 있게 둘 다 통과시킨다.
|
|
104
|
+
if (fence) {
|
|
105
|
+
try {
|
|
106
|
+
const d = JSON.parse(fence[1].trim());
|
|
107
|
+
if (Array.isArray(d)) events = d;
|
|
108
|
+
else if (d && typeof d === "object" && Array.isArray(d.candidates)) events = d.candidates;
|
|
109
|
+
} catch { /* ignore */ }
|
|
110
|
+
}
|
|
100
111
|
let cut = text.length;
|
|
101
112
|
if (fence && fence.index != null) cut = idx + heading.length + fence.index + fence[0].length;
|
|
102
113
|
const before = text.slice(0, idx).replace(/<!--\s*$/u, "");
|
|
@@ -18,6 +18,75 @@ const memoryCurate = require("../memory-cli/curate.cjs");
|
|
|
18
18
|
const automationStore = require("../automation/store.cjs");
|
|
19
19
|
const schedule = require("../automation/schedule.cjs");
|
|
20
20
|
|
|
21
|
+
/** One 이 가져가는 스코프. 프로젝트 스코프는 프로젝트에 남는다. */
|
|
22
|
+
const ONE_SCOPES = new Set(["agent_repo", "user_identity"]);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Agentlas One 서랍(`~/.agentlas/one/.agentlas/memory-tickets.jsonl`)으로 후보를 넘긴다.
|
|
26
|
+
*
|
|
27
|
+
* One 은 프로젝트를 넘나드는 정체성이라 agent_repo/user_identity 만 가져간다.
|
|
28
|
+
* One 이 꺼져 있거나 서랍이 없으면 아무것도 하지 않는다 — 없는 폴더를 만들지 않는다.
|
|
29
|
+
* 실패해도 턴을 죽이지 않는다(펜스 적용 계약과 동일).
|
|
30
|
+
*/
|
|
31
|
+
function forwardToOne(events) {
|
|
32
|
+
try {
|
|
33
|
+
const fs = require("node:fs");
|
|
34
|
+
const os = require("node:os");
|
|
35
|
+
const path = require("node:path");
|
|
36
|
+
const root = process.env.AGENTLAS_ONE_DIR || path.join(os.homedir(), ".agentlas", "one");
|
|
37
|
+
const state = JSON.parse(fs.readFileSync(path.join(root, "state.json"), "utf8"));
|
|
38
|
+
if (!state || state.on !== true) return 0;
|
|
39
|
+
const ledger = path.join(root, ".agentlas", "memory-tickets.jsonl");
|
|
40
|
+
if (!fs.existsSync(ledger)) return 0;
|
|
41
|
+
|
|
42
|
+
// 이미 올라온 내용은 다시 넣지 않는다(같은 계약을 One 쪽 emit_ticket 도 쓴다).
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
for (const line of fs.readFileSync(ledger, "utf8").split("\n")) {
|
|
45
|
+
if (!line.trim()) continue;
|
|
46
|
+
try {
|
|
47
|
+
const row = JSON.parse(line);
|
|
48
|
+
const text = String((row.candidate || {}).content || "");
|
|
49
|
+
if (text) seen.add(text.trim().toLowerCase().replace(/\s+/g, " "));
|
|
50
|
+
} catch { /* 깨진 줄은 건너뛴다 */ }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let written = 0;
|
|
54
|
+
for (const raw of events) {
|
|
55
|
+
for (const candidate of (raw && Array.isArray(raw.candidates) ? raw.candidates : [raw])) {
|
|
56
|
+
if (!candidate || typeof candidate !== "object") continue;
|
|
57
|
+
const scope = String(candidate.suggested_scope || candidate.scope || "");
|
|
58
|
+
if (!ONE_SCOPES.has(scope)) continue;
|
|
59
|
+
const content = String(candidate.content || "").trim();
|
|
60
|
+
if (!content) continue;
|
|
61
|
+
const key = content.toLowerCase().replace(/\s+/g, " ");
|
|
62
|
+
if (seen.has(key)) continue;
|
|
63
|
+
seen.add(key);
|
|
64
|
+
const evidence = Array.isArray(candidate.evidence) ? candidate.evidence.slice(0, 8) : [];
|
|
65
|
+
fs.appendFileSync(ledger, JSON.stringify({
|
|
66
|
+
schemaVersion: "agentlas.one-workspace.v1",
|
|
67
|
+
ticketId: `one-tkt-${Date.now()}-${written}`,
|
|
68
|
+
agentId: "builtin-agentlas-one",
|
|
69
|
+
turnKey: "",
|
|
70
|
+
source: "terminal-memory-events",
|
|
71
|
+
state: "queued",
|
|
72
|
+
candidate: {
|
|
73
|
+
type: String(candidate.memory_kind || candidate.type || "hypothesis"),
|
|
74
|
+
scope,
|
|
75
|
+
content: content.slice(0, 600),
|
|
76
|
+
evidence,
|
|
77
|
+
},
|
|
78
|
+
downgraded: false,
|
|
79
|
+
createdAt: new Date().toISOString().replace(/\.\d+Z$/, "Z"),
|
|
80
|
+
}) + "\n", "utf8");
|
|
81
|
+
written += 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return written;
|
|
85
|
+
} catch {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
21
90
|
/**
|
|
22
91
|
* @param {import('./session.cjs').Session} session 방금 턴을 끝낸 세션
|
|
23
92
|
* @param {object} parsed parseReplyFences 결과
|
|
@@ -69,6 +138,10 @@ function applyReplyFences(session, parsed, opts = {}) {
|
|
|
69
138
|
written: ctx.curatedMemories.length,
|
|
70
139
|
permission: session.permission,
|
|
71
140
|
};
|
|
141
|
+
// Agentlas One 이 켜져 있으면 에이전트 스코프 후보를 One 서랍에도 티켓으로 넘긴다.
|
|
142
|
+
// 프로젝트 스코프는 여기 남기고 옮기지 않는다 — One 은 프로젝트를 넘나드는 정체성이라
|
|
143
|
+
// agent_repo/user_identity 만 One 의 것이다(기획 2.2 스코프 경계).
|
|
144
|
+
receipts.memory.one = forwardToOne(parsed.memoryEvents);
|
|
72
145
|
// read 권한 턴 = durable 쓰기 0 — 영수증 이벤트만 남는다.
|
|
73
146
|
record({ type: "memory-curated", ...receipts.memory });
|
|
74
147
|
}
|
|
@@ -185,4 +258,5 @@ function applyReplyFences(session, parsed, opts = {}) {
|
|
|
185
258
|
return receipts;
|
|
186
259
|
}
|
|
187
260
|
|
|
188
|
-
|
|
261
|
+
// forwardToOne 은 One 서랍 전달의 유일한 지점이라 계약 테스트가 직접 잴 수 있게 함께 노출한다.
|
|
262
|
+
module.exports = { applyReplyFences, forwardToOne };
|
|
@@ -180,6 +180,29 @@ function cliMemoryContext(db, projectPath, agentId = null, task = "") {
|
|
|
180
180
|
* 최종 시스템 프롬프트 조립. ctx = { lang, projectPath, agentId, turnId, permission }.
|
|
181
181
|
* withEmitter=false 는 이미터/리마인더 없이(캡처·판정 등 내부 턴용).
|
|
182
182
|
*/
|
|
183
|
+
/**
|
|
184
|
+
* Agentlas One 지시문. 켜져 있을 때만, 그리고 정본 파일이 실재할 때만 싣는다.
|
|
185
|
+
* 상태 파일이 없으면 조용히 빈 문자열 — 꺼진 One 의 지시문을 흘리지 않는다.
|
|
186
|
+
*/
|
|
187
|
+
function loadOneDirective() {
|
|
188
|
+
try {
|
|
189
|
+
const root = process.env.AGENTLAS_ONE_DIR
|
|
190
|
+
|| require("node:path").join(require("node:os").homedir(), ".agentlas", "one");
|
|
191
|
+
const fs = require("node:fs");
|
|
192
|
+
const path = require("node:path");
|
|
193
|
+
const state = JSON.parse(fs.readFileSync(path.join(root, "state.json"), "utf8"));
|
|
194
|
+
if (!state || state.on !== true) return "";
|
|
195
|
+
const text = fs.readFileSync(path.join(root, "directive.md"), "utf8").trim();
|
|
196
|
+
// 상한을 둔다 — 지시문이 남의 토큰 예산을 잠식하면 안 된다(메모리 예산과 같은 규칙).
|
|
197
|
+
return text.length > ONE_DIRECTIVE_MAX_CHARS ? text.slice(0, ONE_DIRECTIVE_MAX_CHARS) : text;
|
|
198
|
+
} catch {
|
|
199
|
+
return "";
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** [튜닝값, 근거 없음] — 현재 정본 지시문이 약 3.7KB 라 두 배 여유를 둔다. */
|
|
204
|
+
const ONE_DIRECTIVE_MAX_CHARS = 8000;
|
|
205
|
+
|
|
183
206
|
function augmentSystem(db, baseSystem, ctx, withEmitter, request = "") {
|
|
184
207
|
const arch = loadArch();
|
|
185
208
|
let sys = baseSystem || "";
|
|
@@ -188,6 +211,10 @@ function augmentSystem(db, baseSystem, ctx, withEmitter, request = "") {
|
|
|
188
211
|
sys = responseDirective(lang) + (sys ? "\n\n" + sys : "");
|
|
189
212
|
const connectionSkill = loadGlobalConnectionSkill();
|
|
190
213
|
if (connectionSkill) sys += "\n\n" + connectionSkill;
|
|
214
|
+
// Agentlas One 이 켜져 있으면 그 지시문을 싣는다. R4 기준 터미널의 "매 턴 주입 지점"이 여기다.
|
|
215
|
+
// 정본은 `~/.agentlas/one/directive.md` 하나 — CLAUDE.md/AGENTS.md 의 마커 블록은 그 사본이다.
|
|
216
|
+
const oneDirective = loadOneDirective();
|
|
217
|
+
if (oneDirective) sys += "\n\n" + oneDirective;
|
|
191
218
|
const mem = cliMemoryContext(db, ctx && ctx.projectPath, ctx && ctx.agentId, request);
|
|
192
219
|
if (mem) sys += "\n\n" + mem;
|
|
193
220
|
// 도구 접근 고지 — 터미널에는 이게 아예 없었다. 도구가 붙지 않은 턴에서 CLI는 아무
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentlas",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.37",
|
|
4
4
|
"description": "Agentlas project terminal — run project controllers and task-scoped agent teams from the terminal. Standalone: no desktop app process required.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agentlas": "bin/agentlas.cjs"
|