agentlas 0.9.10 → 1.0.2
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 +106 -0
- package/README.md +319 -341
- package/bin/agentlas.cjs +32 -9
- package/engine/agentlas-banner.cjs +24 -3
- package/engine/agentlas-composer.cjs +239 -31
- package/engine/agentlas-config.cjs +103 -7
- package/engine/agentlas-core-harness.cjs +48 -4
- package/engine/agentlas-evolution.cjs +3 -4
- package/engine/agentlas-i18n.cjs +88 -32
- package/engine/agentlas-input.cjs +234 -18
- package/engine/agentlas-memory-governance.cjs +3 -5
- package/engine/agentlas-memory-import.cjs +3 -3
- package/engine/agentlas-native-host.cjs +200 -9
- package/engine/agentlas-onboard.cjs +112 -20
- package/engine/agentlas-permissions.cjs +14 -7
- package/engine/agentlas-sqlite-policy.cjs +34 -0
- package/engine/agentlas-ui.cjs +93 -42
- package/engine/agentlas-workforce.cjs +472 -58
- package/engine/agentlas-workload-routing.cjs +8 -3
- package/engine/agentlas.cjs +140 -12367
- package/engine/agents/files.cjs +61 -0
- package/engine/agents/import-local.cjs +237 -0
- package/engine/agents/registry.cjs +158 -0
- package/engine/agents/router.cjs +565 -0
- package/engine/agents/routes.cjs +43 -0
- package/engine/architecture.data.json +2 -2
- package/engine/automation/daemon.cjs +335 -0
- package/engine/automation/schedule.cjs +181 -0
- package/engine/automation/store.cjs +209 -0
- package/engine/cloud/auth.cjs +279 -0
- package/engine/cloud/hub-client.cjs +239 -0
- package/engine/cloud-assets/cargo.cjs +49 -0
- package/engine/cloud-assets/cas.cjs +235 -0
- package/engine/cloud-assets/commands.cjs +273 -0
- package/engine/cloud-assets/package.cjs +936 -0
- package/engine/cloud-assets/restore.cjs +172 -0
- package/engine/cloud-assets/state.cjs +268 -0
- package/engine/commands/automation.cjs +195 -0
- package/engine/commands/billing.cjs +96 -0
- package/engine/commands/browser.cjs +20 -0
- package/engine/commands/build.cjs +33 -0
- package/engine/commands/call.cjs +24 -0
- package/engine/commands/career-graph.cjs +51 -0
- package/engine/commands/cd.cjs +22 -0
- package/engine/commands/chat.cjs +12 -0
- package/engine/commands/chats.cjs +28 -0
- package/engine/commands/cloud.cjs +17 -0
- package/engine/commands/connect.cjs +20 -0
- package/engine/commands/context.cjs +66 -0
- package/engine/commands/creds.cjs +203 -0
- package/engine/commands/doctor.cjs +68 -0
- package/engine/commands/env.cjs +33 -0
- package/engine/commands/evolve.cjs +23 -0
- package/engine/commands/experience.cjs +34 -0
- package/engine/commands/film.cjs +8 -0
- package/engine/commands/firm.cjs +115 -0
- package/engine/commands/help.cjs +65 -0
- package/engine/commands/hep.cjs +23 -0
- package/engine/commands/import.cjs +35 -0
- package/engine/commands/index.cjs +136 -0
- package/engine/commands/install.cjs +27 -0
- package/engine/commands/journal.cjs +31 -0
- package/engine/commands/legacy-network.cjs +29 -0
- package/engine/commands/list.cjs +49 -0
- package/engine/commands/login.cjs +68 -0
- package/engine/commands/logout.cjs +28 -0
- package/engine/commands/mcp.cjs +91 -0
- package/engine/commands/memory.cjs +21 -0
- package/engine/commands/multimodal.cjs +91 -0
- package/engine/commands/native.cjs +34 -0
- package/engine/commands/netadmin.cjs +31 -0
- package/engine/commands/oberon.cjs +70 -0
- package/engine/commands/ontology.cjs +24 -0
- package/engine/commands/open.cjs +48 -0
- package/engine/commands/plugin.cjs +101 -0
- package/engine/commands/project.cjs +47 -0
- package/engine/commands/research.cjs +36 -0
- package/engine/commands/route.cjs +37 -0
- package/engine/commands/run.cjs +149 -0
- package/engine/commands/search.cjs +55 -0
- package/engine/commands/setup.cjs +45 -0
- package/engine/commands/storm.cjs +75 -0
- package/engine/commands/swarm.cjs +75 -0
- package/engine/commands/telegram.cjs +32 -0
- package/engine/commands/uninstall.cjs +68 -0
- package/engine/commands/update.cjs +54 -0
- package/engine/commands/upload.cjs +18 -0
- package/engine/commands/usage.cjs +35 -0
- package/engine/commands/variant.cjs +25 -0
- package/engine/commands/version.cjs +9 -0
- package/engine/commands/whoami.cjs +38 -0
- package/engine/commands/workforce.cjs +103 -0
- package/engine/core/db.cjs +160 -0
- package/engine/core/paths.cjs +35 -0
- package/engine/experience/build.cjs +181 -0
- package/engine/experience/intents.cjs +492 -0
- package/engine/experience/runtime.cjs +242 -0
- package/engine/experience/variant.cjs +196 -0
- package/engine/firms/orchestrate.cjs +333 -0
- package/engine/hephaestus/runtime.cjs +697 -0
- package/engine/hub/install.cjs +872 -0
- package/engine/hub/plugins.cjs +213 -0
- package/engine/mcp/consent.cjs +289 -0
- package/engine/mcp/contract.cjs +202 -0
- package/engine/mcp/index.cjs +43 -0
- package/engine/mcp/inventory.cjs +322 -0
- package/engine/mcp/plan.cjs +286 -0
- package/engine/mcp/probe.cjs +151 -0
- package/engine/memory-cli/curate.cjs +163 -0
- package/engine/oberon/common.cjs +69 -0
- package/engine/oberon/manifest.cjs +164 -0
- package/engine/oberon/outputs.cjs +70 -0
- package/engine/oberon/render.cjs +164 -0
- package/engine/project/career-graph.cjs +249 -0
- package/engine/project/credentials.cjs +262 -0
- package/engine/project/env-file.cjs +46 -0
- package/engine/project/index.cjs +27 -0
- package/engine/project/memory-context.cjs +453 -0
- package/engine/project/ontology.cjs +467 -0
- package/engine/project/paths.cjs +39 -0
- package/engine/project/seed.cjs +200 -0
- package/engine/project/state.cjs +403 -0
- package/engine/project/super-ontology-seed.json +3288 -0
- package/engine/runtimes/detect.cjs +54 -0
- package/engine/runtimes/overrides.cjs +139 -0
- package/engine/runtimes/resolve.cjs +64 -0
- package/engine/sessions/apply-fences.cjs +188 -0
- package/engine/sessions/fences.cjs +362 -0
- package/engine/sessions/orchestrator.cjs +170 -0
- package/engine/sessions/prompt.cjs +212 -0
- package/engine/sessions/session.cjs +245 -0
- package/engine/sessions/sink.cjs +54 -0
- package/engine/sessions/store.cjs +79 -0
- package/engine/storm/deps.cjs +88 -0
- package/engine/storm/storm.cjs +218 -0
- package/engine/storm/swarm.cjs +422 -0
- package/engine/ui/palette.cjs +105 -0
- package/engine/ui/renderer.cjs +85 -0
- package/engine/ui/repl.cjs +444 -0
- package/engine/workforce/capture.cjs +701 -0
- package/engine/workforce/deps.cjs +472 -0
- package/package.json +2 -6
- package/engine/agentlas-experience-mcp.cjs +0 -1709
- package/engine/agentlas-parity.cjs +0 -1499
- package/engine/agentlas-repl.cjs +0 -1780
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* doctor — 런타임·데이터·자격증명 건강 점검.
|
|
4
|
+
* 진단/수리 규칙 자체는 engine/agentlas-doctor.cjs(3제품 패리티 계약)에 있고,
|
|
5
|
+
* 이 명령은 "현재 상태 관측"만 한다. 여기서 관측 항목을 바꿔도 패리티 게이트와
|
|
6
|
+
* 무관하지만, 실패 분류·수리 로직을 건드리려면 반드시 sync-runtime-doctor.sh를 통과시켜라.
|
|
7
|
+
*/
|
|
8
|
+
const fs = require("node:fs");
|
|
9
|
+
const path = require("node:path");
|
|
10
|
+
const { dbPath, userDataDir } = require("../core/paths.cjs");
|
|
11
|
+
const { listAvailableCliRuntimes, activeRuntimeRow } = require("../runtimes/detect.cjs");
|
|
12
|
+
|
|
13
|
+
function run(ctx) {
|
|
14
|
+
const en = ctx.lang === "en";
|
|
15
|
+
let failures = 0;
|
|
16
|
+
const ok = (label, detail) => ctx.out(` ${ctx.ui.green("✓")} ${label}${detail ? ctx.ui.dim(" — " + detail) : ""}`);
|
|
17
|
+
const bad = (label, detail) => { failures += 1; ctx.out(` ${ctx.ui.red("✗")} ${label}${detail ? ctx.ui.dim(" — " + detail) : ""}`); };
|
|
18
|
+
|
|
19
|
+
// 1) 데이터
|
|
20
|
+
const p = dbPath();
|
|
21
|
+
if (fs.existsSync(p)) {
|
|
22
|
+
try {
|
|
23
|
+
const db = ctx.db();
|
|
24
|
+
const agents = db.prepare("SELECT COUNT(*) AS n FROM installed_agents").get();
|
|
25
|
+
ok(en ? "database" : "데이터베이스", `${p} (${agents ? agents.n : 0} agents)`);
|
|
26
|
+
} catch (e) {
|
|
27
|
+
bad(en ? "database" : "데이터베이스", e.message);
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
bad(en ? "database" : "데이터베이스", (en ? "missing: " : "없음: ") + p);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 2) 런타임
|
|
34
|
+
const clis = listAvailableCliRuntimes();
|
|
35
|
+
if (clis.length) {
|
|
36
|
+
ok(en ? "runtimes" : "런타임", clis.map((c) => `${c.kind}`).join(", "));
|
|
37
|
+
} else {
|
|
38
|
+
bad(en ? "runtimes" : "런타임", en
|
|
39
|
+
? "no agent CLI on PATH (claude / codex / gemini / kimi / grok / cursor-agent)"
|
|
40
|
+
: "PATH에 에이전트 CLI 없음 (claude / codex / gemini / kimi / grok / cursor-agent)");
|
|
41
|
+
// 막다른 길 방지: 무엇을 설치해야 하는지 그 자리에서 알려준다.
|
|
42
|
+
ctx.out(ctx.ui.dim(" npm i -g @anthropic-ai/claude-code · @openai/codex · @google/gemini-cli"));
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const active = activeRuntimeRow(ctx.db());
|
|
46
|
+
if (active) ok(en ? "active runtime" : "활성 런타임", `${active.kind}${active.model ? ` (${active.model})` : ""}`);
|
|
47
|
+
} catch { /* db issue already reported */ }
|
|
48
|
+
|
|
49
|
+
// 3) 로그인 상태 (세션 파일 관측만 — 네트워크 호출 없음)
|
|
50
|
+
const sessionFile = path.join(userDataDir(), "auth", "cli-session.v1.json");
|
|
51
|
+
if (process.env.AGENTLAS_SESSION) {
|
|
52
|
+
ok(en ? "cloud session" : "클라우드 세션", "AGENTLAS_SESSION env");
|
|
53
|
+
} else if (fs.existsSync(sessionFile)) {
|
|
54
|
+
ok(en ? "cloud session" : "클라우드 세션", sessionFile);
|
|
55
|
+
} else {
|
|
56
|
+
ctx.out(` ${ctx.ui.dim("·")} ${en ? "cloud session" : "클라우드 세션"}${ctx.ui.dim(en ? " — not signed in (agentlas login)" : " — 로그인 안 됨 (agentlas login)")}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
ctx.out("");
|
|
60
|
+
if (failures) {
|
|
61
|
+
ctx.out(en ? `doctor: ${failures} problem(s) found` : `doctor: 문제 ${failures}건`);
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
ctx.out(en ? "doctor: all clear" : "doctor: 이상 없음");
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
module.exports = { run };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* env — 공유 env 키 열거 (값은 절대 출력하지 않음).
|
|
4
|
+
*
|
|
5
|
+
* standalone(비-Electron)에서는 keytar를 건드리지 않는다: 서명 안 된 Node에서
|
|
6
|
+
* keytar.findCredentials가 macOS 키체인에 막히면 무한 대기하고 process.exit로도
|
|
7
|
+
* 안 죽는다(v1 실사고). credentials.env 파일 기반 열거만 수행한다.
|
|
8
|
+
*/
|
|
9
|
+
const os = require("node:os");
|
|
10
|
+
const path = require("node:path");
|
|
11
|
+
const { userDataDir } = require("../core/paths.cjs");
|
|
12
|
+
// readDotEnvFile 본체는 engine/project/env-file.cjs 로 이관 (creds 명령과 공유 —
|
|
13
|
+
// 명령 파일끼리 import 금지 규칙 때문에 기능 모듈로 내려갔다). 여기서는 re-export.
|
|
14
|
+
const { readDotEnvFile } = require("../project/env-file.cjs");
|
|
15
|
+
|
|
16
|
+
function sharedEnvKeys() {
|
|
17
|
+
const fromFiles = {
|
|
18
|
+
...readDotEnvFile(path.join(userDataDir(), "credentials.env")),
|
|
19
|
+
...readDotEnvFile(path.join(os.homedir(), ".agentlas", "credentials.env")),
|
|
20
|
+
};
|
|
21
|
+
return Object.keys(fromFiles).sort();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function run(ctx) {
|
|
25
|
+
const keys = sharedEnvKeys();
|
|
26
|
+
ctx.out(`Shared env keys: ${keys.length} (values hidden; from credentials.env):`);
|
|
27
|
+
for (const k of keys) ctx.out(` ${k}`);
|
|
28
|
+
ctx.out("");
|
|
29
|
+
ctx.out(ctx.ui.dim("Keychain entries are available in Desktop settings → Credentials."));
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = { run, readDotEnvFile, sharedEnvKeys };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* evolve — 데스크탑 트리거가 만든 성장 제안 검토·적용·되돌리기 (Phase 2/2+).
|
|
4
|
+
* agentlas evolve [list | apply <id> | revert <id>]
|
|
5
|
+
* 로직은 복원된 계약 모듈 engine/agentlas-evolution.cjs 가 소유한다.
|
|
6
|
+
* 적용/되돌리기 게이트는 타깃 파일 내용 해시(before_hash/after_hash)로만
|
|
7
|
+
* 판정한다 — 이 콘텐츠 해시 게이트는 계약이므로 여기서 절대 우회하지 않는다.
|
|
8
|
+
*/
|
|
9
|
+
const { cmdEvolve } = require("../agentlas-evolution.cjs");
|
|
10
|
+
const { agentFolder } = require("../agents/files.cjs");
|
|
11
|
+
|
|
12
|
+
function run(ctx, args) {
|
|
13
|
+
cmdEvolve({
|
|
14
|
+
db: ctx.db(),
|
|
15
|
+
args,
|
|
16
|
+
out: ctx.out,
|
|
17
|
+
fail: (msg) => { throw new Error(String(msg ?? "")); },
|
|
18
|
+
agentFolder,
|
|
19
|
+
});
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = { run };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* experience — Portable Experience Bundle 교환 표면
|
|
4
|
+
* (list|inspect|validate|save|publish|status|export|unpublish|withdraw,
|
|
5
|
+
* legacy-* 는 pack-only 로컬 의도 저장소).
|
|
6
|
+
*
|
|
7
|
+
* 복원된 계약 모듈 engine/agentlas-experience-exchange.cjs 가 전 로직을 소유하고,
|
|
8
|
+
* 이 파일은 v1 모놀리스 디스패치가 하던 의존성 주입만 재현한다:
|
|
9
|
+
* getSessionCookie/fetchHub ← engine/cloud/hub-client.cjs (v1 D-bag의
|
|
10
|
+
* cloudSessionCookieCli/fetchHubCli 대응), legacyCommand ← experience/intents.
|
|
11
|
+
* 폴백 없음: 서버 refusal/검증 실패 문구는 그대로 표면화된다(엔진이 stderr로
|
|
12
|
+
* 출력하고 exit 1).
|
|
13
|
+
*/
|
|
14
|
+
const { userDataDir } = require("../core/paths.cjs");
|
|
15
|
+
|
|
16
|
+
async function run(ctx, args) {
|
|
17
|
+
const { cmdExperienceExchange } = require("../agentlas-experience-exchange.cjs");
|
|
18
|
+
const intents = require("../experience/intents.cjs");
|
|
19
|
+
const { cloudSessionCookie, fetchHub } = require("../cloud/hub-client.cjs");
|
|
20
|
+
await cmdExperienceExchange({
|
|
21
|
+
args,
|
|
22
|
+
userDataDir: userDataDir(),
|
|
23
|
+
cwd: process.cwd(),
|
|
24
|
+
out: ctx.out,
|
|
25
|
+
env: process.env,
|
|
26
|
+
getSessionCookie: cloudSessionCookie,
|
|
27
|
+
// fetchHub 3중 타임아웃/16MB 상한 강화판을 그대로 사용(v1 timeout-regression 계약).
|
|
28
|
+
fetchHub: (url, init) => fetchHub(url, init),
|
|
29
|
+
legacyCommand: (legacyOptions) => intents.cmdExperience(legacyOptions),
|
|
30
|
+
});
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { run };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* film — oberon의 별칭.
|
|
4
|
+
* v1 디스패처(§13061-13063)는 `case "oberon": case "film": return cmdOberon(rest.slice(1))`
|
|
5
|
+
* 로 두 이름을 완전히 동일하게 처리했다 (인자 변형·프리픽스 없음). 그대로 복제한다.
|
|
6
|
+
* v1 usage 표기도 동일 형태였다: "usage: agentlas film <scaffold|render|list|open> [args]".
|
|
7
|
+
*/
|
|
8
|
+
module.exports = require("./oberon.cjs");
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* firm — 회사(CEO) 위임: agentlas firm <slug> [task…]
|
|
4
|
+
* 실행 경로는 세션 계층 하나다(제2 spawn 경로 금지).
|
|
5
|
+
* 무인자: 회사 목록. task 없이 slug만: 그 CEO와 REPL(기존 동작 유지).
|
|
6
|
+
* task가 있으면 데스크탑 firm-orchestrator 동형의 3-tier 위임을 돈다:
|
|
7
|
+
* CEO PLAN(## Delegate 펜스) → 본부 병렬 실행(division 서브세션) → CEO SYNTHESIZE.
|
|
8
|
+
* (firms/orchestrate.cjs runFirmTurn — 단순 CEO 챗 1턴이 아니다.)
|
|
9
|
+
*/
|
|
10
|
+
const { rowToAgent } = require("../agents/registry.cjs");
|
|
11
|
+
|
|
12
|
+
function findFirm(db, token) {
|
|
13
|
+
const q = String(token || "").trim().toLowerCase();
|
|
14
|
+
if (!q) return null;
|
|
15
|
+
return db.prepare("SELECT * FROM firms WHERE lower(slug)=? OR lower(name)=?").get(q, q)
|
|
16
|
+
|| db.prepare("SELECT * FROM firms WHERE lower(slug) LIKE ? ORDER BY slug LIMIT 1").get(`%${q}%`)
|
|
17
|
+
|| null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function run(ctx, args) {
|
|
21
|
+
const ko = ctx.lang === "ko";
|
|
22
|
+
const db = ctx.db();
|
|
23
|
+
if (!ctx.tableExists(db, "firms")) {
|
|
24
|
+
ctx.out(ko ? "회사가 없습니다." : "No companies yet.");
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
if (!args.length) {
|
|
28
|
+
const firms = db.prepare("SELECT slug, name, tagline FROM firms ORDER BY name").all();
|
|
29
|
+
if (!firms.length) {
|
|
30
|
+
ctx.out(ko ? "회사가 없습니다. (팀 폴더를 import 하면 회사로 등록됩니다)" : "No companies yet. (import a team folder to register one)");
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
for (const f of firms) ctx.out(` ${ctx.ui.accent(String(f.slug).padEnd(28))} ${f.name}${f.tagline ? ctx.ui.dim(" — " + f.tagline) : ""}`);
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const firm = findFirm(db, args[0]);
|
|
38
|
+
if (!firm) {
|
|
39
|
+
ctx.err((ko ? "회사를 찾을 수 없음: " : "firm not found: ") + args[0]);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
const ceoRow = firm.ceo_agent_id
|
|
43
|
+
? db.prepare("SELECT * FROM installed_agents WHERE id=?").get(firm.ceo_agent_id)
|
|
44
|
+
: null;
|
|
45
|
+
if (!ceoRow) {
|
|
46
|
+
ctx.err(ko
|
|
47
|
+
? `회사 ${firm.slug} 의 CEO 에이전트가 없습니다 (ceo_agent_id 미해결). 팀 폴더를 다시 import 하세요.`
|
|
48
|
+
: `Firm ${firm.slug} has no resolvable CEO agent. Re-import the team folder.`);
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
const ceo = rowToAgent(ceoRow);
|
|
52
|
+
|
|
53
|
+
// 간단 플래그 파싱(--runtime/--permission) — 명령끼리 참조 금지 규칙상 run.cjs 미차용.
|
|
54
|
+
const rest = args.slice(1);
|
|
55
|
+
const flags = { runtime: null, permission: null, task: [] };
|
|
56
|
+
for (let i = 0; i < rest.length; i++) {
|
|
57
|
+
if (rest[i] === "--runtime") flags.runtime = rest[++i];
|
|
58
|
+
else if (rest[i] === "--permission") flags.permission = rest[++i];
|
|
59
|
+
else flags.task.push(rest[i]);
|
|
60
|
+
}
|
|
61
|
+
const task = flags.task.join(" ").trim();
|
|
62
|
+
if (task) {
|
|
63
|
+
// 3-tier 위임 실행 — PLAN → DELEGATE → SYNTHESIZE (firms/orchestrate.cjs).
|
|
64
|
+
const { runFirmTurn } = require("../firms/orchestrate.cjs");
|
|
65
|
+
const { resolveRuntimeForAgent, unavailableOverrideNote } = require("../runtimes/overrides.cjs");
|
|
66
|
+
const { Orchestrator } = require("../sessions/orchestrator.cjs");
|
|
67
|
+
const permissions = require("../agentlas-permissions.cjs");
|
|
68
|
+
let runtime;
|
|
69
|
+
try {
|
|
70
|
+
// 사다리: 명시 > (agent CEO > firm) 오버라이드 > prefs > active > detected.
|
|
71
|
+
runtime = resolveRuntimeForAgent({
|
|
72
|
+
db,
|
|
73
|
+
prefs: ctx.prefs,
|
|
74
|
+
explicit: flags.runtime,
|
|
75
|
+
targets: [
|
|
76
|
+
{ scope: "agent", targetId: ceo.id },
|
|
77
|
+
{ scope: "firm", targetId: firm.id },
|
|
78
|
+
],
|
|
79
|
+
});
|
|
80
|
+
} catch (e) {
|
|
81
|
+
ctx.err(String((e && e.message) || e));
|
|
82
|
+
return 1;
|
|
83
|
+
}
|
|
84
|
+
if (runtime.unavailableOverride) ctx.err(ctx.ui.dim(unavailableOverrideNote(runtime, ctx.lang)));
|
|
85
|
+
const orch = new Orchestrator({ db, lang: ctx.lang });
|
|
86
|
+
const dim = ctx.ui.dim;
|
|
87
|
+
const result = await runFirmTurn({
|
|
88
|
+
db,
|
|
89
|
+
orch,
|
|
90
|
+
firm,
|
|
91
|
+
ceoAgent: ceo,
|
|
92
|
+
task,
|
|
93
|
+
runtime,
|
|
94
|
+
permission: permissions.normalize(flags.permission || (ctx.prefs && ctx.prefs.permission) || "write"),
|
|
95
|
+
cwd: process.cwd(),
|
|
96
|
+
onEvent: (ev) => {
|
|
97
|
+
if (ev.phase === "plan") ctx.err(dim(ko ? `${firm.name} · CEO가 작업을 분배하는 중…` : `${firm.name} · CEO is planning the work…`));
|
|
98
|
+
else if (ev.phase === "delegate") ctx.err(dim((ko ? "위임 → " : "delegating → ") + ev.targets.map((t) => t.name || t.role).join(", ")));
|
|
99
|
+
else if (ev.phase === "division-done") ctx.err(dim(` ${ev.role}: ${ev.ok ? "ok" : "failed"}`));
|
|
100
|
+
else if (ev.phase === "synthesize") ctx.err(dim(ko ? "팀 결과를 종합하는 중…" : "Synthesizing team results…"));
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
orch.shutdown();
|
|
104
|
+
if (result.text) ctx.out(result.text.trimEnd());
|
|
105
|
+
if (!result.ok) {
|
|
106
|
+
ctx.err(ko ? "일부 본부/종합 턴이 실패했습니다 (위 status 참조)." : "Some division or synthesis turns failed (see status above).");
|
|
107
|
+
return 1;
|
|
108
|
+
}
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
const { startRepl } = require("../ui/repl.cjs");
|
|
112
|
+
return startRepl(ctx, { agent: ceo.slug });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = { run, findFirm };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* help / usage — v2 명령 표면. 재구축이 진행되며 이 표가 곧 진실이다. */
|
|
3
|
+
|
|
4
|
+
const HELP = `agentlas — the operating system for agents, in your terminal
|
|
5
|
+
|
|
6
|
+
agentlas open the terminal (REPL)
|
|
7
|
+
agentlas <agent> jump into a chat with one agent
|
|
8
|
+
agentlas "<task>" auto-route to the best agent and run once
|
|
9
|
+
|
|
10
|
+
TALK & RUN
|
|
11
|
+
<agent> · chat <agent> jump into a chat with one agent
|
|
12
|
+
run [agent] [prompt] one-shot (-p print · --runtime · --permission; stdin ok)
|
|
13
|
+
firm <firm> [task] delegate to a company's CEO
|
|
14
|
+
chats [n] · open <id> recent conversations · resume one
|
|
15
|
+
|
|
16
|
+
AGENTS & HUB
|
|
17
|
+
search "<what you need>" discover agents in the Hub
|
|
18
|
+
install <slug> install an agent from the Hub
|
|
19
|
+
plugin add <slug> · plugin list Hub plugins (MCP servers)
|
|
20
|
+
build "<request>" build/repair/package an agent or team
|
|
21
|
+
upload <path> save owner-private in Agent Cloud (--visibility marketplace to publish)
|
|
22
|
+
import <path> · cd · native prepare local folder agents
|
|
23
|
+
list installed agents/companies + active runtime
|
|
24
|
+
experience <sub> portable Experience: list|inspect|validate|save|publish|status|export|unpublish
|
|
25
|
+
variant resolve local variant selection
|
|
26
|
+
|
|
27
|
+
EXECUTE
|
|
28
|
+
storm <goal> Goal+UltraCode harness: plan → allocate → execute → verify [--research]
|
|
29
|
+
swarm <goal> emergent agent swarm [--parallel N]
|
|
30
|
+
workforce | network <request> Agent Workforce Ontology route
|
|
31
|
+
call "a,b" "<ctx>" · browser · route "<req>" [--json] · research <sub>
|
|
32
|
+
|
|
33
|
+
KNOWLEDGE
|
|
34
|
+
memory import · evolve memory & prompt-evolution proposals
|
|
35
|
+
ontology · career-graph project knowledge & source routing
|
|
36
|
+
journal <sub> Stormbreaker run journal
|
|
37
|
+
project [status|init] private .agentlas project state (init is explicit)
|
|
38
|
+
context <sub> dependency map: refresh|locate|refs|slice|impact|verify
|
|
39
|
+
|
|
40
|
+
ACCOUNT & OPS
|
|
41
|
+
login | logout | whoami Agentlas Cloud sign-in (browser flow)
|
|
42
|
+
cloud <sub> cloud assets: save|publish|package|list|restore|field-test
|
|
43
|
+
automation <sub> list|add|on|off|remove|run <id>|runs|daemon
|
|
44
|
+
creds <sub> · env credentials and shared env keys
|
|
45
|
+
usage · telegram · mcp local usage · telegram bindings · MCP servers (mcp probe <id>)
|
|
46
|
+
multimodal image/video/audio provider settings
|
|
47
|
+
doctor · setup · update health check · first-run wizard · npm update check
|
|
48
|
+
oberon | film <sub> AI film render (scaffold|render|list|open)
|
|
49
|
+
hep <sub…> · netadmin Hephaestus passthrough · local network admin
|
|
50
|
+
version · help
|
|
51
|
+
|
|
52
|
+
IN-REPL (agentlas → interactive, Orca multi-session)
|
|
53
|
+
/spawn <agent> [task] · /sessions · /tree · /s <n> · /steer <n> <msg> ·
|
|
54
|
+
/kill <n> · /rm <n> · /broadcast <msg> · /use · /runtime · /permission
|
|
55
|
+
typing during a running turn queues steering; ctrl-c interrupts the turn
|
|
56
|
+
|
|
57
|
+
Options: -p|--print · --runtime claude-code|codex|gemini · --permission read|write|full
|
|
58
|
+
`;
|
|
59
|
+
|
|
60
|
+
function run(ctx) {
|
|
61
|
+
ctx.out(HELP.trimEnd());
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = { run, HELP };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* hep — 전체 Hephaestus 네이티브 패스스루 (v1 cmdHep 이식).
|
|
4
|
+
*
|
|
5
|
+
* v1 디스패처 계약 그대로:
|
|
6
|
+
* - `agentlas hep` (무인자) → HEP_USAGE 출력, exit 0
|
|
7
|
+
* - `agentlas hep help|--help` → 짧은 usage 한 줄, exit 0
|
|
8
|
+
* (v1 사전 가드: 리터럴 --help가 Hub/Cloud 라우팅 쿼리로 새는 것을 막는
|
|
9
|
+
* 로컬·무네트워크 처리 — MCP 키워드 선택 사고 계열의 방어선이다.)
|
|
10
|
+
* - 그 외 → runHephaestusInteractive 인자 그대로 전달,
|
|
11
|
+
* 자식 exit code 반환. 런타임 부재 = 정직 정지 1.
|
|
12
|
+
*/
|
|
13
|
+
const { create, usageFor, isHelpToken } = require("../hephaestus/runtime.cjs");
|
|
14
|
+
|
|
15
|
+
async function run(ctx, args) {
|
|
16
|
+
if (args.length && args.some(isHelpToken)) {
|
|
17
|
+
ctx.out(usageFor("hep", ctx.lang));
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
return create(ctx).cmdHep(args);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = { run };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* import — 로컬 에이전트/팀 폴더 임포트 (데스크탑 폴더 드래그와 동일 규칙). */
|
|
3
|
+
const { importLocalFolder } = require("../agents/import-local.cjs");
|
|
4
|
+
|
|
5
|
+
function run(ctx, args) {
|
|
6
|
+
const ko = ctx.lang === "ko";
|
|
7
|
+
const absPath = args[0];
|
|
8
|
+
if (!absPath) {
|
|
9
|
+
ctx.err(ko ? "사용법: agentlas import <폴더-경로>" : "Usage: agentlas import <folder-path>");
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
let r;
|
|
13
|
+
try {
|
|
14
|
+
r = importLocalFolder(ctx.db(), absPath);
|
|
15
|
+
} catch (e) {
|
|
16
|
+
ctx.err(String((e && e.message) || e));
|
|
17
|
+
return 1;
|
|
18
|
+
}
|
|
19
|
+
ctx.out(`${r.updated ? (ko ? "업데이트됨" : "Updated") : (ko ? "가져옴" : "Imported")}: ${r.name} (${r.kind})`);
|
|
20
|
+
ctx.out(` ${ko ? "슬러그" : "slug"}: ${ctx.ui.accent(r.slug)}`);
|
|
21
|
+
ctx.out(` ${ko ? "런타임" : "runtime"}: ${r.runtime} [${r.labels.join(", ")}]`);
|
|
22
|
+
ctx.out(` ${ko ? "경로" : "path"}: ${r.path}`);
|
|
23
|
+
if (r.firmSlug) {
|
|
24
|
+
ctx.out(ko
|
|
25
|
+
? ` 회사: ${r.firmSlug} (회사로 등록됨 — Desktop 사이드바 + 'agentlas firm ${r.firmSlug}')`
|
|
26
|
+
: ` firm: ${r.firmSlug} (registered in Firms — Desktop sidebar + 'agentlas firm ${r.firmSlug}')`);
|
|
27
|
+
}
|
|
28
|
+
ctx.out("");
|
|
29
|
+
ctx.out(ctx.ui.dim(ko
|
|
30
|
+
? `실행: agentlas ${r.slug} "..." · agentlas run ${r.slug} "..." (대상 프로젝트 폴더에서 실행)`
|
|
31
|
+
: `Run: agentlas ${r.slug} "..." · agentlas run ${r.slug} "..." (run from the target project folder)`));
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = { run };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* commands/index — 명령 디스패치 테이블.
|
|
4
|
+
* 규칙:
|
|
5
|
+
* - 명령 하나 = 파일 하나. 명령 파일은 기능 모듈만 import한다(명령끼리 참조 금지).
|
|
6
|
+
* - 아직 v2로 포팅되지 않은 명령은 "정직 정지": 안내 + exit 1. 가짜 성공 금지.
|
|
7
|
+
* - 무인자 search/install/upload는 usage + exit 1 (프롬프트 오라우팅 방지 가드).
|
|
8
|
+
*/
|
|
9
|
+
const path = require("node:path");
|
|
10
|
+
|
|
11
|
+
// 각 명령 파일은 { run(ctx, args) } 를 export한다. ctx는 엔진이 만든 얕은 DI 객체.
|
|
12
|
+
const COMMANDS = {
|
|
13
|
+
version: () => require("./version.cjs"),
|
|
14
|
+
list: () => require("./list.cjs"),
|
|
15
|
+
chats: () => require("./chats.cjs"),
|
|
16
|
+
doctor: () => require("./doctor.cjs"),
|
|
17
|
+
mcp: () => require("./mcp.cjs"),
|
|
18
|
+
help: () => require("./help.cjs"),
|
|
19
|
+
run: () => require("./run.cjs"),
|
|
20
|
+
login: () => require("./login.cjs"),
|
|
21
|
+
logout: () => require("./logout.cjs"),
|
|
22
|
+
whoami: () => require("./whoami.cjs"),
|
|
23
|
+
search: () => require("./search.cjs"),
|
|
24
|
+
update: () => require("./update.cjs"),
|
|
25
|
+
usage: () => require("./usage.cjs"),
|
|
26
|
+
telegram: () => require("./telegram.cjs"),
|
|
27
|
+
setup: () => require("./setup.cjs"),
|
|
28
|
+
env: () => require("./env.cjs"),
|
|
29
|
+
import: () => require("./import.cjs"),
|
|
30
|
+
firm: () => require("./firm.cjs"),
|
|
31
|
+
cd: () => require("./cd.cjs"),
|
|
32
|
+
install: () => require("./install.cjs"),
|
|
33
|
+
plugin: () => require("./plugin.cjs"),
|
|
34
|
+
plugins: () => require("./plugin.cjs"),
|
|
35
|
+
open: () => require("./open.cjs"),
|
|
36
|
+
automation: () => require("./automation.cjs"),
|
|
37
|
+
native: () => require("./native.cjs"),
|
|
38
|
+
chat: () => require("./chat.cjs"),
|
|
39
|
+
multimodal: () => require("./multimodal.cjs"),
|
|
40
|
+
workforce: () => require("./workforce.cjs"),
|
|
41
|
+
network: () => require("./workforce.cjs"),
|
|
42
|
+
taskforce: () => require("./workforce.cjs"),
|
|
43
|
+
oberon: () => require("./oberon.cjs"),
|
|
44
|
+
film: () => require("./film.cjs"),
|
|
45
|
+
experience: () => require("./experience.cjs"),
|
|
46
|
+
memory: () => require("./memory.cjs"),
|
|
47
|
+
evolve: () => require("./evolve.cjs"),
|
|
48
|
+
variant: () => require("./variant.cjs"),
|
|
49
|
+
hep: () => require("./hep.cjs"),
|
|
50
|
+
build: () => require("./build.cjs"),
|
|
51
|
+
connect: () => require("./connect.cjs"),
|
|
52
|
+
call: () => require("./call.cjs"),
|
|
53
|
+
browser: () => require("./browser.cjs"),
|
|
54
|
+
route: () => require("./route.cjs"),
|
|
55
|
+
research: () => require("./research.cjs"),
|
|
56
|
+
netadmin: () => require("./netadmin.cjs"),
|
|
57
|
+
journal: () => require("./journal.cjs"),
|
|
58
|
+
"legacy-network": () => require("./legacy-network.cjs"),
|
|
59
|
+
cloud: () => require("./cloud.cjs"),
|
|
60
|
+
upload: () => require("./upload.cjs"),
|
|
61
|
+
storm: () => require("./storm.cjs"),
|
|
62
|
+
swarm: () => require("./swarm.cjs"),
|
|
63
|
+
project: () => require("./project.cjs"),
|
|
64
|
+
context: () => require("./context.cjs"),
|
|
65
|
+
ontology: () => require("./ontology.cjs"),
|
|
66
|
+
"career-graph": () => require("./career-graph.cjs"),
|
|
67
|
+
creds: () => require("./creds.cjs"),
|
|
68
|
+
billing: () => require("./billing.cjs"),
|
|
69
|
+
uninstall: () => require("./uninstall.cjs"),
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// v1에 존재했으나 아직 v2로 재구축되지 않은 명령 — 정직 정지 목록.
|
|
73
|
+
// 재구축이 끝나면 여기서 지우고 COMMANDS에 올린다.
|
|
74
|
+
const NOT_YET_PORTED = [
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* 데스크탑 전용 표면 — 터미널에 같은 이름의 명령이 없다.
|
|
81
|
+
* 이 이름들을 그냥 프롬프트로 흘리면 사용자가 "명령을 쳤는데" 에이전트가
|
|
82
|
+
* 저장소를 뒤지고 토큰을 쓴다(실사용 테스트에서 실증). 정직하게 멈추고
|
|
83
|
+
* 데스크탑/대체 경로를 안내한다.
|
|
84
|
+
*/
|
|
85
|
+
const DESKTOP_ONLY_SURFACES = {
|
|
86
|
+
site: "Site studio (웹·모바일·Agent App 디자인) is Desktop-only.",
|
|
87
|
+
sites: "Site studio (웹·모바일·Agent App 디자인) is Desktop-only.",
|
|
88
|
+
trex: "T-rex slide studio is Desktop-only.",
|
|
89
|
+
slides: "T-rex slide studio is Desktop-only.",
|
|
90
|
+
prompts: "Prompt Store is Desktop-only.",
|
|
91
|
+
dashboard: "Dashboard is Desktop-only — use: agentlas doctor · usage · list · chats",
|
|
92
|
+
marketplace: "Marketplace browsing is Desktop-only — use: agentlas search \"<what you need>\"",
|
|
93
|
+
library: "Library is Desktop-only — use: agentlas list · env · mcp",
|
|
94
|
+
groups: "Agent groups (조합) are Desktop-only.",
|
|
95
|
+
"agent-groups": "Agent groups (조합) are Desktop-only.",
|
|
96
|
+
settings: "Settings UI is Desktop-only — use: agentlas setup · env · creds · multimodal · doctor",
|
|
97
|
+
apps: "Apps surface is Desktop-only.",
|
|
98
|
+
quests: "Quests are Desktop-only.",
|
|
99
|
+
bookmarks: "Hub bookmarks are Desktop-only.",
|
|
100
|
+
one: "Agentlas One is a separate Desktop/Mobile product surface.",
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// 무인자 호출이 프롬프트로 오라우팅되면 안 되는 명령 (smoke 가드 대상)
|
|
104
|
+
const GUARDED_NO_ARG = new Set(["search", "install", "upload"]);
|
|
105
|
+
|
|
106
|
+
function dispatch(ctx, argv) {
|
|
107
|
+
const [cmd, ...rest] = argv;
|
|
108
|
+
if (!cmd) return null; // 엔진이 REPL로 진입
|
|
109
|
+
|
|
110
|
+
if (COMMANDS[cmd]) {
|
|
111
|
+
return COMMANDS[cmd]().run(ctx, rest);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (GUARDED_NO_ARG.has(cmd) && rest.length === 0) {
|
|
115
|
+
ctx.err(`Usage: agentlas ${cmd} <args…>`);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (DESKTOP_ONLY_SURFACES[cmd] && rest.length === 0) {
|
|
120
|
+
ctx.err(`${DESKTOP_ONLY_SURFACES[cmd]}\nIt was not run as a prompt — rerun with quotes if you meant a task: agentlas "${cmd} …"`);
|
|
121
|
+
return 1;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (NOT_YET_PORTED.includes(cmd)) {
|
|
125
|
+
ctx.err(
|
|
126
|
+
`'${cmd}' is not wired into the v2 engine yet.\n` +
|
|
127
|
+
`The terminal is being rebuilt from the frame up; this command returns as its module lands.\n` +
|
|
128
|
+
`Last full v1 build: git tag legacy-v1-engine-snapshot (agentlas v0.9.10 on npm).`,
|
|
129
|
+
);
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return undefined; // 알 수 없는 토큰 — 엔진이 에이전트 이름/프롬프트로 해석 시도
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = { dispatch, COMMANDS, NOT_YET_PORTED, GUARDED_NO_ARG, DESKTOP_ONLY_SURFACES };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* install — `agentlas install <slug>`: Hub 에이전트 소스 설치.
|
|
4
|
+
* 기능 로직은 전부 hub/install.cjs에 있다. 여기서는 인자 검증 + 출력만.
|
|
5
|
+
* 오류는 ctx.err로 출력하고 1을 반환한다 (모듈 안 process.exit 금지).
|
|
6
|
+
*/
|
|
7
|
+
const { installHubAgent } = require("../hub/install.cjs");
|
|
8
|
+
|
|
9
|
+
async function run(ctx, args) {
|
|
10
|
+
const slug = (args[0] || "").trim();
|
|
11
|
+
if (!slug) {
|
|
12
|
+
ctx.err("usage: agentlas install <slug>");
|
|
13
|
+
return 1;
|
|
14
|
+
}
|
|
15
|
+
let agent;
|
|
16
|
+
try {
|
|
17
|
+
agent = await installHubAgent(ctx.db(), slug);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
ctx.err(String((e && e.message) || e));
|
|
20
|
+
return 1;
|
|
21
|
+
}
|
|
22
|
+
ctx.out(`${ctx.ui.green("✓")} Hub installed ${ctx.ui.accent(agent.slug)} — ${agent.name}`);
|
|
23
|
+
if (agent.localPath) ctx.out(ctx.ui.dim(` files: ${agent.localPath}`));
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = { run };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* journal — Stormbreaker 런 저널 (status|verify|repair|gate).
|
|
4
|
+
*
|
|
5
|
+
* v1 디스패처 매핑 그대로:
|
|
6
|
+
* `agentlas journal <sub…>` → cmdHep(["stormbreaker", "journal", ...rest])
|
|
7
|
+
*
|
|
8
|
+
* v1 가드 그대로:
|
|
9
|
+
* - help 토큰 → usage, exit 0
|
|
10
|
+
* - `journal status`에 --run-id/--journal 둘 다 없으면 → usage 실패 exit 1
|
|
11
|
+
* (대상 없는 status가 네이티브에서 모호하게 도는 것 방지)
|
|
12
|
+
* - 무인자는 v1처럼 가드 없이 패스스루 — 네이티브 usage가 나온다.
|
|
13
|
+
*/
|
|
14
|
+
const { create, usageFor, isHelpToken } = require("../hephaestus/runtime.cjs");
|
|
15
|
+
|
|
16
|
+
async function run(ctx, args) {
|
|
17
|
+
if (args.some(isHelpToken)) {
|
|
18
|
+
ctx.out(usageFor("journal", ctx.lang));
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
if (
|
|
22
|
+
args[0] === "status"
|
|
23
|
+
&& !args.slice(1).some((value) => value === "--run-id" || value === "--journal")
|
|
24
|
+
) {
|
|
25
|
+
ctx.err("✖ " + usageFor("journal", ctx.lang));
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
return create(ctx).cmdHep(["stormbreaker", "journal", ...args]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = { run };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* legacy-network — 호환 전용 Hephaestus 네트워크 경로 (명시적 탈출구).
|
|
4
|
+
*
|
|
5
|
+
* v1 디스패처 매핑 그대로:
|
|
6
|
+
* `agentlas legacy-network "<request>"` → cmdHep(["hep-network", ...rest])
|
|
7
|
+
*
|
|
8
|
+
* 오너 결정 배경: 기본 `network`/`workforce`는 host-LLM Agent Workforce
|
|
9
|
+
* Ontology(fail-closed) 경로다. 구 Hephaestus hep-network 라우터는 이
|
|
10
|
+
* "legacy-" 접두 명령으로만, 사용자가 이름으로 정확히 지목했을 때만 연다.
|
|
11
|
+
* 절대 기본 경로의 폴백으로 쓰지 않는다.
|
|
12
|
+
*
|
|
13
|
+
* v1 가드 그대로: help 토큰 → usage 0, 무인자 → usage 실패 exit 1.
|
|
14
|
+
*/
|
|
15
|
+
const { create, usageFor, isHelpToken } = require("../hephaestus/runtime.cjs");
|
|
16
|
+
|
|
17
|
+
async function run(ctx, args) {
|
|
18
|
+
if (args.some(isHelpToken)) {
|
|
19
|
+
ctx.out(usageFor("legacy-network", ctx.lang));
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
if (!args.length) {
|
|
23
|
+
ctx.err("✖ " + usageFor("legacy-network", ctx.lang));
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
26
|
+
return create(ctx).cmdHep(["hep-network", ...args]);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { run };
|