@nanocollective/nanocoder 1.22.4 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -30
- package/assets/nanocoder-vscode.vsix +0 -0
- package/dist/ai-sdk-client/chat/chat-handler.js +1 -1
- package/dist/ai-sdk-client/chat/chat-handler.js.map +1 -1
- package/dist/ai-sdk-client/chat/tool-processor.d.ts +1 -1
- package/dist/ai-sdk-client/chat/tool-processor.d.ts.map +1 -1
- package/dist/ai-sdk-client/chat/tool-processor.js +8 -3
- package/dist/ai-sdk-client/chat/tool-processor.js.map +1 -1
- package/dist/ai-sdk-client/error-handling/error-parser.d.ts.map +1 -1
- package/dist/ai-sdk-client/error-handling/error-parser.js +4 -1
- package/dist/ai-sdk-client/error-handling/error-parser.js.map +1 -1
- package/dist/app/App.d.ts.map +1 -1
- package/dist/app/App.js +106 -11
- package/dist/app/App.js.map +1 -1
- package/dist/app/components/chat-input.d.ts +6 -1
- package/dist/app/components/chat-input.d.ts.map +1 -1
- package/dist/app/components/chat-input.js +9 -7
- package/dist/app/components/chat-input.js.map +1 -1
- package/dist/app/utils/app-util.d.ts +5 -0
- package/dist/app/utils/app-util.d.ts.map +1 -1
- package/dist/app/utils/app-util.js +265 -0
- package/dist/app/utils/app-util.js.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +3 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/context-max.d.ts +15 -0
- package/dist/commands/context-max.d.ts.map +1 -0
- package/dist/commands/context-max.js +22 -0
- package/dist/commands/context-max.js.map +1 -0
- package/dist/commands/custom-commands.d.ts.map +1 -1
- package/dist/commands/custom-commands.js +88 -4
- package/dist/commands/custom-commands.js.map +1 -1
- package/dist/commands/exit.d.ts.map +1 -1
- package/dist/commands/exit.js +5 -8
- package/dist/commands/exit.js.map +1 -1
- package/dist/commands/ide.d.ts +3 -0
- package/dist/commands/ide.d.ts.map +1 -0
- package/dist/commands/ide.js +10 -0
- package/dist/commands/ide.js.map +1 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/schedule.d.ts +3 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +177 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +4 -3
- package/dist/commands/usage.js.map +1 -1
- package/dist/components/development-mode-indicator.d.ts +3 -2
- package/dist/components/development-mode-indicator.d.ts.map +1 -1
- package/dist/components/development-mode-indicator.js +23 -9
- package/dist/components/development-mode-indicator.js.map +1 -1
- package/dist/components/ide-selector.d.ts +7 -0
- package/dist/components/ide-selector.d.ts.map +1 -0
- package/dist/components/ide-selector.js +17 -0
- package/dist/components/ide-selector.js.map +1 -0
- package/dist/components/question-prompt.d.ts +8 -0
- package/dist/components/question-prompt.d.ts.map +1 -0
- package/dist/components/question-prompt.js +58 -0
- package/dist/components/question-prompt.js.map +1 -0
- package/dist/components/scheduler-view.d.ts +14 -0
- package/dist/components/scheduler-view.d.ts.map +1 -0
- package/dist/components/scheduler-view.js +17 -0
- package/dist/components/scheduler-view.js.map +1 -0
- package/dist/components/text-input.d.ts +13 -0
- package/dist/components/text-input.d.ts.map +1 -0
- package/dist/components/text-input.js +175 -0
- package/dist/components/text-input.js.map +1 -0
- package/dist/components/user-input.d.ts +2 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +8 -15
- package/dist/components/user-input.js.map +1 -1
- package/dist/config/themes.d.ts.map +1 -1
- package/dist/config/themes.js +20 -0
- package/dist/config/themes.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +55 -0
- package/dist/constants.js.map +1 -1
- package/dist/custom-commands/command-integration.d.ts +24 -0
- package/dist/custom-commands/command-integration.d.ts.map +1 -0
- package/dist/custom-commands/command-integration.js +68 -0
- package/dist/custom-commands/command-integration.js.map +1 -0
- package/dist/custom-commands/executor.d.ts.map +1 -1
- package/dist/custom-commands/executor.js +12 -2
- package/dist/custom-commands/executor.js.map +1 -1
- package/dist/custom-commands/loader.d.ts +33 -5
- package/dist/custom-commands/loader.d.ts.map +1 -1
- package/dist/custom-commands/loader.js +191 -18
- package/dist/custom-commands/loader.js.map +1 -1
- package/dist/custom-commands/parser.d.ts.map +1 -1
- package/dist/custom-commands/parser.js +115 -48
- package/dist/custom-commands/parser.js.map +1 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts +1 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts.map +1 -1
- package/dist/hooks/chat-handler/conversation/conversation-loop.js +37 -5
- package/dist/hooks/chat-handler/conversation/conversation-loop.js.map +1 -1
- package/dist/hooks/chat-handler/conversation/tool-executor.js +1 -1
- package/dist/hooks/chat-handler/conversation/tool-executor.js.map +1 -1
- package/dist/hooks/chat-handler/types.d.ts +3 -1
- package/dist/hooks/chat-handler/types.d.ts.map +1 -1
- package/dist/hooks/chat-handler/useChatHandler.d.ts +1 -1
- package/dist/hooks/chat-handler/useChatHandler.d.ts.map +1 -1
- package/dist/hooks/chat-handler/useChatHandler.js +13 -5
- package/dist/hooks/chat-handler/useChatHandler.js.map +1 -1
- package/dist/hooks/useAppHandlers.d.ts +2 -0
- package/dist/hooks/useAppHandlers.d.ts.map +1 -1
- package/dist/hooks/useAppHandlers.js +5 -0
- package/dist/hooks/useAppHandlers.js.map +1 -1
- package/dist/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/hooks/useAppInitialization.js +4 -1
- package/dist/hooks/useAppInitialization.js.map +1 -1
- package/dist/hooks/useAppState.d.ts +15 -0
- package/dist/hooks/useAppState.d.ts.map +1 -1
- package/dist/hooks/useAppState.js +23 -0
- package/dist/hooks/useAppState.js.map +1 -1
- package/dist/hooks/useContextPercentage.d.ts +17 -0
- package/dist/hooks/useContextPercentage.d.ts.map +1 -0
- package/dist/hooks/useContextPercentage.js +71 -0
- package/dist/hooks/useContextPercentage.js.map +1 -0
- package/dist/hooks/useModeHandlers.d.ts +4 -1
- package/dist/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/hooks/useModeHandlers.js +11 -1
- package/dist/hooks/useModeHandlers.js.map +1 -1
- package/dist/hooks/useNonInteractiveMode.d.ts.map +1 -1
- package/dist/hooks/useNonInteractiveMode.js +3 -1
- package/dist/hooks/useNonInteractiveMode.js.map +1 -1
- package/dist/hooks/useSchedulerMode.d.ts +30 -0
- package/dist/hooks/useSchedulerMode.d.ts.map +1 -0
- package/dist/hooks/useSchedulerMode.js +99 -0
- package/dist/hooks/useSchedulerMode.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts.map +1 -1
- package/dist/lsp/lsp-manager.js +10 -0
- package/dist/lsp/lsp-manager.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +20 -1
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/models-dev-client.d.ts +8 -1
- package/dist/models/models-dev-client.d.ts.map +1 -1
- package/dist/models/models-dev-client.js +116 -88
- package/dist/models/models-dev-client.js.map +1 -1
- package/dist/schedule/cron.d.ts +14 -0
- package/dist/schedule/cron.d.ts.map +1 -0
- package/dist/schedule/cron.js +107 -0
- package/dist/schedule/cron.js.map +1 -0
- package/dist/schedule/index.d.ts +4 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +4 -0
- package/dist/schedule/index.js.map +1 -0
- package/dist/schedule/runner.d.ts +42 -0
- package/dist/schedule/runner.d.ts.map +1 -0
- package/dist/schedule/runner.js +136 -0
- package/dist/schedule/runner.js.map +1 -0
- package/dist/schedule/storage.d.ts +9 -0
- package/dist/schedule/storage.d.ts.map +1 -0
- package/dist/schedule/storage.js +68 -0
- package/dist/schedule/storage.js.map +1 -0
- package/dist/schedule/types.d.ts +24 -0
- package/dist/schedule/types.d.ts.map +1 -0
- package/dist/schedule/types.js +2 -0
- package/dist/schedule/types.js.map +1 -0
- package/dist/services/bash-executor.d.ts.map +1 -1
- package/dist/services/bash-executor.js +5 -0
- package/dist/services/bash-executor.js.map +1 -1
- package/dist/tool-calling/json-parser.d.ts +7 -3
- package/dist/tool-calling/json-parser.d.ts.map +1 -1
- package/dist/tool-calling/json-parser.js +59 -23
- package/dist/tool-calling/json-parser.js.map +1 -1
- package/dist/tool-calling/tool-parser.d.ts +2 -2
- package/dist/tool-calling/tool-parser.d.ts.map +1 -1
- package/dist/tool-calling/tool-parser.js +27 -23
- package/dist/tool-calling/tool-parser.js.map +1 -1
- package/dist/tool-calling/xml-parser.d.ts +8 -4
- package/dist/tool-calling/xml-parser.d.ts.map +1 -1
- package/dist/tool-calling/xml-parser.js +15 -5
- package/dist/tool-calling/xml-parser.js.map +1 -1
- package/dist/tools/ask-question.d.ts +3 -0
- package/dist/tools/ask-question.d.ts.map +1 -0
- package/dist/tools/ask-question.js +66 -0
- package/dist/tools/ask-question.js.map +1 -0
- package/dist/tools/execute-bash.js +1 -1
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/file-ops/copy-file.d.ts +3 -0
- package/dist/tools/file-ops/copy-file.d.ts.map +1 -0
- package/dist/tools/file-ops/copy-file.js +126 -0
- package/dist/tools/file-ops/copy-file.js.map +1 -0
- package/dist/tools/file-ops/create-directory.d.ts +3 -0
- package/dist/tools/file-ops/create-directory.d.ts.map +1 -0
- package/dist/tools/file-ops/create-directory.js +76 -0
- package/dist/tools/file-ops/create-directory.js.map +1 -0
- package/dist/tools/file-ops/delete-file.d.ts +3 -0
- package/dist/tools/file-ops/delete-file.d.ts.map +1 -0
- package/dist/tools/file-ops/delete-file.js +88 -0
- package/dist/tools/file-ops/delete-file.js.map +1 -0
- package/dist/tools/file-ops/index.d.ts +3 -0
- package/dist/tools/file-ops/index.d.ts.map +1 -0
- package/dist/tools/file-ops/index.js +8 -0
- package/dist/tools/file-ops/index.js.map +1 -0
- package/dist/tools/file-ops/move-file.d.ts +3 -0
- package/dist/tools/file-ops/move-file.d.ts.map +1 -0
- package/dist/tools/file-ops/move-file.js +126 -0
- package/dist/tools/file-ops/move-file.js.map +1 -0
- package/dist/tools/file-ops/string-replace.d.ts +3 -0
- package/dist/tools/file-ops/string-replace.d.ts.map +1 -0
- package/dist/tools/{string-replace.js → file-ops/string-replace.js} +17 -17
- package/dist/tools/file-ops/string-replace.js.map +1 -0
- package/dist/tools/file-ops/write-file.d.ts +3 -0
- package/dist/tools/file-ops/write-file.d.ts.map +1 -0
- package/dist/tools/{write-file.js → file-ops/write-file.js} +31 -17
- package/dist/tools/file-ops/write-file.js.map +1 -0
- package/dist/tools/git/git-reset.js +1 -1
- package/dist/tools/git/git-reset.js.map +1 -1
- package/dist/tools/git/index.js +3 -3
- package/dist/tools/git/index.js.map +1 -1
- package/dist/tools/git/utils.d.ts +4 -0
- package/dist/tools/git/utils.d.ts.map +1 -1
- package/dist/tools/git/utils.js +12 -0
- package/dist/tools/git/utils.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +59 -10
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +9 -0
- package/dist/tools/tool-manager.js.map +1 -1
- package/dist/types/app.d.ts +2 -0
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/commands.d.ts +20 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/core.d.ts +2 -1
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +7 -0
- package/dist/types/core.js.map +1 -1
- package/dist/types/ui.d.ts +1 -1
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/utils/auto-compact.d.ts.map +1 -1
- package/dist/utils/auto-compact.js +13 -7
- package/dist/utils/auto-compact.js.map +1 -1
- package/dist/utils/file-content-loader.d.ts.map +1 -1
- package/dist/utils/file-content-loader.js +58 -1
- package/dist/utils/file-content-loader.js.map +1 -1
- package/dist/utils/logging/index.d.ts.map +1 -1
- package/dist/utils/logging/index.js +18 -30
- package/dist/utils/logging/index.js.map +1 -1
- package/dist/utils/question-queue.d.ts +15 -0
- package/dist/utils/question-queue.d.ts.map +1 -0
- package/dist/utils/question-queue.js +25 -0
- package/dist/utils/question-queue.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +108 -0
- package/dist/utils/response-formatter.d.ts.map +1 -0
- package/dist/utils/response-formatter.js +387 -0
- package/dist/utils/response-formatter.js.map +1 -0
- package/dist/utils/shutdown/index.d.ts +7 -0
- package/dist/utils/shutdown/index.d.ts.map +1 -0
- package/dist/utils/shutdown/index.js +6 -0
- package/dist/utils/shutdown/index.js.map +1 -0
- package/dist/utils/shutdown/shutdown-manager.d.ts +19 -0
- package/dist/utils/shutdown/shutdown-manager.d.ts.map +1 -0
- package/dist/utils/shutdown/shutdown-manager.js +100 -0
- package/dist/utils/shutdown/shutdown-manager.js.map +1 -0
- package/dist/utils/shutdown/types.d.ts +9 -0
- package/dist/utils/shutdown/types.d.ts.map +1 -0
- package/dist/utils/shutdown/types.js +2 -0
- package/dist/utils/shutdown/types.js.map +1 -0
- package/dist/utils/type-helpers.d.ts +140 -0
- package/dist/utils/type-helpers.d.ts.map +1 -0
- package/dist/utils/type-helpers.js +220 -0
- package/dist/utils/type-helpers.js.map +1 -0
- package/dist/utils/url-utils.d.ts +6 -0
- package/dist/utils/url-utils.d.ts.map +1 -0
- package/dist/utils/url-utils.js +22 -0
- package/dist/utils/url-utils.js.map +1 -0
- package/dist/vscode/vscode-server.d.ts.map +1 -1
- package/dist/vscode/vscode-server.js +10 -0
- package/dist/vscode/vscode-server.js.map +1 -1
- package/dist/wizards/steps/mcp-step.js +1 -1
- package/dist/wizards/steps/mcp-step.js.map +1 -1
- package/dist/wizards/steps/provider-step.js +1 -1
- package/dist/wizards/steps/provider-step.js.map +1 -1
- package/dist/wizards/templates/mcp-templates.d.ts.map +1 -1
- package/dist/wizards/templates/mcp-templates.js +8 -6
- package/dist/wizards/templates/mcp-templates.js.map +1 -1
- package/dist/wizards/templates/provider-templates.d.ts.map +1 -1
- package/dist/wizards/templates/provider-templates.js +35 -2
- package/dist/wizards/templates/provider-templates.js.map +1 -1
- package/dist/wizards/validation.d.ts.map +1 -1
- package/dist/wizards/validation.js +2 -3
- package/dist/wizards/validation.js.map +1 -1
- package/package.json +9 -18
- package/source/app/prompts/main-prompt.md +21 -3
- package/dist/hooks/chat-handler/utils/context-checker.d.ts +0 -15
- package/dist/hooks/chat-handler/utils/context-checker.d.ts.map +0 -1
- package/dist/hooks/chat-handler/utils/context-checker.js +0 -68
- package/dist/hooks/chat-handler/utils/context-checker.js.map +0 -1
- package/dist/tools/string-replace.d.ts +0 -3
- package/dist/tools/string-replace.d.ts.map +0 -1
- package/dist/tools/string-replace.js.map +0 -1
- package/dist/tools/write-file.d.ts +0 -3
- package/dist/tools/write-file.d.ts.map +0 -1
- package/dist/tools/write-file.js.map +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { Cron } from 'croner';
|
|
4
|
+
import { parseCommandFile } from '../custom-commands/parser.js';
|
|
5
|
+
import { addScheduleRun, generateScheduleId, loadSchedules, saveSchedules, updateScheduleRun, } from './storage.js';
|
|
6
|
+
export class ScheduleRunner {
|
|
7
|
+
cronJobs = new Map();
|
|
8
|
+
queue = [];
|
|
9
|
+
isRunning = false;
|
|
10
|
+
isProcessing = false;
|
|
11
|
+
callbacks;
|
|
12
|
+
constructor(callbacks) {
|
|
13
|
+
this.callbacks = callbacks;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Start all scheduled cron jobs
|
|
17
|
+
*/
|
|
18
|
+
async start() {
|
|
19
|
+
if (this.isRunning)
|
|
20
|
+
return;
|
|
21
|
+
this.isRunning = true;
|
|
22
|
+
const schedules = await loadSchedules();
|
|
23
|
+
const enabledSchedules = schedules.filter(s => s.enabled);
|
|
24
|
+
for (const schedule of enabledSchedules) {
|
|
25
|
+
this.registerCronJob(schedule);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stop all cron jobs and clear the queue
|
|
30
|
+
*/
|
|
31
|
+
stop() {
|
|
32
|
+
this.isRunning = false;
|
|
33
|
+
for (const [, job] of this.cronJobs) {
|
|
34
|
+
job.stop();
|
|
35
|
+
}
|
|
36
|
+
this.cronJobs.clear();
|
|
37
|
+
this.queue = [];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get the number of active cron jobs
|
|
41
|
+
*/
|
|
42
|
+
getActiveJobCount() {
|
|
43
|
+
return this.cronJobs.size;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the current queue length
|
|
47
|
+
*/
|
|
48
|
+
getQueueLength() {
|
|
49
|
+
return this.queue.length;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if currently processing a job
|
|
53
|
+
*/
|
|
54
|
+
getIsProcessing() {
|
|
55
|
+
return this.isProcessing;
|
|
56
|
+
}
|
|
57
|
+
registerCronJob(schedule) {
|
|
58
|
+
const job = new Cron(schedule.cron, () => {
|
|
59
|
+
this.enqueueJob(schedule);
|
|
60
|
+
});
|
|
61
|
+
this.cronJobs.set(schedule.id, job);
|
|
62
|
+
}
|
|
63
|
+
enqueueJob(schedule) {
|
|
64
|
+
// Don't duplicate — if this schedule is already queued, skip
|
|
65
|
+
if (this.queue.some(s => s.id === schedule.id))
|
|
66
|
+
return;
|
|
67
|
+
this.queue.push(schedule);
|
|
68
|
+
void this.processQueue();
|
|
69
|
+
}
|
|
70
|
+
async processQueue() {
|
|
71
|
+
if (this.isProcessing || this.queue.length === 0)
|
|
72
|
+
return;
|
|
73
|
+
this.isProcessing = true;
|
|
74
|
+
while (this.queue.length > 0 && this.isRunning) {
|
|
75
|
+
const schedule = this.queue.shift();
|
|
76
|
+
if (schedule) {
|
|
77
|
+
await this.executeJob(schedule);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
this.isProcessing = false;
|
|
81
|
+
}
|
|
82
|
+
async executeJob(schedule) {
|
|
83
|
+
const run = {
|
|
84
|
+
id: `run-${generateScheduleId()}`,
|
|
85
|
+
scheduleId: schedule.id,
|
|
86
|
+
command: schedule.command,
|
|
87
|
+
startedAt: new Date().toISOString(),
|
|
88
|
+
completedAt: null,
|
|
89
|
+
status: 'running',
|
|
90
|
+
};
|
|
91
|
+
await addScheduleRun(run);
|
|
92
|
+
this.callbacks.onJobStart(schedule);
|
|
93
|
+
try {
|
|
94
|
+
// Clear messages for fresh context
|
|
95
|
+
await this.callbacks.clearMessages();
|
|
96
|
+
// Load the schedule file from .nanocoder/schedules/
|
|
97
|
+
const filePath = join(process.cwd(), '.nanocoder', 'schedules', schedule.command);
|
|
98
|
+
if (!existsSync(filePath)) {
|
|
99
|
+
throw new Error(`Schedule file not found: ${schedule.command}. Ensure it exists in .nanocoder/schedules/`);
|
|
100
|
+
}
|
|
101
|
+
const parsed = parseCommandFile(filePath);
|
|
102
|
+
const prompt = `[Executing scheduled command: ${schedule.command}]\n\n${parsed.content}`;
|
|
103
|
+
await this.callbacks.handleMessageSubmit(prompt);
|
|
104
|
+
// Wait for the conversation to complete
|
|
105
|
+
await this.callbacks.waitForConversationComplete();
|
|
106
|
+
// Update run status
|
|
107
|
+
run.completedAt = new Date().toISOString();
|
|
108
|
+
run.status = 'success';
|
|
109
|
+
await updateScheduleRun(run.id, {
|
|
110
|
+
completedAt: run.completedAt,
|
|
111
|
+
status: 'success',
|
|
112
|
+
});
|
|
113
|
+
// Update lastRunAt on the schedule
|
|
114
|
+
const schedules = await loadSchedules();
|
|
115
|
+
const idx = schedules.findIndex(s => s.id === schedule.id);
|
|
116
|
+
if (idx !== -1 && schedules[idx]) {
|
|
117
|
+
schedules[idx].lastRunAt = run.completedAt;
|
|
118
|
+
await saveSchedules(schedules);
|
|
119
|
+
}
|
|
120
|
+
this.callbacks.onJobComplete(schedule, run);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
124
|
+
run.completedAt = new Date().toISOString();
|
|
125
|
+
run.status = 'error';
|
|
126
|
+
run.error = errorMsg;
|
|
127
|
+
await updateScheduleRun(run.id, {
|
|
128
|
+
completedAt: run.completedAt,
|
|
129
|
+
status: 'error',
|
|
130
|
+
error: errorMsg,
|
|
131
|
+
});
|
|
132
|
+
this.callbacks.onJobError(schedule, errorMsg);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../source/schedule/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Schedule, ScheduleRun } from './types.js';
|
|
2
|
+
export declare function generateScheduleId(): string;
|
|
3
|
+
export declare function loadSchedules(): Promise<Schedule[]>;
|
|
4
|
+
export declare function saveSchedules(schedules: Schedule[]): Promise<void>;
|
|
5
|
+
export declare function loadScheduleRuns(): Promise<ScheduleRun[]>;
|
|
6
|
+
export declare function saveScheduleRuns(runs: ScheduleRun[]): Promise<void>;
|
|
7
|
+
export declare function addScheduleRun(run: ScheduleRun): Promise<void>;
|
|
8
|
+
export declare function updateScheduleRun(runId: string, updates: Partial<Pick<ScheduleRun, 'completedAt' | 'status' | 'error'>>): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../source/schedule/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,QAAQ,EACR,WAAW,EAGX,MAAM,SAAS,CAAC;AAejB,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CASzD;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAS/D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE;AAED,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,GACrE,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const SCHEDULES_DIR = '.nanocoder';
|
|
5
|
+
const SCHEDULES_FILE = 'schedules.json';
|
|
6
|
+
const SCHEDULE_RUNS_FILE = 'schedule-runs.json';
|
|
7
|
+
const MAX_RUNS = 100;
|
|
8
|
+
function getSchedulesPath() {
|
|
9
|
+
return join(process.cwd(), SCHEDULES_DIR, SCHEDULES_FILE);
|
|
10
|
+
}
|
|
11
|
+
function getScheduleRunsPath() {
|
|
12
|
+
return join(process.cwd(), SCHEDULES_DIR, SCHEDULE_RUNS_FILE);
|
|
13
|
+
}
|
|
14
|
+
export function generateScheduleId() {
|
|
15
|
+
return randomUUID().slice(0, 8);
|
|
16
|
+
}
|
|
17
|
+
export async function loadSchedules() {
|
|
18
|
+
try {
|
|
19
|
+
const path = getSchedulesPath();
|
|
20
|
+
const content = await readFile(path, 'utf-8');
|
|
21
|
+
const data = JSON.parse(content);
|
|
22
|
+
return data.schedules ?? [];
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function saveSchedules(schedules) {
|
|
29
|
+
const dirPath = join(process.cwd(), SCHEDULES_DIR);
|
|
30
|
+
await mkdir(dirPath, { recursive: true });
|
|
31
|
+
const path = getSchedulesPath();
|
|
32
|
+
const data = { schedules };
|
|
33
|
+
await writeFile(path, JSON.stringify(data, null, 2), 'utf-8');
|
|
34
|
+
}
|
|
35
|
+
export async function loadScheduleRuns() {
|
|
36
|
+
try {
|
|
37
|
+
const path = getScheduleRunsPath();
|
|
38
|
+
const content = await readFile(path, 'utf-8');
|
|
39
|
+
const data = JSON.parse(content);
|
|
40
|
+
return data.runs ?? [];
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function saveScheduleRuns(runs) {
|
|
47
|
+
const dirPath = join(process.cwd(), SCHEDULES_DIR);
|
|
48
|
+
await mkdir(dirPath, { recursive: true });
|
|
49
|
+
const path = getScheduleRunsPath();
|
|
50
|
+
// Cap at MAX_RUNS entries
|
|
51
|
+
const cappedRuns = runs.slice(-MAX_RUNS);
|
|
52
|
+
const data = { runs: cappedRuns };
|
|
53
|
+
await writeFile(path, JSON.stringify(data, null, 2), 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
export async function addScheduleRun(run) {
|
|
56
|
+
const runs = await loadScheduleRuns();
|
|
57
|
+
runs.push(run);
|
|
58
|
+
await saveScheduleRuns(runs);
|
|
59
|
+
}
|
|
60
|
+
export async function updateScheduleRun(runId, updates) {
|
|
61
|
+
const runs = await loadScheduleRuns();
|
|
62
|
+
const index = runs.findIndex(r => r.id === runId);
|
|
63
|
+
if (index !== -1) {
|
|
64
|
+
runs[index] = { ...runs[index], ...updates };
|
|
65
|
+
await saveScheduleRuns(runs);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../source/schedule/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface Schedule {
|
|
2
|
+
id: string;
|
|
3
|
+
cron: string;
|
|
4
|
+
command: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
lastRunAt: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface ScheduleRun {
|
|
10
|
+
id: string;
|
|
11
|
+
scheduleId: string;
|
|
12
|
+
command: string;
|
|
13
|
+
startedAt: string;
|
|
14
|
+
completedAt: string | null;
|
|
15
|
+
status: 'running' | 'success' | 'error';
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SchedulesData {
|
|
19
|
+
schedules: Schedule[];
|
|
20
|
+
}
|
|
21
|
+
export interface ScheduleRunsData {
|
|
22
|
+
runs: ScheduleRun[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../source/schedule/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,WAAW,EAAE,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../source/schedule/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-executor.d.ts","sourceRoot":"","sources":["../../source/services/bash-executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAUzC,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AASD,qBAAa,YAAa,SAAQ,YAAY;IAC7C,OAAO,CAAC,UAAU,CAAqC;IAEvD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;KACrC;
|
|
1
|
+
{"version":3,"file":"bash-executor.d.ts","sourceRoot":"","sources":["../../source/services/bash-executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAUzC,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AASD,qBAAa,YAAa,SAAQ,YAAY;IAC7C,OAAO,CAAC,UAAU,CAAqC;IAEvD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;KACrC;IAiFD,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAuBpC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAK7D,mBAAmB,IAAI,OAAO;IAI9B,qBAAqB,IAAI,MAAM,EAAE;CAGjC;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -25,9 +25,14 @@ export class BashExecutor extends EventEmitter {
|
|
|
25
25
|
proc.stdout.on('data', (data) => {
|
|
26
26
|
state.fullOutput += data.toString();
|
|
27
27
|
state.outputPreview = state.fullOutput.slice(-BASH_OUTPUT_PREVIEW_LENGTH);
|
|
28
|
+
// Emit progress immediately when output is received
|
|
29
|
+
// This ensures fast commands still show streaming output
|
|
30
|
+
this.emit('progress', { ...state });
|
|
28
31
|
});
|
|
29
32
|
proc.stderr.on('data', (data) => {
|
|
30
33
|
state.stderr += data.toString();
|
|
34
|
+
// Emit progress immediately when stderr is received
|
|
35
|
+
this.emit('progress', { ...state });
|
|
31
36
|
});
|
|
32
37
|
// Progress interval - emit updates every 500ms
|
|
33
38
|
// Using unref() so this interval doesn't prevent Node.js from exiting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../source/services/bash-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AAEtC,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,GACzB,MAAM,aAAa,CAAC;AAErB,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO,CAAC;AAoBvC,MAAM,OAAO,YAAa,SAAQ,YAAY;IACrC,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEvD,OAAO,CAAC,OAAe;QAItB,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;QAEjC,MAAM,KAAK,GAAuB;YACjC,WAAW;YACX,OAAO;YACP,aAAa,EAAE,EAAE;YACjB,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;SACX,CAAC;QAEF,MAAM,IAAI,GAAG,SAAS;YACrB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAEhC,iBAAiB;QACjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,0BAA0B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../source/services/bash-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,23 +2,27 @@ import type { ToolCall } from '../types/index.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Internal JSON tool call parser
|
|
4
4
|
* Note: This is now an internal utility. Use tool-parser.ts for public API.
|
|
5
|
+
* Type-preserving: Preserves object types in memory while converting to string for processing
|
|
5
6
|
*/
|
|
6
7
|
/**
|
|
7
8
|
* Detects malformed JSON tool call attempts and returns error details
|
|
8
9
|
* Returns null if no malformed tool calls detected
|
|
10
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
9
11
|
*/
|
|
10
|
-
export declare function detectMalformedJSONToolCall(content:
|
|
12
|
+
export declare function detectMalformedJSONToolCall(content: unknown): {
|
|
11
13
|
error: string;
|
|
12
14
|
examples: string;
|
|
13
15
|
} | null;
|
|
14
16
|
/**
|
|
15
17
|
* Parses JSON-formatted tool calls from content
|
|
18
|
+
* Type-preserving: Preserves object types in memory while converting to string for processing
|
|
16
19
|
* This is an internal function - use tool-parser.ts for public API
|
|
17
20
|
*/
|
|
18
|
-
export declare function parseJSONToolCalls(content:
|
|
21
|
+
export declare function parseJSONToolCalls(content: unknown): ToolCall[];
|
|
19
22
|
/**
|
|
20
23
|
* Cleans content by removing tool call JSON blocks
|
|
24
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
21
25
|
* This is an internal function - use tool-parser.ts for public API
|
|
22
26
|
*/
|
|
23
|
-
export declare function cleanJSONToolCalls(content:
|
|
27
|
+
export declare function cleanJSONToolCalls(content: unknown, toolCalls: ToolCall[]): string;
|
|
24
28
|
//# sourceMappingURL=json-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"json-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAG5C;;;;GAIG;AAEH;;;;GAIG;AACH,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,OAAO,GACd;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CA2C1C;AASD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE,CA6H/D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,QAAQ,EAAE,GACnB,MAAM,CA0DR"}
|
|
@@ -1,35 +1,45 @@
|
|
|
1
|
+
import { ensureString } from '../utils/type-helpers.js';
|
|
1
2
|
/**
|
|
2
3
|
* Internal JSON tool call parser
|
|
3
4
|
* Note: This is now an internal utility. Use tool-parser.ts for public API.
|
|
5
|
+
* Type-preserving: Preserves object types in memory while converting to string for processing
|
|
4
6
|
*/
|
|
5
7
|
/**
|
|
6
8
|
* Detects malformed JSON tool call attempts and returns error details
|
|
7
9
|
* Returns null if no malformed tool calls detected
|
|
10
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
8
11
|
*/
|
|
9
12
|
export function detectMalformedJSONToolCall(content) {
|
|
13
|
+
// Type guard: ensure content is string for processing operations
|
|
14
|
+
// BUT original type is preserved in memory via the ToolCall structure
|
|
15
|
+
const contentStr = ensureString(content);
|
|
10
16
|
// Check for incomplete JSON structures
|
|
17
|
+
// FIX: Anchor to line start (?:^|\n) to avoid matching inline text like "I tried {"name":...}"
|
|
11
18
|
const patterns = [
|
|
12
19
|
{
|
|
13
20
|
// Incomplete JSON with name but missing arguments
|
|
14
|
-
|
|
21
|
+
// Anchored to line start or after newline
|
|
22
|
+
regex: /(?:^|\n)\s*\{\s*"name"\s*:\s*"[^"]+"\s*,?\s*\}/,
|
|
15
23
|
error: 'Incomplete tool call: missing "arguments" field',
|
|
16
24
|
hint: 'Tool calls must include both "name" and "arguments" fields',
|
|
17
25
|
},
|
|
18
26
|
{
|
|
19
27
|
// Incomplete JSON with arguments but missing name
|
|
20
|
-
|
|
28
|
+
// Anchored to line start or after newline
|
|
29
|
+
regex: /(?:^|\n)\s*\{\s*"arguments"\s*:\s*\{[^}]*\}\s*\}/,
|
|
21
30
|
error: 'Incomplete tool call: missing "name" field',
|
|
22
31
|
hint: 'Tool calls must include both "name" and "arguments" fields',
|
|
23
32
|
},
|
|
24
33
|
{
|
|
25
34
|
// Malformed arguments (not an object)
|
|
26
|
-
|
|
35
|
+
// Anchored to line start or after newline
|
|
36
|
+
regex: /(?:^|\n)\s*\{\s*"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*"[^"]*"\s*\}/,
|
|
27
37
|
error: 'Invalid tool call: "arguments" must be an object, not a string',
|
|
28
38
|
hint: 'Use {"name": "tool_name", "arguments": {...}} format',
|
|
29
39
|
},
|
|
30
40
|
];
|
|
31
41
|
for (const pattern of patterns) {
|
|
32
|
-
const match =
|
|
42
|
+
const match = contentStr.match(pattern.regex);
|
|
33
43
|
if (match) {
|
|
34
44
|
return {
|
|
35
45
|
error: pattern.error,
|
|
@@ -47,11 +57,14 @@ function getCorrectJSONFormatExamples(_specificHint) {
|
|
|
47
57
|
}
|
|
48
58
|
/**
|
|
49
59
|
* Parses JSON-formatted tool calls from content
|
|
60
|
+
* Type-preserving: Preserves object types in memory while converting to string for processing
|
|
50
61
|
* This is an internal function - use tool-parser.ts for public API
|
|
51
62
|
*/
|
|
52
63
|
export function parseJSONToolCalls(content) {
|
|
64
|
+
// Convert to string for processing (this is done by the Formatter before calling this)
|
|
65
|
+
const contentStr = ensureString(content);
|
|
53
66
|
const extractedCalls = [];
|
|
54
|
-
let trimmedContent =
|
|
67
|
+
let trimmedContent = contentStr.trim();
|
|
55
68
|
// Handle markdown code blocks
|
|
56
69
|
const codeBlockMatch = trimmedContent.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```$/);
|
|
57
70
|
if (codeBlockMatch && codeBlockMatch[1]) {
|
|
@@ -66,11 +79,17 @@ export function parseJSONToolCalls(content) {
|
|
|
66
79
|
try {
|
|
67
80
|
const parsed = JSON.parse(trimmedContent);
|
|
68
81
|
if (parsed.name && parsed.arguments !== undefined) {
|
|
82
|
+
// Reject null, undefined, or non-object arguments
|
|
83
|
+
if (parsed.arguments === null ||
|
|
84
|
+
typeof parsed.arguments !== 'object' ||
|
|
85
|
+
Array.isArray(parsed.arguments)) {
|
|
86
|
+
return extractedCalls;
|
|
87
|
+
}
|
|
69
88
|
const toolCall = {
|
|
70
89
|
id: `call_${Date.now()}`,
|
|
71
90
|
function: {
|
|
72
91
|
name: parsed.name || '',
|
|
73
|
-
arguments: parsed.arguments
|
|
92
|
+
arguments: parsed.arguments, // Type preserved in memory!
|
|
74
93
|
},
|
|
75
94
|
};
|
|
76
95
|
extractedCalls.push(toolCall);
|
|
@@ -84,15 +103,21 @@ export function parseJSONToolCalls(content) {
|
|
|
84
103
|
// Look for standalone JSON blocks in the content (multiline without code blocks)
|
|
85
104
|
const jsonBlockRegex = /\{\s*\n\s*"name":\s*"([^"]+)",\s*\n\s*"arguments":\s*\{[\s\S]*?\}\s*\n\s*\}/g;
|
|
86
105
|
let jsonMatch;
|
|
87
|
-
while ((jsonMatch = jsonBlockRegex.exec(
|
|
106
|
+
while ((jsonMatch = jsonBlockRegex.exec(contentStr)) !== null) {
|
|
88
107
|
try {
|
|
89
108
|
const parsed = JSON.parse(jsonMatch[0]);
|
|
90
109
|
if (parsed.name && parsed.arguments !== undefined) {
|
|
110
|
+
// Reject null, undefined, or non-object arguments
|
|
111
|
+
if (parsed.arguments === null ||
|
|
112
|
+
typeof parsed.arguments !== 'object' ||
|
|
113
|
+
Array.isArray(parsed.arguments)) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
91
116
|
const toolCall = {
|
|
92
117
|
id: `call_${Date.now()}_${extractedCalls.length}`,
|
|
93
118
|
function: {
|
|
94
119
|
name: parsed.name || '',
|
|
95
|
-
arguments: parsed.arguments
|
|
120
|
+
arguments: parsed.arguments, // Type preserved in memory!
|
|
96
121
|
},
|
|
97
122
|
};
|
|
98
123
|
extractedCalls.push(toolCall);
|
|
@@ -108,26 +133,33 @@ export function parseJSONToolCalls(content) {
|
|
|
108
133
|
];
|
|
109
134
|
for (const pattern of toolCallPatterns) {
|
|
110
135
|
let match;
|
|
111
|
-
while ((match = pattern.exec(
|
|
136
|
+
while ((match = pattern.exec(contentStr)) !== null) {
|
|
112
137
|
const [, name, argsStr] = match;
|
|
113
138
|
try {
|
|
114
|
-
let args;
|
|
139
|
+
let args = null;
|
|
140
|
+
// Only parse if arguments is a JSON object
|
|
115
141
|
if (argsStr && argsStr.startsWith('{')) {
|
|
116
|
-
|
|
142
|
+
const parsed = JSON.parse(argsStr || '{}');
|
|
143
|
+
// Ensure arguments is a non-null object (not null, undefined, primitive, or array)
|
|
144
|
+
if (parsed !== null &&
|
|
145
|
+
typeof parsed === 'object' &&
|
|
146
|
+
!Array.isArray(parsed)) {
|
|
147
|
+
args = parsed; // Type preserved in memory!
|
|
148
|
+
}
|
|
117
149
|
}
|
|
118
|
-
|
|
119
|
-
|
|
150
|
+
// Only add tool call if we have a valid object
|
|
151
|
+
if (args !== null) {
|
|
152
|
+
extractedCalls.push({
|
|
153
|
+
id: `call_${Date.now()}_${extractedCalls.length}`,
|
|
154
|
+
function: {
|
|
155
|
+
name: name || '',
|
|
156
|
+
arguments: args, // Type preserved in memory!
|
|
157
|
+
},
|
|
158
|
+
});
|
|
120
159
|
}
|
|
121
|
-
extractedCalls.push({
|
|
122
|
-
id: `call_${Date.now()}_${extractedCalls.length}`,
|
|
123
|
-
function: {
|
|
124
|
-
name: name || '',
|
|
125
|
-
arguments: args,
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
160
|
}
|
|
129
161
|
catch {
|
|
130
|
-
// Failed to parse -
|
|
162
|
+
// Failed to parse - skip this tool call
|
|
131
163
|
}
|
|
132
164
|
}
|
|
133
165
|
}
|
|
@@ -135,12 +167,16 @@ export function parseJSONToolCalls(content) {
|
|
|
135
167
|
}
|
|
136
168
|
/**
|
|
137
169
|
* Cleans content by removing tool call JSON blocks
|
|
170
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
138
171
|
* This is an internal function - use tool-parser.ts for public API
|
|
139
172
|
*/
|
|
140
173
|
export function cleanJSONToolCalls(content, toolCalls) {
|
|
174
|
+
// Type guard: ensure content is string for processing operations
|
|
175
|
+
// BUT original type is preserved in memory via the ToolCall structure
|
|
176
|
+
const contentStr = ensureString(content);
|
|
141
177
|
if (toolCalls.length === 0)
|
|
142
|
-
return
|
|
143
|
-
let cleanedContent =
|
|
178
|
+
return contentStr;
|
|
179
|
+
let cleanedContent = contentStr;
|
|
144
180
|
// Handle markdown code blocks that contain only tool calls
|
|
145
181
|
const codeBlockRegex = /```(?:json)?\s*\n?([\s\S]*?)\n?```/g;
|
|
146
182
|
cleanedContent = cleanedContent.replace(codeBlockRegex, (match, blockContent) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-parser.js","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-parser.js","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@ type ParseResult = {
|
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
15
|
* Unified tool call parser that tries XML first, then falls back to JSON
|
|
16
|
-
*
|
|
16
|
+
* Type-preserving: Accepts unknown type, converts to string for processing
|
|
17
17
|
*/
|
|
18
|
-
export declare function parseToolCalls(content:
|
|
18
|
+
export declare function parseToolCalls(content: unknown): ParseResult;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=tool-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAmC5C;;GAEG;AACH,KAAK,WAAW,GACb;IACA,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACtB,GACD;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAgE5D"}
|