bobo-ai-cli 2.1.0 → 3.0.1
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 +52 -9
- package/bundled-skills/CORE_SKILLS.txt +18 -0
- package/dist/agent.js +91 -51
- package/dist/agent.js.map +1 -1
- package/dist/agents/catalog.d.ts +40 -0
- package/dist/agents/catalog.js +172 -0
- package/dist/agents/catalog.js.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/router.d.ts +43 -0
- package/dist/agents/router.js +87 -0
- package/dist/agents/router.js.map +1 -0
- package/dist/agents/spawn.d.ts +46 -0
- package/dist/agents/spawn.js +91 -0
- package/dist/agents/spawn.js.map +1 -0
- package/dist/autonomous.js +41 -1
- package/dist/autonomous.js.map +1 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +669 -0
- package/dist/cli.js.map +1 -0
- package/dist/compactor.d.ts +49 -4
- package/dist/compactor.js +164 -17
- package/dist/compactor.js.map +1 -1
- package/dist/completer.js +2 -0
- package/dist/completer.js.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/cost-tracker.js +36 -2
- package/dist/cost-tracker.js.map +1 -1
- package/dist/dream.d.ts +42 -0
- package/dist/dream.js +324 -0
- package/dist/dream.js.map +1 -0
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +7 -2
- package/dist/hooks.js.map +1 -1
- package/dist/index.js +10 -1136
- package/dist/index.js.map +1 -1
- package/dist/insight.js +4 -11
- package/dist/insight.js.map +1 -1
- package/dist/knowledge.d.ts +13 -0
- package/dist/knowledge.js +16 -4
- package/dist/knowledge.js.map +1 -1
- package/dist/mcp-client.js +59 -41
- package/dist/mcp-client.js.map +1 -1
- package/dist/memory.d.ts +4 -0
- package/dist/memory.js +30 -18
- package/dist/memory.js.map +1 -1
- package/dist/project.js +2 -1
- package/dist/project.js.map +1 -1
- package/dist/providers.js +1 -1
- package/dist/providers.js.map +1 -1
- package/dist/repl.d.ts +16 -0
- package/dist/repl.js +704 -0
- package/dist/repl.js.map +1 -0
- package/dist/sessions.js +59 -3
- package/dist/sessions.js.map +1 -1
- package/dist/skill-router.js +2 -2
- package/dist/skill-router.js.map +1 -1
- package/dist/skills/composer.d.ts +18 -0
- package/dist/skills/composer.js +59 -0
- package/dist/skills/composer.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +12 -0
- package/dist/skills/loader.js +150 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/types.d.ts +28 -0
- package/dist/skills/types.js +9 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills.d.ts +1 -0
- package/dist/skills.js +10 -8
- package/dist/skills.js.map +1 -1
- package/dist/state/artifacts.d.ts +71 -0
- package/dist/state/artifacts.js +133 -0
- package/dist/state/artifacts.js.map +1 -0
- package/dist/state/index.d.ts +9 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/manager.d.ts +89 -0
- package/dist/state/manager.js +132 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/project-memory.d.ts +24 -0
- package/dist/state/project-memory.js +83 -0
- package/dist/state/project-memory.js.map +1 -0
- package/dist/state/recovery.d.ts +24 -0
- package/dist/state/recovery.js +95 -0
- package/dist/state/recovery.js.map +1 -0
- package/dist/statusbar.d.ts +1 -0
- package/dist/statusbar.js +12 -1
- package/dist/statusbar.js.map +1 -1
- package/dist/structured/loader.js +4 -2
- package/dist/structured/loader.js.map +1 -1
- package/dist/sub-agent-runner.d.ts +1 -0
- package/dist/sub-agent-runner.js +32 -5
- package/dist/sub-agent-runner.js.map +1 -1
- package/dist/sub-agents.d.ts +19 -1
- package/dist/sub-agents.js +142 -5
- package/dist/sub-agents.js.map +1 -1
- package/dist/tool-governance.d.ts +77 -0
- package/dist/tool-governance.js +366 -0
- package/dist/tool-governance.js.map +1 -0
- package/dist/tools/advanced.js +3 -2
- package/dist/tools/advanced.js.map +1 -1
- package/dist/tools/browser.js +2 -2
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/claude-code.js +2 -2
- package/dist/tools/claude-code.js.map +1 -1
- package/dist/tools/index.js +36 -12
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/process-manager.js +2 -2
- package/dist/tools/process-manager.js.map +1 -1
- package/dist/ui/hud.d.ts +25 -0
- package/dist/ui/hud.js +67 -0
- package/dist/ui/hud.js.map +1 -0
- package/dist/verification-agent.d.ts +46 -0
- package/dist/verification-agent.js +533 -0
- package/dist/verification-agent.js.map +1 -0
- package/dist/watcher.js +2 -2
- package/dist/watcher.js.map +1 -1
- package/dist/web.js +1 -1
- package/dist/web.js.map +1 -1
- package/dist/workflows/ask.d.ts +13 -0
- package/dist/workflows/ask.js +66 -0
- package/dist/workflows/ask.js.map +1 -0
- package/dist/workflows/index.d.ts +5 -0
- package/dist/workflows/index.js +6 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/interview.d.ts +11 -0
- package/dist/workflows/interview.js +36 -0
- package/dist/workflows/interview.js.map +1 -0
- package/dist/workflows/plan.d.ts +13 -0
- package/dist/workflows/plan.js +34 -0
- package/dist/workflows/plan.js.map +1 -0
- package/dist/workflows/team.d.ts +17 -0
- package/dist/workflows/team.js +86 -0
- package/dist/workflows/team.js.map +1 -0
- package/dist/workflows/verify.d.ts +11 -0
- package/dist/workflows/verify.js +21 -0
- package/dist/workflows/verify.js.map +1 -0
- package/package.json +18 -5
- package/bundled-skills/Skill_Seekers/SKILL.md +0 -1722
- package/bundled-skills/ab-test-setup/SKILL.md +0 -557
- package/bundled-skills/adversarial-verification/SKILL.md +0 -95
- package/bundled-skills/agent-sdk-dev/SKILL.md +0 -238
- package/bundled-skills/agent-tools/SKILL.md +0 -136
- package/bundled-skills/analytics-tracking/SKILL.md +0 -597
- package/bundled-skills/artifacts-builder/SKILL.md +0 -89
- package/bundled-skills/asana/SKILL.md +0 -13
- package/bundled-skills/brand-voice/SKILL.md +0 -481
- package/bundled-skills/browser-use/SKILL.md +0 -419
- package/bundled-skills/cache-optimization-skill/SKILL.md +0 -179
- package/bundled-skills/canvas-design/SKILL.md +0 -147
- package/bundled-skills/citation-validator/SKILL.md +0 -203
- package/bundled-skills/clangd-lsp/SKILL.md +0 -52
- package/bundled-skills/code-simplifier/SKILL.md +0 -13
- package/bundled-skills/commit-commands/SKILL.md +0 -258
- package/bundled-skills/competitor-alternatives/SKILL.md +0 -795
- package/bundled-skills/content-atomizer/SKILL.md +0 -910
- package/bundled-skills/content-research-writer/SKILL.md +0 -605
- package/bundled-skills/context7/SKILL.md +0 -13
- package/bundled-skills/copy-editing/SKILL.md +0 -494
- package/bundled-skills/copywriting/SKILL.md +0 -510
- package/bundled-skills/csharp-lsp/SKILL.md +0 -40
- package/bundled-skills/decision-making-framework/SKILL.md +0 -154
- package/bundled-skills/deep-research/SKILL.md +0 -236
- package/bundled-skills/developer-growth-analysis/SKILL.md +0 -335
- package/bundled-skills/direct-response-copy/SKILL.md +0 -2336
- package/bundled-skills/docker-expert/SKILL.md +0 -229
- package/bundled-skills/document-skills/SKILL.md +0 -13
- package/bundled-skills/documentation-expert/SKILL.md +0 -126
- package/bundled-skills/email-sequence/SKILL.md +0 -1061
- package/bundled-skills/email-sequences/SKILL.md +0 -910
- package/bundled-skills/example-plugin/SKILL.md +0 -72
- package/bundled-skills/explanatory-output-style/SKILL.md +0 -82
- package/bundled-skills/feature-dev/SKILL.md +0 -458
- package/bundled-skills/file-organizer/SKILL.md +0 -466
- package/bundled-skills/firebase.disabled/SKILL.md +0 -13
- package/bundled-skills/form-cro/SKILL.md +0 -488
- package/bundled-skills/free-tool-strategy/SKILL.md +0 -636
- package/bundled-skills/frontend-design/SKILL.md +0 -41
- package/bundled-skills/frontend-design-offical/SKILL.md +0 -55
- package/bundled-skills/gitlab/SKILL.md +0 -13
- package/bundled-skills/gopls-lsp/SKILL.md +0 -32
- package/bundled-skills/got-controller/SKILL.md +0 -218
- package/bundled-skills/greptile/SKILL.md +0 -72
- package/bundled-skills/hookify/SKILL.md +0 -376
- package/bundled-skills/image-editor/SKILL.md +0 -189
- package/bundled-skills/image-enhancer/SKILL.md +0 -109
- package/bundled-skills/jdtls-lsp/SKILL.md +0 -49
- package/bundled-skills/json-canvas/SKILL.md +0 -654
- package/bundled-skills/keyword-research/SKILL.md +0 -559
- package/bundled-skills/kotlin-lsp/SKILL.md +0 -28
- package/bundled-skills/laravel-boost/SKILL.md +0 -13
- package/bundled-skills/launch-strategy/SKILL.md +0 -394
- package/bundled-skills/lead-magnet/SKILL.md +0 -393
- package/bundled-skills/learning-output-style/SKILL.md +0 -106
- package/bundled-skills/linear/SKILL.md +0 -13
- package/bundled-skills/lua-lsp/SKILL.md +0 -47
- package/bundled-skills/marketing-ideas/SKILL.md +0 -720
- package/bundled-skills/marketing-psychology/SKILL.md +0 -534
- package/bundled-skills/mcp-builder/SKILL.md +0 -369
- package/bundled-skills/meeting-insights-analyzer/SKILL.md +0 -347
- package/bundled-skills/memory-evolution-system/SKILL.md +0 -172
- package/bundled-skills/multi-lens-thinking/SKILL.md +0 -407
- package/bundled-skills/nano-banana-pro/SKILL.md +0 -116
- package/bundled-skills/newsletter/SKILL.md +0 -736
- package/bundled-skills/notebooklm/SKILL.md +0 -296
- package/bundled-skills/obsidian-bases/SKILL.md +0 -634
- package/bundled-skills/obsidian-markdown/SKILL.md +0 -651
- package/bundled-skills/onboarding-cro/SKILL.md +0 -494
- package/bundled-skills/page-cro/SKILL.md +0 -379
- package/bundled-skills/paid-ads/SKILL.md +0 -624
- package/bundled-skills/paywall-upgrade-cro/SKILL.md +0 -651
- package/bundled-skills/php-lsp/SKILL.md +0 -36
- package/bundled-skills/playwright/SKILL.md +0 -13
- package/bundled-skills/plugin-dev/SKILL.md +0 -434
- package/bundled-skills/popup-cro/SKILL.md +0 -520
- package/bundled-skills/positioning-angles/SKILL.md +0 -330
- package/bundled-skills/pr-review-toolkit/SKILL.md +0 -359
- package/bundled-skills/pricing-strategy/SKILL.md +0 -777
- package/bundled-skills/proactive-self-improving/SKILL.md +0 -435
- package/bundled-skills/programmatic-seo/SKILL.md +0 -714
- package/bundled-skills/pyright-lsp/SKILL.md +0 -43
- package/bundled-skills/quality-assurance-framework/SKILL.md +0 -168
- package/bundled-skills/question-refiner/SKILL.md +0 -160
- package/bundled-skills/ralph-loop/SKILL.md +0 -205
- package/bundled-skills/refactoring-expert/SKILL.md +0 -103
- package/bundled-skills/referral-program/SKILL.md +0 -668
- package/bundled-skills/research-executor/SKILL.md +0 -164
- package/bundled-skills/review-with-security/SKILL.md +0 -12
- package/bundled-skills/rust-analyzer-lsp/SKILL.md +0 -50
- package/bundled-skills/schema-markup/SKILL.md +0 -647
- package/bundled-skills/security-audit-expert/SKILL.md +0 -124
- package/bundled-skills/security-expert/SKILL.md +0 -140
- package/bundled-skills/security-guidance/SKILL.md +0 -13
- package/bundled-skills/seedance-prompt/SKILL.md +0 -139
- package/bundled-skills/self-evolution/SKILL.md +0 -1160
- package/bundled-skills/seo-audit/SKILL.md +0 -432
- package/bundled-skills/seo-content/SKILL.md +0 -787
- package/bundled-skills/serena/SKILL.md +0 -13
- package/bundled-skills/signup-flow-cro/SKILL.md +0 -409
- package/bundled-skills/skill-manager/SKILL.md +0 -226
- package/bundled-skills/skill-share/SKILL.md +0 -98
- package/bundled-skills/slack/SKILL.md +0 -13
- package/bundled-skills/social-content/SKILL.md +0 -878
- package/bundled-skills/spec-flow-skill/SKILL.md +0 -124
- package/bundled-skills/stripe/SKILL.md +0 -13
- package/bundled-skills/supabase/SKILL.md +0 -13
- package/bundled-skills/swift-lsp/SKILL.md +0 -40
- package/bundled-skills/synthesizer/SKILL.md +0 -236
- package/bundled-skills/template-skill/SKILL.md +0 -16
- package/bundled-skills/theme-factory/SKILL.md +0 -72
- package/bundled-skills/tiktok-research/SKILL.md +0 -208
- package/bundled-skills/typescript-lsp/SKILL.md +0 -36
- package/bundled-skills/ui-ux-pro-max/SKILL.md +0 -247
- package/bundled-skills/visual-prompt-engineer/SKILL.md +0 -102
- package/bundled-skills/webapp-testing/SKILL.md +0 -111
- package/bundled-skills/wide-research/SKILL.md +0 -191
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Memory — 项目级记忆
|
|
3
|
+
*
|
|
4
|
+
* .bobo/project-memory.json — 结构化项目记忆
|
|
5
|
+
* .bobo/notepad.md — 自由格式 scratchpad
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
const PROJECT_MEMORY_FILE = 'project-memory.json';
|
|
10
|
+
const NOTEPAD_FILE = 'notepad.md';
|
|
11
|
+
function getProjectDir() {
|
|
12
|
+
return join(process.cwd(), '.bobo');
|
|
13
|
+
}
|
|
14
|
+
function getProjectMemoryPath() {
|
|
15
|
+
return join(getProjectDir(), PROJECT_MEMORY_FILE);
|
|
16
|
+
}
|
|
17
|
+
export function readProjectMemory() {
|
|
18
|
+
const path = getProjectMemoryPath();
|
|
19
|
+
if (!existsSync(path)) {
|
|
20
|
+
return { version: 1, entries: [] };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
24
|
+
}
|
|
25
|
+
catch (_) {
|
|
26
|
+
/* intentionally ignored: project memory file missing or malformed */
|
|
27
|
+
return { version: 1, entries: [] };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function writeProjectMemory(memory) {
|
|
31
|
+
writeFileSync(getProjectMemoryPath(), JSON.stringify(memory, null, 2) + '\n', 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
export function addMemoryEntry(entry) {
|
|
34
|
+
const memory = readProjectMemory();
|
|
35
|
+
const now = new Date().toISOString();
|
|
36
|
+
const existing = memory.entries.findIndex(e => e.key === entry.key);
|
|
37
|
+
if (existing !== -1) {
|
|
38
|
+
memory.entries[existing] = { ...entry, createdAt: memory.entries[existing].createdAt, updatedAt: now };
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
memory.entries.push({ ...entry, createdAt: now, updatedAt: now });
|
|
42
|
+
}
|
|
43
|
+
writeProjectMemory(memory);
|
|
44
|
+
}
|
|
45
|
+
export function queryMemory(category, keyword) {
|
|
46
|
+
const memory = readProjectMemory();
|
|
47
|
+
let results = memory.entries;
|
|
48
|
+
if (category) {
|
|
49
|
+
results = results.filter(e => e.category === category);
|
|
50
|
+
}
|
|
51
|
+
if (keyword) {
|
|
52
|
+
const lower = keyword.toLowerCase();
|
|
53
|
+
results = results.filter(e => e.key.toLowerCase().includes(lower) ||
|
|
54
|
+
e.value.toLowerCase().includes(lower));
|
|
55
|
+
}
|
|
56
|
+
return results;
|
|
57
|
+
}
|
|
58
|
+
// ─── Notepad (freeform scratchpad) ──────────────────────────
|
|
59
|
+
function getNotepadPath() {
|
|
60
|
+
return join(getProjectDir(), NOTEPAD_FILE);
|
|
61
|
+
}
|
|
62
|
+
export function readNotepad() {
|
|
63
|
+
const path = getNotepadPath();
|
|
64
|
+
if (!existsSync(path))
|
|
65
|
+
return '';
|
|
66
|
+
try {
|
|
67
|
+
return readFileSync(path, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
catch (_) {
|
|
70
|
+
/* intentionally ignored: project memory file missing or malformed */
|
|
71
|
+
return '';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function writeNotepad(content) {
|
|
75
|
+
writeFileSync(getNotepadPath(), content, 'utf-8');
|
|
76
|
+
}
|
|
77
|
+
export function appendNotepad(text) {
|
|
78
|
+
const existing = readNotepad();
|
|
79
|
+
const timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
80
|
+
const entry = `\n## ${timestamp}\n\n${text}\n`;
|
|
81
|
+
writeNotepad(existing + entry);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=project-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-memory.js","sourceRoot":"","sources":["../../src/state/project-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Recovery — 会话恢复
|
|
3
|
+
*
|
|
4
|
+
* 从 .bobo/state/sessions/ 恢复之前的会话上下文
|
|
5
|
+
*/
|
|
6
|
+
import { type SessionState, type WorkflowState } from './manager.js';
|
|
7
|
+
export interface RecoveryContext {
|
|
8
|
+
lastSession: SessionState | null;
|
|
9
|
+
activeWorkflows: WorkflowState[];
|
|
10
|
+
recentSessions: SessionState[];
|
|
11
|
+
summary: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 恢复最近的会话上下文
|
|
15
|
+
*/
|
|
16
|
+
export declare function recoverContext(): RecoveryContext;
|
|
17
|
+
/**
|
|
18
|
+
* 获取最近 session 的历史行
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRecentHistory(sessionId: string, maxLines?: number): string[];
|
|
21
|
+
/**
|
|
22
|
+
* 生成恢复 prompt(注入到新 session 开头)
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildRecoveryPrompt(): string;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Recovery — 会话恢复
|
|
3
|
+
*
|
|
4
|
+
* 从 .bobo/state/sessions/ 恢复之前的会话上下文
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { getStateRoot, readActiveWorkflows } from './manager.js';
|
|
9
|
+
/**
|
|
10
|
+
* 恢复最近的会话上下文
|
|
11
|
+
*/
|
|
12
|
+
export function recoverContext() {
|
|
13
|
+
const sessionsDir = join(getStateRoot(), 'sessions');
|
|
14
|
+
if (!existsSync(sessionsDir)) {
|
|
15
|
+
return {
|
|
16
|
+
lastSession: null,
|
|
17
|
+
activeWorkflows: [],
|
|
18
|
+
recentSessions: [],
|
|
19
|
+
summary: 'No previous sessions found.',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const sessionDirs = readdirSync(sessionsDir).sort().reverse();
|
|
23
|
+
const recentSessions = [];
|
|
24
|
+
for (const dir of sessionDirs.slice(0, 5)) {
|
|
25
|
+
const contextPath = join(sessionsDir, dir, 'context.json');
|
|
26
|
+
if (!existsSync(contextPath))
|
|
27
|
+
continue;
|
|
28
|
+
try {
|
|
29
|
+
const state = JSON.parse(readFileSync(contextPath, 'utf-8'));
|
|
30
|
+
recentSessions.push(state);
|
|
31
|
+
}
|
|
32
|
+
catch (_) { /* intentionally ignored: malformed recovery file */
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const lastSession = recentSessions[0] ?? null;
|
|
37
|
+
const activeWorkflows = readActiveWorkflows();
|
|
38
|
+
const parts = [];
|
|
39
|
+
if (lastSession) {
|
|
40
|
+
parts.push(`Last session: ${lastSession.sessionId} (${lastSession.messageCount} messages, ${lastSession.lastActiveAt})`);
|
|
41
|
+
}
|
|
42
|
+
if (activeWorkflows.length > 0) {
|
|
43
|
+
parts.push(`Active workflows: ${activeWorkflows.map(w => `${w.type}[${w.status}]`).join(', ')}`);
|
|
44
|
+
}
|
|
45
|
+
if (parts.length === 0) {
|
|
46
|
+
parts.push('Clean slate — no previous context.');
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
lastSession,
|
|
50
|
+
activeWorkflows,
|
|
51
|
+
recentSessions,
|
|
52
|
+
summary: parts.join('\n'),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 获取最近 session 的历史行
|
|
57
|
+
*/
|
|
58
|
+
export function getRecentHistory(sessionId, maxLines = 50) {
|
|
59
|
+
const historyPath = join(getStateRoot(), 'sessions', sessionId, 'history.jsonl');
|
|
60
|
+
if (!existsSync(historyPath))
|
|
61
|
+
return [];
|
|
62
|
+
try {
|
|
63
|
+
const content = readFileSync(historyPath, 'utf-8');
|
|
64
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
65
|
+
return lines.slice(-maxLines);
|
|
66
|
+
}
|
|
67
|
+
catch (_) {
|
|
68
|
+
/* intentionally ignored: recovery scan failure */
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 生成恢复 prompt(注入到新 session 开头)
|
|
74
|
+
*/
|
|
75
|
+
export function buildRecoveryPrompt() {
|
|
76
|
+
const ctx = recoverContext();
|
|
77
|
+
if (!ctx.lastSession)
|
|
78
|
+
return '';
|
|
79
|
+
const parts = [
|
|
80
|
+
'# Session Recovery',
|
|
81
|
+
'',
|
|
82
|
+
ctx.summary,
|
|
83
|
+
];
|
|
84
|
+
if (ctx.lastSession.matchedSkills.length > 0) {
|
|
85
|
+
parts.push(`\nPrevious skills: ${ctx.lastSession.matchedSkills.join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
if (ctx.activeWorkflows.length > 0) {
|
|
88
|
+
parts.push('\n## Active Workflows');
|
|
89
|
+
for (const w of ctx.activeWorkflows) {
|
|
90
|
+
parts.push(`- ${w.type} (${w.status}) started ${w.startedAt}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return parts.join('\n');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/state/recovery.ts"],"names":[],"mappings":"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"}
|
package/dist/statusbar.d.ts
CHANGED
package/dist/statusbar.js
CHANGED
|
@@ -36,7 +36,18 @@ export function renderStatusBar() {
|
|
|
36
36
|
const cols = process.stdout.columns || 80;
|
|
37
37
|
const sep = chalk.dim(' · ');
|
|
38
38
|
// Left: permission mode indicator
|
|
39
|
-
const
|
|
39
|
+
const permMode = currentInfo.permissionMode || 'auto';
|
|
40
|
+
let permLabel;
|
|
41
|
+
if (permMode === 'yolo') {
|
|
42
|
+
permLabel = chalk.red('▸▸') + ' ' + chalk.red('yolo');
|
|
43
|
+
}
|
|
44
|
+
else if (permMode === 'ask') {
|
|
45
|
+
permLabel = chalk.green('▸▸') + ' ' + chalk.green('ask');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// auto
|
|
49
|
+
permLabel = chalk.yellow('▸▸') + ' ' + chalk.yellow('auto');
|
|
50
|
+
}
|
|
40
51
|
// Center/Right: effort + model
|
|
41
52
|
const effortDot = currentInfo.thinkingLevel === 'high' ? chalk.green('●')
|
|
42
53
|
: currentInfo.thinkingLevel === 'low' ? chalk.dim('●')
|
package/dist/statusbar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusbar.js","sourceRoot":"","sources":["../src/statusbar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"statusbar.js","sourceRoot":"","sources":["../src/statusbar.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,7 +39,8 @@ export class KnowledgeLoader {
|
|
|
39
39
|
this.cache.set(cacheKey, workflow);
|
|
40
40
|
return workflow;
|
|
41
41
|
}
|
|
42
|
-
catch {
|
|
42
|
+
catch (_) {
|
|
43
|
+
/* intentionally ignored: structured file unreadable or malformed */
|
|
43
44
|
return undefined;
|
|
44
45
|
}
|
|
45
46
|
}
|
|
@@ -103,7 +104,8 @@ export class KnowledgeLoader {
|
|
|
103
104
|
this.cache.set(cacheKey, item);
|
|
104
105
|
return item;
|
|
105
106
|
}
|
|
106
|
-
catch {
|
|
107
|
+
catch (_) {
|
|
108
|
+
/* intentionally ignored: structured file unreadable or malformed */
|
|
107
109
|
return undefined;
|
|
108
110
|
}
|
|
109
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/structured/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEzG,MAAM,OAAO,eAAe;IAClB,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACnC,QAAQ,CAAS;IAEzB,YAAY,aAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAmB,CAAC;QAC9E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAO,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAQ,QAAQ,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,QAAQ,GAAG,aAAa,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAa,CAAC;QAE1E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAClF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;gBACpC,GAAG,IAAI;gBACP,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAClD,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;gBACpD,KAAK;aACN,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACnC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/structured/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
* Sub-agent runner — standalone script that runs as a child process.
|
|
3
3
|
* Usage: node dist/sub-agent-runner.js <taskFile>
|
|
4
4
|
* Reads task from JSON file, runs agent loop, writes result back.
|
|
5
|
+
* Enhanced with role-based tool filtering and prompt injection.
|
|
5
6
|
*/
|
|
6
7
|
export {};
|
package/dist/sub-agent-runner.js
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
* Sub-agent runner — standalone script that runs as a child process.
|
|
3
3
|
* Usage: node dist/sub-agent-runner.js <taskFile>
|
|
4
4
|
* Reads task from JSON file, runs agent loop, writes result back.
|
|
5
|
+
* Enhanced with role-based tool filtering and prompt injection.
|
|
5
6
|
*/
|
|
6
7
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
7
8
|
import { runAgent } from './agent.js';
|
|
9
|
+
import { runVerification, formatVerificationResult } from './verification-agent.js';
|
|
10
|
+
import { getRolePromptInjection } from './sub-agents.js';
|
|
8
11
|
async function main() {
|
|
9
12
|
const taskFile = process.argv[2];
|
|
10
13
|
if (!taskFile) {
|
|
@@ -14,23 +17,47 @@ async function main() {
|
|
|
14
17
|
try {
|
|
15
18
|
taskData = JSON.parse(readFileSync(taskFile, 'utf-8'));
|
|
16
19
|
}
|
|
17
|
-
catch {
|
|
20
|
+
catch (_) {
|
|
21
|
+
/* intentionally ignored: task file read/write failure */
|
|
18
22
|
process.exit(1);
|
|
19
23
|
}
|
|
24
|
+
// Set 30-minute timeout
|
|
25
|
+
const timeoutMs = 30 * 60 * 1000;
|
|
26
|
+
const timeoutHandle = setTimeout(() => {
|
|
27
|
+
taskData.status = 'failed';
|
|
28
|
+
taskData.error = 'Timeout: exceeded 30 minute limit';
|
|
29
|
+
writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}, timeoutMs);
|
|
20
32
|
// Change to task's cwd
|
|
21
33
|
try {
|
|
22
34
|
process.chdir(taskData.cwd);
|
|
23
35
|
}
|
|
24
|
-
catch { /* stay in current dir */ }
|
|
36
|
+
catch (_) { /* intentionally ignored: stay in current dir */ }
|
|
25
37
|
try {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
const role = taskData.role || 'worker';
|
|
39
|
+
if (role === 'verify') {
|
|
40
|
+
// Special handling for verification agents
|
|
41
|
+
const verificationResult = await runVerification(taskData.task, '', { cwd: taskData.cwd });
|
|
42
|
+
taskData.status = verificationResult.verdict === 'FAIL' ? 'failed' : 'completed';
|
|
43
|
+
taskData.result = formatVerificationResult(verificationResult);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Inject role-specific prompt
|
|
47
|
+
const rolePrompt = getRolePromptInjection(role);
|
|
48
|
+
const enhancedTask = rolePrompt ? `${rolePrompt}\n\n---\n\n${taskData.task}` : taskData.task;
|
|
49
|
+
const result = await runAgent(enhancedTask, [], { quiet: true });
|
|
50
|
+
taskData.status = 'completed';
|
|
51
|
+
taskData.result = result.response;
|
|
52
|
+
}
|
|
29
53
|
}
|
|
30
54
|
catch (e) {
|
|
31
55
|
taskData.status = 'failed';
|
|
32
56
|
taskData.error = e.message;
|
|
33
57
|
}
|
|
58
|
+
finally {
|
|
59
|
+
clearTimeout(timeoutHandle);
|
|
60
|
+
}
|
|
34
61
|
writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
35
62
|
}
|
|
36
63
|
main().catch(() => process.exit(1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-runner.js","sourceRoot":"","sources":["../src/sub-agent-runner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sub-agent-runner.js","sourceRoot":"","sources":["../src/sub-agent-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/sub-agents.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Sub-agent management — spawn, list, show background agents.
|
|
3
|
+
* Enhanced with role-based isolation (explore/plan/worker/verify).
|
|
3
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Agent role types with different permission levels.
|
|
7
|
+
* - explore: Read-only exploration (read_file, list_directory, search_files, shell with restrictions)
|
|
8
|
+
* - plan: Read-only planning mode (outputs task plans but cannot modify files)
|
|
9
|
+
* - worker: Full tool permissions (but injected with anti-recursion prompt)
|
|
10
|
+
* - verify: Uses verification-agent logic to validate work
|
|
11
|
+
*/
|
|
12
|
+
export type AgentRole = 'explore' | 'plan' | 'worker' | 'verify';
|
|
4
13
|
interface SubAgentTask {
|
|
5
14
|
id: string;
|
|
6
15
|
task: string;
|
|
@@ -11,11 +20,20 @@ interface SubAgentTask {
|
|
|
11
20
|
result?: string;
|
|
12
21
|
error?: string;
|
|
13
22
|
pid?: number;
|
|
23
|
+
role?: AgentRole;
|
|
14
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Get allowed tools for a specific role.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getAllowedToolsForRole(role: AgentRole): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Get role-specific system prompt injection.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getRolePromptInjection(role: AgentRole): string;
|
|
15
33
|
/**
|
|
16
34
|
* Spawn a new sub-agent to run a task in the background.
|
|
17
35
|
*/
|
|
18
|
-
export declare function spawnSubAgent(task: string): {
|
|
36
|
+
export declare function spawnSubAgent(task: string, role?: AgentRole): {
|
|
19
37
|
id: string;
|
|
20
38
|
error?: string;
|
|
21
39
|
};
|
package/dist/sub-agents.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Sub-agent management — spawn, list, show background agents.
|
|
3
|
+
* Enhanced with role-based isolation (explore/plan/worker/verify).
|
|
3
4
|
*/
|
|
4
5
|
import { fork } from 'node:child_process';
|
|
5
6
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';
|
|
6
7
|
import { join } from 'node:path';
|
|
7
8
|
import { fileURLToPath } from 'node:url';
|
|
8
9
|
import { getConfigDir } from './config.js';
|
|
10
|
+
import { AGENT_CATALOG } from './agents/catalog.js';
|
|
9
11
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
10
12
|
const MAX_CONCURRENT = 3;
|
|
11
13
|
// Track running processes in memory
|
|
@@ -19,17 +21,149 @@ function ensureAgentsDir() {
|
|
|
19
21
|
mkdirSync(dir, { recursive: true });
|
|
20
22
|
}
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Get allowed tools for a specific role.
|
|
26
|
+
*/
|
|
27
|
+
export function getAllowedToolsForRole(role) {
|
|
28
|
+
switch (role) {
|
|
29
|
+
case 'explore':
|
|
30
|
+
// Read-only tools for exploration
|
|
31
|
+
return [
|
|
32
|
+
'read_file',
|
|
33
|
+
'list_directory',
|
|
34
|
+
'search_files',
|
|
35
|
+
'git_status',
|
|
36
|
+
'git_diff',
|
|
37
|
+
'git_log',
|
|
38
|
+
'search_memory',
|
|
39
|
+
];
|
|
40
|
+
case 'plan':
|
|
41
|
+
// Read-only + planning tools
|
|
42
|
+
return [
|
|
43
|
+
'read_file',
|
|
44
|
+
'list_directory',
|
|
45
|
+
'search_files',
|
|
46
|
+
'git_status',
|
|
47
|
+
'git_diff',
|
|
48
|
+
'git_log',
|
|
49
|
+
'search_memory',
|
|
50
|
+
];
|
|
51
|
+
case 'worker':
|
|
52
|
+
// Full access (but will be injected with anti-recursion prompt)
|
|
53
|
+
return ['*']; // All tools allowed
|
|
54
|
+
case 'verify':
|
|
55
|
+
// Verification tools
|
|
56
|
+
return [
|
|
57
|
+
'read_file',
|
|
58
|
+
'list_directory',
|
|
59
|
+
'search_files',
|
|
60
|
+
'shell', // For running build/test/lint
|
|
61
|
+
'git_status',
|
|
62
|
+
'git_diff',
|
|
63
|
+
];
|
|
64
|
+
default:
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get role-specific system prompt injection.
|
|
70
|
+
*/
|
|
71
|
+
export function getRolePromptInjection(role) {
|
|
72
|
+
// Try to use catalog-based prompts first for richer role definitions
|
|
73
|
+
const catalogRole = role === 'worker' ? 'executor' : role === 'plan' ? 'planner' : role === 'verify' ? 'verifier' : role;
|
|
74
|
+
const catalogAgent = AGENT_CATALOG[catalogRole];
|
|
75
|
+
const catalogContext = catalogAgent
|
|
76
|
+
? `\n\n## Catalog Context\n- Role: ${catalogAgent.role}\n- Description: ${catalogAgent.description}\n- Use cases: ${catalogAgent.useCases.join(', ')}\n- Boundaries: ${catalogAgent.boundaries.join(', ')}`
|
|
77
|
+
: '';
|
|
78
|
+
switch (role) {
|
|
79
|
+
case 'explore':
|
|
80
|
+
return `
|
|
81
|
+
# Role: Explorer Agent
|
|
82
|
+
|
|
83
|
+
You are an exploration agent with READ-ONLY access. Your job is to:
|
|
84
|
+
- Read and analyze files
|
|
85
|
+
- Search for patterns and information
|
|
86
|
+
- Report findings clearly
|
|
87
|
+
|
|
88
|
+
You CANNOT:
|
|
89
|
+
- Modify any files (write_file, edit_file)
|
|
90
|
+
- Execute arbitrary shell commands
|
|
91
|
+
- Create or delete files
|
|
92
|
+
- Make git commits
|
|
93
|
+
|
|
94
|
+
Focus on gathering information and presenting it clearly.${catalogContext}`;
|
|
95
|
+
case 'plan':
|
|
96
|
+
return `
|
|
97
|
+
# Role: Planning Agent
|
|
98
|
+
|
|
99
|
+
You are a planning agent with READ-ONLY access. Your job is to:
|
|
100
|
+
- Analyze the codebase and requirements
|
|
101
|
+
- Create detailed task breakdowns
|
|
102
|
+
- Identify dependencies and risks
|
|
103
|
+
- Propose implementation approaches
|
|
104
|
+
|
|
105
|
+
You CANNOT:
|
|
106
|
+
- Modify any files
|
|
107
|
+
- Execute code changes
|
|
108
|
+
- Make commits
|
|
109
|
+
|
|
110
|
+
Output a structured plan with:
|
|
111
|
+
1. Tasks broken down into steps
|
|
112
|
+
2. File paths that need changes
|
|
113
|
+
3. Potential risks or blockers
|
|
114
|
+
4. Estimated complexity${catalogContext}`;
|
|
115
|
+
case 'worker':
|
|
116
|
+
return `
|
|
117
|
+
# Role: Worker Agent
|
|
118
|
+
|
|
119
|
+
You are a worker agent with FULL tool access. Your job is to:
|
|
120
|
+
- Execute tasks efficiently
|
|
121
|
+
- Make file changes as needed
|
|
122
|
+
- Run tests and verify your work
|
|
123
|
+
- Report completion status
|
|
124
|
+
|
|
125
|
+
CRITICAL CONSTRAINTS:
|
|
126
|
+
- You are a WORKER, not a manager
|
|
127
|
+
- NEVER spawn sub-agents or delegate work
|
|
128
|
+
- Execute tasks directly yourself
|
|
129
|
+
- If you encounter blockers, report them immediately
|
|
130
|
+
|
|
131
|
+
Focus on DOING the work, not planning or delegating.${catalogContext}`;
|
|
132
|
+
case 'verify':
|
|
133
|
+
return `
|
|
134
|
+
# Role: Verification Agent
|
|
135
|
+
|
|
136
|
+
You are a verification agent using 'try to break it' philosophy. Your job is to:
|
|
137
|
+
- Run build/test/lint checks
|
|
138
|
+
- Probe for edge cases and boundary conditions
|
|
139
|
+
- Test actual functionality (API calls, CLI commands)
|
|
140
|
+
- Report honest assessment
|
|
141
|
+
|
|
142
|
+
You SHOULD:
|
|
143
|
+
- Be adversarial - try to find what's broken
|
|
144
|
+
- Run all available verification steps
|
|
145
|
+
- Test with unusual inputs
|
|
146
|
+
- Check for security issues
|
|
147
|
+
|
|
148
|
+
You MUST:
|
|
149
|
+
- Return VERDICT: PASS / FAIL / PARTIAL
|
|
150
|
+
- Provide specific evidence for failures
|
|
151
|
+
- Suggest concrete fixes${catalogContext}`;
|
|
152
|
+
default:
|
|
153
|
+
return '';
|
|
154
|
+
}
|
|
155
|
+
}
|
|
22
156
|
/**
|
|
23
157
|
* Spawn a new sub-agent to run a task in the background.
|
|
24
158
|
*/
|
|
25
|
-
export function spawnSubAgent(task) {
|
|
159
|
+
export function spawnSubAgent(task, role = 'worker') {
|
|
26
160
|
ensureAgentsDir();
|
|
27
161
|
// Check concurrent limit
|
|
28
162
|
const running = listSubAgents().filter(a => a.status === 'running');
|
|
29
163
|
if (running.length >= MAX_CONCURRENT) {
|
|
30
164
|
return { id: '', error: `Max ${MAX_CONCURRENT} concurrent sub-agents. Wait for one to finish or check /agents.` };
|
|
31
165
|
}
|
|
32
|
-
const id = `agent-${Date.now().toString(36)}`;
|
|
166
|
+
const id = `agent-${Date.now().toString(36)}-${role}`;
|
|
33
167
|
const taskFile = join(getAgentsDir(), `${id}.json`);
|
|
34
168
|
const taskData = {
|
|
35
169
|
id,
|
|
@@ -37,6 +171,7 @@ export function spawnSubAgent(task) {
|
|
|
37
171
|
cwd: process.cwd(),
|
|
38
172
|
status: 'running',
|
|
39
173
|
startedAt: new Date().toISOString(),
|
|
174
|
+
role,
|
|
40
175
|
};
|
|
41
176
|
writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
42
177
|
// Fork the sub-agent runner
|
|
@@ -61,7 +196,7 @@ export function spawnSubAgent(task) {
|
|
|
61
196
|
writeFileSync(taskFile, JSON.stringify(updated, null, 2));
|
|
62
197
|
}
|
|
63
198
|
}
|
|
64
|
-
catch { /* file may be
|
|
199
|
+
catch (_) { /* intentionally ignored: task file may already be updated by runner */ }
|
|
65
200
|
});
|
|
66
201
|
child.unref();
|
|
67
202
|
runningAgents.set(id, child);
|
|
@@ -89,7 +224,8 @@ export function listSubAgents(limit = 20) {
|
|
|
89
224
|
try {
|
|
90
225
|
return JSON.parse(readFileSync(join(dir, f), 'utf-8'));
|
|
91
226
|
}
|
|
92
|
-
catch {
|
|
227
|
+
catch (_) {
|
|
228
|
+
/* intentionally ignored: corrupted agent task file */
|
|
93
229
|
return null;
|
|
94
230
|
}
|
|
95
231
|
})
|
|
@@ -105,7 +241,8 @@ export function getSubAgent(id) {
|
|
|
105
241
|
try {
|
|
106
242
|
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
107
243
|
}
|
|
108
|
-
catch {
|
|
244
|
+
catch (_) {
|
|
245
|
+
/* intentionally ignored: corrupted agent task file */
|
|
109
246
|
return null;
|
|
110
247
|
}
|
|
111
248
|
}
|
package/dist/sub-agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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"}
|