agentx-sdk 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 +561 -0
- package/dist/agent.d.ts +105 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +690 -0
- package/dist/agent.js.map +1 -0
- package/dist/config/config.d.ts +346 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +93 -0
- package/dist/config/config.js.map +1 -0
- package/dist/contracts/entities/agent-event.d.ts +97 -0
- package/dist/contracts/entities/agent-event.d.ts.map +1 -0
- package/dist/contracts/entities/agent-event.js +2 -0
- package/dist/contracts/entities/agent-event.js.map +1 -0
- package/dist/contracts/entities/agent-skill.d.ts +59 -0
- package/dist/contracts/entities/agent-skill.d.ts.map +1 -0
- package/dist/contracts/entities/agent-skill.js +2 -0
- package/dist/contracts/entities/agent-skill.js.map +1 -0
- package/dist/contracts/entities/agent-tool.d.ts +42 -0
- package/dist/contracts/entities/agent-tool.d.ts.map +1 -0
- package/dist/contracts/entities/agent-tool.js +2 -0
- package/dist/contracts/entities/agent-tool.js.map +1 -0
- package/dist/contracts/entities/chat-message.d.ts +13 -0
- package/dist/contracts/entities/chat-message.d.ts.map +1 -0
- package/dist/contracts/entities/chat-message.js +2 -0
- package/dist/contracts/entities/chat-message.js.map +1 -0
- package/dist/contracts/entities/content-part.d.ts +16 -0
- package/dist/contracts/entities/content-part.d.ts.map +1 -0
- package/dist/contracts/entities/content-part.js +2 -0
- package/dist/contracts/entities/content-part.js.map +1 -0
- package/dist/contracts/entities/execution-context.d.ts +9 -0
- package/dist/contracts/entities/execution-context.d.ts.map +1 -0
- package/dist/contracts/entities/execution-context.js +2 -0
- package/dist/contracts/entities/execution-context.js.map +1 -0
- package/dist/contracts/entities/index.d.ts +11 -0
- package/dist/contracts/entities/index.d.ts.map +1 -0
- package/dist/contracts/entities/index.js +2 -0
- package/dist/contracts/entities/index.js.map +1 -0
- package/dist/contracts/entities/knowledge.d.ts +21 -0
- package/dist/contracts/entities/knowledge.d.ts.map +1 -0
- package/dist/contracts/entities/knowledge.js +2 -0
- package/dist/contracts/entities/knowledge.js.map +1 -0
- package/dist/contracts/entities/stores.d.ts +18 -0
- package/dist/contracts/entities/stores.d.ts.map +1 -0
- package/dist/contracts/entities/stores.js +2 -0
- package/dist/contracts/entities/stores.js.map +1 -0
- package/dist/contracts/entities/token-usage.d.ts +7 -0
- package/dist/contracts/entities/token-usage.d.ts.map +1 -0
- package/dist/contracts/entities/token-usage.js +2 -0
- package/dist/contracts/entities/token-usage.js.map +1 -0
- package/dist/contracts/entities/tool-call.d.ts +16 -0
- package/dist/contracts/entities/tool-call.d.ts.map +1 -0
- package/dist/contracts/entities/tool-call.js +2 -0
- package/dist/contracts/entities/tool-call.js.map +1 -0
- package/dist/contracts/enums/index.d.ts +21 -0
- package/dist/contracts/enums/index.d.ts.map +1 -0
- package/dist/contracts/enums/index.js +8 -0
- package/dist/contracts/enums/index.js.map +1 -0
- package/dist/contracts/index.d.ts +3 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +3 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/core/compaction/autocompact.d.ts +18 -0
- package/dist/core/compaction/autocompact.d.ts.map +1 -0
- package/dist/core/compaction/autocompact.js +68 -0
- package/dist/core/compaction/autocompact.js.map +1 -0
- package/dist/core/compaction/microcompact.d.ts +20 -0
- package/dist/core/compaction/microcompact.d.ts.map +1 -0
- package/dist/core/compaction/microcompact.js +38 -0
- package/dist/core/compaction/microcompact.js.map +1 -0
- package/dist/core/compaction/snip-compact.d.ts +22 -0
- package/dist/core/compaction/snip-compact.d.ts.map +1 -0
- package/dist/core/compaction/snip-compact.js +61 -0
- package/dist/core/compaction/snip-compact.js.map +1 -0
- package/dist/core/compaction/tool-result-budget.d.ts +24 -0
- package/dist/core/compaction/tool-result-budget.d.ts.map +1 -0
- package/dist/core/compaction/tool-result-budget.js +67 -0
- package/dist/core/compaction/tool-result-budget.js.map +1 -0
- package/dist/core/context-analysis.d.ts +24 -0
- package/dist/core/context-analysis.d.ts.map +1 -0
- package/dist/core/context-analysis.js +37 -0
- package/dist/core/context-analysis.js.map +1 -0
- package/dist/core/context-builder.d.ts +25 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +108 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/conversation-manager.d.ts +19 -0
- package/dist/core/conversation-manager.d.ts.map +1 -0
- package/dist/core/conversation-manager.js +62 -0
- package/dist/core/conversation-manager.js.map +1 -0
- package/dist/core/execution-context.d.ts +6 -0
- package/dist/core/execution-context.d.ts.map +1 -0
- package/dist/core/execution-context.js +14 -0
- package/dist/core/execution-context.js.map +1 -0
- package/dist/core/loop-deps.d.ts +15 -0
- package/dist/core/loop-deps.d.ts.map +1 -0
- package/dist/core/loop-deps.js +8 -0
- package/dist/core/loop-deps.js.map +1 -0
- package/dist/core/loop-types.d.ts +34 -0
- package/dist/core/loop-types.d.ts.map +1 -0
- package/dist/core/loop-types.js +15 -0
- package/dist/core/loop-types.js.map +1 -0
- package/dist/core/message-normalize.d.ts +18 -0
- package/dist/core/message-normalize.d.ts.map +1 -0
- package/dist/core/message-normalize.js +69 -0
- package/dist/core/message-normalize.js.map +1 -0
- package/dist/core/prompt-builders.d.ts +36 -0
- package/dist/core/prompt-builders.d.ts.map +1 -0
- package/dist/core/prompt-builders.js +89 -0
- package/dist/core/prompt-builders.js.map +1 -0
- package/dist/core/prompt-cache.d.ts +25 -0
- package/dist/core/prompt-cache.d.ts.map +1 -0
- package/dist/core/prompt-cache.js +34 -0
- package/dist/core/prompt-cache.js.map +1 -0
- package/dist/core/react-loop.d.ts +43 -0
- package/dist/core/react-loop.d.ts.map +1 -0
- package/dist/core/react-loop.js +403 -0
- package/dist/core/react-loop.js.map +1 -0
- package/dist/core/stop-hooks.d.ts +18 -0
- package/dist/core/stop-hooks.d.ts.map +1 -0
- package/dist/core/stop-hooks.js +18 -0
- package/dist/core/stop-hooks.js.map +1 -0
- package/dist/core/stream-emitter.d.ts +24 -0
- package/dist/core/stream-emitter.d.ts.map +1 -0
- package/dist/core/stream-emitter.js +65 -0
- package/dist/core/stream-emitter.js.map +1 -0
- package/dist/core/streaming-tool-executor.d.ts +54 -0
- package/dist/core/streaming-tool-executor.d.ts.map +1 -0
- package/dist/core/streaming-tool-executor.js +164 -0
- package/dist/core/streaming-tool-executor.js.map +1 -0
- package/dist/core/turn-end-hooks.d.ts +39 -0
- package/dist/core/turn-end-hooks.d.ts.map +1 -0
- package/dist/core/turn-end-hooks.js +36 -0
- package/dist/core/turn-end-hooks.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chunking.d.ts +9 -0
- package/dist/knowledge/chunking.d.ts.map +1 -0
- package/dist/knowledge/chunking.js +49 -0
- package/dist/knowledge/chunking.js.map +1 -0
- package/dist/knowledge/embedding-service.d.ts +16 -0
- package/dist/knowledge/embedding-service.d.ts.map +1 -0
- package/dist/knowledge/embedding-service.js +43 -0
- package/dist/knowledge/embedding-service.js.map +1 -0
- package/dist/knowledge/knowledge-manager.d.ts +33 -0
- package/dist/knowledge/knowledge-manager.d.ts.map +1 -0
- package/dist/knowledge/knowledge-manager.js +62 -0
- package/dist/knowledge/knowledge-manager.js.map +1 -0
- package/dist/knowledge/sqlite-vector-store.d.ts +16 -0
- package/dist/knowledge/sqlite-vector-store.d.ts.map +1 -0
- package/dist/knowledge/sqlite-vector-store.js +56 -0
- package/dist/knowledge/sqlite-vector-store.js.map +1 -0
- package/dist/knowledge/vector-store.d.ts +2 -0
- package/dist/knowledge/vector-store.d.ts.map +1 -0
- package/dist/knowledge/vector-store.js +2 -0
- package/dist/knowledge/vector-store.js.map +1 -0
- package/dist/llm/errors.d.ts +15 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +39 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/message-types.d.ts +80 -0
- package/dist/llm/message-types.d.ts.map +1 -0
- package/dist/llm/message-types.js +2 -0
- package/dist/llm/message-types.js.map +1 -0
- package/dist/llm/openrouter-client.d.ts +18 -0
- package/dist/llm/openrouter-client.d.ts.map +1 -0
- package/dist/llm/openrouter-client.js +215 -0
- package/dist/llm/openrouter-client.js.map +1 -0
- package/dist/llm/reasoning.d.ts +10 -0
- package/dist/llm/reasoning.d.ts.map +1 -0
- package/dist/llm/reasoning.js +18 -0
- package/dist/llm/reasoning.js.map +1 -0
- package/dist/memory/file-memory-system.d.ts +98 -0
- package/dist/memory/file-memory-system.d.ts.map +1 -0
- package/dist/memory/file-memory-system.js +310 -0
- package/dist/memory/file-memory-system.js.map +1 -0
- package/dist/memory/memory-age.d.ts +22 -0
- package/dist/memory/memory-age.d.ts.map +1 -0
- package/dist/memory/memory-age.js +44 -0
- package/dist/memory/memory-age.js.map +1 -0
- package/dist/memory/memory-extractor.d.ts +56 -0
- package/dist/memory/memory-extractor.d.ts.map +1 -0
- package/dist/memory/memory-extractor.js +91 -0
- package/dist/memory/memory-extractor.js.map +1 -0
- package/dist/memory/memory-paths.d.ts +45 -0
- package/dist/memory/memory-paths.d.ts.map +1 -0
- package/dist/memory/memory-paths.js +121 -0
- package/dist/memory/memory-paths.js.map +1 -0
- package/dist/memory/memory-prompts.d.ts +41 -0
- package/dist/memory/memory-prompts.d.ts.map +1 -0
- package/dist/memory/memory-prompts.js +279 -0
- package/dist/memory/memory-prompts.js.map +1 -0
- package/dist/memory/memory-relevance.d.ts +16 -0
- package/dist/memory/memory-relevance.d.ts.map +1 -0
- package/dist/memory/memory-relevance.js +46 -0
- package/dist/memory/memory-relevance.js.map +1 -0
- package/dist/memory/memory-scanner.d.ts +22 -0
- package/dist/memory/memory-scanner.d.ts.map +1 -0
- package/dist/memory/memory-scanner.js +99 -0
- package/dist/memory/memory-scanner.js.map +1 -0
- package/dist/memory/memory-tools.d.ts +16 -0
- package/dist/memory/memory-tools.d.ts.map +1 -0
- package/dist/memory/memory-tools.js +196 -0
- package/dist/memory/memory-tools.js.map +1 -0
- package/dist/memory/memory-types.d.ts +47 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +24 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/skills/skill-args.d.ts +23 -0
- package/dist/skills/skill-args.d.ts.map +1 -0
- package/dist/skills/skill-args.js +77 -0
- package/dist/skills/skill-args.js.map +1 -0
- package/dist/skills/skill-glob.d.ts +24 -0
- package/dist/skills/skill-glob.d.ts.map +1 -0
- package/dist/skills/skill-glob.js +60 -0
- package/dist/skills/skill-glob.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +49 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +197 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-manager.d.ts +83 -0
- package/dist/skills/skill-manager.d.ts.map +1 -0
- package/dist/skills/skill-manager.js +338 -0
- package/dist/skills/skill-manager.js.map +1 -0
- package/dist/storage/sqlite-conversation-store.d.ts +15 -0
- package/dist/storage/sqlite-conversation-store.d.ts.map +1 -0
- package/dist/storage/sqlite-conversation-store.js +45 -0
- package/dist/storage/sqlite-conversation-store.js.map +1 -0
- package/dist/storage/sqlite-database.d.ts +14 -0
- package/dist/storage/sqlite-database.d.ts.map +1 -0
- package/dist/storage/sqlite-database.js +95 -0
- package/dist/storage/sqlite-database.js.map +1 -0
- package/dist/tools/builtin/ask-user.d.ts +7 -0
- package/dist/tools/builtin/ask-user.d.ts.map +1 -0
- package/dist/tools/builtin/ask-user.js +23 -0
- package/dist/tools/builtin/ask-user.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +3 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +54 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/file-edit.d.ts +3 -0
- package/dist/tools/builtin/file-edit.d.ts.map +1 -0
- package/dist/tools/builtin/file-edit.js +50 -0
- package/dist/tools/builtin/file-edit.js.map +1 -0
- package/dist/tools/builtin/file-read.d.ts +3 -0
- package/dist/tools/builtin/file-read.d.ts.map +1 -0
- package/dist/tools/builtin/file-read.js +47 -0
- package/dist/tools/builtin/file-read.js.map +1 -0
- package/dist/tools/builtin/file-write.d.ts +3 -0
- package/dist/tools/builtin/file-write.d.ts.map +1 -0
- package/dist/tools/builtin/file-write.js +29 -0
- package/dist/tools/builtin/file-write.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +3 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +67 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +3 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +94 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/index.d.ts +49 -0
- package/dist/tools/builtin/index.d.ts.map +1 -0
- package/dist/tools/builtin/index.js +65 -0
- package/dist/tools/builtin/index.js.map +1 -0
- package/dist/tools/builtin/web-fetch.d.ts +3 -0
- package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtin/web-fetch.js +56 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/json-schema-to-zod.d.ts +30 -0
- package/dist/tools/json-schema-to-zod.d.ts.map +1 -0
- package/dist/tools/json-schema-to-zod.js +123 -0
- package/dist/tools/json-schema-to-zod.js.map +1 -0
- package/dist/tools/mcp-adapter.d.ts +80 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +326 -0
- package/dist/tools/mcp-adapter.js.map +1 -0
- package/dist/tools/skill-tool.d.ts +41 -0
- package/dist/tools/skill-tool.d.ts.map +1 -0
- package/dist/tools/skill-tool.js +149 -0
- package/dist/tools/skill-tool.js.map +1 -0
- package/dist/tools/sql/index.d.ts +4 -0
- package/dist/tools/sql/index.d.ts.map +1 -0
- package/dist/tools/sql/index.js +2 -0
- package/dist/tools/sql/index.js.map +1 -0
- package/dist/tools/sql/sql-query-def.d.ts +22 -0
- package/dist/tools/sql/sql-query-def.d.ts.map +1 -0
- package/dist/tools/sql/sql-query-def.js +2 -0
- package/dist/tools/sql/sql-query-def.js.map +1 -0
- package/dist/tools/sql/sql-tool-factory.d.ts +28 -0
- package/dist/tools/sql/sql-tool-factory.d.ts.map +1 -0
- package/dist/tools/sql/sql-tool-factory.js +136 -0
- package/dist/tools/sql/sql-tool-factory.js.map +1 -0
- package/dist/tools/tool-executor.d.ts +67 -0
- package/dist/tools/tool-executor.d.ts.map +1 -0
- package/dist/tools/tool-executor.js +232 -0
- package/dist/tools/tool-executor.js.map +1 -0
- package/dist/utils/cache.d.ts +22 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +61 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +46 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/model-context.d.ts +14 -0
- package/dist/utils/model-context.d.ts.map +1 -0
- package/dist/utils/model-context.js +52 -0
- package/dist/utils/model-context.js.map +1 -0
- package/dist/utils/retry.d.ts +13 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +41 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/token-counter.d.ts +6 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +19 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory directory scanning — reads .md files, parses frontmatter,
|
|
3
|
+
* returns headers sorted by mtime (newest first), capped at MAX_MEMORY_FILES.
|
|
4
|
+
*/
|
|
5
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
6
|
+
import { basename, join } from 'node:path';
|
|
7
|
+
import { parseMemoryType, ENTRYPOINT_NAME, MAX_MEMORY_FILES, } from './memory-types.js';
|
|
8
|
+
const FRONTMATTER_MAX_LINES = 30;
|
|
9
|
+
/**
|
|
10
|
+
* Parse YAML frontmatter from markdown content.
|
|
11
|
+
* Handles name, description, type fields. Robust against special
|
|
12
|
+
* characters in values (colons, braces, globs, etc).
|
|
13
|
+
*/
|
|
14
|
+
export function parseFrontmatter(content) {
|
|
15
|
+
const match = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
16
|
+
if (!match?.[1])
|
|
17
|
+
return {};
|
|
18
|
+
const yaml = match[1];
|
|
19
|
+
const result = {};
|
|
20
|
+
for (const line of yaml.split('\n')) {
|
|
21
|
+
const colonIdx = line.indexOf(':');
|
|
22
|
+
if (colonIdx === -1)
|
|
23
|
+
continue;
|
|
24
|
+
const key = line.slice(0, colonIdx).trim();
|
|
25
|
+
if (key !== 'name' && key !== 'description' && key !== 'type')
|
|
26
|
+
continue;
|
|
27
|
+
let value = line.slice(colonIdx + 1).trim();
|
|
28
|
+
// Strip matching quotes (single or double)
|
|
29
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
30
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
31
|
+
value = value.slice(1, -1);
|
|
32
|
+
}
|
|
33
|
+
// Handle YAML special characters that may have been escaped
|
|
34
|
+
value = value.replace(/\\"/g, '"').replace(/\\'/g, "'");
|
|
35
|
+
if (key === 'name')
|
|
36
|
+
result.name = value;
|
|
37
|
+
if (key === 'description')
|
|
38
|
+
result.description = value;
|
|
39
|
+
if (key === 'type')
|
|
40
|
+
result.type = value;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Scan a memory directory for .md files, read their frontmatter, and return
|
|
46
|
+
* a header list sorted newest-first (capped at MAX_MEMORY_FILES).
|
|
47
|
+
*/
|
|
48
|
+
export async function scanMemoryFiles(memoryDir, signal) {
|
|
49
|
+
try {
|
|
50
|
+
const entries = await readdir(memoryDir, { recursive: true });
|
|
51
|
+
const mdFiles = entries.filter(f => f.endsWith('.md')
|
|
52
|
+
&& basename(f) !== ENTRYPOINT_NAME
|
|
53
|
+
&& !f.startsWith('threads/') && !f.startsWith('threads\\'));
|
|
54
|
+
const headerResults = await Promise.allSettled(mdFiles.map(async (relativePath) => {
|
|
55
|
+
if (signal?.aborted)
|
|
56
|
+
throw new Error('Aborted');
|
|
57
|
+
const filePath = join(memoryDir, relativePath);
|
|
58
|
+
const [fileContent, fileStat] = await Promise.all([
|
|
59
|
+
readFile(filePath, 'utf-8'),
|
|
60
|
+
stat(filePath),
|
|
61
|
+
]);
|
|
62
|
+
// Only parse first N lines for frontmatter
|
|
63
|
+
const lines = fileContent.split('\n').slice(0, FRONTMATTER_MAX_LINES);
|
|
64
|
+
const frontmatter = parseFrontmatter(lines.join('\n'));
|
|
65
|
+
return {
|
|
66
|
+
filename: relativePath,
|
|
67
|
+
filePath,
|
|
68
|
+
mtimeMs: fileStat.mtimeMs,
|
|
69
|
+
name: frontmatter.name ?? null,
|
|
70
|
+
description: frontmatter.description ?? null,
|
|
71
|
+
type: parseMemoryType(frontmatter.type),
|
|
72
|
+
};
|
|
73
|
+
}));
|
|
74
|
+
return headerResults
|
|
75
|
+
.filter((r) => r.status === 'fulfilled')
|
|
76
|
+
.map(r => r.value)
|
|
77
|
+
.sort((a, b) => b.mtimeMs - a.mtimeMs)
|
|
78
|
+
.slice(0, MAX_MEMORY_FILES);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Format memory headers as a text manifest: one line per file with
|
|
86
|
+
* [type] filename (timestamp): description.
|
|
87
|
+
*/
|
|
88
|
+
export function formatMemoryManifest(memories) {
|
|
89
|
+
return memories
|
|
90
|
+
.map(m => {
|
|
91
|
+
const tag = m.type ? `[${m.type}] ` : '';
|
|
92
|
+
const ts = new Date(m.mtimeMs).toISOString();
|
|
93
|
+
return m.description
|
|
94
|
+
? `- ${tag}${m.filename} (${ts}): ${m.description}`
|
|
95
|
+
: `- ${tag}${m.filename} (${ts})`;
|
|
96
|
+
})
|
|
97
|
+
.join('\n');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=memory-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-scanner.js","sourceRoot":"","sources":["../../src/memory/memory-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory tools for the forked extraction agent.
|
|
3
|
+
*
|
|
4
|
+
* These tools give the extraction subagent the ability to read, write,
|
|
5
|
+
* edit, and delete memory files — just like old_src's forked agent had
|
|
6
|
+
* FileRead/FileEdit/FileWrite restricted to the memory directory.
|
|
7
|
+
*
|
|
8
|
+
* All tools are path-constrained: they only operate within the resolved
|
|
9
|
+
* memory directory (global or thread-scoped).
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentTool } from '../contracts/entities/agent-tool.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create memory tools scoped to a specific directory (global or thread).
|
|
14
|
+
*/
|
|
15
|
+
export declare function createMemoryTools(memoryDir: string, threadId?: string): AgentTool[];
|
|
16
|
+
//# sourceMappingURL=memory-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.d.ts","sourceRoot":"","sources":["../../src/memory/memory-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AA4BrE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAyInF"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory tools for the forked extraction agent.
|
|
3
|
+
*
|
|
4
|
+
* These tools give the extraction subagent the ability to read, write,
|
|
5
|
+
* edit, and delete memory files — just like old_src's forked agent had
|
|
6
|
+
* FileRead/FileEdit/FileWrite restricted to the memory directory.
|
|
7
|
+
*
|
|
8
|
+
* All tools are path-constrained: they only operate within the resolved
|
|
9
|
+
* memory directory (global or thread-scoped).
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { readFile, writeFile, unlink } from 'node:fs/promises';
|
|
13
|
+
import { join, basename } from 'node:path';
|
|
14
|
+
import { ENTRYPOINT_NAME } from './memory-types.js';
|
|
15
|
+
import { scanMemoryFiles, formatMemoryManifest, parseFrontmatter } from './memory-scanner.js';
|
|
16
|
+
import { sanitizeFilename } from './memory-paths.js';
|
|
17
|
+
const THREADS_DIR = 'threads';
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the effective directory for memory operations.
|
|
20
|
+
*/
|
|
21
|
+
function resolveDir(memoryDir, threadId) {
|
|
22
|
+
if (!threadId)
|
|
23
|
+
return memoryDir;
|
|
24
|
+
return join(memoryDir, THREADS_DIR, threadId);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validate a filename: must be .md, not MEMORY.md, no path traversal.
|
|
28
|
+
*/
|
|
29
|
+
function validateFilename(filename) {
|
|
30
|
+
if (!filename || filename.includes('\0'))
|
|
31
|
+
return 'Invalid filename';
|
|
32
|
+
if (filename.includes('/') || filename.includes('\\') || filename.includes('..')) {
|
|
33
|
+
return 'Path traversal not allowed';
|
|
34
|
+
}
|
|
35
|
+
if (basename(filename) === ENTRYPOINT_NAME)
|
|
36
|
+
return 'Cannot access MEMORY.md directly — it is managed automatically';
|
|
37
|
+
if (!filename.endsWith('.md'))
|
|
38
|
+
return 'Filename must end with .md';
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create memory tools scoped to a specific directory (global or thread).
|
|
43
|
+
*/
|
|
44
|
+
export function createMemoryTools(memoryDir, threadId) {
|
|
45
|
+
const dir = resolveDir(memoryDir, threadId);
|
|
46
|
+
const memoryList = {
|
|
47
|
+
name: 'memory_list',
|
|
48
|
+
description: 'List all existing memory files with their name, type, description, and last modified date. Use this FIRST to see what memories already exist before creating new ones.',
|
|
49
|
+
parameters: z.object({}),
|
|
50
|
+
isConcurrencySafe: true,
|
|
51
|
+
isReadOnly: true,
|
|
52
|
+
execute: async () => {
|
|
53
|
+
const memories = await scanMemoryFiles(dir);
|
|
54
|
+
if (memories.length === 0)
|
|
55
|
+
return 'No memory files found.';
|
|
56
|
+
return formatMemoryManifest(memories);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const memoryRead = {
|
|
60
|
+
name: 'memory_read',
|
|
61
|
+
description: 'Read the full content of a memory file by filename. Use this to check existing memory content before deciding to update or skip.',
|
|
62
|
+
parameters: z.object({
|
|
63
|
+
filename: z.string().describe('The filename to read (e.g. "user-role.md")'),
|
|
64
|
+
}),
|
|
65
|
+
isConcurrencySafe: true,
|
|
66
|
+
isReadOnly: true,
|
|
67
|
+
execute: async (rawArgs) => {
|
|
68
|
+
const { filename } = rawArgs;
|
|
69
|
+
const err = validateFilename(filename);
|
|
70
|
+
if (err)
|
|
71
|
+
return { content: err, isError: true };
|
|
72
|
+
try {
|
|
73
|
+
const content = await readFile(join(dir, filename), 'utf-8');
|
|
74
|
+
return content;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return { content: `File not found: ${filename}`, isError: true };
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
const memoryWrite = {
|
|
82
|
+
name: 'memory_write',
|
|
83
|
+
description: 'Create a NEW memory file. Only use this when no existing memory covers this topic — otherwise use memory_edit to update the existing file.',
|
|
84
|
+
parameters: z.object({
|
|
85
|
+
name: z.string().describe('Short name for the memory (2-4 words)'),
|
|
86
|
+
description: z.string().describe('One-line description for indexing'),
|
|
87
|
+
type: z.enum(['user', 'feedback', 'project', 'reference']).describe('Memory type'),
|
|
88
|
+
content: z.string().describe('The memory content (markdown)'),
|
|
89
|
+
}),
|
|
90
|
+
execute: async (rawArgs) => {
|
|
91
|
+
const args = rawArgs;
|
|
92
|
+
const filename = sanitizeFilename(args.name);
|
|
93
|
+
const fileContent = [
|
|
94
|
+
'---',
|
|
95
|
+
`name: ${args.name}`,
|
|
96
|
+
`description: ${args.description}`,
|
|
97
|
+
`type: ${args.type}`,
|
|
98
|
+
'---',
|
|
99
|
+
'',
|
|
100
|
+
args.content,
|
|
101
|
+
'',
|
|
102
|
+
].join('\n');
|
|
103
|
+
await writeFile(join(dir, filename), fileContent, 'utf-8');
|
|
104
|
+
await addToIndex(dir, filename, args.description);
|
|
105
|
+
return `Memory saved: ${filename}`;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const memoryEdit = {
|
|
109
|
+
name: 'memory_edit',
|
|
110
|
+
description: 'Update an existing memory file. Preserves the filename and type. Use this instead of memory_write when the memory already exists.',
|
|
111
|
+
parameters: z.object({
|
|
112
|
+
filename: z.string().describe('The filename to edit (e.g. "user-role.md")'),
|
|
113
|
+
content: z.string().describe('The new content (replaces existing body)'),
|
|
114
|
+
name: z.string().optional().describe('Updated name (optional)'),
|
|
115
|
+
description: z.string().optional().describe('Updated description (optional)'),
|
|
116
|
+
}),
|
|
117
|
+
execute: async (rawArgs) => {
|
|
118
|
+
const args = rawArgs;
|
|
119
|
+
const err = validateFilename(args.filename);
|
|
120
|
+
if (err)
|
|
121
|
+
return { content: err, isError: true };
|
|
122
|
+
const filePath = join(dir, args.filename);
|
|
123
|
+
// Read existing to preserve frontmatter fields
|
|
124
|
+
let existingContent;
|
|
125
|
+
try {
|
|
126
|
+
existingContent = await readFile(filePath, 'utf-8');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return { content: `File not found: ${args.filename}`, isError: true };
|
|
130
|
+
}
|
|
131
|
+
const frontmatter = parseFrontmatter(existingContent);
|
|
132
|
+
const name = args.name ?? frontmatter.name ?? args.filename.replace('.md', '');
|
|
133
|
+
const description = args.description ?? frontmatter.description ?? '';
|
|
134
|
+
const type = frontmatter.type ?? 'user';
|
|
135
|
+
const fileContent = [
|
|
136
|
+
'---',
|
|
137
|
+
`name: ${name}`,
|
|
138
|
+
`description: ${description}`,
|
|
139
|
+
`type: ${type}`,
|
|
140
|
+
'---',
|
|
141
|
+
'',
|
|
142
|
+
args.content,
|
|
143
|
+
'',
|
|
144
|
+
].join('\n');
|
|
145
|
+
await writeFile(filePath, fileContent, 'utf-8');
|
|
146
|
+
return `Memory updated: ${args.filename}`;
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
const memoryDelete = {
|
|
150
|
+
name: 'memory_delete',
|
|
151
|
+
description: 'Delete a memory file and remove it from the index. Use when a memory is outdated or wrong.',
|
|
152
|
+
parameters: z.object({
|
|
153
|
+
filename: z.string().describe('The filename to delete (e.g. "old-info.md")'),
|
|
154
|
+
}),
|
|
155
|
+
isDestructive: true,
|
|
156
|
+
execute: async (rawArgs) => {
|
|
157
|
+
const { filename } = rawArgs;
|
|
158
|
+
const err = validateFilename(filename);
|
|
159
|
+
if (err)
|
|
160
|
+
return { content: err, isError: true };
|
|
161
|
+
try {
|
|
162
|
+
await unlink(join(dir, filename));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return { content: `File not found: ${filename}`, isError: true };
|
|
166
|
+
}
|
|
167
|
+
await removeFromIndex(dir, filename);
|
|
168
|
+
return `Memory deleted: ${filename}`;
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
return [memoryList, memoryRead, memoryWrite, memoryEdit, memoryDelete];
|
|
172
|
+
}
|
|
173
|
+
// --- Index helpers (mirror FileMemorySystem's private methods) ---
|
|
174
|
+
async function addToIndex(dir, filename, description) {
|
|
175
|
+
const entrypoint = join(dir, ENTRYPOINT_NAME);
|
|
176
|
+
let existing = '';
|
|
177
|
+
try {
|
|
178
|
+
existing = await readFile(entrypoint, 'utf-8');
|
|
179
|
+
}
|
|
180
|
+
catch { /* File doesn't exist yet */ }
|
|
181
|
+
if (existing.includes(`(${filename})`))
|
|
182
|
+
return;
|
|
183
|
+
const newEntry = `- [${description}](${filename}) — ${description}`;
|
|
184
|
+
const updated = existing ? `${existing.trimEnd()}\n${newEntry}\n` : `${newEntry}\n`;
|
|
185
|
+
await writeFile(entrypoint, updated, 'utf-8');
|
|
186
|
+
}
|
|
187
|
+
async function removeFromIndex(dir, filename) {
|
|
188
|
+
const entrypoint = join(dir, ENTRYPOINT_NAME);
|
|
189
|
+
try {
|
|
190
|
+
const content = await readFile(entrypoint, 'utf-8');
|
|
191
|
+
const lines = content.split('\n').filter(line => !line.includes(`(${filename})`));
|
|
192
|
+
await writeFile(entrypoint, lines.join('\n'), 'utf-8');
|
|
193
|
+
}
|
|
194
|
+
catch { /* Index doesn't exist */ }
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=memory-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/memory/memory-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory type taxonomy — file-based memory system.
|
|
3
|
+
*
|
|
4
|
+
* Memories are constrained to four types capturing context NOT derivable
|
|
5
|
+
* from the current project state. Code patterns, architecture, git history,
|
|
6
|
+
* and file structure are derivable (via grep/git) and should NOT be saved.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MEMORY_TYPES: readonly ["user", "feedback", "project", "reference"];
|
|
9
|
+
export type MemoryType = (typeof MEMORY_TYPES)[number];
|
|
10
|
+
/**
|
|
11
|
+
* Parse a raw frontmatter value into a MemoryType.
|
|
12
|
+
* Invalid or missing values return undefined — legacy files without a
|
|
13
|
+
* `type:` field keep working, files with unknown types degrade gracefully.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseMemoryType(raw: unknown): MemoryType | undefined;
|
|
16
|
+
/** Header from scanning a memory file (frontmatter only, no body) */
|
|
17
|
+
export interface MemoryHeader {
|
|
18
|
+
filename: string;
|
|
19
|
+
filePath: string;
|
|
20
|
+
mtimeMs: number;
|
|
21
|
+
name: string | null;
|
|
22
|
+
description: string | null;
|
|
23
|
+
type: MemoryType | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Full memory file including body content */
|
|
26
|
+
export interface MemoryFile extends MemoryHeader {
|
|
27
|
+
content: string;
|
|
28
|
+
}
|
|
29
|
+
/** Frontmatter fields for a memory file */
|
|
30
|
+
export interface MemoryFrontmatter {
|
|
31
|
+
name?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
type?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Input for saving a new memory */
|
|
36
|
+
export interface SaveMemoryInput {
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
type: MemoryType;
|
|
40
|
+
content: string;
|
|
41
|
+
}
|
|
42
|
+
/** Constants */
|
|
43
|
+
export declare const ENTRYPOINT_NAME = "MEMORY.md";
|
|
44
|
+
export declare const MAX_MEMORY_FILES = 200;
|
|
45
|
+
export declare const MAX_ENTRYPOINT_LINES = 200;
|
|
46
|
+
export declare const MAX_ENTRYPOINT_BYTES = 25000;
|
|
47
|
+
//# sourceMappingURL=memory-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-types.d.ts","sourceRoot":"","sources":["../../src/memory/memory-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,YAAY,uDAAwD,CAAC;AAElF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAGpE;AAED,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;CAC9B;AAED,8CAA8C;AAC9C,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gBAAgB;AAChB,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,oBAAoB,QAAS,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory type taxonomy — file-based memory system.
|
|
3
|
+
*
|
|
4
|
+
* Memories are constrained to four types capturing context NOT derivable
|
|
5
|
+
* from the current project state. Code patterns, architecture, git history,
|
|
6
|
+
* and file structure are derivable (via grep/git) and should NOT be saved.
|
|
7
|
+
*/
|
|
8
|
+
export const MEMORY_TYPES = ['user', 'feedback', 'project', 'reference'];
|
|
9
|
+
/**
|
|
10
|
+
* Parse a raw frontmatter value into a MemoryType.
|
|
11
|
+
* Invalid or missing values return undefined — legacy files without a
|
|
12
|
+
* `type:` field keep working, files with unknown types degrade gracefully.
|
|
13
|
+
*/
|
|
14
|
+
export function parseMemoryType(raw) {
|
|
15
|
+
if (typeof raw !== 'string')
|
|
16
|
+
return undefined;
|
|
17
|
+
return MEMORY_TYPES.find(t => t === raw);
|
|
18
|
+
}
|
|
19
|
+
/** Constants */
|
|
20
|
+
export const ENTRYPOINT_NAME = 'MEMORY.md';
|
|
21
|
+
export const MAX_MEMORY_FILES = 200;
|
|
22
|
+
export const MAX_ENTRYPOINT_LINES = 200;
|
|
23
|
+
export const MAX_ENTRYPOINT_BYTES = 25_000;
|
|
24
|
+
//# sourceMappingURL=memory-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-types.js","sourceRoot":"","sources":["../../src/memory/memory-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAU,CAAC;AAIlF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAC3C,CAAC;AAgCD,gBAAgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Argument substitution engine for skill prompts.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - $argName → positional argument value (based on argNames array)
|
|
6
|
+
* - ${VARIABLE} → variable from the variables map
|
|
7
|
+
* - Unmatched placeholders are left as-is (no silent removal)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Split raw argument string into positional tokens.
|
|
11
|
+
* Respects quoted strings (single and double quotes).
|
|
12
|
+
*/
|
|
13
|
+
export declare function splitArgs(raw: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Substitute argument placeholders in skill content.
|
|
16
|
+
*
|
|
17
|
+
* @param content — the skill prompt template
|
|
18
|
+
* @param rawArgs — raw argument string from user (e.g. "file.ts production")
|
|
19
|
+
* @param argNames — named placeholders (e.g. ["file", "env"])
|
|
20
|
+
* @param variables — additional variables (e.g. { SKILL_DIR: "/path", THREAD_ID: "t1" })
|
|
21
|
+
*/
|
|
22
|
+
export declare function substituteArgs(content: string, rawArgs: string, argNames?: string[], variables?: Record<string, string>): string;
|
|
23
|
+
//# sourceMappingURL=skill-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-args.d.ts","sourceRoot":"","sources":["../../src/skills/skill-args.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB/C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,MAAM,CA0BR"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Argument substitution engine for skill prompts.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - $argName → positional argument value (based on argNames array)
|
|
6
|
+
* - ${VARIABLE} → variable from the variables map
|
|
7
|
+
* - Unmatched placeholders are left as-is (no silent removal)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Split raw argument string into positional tokens.
|
|
11
|
+
* Respects quoted strings (single and double quotes).
|
|
12
|
+
*/
|
|
13
|
+
export function splitArgs(raw) {
|
|
14
|
+
const tokens = [];
|
|
15
|
+
let current = '';
|
|
16
|
+
let inQuote = null;
|
|
17
|
+
for (const ch of raw) {
|
|
18
|
+
if (inQuote) {
|
|
19
|
+
if (ch === inQuote) {
|
|
20
|
+
inQuote = null;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
current += ch;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (ch === '"' || ch === "'") {
|
|
27
|
+
inQuote = ch;
|
|
28
|
+
}
|
|
29
|
+
else if (ch === ' ' || ch === '\t') {
|
|
30
|
+
if (current) {
|
|
31
|
+
tokens.push(current);
|
|
32
|
+
current = '';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
current += ch;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (current)
|
|
40
|
+
tokens.push(current);
|
|
41
|
+
return tokens;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Substitute argument placeholders in skill content.
|
|
45
|
+
*
|
|
46
|
+
* @param content — the skill prompt template
|
|
47
|
+
* @param rawArgs — raw argument string from user (e.g. "file.ts production")
|
|
48
|
+
* @param argNames — named placeholders (e.g. ["file", "env"])
|
|
49
|
+
* @param variables — additional variables (e.g. { SKILL_DIR: "/path", THREAD_ID: "t1" })
|
|
50
|
+
*/
|
|
51
|
+
export function substituteArgs(content, rawArgs, argNames, variables) {
|
|
52
|
+
let result = content;
|
|
53
|
+
// 1. Named positional arguments: $argName
|
|
54
|
+
if (argNames && argNames.length > 0) {
|
|
55
|
+
const tokens = splitArgs(rawArgs);
|
|
56
|
+
for (let i = 0; i < argNames.length; i++) {
|
|
57
|
+
const name = argNames[i];
|
|
58
|
+
const value = tokens[i] ?? '';
|
|
59
|
+
// Replace $argName (word boundary aware — don't replace $argNameExtra)
|
|
60
|
+
result = result.replace(new RegExp(`\\$${name}(?![a-zA-Z0-9_])`, 'g'), value);
|
|
61
|
+
}
|
|
62
|
+
// Also make remaining args available as $ARGS (everything after named args)
|
|
63
|
+
const remaining = tokens.slice(argNames.length).join(' ');
|
|
64
|
+
result = result.replace(/\$ARGS(?![a-zA-Z0-9_])/g, remaining);
|
|
65
|
+
}
|
|
66
|
+
// 2. Variable substitution: ${VARIABLE}
|
|
67
|
+
if (variables) {
|
|
68
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
69
|
+
result = result.replace(new RegExp(`\\$\\{${escapeRegex(key)}\\}`, 'g'), value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
function escapeRegex(s) {
|
|
75
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=skill-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-args.js","sourceRoot":"","sources":["../../src/skills/skill-args.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,GAAkB,IAAI,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,OAAe,EACf,QAAmB,EACnB,SAAkC;IAElC,IAAI,MAAM,GAAG,OAAO,CAAC;IAErB,0CAA0C;IAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9B,uEAAuE;YACvE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,kBAAkB,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;QAED,4EAA4E;QAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,wCAAwC;IACxC,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal glob matcher — supports *, **, and ? patterns.
|
|
3
|
+
* No external dependencies. Converts globs to regex internally.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert a glob pattern to a RegExp.
|
|
7
|
+
*
|
|
8
|
+
* Supported syntax:
|
|
9
|
+
* - `*` matches any characters except `/`
|
|
10
|
+
* - `**` matches any characters including `/` (recursive)
|
|
11
|
+
* - `?` matches exactly one character except `/`
|
|
12
|
+
* - All other characters are escaped for literal matching.
|
|
13
|
+
*/
|
|
14
|
+
export declare function globToRegex(pattern: string): RegExp;
|
|
15
|
+
/**
|
|
16
|
+
* Test if a file path matches a glob pattern.
|
|
17
|
+
* Both pattern and path use forward slashes.
|
|
18
|
+
*/
|
|
19
|
+
export declare function matchGlob(pattern: string, filePath: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Test if a file path matches any of the given glob patterns.
|
|
22
|
+
*/
|
|
23
|
+
export declare function matchAnyGlob(patterns: string[], filePath: string): boolean;
|
|
24
|
+
//# sourceMappingURL=skill-glob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-glob.d.ts","sourceRoot":"","sources":["../../src/skills/skill-glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8BnD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal glob matcher — supports *, **, and ? patterns.
|
|
3
|
+
* No external dependencies. Converts globs to regex internally.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert a glob pattern to a RegExp.
|
|
7
|
+
*
|
|
8
|
+
* Supported syntax:
|
|
9
|
+
* - `*` matches any characters except `/`
|
|
10
|
+
* - `**` matches any characters including `/` (recursive)
|
|
11
|
+
* - `?` matches exactly one character except `/`
|
|
12
|
+
* - All other characters are escaped for literal matching.
|
|
13
|
+
*/
|
|
14
|
+
export function globToRegex(pattern) {
|
|
15
|
+
let regex = '';
|
|
16
|
+
let i = 0;
|
|
17
|
+
while (i < pattern.length) {
|
|
18
|
+
const ch = pattern[i];
|
|
19
|
+
if (ch === '*') {
|
|
20
|
+
if (pattern[i + 1] === '*') {
|
|
21
|
+
// ** — match anything including path separators
|
|
22
|
+
// Skip optional trailing /
|
|
23
|
+
i += 2;
|
|
24
|
+
if (pattern[i] === '/')
|
|
25
|
+
i++;
|
|
26
|
+
regex += '.*';
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// * — match anything except /
|
|
30
|
+
regex += '[^/]*';
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (ch === '?') {
|
|
35
|
+
regex += '[^/]';
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Escape regex special characters
|
|
40
|
+
regex += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
41
|
+
i++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return new RegExp(`^${regex}$`);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Test if a file path matches a glob pattern.
|
|
48
|
+
* Both pattern and path use forward slashes.
|
|
49
|
+
*/
|
|
50
|
+
export function matchGlob(pattern, filePath) {
|
|
51
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
52
|
+
return globToRegex(pattern).test(normalized);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Test if a file path matches any of the given glob patterns.
|
|
56
|
+
*/
|
|
57
|
+
export function matchAnyGlob(patterns, filePath) {
|
|
58
|
+
return patterns.some(p => matchGlob(p, filePath));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=skill-glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-glob.js","sourceRoot":"","sources":["../../src/skills/skill-glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAEvB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3B,gDAAgD;gBAChD,2BAA2B;gBAC3B,CAAC,IAAI,CAAC,CAAC;gBACP,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,CAAC,EAAE,CAAC;gBAC5B,KAAK,IAAI,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,8BAA8B;gBAC9B,KAAK,IAAI,OAAO,CAAC;gBACjB,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,IAAI,MAAM,CAAC;YAChB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,QAAgB;IACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,QAAgB;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC"}
|