@sunilp-org/jam-cli 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +304 -52
  2. package/dist/commands/ask.d.ts +4 -0
  3. package/dist/commands/ask.d.ts.map +1 -1
  4. package/dist/commands/ask.js +202 -10
  5. package/dist/commands/ask.js.map +1 -1
  6. package/dist/commands/commit.d.ts +12 -0
  7. package/dist/commands/commit.d.ts.map +1 -0
  8. package/dist/commands/commit.js +135 -0
  9. package/dist/commands/commit.js.map +1 -0
  10. package/dist/commands/context.d.ts +12 -0
  11. package/dist/commands/context.d.ts.map +1 -0
  12. package/dist/commands/context.js +52 -0
  13. package/dist/commands/context.js.map +1 -0
  14. package/dist/commands/review.d.ts +25 -0
  15. package/dist/commands/review.d.ts.map +1 -0
  16. package/dist/commands/review.js +117 -0
  17. package/dist/commands/review.js.map +1 -0
  18. package/dist/commands/run.d.ts +1 -0
  19. package/dist/commands/run.d.ts.map +1 -1
  20. package/dist/commands/run.js +199 -197
  21. package/dist/commands/run.js.map +1 -1
  22. package/dist/config/loader.d.ts.map +1 -1
  23. package/dist/config/loader.js +3 -0
  24. package/dist/config/loader.js.map +1 -1
  25. package/dist/index.js +63 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/providers/base.d.ts +26 -0
  28. package/dist/providers/base.d.ts.map +1 -1
  29. package/dist/providers/factory.d.ts.map +1 -1
  30. package/dist/providers/factory.js +17 -1
  31. package/dist/providers/factory.js.map +1 -1
  32. package/dist/providers/groq.d.ts +16 -0
  33. package/dist/providers/groq.d.ts.map +1 -0
  34. package/dist/providers/groq.js +23 -0
  35. package/dist/providers/groq.js.map +1 -0
  36. package/dist/providers/ollama.d.ts +6 -1
  37. package/dist/providers/ollama.d.ts.map +1 -1
  38. package/dist/providers/ollama.js +77 -4
  39. package/dist/providers/ollama.js.map +1 -1
  40. package/dist/providers/openai.d.ts +18 -0
  41. package/dist/providers/openai.d.ts.map +1 -0
  42. package/dist/providers/openai.js +229 -0
  43. package/dist/providers/openai.js.map +1 -0
  44. package/dist/tools/all-tools.d.ts +18 -0
  45. package/dist/tools/all-tools.d.ts.map +1 -0
  46. package/dist/tools/all-tools.js +95 -0
  47. package/dist/tools/all-tools.js.map +1 -0
  48. package/dist/tools/apply_patch.js +1 -1
  49. package/dist/tools/apply_patch.js.map +1 -1
  50. package/dist/tools/context-tools.d.ts +14 -0
  51. package/dist/tools/context-tools.d.ts.map +1 -0
  52. package/dist/tools/context-tools.js +63 -0
  53. package/dist/tools/context-tools.js.map +1 -0
  54. package/dist/tools/git_diff.js +1 -1
  55. package/dist/tools/git_diff.js.map +1 -1
  56. package/dist/tools/git_status.js +1 -1
  57. package/dist/tools/git_status.js.map +1 -1
  58. package/dist/tools/registry.d.ts.map +1 -1
  59. package/dist/tools/registry.js +2 -0
  60. package/dist/tools/registry.js.map +1 -1
  61. package/dist/tools/run_command.d.ts +8 -3
  62. package/dist/tools/run_command.d.ts.map +1 -1
  63. package/dist/tools/run_command.js +90 -3
  64. package/dist/tools/run_command.js.map +1 -1
  65. package/dist/ui/chat.d.ts.map +1 -1
  66. package/dist/ui/chat.js +173 -1
  67. package/dist/ui/chat.js.map +1 -1
  68. package/dist/ui/logo.d.ts.map +1 -1
  69. package/dist/ui/logo.js +5 -1
  70. package/dist/ui/logo.js.map +1 -1
  71. package/dist/utils/agent.d.ts +130 -0
  72. package/dist/utils/agent.d.ts.map +1 -0
  73. package/dist/utils/agent.js +449 -0
  74. package/dist/utils/agent.js.map +1 -0
  75. package/dist/utils/cache.d.ts +30 -0
  76. package/dist/utils/cache.d.ts.map +1 -0
  77. package/dist/utils/cache.js +62 -0
  78. package/dist/utils/cache.js.map +1 -0
  79. package/dist/utils/context.d.ts +38 -0
  80. package/dist/utils/context.d.ts.map +1 -0
  81. package/dist/utils/context.js +383 -0
  82. package/dist/utils/context.js.map +1 -0
  83. package/dist/utils/critic.d.ts +31 -0
  84. package/dist/utils/critic.d.ts.map +1 -0
  85. package/dist/utils/critic.js +126 -0
  86. package/dist/utils/critic.js.map +1 -0
  87. package/dist/utils/index-builder.d.ts +53 -0
  88. package/dist/utils/index-builder.d.ts.map +1 -0
  89. package/dist/utils/index-builder.js +241 -0
  90. package/dist/utils/index-builder.js.map +1 -0
  91. package/dist/utils/memory.d.ts +104 -0
  92. package/dist/utils/memory.d.ts.map +1 -0
  93. package/dist/utils/memory.js +215 -0
  94. package/dist/utils/memory.js.map +1 -0
  95. package/dist/utils/past-sessions.d.ts +31 -0
  96. package/dist/utils/past-sessions.d.ts.map +1 -0
  97. package/dist/utils/past-sessions.js +126 -0
  98. package/dist/utils/past-sessions.js.map +1 -0
  99. package/dist/utils/tokens.d.ts +53 -0
  100. package/dist/utils/tokens.d.ts.map +1 -0
  101. package/dist/utils/tokens.js +138 -0
  102. package/dist/utils/tokens.js.map +1 -0
  103. package/package.json +4 -2
@@ -1,7 +1,21 @@
1
1
  import { spawn } from 'node:child_process';
2
+ import { JamError } from '../utils/errors.js';
3
+ // Patterns that are never allowed regardless of policy
4
+ const DANGEROUS_PATTERNS = [
5
+ /\brm\s+-[a-zA-Z]*r[a-zA-Z]*f\b/, // rm -rf, rm -fr, etc.
6
+ /\brm\s+-[a-zA-Z]*f[a-zA-Z]*r\b/,
7
+ /\bsudo\b/,
8
+ /\bsu\s+-/,
9
+ /\bmkfs\b/,
10
+ /\bdd\s+.*of=\/dev\//,
11
+ />\s*\/dev\/(s|h|v)d[a-z]/, // overwriting block devices
12
+ /\bchmod\s+777\s+\//,
13
+ /\bshutdown\b/,
14
+ /\breboot\b/,
15
+ ];
2
16
  /**
3
- * Spawns a child process and returns stdout as a string.
4
- * Rejects with an Error containing stderr if the process exits with a non-zero code.
17
+ * Spawns a child process and returns { stdout, stderr } as strings.
18
+ * Rejects with an Error if the process exits with a non-zero code or times out.
5
19
  */
6
20
  export function runCommand(command, args, cwd, timeoutMs = 30_000) {
7
21
  return new Promise((resolve, reject) => {
@@ -21,7 +35,7 @@ export function runCommand(command, args, cwd, timeoutMs = 30_000) {
21
35
  child.on('close', (code) => {
22
36
  clearTimeout(timer);
23
37
  if (code === 0) {
24
- resolve(stdout);
38
+ resolve({ stdout, stderr });
25
39
  }
26
40
  else {
27
41
  const detail = stderr.trim() || stdout.trim();
@@ -34,4 +48,77 @@ export function runCommand(command, args, cwd, timeoutMs = 30_000) {
34
48
  });
35
49
  });
36
50
  }
51
+ /** Check a full command string against dangerous patterns. */
52
+ function isDangerous(fullCommand) {
53
+ return DANGEROUS_PATTERNS.some((pattern) => pattern.test(fullCommand));
54
+ }
55
+ export const runCommandTool = {
56
+ name: 'run_command',
57
+ description: 'Execute a shell command and return its stdout and stderr. ' +
58
+ 'Use for running tests, builds, linters, or other safe commands. ' +
59
+ 'Dangerous commands (rm -rf, sudo, etc.) are blocked. ' +
60
+ 'Note: arguments are split on whitespace; quoted arguments with spaces are not supported.',
61
+ readonly: false,
62
+ parameters: {
63
+ type: 'object',
64
+ properties: {
65
+ command: {
66
+ type: 'string',
67
+ description: 'The executable or shell command to run (e.g. "npm", "git", "python").',
68
+ },
69
+ args: {
70
+ type: 'string',
71
+ description: 'Space-separated arguments to pass to the command (e.g. "test --run").',
72
+ optional: true,
73
+ },
74
+ timeout: {
75
+ type: 'number',
76
+ description: 'Timeout in seconds. Default is 30.',
77
+ optional: true,
78
+ },
79
+ },
80
+ required: ['command'],
81
+ },
82
+ async execute(args, ctx) {
83
+ const command = args['command'];
84
+ if (typeof command !== 'string' || command.trim() === '') {
85
+ throw new JamError('Argument "command" must be a non-empty string.', 'INPUT_MISSING');
86
+ }
87
+ const rawArgs = args['args'];
88
+ const cmdArgs = typeof rawArgs === 'string' && rawArgs.trim() !== ''
89
+ ? rawArgs.trim().split(/\s+/)
90
+ : [];
91
+ const timeoutArg = args['timeout'];
92
+ const timeoutMs = typeof timeoutArg === 'number' && timeoutArg > 0 ? timeoutArg * 1000 : 30_000;
93
+ const fullCommand = [command, ...cmdArgs].join(' ');
94
+ if (isDangerous(fullCommand)) {
95
+ throw new JamError(`Command rejected: "${fullCommand}" matches a dangerous pattern and cannot be executed.`, 'TOOL_DENIED');
96
+ }
97
+ let result;
98
+ try {
99
+ result = await runCommand(command.trim(), cmdArgs, ctx.workspaceRoot, timeoutMs);
100
+ }
101
+ catch (err) {
102
+ if (err instanceof Error) {
103
+ return {
104
+ output: err.message,
105
+ error: err.message,
106
+ metadata: { command: fullCommand, exitCode: 1 },
107
+ };
108
+ }
109
+ throw new JamError(`run_command failed: ${String(err)}`, 'TOOL_EXEC_ERROR', { cause: err });
110
+ }
111
+ const output = [
112
+ result.stdout.trim() ? result.stdout : '',
113
+ result.stderr.trim() ? `[stderr]\n${result.stderr}` : '',
114
+ ]
115
+ .filter(Boolean)
116
+ .join('\n')
117
+ .trim();
118
+ return {
119
+ output: output || '(no output)',
120
+ metadata: { command: fullCommand },
121
+ };
122
+ },
123
+ };
37
124
  //# sourceMappingURL=run_command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run_command.js","sourceRoot":"","sources":["../../src/tools/run_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,GAAW,EACX,SAAS,GAAG,MAAM;IAElB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,SAAS,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC9C,MAAM,CACJ,IAAI,KAAK,CACP,YAAY,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAChG,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"run_command.js","sourceRoot":"","sources":["../../src/tools/run_command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/ui/chat.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,EAAE,CAAC;CAC5B;AAkRD,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnE"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/ui/chat.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAqBrD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,EAAE,CAAC;CAC5B;AAgdD,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnE"}
package/dist/ui/chat.js CHANGED
@@ -3,6 +3,15 @@ import { useState, useEffect, useCallback, useRef } from 'react';
3
3
  import { render, Box, Text, useApp, useInput, Static } from 'ink';
4
4
  import TextInput from 'ink-text-input';
5
5
  import { appendMessage } from '../storage/history.js';
6
+ import { READ_ONLY_TOOL_SCHEMAS, executeReadOnlyTool } from '../tools/context-tools.js';
7
+ import { getWorkspaceRoot } from '../utils/workspace.js';
8
+ import { ToolCallTracker, ANSI, ansi, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, buildSynthesisReminder, } from '../utils/agent.js';
9
+ import { WorkingMemory } from '../utils/memory.js';
10
+ import { ToolResultCache } from '../utils/cache.js';
11
+ import { criticEvaluate, buildCriticCorrection } from '../utils/critic.js';
12
+ import { searchPastSessions, formatPastExchanges } from '../utils/past-sessions.js';
13
+ import { getOrBuildIndex, searchSymbols, formatSymbolResults } from '../utils/index-builder.js';
14
+ import { updateContextWithUsage } from '../utils/context.js';
6
15
  function formatRole(role) {
7
16
  switch (role) {
8
17
  case 'user':
@@ -95,6 +104,169 @@ function ChatApp({ provider, config, sessionId, initialMessages, }) {
95
104
  const profile = config.profiles[config.defaultProfile];
96
105
  const abortController = new AbortController();
97
106
  abortRef.current = abortController;
107
+ // ── Build system prompt (used for BOTH tool gathering AND streaming) ──
108
+ let agentSystemPrompt;
109
+ // ── Agentic tool-gathering phase ─────────────────────────────────────
110
+ // Run read-only tool rounds to gather context before giving final answer.
111
+ if (provider.chatWithTools && !abortController.signal.aborted) {
112
+ try {
113
+ const workspaceRoot = await getWorkspaceRoot();
114
+ const { jamContext, workspaceCtx } = await loadProjectContext(workspaceRoot);
115
+ let toolMessages = [...conversationRef.current];
116
+ const tracker = new ToolCallTracker();
117
+ const memory = new WorkingMemory(provider, profile?.model, undefined);
118
+ const cache = new ToolResultCache();
119
+ agentSystemPrompt =
120
+ profile?.systemPrompt ??
121
+ buildSystemPrompt(jamContext, workspaceCtx);
122
+ memory['systemPrompt'] = agentSystemPrompt;
123
+ // ── Symbol index + past sessions for richer planning ──────────
124
+ let symbolHint = '';
125
+ try {
126
+ const index = await getOrBuildIndex(workspaceRoot);
127
+ const symbols = searchSymbols(index, trimmed, 10);
128
+ symbolHint = formatSymbolResults(symbols);
129
+ }
130
+ catch { /* non-fatal */ }
131
+ let pastContext = '';
132
+ try {
133
+ const pastExchanges = await searchPastSessions(trimmed, workspaceRoot, 2);
134
+ pastContext = formatPastExchanges(pastExchanges);
135
+ }
136
+ catch { /* non-fatal */ }
137
+ // ── Planning phase: reason about what to search for ──────────
138
+ setStreamingText(ansi(ANSI.dimBlue, '🔍 Planning search strategy…'));
139
+ const projectCtxForPlan = [jamContext ?? workspaceCtx, symbolHint, pastContext].filter(Boolean).join('\n\n');
140
+ // Get the user's original question (last user message, before enrichment)
141
+ const originalQuestion = trimmed;
142
+ const searchPlan = await generateSearchPlan(provider, originalQuestion, projectCtxForPlan, { model: profile?.model, temperature: profile?.temperature, maxTokens: profile?.maxTokens });
143
+ // Enrich the last user message with the search plan
144
+ const lastMsg = toolMessages[toolMessages.length - 1];
145
+ if (lastMsg && lastMsg.role === 'user') {
146
+ toolMessages[toolMessages.length - 1] = {
147
+ ...lastMsg,
148
+ content: enrichUserPrompt(lastMsg.content, searchPlan),
149
+ };
150
+ }
151
+ let synthesisInjected = false;
152
+ const MAX_TOOL_ROUNDS = 15;
153
+ for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
154
+ if (abortController.signal.aborted)
155
+ break;
156
+ // Context window management: compact if approaching limit
157
+ if (memory.shouldCompact(toolMessages)) {
158
+ setStreamingText(ansi(ANSI.dimGray, '· Compacting context…'));
159
+ toolMessages = await memory.compact(toolMessages);
160
+ }
161
+ const response = await provider.chatWithTools(toolMessages, READ_ONLY_TOOL_SCHEMAS, {
162
+ model: profile?.model,
163
+ temperature: profile?.temperature,
164
+ maxTokens: profile?.maxTokens,
165
+ systemPrompt: agentSystemPrompt,
166
+ });
167
+ if (!response.toolCalls?.length) {
168
+ const finalText = response.content ?? '';
169
+ // Synthesis grounding with critic evaluation
170
+ if (tracker.totalCalls > 0 && !synthesisInjected && round < MAX_TOOL_ROUNDS - 2) {
171
+ synthesisInjected = true;
172
+ // Critic evaluation of current answer
173
+ if (finalText.trim().length > 0) {
174
+ setStreamingText(ansi(ANSI.dimGray, '· Evaluating answer quality…'));
175
+ const verdict = await criticEvaluate(provider, originalQuestion, finalText, { model: profile?.model });
176
+ if (verdict.pass) {
177
+ conversationRef.current = toolMessages;
178
+ // Auto-update JAM.md
179
+ const log = memory.getAccessLog();
180
+ updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
181
+ break;
182
+ }
183
+ // Critic rejected — use its feedback
184
+ setStreamingText(ansi(ANSI.dimGray, `· Critic: ${verdict.reason}`));
185
+ toolMessages.push({ role: 'assistant', content: finalText });
186
+ toolMessages.push({ role: 'user', content: buildCriticCorrection(verdict, originalQuestion) });
187
+ continue;
188
+ }
189
+ setStreamingText(ansi(ANSI.dimGray, '· Grounding answer to your question…'));
190
+ toolMessages.push({ role: 'assistant', content: finalText });
191
+ toolMessages.push({ role: 'user', content: buildSynthesisReminder(originalQuestion) });
192
+ continue;
193
+ }
194
+ // Final critic check
195
+ if (tracker.totalCalls > 0 && finalText.trim().length > 30 && round < MAX_TOOL_ROUNDS - 2) {
196
+ const verdict = await criticEvaluate(provider, originalQuestion, finalText, { model: profile?.model });
197
+ if (!verdict.pass) {
198
+ setStreamingText(ansi(ANSI.dimGray, `· Critic: ${verdict.reason}`));
199
+ toolMessages.push({ role: 'assistant', content: finalText });
200
+ toolMessages.push({ role: 'user', content: buildCriticCorrection(verdict, originalQuestion) });
201
+ continue;
202
+ }
203
+ }
204
+ // Model has enough context — let streaming use the enriched history
205
+ conversationRef.current = toolMessages;
206
+ const log = memory.getAccessLog();
207
+ updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
208
+ break;
209
+ }
210
+ toolMessages.push({ role: 'assistant', content: response.content ?? '' });
211
+ for (const tc of response.toolCalls) {
212
+ if (abortController.signal.aborted)
213
+ break;
214
+ // Duplicate detection
215
+ if (tracker.isDuplicate(tc.name, tc.arguments)) {
216
+ setStreamingText(ansi(ANSI.dimGray, `✕ skipped duplicate: ${tc.name}`));
217
+ toolMessages.push({
218
+ role: 'user',
219
+ content: `[Tool result: ${tc.name}]\nYou already made this exact call. Try a DIFFERENT query or tool.`,
220
+ });
221
+ tracker.record(tc.name, tc.arguments, true);
222
+ continue;
223
+ }
224
+ // Check cache
225
+ const cached = cache.get(tc.name, tc.arguments);
226
+ if (cached !== null) {
227
+ setStreamingText(ansi(ANSI.dimCyan, `▸ ${tc.name} (cached)`));
228
+ const capped = memory.processToolResult(tc.name, tc.arguments, cached);
229
+ toolMessages.push({ role: 'user', content: `[Tool result: ${tc.name}]\n${capped}` });
230
+ tracker.record(tc.name, tc.arguments, false);
231
+ continue;
232
+ }
233
+ setStreamingText(ansi(ANSI.dimCyan, `▸ ${tc.name}(${Object.entries(tc.arguments).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(', ')})`));
234
+ let toolOutput;
235
+ let wasError = false;
236
+ try {
237
+ toolOutput = await executeReadOnlyTool(tc.name, tc.arguments, workspaceRoot);
238
+ }
239
+ catch (err) {
240
+ toolOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
241
+ wasError = true;
242
+ }
243
+ if (!wasError)
244
+ cache.set(tc.name, tc.arguments, toolOutput);
245
+ const cappedOutput = memory.processToolResult(tc.name, tc.arguments, toolOutput);
246
+ tracker.record(tc.name, tc.arguments, wasError);
247
+ toolMessages.push({ role: 'user', content: `[Tool result: ${tc.name}]\n${cappedOutput}` });
248
+ }
249
+ // Scratchpad checkpoint
250
+ if (memory.shouldScratchpad(round)) {
251
+ setStreamingText(ansi(ANSI.dimGray, '· Working memory checkpoint…'));
252
+ toolMessages.push(memory.scratchpadPrompt());
253
+ }
254
+ // Inject correction hints if stuck
255
+ const hint = tracker.getCorrectionHint();
256
+ if (hint) {
257
+ setStreamingText(ansi(ANSI.dimGray, '· Adjusting search strategy…'));
258
+ toolMessages.push({ role: 'user', content: hint });
259
+ }
260
+ conversationRef.current = toolMessages;
261
+ }
262
+ }
263
+ catch {
264
+ // Tool loop error is non-fatal; proceed with streaming
265
+ }
266
+ setStreamingText('');
267
+ }
268
+ // Use the same system prompt for streaming as the tool-gathering phase
269
+ const effectiveSystemPrompt = agentSystemPrompt ?? profile?.systemPrompt;
98
270
  let fullResponse = '';
99
271
  let interrupted = false;
100
272
  try {
@@ -103,7 +275,7 @@ function ChatApp({ provider, config, sessionId, initialMessages, }) {
103
275
  model: profile?.model,
104
276
  temperature: profile?.temperature,
105
277
  maxTokens: profile?.maxTokens,
106
- systemPrompt: profile?.systemPrompt,
278
+ systemPrompt: effectiveSystemPrompt,
107
279
  });
108
280
  for await (const chunk of stream) {
109
281
  if (abortController.signal.aborted) {
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/ui/chat.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClE,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAsBtD,SAAS,UAAU,CAAC,IAAY;IAC9B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,WAAW;YACd,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,OAAO,EAA+B;IAC3D,MAAM,SAAS,GACb,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAErF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,EAAE,IAAI,kBACzB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GACpB,EACP,KAAC,IAAI,cAAE,OAAO,CAAC,OAAO,GAAQ,IAC1B,CACP,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,EACf,QAAQ,EACR,MAAM,EACN,SAAS,EACT,eAAe,GACF;IACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,6DAA6D;IAC7D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAmB,GAAG,EAAE,CAChF,eAAe;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC,CACN,CAAC;IAEF,+CAA+C;IAC/C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE/D,qCAAqC;IACrC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,4DAA4D;IAC5D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,2BAA2B;IAC3B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEtE,uBAAuB;IACvB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjD,+CAA+C;IAC/C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1D,iDAAiD;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEtD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;IAEvC,6DAA6D;IAC7D,MAAM,eAAe,GAAG,MAAM,CAAY,eAAe,CAAC,CAAC;IAE3D,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,IAAI,WAAW,EAAE,CAAC;gBAChB,0DAA0D;gBAC1D,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACrB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,sCAAsC;YACtC,IAAI,GAAG,GAAG,YAAY,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;gBACtC,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,YAAY,CAAC,OAAO,GAAG,GAAG,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,KAAa,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,IAAI,aAAa;YAAE,OAAO;QAEtC,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtB,MAAM,WAAW,GAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAChE,MAAM,WAAW,GAAmB;YAClC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,oCAAoC;QACpC,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QAEvD,8BAA8B;QAC9B,eAAe,CAAC,OAAO,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEpE,kBAAkB;QAClB,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;QAEnC,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC;gBACvC,QAAQ,EAAE,eAAe,CAAC,OAAO;gBACjC,KAAK,EAAE,OAAO,EAAE,KAAK;gBACrB,WAAW,EAAE,OAAO,EAAE,WAAW;gBACjC,SAAS,EAAE,OAAO,EAAE,SAAS;gBAC7B,YAAY,EAAE,OAAO,EAAE,YAAY;aACpC,CAAC,CAAC;YAEH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnC,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACR,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChB,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC;oBAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;oBACrB,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,eAAe,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,YAAY,GAAG,WAAW;YAC9B,CAAC,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC3F,CAAC,CAAC,YAAY,CAAC;QAEjB,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxB,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAExB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,gBAAgB,GAAY,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;YAC/E,MAAM,gBAAgB,GAAmB;gBACvC,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;YAED,eAAe,CAAC,OAAO,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACzE,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,EACD,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAC7C,CAAC;IAEF,mCAAmC;IACnC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAEzB,KAAC,MAAM,IAAC,KAAK,EAAE,iBAAiB,YAC7B,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAC,WAAW,IAAa,OAAO,EAAE,OAAO,IAAvB,KAAK,CAAsB,GAC3D,EAGR,UAAU,IAAI,CACb,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aACjB,aAAa,CAAC,YAAY,CAAC,IAAI,GAAG,oBAC9B,GACH,CACP,EAEA,aAAa,KAAK,EAAE,IAAI,CACvB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,0BAEjB,EACP,KAAC,IAAI,cAAE,aAAa,GAAQ,IACxB,CACP,EAGA,YAAY,KAAK,IAAI,IAAI,CACxB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,YAAY,GAAQ,GACnC,CACP,EAGD,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,kBACpB,IAAI,GACA,EACP,KAAC,SAAS,IACR,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAC9C,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,yCAAyC,EACxF,KAAK,EAAE,CAAC,aAAa,GACrB,IACE,IACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAoB;IAClD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAC,OAAO,IACN,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,eAAe,EAAE,OAAO,CAAC,eAAe,GACxC,CACH,CAAC;IAEF,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/ui/chat.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/ui/logo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkFH,iEAAiE;AACjE,eAAO,MAAM,UAAU,QAAe,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,UAAQ,GAAG,IAAI,CAG/C"}
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/ui/logo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuFH,iEAAiE;AACjE,eAAO,MAAM,UAAU,QAAe,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,UAAQ,GAAG,IAAI,CAG/C"}
package/dist/ui/logo.js CHANGED
@@ -46,8 +46,12 @@ function buildPlain() {
46
46
  ].join('\n');
47
47
  }
48
48
  // ── Build coloured box (synchronous ANSI, no chalk needed) ──────────────────
49
+ // Strip ANSI escape codes to get the visible (printable) length of a string.
50
+ const visibleLength = (s) =>
51
+ // eslint-disable-next-line no-control-regex
52
+ s.replace(/\x1b\[[0-9;]*m/g, '').length;
49
53
  function buildColored() {
50
- const pad = (s) => s + ' '.repeat(innerWidth - 2 - s.length);
54
+ const pad = (s) => s + ' '.repeat(Math.max(0, innerWidth - 2 - visibleLength(s)));
51
55
  const blank = ansi(A.dim, `│${' '.repeat(innerWidth)}│`);
52
56
  const boxLine = (middle) => ansi(A.dim, '│ ') + middle + ansi(A.dim, ' │');
53
57
  const letterLines = LETTERS.map(l => boxLine(pad(ansi(A.bold + A.gold, l))));
@@ -1 +1 @@
1
- {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/ui/logo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/ui/logo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Shared agentic-loop intelligence for `jam ask`, `jam chat`, and `jam run`.
3
+ *
4
+ * This module provides:
5
+ * - Search planner (separate LLM reasoning step before tool use)
6
+ * - ReAct-style system prompt builder (with JAM.md / workspace context)
7
+ * - Query/prompt enrichment with plan-driven search guidance
8
+ * - Tool-call loop detection, duplicate skipping, and correction hints
9
+ * - Answer self-validation (JSON detection, too-short, empty, off-topic)
10
+ * - Synthesis grounding (reminds model of original question before answering)
11
+ *
12
+ * Individual commands wire these into their own UI layer (stdout streaming,
13
+ * Ink TUI, or plain stderr).
14
+ */
15
+ import type { ProviderAdapter } from '../providers/base.js';
16
+ export declare const ANSI: {
17
+ readonly reset: "\u001B[0m";
18
+ readonly dim: "\u001B[2m";
19
+ readonly bold: "\u001B[1m";
20
+ readonly italic: "\u001B[3m";
21
+ readonly cyan: "\u001B[36m";
22
+ readonly yellow: "\u001B[33m";
23
+ readonly green: "\u001B[32m";
24
+ readonly magenta: "\u001B[35m";
25
+ readonly gray: "\u001B[90m";
26
+ readonly white: "\u001B[37m";
27
+ readonly blue: "\u001B[34m";
28
+ readonly red: "\u001B[31m";
29
+ readonly dimBlue: "\u001B[2m\u001B[34m";
30
+ readonly dimCyan: "\u001B[2m\u001B[36m";
31
+ readonly dimGreen: "\u001B[2m\u001B[32m";
32
+ readonly dimYellow: "\u001B[2m\u001B[33m";
33
+ readonly dimMagenta: "\u001B[2m\u001B[35m";
34
+ readonly dimGray: "\u001B[2m\u001B[90m";
35
+ };
36
+ export declare function ansi(code: string, text: string): string;
37
+ /** Build a concise workspace overview for the system prompt. */
38
+ export declare function buildWorkspaceContext(workspaceRoot: string): Promise<string>;
39
+ /**
40
+ * Load JAM.md if present, otherwise fall back to auto-detected workspace context.
41
+ */
42
+ export declare function loadProjectContext(workspaceRoot: string): Promise<{
43
+ jamContext: string | null;
44
+ workspaceCtx: string;
45
+ }>;
46
+ export interface SystemPromptOptions {
47
+ /** 'readonly' for ask/chat, 'readwrite' for run */
48
+ mode: 'readonly' | 'readwrite';
49
+ /** Workspace root path (for run command context) */
50
+ workspaceRoot?: string;
51
+ }
52
+ /**
53
+ * Build a ReAct-style system prompt with project context.
54
+ */
55
+ export declare function buildSystemPrompt(jamContext: string | null, workspaceCtx: string, options?: SystemPromptOptions): string;
56
+ /**
57
+ * Generate a search plan by asking the model to reason about what to search for.
58
+ * This is a separate LLM call (no tools) that produces a focused plan
59
+ * for the agentic tool loop.
60
+ *
61
+ * Returns the plan text, or null if planning fails.
62
+ */
63
+ export declare function generateSearchPlan(provider: ProviderAdapter, question: string, projectContext: string, options: {
64
+ model?: string;
65
+ temperature?: number;
66
+ maxTokens?: number;
67
+ }): Promise<string | null>;
68
+ /**
69
+ * Enrich the user's prompt with search strategy guidance.
70
+ * If a search plan is provided, integrates it for focused searching.
71
+ * Otherwise falls back to generic search guidance.
72
+ */
73
+ export declare function enrichUserPrompt(prompt: string, searchPlan?: string | null): string;
74
+ /**
75
+ * Build a synthesis reminder that grounds the model back to the original question.
76
+ * Injected as a user message when the model is about to give its final answer
77
+ * (i.e., returns no tool calls after gathering context).
78
+ */
79
+ export declare function buildSynthesisReminder(originalQuestion: string): string;
80
+ export declare class ToolCallTracker {
81
+ private history;
82
+ private errorCount;
83
+ record(name: string, args: Record<string, unknown>, wasError: boolean): void;
84
+ /** Detect if a call was already made (exact duplicate). */
85
+ isDuplicate(name: string, args: Record<string, unknown>): boolean;
86
+ /** Build a correction hint if the model is stuck. */
87
+ getCorrectionHint(): string | null;
88
+ get totalCalls(): number;
89
+ /** Reset for a new turn (useful in multi-turn chat). */
90
+ reset(): void;
91
+ }
92
+ export interface ValidationResult {
93
+ valid: boolean;
94
+ reason?: string;
95
+ }
96
+ /**
97
+ * Check if the model's final answer looks acceptable.
98
+ * Returns { valid: false, reason } if it looks like garbage.
99
+ *
100
+ * @param text The model's answer text
101
+ * @param hadToolCalls Whether the model used tools (stricter validation if so)
102
+ * @param originalQuestion Optional: the user's original question for relevance checking
103
+ */
104
+ export declare function validateAnswer(text: string, hadToolCalls: boolean, originalQuestion?: string): ValidationResult;
105
+ /**
106
+ * Build a correction message to inject when the answer is invalid.
107
+ */
108
+ export declare function buildCorrectionMessage(reason: string): string;
109
+ /**
110
+ * Format the search plan text as a visually distinct block.
111
+ * Uses dim blue with a left-border character (│) to set it apart from tool output.
112
+ */
113
+ export declare function formatPlanBlock(planText: string, noColor: boolean): string;
114
+ /** Format an internal status message (compaction, critic, scratchpad, etc). Very dim. */
115
+ export declare function formatInternalStatus(message: string, noColor: boolean): string;
116
+ /** Format a tool call for display — dim cyan to stay visually secondary. */
117
+ export declare function formatToolCall(name: string, args: Record<string, unknown>, noColor: boolean): string;
118
+ /** Format a tool result summary for display — very dim, background-level. */
119
+ export declare function formatToolResult(output: string, noColor: boolean): string;
120
+ /** Print a section separator — bold accent to clearly demarcate phases. */
121
+ export declare function formatSeparator(label: string, noColor: boolean): string;
122
+ /** Format a duplicate skip message — dim red. */
123
+ export declare function formatDuplicateSkip(name: string, noColor: boolean): string;
124
+ /** Format a retry/validation message — dim yellow, secondary prominence. */
125
+ export declare function formatRetry(message: string, noColor: boolean): string;
126
+ /** Format a correction hint injection message. */
127
+ export declare function formatHintInjection(noColor: boolean): string;
128
+ /** Format usage stats — small dim footer. */
129
+ export declare function formatUsage(promptTokens: number, completionTokens: number, totalTokens: number, noColor: boolean): string;
130
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/utils/agent.ts"],"names":[],"mappings":"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"}