xibecode 1.0.3 → 1.0.7
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/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +10 -7
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/diagnostics.js.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/run-pr.d.ts.map +1 -1
- package/dist/commands/run-pr.js +10 -9
- package/dist/commands/run-pr.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +14 -13
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +3 -2
- package/dist/commands/skills.js.map +1 -1
- package/dist/components/AssistantMarkdown.js +1 -1
- package/dist/components/AssistantMarkdown.js.map +1 -1
- package/dist/ui/claude-style-chat.d.ts.map +1 -1
- package/dist/ui/claude-style-chat.js +12 -10
- package/dist/ui/claude-style-chat.js.map +1 -1
- package/dist/utils/built-in-skills-dir.d.ts +7 -0
- package/dist/utils/built-in-skills-dir.d.ts.map +1 -0
- package/dist/utils/built-in-skills-dir.js +11 -0
- package/dist/utils/built-in-skills-dir.js.map +1 -0
- package/dist/utils/config.d.ts +2 -119
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +3 -88
- package/dist/utils/config.js.map +1 -1
- package/package.json +11 -17
- package/dist/commands/punycode.d.ts +0 -5
- package/dist/commands/punycode.d.ts.map +0 -1
- package/dist/commands/punycode.js +0 -48
- package/dist/commands/punycode.js.map +0 -1
- package/dist/commands/tui.d.ts +0 -9
- package/dist/commands/tui.d.ts.map +0 -1
- package/dist/commands/tui.js +0 -83
- package/dist/commands/tui.js.map +0 -1
- package/dist/core/agent-tool-policies.d.ts +0 -5
- package/dist/core/agent-tool-policies.d.ts.map +0 -1
- package/dist/core/agent-tool-policies.js +0 -18
- package/dist/core/agent-tool-policies.js.map +0 -1
- package/dist/core/agent.d.ts +0 -181
- package/dist/core/agent.d.ts.map +0 -1
- package/dist/core/agent.js +0 -1777
- package/dist/core/agent.js.map +0 -1
- package/dist/core/background-agent.d.ts +0 -23
- package/dist/core/background-agent.d.ts.map +0 -1
- package/dist/core/background-agent.js +0 -175
- package/dist/core/background-agent.js.map +0 -1
- package/dist/core/code-graph.d.ts +0 -18
- package/dist/core/code-graph.d.ts.map +0 -1
- package/dist/core/code-graph.js +0 -105
- package/dist/core/code-graph.js.map +0 -1
- package/dist/core/conflict-solver.d.ts +0 -26
- package/dist/core/conflict-solver.d.ts.map +0 -1
- package/dist/core/conflict-solver.js +0 -108
- package/dist/core/conflict-solver.js.map +0 -1
- package/dist/core/context-compactor.d.ts +0 -10
- package/dist/core/context-compactor.d.ts.map +0 -1
- package/dist/core/context-compactor.js +0 -158
- package/dist/core/context-compactor.js.map +0 -1
- package/dist/core/context-pruner.d.ts +0 -19
- package/dist/core/context-pruner.d.ts.map +0 -1
- package/dist/core/context-pruner.js +0 -103
- package/dist/core/context-pruner.js.map +0 -1
- package/dist/core/context.d.ts +0 -82
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -273
- package/dist/core/context.js.map +0 -1
- package/dist/core/conversation-recovery.d.ts +0 -9
- package/dist/core/conversation-recovery.d.ts.map +0 -1
- package/dist/core/conversation-recovery.js +0 -15
- package/dist/core/conversation-recovery.js.map +0 -1
- package/dist/core/debug-workflow.d.ts +0 -9
- package/dist/core/debug-workflow.d.ts.map +0 -1
- package/dist/core/debug-workflow.js +0 -19
- package/dist/core/debug-workflow.js.map +0 -1
- package/dist/core/docs-scraper.d.ts +0 -40
- package/dist/core/docs-scraper.d.ts.map +0 -1
- package/dist/core/docs-scraper.js +0 -386
- package/dist/core/docs-scraper.js.map +0 -1
- package/dist/core/editor.d.ts +0 -87
- package/dist/core/editor.d.ts.map +0 -1
- package/dist/core/editor.js +0 -377
- package/dist/core/editor.js.map +0 -1
- package/dist/core/export.d.ts +0 -11
- package/dist/core/export.d.ts.map +0 -1
- package/dist/core/export.js +0 -54
- package/dist/core/export.js.map +0 -1
- package/dist/core/history-manager.d.ts +0 -75
- package/dist/core/history-manager.d.ts.map +0 -1
- package/dist/core/history-manager.js +0 -146
- package/dist/core/history-manager.js.map +0 -1
- package/dist/core/marketplace-client.d.ts +0 -52
- package/dist/core/marketplace-client.d.ts.map +0 -1
- package/dist/core/marketplace-client.js +0 -71
- package/dist/core/marketplace-client.js.map +0 -1
- package/dist/core/mcp/mcp-config.d.ts +0 -10
- package/dist/core/mcp/mcp-config.d.ts.map +0 -1
- package/dist/core/mcp/mcp-config.js +0 -70
- package/dist/core/mcp/mcp-config.js.map +0 -1
- package/dist/core/mcp/mcp-policy.d.ts +0 -17
- package/dist/core/mcp/mcp-policy.d.ts.map +0 -1
- package/dist/core/mcp/mcp-policy.js +0 -56
- package/dist/core/mcp/mcp-policy.js.map +0 -1
- package/dist/core/mcp/oauth-flow.d.ts +0 -30
- package/dist/core/mcp/oauth-flow.d.ts.map +0 -1
- package/dist/core/mcp/oauth-flow.js +0 -230
- package/dist/core/mcp/oauth-flow.js.map +0 -1
- package/dist/core/mcp/oauth-store.d.ts +0 -13
- package/dist/core/mcp/oauth-store.d.ts.map +0 -1
- package/dist/core/mcp/oauth-store.js +0 -68
- package/dist/core/mcp/oauth-store.js.map +0 -1
- package/dist/core/mcp/resolve-mcp-servers.d.ts +0 -16
- package/dist/core/mcp/resolve-mcp-servers.d.ts.map +0 -1
- package/dist/core/mcp/resolve-mcp-servers.js +0 -83
- package/dist/core/mcp/resolve-mcp-servers.js.map +0 -1
- package/dist/core/mcp-client.d.ts +0 -99
- package/dist/core/mcp-client.d.ts.map +0 -1
- package/dist/core/mcp-client.js +0 -317
- package/dist/core/mcp-client.js.map +0 -1
- package/dist/core/memory-promotions.d.ts +0 -15
- package/dist/core/memory-promotions.d.ts.map +0 -1
- package/dist/core/memory-promotions.js +0 -38
- package/dist/core/memory-promotions.js.map +0 -1
- package/dist/core/memory.d.ts +0 -32
- package/dist/core/memory.d.ts.map +0 -1
- package/dist/core/memory.js +0 -121
- package/dist/core/memory.js.map +0 -1
- package/dist/core/modes.d.ts +0 -432
- package/dist/core/modes.d.ts.map +0 -1
- package/dist/core/modes.js +0 -1094
- package/dist/core/modes.js.map +0 -1
- package/dist/core/pattern-miner.d.ts +0 -43
- package/dist/core/pattern-miner.d.ts.map +0 -1
- package/dist/core/pattern-miner.js +0 -123
- package/dist/core/pattern-miner.js.map +0 -1
- package/dist/core/permission-store.d.ts +0 -15
- package/dist/core/permission-store.d.ts.map +0 -1
- package/dist/core/permission-store.js +0 -30
- package/dist/core/permission-store.js.map +0 -1
- package/dist/core/permissions.d.ts +0 -33
- package/dist/core/permissions.d.ts.map +0 -1
- package/dist/core/permissions.js +0 -141
- package/dist/core/permissions.js.map +0 -1
- package/dist/core/plan-artifacts.d.ts +0 -10
- package/dist/core/plan-artifacts.d.ts.map +0 -1
- package/dist/core/plan-artifacts.js +0 -60
- package/dist/core/plan-artifacts.js.map +0 -1
- package/dist/core/plan-session.d.ts +0 -25
- package/dist/core/plan-session.d.ts.map +0 -1
- package/dist/core/plan-session.js +0 -99
- package/dist/core/plan-session.js.map +0 -1
- package/dist/core/planMode.d.ts +0 -51
- package/dist/core/planMode.d.ts.map +0 -1
- package/dist/core/planMode.js +0 -245
- package/dist/core/planMode.js.map +0 -1
- package/dist/core/plugins.d.ts +0 -96
- package/dist/core/plugins.d.ts.map +0 -1
- package/dist/core/plugins.js +0 -204
- package/dist/core/plugins.js.map +0 -1
- package/dist/core/session-bridge.d.ts +0 -128
- package/dist/core/session-bridge.d.ts.map +0 -1
- package/dist/core/session-bridge.js +0 -328
- package/dist/core/session-bridge.js.map +0 -1
- package/dist/core/session-manager.d.ts +0 -80
- package/dist/core/session-manager.d.ts.map +0 -1
- package/dist/core/session-manager.js +0 -166
- package/dist/core/session-manager.js.map +0 -1
- package/dist/core/session-memory.d.ts +0 -45
- package/dist/core/session-memory.d.ts.map +0 -1
- package/dist/core/session-memory.js +0 -103
- package/dist/core/session-memory.js.map +0 -1
- package/dist/core/skill-selection.d.ts +0 -36
- package/dist/core/skill-selection.d.ts.map +0 -1
- package/dist/core/skill-selection.js +0 -172
- package/dist/core/skill-selection.js.map +0 -1
- package/dist/core/skills-sh-client.d.ts +0 -19
- package/dist/core/skills-sh-client.d.ts.map +0 -1
- package/dist/core/skills-sh-client.js +0 -75
- package/dist/core/skills-sh-client.js.map +0 -1
- package/dist/core/skills.d.ts +0 -97
- package/dist/core/skills.d.ts.map +0 -1
- package/dist/core/skills.js +0 -339
- package/dist/core/skills.js.map +0 -1
- package/dist/core/swarm.d.ts +0 -34
- package/dist/core/swarm.d.ts.map +0 -1
- package/dist/core/swarm.js +0 -111
- package/dist/core/swarm.js.map +0 -1
- package/dist/core/task-status.d.ts +0 -13
- package/dist/core/task-status.d.ts.map +0 -1
- package/dist/core/task-status.js +0 -17
- package/dist/core/task-status.js.map +0 -1
- package/dist/core/tool-orchestrator.d.ts +0 -30
- package/dist/core/tool-orchestrator.d.ts.map +0 -1
- package/dist/core/tool-orchestrator.js +0 -89
- package/dist/core/tool-orchestrator.js.map +0 -1
- package/dist/core/tools.d.ts +0 -462
- package/dist/core/tools.d.ts.map +0 -1
- package/dist/core/tools.js +0 -2916
- package/dist/core/tools.js.map +0 -1
- package/dist/core/transcript-cleanup.d.ts +0 -8
- package/dist/core/transcript-cleanup.d.ts.map +0 -1
- package/dist/core/transcript-cleanup.js +0 -52
- package/dist/core/transcript-cleanup.js.map +0 -1
- package/dist/core/visual-feedback.d.ts +0 -20
- package/dist/core/visual-feedback.d.ts.map +0 -1
- package/dist/core/visual-feedback.js +0 -117
- package/dist/core/visual-feedback.js.map +0 -1
- package/dist/tools/browser.d.ts +0 -120
- package/dist/tools/browser.d.ts.map +0 -1
- package/dist/tools/browser.js +0 -439
- package/dist/tools/browser.js.map +0 -1
- package/dist/tools/test-generator.d.ts +0 -157
- package/dist/tools/test-generator.d.ts.map +0 -1
- package/dist/tools/test-generator.js +0 -893
- package/dist/tools/test-generator.js.map +0 -1
- package/dist/tui/InkApp.d.ts +0 -21
- package/dist/tui/InkApp.d.ts.map +0 -1
- package/dist/tui/InkApp.js +0 -146
- package/dist/tui/InkApp.js.map +0 -1
- package/dist/tui/MarkdownMessage.d.ts +0 -16
- package/dist/tui/MarkdownMessage.d.ts.map +0 -1
- package/dist/tui/MarkdownMessage.js +0 -63
- package/dist/tui/MarkdownMessage.js.map +0 -1
- package/dist/tui/blessed-chat.d.ts +0 -9
- package/dist/tui/blessed-chat.d.ts.map +0 -1
- package/dist/tui/blessed-chat.js +0 -887
- package/dist/tui/blessed-chat.js.map +0 -1
- package/dist/tui/markdown-to-blessed.d.ts +0 -6
- package/dist/tui/markdown-to-blessed.d.ts.map +0 -1
- package/dist/tui/markdown-to-blessed.js +0 -26
- package/dist/tui/markdown-to-blessed.js.map +0 -1
- package/dist/ui/ink/App.d.ts +0 -25
- package/dist/ui/ink/App.d.ts.map +0 -1
- package/dist/ui/ink/App.js +0 -372
- package/dist/ui/ink/App.js.map +0 -1
- package/dist/utils/at-references.d.ts +0 -14
- package/dist/utils/at-references.d.ts.map +0 -1
- package/dist/utils/at-references.js +0 -47
- package/dist/utils/at-references.js.map +0 -1
- package/dist/utils/auto-memory.d.ts +0 -24
- package/dist/utils/auto-memory.d.ts.map +0 -1
- package/dist/utils/auto-memory.js +0 -153
- package/dist/utils/auto-memory.js.map +0 -1
- package/dist/utils/git.d.ts +0 -89
- package/dist/utils/git.d.ts.map +0 -1
- package/dist/utils/git.js +0 -444
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/mcp-servers-file.d.ts +0 -46
- package/dist/utils/mcp-servers-file.d.ts.map +0 -1
- package/dist/utils/mcp-servers-file.js +0 -212
- package/dist/utils/mcp-servers-file.js.map +0 -1
- package/dist/utils/safety.d.ts +0 -60
- package/dist/utils/safety.d.ts.map +0 -1
- package/dist/utils/safety.js +0 -254
- package/dist/utils/safety.js.map +0 -1
- package/dist/utils/smithery.d.ts +0 -25
- package/dist/utils/smithery.d.ts.map +0 -1
- package/dist/utils/smithery.js +0 -50
- package/dist/utils/smithery.js.map +0 -1
- package/dist/utils/testRunner.d.ts +0 -44
- package/dist/utils/testRunner.d.ts.map +0 -1
- package/dist/utils/testRunner.js +0 -270
- package/dist/utils/testRunner.js.map +0 -1
package/dist/core/swarm.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { getWorkerBlockedTools } from './agent-tool-policies.js';
|
|
2
|
-
/** Default cap on concurrent background agent processes (overridable via `run_swarm` max_parallel). */
|
|
3
|
-
export const DEFAULT_SWARM_MAX_PARALLEL = 6;
|
|
4
|
-
async function runWithConcurrency(items, maxConcurrent, fn) {
|
|
5
|
-
if (items.length === 0)
|
|
6
|
-
return [];
|
|
7
|
-
const limit = Math.max(1, Math.floor(maxConcurrent));
|
|
8
|
-
const results = new Array(items.length);
|
|
9
|
-
let nextIndex = 0;
|
|
10
|
-
async function worker() {
|
|
11
|
-
while (true) {
|
|
12
|
-
const i = nextIndex++;
|
|
13
|
-
if (i >= items.length)
|
|
14
|
-
return;
|
|
15
|
-
results[i] = await fn(items[i], i);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
const poolSize = Math.min(limit, items.length);
|
|
19
|
-
await Promise.all(Array.from({ length: poolSize }, () => worker()));
|
|
20
|
-
return results;
|
|
21
|
-
}
|
|
22
|
-
export class SwarmOrchestrator {
|
|
23
|
-
backgroundAgent;
|
|
24
|
-
constructor(backgroundAgent) {
|
|
25
|
-
this.backgroundAgent = backgroundAgent;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Delegates a task to a specialized agent mode.
|
|
29
|
-
* Starts a background agent with specific mode instructions and waits for completion.
|
|
30
|
-
*/
|
|
31
|
-
async delegateSubtask(mode, task, timeoutMs = 60000 * 5 // 5 minutes default timeout
|
|
32
|
-
) {
|
|
33
|
-
// Construct the prompt to force mode switch and structured completion
|
|
34
|
-
const prompt = `[[REQUEST_MODE: ${mode} | reason=Delegated Swarm Task]]
|
|
35
|
-
|
|
36
|
-
TASK DESCRIPTION:
|
|
37
|
-
${task}
|
|
38
|
-
|
|
39
|
-
IMPORTANT INSTRUCTIONS:
|
|
40
|
-
1. You are a specialized worker in '${mode}' mode.
|
|
41
|
-
2. Focus ONLY on this task.
|
|
42
|
-
3. When finished, you MUST output the following tag:
|
|
43
|
-
[[TASK_COMPLETE | summary=Task finished successfully]]
|
|
44
|
-
4. Never call restricted coordinator tools: ${getWorkerBlockedTools().join(', ')}.
|
|
45
|
-
`;
|
|
46
|
-
try {
|
|
47
|
-
const taskId = await this.backgroundAgent.startTask(prompt);
|
|
48
|
-
return this.pollTask(taskId, timeoutMs);
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
return {
|
|
52
|
-
success: false,
|
|
53
|
-
result: `Failed to start subtask: ${error.message}`,
|
|
54
|
-
taskId: '',
|
|
55
|
-
status: 'failed'
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
async pollTask(taskId, timeoutMs) {
|
|
60
|
-
const startTime = Date.now();
|
|
61
|
-
const pollInterval = 2000; // 2 seconds
|
|
62
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
63
|
-
const task = await this.backgroundAgent.getTask(taskId);
|
|
64
|
-
if (!task) {
|
|
65
|
-
// Task might be initializing or file lock issue?
|
|
66
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
// Check provided status
|
|
70
|
-
if (task.status === 'completed' || task.status === 'failed' || task.status === 'killed') {
|
|
71
|
-
const logs = await this.backgroundAgent.getTaskLogs(taskId);
|
|
72
|
-
return {
|
|
73
|
-
success: task.status === 'completed',
|
|
74
|
-
result: logs,
|
|
75
|
-
taskId,
|
|
76
|
-
status: task.status
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
// Also check logs for [[TASK_COMPLETE]] even if process is still running
|
|
80
|
-
// BackgroundAgent implementation relies on process exit for 'completed' status usually.
|
|
81
|
-
// But if the agent keeps running (e.g. infinite loop), we might want to catch the completion tag.
|
|
82
|
-
// However, BackgroundAgent logic only updates status when process exits or is killed.
|
|
83
|
-
// Let's rely on status for now, assuming the sub-agent exits after notify_user?
|
|
84
|
-
// Wait, notify_user exits task mode, but not the process if run with `xibecode run`.
|
|
85
|
-
// `xibecode run` keeps running until input exhausted or explicit exit?
|
|
86
|
-
// Actually `xibecode run` is interactive REPL usually.
|
|
87
|
-
// If run non-interactively with prompt, it runs once and exits?
|
|
88
|
-
// Let's assume it exits.
|
|
89
|
-
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
90
|
-
}
|
|
91
|
-
return {
|
|
92
|
-
success: false,
|
|
93
|
-
result: 'Task timed out waiting for completion.',
|
|
94
|
-
taskId,
|
|
95
|
-
status: 'timeout'
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Run multiple delegated subtasks with bounded concurrency (parallel when there are multiple workers).
|
|
100
|
-
* Each subtask is an isolated background `xibecode run` process; overlapping writes to the same files can conflict.
|
|
101
|
-
*/
|
|
102
|
-
async delegateSubtasksParallel(subtasks, options) {
|
|
103
|
-
const timeoutMs = options?.timeoutMs ?? 60000 * 5;
|
|
104
|
-
const maxConcurrent = options?.maxConcurrent ?? DEFAULT_SWARM_MAX_PARALLEL;
|
|
105
|
-
return runWithConcurrency(subtasks, maxConcurrent, async (s) => {
|
|
106
|
-
const r = await this.delegateSubtask(s.mode, s.task, timeoutMs);
|
|
107
|
-
return { ...r, worker_type: s.mode };
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=swarm.js.map
|
package/dist/core/swarm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/core/swarm.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type TaskLifecycleStatus = 'queued' | 'running' | 'completed' | 'failed' | 'killed';
|
|
2
|
-
export interface TaskStatusSnapshot {
|
|
3
|
-
id: string;
|
|
4
|
-
label: string;
|
|
5
|
-
status: TaskLifecycleStatus;
|
|
6
|
-
updatedAt: string;
|
|
7
|
-
}
|
|
8
|
-
export declare class TaskStatusStore {
|
|
9
|
-
private readonly statuses;
|
|
10
|
-
upsert(id: string, label: string, status: TaskLifecycleStatus): TaskStatusSnapshot;
|
|
11
|
-
list(): TaskStatusSnapshot[];
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=task-status.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../src/core/task-status.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3F,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAElE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,kBAAkB;IAWlF,IAAI,IAAI,kBAAkB,EAAE;CAK7B"}
|
package/dist/core/task-status.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export class TaskStatusStore {
|
|
2
|
-
statuses = new Map();
|
|
3
|
-
upsert(id, label, status) {
|
|
4
|
-
const snapshot = {
|
|
5
|
-
id,
|
|
6
|
-
label,
|
|
7
|
-
status,
|
|
8
|
-
updatedAt: new Date().toISOString(),
|
|
9
|
-
};
|
|
10
|
-
this.statuses.set(id, snapshot);
|
|
11
|
-
return snapshot;
|
|
12
|
-
}
|
|
13
|
-
list() {
|
|
14
|
-
return Array.from(this.statuses.values()).sort((a, b) => Date.parse(b.updatedAt) - Date.parse(a.updatedAt));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=task-status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-status.js","sourceRoot":"","sources":["../../src/core/task-status.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAElE,MAAM,CAAC,EAAU,EAAE,KAAa,EAAE,MAA2B;QAC3D,MAAM,QAAQ,GAAuB;YACnC,EAAE;YACF,KAAK;YACL,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAC5D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/messages';
|
|
2
|
-
export interface ToolExecutionUpdate {
|
|
3
|
-
toolUse: ToolUseBlock;
|
|
4
|
-
index: number;
|
|
5
|
-
result: any;
|
|
6
|
-
success: boolean;
|
|
7
|
-
}
|
|
8
|
-
export type ToolExecutorCallback = (toolUse: ToolUseBlock, index: number) => Promise<ToolExecutionUpdate>;
|
|
9
|
-
type ToolBatch = {
|
|
10
|
-
isConcurrent: boolean;
|
|
11
|
-
blocks: Array<{
|
|
12
|
-
toolUse: ToolUseBlock;
|
|
13
|
-
index: number;
|
|
14
|
-
}>;
|
|
15
|
-
};
|
|
16
|
-
export declare class ToolOrchestrator {
|
|
17
|
-
private readonly localConcurrency;
|
|
18
|
-
private readonly networkConcurrency;
|
|
19
|
-
constructor(options?: {
|
|
20
|
-
localConcurrency?: number;
|
|
21
|
-
networkConcurrency?: number;
|
|
22
|
-
});
|
|
23
|
-
partition(toolUseBlocks: ToolUseBlock[]): ToolBatch[];
|
|
24
|
-
executeBatches(toolUseBlocks: ToolUseBlock[], executeTool: ToolExecutorCallback): Promise<ToolExecutionUpdate[]>;
|
|
25
|
-
private isConcurrencySafe;
|
|
26
|
-
private isNetworkTool;
|
|
27
|
-
private executeLimited;
|
|
28
|
-
}
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=tool-orchestrator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/tool-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAuB1G,KAAK,SAAS,GAAG;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD,CAAC;AAEF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE;IAKhF,SAAS,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE;IAkB/C,cAAc,CAClB,aAAa,EAAE,YAAY,EAAE,EAC7B,WAAW,EAAE,oBAAoB,GAChC,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAwBjC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;YAIP,cAAc;CAmB7B"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
const CONCURRENCY_SAFE_TOOLS = new Set([
|
|
2
|
-
'read_file',
|
|
3
|
-
'read_multiple_files',
|
|
4
|
-
'list_directory',
|
|
5
|
-
'search_files',
|
|
6
|
-
'get_context',
|
|
7
|
-
'get_git_status',
|
|
8
|
-
'get_git_changed_files',
|
|
9
|
-
'get_git_diff_summary',
|
|
10
|
-
'fetch_url',
|
|
11
|
-
'web_search',
|
|
12
|
-
'get_test_status',
|
|
13
|
-
'find_files',
|
|
14
|
-
'grep_code',
|
|
15
|
-
]);
|
|
16
|
-
const NETWORK_TOOLS = new Set([
|
|
17
|
-
'fetch_url',
|
|
18
|
-
'web_search',
|
|
19
|
-
]);
|
|
20
|
-
export class ToolOrchestrator {
|
|
21
|
-
localConcurrency;
|
|
22
|
-
networkConcurrency;
|
|
23
|
-
constructor(options) {
|
|
24
|
-
this.localConcurrency = Math.max(1, options?.localConcurrency ?? 8);
|
|
25
|
-
this.networkConcurrency = Math.max(1, options?.networkConcurrency ?? 4);
|
|
26
|
-
}
|
|
27
|
-
partition(toolUseBlocks) {
|
|
28
|
-
const batches = [];
|
|
29
|
-
for (let index = 0; index < toolUseBlocks.length; index += 1) {
|
|
30
|
-
const toolUse = toolUseBlocks[index];
|
|
31
|
-
const isConcurrent = this.isConcurrencySafe(toolUse.name);
|
|
32
|
-
const lastBatch = batches[batches.length - 1];
|
|
33
|
-
if (isConcurrent && lastBatch?.isConcurrent) {
|
|
34
|
-
lastBatch.blocks.push({ toolUse, index });
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
batches.push({
|
|
38
|
-
isConcurrent,
|
|
39
|
-
blocks: [{ toolUse, index }],
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return batches;
|
|
44
|
-
}
|
|
45
|
-
async executeBatches(toolUseBlocks, executeTool) {
|
|
46
|
-
const updates = [];
|
|
47
|
-
const batches = this.partition(toolUseBlocks);
|
|
48
|
-
for (const batch of batches) {
|
|
49
|
-
if (batch.isConcurrent) {
|
|
50
|
-
const networkBlocks = batch.blocks.filter(({ toolUse }) => this.isNetworkTool(toolUse.name));
|
|
51
|
-
const localBlocks = batch.blocks.filter(({ toolUse }) => !this.isNetworkTool(toolUse.name));
|
|
52
|
-
const [localUpdates, networkUpdates] = await Promise.all([
|
|
53
|
-
this.executeLimited(localBlocks, this.localConcurrency, executeTool),
|
|
54
|
-
this.executeLimited(networkBlocks, this.networkConcurrency, executeTool),
|
|
55
|
-
]);
|
|
56
|
-
const batchUpdates = [...localUpdates, ...networkUpdates];
|
|
57
|
-
updates.push(...batchUpdates);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
for (const { toolUse, index } of batch.blocks) {
|
|
61
|
-
updates.push(await executeTool(toolUse, index));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
updates.sort((a, b) => a.index - b.index);
|
|
66
|
-
return updates;
|
|
67
|
-
}
|
|
68
|
-
isConcurrencySafe(toolName) {
|
|
69
|
-
return CONCURRENCY_SAFE_TOOLS.has(toolName);
|
|
70
|
-
}
|
|
71
|
-
isNetworkTool(toolName) {
|
|
72
|
-
return NETWORK_TOOLS.has(toolName) || toolName.includes('fetch_url') || toolName.includes('web_search');
|
|
73
|
-
}
|
|
74
|
-
async executeLimited(blocks, limit, executeTool) {
|
|
75
|
-
const updates = [];
|
|
76
|
-
let nextIndex = 0;
|
|
77
|
-
const workers = Array.from({ length: Math.min(limit, blocks.length) }, async () => {
|
|
78
|
-
while (nextIndex < blocks.length) {
|
|
79
|
-
const block = blocks[nextIndex++];
|
|
80
|
-
if (!block)
|
|
81
|
-
continue;
|
|
82
|
-
updates.push(await executeTool(block.toolUse, block.index));
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
await Promise.all(workers);
|
|
86
|
-
return updates;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=tool-orchestrator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool-orchestrator.js","sourceRoot":"","sources":["../../src/core/tool-orchestrator.ts"],"names":[],"mappings":"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"}
|