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.
34 lines
957 B
TypeScript
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");
|
|
}
|
|
}
|