@dotsetlabs/dotclaw 1.3.0 → 1.5.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.
Files changed (79) hide show
  1. package/README.md +9 -0
  2. package/config-examples/runtime.json +106 -3
  3. package/container/agent-runner/package-lock.json +2 -2
  4. package/container/agent-runner/package.json +1 -1
  5. package/container/agent-runner/src/agent-config.ts +20 -2
  6. package/container/agent-runner/src/container-protocol.ts +11 -0
  7. package/container/agent-runner/src/index.ts +128 -11
  8. package/container/agent-runner/src/tools.ts +84 -5
  9. package/dist/agent-context.d.ts +5 -0
  10. package/dist/agent-context.d.ts.map +1 -1
  11. package/dist/agent-context.js +19 -8
  12. package/dist/agent-context.js.map +1 -1
  13. package/dist/agent-execution.d.ts +6 -0
  14. package/dist/agent-execution.d.ts.map +1 -1
  15. package/dist/agent-execution.js +61 -4
  16. package/dist/agent-execution.js.map +1 -1
  17. package/dist/background-job-classifier.d.ts +4 -0
  18. package/dist/background-job-classifier.d.ts.map +1 -1
  19. package/dist/background-job-classifier.js +36 -15
  20. package/dist/background-job-classifier.js.map +1 -1
  21. package/dist/background-jobs.d.ts.map +1 -1
  22. package/dist/background-jobs.js +81 -4
  23. package/dist/background-jobs.js.map +1 -1
  24. package/dist/cli.js +343 -11
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config.d.ts +0 -2
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +0 -3
  29. package/dist/config.js.map +1 -1
  30. package/dist/container-protocol.d.ts +11 -0
  31. package/dist/container-protocol.d.ts.map +1 -1
  32. package/dist/container-runner.d.ts.map +1 -1
  33. package/dist/container-runner.js +9 -1
  34. package/dist/container-runner.js.map +1 -1
  35. package/dist/dashboard.d.ts +5 -0
  36. package/dist/dashboard.d.ts.map +1 -1
  37. package/dist/dashboard.js +58 -8
  38. package/dist/dashboard.js.map +1 -1
  39. package/dist/db.d.ts +11 -0
  40. package/dist/db.d.ts.map +1 -1
  41. package/dist/db.js +36 -0
  42. package/dist/db.js.map +1 -1
  43. package/dist/index.js +300 -37
  44. package/dist/index.js.map +1 -1
  45. package/dist/json-helpers.d.ts +6 -0
  46. package/dist/json-helpers.d.ts.map +1 -0
  47. package/dist/json-helpers.js +17 -0
  48. package/dist/json-helpers.js.map +1 -0
  49. package/dist/logger.d.ts +0 -1
  50. package/dist/logger.d.ts.map +1 -1
  51. package/dist/logger.js +1 -1
  52. package/dist/logger.js.map +1 -1
  53. package/dist/metrics.d.ts +3 -0
  54. package/dist/metrics.d.ts.map +1 -1
  55. package/dist/metrics.js +35 -1
  56. package/dist/metrics.js.map +1 -1
  57. package/dist/planner-probe.d.ts +14 -0
  58. package/dist/planner-probe.d.ts.map +1 -0
  59. package/dist/planner-probe.js +97 -0
  60. package/dist/planner-probe.js.map +1 -0
  61. package/dist/progress.d.ts +27 -0
  62. package/dist/progress.d.ts.map +1 -1
  63. package/dist/progress.js +151 -0
  64. package/dist/progress.js.map +1 -1
  65. package/dist/request-router.d.ts +34 -0
  66. package/dist/request-router.d.ts.map +1 -0
  67. package/dist/request-router.js +148 -0
  68. package/dist/request-router.js.map +1 -0
  69. package/dist/runtime-config.d.ts +67 -0
  70. package/dist/runtime-config.d.ts.map +1 -1
  71. package/dist/runtime-config.js +177 -14
  72. package/dist/runtime-config.js.map +1 -1
  73. package/dist/task-scheduler.d.ts.map +1 -1
  74. package/dist/task-scheduler.js +56 -9
  75. package/dist/task-scheduler.js.map +1 -1
  76. package/dist/trace-writer.d.ts +1 -0
  77. package/dist/trace-writer.d.ts.map +1 -1
  78. package/dist/trace-writer.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ import type { NewMessage } from './types.js';
2
+ export type PlannerProbeResult = {
3
+ shouldBackground: boolean;
4
+ steps: string[];
5
+ tools: string[];
6
+ latencyMs?: number;
7
+ model?: string;
8
+ error?: string;
9
+ };
10
+ export declare function probePlanner(params: {
11
+ lastMessage: NewMessage;
12
+ recentMessages: NewMessage[];
13
+ }): Promise<PlannerProbeResult>;
14
+ //# sourceMappingURL=planner-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner-probe.d.ts","sourceRoot":"","sources":["../src/planner-probe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAsBF,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,WAAW,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,UAAU,EAAE,CAAC;CAC9B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2E9B"}
@@ -0,0 +1,97 @@
1
+ import { loadRuntimeConfig } from './runtime-config.js';
2
+ import { extractJson } from './json-helpers.js';
3
+ const PLANNER_SYSTEM_PROMPT = [
4
+ 'You are a planning router for DotClaw.',
5
+ 'Given a user request, produce a concise plan in JSON.',
6
+ 'Return JSON only with keys:',
7
+ '- steps: array of short action steps',
8
+ '- tools: array of tool names you expect to use (if any)',
9
+ 'Keep arrays short. Use empty arrays if not needed.'
10
+ ].join('\n');
11
+ function buildPlannerPayload(params) {
12
+ const recent = params.recentMessages.slice(-4).map(m => ({
13
+ sender: m.sender_name,
14
+ content: m.content
15
+ }));
16
+ return JSON.stringify({
17
+ last_message: params.lastMessage.content,
18
+ recent_messages: recent
19
+ });
20
+ }
21
+ export async function probePlanner(params) {
22
+ const runtime = loadRuntimeConfig();
23
+ const config = runtime.host.routing.plannerProbe;
24
+ if (!config.enabled) {
25
+ return { shouldBackground: false, steps: [], tools: [] };
26
+ }
27
+ const apiKey = process.env.OPENROUTER_API_KEY;
28
+ if (!apiKey) {
29
+ return { shouldBackground: false, steps: [], tools: [], error: 'OPENROUTER_API_KEY is not set' };
30
+ }
31
+ const input = buildPlannerPayload(params);
32
+ const controller = new AbortController();
33
+ const timeout = setTimeout(() => controller.abort(), config.timeoutMs);
34
+ const startedAt = Date.now();
35
+ try {
36
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Content-Type': 'application/json',
40
+ Authorization: `Bearer ${apiKey}`
41
+ },
42
+ body: JSON.stringify({
43
+ model: config.model,
44
+ messages: [
45
+ { role: 'system', content: PLANNER_SYSTEM_PROMPT },
46
+ { role: 'user', content: input }
47
+ ],
48
+ max_tokens: config.maxOutputTokens,
49
+ temperature: config.temperature
50
+ }),
51
+ signal: controller.signal
52
+ });
53
+ const latencyMs = Date.now() - startedAt;
54
+ if (!response.ok) {
55
+ const text = await response.text();
56
+ return {
57
+ shouldBackground: false,
58
+ steps: [],
59
+ tools: [],
60
+ latencyMs,
61
+ model: config.model,
62
+ error: `OpenRouter HTTP ${response.status}: ${text.slice(0, 300)}`
63
+ };
64
+ }
65
+ const json = await response.json();
66
+ const text = json.choices?.[0]?.message?.content ?? '';
67
+ const jsonText = extractJson(text);
68
+ if (!jsonText) {
69
+ return { shouldBackground: false, steps: [], tools: [], latencyMs, model: config.model, error: 'Planner probe returned no JSON' };
70
+ }
71
+ let steps = [];
72
+ let tools = [];
73
+ try {
74
+ const parsed = JSON.parse(jsonText);
75
+ steps = Array.isArray(parsed.steps) ? parsed.steps.filter(item => typeof item === 'string') : [];
76
+ tools = Array.isArray(parsed.tools) ? parsed.tools.filter(item => typeof item === 'string') : [];
77
+ }
78
+ catch {
79
+ return { shouldBackground: false, steps: [], tools: [], latencyMs, model: config.model, error: 'Planner probe JSON parse failed' };
80
+ }
81
+ const shouldBackground = steps.length >= config.minSteps || tools.length >= config.minTools;
82
+ return { shouldBackground, steps, tools, latencyMs, model: config.model };
83
+ }
84
+ catch (err) {
85
+ return {
86
+ shouldBackground: false,
87
+ steps: [],
88
+ tools: [],
89
+ model: config.model,
90
+ error: err instanceof Error ? err.message : String(err)
91
+ };
92
+ }
93
+ finally {
94
+ clearTimeout(timeout);
95
+ }
96
+ }
97
+ //# sourceMappingURL=planner-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner-probe.js","sourceRoot":"","sources":["../src/planner-probe.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,32 @@
1
1
  export declare const DEFAULT_PROGRESS_MESSAGES: string[];
2
+ export declare const DEFAULT_PROGRESS_STAGES: Record<string, string>;
3
+ export declare function formatPlanStepList(params: {
4
+ steps: string[];
5
+ currentStep?: number;
6
+ maxSteps?: number;
7
+ }): string;
8
+ export declare function formatProgressWithPlan(params: {
9
+ steps: string[];
10
+ currentStep?: number;
11
+ stage?: string;
12
+ }): string;
2
13
  export declare function parseProgressMessages(raw: string | undefined, fallback?: string[]): string[];
14
+ export declare function createProgressManager(params: {
15
+ enabled: boolean;
16
+ initialDelayMs: number;
17
+ intervalMs: number;
18
+ maxUpdates: number;
19
+ messages: string[];
20
+ stageMessages?: Record<string, string>;
21
+ stageThrottleMs?: number;
22
+ send: (text: string) => Promise<void>;
23
+ onError?: (err: unknown) => void;
24
+ }): {
25
+ start: () => void;
26
+ stop: () => void;
27
+ setStage: (stage: string) => void;
28
+ notify: (text: string) => void;
29
+ };
3
30
  export declare function createProgressNotifier(params: {
4
31
  enabled: boolean;
5
32
  initialDelayMs: number;
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,UAIrC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,WAA4B,GAAG,MAAM,EAAE,CAiB7G;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CA4D1C"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,UAIrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAO1D,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAe/G;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAYhH;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,WAA4B,GAAG,MAAM,EAAE,CAiB7G;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,CAgG7G;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CA4D1C"}
package/dist/progress.js CHANGED
@@ -3,6 +3,51 @@ export const DEFAULT_PROGRESS_MESSAGES = [
3
3
  'Still working. Thanks for your patience.',
4
4
  'Almost there. I will send the result as soon as it is ready.'
5
5
  ];
6
+ export const DEFAULT_PROGRESS_STAGES = {
7
+ ack: 'On it. I will get started now.',
8
+ planning: 'Planning the best approach.',
9
+ searching: 'Gathering information and context.',
10
+ coding: 'Working on the implementation.',
11
+ drafting: 'Drafting the response.',
12
+ finalizing: 'Finalizing everything.'
13
+ };
14
+ function normalizeSteps(steps) {
15
+ if (!Array.isArray(steps))
16
+ return [];
17
+ return steps.map(step => step.trim()).filter(Boolean);
18
+ }
19
+ export function formatPlanStepList(params) {
20
+ const cleaned = normalizeSteps(params.steps);
21
+ if (cleaned.length === 0)
22
+ return '';
23
+ const total = cleaned.length;
24
+ const maxSteps = Number.isFinite(params.maxSteps)
25
+ ? Math.max(1, Math.floor(params.maxSteps))
26
+ : 4;
27
+ const limited = cleaned.slice(0, maxSteps);
28
+ const current = Number.isFinite(params.currentStep)
29
+ ? Math.min(Math.max(1, Math.floor(params.currentStep)), total)
30
+ : null;
31
+ return limited.map((step, index) => {
32
+ const marker = current && index + 1 === current ? '->' : '*';
33
+ return `${marker} ${step}`;
34
+ }).join('\n');
35
+ }
36
+ export function formatProgressWithPlan(params) {
37
+ const normalizedStage = params.stage ? params.stage.trim().toLowerCase() : '';
38
+ const fallback = DEFAULT_PROGRESS_STAGES[normalizedStage] || DEFAULT_PROGRESS_MESSAGES[0];
39
+ const cleaned = normalizeSteps(params.steps);
40
+ if (cleaned.length === 0)
41
+ return fallback;
42
+ const total = cleaned.length;
43
+ const current = Number.isFinite(params.currentStep)
44
+ ? Math.min(Math.max(1, Math.floor(params.currentStep)), total)
45
+ : 1;
46
+ const list = formatPlanStepList({ steps: cleaned, currentStep: current, maxSteps: 4 });
47
+ if (!list)
48
+ return fallback;
49
+ return `Working on your request (step ${current}/${total}):\n${list}`;
50
+ }
6
51
  export function parseProgressMessages(raw, fallback = DEFAULT_PROGRESS_MESSAGES) {
7
52
  if (!raw)
8
53
  return fallback;
@@ -24,6 +69,112 @@ export function parseProgressMessages(raw, fallback = DEFAULT_PROGRESS_MESSAGES)
24
69
  const parts = trimmed.split('|').map(item => item.trim()).filter(Boolean);
25
70
  return parts.length > 0 ? parts : fallback;
26
71
  }
72
+ export function createProgressManager(params) {
73
+ const maxUpdates = Math.max(0, Math.floor(params.maxUpdates));
74
+ const initialDelay = Math.max(0, Math.floor(params.initialDelayMs));
75
+ const intervalDelay = Math.max(0, Math.floor(params.intervalMs));
76
+ const messages = params.messages && params.messages.length > 0 ? params.messages : DEFAULT_PROGRESS_MESSAGES;
77
+ const stageMessages = params.stageMessages && Object.keys(params.stageMessages).length > 0
78
+ ? params.stageMessages
79
+ : DEFAULT_PROGRESS_STAGES;
80
+ const stageThrottleMs = Math.max(0, Math.floor(params.stageThrottleMs ?? 20_000));
81
+ let stopped = false;
82
+ let updateCount = 0;
83
+ let initialTimer = null;
84
+ let intervalTimer = null;
85
+ let lastStageSent = null;
86
+ let lastSentAt = 0;
87
+ const stop = () => {
88
+ stopped = true;
89
+ if (initialTimer)
90
+ clearTimeout(initialTimer);
91
+ if (intervalTimer)
92
+ clearInterval(intervalTimer);
93
+ initialTimer = null;
94
+ intervalTimer = null;
95
+ };
96
+ const ensureInterval = () => {
97
+ if (intervalDelay <= 0 || intervalTimer)
98
+ return;
99
+ intervalTimer = setInterval(() => {
100
+ void sendFallback();
101
+ }, intervalDelay);
102
+ };
103
+ const sendText = async (text) => {
104
+ if (stopped || !params.enabled)
105
+ return;
106
+ if (maxUpdates === 0)
107
+ return;
108
+ if (updateCount >= maxUpdates) {
109
+ stop();
110
+ return;
111
+ }
112
+ updateCount += 1;
113
+ ensureInterval();
114
+ lastSentAt = Date.now();
115
+ try {
116
+ await params.send(text);
117
+ }
118
+ catch (err) {
119
+ params.onError?.(err);
120
+ }
121
+ if (updateCount >= maxUpdates) {
122
+ stop();
123
+ }
124
+ };
125
+ const sendFallback = async () => {
126
+ if (stopped || !params.enabled)
127
+ return;
128
+ if (updateCount >= maxUpdates) {
129
+ stop();
130
+ return;
131
+ }
132
+ const index = Math.min(updateCount, messages.length - 1);
133
+ const text = messages[index];
134
+ if (!text)
135
+ return;
136
+ await sendText(text);
137
+ };
138
+ const start = () => {
139
+ if (!params.enabled)
140
+ return;
141
+ if (maxUpdates === 0)
142
+ return;
143
+ if (messages.length === 0)
144
+ return;
145
+ if (initialDelay === 0) {
146
+ void sendFallback();
147
+ }
148
+ else {
149
+ initialTimer = setTimeout(() => {
150
+ void sendFallback();
151
+ }, initialDelay);
152
+ }
153
+ };
154
+ const setStage = (stage) => {
155
+ if (!params.enabled || stopped)
156
+ return;
157
+ const normalized = stage.trim().toLowerCase();
158
+ if (!normalized)
159
+ return;
160
+ if (normalized === lastStageSent)
161
+ return;
162
+ const text = stageMessages[normalized];
163
+ if (!text)
164
+ return;
165
+ const now = Date.now();
166
+ if (now - lastSentAt < stageThrottleMs)
167
+ return;
168
+ lastStageSent = normalized;
169
+ void sendText(text);
170
+ };
171
+ const notify = (text) => {
172
+ if (!text)
173
+ return;
174
+ void sendText(text);
175
+ };
176
+ return { start, stop, setStage, notify };
177
+ }
27
178
  export function createProgressNotifier(params) {
28
179
  const maxUpdates = Math.max(0, Math.floor(params.maxUpdates));
29
180
  const initialDelay = Math.max(0, Math.floor(params.initialDelayMs));
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,0CAA0C;IAC1C,0CAA0C;IAC1C,8DAA8D;CAC/D,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,GAAuB,EAAE,QAAQ,GAAG,yBAAyB;IACjG,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC7G,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAQtC;IACC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAE7G,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAA0B,IAAI,CAAC;IAC/C,IAAI,aAAa,GAA0B,IAAI,CAAC;IAEhD,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,YAAY;YAAE,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,aAAa;YAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QAChD,YAAY,GAAG,IAAI,CAAC;QACpB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,aAAa,IAAI,CAAC,IAAI,aAAa;YAAE,OAAO;QAChD,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,KAAK,UAAU,EAAE,CAAC;QACpB,CAAC,EAAE,aAAa,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QACvC,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO;QAC7B,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,WAAW,IAAI,CAAC,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAC5B,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO;QAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,UAAU,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,KAAK,UAAU,EAAE,CAAC;YACpB,CAAC,EAAE,YAAY,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { NewMessage } from './types.js';
2
+ export type TaskProfile = 'fast' | 'standard' | 'deep' | 'background';
3
+ export type RoutingDecision = {
4
+ profile: TaskProfile;
5
+ reason: string;
6
+ shouldRunClassifier: boolean;
7
+ shouldBackground: boolean;
8
+ estimatedMinutes?: number;
9
+ modelOverride?: string;
10
+ maxOutputTokens?: number;
11
+ maxToolSteps?: number;
12
+ toolAllow?: string[];
13
+ toolDeny?: string[];
14
+ recallMaxResults?: number;
15
+ recallMaxTokens?: number;
16
+ enablePlanner: boolean;
17
+ enableResponseValidation: boolean;
18
+ responseValidationMaxRetries?: number;
19
+ enableMemoryRecall: boolean;
20
+ enableMemoryExtraction: boolean;
21
+ progress: {
22
+ enabled: boolean;
23
+ initialMs: number;
24
+ intervalMs: number;
25
+ maxUpdates: number;
26
+ messages: string[];
27
+ };
28
+ };
29
+ export declare function routeRequest(params: {
30
+ prompt: string;
31
+ lastMessage: NewMessage;
32
+ }): RoutingDecision;
33
+ export declare function routePrompt(prompt: string): RoutingDecision;
34
+ //# sourceMappingURL=request-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-router.d.ts","sourceRoot":"","sources":["../src/request-router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,wBAAwB,EAAE,OAAO,CAAC;IAClC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH,CAAC;AAkCF,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,CAAC;CACzB,GAAG,eAAe,CA+GlB;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAa3D"}
@@ -0,0 +1,148 @@
1
+ import { loadRuntimeConfig } from './runtime-config.js';
2
+ const GREETING_REGEX = /^(hi|hello|hey|yo|sup|what's up|who are you|what can you do|help|thanks|thank you)[!.?]*$/i;
3
+ function normalizeText(value) {
4
+ return value.trim().toLowerCase();
5
+ }
6
+ function hasKeyword(text, keywords) {
7
+ return keywords.some(keyword => keyword && text.includes(keyword.toLowerCase()));
8
+ }
9
+ function estimateMinutes(textLength, multiplier = 1) {
10
+ if (!Number.isFinite(textLength) || textLength <= 0)
11
+ return 1;
12
+ const base = Math.max(1, Math.ceil(textLength / 800));
13
+ return Math.min(60, Math.max(1, Math.round(base * multiplier)));
14
+ }
15
+ function resolveProgressConfig(params) {
16
+ const override = params.override || {};
17
+ return {
18
+ enabled: typeof override.enabled === 'boolean' ? override.enabled : params.defaultProgress.enabled,
19
+ initialMs: Number.isFinite(override.initialMs) ? Math.max(0, Number(override.initialMs)) : params.defaultProgress.initialMs,
20
+ intervalMs: Number.isFinite(override.intervalMs) ? Math.max(0, Number(override.intervalMs)) : params.defaultProgress.intervalMs,
21
+ maxUpdates: Number.isFinite(override.maxUpdates) ? Math.max(0, Math.floor(Number(override.maxUpdates))) : params.defaultProgress.maxUpdates,
22
+ messages: Array.isArray(override.messages) && override.messages.length > 0
23
+ ? override.messages.map(item => String(item))
24
+ : params.defaultProgress.messages
25
+ };
26
+ }
27
+ export function routeRequest(params) {
28
+ const runtime = loadRuntimeConfig();
29
+ const routing = runtime.host.routing;
30
+ const defaultProgress = {
31
+ enabled: runtime.host.progress.enabled,
32
+ initialMs: runtime.host.progress.initialMs,
33
+ intervalMs: runtime.host.progress.intervalMs,
34
+ maxUpdates: runtime.host.progress.maxUpdates,
35
+ messages: runtime.host.progress.messages
36
+ };
37
+ const fallbackProfile = routing.profiles?.standard;
38
+ const fallbackRecallMaxResults = typeof fallbackProfile?.recallMaxResults === 'number'
39
+ ? Math.max(0, Math.floor(fallbackProfile.recallMaxResults))
40
+ : runtime.host.memory.recall.maxResults;
41
+ const fallbackRecallMaxTokens = typeof fallbackProfile?.recallMaxTokens === 'number'
42
+ ? Math.max(0, Math.floor(fallbackProfile.recallMaxTokens))
43
+ : runtime.host.memory.recall.maxTokens;
44
+ const fallbackValidationRetries = typeof fallbackProfile?.responseValidationMaxRetries === 'number'
45
+ ? Math.max(0, Math.floor(fallbackProfile.responseValidationMaxRetries))
46
+ : runtime.agent.responseValidation.maxRetries;
47
+ if (!routing.enabled) {
48
+ return {
49
+ profile: 'standard',
50
+ reason: 'routing disabled',
51
+ shouldRunClassifier: false,
52
+ shouldBackground: false,
53
+ estimatedMinutes: undefined,
54
+ modelOverride: fallbackProfile?.model,
55
+ maxOutputTokens: fallbackProfile?.maxOutputTokens,
56
+ maxToolSteps: fallbackProfile?.maxToolSteps,
57
+ toolAllow: fallbackProfile?.toolAllow,
58
+ toolDeny: fallbackProfile?.toolDeny,
59
+ recallMaxResults: fallbackRecallMaxResults,
60
+ recallMaxTokens: fallbackRecallMaxTokens,
61
+ enablePlanner: fallbackProfile?.enablePlanner ?? true,
62
+ enableResponseValidation: fallbackProfile?.enableValidation ?? true,
63
+ responseValidationMaxRetries: fallbackValidationRetries,
64
+ enableMemoryRecall: fallbackProfile?.enableMemoryRecall ?? true,
65
+ enableMemoryExtraction: fallbackProfile?.enableMemoryExtraction ?? true,
66
+ progress: resolveProgressConfig({ defaultProgress, override: fallbackProfile?.progress })
67
+ };
68
+ }
69
+ const text = params.lastMessage?.content || params.prompt || '';
70
+ const trimmed = text.trim();
71
+ const normalized = normalizeText(trimmed);
72
+ const length = trimmed.length;
73
+ const isGreeting = GREETING_REGEX.test(trimmed);
74
+ const fastCue = hasKeyword(normalized, routing.fastKeywords);
75
+ const deepCue = hasKeyword(normalized, routing.deepKeywords);
76
+ const backgroundCue = hasKeyword(normalized, routing.backgroundKeywords);
77
+ let profile = 'standard';
78
+ let reason = 'default';
79
+ if (backgroundCue || length >= routing.backgroundMinChars) {
80
+ profile = 'background';
81
+ reason = backgroundCue ? 'background keyword' : 'long prompt length';
82
+ }
83
+ else if (deepCue || length >= routing.maxStandardChars) {
84
+ profile = 'deep';
85
+ reason = deepCue ? 'complexity keyword' : 'prompt length';
86
+ }
87
+ else if (isGreeting || fastCue || length <= routing.maxFastChars) {
88
+ profile = 'fast';
89
+ reason = isGreeting ? 'greeting' : (fastCue ? 'fast keyword' : 'short prompt');
90
+ }
91
+ const profileConfig = routing.profiles?.[profile] || routing.profiles?.standard;
92
+ const recallMaxResults = typeof profileConfig?.recallMaxResults === 'number'
93
+ ? Math.max(0, Math.floor(profileConfig.recallMaxResults))
94
+ : runtime.host.memory.recall.maxResults;
95
+ const recallMaxTokens = typeof profileConfig?.recallMaxTokens === 'number'
96
+ ? Math.max(0, Math.floor(profileConfig.recallMaxTokens))
97
+ : runtime.host.memory.recall.maxTokens;
98
+ const responseValidationMaxRetries = typeof profileConfig?.responseValidationMaxRetries === 'number'
99
+ ? Math.max(0, Math.floor(profileConfig.responseValidationMaxRetries))
100
+ : runtime.agent.responseValidation.maxRetries;
101
+ const progress = resolveProgressConfig({
102
+ defaultProgress,
103
+ override: profileConfig?.progress
104
+ });
105
+ const shouldBackground = profile === 'background';
106
+ const shouldRunClassifier = routing.classifierFallback.enabled
107
+ && !shouldBackground
108
+ && profile !== 'fast'
109
+ && length >= routing.classifierFallback.minChars;
110
+ const estimatedMinutes = (profile === 'deep' || profile === 'background')
111
+ ? estimateMinutes(length, profile === 'background' ? 1.5 : 1)
112
+ : undefined;
113
+ return {
114
+ profile,
115
+ reason,
116
+ shouldRunClassifier,
117
+ shouldBackground,
118
+ estimatedMinutes,
119
+ modelOverride: profileConfig?.model,
120
+ maxOutputTokens: profileConfig?.maxOutputTokens,
121
+ maxToolSteps: profileConfig?.maxToolSteps,
122
+ toolAllow: profileConfig?.toolAllow,
123
+ toolDeny: profileConfig?.toolDeny,
124
+ recallMaxResults,
125
+ recallMaxTokens,
126
+ enablePlanner: profileConfig?.enablePlanner ?? true,
127
+ enableResponseValidation: profileConfig?.enableValidation ?? true,
128
+ responseValidationMaxRetries,
129
+ enableMemoryRecall: profileConfig?.enableMemoryRecall ?? true,
130
+ enableMemoryExtraction: profileConfig?.enableMemoryExtraction ?? true,
131
+ progress
132
+ };
133
+ }
134
+ export function routePrompt(prompt) {
135
+ const message = {
136
+ id: 'system',
137
+ chat_jid: 'system',
138
+ sender: 'system',
139
+ sender_name: 'system',
140
+ content: prompt,
141
+ timestamp: new Date().toISOString()
142
+ };
143
+ return routeRequest({
144
+ prompt,
145
+ lastMessage: message
146
+ });
147
+ }
148
+ //# sourceMappingURL=request-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-router.js","sourceRoot":"","sources":["../src/request-router.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ export type RuntimeConfig = {
26
26
  tmpfsSize: string;
27
27
  runUid: string;
28
28
  runGid: string;
29
+ instanceId: string;
29
30
  };
30
31
  concurrency: {
31
32
  maxAgents: number;
@@ -109,6 +110,12 @@ export type RuntimeConfig = {
109
110
  contextModeDefault: 'group' | 'isolated';
110
111
  toolAllow: string[];
111
112
  toolDeny: string[];
113
+ progress: {
114
+ enabled: boolean;
115
+ startDelayMs: number;
116
+ intervalMs: number;
117
+ maxUpdates: number;
118
+ };
112
119
  autoSpawn: {
113
120
  enabled: boolean;
114
121
  foregroundTimeoutMs: number;
@@ -121,9 +128,60 @@ export type RuntimeConfig = {
121
128
  maxOutputTokens: number;
122
129
  temperature: number;
123
130
  confidenceThreshold: number;
131
+ adaptive?: {
132
+ enabled: boolean;
133
+ minThreshold: number;
134
+ maxThreshold: number;
135
+ queueDepthLow: number;
136
+ queueDepthHigh: number;
137
+ };
124
138
  };
125
139
  };
126
140
  };
141
+ routing: {
142
+ enabled: boolean;
143
+ maxFastChars: number;
144
+ maxStandardChars: number;
145
+ backgroundMinChars: number;
146
+ fastKeywords: string[];
147
+ deepKeywords: string[];
148
+ backgroundKeywords: string[];
149
+ classifierFallback: {
150
+ enabled: boolean;
151
+ minChars: number;
152
+ };
153
+ plannerProbe: {
154
+ enabled: boolean;
155
+ model: string;
156
+ timeoutMs: number;
157
+ maxOutputTokens: number;
158
+ temperature: number;
159
+ minChars: number;
160
+ minSteps: number;
161
+ minTools: number;
162
+ };
163
+ profiles: Record<string, {
164
+ model: string;
165
+ maxOutputTokens: number;
166
+ maxToolSteps: number;
167
+ recallMaxResults?: number;
168
+ recallMaxTokens?: number;
169
+ enablePlanner: boolean;
170
+ enableValidation: boolean;
171
+ responseValidationMaxRetries?: number;
172
+ enableMemoryRecall: boolean;
173
+ enableMemoryExtraction: boolean;
174
+ toolAllow?: string[];
175
+ toolDeny?: string[];
176
+ progress?: {
177
+ enabled?: boolean;
178
+ initialMs?: number;
179
+ intervalMs?: number;
180
+ maxUpdates?: number;
181
+ messages?: string[];
182
+ };
183
+ }>;
184
+ };
127
185
  toolBudgets: {
128
186
  enabled: boolean;
129
187
  path: string;
@@ -191,6 +249,8 @@ export type RuntimeConfig = {
191
249
  temperature: number;
192
250
  maxRetries: number;
193
251
  allowToolCalls: boolean;
252
+ minPromptTokens: number;
253
+ minResponseTokens: number;
194
254
  };
195
255
  tools: {
196
256
  maxToolSteps: number;
@@ -218,6 +278,13 @@ export type RuntimeConfig = {
218
278
  maxBytes: number;
219
279
  httpTimeoutMs: number;
220
280
  };
281
+ progress: {
282
+ enabled: boolean;
283
+ minIntervalMs: number;
284
+ notifyTools: string[];
285
+ notifyOnStart: boolean;
286
+ notifyOnError: boolean;
287
+ };
221
288
  toolSummary: {
222
289
  enabled: boolean;
223
290
  maxBytes: number;