skyloom 1.4.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/.github/workflows/ci.yml +36 -0
- package/CONVERSION_PLAN.md +191 -0
- package/README.md +67 -0
- package/dist/agents/dew.d.ts +15 -0
- package/dist/agents/dew.d.ts.map +1 -0
- package/dist/agents/dew.js +74 -0
- package/dist/agents/dew.js.map +1 -0
- package/dist/agents/fair.d.ts +15 -0
- package/dist/agents/fair.d.ts.map +1 -0
- package/dist/agents/fair.js +106 -0
- package/dist/agents/fair.js.map +1 -0
- package/dist/agents/fog.d.ts +15 -0
- package/dist/agents/fog.d.ts.map +1 -0
- package/dist/agents/fog.js +52 -0
- package/dist/agents/fog.js.map +1 -0
- package/dist/agents/frost.d.ts +15 -0
- package/dist/agents/frost.d.ts.map +1 -0
- package/dist/agents/frost.js +54 -0
- package/dist/agents/frost.js.map +1 -0
- package/dist/agents/rain.d.ts +15 -0
- package/dist/agents/rain.d.ts.map +1 -0
- package/dist/agents/rain.js +54 -0
- package/dist/agents/rain.js.map +1 -0
- package/dist/agents/snow.d.ts +27 -0
- package/dist/agents/snow.d.ts.map +1 -0
- package/dist/agents/snow.js +226 -0
- package/dist/agents/snow.js.map +1 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +402 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mode.d.ts +17 -0
- package/dist/cli/mode.d.ts.map +1 -0
- package/dist/cli/mode.js +56 -0
- package/dist/cli/mode.js.map +1 -0
- package/dist/core/agent.d.ts +174 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1332 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agent_helpers.d.ts +51 -0
- package/dist/core/agent_helpers.d.ts.map +1 -0
- package/dist/core/agent_helpers.js +477 -0
- package/dist/core/agent_helpers.js.map +1 -0
- package/dist/core/bus.d.ts +99 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +191 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/cache.d.ts +63 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +121 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/checkpoint.d.ts +19 -0
- package/dist/core/checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint.js +120 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/circuit_breaker.d.ts +46 -0
- package/dist/core/circuit_breaker.d.ts.map +1 -0
- package/dist/core/circuit_breaker.js +99 -0
- package/dist/core/circuit_breaker.js.map +1 -0
- package/dist/core/config.d.ts +97 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +281 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +78 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +84 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/factory.d.ts +63 -0
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +537 -0
- package/dist/core/factory.js.map +1 -0
- package/dist/core/icons.d.ts +28 -0
- package/dist/core/icons.d.ts.map +1 -0
- package/dist/core/icons.js +86 -0
- package/dist/core/icons.js.map +1 -0
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +54 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/llm.d.ts +121 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +532 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/logger.d.ts +57 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +122 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp.d.ts +190 -0
- package/dist/core/mcp.d.ts.map +1 -0
- package/dist/core/mcp.js +822 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/mcp_server.d.ts +26 -0
- package/dist/core/mcp_server.d.ts.map +1 -0
- package/dist/core/mcp_server.js +211 -0
- package/dist/core/mcp_server.js.map +1 -0
- package/dist/core/memory.d.ts +190 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +988 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/middleware.d.ts +114 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +248 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/pipelines.d.ts +87 -0
- package/dist/core/pipelines.d.ts.map +1 -0
- package/dist/core/pipelines.js +301 -0
- package/dist/core/pipelines.js.map +1 -0
- package/dist/core/profile.d.ts +23 -0
- package/dist/core/profile.d.ts.map +1 -0
- package/dist/core/profile.js +289 -0
- package/dist/core/profile.js.map +1 -0
- package/dist/core/router.d.ts +24 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +111 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/schemas.d.ts +82 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +200 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/semantic.d.ts +92 -0
- package/dist/core/semantic.d.ts.map +1 -0
- package/dist/core/semantic.js +175 -0
- package/dist/core/semantic.js.map +1 -0
- package/dist/core/skill.d.ts +68 -0
- package/dist/core/skill.d.ts.map +1 -0
- package/dist/core/skill.js +350 -0
- package/dist/core/skill.js.map +1 -0
- package/dist/core/tool.d.ts +99 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +341 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/tool_router.d.ts +29 -0
- package/dist/core/tool_router.d.ts.map +1 -0
- package/dist/core/tool_router.js +172 -0
- package/dist/core/tool_router.js.map +1 -0
- package/dist/core/workspace.d.ts +48 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +179 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/plugins/loader.d.ts +17 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +96 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/skills/loader.d.ts +9 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +78 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/tools/builtin.d.ts +10 -0
- package/dist/tools/builtin.d.ts.map +1 -0
- package/dist/tools/builtin.js +414 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/computer.d.ts +12 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +326 -0
- package/dist/tools/computer.js.map +1 -0
- package/dist/tools/delegate.d.ts +10 -0
- package/dist/tools/delegate.d.ts.map +1 -0
- package/dist/tools/delegate.js +45 -0
- package/dist/tools/delegate.js.map +1 -0
- package/dist/web/server.d.ts +5 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +647 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/tts.d.ts +33 -0
- package/dist/web/tts.d.ts.map +1 -0
- package/dist/web/tts.js +69 -0
- package/dist/web/tts.js.map +1 -0
- package/package.json +60 -0
- package/scripts/install.js +48 -0
- package/scripts/link.js +10 -0
- package/setup.bat +79 -0
- package/skill-test-ty2fOA/test.md +10 -0
- package/src/agents/dew.ts +70 -0
- package/src/agents/fair.ts +102 -0
- package/src/agents/fog.ts +48 -0
- package/src/agents/frost.ts +50 -0
- package/src/agents/rain.ts +50 -0
- package/src/agents/snow.ts +239 -0
- package/src/cli/main.ts +405 -0
- package/src/cli/mode.ts +58 -0
- package/src/core/agent.ts +1506 -0
- package/src/core/agent_helpers.ts +461 -0
- package/src/core/bus.ts +221 -0
- package/src/core/cache.ts +153 -0
- package/src/core/checkpoint.ts +94 -0
- package/src/core/circuit_breaker.ts +119 -0
- package/src/core/config.ts +341 -0
- package/src/core/constants.ts +95 -0
- package/src/core/factory.ts +627 -0
- package/src/core/icons.ts +53 -0
- package/src/core/index.ts +31 -0
- package/src/core/llm.ts +724 -0
- package/src/core/logger.ts +144 -0
- package/src/core/mcp.ts +953 -0
- package/src/core/mcp_server.ts +176 -0
- package/src/core/memory.ts +1169 -0
- package/src/core/middleware.ts +350 -0
- package/src/core/pipelines.ts +424 -0
- package/src/core/profile.ts +255 -0
- package/src/core/router.ts +124 -0
- package/src/core/schemas.ts +282 -0
- package/src/core/semantic.ts +211 -0
- package/src/core/skill.ts +342 -0
- package/src/core/tool.ts +427 -0
- package/src/core/tool_router.ts +193 -0
- package/src/core/workspace.ts +150 -0
- package/src/plugins/loader.ts +66 -0
- package/src/skills/loader.ts +46 -0
- package/src/sql.js.d.ts +29 -0
- package/src/tools/builtin.ts +382 -0
- package/src/tools/computer.ts +269 -0
- package/src/tools/delegate.ts +49 -0
- package/src/web/server.ts +634 -0
- package/src/web/tts.ts +93 -0
- package/tests/bus.test.ts +121 -0
- package/tests/icons.test.ts +45 -0
- package/tests/router.test.ts +86 -0
- package/tests/schemas.test.ts +51 -0
- package/tests/semantic.test.ts +83 -0
- package/tests/setup.ts +10 -0
- package/tests/skill.test.ts +172 -0
- package/tests/tool.test.ts +108 -0
- package/tests/tool_router.test.ts +71 -0
- package/tsconfig.json +37 -0
- package/vitest.config.ts +17 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pipeline templates — predefined multi-agent DAGs.
|
|
4
|
+
*
|
|
5
|
+
* Why: Snow's task-decomposition LLM call costs 2-3k tokens per orchestration.
|
|
6
|
+
* For common, recognizable workflows (code review, research-then-write, etc.),
|
|
7
|
+
* we already know the right shape — paying an LLM to re-derive it every time
|
|
8
|
+
* is pure waste. A pipeline match short-circuits Snow's planner entirely.
|
|
9
|
+
*
|
|
10
|
+
* The match function is rules-only (keyword + regex), runs in microseconds, and
|
|
11
|
+
* falls back gracefully: ``matchPipeline`` returns null when nothing fits, and
|
|
12
|
+
* ``factory.orchestrateTask`` then takes the original LLM-planning path.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.matchPipeline = matchPipeline;
|
|
16
|
+
exports.buildTasksFromPipeline = buildTasksFromPipeline;
|
|
17
|
+
exports.listPipelines = listPipelines;
|
|
18
|
+
exports.getPipelineByName = getPipelineByName;
|
|
19
|
+
exports.matchAllPipelines = matchAllPipelines;
|
|
20
|
+
exports.validateDAG = validateDAG;
|
|
21
|
+
exports.topologicalSort = topologicalSort;
|
|
22
|
+
/**
|
|
23
|
+
* Define a pipeline helper function.
|
|
24
|
+
*/
|
|
25
|
+
function createPipeline(name, triggers, steps, requireRegex) {
|
|
26
|
+
return {
|
|
27
|
+
name,
|
|
28
|
+
triggers: Object.freeze(triggers),
|
|
29
|
+
steps: Object.freeze(steps),
|
|
30
|
+
requireRegex: Object.freeze(requireRegex || []),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Helper to create pipeline steps.
|
|
35
|
+
*/
|
|
36
|
+
function createStep(id, agent, descriptionTemplate, dependsOn) {
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
id,
|
|
39
|
+
agent,
|
|
40
|
+
descriptionTemplate,
|
|
41
|
+
dependsOn: Object.freeze(dependsOn || []),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Predefined pipeline templates.
|
|
46
|
+
*/
|
|
47
|
+
const PIPELINES = Object.freeze([
|
|
48
|
+
createPipeline('code_review', ['审查代码', '代码审查', 'code review', 'review my code', '审计安全', '安全审计'], [
|
|
49
|
+
createStep('1', 'frost', '审查代码: {goal}'),
|
|
50
|
+
]),
|
|
51
|
+
createPipeline('research_then_write', ['调研后写', 'research and write', '先调研再写', 'research then write', '调研后生成', '调研并撰写'], [
|
|
52
|
+
createStep('1', 'fog', '调研: {goal}'),
|
|
53
|
+
createStep('2', 'rain', '基于第 1 步的调研结果撰写: {goal}', ['1']),
|
|
54
|
+
]),
|
|
55
|
+
createPipeline('research_review_write', ['调研审查后写', 'research review write', '先调研审查再写', '调研并审查后生成'], [
|
|
56
|
+
createStep('1', 'fog', '调研: {goal}'),
|
|
57
|
+
createStep('2', 'frost', '审查第 1 步的调研结果,确认可行性', ['1']),
|
|
58
|
+
createStep('3', 'rain', '基于第 1 步调研和第 2 步审查意见撰写: {goal}', ['2']),
|
|
59
|
+
]),
|
|
60
|
+
createPipeline('implement_and_review', ['实现并审查', '写完后审查', 'implement and review', '写代码并 review', '实现并审计'], [
|
|
61
|
+
createStep('1', 'rain', '实现: {goal}'),
|
|
62
|
+
createStep('2', 'frost', '审查第 1 步的实现', ['1']),
|
|
63
|
+
]),
|
|
64
|
+
createPipeline('fix_and_verify', ['修复并验证', 'fix and verify', '修复bug并验证', '修复后审查', 'bugfix review'], [
|
|
65
|
+
createStep('1', 'rain', '修复: {goal}'),
|
|
66
|
+
createStep('2', 'frost', '验证第 1 步的修复是否正确', ['1']),
|
|
67
|
+
]),
|
|
68
|
+
createPipeline('implement_test_deploy', ['实现测试部署', '实现并部署', '写完测试再部署', 'implement test deploy'], [
|
|
69
|
+
createStep('1', 'rain', '实现: {goal}'),
|
|
70
|
+
createStep('2', 'frost', '审查第 1 步的实现', ['1']),
|
|
71
|
+
createStep('3', 'dew', '部署第 1 步的实现', ['2']),
|
|
72
|
+
]),
|
|
73
|
+
createPipeline('design_implement_review_deploy', ['设计实现审查部署', '设计开发测试上线', 'design implement review deploy', '完整开发流程'], [
|
|
74
|
+
createStep('1', 'fog', '设计方案: {goal}'),
|
|
75
|
+
createStep('2', 'rain', '根据第 1 步的设计实现: {goal}', ['1']),
|
|
76
|
+
createStep('3', 'frost', '审查第 2 步的实现代码', ['2']),
|
|
77
|
+
createStep('4', 'dew', '部署第 2 步的实现到生产环境', ['3']),
|
|
78
|
+
]),
|
|
79
|
+
createPipeline('investigate_report', ['安全审计', 'security audit', '漏洞扫描', 'vulnerability scan', '安全检测'], [
|
|
80
|
+
createStep('1', 'fog', '安全调研: {goal}'),
|
|
81
|
+
createStep('2', 'frost', '基于第 1 步的调研生成安全报告', ['1']),
|
|
82
|
+
]),
|
|
83
|
+
createPipeline('debug_and_deploy', ['调试部署', 'debug and deploy', '修复并上线', 'hotfix deploy'], [
|
|
84
|
+
createStep('1', 'rain', '调试修复: {goal}'),
|
|
85
|
+
createStep('2', 'dew', '部署第 1 步的修复', ['1']),
|
|
86
|
+
]),
|
|
87
|
+
]);
|
|
88
|
+
/**
|
|
89
|
+
* Compiled regex cache for require_regex.
|
|
90
|
+
*/
|
|
91
|
+
const REGEX_CACHE = new Map();
|
|
92
|
+
/**
|
|
93
|
+
* Compile and cache regex patterns.
|
|
94
|
+
*/
|
|
95
|
+
function getCompiledRegex(p) {
|
|
96
|
+
const key = p.requireRegex ? p.requireRegex.join('|').hashCode() : 0;
|
|
97
|
+
if (REGEX_CACHE.has(key)) {
|
|
98
|
+
return REGEX_CACHE.get(key);
|
|
99
|
+
}
|
|
100
|
+
const compiled = p.requireRegex.map(rx => new RegExp(rx, 'i'));
|
|
101
|
+
REGEX_CACHE.set(key, compiled);
|
|
102
|
+
return compiled;
|
|
103
|
+
}
|
|
104
|
+
String.prototype.hashCode = function () {
|
|
105
|
+
let hash = 0;
|
|
106
|
+
if (this.length === 0)
|
|
107
|
+
return hash;
|
|
108
|
+
for (let i = 0; i < this.length; i++) {
|
|
109
|
+
const char = this.charCodeAt(i);
|
|
110
|
+
hash = (hash << 5) - hash + char;
|
|
111
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
112
|
+
}
|
|
113
|
+
return Math.abs(hash);
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Match a goal string to a pipeline.
|
|
117
|
+
*
|
|
118
|
+
* Matching is case-insensitive substring + optional regex. Fast (~10us).
|
|
119
|
+
* Returns the first matching pipeline, or null if no match.
|
|
120
|
+
*/
|
|
121
|
+
function matchPipeline(goal) {
|
|
122
|
+
if (!goal) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const lower = goal.toLowerCase();
|
|
126
|
+
for (const p of PIPELINES) {
|
|
127
|
+
// Check triggers
|
|
128
|
+
if (!p.triggers.some(tok => lower.includes(tok.toLowerCase()))) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Check regex if required
|
|
132
|
+
if (p.requireRegex.length > 0) {
|
|
133
|
+
const regexes = getCompiledRegex(p);
|
|
134
|
+
if (!regexes.some(rx => rx.test(lower))) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return p;
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Materialize a pipeline into runtime Task objects (full DAG).
|
|
144
|
+
*/
|
|
145
|
+
function buildTasksFromPipeline(pipeline, goal) {
|
|
146
|
+
const tasks = [];
|
|
147
|
+
for (const step of pipeline.steps) {
|
|
148
|
+
const description = step.descriptionTemplate.replace('{goal}', goal);
|
|
149
|
+
const depends = Array.from(step.dependsOn);
|
|
150
|
+
const parentId = depends.length > 0 ? depends[0] : null;
|
|
151
|
+
tasks.push({
|
|
152
|
+
id: step.id,
|
|
153
|
+
description,
|
|
154
|
+
assignedTo: step.agent,
|
|
155
|
+
parentId,
|
|
156
|
+
dependsOn: depends,
|
|
157
|
+
metadata: {
|
|
158
|
+
goal,
|
|
159
|
+
pipeline: pipeline.name,
|
|
160
|
+
},
|
|
161
|
+
createdAt: new Date(),
|
|
162
|
+
status: 'pending',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return tasks;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* List all available pipelines for CLI/debug introspection.
|
|
169
|
+
*/
|
|
170
|
+
function listPipelines() {
|
|
171
|
+
return PIPELINES.map(p => ({
|
|
172
|
+
name: p.name,
|
|
173
|
+
triggers: Array.from(p.triggers),
|
|
174
|
+
steps: p.steps.map(s => ({
|
|
175
|
+
id: s.id,
|
|
176
|
+
agent: s.agent,
|
|
177
|
+
dependsOn: Array.from(s.dependsOn),
|
|
178
|
+
})),
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get a pipeline by name.
|
|
183
|
+
*/
|
|
184
|
+
function getPipelineByName(name) {
|
|
185
|
+
return PIPELINES.find(p => p.name === name) || null;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get matching pipelines for a goal (all matches, not just first).
|
|
189
|
+
*/
|
|
190
|
+
function matchAllPipelines(goal) {
|
|
191
|
+
if (!goal) {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
const lower = goal.toLowerCase();
|
|
195
|
+
const matches = [];
|
|
196
|
+
for (const p of PIPELINES) {
|
|
197
|
+
if (!p.triggers.some(tok => lower.includes(tok.toLowerCase()))) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (p.requireRegex.length > 0) {
|
|
201
|
+
const regexes = getCompiledRegex(p);
|
|
202
|
+
if (!regexes.some(rx => rx.test(lower))) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
matches.push(p);
|
|
207
|
+
}
|
|
208
|
+
return matches;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Validate a DAG for cycles and missing dependencies.
|
|
212
|
+
*/
|
|
213
|
+
function validateDAG(tasks) {
|
|
214
|
+
const errors = [];
|
|
215
|
+
const taskIds = new Set(tasks.map(t => t.id));
|
|
216
|
+
// Check for missing dependencies
|
|
217
|
+
for (const task of tasks) {
|
|
218
|
+
for (const depId of task.dependsOn) {
|
|
219
|
+
if (!taskIds.has(depId)) {
|
|
220
|
+
errors.push(`Task ${task.id} depends on non-existent task ${depId}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Simple cycle detection (DFS)
|
|
225
|
+
const visited = new Set();
|
|
226
|
+
const recursionStack = new Set();
|
|
227
|
+
const hasCycle = (taskId) => {
|
|
228
|
+
visited.add(taskId);
|
|
229
|
+
recursionStack.add(taskId);
|
|
230
|
+
const task = tasks.find(t => t.id === taskId);
|
|
231
|
+
if (task) {
|
|
232
|
+
for (const depId of task.dependsOn) {
|
|
233
|
+
if (!visited.has(depId)) {
|
|
234
|
+
if (hasCycle(depId)) {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else if (recursionStack.has(depId)) {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
recursionStack.delete(taskId);
|
|
244
|
+
return false;
|
|
245
|
+
};
|
|
246
|
+
for (const task of tasks) {
|
|
247
|
+
if (!visited.has(task.id)) {
|
|
248
|
+
if (hasCycle(task.id)) {
|
|
249
|
+
errors.push(`Cycle detected involving task ${task.id}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
valid: errors.length === 0,
|
|
255
|
+
errors,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Topological sort of tasks based on dependencies.
|
|
260
|
+
*/
|
|
261
|
+
function topologicalSort(tasks) {
|
|
262
|
+
const inDegree = new Map();
|
|
263
|
+
const adjList = new Map();
|
|
264
|
+
// Initialize
|
|
265
|
+
for (const task of tasks) {
|
|
266
|
+
inDegree.set(task.id, task.dependsOn.length);
|
|
267
|
+
adjList.set(task.id, []);
|
|
268
|
+
}
|
|
269
|
+
// Build adjacency list
|
|
270
|
+
for (const task of tasks) {
|
|
271
|
+
for (const depId of task.dependsOn) {
|
|
272
|
+
if (adjList.has(depId)) {
|
|
273
|
+
adjList.get(depId).push(task.id);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Kahn's algorithm
|
|
278
|
+
const queue = [];
|
|
279
|
+
for (const [taskId, degree] of inDegree.entries()) {
|
|
280
|
+
if (degree === 0) {
|
|
281
|
+
queue.push(taskId);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const sorted = [];
|
|
285
|
+
while (queue.length > 0) {
|
|
286
|
+
const taskId = queue.shift();
|
|
287
|
+
const task = tasks.find(t => t.id === taskId);
|
|
288
|
+
if (task) {
|
|
289
|
+
sorted.push(task);
|
|
290
|
+
}
|
|
291
|
+
for (const neighbor of adjList.get(taskId) || []) {
|
|
292
|
+
const newDegree = (inDegree.get(neighbor) || 0) - 1;
|
|
293
|
+
inDegree.set(neighbor, newDegree);
|
|
294
|
+
if (newDegree === 0) {
|
|
295
|
+
queue.push(neighbor);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return sorted;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=pipelines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelines.js","sourceRoot":"","sources":["../../src/core/pipelines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local user profile (用户画像) + per-agent custom personas.
|
|
3
|
+
*
|
|
4
|
+
* Everything here lives under ~/.skyloom/ and never leaves the machine:
|
|
5
|
+
*
|
|
6
|
+
* - profile.json — a free-form dict of facts about the user.
|
|
7
|
+
* - memories.json — running narrative of moods, life events, things worth following up on.
|
|
8
|
+
* - personas/<agent>.md — optional custom role for a specific agent.
|
|
9
|
+
*/
|
|
10
|
+
export declare function setMemorySummarizer(fn: (notes: string[]) => string): void;
|
|
11
|
+
export declare function loadProfile(): Record<string, string>;
|
|
12
|
+
export declare function saveProfile(data: Record<string, string>): void;
|
|
13
|
+
export declare function setProfileField(key: string, value: string): void;
|
|
14
|
+
export declare function clearProfileField(key?: string | null): void;
|
|
15
|
+
export declare function formatProfileForPrompt(lang?: string): string;
|
|
16
|
+
export declare function loadMemories(): Record<string, any>[];
|
|
17
|
+
export declare function appendMemory(note: string): boolean;
|
|
18
|
+
export declare function clearMemories(): void;
|
|
19
|
+
export declare function formatMemoriesForPrompt(lang?: string, limit?: number): string;
|
|
20
|
+
export declare function loadPersona(agent: string): string | null;
|
|
21
|
+
export declare function savePersona(agent: string, text: string): boolean;
|
|
22
|
+
export declare function clearPersona(agent: string): void;
|
|
23
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/core/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,IAAI,CAEzE;AAgBD,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAS9D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAW3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,MAAa,GAAG,MAAM,CAclE;AAID,wBAAgB,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CASpD;AA+DD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA2BlD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,MAAa,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAYvF;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASxD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAShE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKhD"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Local user profile (用户画像) + per-agent custom personas.
|
|
4
|
+
*
|
|
5
|
+
* Everything here lives under ~/.skyloom/ and never leaves the machine:
|
|
6
|
+
*
|
|
7
|
+
* - profile.json — a free-form dict of facts about the user.
|
|
8
|
+
* - memories.json — running narrative of moods, life events, things worth following up on.
|
|
9
|
+
* - personas/<agent>.md — optional custom role for a specific agent.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.setMemorySummarizer = setMemorySummarizer;
|
|
46
|
+
exports.loadProfile = loadProfile;
|
|
47
|
+
exports.saveProfile = saveProfile;
|
|
48
|
+
exports.setProfileField = setProfileField;
|
|
49
|
+
exports.clearProfileField = clearProfileField;
|
|
50
|
+
exports.formatProfileForPrompt = formatProfileForPrompt;
|
|
51
|
+
exports.loadMemories = loadMemories;
|
|
52
|
+
exports.appendMemory = appendMemory;
|
|
53
|
+
exports.clearMemories = clearMemories;
|
|
54
|
+
exports.formatMemoriesForPrompt = formatMemoriesForPrompt;
|
|
55
|
+
exports.loadPersona = loadPersona;
|
|
56
|
+
exports.savePersona = savePersona;
|
|
57
|
+
exports.clearPersona = clearPersona;
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const path = __importStar(require("path"));
|
|
60
|
+
const config_1 = require("./config");
|
|
61
|
+
const VALID_AGENTS = new Set(config_1.AGENT_NAMES);
|
|
62
|
+
// Keep only the most recent N memories in the prompt + on disk.
|
|
63
|
+
const MEMORY_CAP = 40;
|
|
64
|
+
// When over cap, fold this many of the oldest notes into ONE digest entry.
|
|
65
|
+
const FOLD_BATCH = 8;
|
|
66
|
+
// Pluggable summarizer for memory folding.
|
|
67
|
+
let _summarizer = null;
|
|
68
|
+
function setMemorySummarizer(fn) {
|
|
69
|
+
_summarizer = fn;
|
|
70
|
+
}
|
|
71
|
+
function profilePath() {
|
|
72
|
+
return path.join(config_1.USER_CONFIG_DIR, 'profile.json');
|
|
73
|
+
}
|
|
74
|
+
function memoriesPath() {
|
|
75
|
+
return path.join(config_1.USER_CONFIG_DIR, 'memories.json');
|
|
76
|
+
}
|
|
77
|
+
function personaPath(agent) {
|
|
78
|
+
return path.join(config_1.USER_CONFIG_DIR, 'personas', `${agent}.md`);
|
|
79
|
+
}
|
|
80
|
+
// ── User profile ──
|
|
81
|
+
function loadProfile() {
|
|
82
|
+
const p = profilePath();
|
|
83
|
+
if (!fs.existsSync(p))
|
|
84
|
+
return {};
|
|
85
|
+
try {
|
|
86
|
+
const data = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
87
|
+
return typeof data === 'object' && data !== null ? data : {};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function saveProfile(data) {
|
|
94
|
+
const p = profilePath();
|
|
95
|
+
const dir = path.dirname(p);
|
|
96
|
+
if (!fs.existsSync(dir)) {
|
|
97
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
const tmp = p + '.tmp';
|
|
100
|
+
fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf-8');
|
|
101
|
+
fs.renameSync(tmp, p);
|
|
102
|
+
}
|
|
103
|
+
function setProfileField(key, value) {
|
|
104
|
+
key = (key || '').trim();
|
|
105
|
+
if (!key)
|
|
106
|
+
return;
|
|
107
|
+
const data = loadProfile();
|
|
108
|
+
data[key] = value;
|
|
109
|
+
saveProfile(data);
|
|
110
|
+
}
|
|
111
|
+
function clearProfileField(key) {
|
|
112
|
+
if (key == null) {
|
|
113
|
+
try {
|
|
114
|
+
const p = profilePath();
|
|
115
|
+
if (fs.existsSync(p))
|
|
116
|
+
fs.unlinkSync(p);
|
|
117
|
+
}
|
|
118
|
+
catch { /* ignore */ }
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const data = loadProfile();
|
|
122
|
+
delete data[key];
|
|
123
|
+
saveProfile(data);
|
|
124
|
+
}
|
|
125
|
+
function formatProfileForPrompt(lang = 'zh') {
|
|
126
|
+
const data = loadProfile();
|
|
127
|
+
const entries = Object.entries(data);
|
|
128
|
+
if (entries.length === 0)
|
|
129
|
+
return '';
|
|
130
|
+
const lines = entries.map(([k, v]) => {
|
|
131
|
+
return lang === 'en' ? `- ${k}: ${v}` : `- ${k}:${v}`;
|
|
132
|
+
});
|
|
133
|
+
const body = lines.join('\n');
|
|
134
|
+
if (lang === 'en') {
|
|
135
|
+
return '\n\n## About the user (remember this and use it naturally)\n' + body;
|
|
136
|
+
}
|
|
137
|
+
return '\n\n## 关于用户(记住,并在对话中自然运用,不要生硬复述)\n' + body;
|
|
138
|
+
}
|
|
139
|
+
// ── Emotional / narrative memory ──
|
|
140
|
+
function loadMemories() {
|
|
141
|
+
const p = memoriesPath();
|
|
142
|
+
if (!fs.existsSync(p))
|
|
143
|
+
return [];
|
|
144
|
+
try {
|
|
145
|
+
const data = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
146
|
+
return Array.isArray(data) ? data : [];
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function norm(text) {
|
|
153
|
+
return text.toLowerCase().split('').filter(c => !c.match(/\s/) && !',。,.、!!??~…「」"\',。、;:?!'.includes(c)).join('');
|
|
154
|
+
}
|
|
155
|
+
function writeMemories(items) {
|
|
156
|
+
const p = memoriesPath();
|
|
157
|
+
const dir = path.dirname(p);
|
|
158
|
+
if (!fs.existsSync(dir)) {
|
|
159
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
160
|
+
}
|
|
161
|
+
const tmp = p + '.tmp';
|
|
162
|
+
fs.writeFileSync(tmp, JSON.stringify(items, null, 2), 'utf-8');
|
|
163
|
+
fs.renameSync(tmp, p);
|
|
164
|
+
}
|
|
165
|
+
function digest(notes) {
|
|
166
|
+
const seen = [];
|
|
167
|
+
for (let n of notes) {
|
|
168
|
+
n = n.trim();
|
|
169
|
+
if (n.startsWith('早些时候:')) {
|
|
170
|
+
n = n.slice('早些时候:'.length);
|
|
171
|
+
}
|
|
172
|
+
for (const part of n.split(';')) {
|
|
173
|
+
const p = part.trim();
|
|
174
|
+
if (p && !seen.includes(p)) {
|
|
175
|
+
seen.push(p);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
let joined = seen.join(';');
|
|
180
|
+
if (joined.length > 180) {
|
|
181
|
+
joined = joined.slice(0, 179) + '…';
|
|
182
|
+
}
|
|
183
|
+
return '早些时候:' + joined;
|
|
184
|
+
}
|
|
185
|
+
function summarizeNotes(notes) {
|
|
186
|
+
if (_summarizer) {
|
|
187
|
+
try {
|
|
188
|
+
const out = _summarizer(notes);
|
|
189
|
+
if (out && out.trim())
|
|
190
|
+
return out.trim();
|
|
191
|
+
}
|
|
192
|
+
catch { /* ignore */ }
|
|
193
|
+
}
|
|
194
|
+
return digest(notes);
|
|
195
|
+
}
|
|
196
|
+
function foldOldest(items) {
|
|
197
|
+
let foldN = (items.length - MEMORY_CAP) + FOLD_BATCH;
|
|
198
|
+
foldN = Math.min(foldN, items.length - 1);
|
|
199
|
+
if (foldN <= 0)
|
|
200
|
+
return items.slice(-MEMORY_CAP);
|
|
201
|
+
const old = items.slice(0, foldN);
|
|
202
|
+
const rest = items.slice(foldN);
|
|
203
|
+
const digestEntry = {
|
|
204
|
+
ts: old[old.length - 1]?.ts || new Date().toISOString().slice(0, 10),
|
|
205
|
+
note: summarizeNotes(old.map(m => String(m.note || ''))),
|
|
206
|
+
summary: true,
|
|
207
|
+
};
|
|
208
|
+
return [digestEntry, ...rest];
|
|
209
|
+
}
|
|
210
|
+
function appendMemory(note) {
|
|
211
|
+
note = (note || '').trim();
|
|
212
|
+
if (!note)
|
|
213
|
+
return false;
|
|
214
|
+
const items = loadMemories();
|
|
215
|
+
const key = norm(note);
|
|
216
|
+
if (key) {
|
|
217
|
+
for (const m of items) {
|
|
218
|
+
if (norm(String(m.note || '')) === key) {
|
|
219
|
+
m.ts = new Date().toISOString().slice(0, 10); // refresh recency
|
|
220
|
+
if (note.length > String(m.note || '').length) {
|
|
221
|
+
m.note = note; // keep the richer phrasing
|
|
222
|
+
}
|
|
223
|
+
writeMemories(items);
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
items.push({ ts: new Date().toISOString().slice(0, 10), note });
|
|
229
|
+
if (items.length > MEMORY_CAP) {
|
|
230
|
+
writeMemories(foldOldest(items));
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
writeMemories(items);
|
|
234
|
+
}
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
function clearMemories() {
|
|
238
|
+
try {
|
|
239
|
+
const p = memoriesPath();
|
|
240
|
+
if (fs.existsSync(p))
|
|
241
|
+
fs.unlinkSync(p);
|
|
242
|
+
}
|
|
243
|
+
catch { /* ignore */ }
|
|
244
|
+
}
|
|
245
|
+
function formatMemoriesForPrompt(lang = 'zh', limit = 12) {
|
|
246
|
+
const items = loadMemories();
|
|
247
|
+
if (items.length === 0)
|
|
248
|
+
return '';
|
|
249
|
+
const recent = items.slice(-limit);
|
|
250
|
+
const lines = recent.map((m) => `- [${m.ts || ''}] ${m.note || ''}`);
|
|
251
|
+
const body = lines.join('\n');
|
|
252
|
+
if (lang === 'en') {
|
|
253
|
+
return '\n\n## What you remember about them (recent context — weave in naturally, never recite)\n' + body;
|
|
254
|
+
}
|
|
255
|
+
return '\n\n## 你记得关于 ta 的事(近期,自然带出,别生硬复述)\n' + body;
|
|
256
|
+
}
|
|
257
|
+
// ── Per-agent custom persona ──
|
|
258
|
+
function loadPersona(agent) {
|
|
259
|
+
const p = personaPath(agent);
|
|
260
|
+
if (!fs.existsSync(p))
|
|
261
|
+
return null;
|
|
262
|
+
try {
|
|
263
|
+
const text = fs.readFileSync(p, 'utf-8').trim();
|
|
264
|
+
return text || null;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function savePersona(agent, text) {
|
|
271
|
+
if (!VALID_AGENTS.has(agent))
|
|
272
|
+
return false;
|
|
273
|
+
const p = personaPath(agent);
|
|
274
|
+
const dir = path.dirname(p);
|
|
275
|
+
if (!fs.existsSync(dir)) {
|
|
276
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
277
|
+
}
|
|
278
|
+
fs.writeFileSync(p, text.trim() + '\n', 'utf-8');
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
function clearPersona(agent) {
|
|
282
|
+
try {
|
|
283
|
+
const p = personaPath(agent);
|
|
284
|
+
if (fs.existsSync(p))
|
|
285
|
+
fs.unlinkSync(p);
|
|
286
|
+
}
|
|
287
|
+
catch { /* ignore */ }
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/core/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity router: classify a user goal into direct / single / orchestrate.
|
|
3
|
+
*
|
|
4
|
+
* Rules-first (no LLM), so classification stays under 1ms. The router exists
|
|
5
|
+
* solely to keep simple goals from triggering Snow's full task-decomposition
|
|
6
|
+
* LLM call when a single agent could answer in one shot.
|
|
7
|
+
*/
|
|
8
|
+
export type Mode = 'direct' | 'single' | 'orchestrate';
|
|
9
|
+
/**
|
|
10
|
+
* Decide the execution mode for a user goal.
|
|
11
|
+
*
|
|
12
|
+
* direct: short greeting / single factual question, no tools needed.
|
|
13
|
+
* single: clear single-purpose task, one agent + tools.
|
|
14
|
+
* orchestrate: multi-step plan worth decomposing into sub-tasks.
|
|
15
|
+
*/
|
|
16
|
+
export declare function classify(goal: string): Mode;
|
|
17
|
+
/**
|
|
18
|
+
* Pick a single agent for a non-orchestrate goal, by keyword routing.
|
|
19
|
+
*
|
|
20
|
+
* Returns an agent name guaranteed to be in available, falling back to
|
|
21
|
+
* rain (generation generalist) then to any available agent.
|
|
22
|
+
*/
|
|
23
|
+
export declare function pickAgentForGoal(goal: string, available: Set<string>): string;
|
|
24
|
+
//# sourceMappingURL=router.d.ts.map
|