@antaif3ng/til-work 0.1.0
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/README.md +573 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent.d.ts +78 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +372 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/compaction.d.ts +40 -0
- package/dist/core/compaction.d.ts.map +1 -0
- package/dist/core/compaction.js +228 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +257 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/llm.d.ts +29 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +553 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/markdown.d.ts +20 -0
- package/dist/core/markdown.d.ts.map +1 -0
- package/dist/core/markdown.js +173 -0
- package/dist/core/markdown.js.map +1 -0
- package/dist/core/memory.d.ts +30 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +163 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/pricing.d.ts +21 -0
- package/dist/core/pricing.d.ts.map +1 -0
- package/dist/core/pricing.js +70 -0
- package/dist/core/pricing.js.map +1 -0
- package/dist/core/session-manager.d.ts +83 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +250 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session.d.ts +76 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +270 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills.d.ts +49 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +232 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +77 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/tool-permissions.d.ts +12 -0
- package/dist/core/tool-permissions.d.ts.map +1 -0
- package/dist/core/tool-permissions.js +71 -0
- package/dist/core/tool-permissions.js.map +1 -0
- package/dist/core/types.d.ts +157 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +21 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extensions/builtin/mcp.d.ts +61 -0
- package/dist/extensions/builtin/mcp.d.ts.map +1 -0
- package/dist/extensions/builtin/mcp.js +407 -0
- package/dist/extensions/builtin/mcp.js.map +1 -0
- package/dist/extensions/index.d.ts +4 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +19 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +118 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/runner.d.ts +28 -0
- package/dist/extensions/runner.d.ts.map +1 -0
- package/dist/extensions/runner.js +77 -0
- package/dist/extensions/runner.js.map +1 -0
- package/dist/extensions/types.d.ts +84 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +6 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +355 -0
- package/dist/main.js.map +1 -0
- package/dist/modes/interactive.d.ts +6 -0
- package/dist/modes/interactive.d.ts.map +1 -0
- package/dist/modes/interactive.js +961 -0
- package/dist/modes/interactive.js.map +1 -0
- package/dist/modes/oneshot.d.ts +8 -0
- package/dist/modes/oneshot.d.ts.map +1 -0
- package/dist/modes/oneshot.js +71 -0
- package/dist/modes/oneshot.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +104 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +63 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/file-manager.d.ts +3 -0
- package/dist/tools/file-manager.d.ts.map +1 -0
- package/dist/tools/file-manager.js +85 -0
- package/dist/tools/file-manager.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +42 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +3 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +65 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/system-info.d.ts +3 -0
- package/dist/tools/system-info.d.ts.map +1 -0
- package/dist/tools/system-info.js +101 -0
- package/dist/tools/system-info.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +117 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +9 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +124 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +3 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +30 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/utils/autocomplete.d.ts +23 -0
- package/dist/utils/autocomplete.d.ts.map +1 -0
- package/dist/utils/autocomplete.js +191 -0
- package/dist/utils/autocomplete.js.map +1 -0
- package/dist/utils/file-processor.d.ts +19 -0
- package/dist/utils/file-processor.d.ts.map +1 -0
- package/dist/utils/file-processor.js +86 -0
- package/dist/utils/file-processor.js.map +1 -0
- package/dist/utils/path.d.ts +8 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +60 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.d.ts +6 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +64 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/truncate.d.ts +12 -0
- package/dist/utils/truncate.d.ts.map +1 -0
- package/dist/utils/truncate.js +46 -0
- package/dist/utils/truncate.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill loading and formatting.
|
|
3
|
+
*
|
|
4
|
+
* A skill is a SKILL.md file (with optional YAML frontmatter) that provides
|
|
5
|
+
* specialised instructions for the agent. Skills are discovered from
|
|
6
|
+
* well-known directories and injected into the system prompt so the LLM can
|
|
7
|
+
* `read` them on demand.
|
|
8
|
+
*
|
|
9
|
+
* Directory conventions (searched in order):
|
|
10
|
+
* ~/.til/skills/ — user-global skills
|
|
11
|
+
* .til/skills/ — project-local skills
|
|
12
|
+
* CLI --skill <path> — explicit paths
|
|
13
|
+
*
|
|
14
|
+
* Layout inside a skills directory:
|
|
15
|
+
* my-skill/
|
|
16
|
+
* SKILL.md — required (contains frontmatter + instructions)
|
|
17
|
+
*/
|
|
18
|
+
export interface SkillFrontmatter {
|
|
19
|
+
name?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
"disable-model-invocation"?: boolean;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface Skill {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
filePath: string;
|
|
28
|
+
baseDir: string;
|
|
29
|
+
source: "user" | "project" | "path";
|
|
30
|
+
disableModelInvocation: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface LoadSkillsResult {
|
|
33
|
+
skills: Skill[];
|
|
34
|
+
diagnostics: SkillDiagnostic[];
|
|
35
|
+
}
|
|
36
|
+
export interface SkillDiagnostic {
|
|
37
|
+
type: "warning" | "collision";
|
|
38
|
+
message: string;
|
|
39
|
+
path: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function loadSkillsFromDir(dir: string, source: Skill["source"]): LoadSkillsResult;
|
|
42
|
+
export interface LoadSkillsOptions {
|
|
43
|
+
cwd?: string;
|
|
44
|
+
skillPaths?: string[];
|
|
45
|
+
includeDefaults?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare function loadSkills(options?: LoadSkillsOptions): LoadSkillsResult;
|
|
48
|
+
export declare function formatSkillsForPrompt(skills: Skill[]): string;
|
|
49
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,sBAAsB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,SAAS,GAAG,WAAW,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb;AAiID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,gBAAgB,CAExF;AAID,MAAM,WAAW,iBAAiB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AASD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CA+D5E;AAaD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAsB7D"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill loading and formatting.
|
|
3
|
+
*
|
|
4
|
+
* A skill is a SKILL.md file (with optional YAML frontmatter) that provides
|
|
5
|
+
* specialised instructions for the agent. Skills are discovered from
|
|
6
|
+
* well-known directories and injected into the system prompt so the LLM can
|
|
7
|
+
* `read` them on demand.
|
|
8
|
+
*
|
|
9
|
+
* Directory conventions (searched in order):
|
|
10
|
+
* ~/.til/skills/ — user-global skills
|
|
11
|
+
* .til/skills/ — project-local skills
|
|
12
|
+
* CLI --skill <path> — explicit paths
|
|
13
|
+
*
|
|
14
|
+
* Layout inside a skills directory:
|
|
15
|
+
* my-skill/
|
|
16
|
+
* SKILL.md — required (contains frontmatter + instructions)
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
19
|
+
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
20
|
+
import { homedir } from "node:os";
|
|
21
|
+
// ── Frontmatter parsing ──
|
|
22
|
+
function parseFrontmatter(raw) {
|
|
23
|
+
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
24
|
+
if (!match)
|
|
25
|
+
return { frontmatter: {}, body: raw };
|
|
26
|
+
const yamlBlock = match[1];
|
|
27
|
+
const body = match[2];
|
|
28
|
+
const fm = {};
|
|
29
|
+
for (const line of yamlBlock.split(/\r?\n/)) {
|
|
30
|
+
const kv = line.match(/^\s*([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
|
|
31
|
+
if (!kv)
|
|
32
|
+
continue;
|
|
33
|
+
const key = kv[1].trim();
|
|
34
|
+
let value = kv[2].trim();
|
|
35
|
+
// Strip surrounding quotes
|
|
36
|
+
if (typeof value === "string" && /^(['"]).*\1$/.test(value)) {
|
|
37
|
+
value = value.slice(1, -1);
|
|
38
|
+
}
|
|
39
|
+
if (value === "true")
|
|
40
|
+
value = true;
|
|
41
|
+
if (value === "false")
|
|
42
|
+
value = false;
|
|
43
|
+
fm[key] = value;
|
|
44
|
+
}
|
|
45
|
+
return { frontmatter: fm, body };
|
|
46
|
+
}
|
|
47
|
+
// ── Single-file loader ──
|
|
48
|
+
function loadSkillFromFile(filePath, source) {
|
|
49
|
+
const diagnostics = [];
|
|
50
|
+
try {
|
|
51
|
+
const rawContent = readFileSync(filePath, "utf-8");
|
|
52
|
+
const { frontmatter } = parseFrontmatter(rawContent);
|
|
53
|
+
const skillDir = dirname(filePath);
|
|
54
|
+
const parentDirName = basename(skillDir);
|
|
55
|
+
const name = frontmatter.name || parentDirName;
|
|
56
|
+
const description = frontmatter.description || "";
|
|
57
|
+
if (!description) {
|
|
58
|
+
diagnostics.push({ type: "warning", message: "description is required", path: filePath });
|
|
59
|
+
return { skill: null, diagnostics };
|
|
60
|
+
}
|
|
61
|
+
if (name.length > 64) {
|
|
62
|
+
diagnostics.push({ type: "warning", message: `name exceeds 64 characters (${name.length})`, path: filePath });
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
skill: {
|
|
66
|
+
name,
|
|
67
|
+
description,
|
|
68
|
+
filePath,
|
|
69
|
+
baseDir: skillDir,
|
|
70
|
+
source,
|
|
71
|
+
disableModelInvocation: frontmatter["disable-model-invocation"] === true,
|
|
72
|
+
},
|
|
73
|
+
diagnostics,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
const message = error instanceof Error ? error.message : "failed to parse skill file";
|
|
78
|
+
diagnostics.push({ type: "warning", message, path: filePath });
|
|
79
|
+
return { skill: null, diagnostics };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ── Directory scanner ──
|
|
83
|
+
function loadSkillsFromDirInternal(dir, source, includeRootFiles) {
|
|
84
|
+
const skills = [];
|
|
85
|
+
const diagnostics = [];
|
|
86
|
+
if (!existsSync(dir))
|
|
87
|
+
return { skills, diagnostics };
|
|
88
|
+
try {
|
|
89
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
92
|
+
continue;
|
|
93
|
+
const fullPath = join(dir, entry.name);
|
|
94
|
+
let isDirectory = entry.isDirectory();
|
|
95
|
+
let isFile = entry.isFile();
|
|
96
|
+
if (entry.isSymbolicLink()) {
|
|
97
|
+
try {
|
|
98
|
+
const stats = statSync(fullPath);
|
|
99
|
+
isDirectory = stats.isDirectory();
|
|
100
|
+
isFile = stats.isFile();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (isDirectory) {
|
|
107
|
+
const subResult = loadSkillsFromDirInternal(fullPath, source, false);
|
|
108
|
+
skills.push(...subResult.skills);
|
|
109
|
+
diagnostics.push(...subResult.diagnostics);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (!isFile)
|
|
113
|
+
continue;
|
|
114
|
+
const isRootMd = includeRootFiles && entry.name.endsWith(".md");
|
|
115
|
+
const isSkillMd = !includeRootFiles && entry.name === "SKILL.md";
|
|
116
|
+
if (!isRootMd && !isSkillMd)
|
|
117
|
+
continue;
|
|
118
|
+
const result = loadSkillFromFile(fullPath, source);
|
|
119
|
+
if (result.skill)
|
|
120
|
+
skills.push(result.skill);
|
|
121
|
+
diagnostics.push(...result.diagnostics);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* directory unreadable */
|
|
126
|
+
}
|
|
127
|
+
return { skills, diagnostics };
|
|
128
|
+
}
|
|
129
|
+
export function loadSkillsFromDir(dir, source) {
|
|
130
|
+
return loadSkillsFromDirInternal(dir, source, true);
|
|
131
|
+
}
|
|
132
|
+
function normalizePath(input) {
|
|
133
|
+
const trimmed = input.trim();
|
|
134
|
+
if (trimmed === "~")
|
|
135
|
+
return homedir();
|
|
136
|
+
if (trimmed.startsWith("~/"))
|
|
137
|
+
return join(homedir(), trimmed.slice(2));
|
|
138
|
+
return trimmed;
|
|
139
|
+
}
|
|
140
|
+
export function loadSkills(options = {}) {
|
|
141
|
+
const { cwd = process.cwd(), skillPaths = [], includeDefaults = true } = options;
|
|
142
|
+
const skillMap = new Map();
|
|
143
|
+
const realPathSet = new Set();
|
|
144
|
+
const allDiagnostics = [];
|
|
145
|
+
function addSkills(result) {
|
|
146
|
+
allDiagnostics.push(...result.diagnostics);
|
|
147
|
+
for (const skill of result.skills) {
|
|
148
|
+
let realPath;
|
|
149
|
+
try {
|
|
150
|
+
realPath = realpathSync(skill.filePath);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
realPath = skill.filePath;
|
|
154
|
+
}
|
|
155
|
+
if (realPathSet.has(realPath))
|
|
156
|
+
continue;
|
|
157
|
+
if (skillMap.has(skill.name)) {
|
|
158
|
+
allDiagnostics.push({
|
|
159
|
+
type: "collision",
|
|
160
|
+
message: `name "${skill.name}" collision`,
|
|
161
|
+
path: skill.filePath,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
skillMap.set(skill.name, skill);
|
|
166
|
+
realPathSet.add(realPath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (includeDefaults) {
|
|
171
|
+
addSkills(loadSkillsFromDirInternal(join(homedir(), ".til", "skills"), "user", true));
|
|
172
|
+
addSkills(loadSkillsFromDirInternal(resolve(cwd, ".til", "skills"), "project", true));
|
|
173
|
+
}
|
|
174
|
+
for (const rawPath of skillPaths) {
|
|
175
|
+
const resolvedPath = isAbsolute(normalizePath(rawPath))
|
|
176
|
+
? normalizePath(rawPath)
|
|
177
|
+
: resolve(cwd, normalizePath(rawPath));
|
|
178
|
+
if (!existsSync(resolvedPath)) {
|
|
179
|
+
allDiagnostics.push({ type: "warning", message: "skill path does not exist", path: resolvedPath });
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const stats = statSync(resolvedPath);
|
|
184
|
+
if (stats.isDirectory()) {
|
|
185
|
+
addSkills(loadSkillsFromDirInternal(resolvedPath, "path", true));
|
|
186
|
+
}
|
|
187
|
+
else if (stats.isFile() && resolvedPath.endsWith(".md")) {
|
|
188
|
+
const result = loadSkillFromFile(resolvedPath, "path");
|
|
189
|
+
if (result.skill)
|
|
190
|
+
addSkills({ skills: [result.skill], diagnostics: result.diagnostics });
|
|
191
|
+
else
|
|
192
|
+
allDiagnostics.push(...result.diagnostics);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
const msg = error instanceof Error ? error.message : "failed to read skill path";
|
|
197
|
+
allDiagnostics.push({ type: "warning", message: msg, path: resolvedPath });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { skills: Array.from(skillMap.values()), diagnostics: allDiagnostics };
|
|
201
|
+
}
|
|
202
|
+
// ── System prompt formatting ──
|
|
203
|
+
function escapeXml(str) {
|
|
204
|
+
return str
|
|
205
|
+
.replace(/&/g, "&")
|
|
206
|
+
.replace(/</g, "<")
|
|
207
|
+
.replace(/>/g, ">")
|
|
208
|
+
.replace(/"/g, """)
|
|
209
|
+
.replace(/'/g, "'");
|
|
210
|
+
}
|
|
211
|
+
export function formatSkillsForPrompt(skills) {
|
|
212
|
+
const visible = skills.filter((s) => !s.disableModelInvocation);
|
|
213
|
+
if (visible.length === 0)
|
|
214
|
+
return "";
|
|
215
|
+
const lines = [
|
|
216
|
+
"\n\nThe following skills provide specialized instructions for specific tasks.",
|
|
217
|
+
"Use the read tool to load a skill's file when the task matches its description.",
|
|
218
|
+
"When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md) and use that absolute path in tool commands.",
|
|
219
|
+
"",
|
|
220
|
+
"<available_skills>",
|
|
221
|
+
];
|
|
222
|
+
for (const skill of visible) {
|
|
223
|
+
lines.push(" <skill>");
|
|
224
|
+
lines.push(` <name>${escapeXml(skill.name)}</name>`);
|
|
225
|
+
lines.push(` <description>${escapeXml(skill.description)}</description>`);
|
|
226
|
+
lines.push(` <location>${escapeXml(skill.filePath)}</location>`);
|
|
227
|
+
lines.push(" </skill>");
|
|
228
|
+
}
|
|
229
|
+
lines.push("</available_skills>");
|
|
230
|
+
return lines.join("\n");
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt builder for the personal computer assistant.
|
|
3
|
+
*/
|
|
4
|
+
import { type Skill } from "./skills.js";
|
|
5
|
+
import { type MemoryContent, type ContextFile } from "./memory.js";
|
|
6
|
+
export interface SystemPromptOptions {
|
|
7
|
+
cwd: string;
|
|
8
|
+
tools: string[];
|
|
9
|
+
skills?: Skill[];
|
|
10
|
+
customInstructions?: string;
|
|
11
|
+
/** Pre-loaded memory (if not provided, loaded fresh from disk) */
|
|
12
|
+
memory?: MemoryContent;
|
|
13
|
+
/** Pre-loaded context files (if not provided, loaded fresh from disk) */
|
|
14
|
+
contextFiles?: ContextFile[];
|
|
15
|
+
}
|
|
16
|
+
export declare function buildSystemPrompt(options: SystemPromptOptions): string;
|
|
17
|
+
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAKN,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,yEAAyE;IACzE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC7B;AAaD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAoEtE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt builder for the personal computer assistant.
|
|
3
|
+
*/
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import { formatSkillsForPrompt } from "./skills.js";
|
|
6
|
+
import { loadMemory, formatMemoryForPrompt, loadProjectContextFiles, formatContextFilesForPrompt, } from "./memory.js";
|
|
7
|
+
const toolDescriptions = {
|
|
8
|
+
bash: "Execute bash commands (ls, grep, find, git, etc.)",
|
|
9
|
+
read: "Read file contents (text files, with offset/limit support)",
|
|
10
|
+
write: "Create or overwrite files",
|
|
11
|
+
edit: "Make precise edits to files (find exact text and replace)",
|
|
12
|
+
system_info: "Get system information (OS, CPU, memory, network, env)",
|
|
13
|
+
file_manager: "Advanced file operations (copy, move, delete, list, mkdir, info)",
|
|
14
|
+
web_search: "Search the web for real-time information (supports Brave, Google, DuckDuckGo)",
|
|
15
|
+
web_fetch: "Fetch and read the content of a web page as text",
|
|
16
|
+
};
|
|
17
|
+
export function buildSystemPrompt(options) {
|
|
18
|
+
const { cwd, tools, customInstructions } = options;
|
|
19
|
+
const toolsList = tools
|
|
20
|
+
.map((t) => `- **${t}**: ${toolDescriptions[t] || t}`)
|
|
21
|
+
.join("\n");
|
|
22
|
+
const sections = [];
|
|
23
|
+
sections.push(`You are TIL, a personal computer assistant running directly on the user's machine.
|
|
24
|
+
You help with a wide range of tasks including:
|
|
25
|
+
- File and directory management
|
|
26
|
+
- System administration and monitoring
|
|
27
|
+
- Software development and code editing
|
|
28
|
+
- Information lookup and research
|
|
29
|
+
- Task automation and scripting
|
|
30
|
+
- Troubleshooting and debugging
|
|
31
|
+
|
|
32
|
+
You have direct access to the user's filesystem and can execute commands.`);
|
|
33
|
+
sections.push(`## Available Tools
|
|
34
|
+
|
|
35
|
+
${toolsList}`);
|
|
36
|
+
sections.push(`## Guidelines
|
|
37
|
+
|
|
38
|
+
1. **Be concise**: Give short, direct answers. Explain only when asked.
|
|
39
|
+
2. **Safety first**: For destructive operations (delete, overwrite, system changes), explain what you're about to do and proceed carefully.
|
|
40
|
+
3. **Use the right tool**: Prefer edit over write when modifying existing files. Use bash for complex operations that tools don't cover directly.
|
|
41
|
+
4. **Respect the user's system**: Don't install software or make system-level changes without being asked. Don't modify files outside the working directory unless instructed.
|
|
42
|
+
5. **Error handling**: If a command or operation fails, explain what went wrong and suggest alternatives.
|
|
43
|
+
6. **File paths**: Always resolve relative paths from the current working directory. Support ~ for home directory.
|
|
44
|
+
7. **Large outputs**: When output is truncated, inform the user and suggest how to see more.
|
|
45
|
+
8. **Code changes**: When editing code, preserve the existing style and conventions. Make minimal, targeted changes.
|
|
46
|
+
9. **Security**: Never output API keys, passwords, or other secrets. Warn if you detect credentials in files.
|
|
47
|
+
10. **Chinese support**: Respond in the user's language. Support Chinese filenames and content.`);
|
|
48
|
+
if (customInstructions) {
|
|
49
|
+
sections.push(`## Custom Instructions\n\n${customInstructions}`);
|
|
50
|
+
}
|
|
51
|
+
// Memory — re-read from disk each time to pick up LLM writes
|
|
52
|
+
const memory = options.memory ?? loadMemory(cwd);
|
|
53
|
+
sections.push(formatMemoryForPrompt(memory, cwd));
|
|
54
|
+
// Project context (AGENTS.md)
|
|
55
|
+
const contextFiles = options.contextFiles ?? loadProjectContextFiles(cwd);
|
|
56
|
+
const contextBlock = formatContextFilesForPrompt(contextFiles);
|
|
57
|
+
if (contextBlock)
|
|
58
|
+
sections.push(contextBlock);
|
|
59
|
+
// Skills (only if the read tool is available so the LLM can load them)
|
|
60
|
+
const hasRead = tools.includes("read");
|
|
61
|
+
if (hasRead && options.skills && options.skills.length > 0) {
|
|
62
|
+
const skillsBlock = formatSkillsForPrompt(options.skills);
|
|
63
|
+
if (skillsBlock)
|
|
64
|
+
sections.push(skillsBlock);
|
|
65
|
+
}
|
|
66
|
+
sections.push(`## Environment
|
|
67
|
+
|
|
68
|
+
- Current date: ${new Date().toISOString().split("T")[0]}
|
|
69
|
+
- Current time: ${new Date().toLocaleTimeString()}
|
|
70
|
+
- Working directory: ${cwd}
|
|
71
|
+
- OS: ${os.platform()} ${os.arch()} (${os.release()})
|
|
72
|
+
- Node.js: ${process.version}
|
|
73
|
+
- User: ${os.userInfo().username}
|
|
74
|
+
- Shell: ${process.env.SHELL || "unknown"}`);
|
|
75
|
+
return sections.join("\n\n");
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAc,MAAM,aAAa,CAAC;AAChE,OAAO,EACN,UAAU,EACV,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,GAG3B,MAAM,aAAa,CAAC;AAarB,MAAM,gBAAgB,GAA2B;IAChD,IAAI,EAAE,mDAAmD;IACzD,IAAI,EAAE,4DAA4D;IAClE,KAAK,EAAE,2BAA2B;IAClC,IAAI,EAAE,2DAA2D;IACjE,WAAW,EAAE,wDAAwD;IACrE,YAAY,EAAE,kEAAkE;IAChF,UAAU,EAAE,+EAA+E;IAC3F,SAAS,EAAE,kDAAkD;CAC7D,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,OAA4B;IAC7D,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAEnD,MAAM,SAAS,GAAG,KAAK;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SACrD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;0EAS2D,CAAC,CAAC;IAE3E,QAAQ,CAAC,IAAI,CAAC;;EAEb,SAAS,EAAE,CAAC,CAAC;IAEd,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;gGAWiF,CAAC,CAAC;IAEjG,IAAI,kBAAkB,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,6BAA6B,kBAAkB,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,6DAA6D;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAElD,8BAA8B;IAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,YAAY;QAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE9C,uEAAuE;IACvE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,WAAW;YAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;kBAEG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;kBACtC,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE;uBAC1B,GAAG;QAClB,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE;aACtC,OAAO,CAAC,OAAO;UAClB,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ;WACrB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool permission system.
|
|
3
|
+
* Detects dangerous commands and provides an approval flow.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DANGEROUS_PATTERNS: RegExp[];
|
|
6
|
+
export declare function isDangerousCommand(command: string): boolean;
|
|
7
|
+
export declare function getDangerReason(command: string): string | undefined;
|
|
8
|
+
export declare function createToolCallRequestHandler(hasUI: boolean, promptUser?: (question: string) => Promise<string>): (toolName: string, args: Record<string, any>) => Promise<{
|
|
9
|
+
block: boolean;
|
|
10
|
+
reason?: string;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=tool-permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-permissions.d.ts","sourceRoot":"","sources":["../../src/core/tool-permissions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAgBtC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAkBnE;AAED,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,OAAO,EACd,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAChD,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB/F"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool permission system.
|
|
3
|
+
* Detects dangerous commands and provides an approval flow.
|
|
4
|
+
*/
|
|
5
|
+
export const DANGEROUS_PATTERNS = [
|
|
6
|
+
/\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f|--recursive)\b/i,
|
|
7
|
+
/\brm\s+-[a-zA-Z]*f[a-zA-Z]*r\b/i,
|
|
8
|
+
/\bsudo\b/i,
|
|
9
|
+
/\b(chmod|chown)\b.*\b777\b/,
|
|
10
|
+
/\bmkfs\b/i,
|
|
11
|
+
/\bdd\s+if=/i,
|
|
12
|
+
/>\s*\/dev\//,
|
|
13
|
+
/:\(\)\s*\{/,
|
|
14
|
+
/\bkill\s+-9\b/,
|
|
15
|
+
/\bshutdown\b/i,
|
|
16
|
+
/\breboot\b/i,
|
|
17
|
+
/\bformat\s+[a-z]:/i,
|
|
18
|
+
/\bnpx\s.*\b(rimraf|del-cli)\b.*\//,
|
|
19
|
+
/\bgit\s+push\s+.*--force\b/i,
|
|
20
|
+
/\bgit\s+reset\s+--hard\b/i,
|
|
21
|
+
];
|
|
22
|
+
export function isDangerousCommand(command) {
|
|
23
|
+
return DANGEROUS_PATTERNS.some((p) => p.test(command));
|
|
24
|
+
}
|
|
25
|
+
export function getDangerReason(command) {
|
|
26
|
+
for (const pattern of DANGEROUS_PATTERNS) {
|
|
27
|
+
if (pattern.test(command)) {
|
|
28
|
+
if (/\brm\s/.test(command))
|
|
29
|
+
return "递归/强制删除文件";
|
|
30
|
+
if (/\bsudo\b/.test(command))
|
|
31
|
+
return "以超级用户权限执行";
|
|
32
|
+
if (/\b(chmod|chown)\b/.test(command))
|
|
33
|
+
return "修改文件权限为完全开放";
|
|
34
|
+
if (/\bmkfs\b/.test(command))
|
|
35
|
+
return "格式化磁盘分区";
|
|
36
|
+
if (/\bdd\s/.test(command))
|
|
37
|
+
return "底层磁盘操作";
|
|
38
|
+
if (/\/dev\//.test(command))
|
|
39
|
+
return "写入系统设备文件";
|
|
40
|
+
if (/:\(\)/.test(command))
|
|
41
|
+
return "Fork 炸弹";
|
|
42
|
+
if (/\bkill\s/.test(command))
|
|
43
|
+
return "强制终止进程";
|
|
44
|
+
if (/\bshutdown\b/.test(command) || /\breboot\b/.test(command))
|
|
45
|
+
return "系统关机/重启";
|
|
46
|
+
if (/--force/.test(command))
|
|
47
|
+
return "强制推送可能覆盖远程历史";
|
|
48
|
+
if (/--hard/.test(command))
|
|
49
|
+
return "硬重置将丢失未提交的更改";
|
|
50
|
+
return "潜在的危险操作";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
export function createToolCallRequestHandler(hasUI, promptUser) {
|
|
56
|
+
return async (toolName, args) => {
|
|
57
|
+
if (toolName !== "bash")
|
|
58
|
+
return { block: false };
|
|
59
|
+
const command = args.command;
|
|
60
|
+
if (!command || !isDangerousCommand(command))
|
|
61
|
+
return { block: false };
|
|
62
|
+
const reason = getDangerReason(command) || "危险命令";
|
|
63
|
+
if (!hasUI || !promptUser) {
|
|
64
|
+
return { block: true, reason: `${reason} — 非交互模式下自动拒绝` };
|
|
65
|
+
}
|
|
66
|
+
const answer = await promptUser(`⚠️ 危险命令检测: ${reason}\n $ ${command}\n 允许执行? [y/N] `);
|
|
67
|
+
const allowed = answer.trim().toLowerCase() === "y";
|
|
68
|
+
return allowed ? { block: false } : { block: true, reason: `${reason} — 用户拒绝` };
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=tool-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-permissions.js","sourceRoot":"","sources":["../../src/core/tool-permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for the agent runtime.
|
|
3
|
+
* Inspired by pi-mono's architecture (pi-ai + pi-agent-core).
|
|
4
|
+
*/
|
|
5
|
+
export interface TextContent {
|
|
6
|
+
type: "text";
|
|
7
|
+
text: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ImageContent {
|
|
10
|
+
type: "image";
|
|
11
|
+
data: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ThinkingContent {
|
|
15
|
+
type: "thinking";
|
|
16
|
+
thinking: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ToolCall {
|
|
19
|
+
type: "toolCall";
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
arguments: Record<string, any>;
|
|
23
|
+
}
|
|
24
|
+
export interface UserMessage {
|
|
25
|
+
role: "user";
|
|
26
|
+
content: string | (TextContent | ImageContent)[];
|
|
27
|
+
timestamp: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Usage {
|
|
30
|
+
input: number;
|
|
31
|
+
output: number;
|
|
32
|
+
cacheRead: number;
|
|
33
|
+
cacheWrite: number;
|
|
34
|
+
totalTokens?: number;
|
|
35
|
+
cost?: {
|
|
36
|
+
input: number;
|
|
37
|
+
output: number;
|
|
38
|
+
cacheRead: number;
|
|
39
|
+
cacheWrite: number;
|
|
40
|
+
total: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export declare function createEmptyUsage(): Usage;
|
|
44
|
+
export declare function addUsage(target: Usage, source: Usage): void;
|
|
45
|
+
export interface AssistantMessage {
|
|
46
|
+
role: "assistant";
|
|
47
|
+
content: (TextContent | ThinkingContent | ToolCall)[];
|
|
48
|
+
model?: string;
|
|
49
|
+
provider?: string;
|
|
50
|
+
stopReason?: "end" | "toolCall" | "aborted" | "error";
|
|
51
|
+
errorMessage?: string;
|
|
52
|
+
usage?: Usage;
|
|
53
|
+
timestamp: number;
|
|
54
|
+
}
|
|
55
|
+
export interface ToolResultMessage {
|
|
56
|
+
role: "toolResult";
|
|
57
|
+
toolCallId: string;
|
|
58
|
+
toolName: string;
|
|
59
|
+
content: (TextContent | ImageContent)[];
|
|
60
|
+
isError: boolean;
|
|
61
|
+
timestamp: number;
|
|
62
|
+
}
|
|
63
|
+
export type Message = UserMessage | AssistantMessage | ToolResultMessage;
|
|
64
|
+
export interface ToolParameter {
|
|
65
|
+
type: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
required?: boolean;
|
|
68
|
+
enum?: string[];
|
|
69
|
+
properties?: Record<string, ToolParameter>;
|
|
70
|
+
items?: ToolParameter;
|
|
71
|
+
}
|
|
72
|
+
export interface ToolSchema {
|
|
73
|
+
type: "object";
|
|
74
|
+
properties: Record<string, ToolParameter>;
|
|
75
|
+
required?: string[];
|
|
76
|
+
}
|
|
77
|
+
export interface Tool {
|
|
78
|
+
name: string;
|
|
79
|
+
description: string;
|
|
80
|
+
parameters: ToolSchema;
|
|
81
|
+
}
|
|
82
|
+
export interface AgentToolResult {
|
|
83
|
+
content: (TextContent | ImageContent)[];
|
|
84
|
+
details?: any;
|
|
85
|
+
}
|
|
86
|
+
export type AgentToolUpdateCallback = (partialResult: AgentToolResult) => void;
|
|
87
|
+
export interface AgentTool extends Tool {
|
|
88
|
+
label: string;
|
|
89
|
+
execute: (toolCallId: string, params: Record<string, any>, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback) => Promise<AgentToolResult>;
|
|
90
|
+
}
|
|
91
|
+
export type ThinkingLevel = "off" | "low" | "medium" | "high";
|
|
92
|
+
export interface AgentState {
|
|
93
|
+
systemPrompt: string;
|
|
94
|
+
model: ModelConfig;
|
|
95
|
+
thinkingLevel: ThinkingLevel;
|
|
96
|
+
tools: AgentTool[];
|
|
97
|
+
messages: Message[];
|
|
98
|
+
isStreaming: boolean;
|
|
99
|
+
error?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface ModelConfig {
|
|
102
|
+
provider: "anthropic" | "openai" | "openai-compatible" | "google" | string;
|
|
103
|
+
id: string;
|
|
104
|
+
name: string;
|
|
105
|
+
apiKey?: string;
|
|
106
|
+
baseUrl?: string;
|
|
107
|
+
maxTokens?: number;
|
|
108
|
+
contextWindow?: number;
|
|
109
|
+
/** Extra headers sent with every LLM request (e.g. org-id, auth tokens) */
|
|
110
|
+
headers?: Record<string, string>;
|
|
111
|
+
}
|
|
112
|
+
export type AgentEvent = {
|
|
113
|
+
type: "agent_start";
|
|
114
|
+
} | {
|
|
115
|
+
type: "agent_end";
|
|
116
|
+
messages: Message[];
|
|
117
|
+
} | {
|
|
118
|
+
type: "turn_start";
|
|
119
|
+
} | {
|
|
120
|
+
type: "turn_end";
|
|
121
|
+
message: Message;
|
|
122
|
+
toolResults: ToolResultMessage[];
|
|
123
|
+
} | {
|
|
124
|
+
type: "message_start";
|
|
125
|
+
message: Message;
|
|
126
|
+
} | {
|
|
127
|
+
type: "message_update";
|
|
128
|
+
message: AssistantMessage;
|
|
129
|
+
delta: string;
|
|
130
|
+
} | {
|
|
131
|
+
type: "message_end";
|
|
132
|
+
message: Message;
|
|
133
|
+
} | {
|
|
134
|
+
type: "tool_execution_start";
|
|
135
|
+
toolCallId: string;
|
|
136
|
+
toolName: string;
|
|
137
|
+
args: any;
|
|
138
|
+
} | {
|
|
139
|
+
type: "tool_execution_update";
|
|
140
|
+
toolCallId: string;
|
|
141
|
+
toolName: string;
|
|
142
|
+
partialResult: any;
|
|
143
|
+
} | {
|
|
144
|
+
type: "tool_execution_end";
|
|
145
|
+
toolCallId: string;
|
|
146
|
+
toolName: string;
|
|
147
|
+
result: any;
|
|
148
|
+
isError: boolean;
|
|
149
|
+
} | {
|
|
150
|
+
type: "compaction_start";
|
|
151
|
+
reason: "overflow" | "threshold";
|
|
152
|
+
} | {
|
|
153
|
+
type: "compaction_end";
|
|
154
|
+
tokensBefore: number;
|
|
155
|
+
tokensAfter: number;
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=types.d.ts.map
|