itermbot 1.0.2 → 1.0.4

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 (128) hide show
  1. package/.github/workflows/ci.yml +15 -20
  2. package/.github/workflows/release.yml +32 -20
  3. package/README.md +11 -20
  4. package/cleanup-unused.patch +108 -0
  5. package/config/app.yaml +32 -13
  6. package/config/memory.yaml +38 -31
  7. package/config/model.yaml +33 -0
  8. package/config/skill.yaml +8 -0
  9. package/config/tool.yaml +50 -17
  10. package/config/tsconfig.json +4 -1
  11. package/dist/chat/builtin-commands.d.ts +8 -0
  12. package/dist/chat/builtin-commands.d.ts.map +1 -0
  13. package/dist/chat/builtin-commands.js +53 -0
  14. package/dist/chat/builtin-commands.js.map +1 -0
  15. package/dist/chat/progress.d.ts +3 -0
  16. package/dist/chat/progress.d.ts.map +1 -0
  17. package/dist/chat/progress.js +23 -0
  18. package/dist/chat/progress.js.map +1 -0
  19. package/dist/chat/response-safety.d.ts +8 -0
  20. package/dist/chat/response-safety.d.ts.map +1 -0
  21. package/dist/chat/response-safety.js +126 -0
  22. package/dist/chat/response-safety.js.map +1 -0
  23. package/dist/chat/step-display.d.ts +2 -0
  24. package/dist/chat/step-display.d.ts.map +1 -0
  25. package/dist/chat/step-display.js +50 -0
  26. package/dist/chat/step-display.js.map +1 -0
  27. package/dist/chat/tool-result.d.ts +4 -0
  28. package/dist/chat/tool-result.d.ts.map +1 -0
  29. package/dist/chat/tool-result.js +24 -0
  30. package/dist/chat/tool-result.js.map +1 -0
  31. package/dist/config.d.ts +11 -6
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +26 -12
  34. package/dist/config.js.map +1 -1
  35. package/dist/index.js +308 -151
  36. package/dist/index.js.map +1 -1
  37. package/dist/iterm/direct-command-router.d.ts +24 -0
  38. package/dist/iterm/direct-command-router.d.ts.map +1 -0
  39. package/dist/iterm/direct-command-router.js +213 -0
  40. package/dist/iterm/direct-command-router.js.map +1 -0
  41. package/dist/iterm/session-hint.d.ts +10 -0
  42. package/dist/iterm/session-hint.d.ts.map +1 -0
  43. package/dist/iterm/session-hint.js +43 -0
  44. package/dist/iterm/session-hint.js.map +1 -0
  45. package/dist/iterm/target-panel-policy.d.ts +12 -0
  46. package/dist/iterm/target-panel-policy.d.ts.map +1 -0
  47. package/dist/iterm/target-panel-policy.js +287 -0
  48. package/dist/iterm/target-panel-policy.js.map +1 -0
  49. package/dist/runtime/text-tool-call-recovery.d.ts +23 -0
  50. package/dist/runtime/text-tool-call-recovery.d.ts.map +1 -0
  51. package/dist/runtime/text-tool-call-recovery.js +211 -0
  52. package/dist/runtime/text-tool-call-recovery.js.map +1 -0
  53. package/dist/startup/colors.d.ts +37 -0
  54. package/dist/startup/colors.d.ts.map +1 -0
  55. package/dist/{startup-colors.js → startup/colors.js} +30 -15
  56. package/dist/startup/colors.js.map +1 -0
  57. package/dist/startup/diagnostics.d.ts +8 -0
  58. package/dist/startup/diagnostics.d.ts.map +1 -0
  59. package/dist/startup/diagnostics.js +18 -0
  60. package/dist/startup/diagnostics.js.map +1 -0
  61. package/dist/startup/os.d.ts +10 -0
  62. package/dist/startup/os.d.ts.map +1 -0
  63. package/dist/startup/os.js +67 -0
  64. package/dist/startup/os.js.map +1 -0
  65. package/dist/startup/ui.d.ts +11 -0
  66. package/dist/startup/ui.d.ts.map +1 -0
  67. package/dist/startup/ui.js +49 -0
  68. package/dist/startup/ui.js.map +1 -0
  69. package/package.json +23 -13
  70. package/scripts/internal-package-refs.mjs +158 -0
  71. package/scripts/patch-buildin-cache.sh +1 -4
  72. package/scripts/resolve-deps.js +5 -0
  73. package/scripts/test-llm.mjs +11 -5
  74. package/skills/gpu-ssh-monitor/SKILL.md +22 -3
  75. package/src/chat/builtin-commands.ts +70 -0
  76. package/src/chat/progress.ts +26 -0
  77. package/src/chat/response-safety.ts +134 -0
  78. package/src/chat/step-display.ts +54 -0
  79. package/src/chat/tool-result.ts +22 -0
  80. package/src/config.ts +48 -21
  81. package/src/index.ts +377 -167
  82. package/src/iterm/direct-command-router.ts +274 -0
  83. package/src/iterm/session-hint.ts +49 -0
  84. package/src/iterm/target-panel-policy.ts +341 -0
  85. package/src/runtime/text-tool-call-recovery.ts +257 -0
  86. package/src/{startup-colors.ts → startup/colors.ts} +42 -27
  87. package/src/startup/diagnostics.ts +25 -0
  88. package/src/startup/os.ts +63 -0
  89. package/src/startup/ui.ts +56 -0
  90. package/src/types/marked-terminal.d.ts +3 -0
  91. package/test/builtin-commands.test.mjs +50 -0
  92. package/test/chat-flow.integration.test.mjs +235 -0
  93. package/test/chat-progress.test.mjs +83 -0
  94. package/test/config.test.mjs +22 -0
  95. package/test/diagnostics.test.mjs +45 -0
  96. package/test/direct-command-router.test.mjs +149 -0
  97. package/test/live-iterm-llm.integration.test.mjs +153 -0
  98. package/test/response-safety.test.mjs +44 -0
  99. package/test/session-hint.test.mjs +78 -0
  100. package/test/startup-colors.test.mjs +145 -0
  101. package/test/target-panel-policy.test.mjs +180 -0
  102. package/test/tool-call-recovery.test.mjs +199 -0
  103. package/config/agent.yaml +0 -121
  104. package/config/models.yaml +0 -36
  105. package/config/skills.yaml +0 -4
  106. package/dist/agent.d.ts +0 -14
  107. package/dist/agent.d.ts.map +0 -1
  108. package/dist/agent.js +0 -16
  109. package/dist/agent.js.map +0 -1
  110. package/dist/context.d.ts +0 -12
  111. package/dist/context.d.ts.map +0 -1
  112. package/dist/context.js +0 -20
  113. package/dist/context.js.map +0 -1
  114. package/dist/session-hint.d.ts +0 -4
  115. package/dist/session-hint.d.ts.map +0 -1
  116. package/dist/session-hint.js +0 -25
  117. package/dist/session-hint.js.map +0 -1
  118. package/dist/startup-colors.d.ts +0 -26
  119. package/dist/startup-colors.d.ts.map +0 -1
  120. package/dist/startup-colors.js.map +0 -1
  121. package/dist/target-routing.d.ts +0 -15
  122. package/dist/target-routing.d.ts.map +0 -1
  123. package/dist/target-routing.js +0 -355
  124. package/dist/target-routing.js.map +0 -1
  125. package/src/agent.ts +0 -35
  126. package/src/context.ts +0 -35
  127. package/src/session-hint.ts +0 -28
  128. package/src/target-routing.ts +0 -419
@@ -1,355 +0,0 @@
1
- import { itermListCurrentWindowSessions, itermRename, itermSetSessionColors, itermSplitPane, } from "@easynet/agent-tool-buildin/iterm";
2
- import { CHAT_BG, CHAT_FG, TARGET_BG, TARGET_FG, captureSessionColorsByIdSync, restoreSessionColorsSync, } from "./startup-colors.js";
3
- export function enableDynamicTargetRouting(ctx, state, options = {}) {
4
- const intervalMs = options.intervalMs ?? 2000;
5
- const chatTitle = options.chatTitle ?? "iTermBot Chat";
6
- const targetTitle = options.targetTitle ?? "iTermBot Target";
7
- const unpatchFns = [];
8
- let announcedTarget = state.targetSessionId;
9
- const originalColors = new Map();
10
- const verboseRoutingLog = process.env.ITERMBOT_ROUTING_LOG === "1";
11
- const announceRoutingChange = (message) => {
12
- // Avoid breaking readline prompt in interactive TTY mode.
13
- if (!verboseRoutingLog)
14
- return;
15
- console.error(message);
16
- };
17
- const isLikelyRoutingError = (error) => {
18
- const message = error instanceof Error
19
- ? error.message
20
- : typeof error === "string"
21
- ? error
22
- : "";
23
- if (!message)
24
- return false;
25
- const lower = message.toLowerCase();
26
- return (lower.includes("session") ||
27
- lower.includes("window") ||
28
- lower.includes("tab") ||
29
- lower.includes("not found") ||
30
- lower.includes("missing value") ||
31
- lower.includes("iterm"));
32
- };
33
- const setSessionTitle = async (sessionId, windowId, tabIndex, sessionName) => {
34
- if (!sessionId)
35
- return;
36
- if (typeof windowId !== "number" || typeof tabIndex !== "number")
37
- return;
38
- try {
39
- await itermRename({
40
- windowId,
41
- tabIndex,
42
- sessionId,
43
- sessionName,
44
- });
45
- }
46
- catch {
47
- // non-fatal
48
- }
49
- };
50
- const setSessionColors = async (sessionId, windowId, tabIndex, colors) => {
51
- if (!sessionId)
52
- return;
53
- if (typeof windowId !== "number" || typeof tabIndex !== "number")
54
- return;
55
- try {
56
- await itermSetSessionColors({
57
- windowId,
58
- tabIndex,
59
- sessionId,
60
- backgroundHex: colors.backgroundHex,
61
- foregroundHex: colors.foregroundHex,
62
- });
63
- }
64
- catch {
65
- // non-fatal
66
- }
67
- };
68
- const rememberOriginalColors = (sessionId, windowId, tabIndex) => {
69
- if (!sessionId)
70
- return;
71
- if (originalColors.has(sessionId))
72
- return;
73
- if (typeof windowId !== "number" || typeof tabIndex !== "number")
74
- return;
75
- const snapshot = captureSessionColorsByIdSync({
76
- windowId,
77
- tabIndex,
78
- sessionId,
79
- });
80
- if (!snapshot)
81
- return;
82
- originalColors.set(sessionId, snapshot);
83
- };
84
- const restoreOriginalColors = (sessionId) => {
85
- if (!sessionId)
86
- return;
87
- const snapshot = originalColors.get(sessionId);
88
- if (!snapshot)
89
- return;
90
- try {
91
- restoreSessionColorsSync([snapshot]);
92
- }
93
- catch {
94
- // non-fatal
95
- }
96
- };
97
- const enforceTitles = async () => {
98
- if (state.chatSessionId) {
99
- await setSessionTitle(state.chatSessionId, state.chatWindowId, state.chatTabIndex, chatTitle);
100
- await setSessionColors(state.chatSessionId, state.chatWindowId, state.chatTabIndex, {
101
- backgroundHex: CHAT_BG,
102
- foregroundHex: CHAT_FG,
103
- });
104
- }
105
- if (state.targetSessionId) {
106
- rememberOriginalColors(state.targetSessionId, state.windowId, state.tabIndex);
107
- await setSessionTitle(state.targetSessionId, state.windowId, state.tabIndex, targetTitle);
108
- await setSessionColors(state.targetSessionId, state.windowId, state.tabIndex, {
109
- backgroundHex: TARGET_BG,
110
- foregroundHex: TARGET_FG,
111
- });
112
- }
113
- };
114
- const chooseFallbackTarget = (sessions, chatSessionId) => {
115
- const bySameTab = sessions.find((s) => Boolean(s.sessionId) &&
116
- s.sessionId !== chatSessionId &&
117
- typeof state.chatTabIndex === "number" &&
118
- s.tabIndex === state.chatTabIndex);
119
- if (bySameTab)
120
- return bySameTab;
121
- const byCurrentTab = sessions.find((s) => Boolean(s.sessionId) &&
122
- s.sessionId !== chatSessionId &&
123
- s.isCurrentTab);
124
- if (byCurrentTab)
125
- return byCurrentTab;
126
- const byAny = sessions.find((s) => Boolean(s.sessionId) &&
127
- s.sessionId !== chatSessionId);
128
- return byAny ?? null;
129
- };
130
- const refreshTargetForCommand = async (opts) => {
131
- const { result } = await itermListCurrentWindowSessions();
132
- const sessions = (result.sessions ?? []);
133
- if (sessions.length === 0) {
134
- return { changed: false, autoCreated: false };
135
- }
136
- const current = sessions.find((s) => s.isCurrentSession && s.sessionId) ?? null;
137
- const chatSession = sessions.find((s) => s.sessionId && state.chatSessionId && s.sessionId === state.chatSessionId) ??
138
- current ??
139
- sessions.find((s) => Boolean(s.sessionId)) ??
140
- null;
141
- if (chatSession?.sessionId) {
142
- const prevChatSessionId = state.chatSessionId;
143
- state.chatSessionId = chatSession.sessionId;
144
- if (typeof chatSession.windowId === "number")
145
- state.chatWindowId = chatSession.windowId;
146
- if (typeof chatSession.tabIndex === "number")
147
- state.chatTabIndex = chatSession.tabIndex;
148
- if (prevChatSessionId !== state.chatSessionId) {
149
- state.targetSessionId = null;
150
- }
151
- }
152
- if (opts.adoptFocusedNonChat && current?.sessionId && current.sessionId !== state.chatSessionId) {
153
- const changed = state.targetSessionId !== current.sessionId;
154
- state.targetSessionId = current.sessionId;
155
- if (typeof current.windowId === "number")
156
- state.windowId = current.windowId;
157
- if (typeof current.tabIndex === "number")
158
- state.tabIndex = current.tabIndex;
159
- return { changed, autoCreated: false };
160
- }
161
- const currentTarget = sessions.find((s) => s.sessionId && s.sessionId === state.targetSessionId) ?? null;
162
- const targetIsValid = Boolean(currentTarget?.sessionId &&
163
- (!state.chatSessionId || currentTarget.sessionId !== state.chatSessionId));
164
- if (targetIsValid) {
165
- if (currentTarget && typeof currentTarget.windowId === "number")
166
- state.windowId = currentTarget.windowId;
167
- if (currentTarget && typeof currentTarget.tabIndex === "number")
168
- state.tabIndex = currentTarget.tabIndex;
169
- return { changed: false, autoCreated: false };
170
- }
171
- const fallback = chooseFallbackTarget(sessions, state.chatSessionId);
172
- if (fallback?.sessionId) {
173
- const changed = state.targetSessionId !== fallback.sessionId;
174
- state.targetSessionId = fallback.sessionId;
175
- if (typeof fallback.windowId === "number")
176
- state.windowId = fallback.windowId;
177
- if (typeof fallback.tabIndex === "number")
178
- state.tabIndex = fallback.tabIndex;
179
- return { changed, autoCreated: false };
180
- }
181
- if (!opts.allowSplit || !chatSession?.sessionId) {
182
- return { changed: false, autoCreated: false };
183
- }
184
- const split = await itermSplitPane({
185
- windowId: typeof chatSession.windowId === "number" ? chatSession.windowId : undefined,
186
- tabIndex: typeof chatSession.tabIndex === "number" ? chatSession.tabIndex : undefined,
187
- sessionId: chatSession.sessionId,
188
- direction: "vertical",
189
- activate: false,
190
- });
191
- const splitSessionId = typeof split?.result?.sessionId === "string" ? split.result.sessionId : "";
192
- if (splitSessionId && splitSessionId !== chatSession.sessionId) {
193
- const changed = state.targetSessionId !== splitSessionId;
194
- state.targetSessionId = splitSessionId;
195
- if (typeof split.result.windowId === "number")
196
- state.windowId = split.result.windowId;
197
- if (typeof split.result.tabIndex === "number")
198
- state.tabIndex = split.result.tabIndex;
199
- return { changed, autoCreated: true };
200
- }
201
- const refreshed = await itermListCurrentWindowSessions();
202
- const refreshedSessions = (refreshed.result.sessions ?? []);
203
- const refreshedFallback = chooseFallbackTarget(refreshedSessions, state.chatSessionId);
204
- if (refreshedFallback?.sessionId) {
205
- const changed = state.targetSessionId !== refreshedFallback.sessionId;
206
- state.targetSessionId = refreshedFallback.sessionId;
207
- if (typeof refreshedFallback.windowId === "number")
208
- state.windowId = refreshedFallback.windowId;
209
- if (typeof refreshedFallback.tabIndex === "number")
210
- state.tabIndex = refreshedFallback.tabIndex;
211
- return { changed, autoCreated: true };
212
- }
213
- return { changed: false, autoCreated: false };
214
- };
215
- // Initial titles
216
- void enforceTitles();
217
- for (const t of ctx.tools) {
218
- if (!t || typeof t.name !== "string" || typeof t.invoke !== "function")
219
- continue;
220
- if (!t.name.includes("itermRunCommandInSession"))
221
- continue;
222
- const originalInvoke = t.invoke.bind(t);
223
- t.invoke = async (args) => {
224
- const baseArgs = args && typeof args === "object"
225
- ? { ...args }
226
- : {};
227
- const applyRoutingArgs = (target) => {
228
- if (state.targetSessionId)
229
- target.sessionId = state.targetSessionId;
230
- if (typeof state.windowId === "number")
231
- target.windowId = state.windowId;
232
- if (typeof state.tabIndex === "number")
233
- target.tabIndex = state.tabIndex;
234
- };
235
- try {
236
- // Fast path: avoid iTerm preflight on every command.
237
- // Only preflight when routing state is empty.
238
- if (!state.targetSessionId) {
239
- const previousTarget = state.targetSessionId;
240
- const ensureResult = await refreshTargetForCommand({
241
- allowSplit: true,
242
- adoptFocusedNonChat: true,
243
- });
244
- if (ensureResult.changed) {
245
- await enforceTitles();
246
- if (previousTarget && previousTarget !== state.targetSessionId) {
247
- restoreOriginalColors(previousTarget);
248
- }
249
- if (state.targetSessionId !== announcedTarget) {
250
- announcedTarget = state.targetSessionId;
251
- if (ensureResult.autoCreated) {
252
- announceRoutingChange("Session routing updated: target panel auto-created and linked.");
253
- }
254
- else {
255
- announceRoutingChange("Session routing updated: target panel linked.");
256
- }
257
- }
258
- }
259
- }
260
- }
261
- catch {
262
- // keep previous target when preflight fails
263
- }
264
- applyRoutingArgs(baseArgs);
265
- try {
266
- return await originalInvoke(baseArgs);
267
- }
268
- catch (error) {
269
- if (!isLikelyRoutingError(error)) {
270
- throw error;
271
- }
272
- // Slow path fallback: routing may be stale (target pane closed/moved).
273
- const previousTarget = state.targetSessionId;
274
- try {
275
- const ensureResult = await refreshTargetForCommand({
276
- allowSplit: true,
277
- adoptFocusedNonChat: true,
278
- });
279
- if (ensureResult.changed) {
280
- await enforceTitles();
281
- if (previousTarget && previousTarget !== state.targetSessionId) {
282
- restoreOriginalColors(previousTarget);
283
- }
284
- if (state.targetSessionId !== announcedTarget) {
285
- announcedTarget = state.targetSessionId;
286
- if (ensureResult.autoCreated) {
287
- announceRoutingChange("Session routing updated: target panel auto-created and linked.");
288
- }
289
- else {
290
- announceRoutingChange("Session routing updated: target panel linked.");
291
- }
292
- }
293
- }
294
- }
295
- catch {
296
- // If reroute fails, fall through and surface original error.
297
- }
298
- const retryArgs = { ...baseArgs };
299
- applyRoutingArgs(retryArgs);
300
- return originalInvoke(retryArgs);
301
- }
302
- };
303
- unpatchFns.push(() => {
304
- t.invoke = originalInvoke;
305
- });
306
- }
307
- let stopped = false;
308
- let polling = false;
309
- const timer = setInterval(() => {
310
- if (stopped || polling)
311
- return;
312
- polling = true;
313
- void (async () => {
314
- try {
315
- const previousTarget = state.targetSessionId;
316
- const ensured = await refreshTargetForCommand({
317
- allowSplit: false,
318
- adoptFocusedNonChat: true,
319
- });
320
- if (ensured.changed) {
321
- await enforceTitles();
322
- if (previousTarget && previousTarget !== state.targetSessionId) {
323
- restoreOriginalColors(previousTarget);
324
- }
325
- }
326
- if (state.targetSessionId === announcedTarget)
327
- return;
328
- announcedTarget = state.targetSessionId;
329
- announceRoutingChange("Session routing updated: target panel linked.");
330
- }
331
- catch {
332
- // keep previous target when polling fails
333
- }
334
- finally {
335
- polling = false;
336
- }
337
- })();
338
- }, intervalMs);
339
- return () => {
340
- stopped = true;
341
- clearInterval(timer);
342
- if (originalColors.size > 0) {
343
- try {
344
- restoreSessionColorsSync(Array.from(originalColors.values()));
345
- }
346
- catch {
347
- // non-fatal
348
- }
349
- }
350
- for (const unpatch of unpatchFns) {
351
- unpatch();
352
- }
353
- };
354
- }
355
- //# sourceMappingURL=target-routing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"target-routing.js","sourceRoot":"","sources":["../src/target-routing.ts"],"names":[],"mappings":"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"}
package/src/agent.ts DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * iTermBot agent factories — thin wrappers over agent-runtime.
3
- */
4
- import {
5
- createReactAgent,
6
- createDeepAgent,
7
- type ReactAgentRuntime,
8
- type DeepAgentRuntime,
9
- type ReactAgentOptions,
10
- type DeepAgentOptions,
11
- type CreateContextOptions,
12
- } from "@easynet/agent-runtime";
13
- import { createAgent as createAgentContext } from "./context.js";
14
-
15
- export type { ReactAgentRuntime, DeepAgentRuntime, CreateContextOptions };
16
-
17
- export interface CreateAppAgentOptions extends CreateContextOptions {
18
- react?: ReactAgentOptions;
19
- }
20
-
21
- export interface CreateAppDeepAgentOptions extends CreateContextOptions {
22
- deep?: DeepAgentOptions;
23
- }
24
-
25
- export async function createAgent(options: CreateAppAgentOptions = {}): Promise<ReactAgentRuntime> {
26
- const { react, ...contextOptions } = options;
27
- const ctx = await createAgentContext({ agentName: "react", ...contextOptions });
28
- return createReactAgent(ctx, { agentName: "react", ...react });
29
- }
30
-
31
- export async function createDeepAgentFromContext(options: CreateAppDeepAgentOptions = {}): Promise<DeepAgentRuntime> {
32
- const { deep, ...contextOptions } = options;
33
- const ctx = await createAgentContext({ agentName: "deep", ...contextOptions });
34
- return createDeepAgent(ctx, { agentName: "deep", ...deep });
35
- }
package/src/context.ts DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * Shared runtime context: LLM, memory, tools.
3
- * Built once and passed to both ReAct and Deep agents.
4
- */
5
- import {
6
- createContextBuilders,
7
- type AppContextBuilders,
8
- type BotContext,
9
- type BotTool,
10
- type CreateContextOptions,
11
- } from "@easynet/agent-runtime";
12
- import {
13
- loadAppConfig,
14
- getModelsConfigPath,
15
- getMemoryConfigPath,
16
- getToolConfigPath,
17
- type AppConfig,
18
- } from "./config.js";
19
-
20
- export type { BotContext, BotTool, CreateContextOptions };
21
-
22
- const builders: AppContextBuilders = createContextBuilders<AppConfig>({
23
- configApi: {
24
- loadAgentConfig: loadAppConfig,
25
- getModelsConfigPath: (config: AppConfig, agentName?: string) => getModelsConfigPath(config, agentName),
26
- getMemoryConfigPath: (config: AppConfig, agentName?: string) => getMemoryConfigPath(config, agentName),
27
- getToolConfigPath: (config: AppConfig, agentName?: string) => getToolConfigPath(config, agentName),
28
- },
29
- });
30
-
31
- export const createAgentLlm: AppContextBuilders["createAgentLlm"] = builders.createAgentLlm;
32
- export const createAgentMemory: AppContextBuilders["createAgentMemory"] = builders.createAgentMemory;
33
- export const createAgentTools: AppContextBuilders["createAgentTools"] = builders.createAgentTools;
34
- export const createAgent: AppContextBuilders["createAgent"] = builders.createAgent;
35
- export const createBotContext: AppContextBuilders["createBotContext"] = builders.createBotContext;
@@ -1,28 +0,0 @@
1
- import type { BotContext } from "@easynet/agent-runtime";
2
- import type { StartupResult } from "./startup-colors.js";
3
-
4
- function formatTargetSessionHint(template: string, startup: StartupResult): string {
5
- return template
6
- .replaceAll("{{sessionId}}", startup.targetSessionId ?? "")
7
- .replaceAll("{{windowId}}", String(startup.windowId))
8
- .replaceAll("{{tabIndex}}", String(startup.tabIndex));
9
- }
10
-
11
- export function injectTargetSessionHint(ctx: BotContext, startup: StartupResult): void {
12
- const templates = (ctx.config.app as { prompt_templates?: { iterm_policy?: string; target_session?: string } } | undefined)
13
- ?.prompt_templates;
14
- const policyTemplate = templates?.iterm_policy?.trim() ?? "";
15
- const targetTemplate = templates?.target_session?.trim() ?? "";
16
- const policyHint = policyTemplate ? `\n\n${policyTemplate}` : "";
17
- const sessionHint = startup.targetSessionId && targetTemplate
18
- ? `\n\n${formatTargetSessionHint(targetTemplate, startup)}`
19
- : "";
20
-
21
- const agents = ctx.config.app?.agent as Record<string, { systemPrompt?: string } | undefined> | undefined;
22
- if (!agents) return;
23
- for (const agentCfg of Object.values(agents)) {
24
- if (agentCfg) {
25
- agentCfg.systemPrompt = (agentCfg.systemPrompt ?? "") + policyHint + sessionHint;
26
- }
27
- }
28
- }