Files
zesdex/src/features/agent/infrastructure/tools/fs/read.ts
T
asepharyana b5ebd07fa8 refactor: rombak arsitektur file ke modular clean-arch (vertikal per-feature)
Organisasi ulang layer-first (domain/application/infrastructure) menjadi
vertikal per-feature, behavior tidak berubah:

- src/shared/domain/  -> fondasi bersama (ex-domain/core): message, provider,
  tool_call, tool_result, store, error, usage, conversation
- src/features/agent/ -> LLM turn loop: domain (TurnEvent, AgentTurnParams) +
  application (turn_service, ports) + infrastructure (llm LlmClient + tools)
- src/features/cms/   -> settings/conversation/memory persistence: domain +
  application (services) + infrastructure (persistence repos)
- src/features/subagent/ -> orchestration: domain (AccessTier) + infrastructure
  (engine runner, context, provider, delegate, spawn_tools)
- src/features/workflow/ -> multi-phase + hive-mind: domain + infrastructure
- src/interfaces/     -> cli + tui (outer ring) tetap

Subagent-runner (engine.ts runAgent, division.ts toolsFor) dipindah ke
features/subagent (bukan agent tools) utk memutus coupling agent<->subagent.

Alias tsconfig: @zesdex/domain -> shared/domain, + @zesdex/agent,
@zesdex/agent-infra, @zesdex/cms, @zesdex/subagent, @zesdex/workflow, @zesdex/shared.
Bersihkan dead: application/ports PasswordService/TokenService/AuthService.
compose.ts (composition root) & bootstrap repoint ke barrel feature.

Gates: tsc --noEmit 0 error, bun test 70 pass/0 fail, bun build 147 modules,
./dist/zesdex --headless -> real turn OK.
2026-09-03 02:30:12 +07:00

34 lines
957 B
TypeScript

/**
* Read a file from the workspace. Mirrors `tools/fs/read.rs`.
*/
import * as fs from "node:fs";
import type { JsonValue } from "@zesdex/domain";
import { type Tool, type ToolCtx } from "../mod.ts";
import { argStr, resolvePath } from "../util.ts";
/** Read the contents of a file. */
export class Read implements Tool {
name = "read";
description = "Read the contents of a file";
parameters = {
type: "object",
properties: {
path: { type: "string", description: "Path to the file to read (relative to workspace root)" },
},
required: ["path"],
};
run(ctx: ToolCtx, args: JsonValue): string {
const rel = argStr(args, "path");
const file = resolvePath(ctx.workspaces, rel);
if (!fs.existsSync(file)) {
throw new Error(`file '${rel}' does not exist`);
}
if (!fs.statSync(file).isFile()) {
throw new Error(`'${rel}' is not a file`);
}
return fs.readFileSync(file, "utf8");
}
}