@researchcomputer/agents-sdk 0.1.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 (274) hide show
  1. package/README.md +60 -0
  2. package/dist/agents/messages.d.ts +29 -0
  3. package/dist/agents/messages.d.ts.map +1 -0
  4. package/dist/agents/messages.js +56 -0
  5. package/dist/agents/messages.js.map +1 -0
  6. package/dist/agents/messages.test.d.ts +2 -0
  7. package/dist/agents/messages.test.d.ts.map +1 -0
  8. package/dist/agents/messages.test.js +80 -0
  9. package/dist/agents/messages.test.js.map +1 -0
  10. package/dist/agents/subagent.d.ts +16 -0
  11. package/dist/agents/subagent.d.ts.map +1 -0
  12. package/dist/agents/subagent.js +46 -0
  13. package/dist/agents/subagent.js.map +1 -0
  14. package/dist/agents/swarm.d.ts +22 -0
  15. package/dist/agents/swarm.d.ts.map +1 -0
  16. package/dist/agents/swarm.js +140 -0
  17. package/dist/agents/swarm.js.map +1 -0
  18. package/dist/agents/tools.d.ts +6 -0
  19. package/dist/agents/tools.d.ts.map +1 -0
  20. package/dist/agents/tools.js +71 -0
  21. package/dist/agents/tools.js.map +1 -0
  22. package/dist/agents/tools.test.d.ts +2 -0
  23. package/dist/agents/tools.test.d.ts.map +1 -0
  24. package/dist/agents/tools.test.js +70 -0
  25. package/dist/agents/tools.test.js.map +1 -0
  26. package/dist/bridge/config.d.ts +21 -0
  27. package/dist/bridge/config.d.ts.map +1 -0
  28. package/dist/bridge/config.js +35 -0
  29. package/dist/bridge/config.js.map +1 -0
  30. package/dist/bridge/config.test.d.ts +2 -0
  31. package/dist/bridge/config.test.d.ts.map +1 -0
  32. package/dist/bridge/config.test.js +79 -0
  33. package/dist/bridge/config.test.js.map +1 -0
  34. package/dist/bridge/server.d.ts +3 -0
  35. package/dist/bridge/server.d.ts.map +1 -0
  36. package/dist/bridge/server.js +316 -0
  37. package/dist/bridge/server.js.map +1 -0
  38. package/dist/context/compression.d.ts +27 -0
  39. package/dist/context/compression.d.ts.map +1 -0
  40. package/dist/context/compression.js +117 -0
  41. package/dist/context/compression.js.map +1 -0
  42. package/dist/context/compression.test.d.ts +2 -0
  43. package/dist/context/compression.test.d.ts.map +1 -0
  44. package/dist/context/compression.test.js +170 -0
  45. package/dist/context/compression.test.js.map +1 -0
  46. package/dist/context/converter.d.ts +11 -0
  47. package/dist/context/converter.d.ts.map +1 -0
  48. package/dist/context/converter.js +40 -0
  49. package/dist/context/converter.js.map +1 -0
  50. package/dist/context/converter.test.d.ts +2 -0
  51. package/dist/context/converter.test.d.ts.map +1 -0
  52. package/dist/context/converter.test.js +110 -0
  53. package/dist/context/converter.test.js.map +1 -0
  54. package/dist/context/run-context.d.ts +9 -0
  55. package/dist/context/run-context.d.ts.map +1 -0
  56. package/dist/context/run-context.js +14 -0
  57. package/dist/context/run-context.js.map +1 -0
  58. package/dist/context/run-context.test.d.ts +2 -0
  59. package/dist/context/run-context.test.d.ts.map +1 -0
  60. package/dist/context/run-context.test.js +34 -0
  61. package/dist/context/run-context.test.js.map +1 -0
  62. package/dist/context/system-prompt.d.ts +24 -0
  63. package/dist/context/system-prompt.d.ts.map +1 -0
  64. package/dist/context/system-prompt.js +69 -0
  65. package/dist/context/system-prompt.js.map +1 -0
  66. package/dist/context/system-prompt.test.d.ts +2 -0
  67. package/dist/context/system-prompt.test.d.ts.map +1 -0
  68. package/dist/context/system-prompt.test.js +134 -0
  69. package/dist/context/system-prompt.test.js.map +1 -0
  70. package/dist/errors.d.ts +24 -0
  71. package/dist/errors.d.ts.map +1 -0
  72. package/dist/errors.js +47 -0
  73. package/dist/errors.js.map +1 -0
  74. package/dist/errors.test.d.ts +2 -0
  75. package/dist/errors.test.d.ts.map +1 -0
  76. package/dist/errors.test.js +68 -0
  77. package/dist/errors.test.js.map +1 -0
  78. package/dist/factory.d.ts +58 -0
  79. package/dist/factory.d.ts.map +1 -0
  80. package/dist/factory.js +282 -0
  81. package/dist/factory.js.map +1 -0
  82. package/dist/factory.test.d.ts +2 -0
  83. package/dist/factory.test.d.ts.map +1 -0
  84. package/dist/factory.test.js +63 -0
  85. package/dist/factory.test.js.map +1 -0
  86. package/dist/fork.test.d.ts +2 -0
  87. package/dist/fork.test.d.ts.map +1 -0
  88. package/dist/fork.test.js +456 -0
  89. package/dist/fork.test.js.map +1 -0
  90. package/dist/index.d.ts +29 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +32 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/mcp/client.d.ts +3 -0
  95. package/dist/mcp/client.d.ts.map +1 -0
  96. package/dist/mcp/client.js +75 -0
  97. package/dist/mcp/client.js.map +1 -0
  98. package/dist/mcp/schema-convert.d.ts +3 -0
  99. package/dist/mcp/schema-convert.d.ts.map +1 -0
  100. package/dist/mcp/schema-convert.js +73 -0
  101. package/dist/mcp/schema-convert.js.map +1 -0
  102. package/dist/mcp/schema-convert.test.d.ts +2 -0
  103. package/dist/mcp/schema-convert.test.d.ts.map +1 -0
  104. package/dist/mcp/schema-convert.test.js +95 -0
  105. package/dist/mcp/schema-convert.test.js.map +1 -0
  106. package/dist/mcp/tools.d.ts +14 -0
  107. package/dist/mcp/tools.d.ts.map +1 -0
  108. package/dist/mcp/tools.js +23 -0
  109. package/dist/mcp/tools.js.map +1 -0
  110. package/dist/mcp/tools.test.d.ts +2 -0
  111. package/dist/mcp/tools.test.d.ts.map +1 -0
  112. package/dist/mcp/tools.test.js +45 -0
  113. package/dist/mcp/tools.test.js.map +1 -0
  114. package/dist/memory/memory.d.ts +3 -0
  115. package/dist/memory/memory.d.ts.map +1 -0
  116. package/dist/memory/memory.js +130 -0
  117. package/dist/memory/memory.js.map +1 -0
  118. package/dist/memory/memory.test.d.ts +2 -0
  119. package/dist/memory/memory.test.d.ts.map +1 -0
  120. package/dist/memory/memory.test.js +94 -0
  121. package/dist/memory/memory.test.js.map +1 -0
  122. package/dist/middleware/hooks.d.ts +18 -0
  123. package/dist/middleware/hooks.d.ts.map +1 -0
  124. package/dist/middleware/hooks.js +71 -0
  125. package/dist/middleware/hooks.js.map +1 -0
  126. package/dist/middleware/hooks.test.d.ts +2 -0
  127. package/dist/middleware/hooks.test.d.ts.map +1 -0
  128. package/dist/middleware/hooks.test.js +172 -0
  129. package/dist/middleware/hooks.test.js.map +1 -0
  130. package/dist/middleware/index.d.ts +7 -0
  131. package/dist/middleware/index.d.ts.map +1 -0
  132. package/dist/middleware/index.js +5 -0
  133. package/dist/middleware/index.js.map +1 -0
  134. package/dist/middleware/permission-middleware.d.ts +11 -0
  135. package/dist/middleware/permission-middleware.d.ts.map +1 -0
  136. package/dist/middleware/permission-middleware.js +56 -0
  137. package/dist/middleware/permission-middleware.js.map +1 -0
  138. package/dist/middleware/permission-middleware.test.d.ts +2 -0
  139. package/dist/middleware/permission-middleware.test.d.ts.map +1 -0
  140. package/dist/middleware/permission-middleware.test.js +170 -0
  141. package/dist/middleware/permission-middleware.test.js.map +1 -0
  142. package/dist/middleware/permissions.d.ts +14 -0
  143. package/dist/middleware/permissions.d.ts.map +1 -0
  144. package/dist/middleware/permissions.js +118 -0
  145. package/dist/middleware/permissions.js.map +1 -0
  146. package/dist/middleware/permissions.test.d.ts +2 -0
  147. package/dist/middleware/permissions.test.d.ts.map +1 -0
  148. package/dist/middleware/permissions.test.js +187 -0
  149. package/dist/middleware/permissions.test.js.map +1 -0
  150. package/dist/middleware/pipeline.d.ts +13 -0
  151. package/dist/middleware/pipeline.d.ts.map +1 -0
  152. package/dist/middleware/pipeline.js +28 -0
  153. package/dist/middleware/pipeline.js.map +1 -0
  154. package/dist/middleware/pipeline.test.d.ts +2 -0
  155. package/dist/middleware/pipeline.test.d.ts.map +1 -0
  156. package/dist/middleware/pipeline.test.js +189 -0
  157. package/dist/middleware/pipeline.test.js.map +1 -0
  158. package/dist/observability/cost-tracker.d.ts +3 -0
  159. package/dist/observability/cost-tracker.d.ts.map +1 -0
  160. package/dist/observability/cost-tracker.js +26 -0
  161. package/dist/observability/cost-tracker.js.map +1 -0
  162. package/dist/observability/cost-tracker.test.d.ts +2 -0
  163. package/dist/observability/cost-tracker.test.d.ts.map +1 -0
  164. package/dist/observability/cost-tracker.test.js +49 -0
  165. package/dist/observability/cost-tracker.test.js.map +1 -0
  166. package/dist/observability/trace.d.ts +2 -0
  167. package/dist/observability/trace.d.ts.map +1 -0
  168. package/dist/observability/trace.js +5 -0
  169. package/dist/observability/trace.js.map +1 -0
  170. package/dist/session/session.d.ts +3 -0
  171. package/dist/session/session.d.ts.map +1 -0
  172. package/dist/session/session.js +62 -0
  173. package/dist/session/session.js.map +1 -0
  174. package/dist/session/session.test.d.ts +2 -0
  175. package/dist/session/session.test.d.ts.map +1 -0
  176. package/dist/session/session.test.js +84 -0
  177. package/dist/session/session.test.js.map +1 -0
  178. package/dist/skills.d.ts +14 -0
  179. package/dist/skills.d.ts.map +1 -0
  180. package/dist/skills.js +31 -0
  181. package/dist/skills.js.map +1 -0
  182. package/dist/skills.test.d.ts +2 -0
  183. package/dist/skills.test.d.ts.map +1 -0
  184. package/dist/skills.test.js +61 -0
  185. package/dist/skills.test.js.map +1 -0
  186. package/dist/tools/ask-user.d.ts +10 -0
  187. package/dist/tools/ask-user.d.ts.map +1 -0
  188. package/dist/tools/ask-user.js +27 -0
  189. package/dist/tools/ask-user.js.map +1 -0
  190. package/dist/tools/bash.d.ts +11 -0
  191. package/dist/tools/bash.d.ts.map +1 -0
  192. package/dist/tools/bash.js +54 -0
  193. package/dist/tools/bash.js.map +1 -0
  194. package/dist/tools/bash.test.d.ts +2 -0
  195. package/dist/tools/bash.test.d.ts.map +1 -0
  196. package/dist/tools/bash.test.js +63 -0
  197. package/dist/tools/bash.test.js.map +1 -0
  198. package/dist/tools/edit.d.ts +10 -0
  199. package/dist/tools/edit.d.ts.map +1 -0
  200. package/dist/tools/edit.js +65 -0
  201. package/dist/tools/edit.js.map +1 -0
  202. package/dist/tools/edit.test.d.ts +2 -0
  203. package/dist/tools/edit.test.d.ts.map +1 -0
  204. package/dist/tools/edit.test.js +60 -0
  205. package/dist/tools/edit.test.js.map +1 -0
  206. package/dist/tools/glob.d.ts +8 -0
  207. package/dist/tools/glob.d.ts.map +1 -0
  208. package/dist/tools/glob.js +43 -0
  209. package/dist/tools/glob.js.map +1 -0
  210. package/dist/tools/glob.test.d.ts +2 -0
  211. package/dist/tools/glob.test.d.ts.map +1 -0
  212. package/dist/tools/glob.test.js +54 -0
  213. package/dist/tools/glob.test.js.map +1 -0
  214. package/dist/tools/grep.d.ts +9 -0
  215. package/dist/tools/grep.d.ts.map +1 -0
  216. package/dist/tools/grep.js +74 -0
  217. package/dist/tools/grep.js.map +1 -0
  218. package/dist/tools/grep.test.d.ts +2 -0
  219. package/dist/tools/grep.test.d.ts.map +1 -0
  220. package/dist/tools/grep.test.js +48 -0
  221. package/dist/tools/grep.test.js.map +1 -0
  222. package/dist/tools/index.d.ts +25 -0
  223. package/dist/tools/index.d.ts.map +1 -0
  224. package/dist/tools/index.js +40 -0
  225. package/dist/tools/index.js.map +1 -0
  226. package/dist/tools/index.test.d.ts +2 -0
  227. package/dist/tools/index.test.d.ts.map +1 -0
  228. package/dist/tools/index.test.js +102 -0
  229. package/dist/tools/index.test.js.map +1 -0
  230. package/dist/tools/notebook-edit.d.ts +9 -0
  231. package/dist/tools/notebook-edit.d.ts.map +1 -0
  232. package/dist/tools/notebook-edit.js +55 -0
  233. package/dist/tools/notebook-edit.js.map +1 -0
  234. package/dist/tools/read.d.ts +9 -0
  235. package/dist/tools/read.d.ts.map +1 -0
  236. package/dist/tools/read.js +48 -0
  237. package/dist/tools/read.js.map +1 -0
  238. package/dist/tools/read.test.d.ts +2 -0
  239. package/dist/tools/read.test.d.ts.map +1 -0
  240. package/dist/tools/read.test.js +68 -0
  241. package/dist/tools/read.test.js.map +1 -0
  242. package/dist/tools/util.d.ts +19 -0
  243. package/dist/tools/util.d.ts.map +1 -0
  244. package/dist/tools/util.js +44 -0
  245. package/dist/tools/util.js.map +1 -0
  246. package/dist/tools/util.test.d.ts +2 -0
  247. package/dist/tools/util.test.d.ts.map +1 -0
  248. package/dist/tools/util.test.js +75 -0
  249. package/dist/tools/util.test.js.map +1 -0
  250. package/dist/tools/web-fetch.d.ts +7 -0
  251. package/dist/tools/web-fetch.d.ts.map +1 -0
  252. package/dist/tools/web-fetch.js +35 -0
  253. package/dist/tools/web-fetch.js.map +1 -0
  254. package/dist/tools/web-search.d.ts +7 -0
  255. package/dist/tools/web-search.d.ts.map +1 -0
  256. package/dist/tools/web-search.js +20 -0
  257. package/dist/tools/web-search.js.map +1 -0
  258. package/dist/tools/write.d.ts +8 -0
  259. package/dist/tools/write.d.ts.map +1 -0
  260. package/dist/tools/write.js +33 -0
  261. package/dist/tools/write.js.map +1 -0
  262. package/dist/tools/write.test.d.ts +2 -0
  263. package/dist/tools/write.test.d.ts.map +1 -0
  264. package/dist/tools/write.test.js +49 -0
  265. package/dist/tools/write.test.js.map +1 -0
  266. package/dist/types.d.ts +257 -0
  267. package/dist/types.d.ts.map +1 -0
  268. package/dist/types.js +2 -0
  269. package/dist/types.js.map +1 -0
  270. package/dist/types.test.d.ts +2 -0
  271. package/dist/types.test.d.ts.map +1 -0
  272. package/dist/types.test.js +69 -0
  273. package/dist/types.test.js.map +1 -0
  274. package/package.json +51 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Estimates token count as ceil(text.length / 4).
3
+ */
4
+ export function estimateTokens(text) {
5
+ return Math.ceil(text.length / 4);
6
+ }
7
+ /**
8
+ * Extracts text content from an AgentMessage.
9
+ * Handles string content, array of TextContent, or falls back to JSON.stringify.
10
+ */
11
+ export function messageText(msg) {
12
+ const m = msg;
13
+ const content = m.content;
14
+ if (typeof content === 'string') {
15
+ return content;
16
+ }
17
+ if (Array.isArray(content)) {
18
+ const texts = content
19
+ .filter((c) => c.type === 'text')
20
+ .map((c) => c.text);
21
+ if (texts.length > 0) {
22
+ return texts.join('\n');
23
+ }
24
+ }
25
+ return JSON.stringify(m);
26
+ }
27
+ function roleToSegmentType(role) {
28
+ switch (role) {
29
+ case 'user': return 'user';
30
+ case 'assistant': return 'assistant';
31
+ case 'toolResult': return 'toolIO';
32
+ case 'memory': return 'memory';
33
+ case 'summary': return 'summary';
34
+ default: return 'user'; // fallback
35
+ }
36
+ }
37
+ /**
38
+ * Groups messages into TranscriptSegments by consecutive role type.
39
+ */
40
+ export function segmentMessages(messages) {
41
+ if (messages.length === 0)
42
+ return [];
43
+ const segments = [];
44
+ let currentType = null;
45
+ let currentMessages = [];
46
+ for (const msg of messages) {
47
+ const m = msg;
48
+ const type = roleToSegmentType(m.role);
49
+ if (type === currentType) {
50
+ currentMessages.push(msg);
51
+ }
52
+ else {
53
+ if (currentType !== null) {
54
+ segments.push({ type: currentType, protected: false, messages: currentMessages });
55
+ }
56
+ currentType = type;
57
+ currentMessages = [msg];
58
+ }
59
+ }
60
+ if (currentType !== null) {
61
+ segments.push({ type: currentType, protected: false, messages: currentMessages });
62
+ }
63
+ return segments;
64
+ }
65
+ /**
66
+ * Creates a transformContext middleware for context compression.
67
+ *
68
+ * Truncate strategy:
69
+ * - Protects the most recent N turns (protectedRecentTurns * 3 messages)
70
+ * - If total tokens are under 80% of maxTokens, returns unchanged
71
+ * - Otherwise keeps as many older messages as fit in budget, starting from most recent older ones
72
+ *
73
+ * Summarize strategy falls back to truncate for now.
74
+ */
75
+ export function createCompressionMiddleware(config) {
76
+ const protectedRecentTurns = config.protectedRecentTurns ?? 3;
77
+ const protectedMessageCount = protectedRecentTurns * 3;
78
+ return async (messages, _signal) => {
79
+ // Estimate total tokens
80
+ const totalText = messages.map(m => messageText(m)).join('');
81
+ const totalTokens = estimateTokens(totalText);
82
+ // If under 80% of budget, return unchanged
83
+ if (totalTokens <= config.maxTokens * 0.8) {
84
+ return messages;
85
+ }
86
+ // Split into older and protected recent messages
87
+ const protectedCount = Math.min(protectedMessageCount, messages.length);
88
+ const splitIndex = messages.length - protectedCount;
89
+ const olderMessages = messages.slice(0, splitIndex);
90
+ const recentMessages = messages.slice(splitIndex);
91
+ // Calculate token budget for older messages
92
+ const recentText = recentMessages.map(m => messageText(m)).join('');
93
+ const recentTokens = estimateTokens(recentText);
94
+ const olderBudget = config.maxTokens - recentTokens;
95
+ if (olderBudget <= 0) {
96
+ // Only recent messages fit
97
+ return recentMessages;
98
+ }
99
+ // Use segment-based truncation to avoid splitting mid-turn
100
+ const segments = segmentMessages(olderMessages);
101
+ const kept = [];
102
+ let usedTokens = 0;
103
+ // Keep as many older segments as fit, starting from most recent
104
+ for (let i = segments.length - 1; i >= 0; i--) {
105
+ const segTokens = segments[i].messages.reduce((sum, m) => sum + estimateTokens(messageText(m)), 0);
106
+ if (usedTokens + segTokens <= olderBudget) {
107
+ kept.unshift(...segments[i].messages);
108
+ usedTokens += segTokens;
109
+ }
110
+ else {
111
+ break;
112
+ }
113
+ }
114
+ return [...kept, ...recentMessages];
115
+ };
116
+ }
117
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/context/compression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.test.d.ts","sourceRoot":"","sources":["../../src/context/compression.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,170 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { estimateTokens, segmentMessages, createCompressionMiddleware, messageText } from './compression.js';
3
+ function makeUser(text, ts = 1) {
4
+ return { role: 'user', content: text, timestamp: ts };
5
+ }
6
+ function makeAssistant(text, ts = 2) {
7
+ return {
8
+ role: 'assistant',
9
+ content: [{ type: 'text', text }],
10
+ api: 'anthropic-messages',
11
+ provider: 'anthropic',
12
+ model: 'claude-3',
13
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
14
+ stopReason: 'stop',
15
+ timestamp: ts,
16
+ };
17
+ }
18
+ function makeToolResult(text, ts = 3) {
19
+ return {
20
+ role: 'toolResult',
21
+ toolCallId: 'tc1',
22
+ toolName: 'Read',
23
+ content: [{ type: 'text', text }],
24
+ isError: false,
25
+ timestamp: ts,
26
+ };
27
+ }
28
+ describe('estimateTokens', () => {
29
+ it('returns ceil(length / 4)', () => {
30
+ expect(estimateTokens('')).toBe(0);
31
+ expect(estimateTokens('a')).toBe(1);
32
+ expect(estimateTokens('abcd')).toBe(1);
33
+ expect(estimateTokens('abcde')).toBe(2);
34
+ expect(estimateTokens('a'.repeat(100))).toBe(25);
35
+ });
36
+ });
37
+ describe('messageText', () => {
38
+ it('extracts text from string content', () => {
39
+ expect(messageText(makeUser('hello'))).toBe('hello');
40
+ });
41
+ it('extracts text from array content with TextContent', () => {
42
+ expect(messageText(makeAssistant('world'))).toBe('world');
43
+ });
44
+ it('extracts text from toolResult', () => {
45
+ expect(messageText(makeToolResult('result'))).toBe('result');
46
+ });
47
+ it('falls back to JSON.stringify for unknown content', () => {
48
+ const msg = { role: 'memory', content: 'remembered', sources: [], timestamp: 1 };
49
+ const text = messageText(msg);
50
+ expect(text).toContain('remembered');
51
+ });
52
+ });
53
+ describe('segmentMessages', () => {
54
+ it('groups consecutive messages by segment type', () => {
55
+ const msgs = [
56
+ makeUser('q1'),
57
+ makeAssistant('a1'),
58
+ makeToolResult('r1'),
59
+ makeToolResult('r2'),
60
+ makeUser('q2'),
61
+ ];
62
+ const segments = segmentMessages(msgs);
63
+ expect(segments).toHaveLength(4);
64
+ expect(segments[0].type).toBe('user');
65
+ expect(segments[0].messages).toHaveLength(1);
66
+ expect(segments[1].type).toBe('assistant');
67
+ expect(segments[1].messages).toHaveLength(1);
68
+ expect(segments[2].type).toBe('toolIO');
69
+ expect(segments[2].messages).toHaveLength(2);
70
+ expect(segments[3].type).toBe('user');
71
+ expect(segments[3].messages).toHaveLength(1);
72
+ });
73
+ it('identifies memory messages as memory segment', () => {
74
+ const mem = { role: 'memory', content: 'fact', sources: [], timestamp: 1 };
75
+ const segments = segmentMessages([mem]);
76
+ expect(segments[0].type).toBe('memory');
77
+ });
78
+ it('identifies summary messages as summary segment', () => {
79
+ const sum = { role: 'summary', content: 'sum', compactedCount: 5, timestamp: 1 };
80
+ const segments = segmentMessages([sum]);
81
+ expect(segments[0].type).toBe('summary');
82
+ });
83
+ it('returns empty array for empty input', () => {
84
+ expect(segmentMessages([])).toEqual([]);
85
+ });
86
+ });
87
+ describe('createCompressionMiddleware', () => {
88
+ it('returns messages unchanged when under 80% of maxTokens', async () => {
89
+ const msgs = [
90
+ makeUser('short question'),
91
+ makeAssistant('short answer'),
92
+ ];
93
+ const middleware = createCompressionMiddleware({ maxTokens: 1000, strategy: 'truncate' });
94
+ const result = await middleware(msgs);
95
+ expect(result).toEqual(msgs);
96
+ });
97
+ it('truncates older messages when over budget', async () => {
98
+ // Create messages that exceed 80% of maxTokens
99
+ const longText = 'x'.repeat(400); // 100 tokens each
100
+ const msgs = [
101
+ makeUser(longText, 1), // old
102
+ makeAssistant(longText, 2), // old
103
+ makeUser(longText, 3), // old
104
+ makeAssistant(longText, 4), // old
105
+ makeUser(longText, 5), // old
106
+ makeAssistant(longText, 6), // old
107
+ // Recent turns (protected by default 3 turns * 3 = 9 messages, but we only have these)
108
+ makeUser('recent q1', 7),
109
+ makeAssistant('recent a1', 8),
110
+ makeToolResult('recent r1', 9),
111
+ makeUser('recent q2', 10),
112
+ makeAssistant('recent a2', 11),
113
+ makeToolResult('recent r2', 12),
114
+ makeUser('recent q3', 13),
115
+ makeAssistant('recent a3', 14),
116
+ makeToolResult('recent r3', 15),
117
+ ];
118
+ // Total tokens: 6*100 + 9*~3 = ~627 tokens
119
+ // maxTokens = 200, so 80% = 160, definitely over budget
120
+ const middleware = createCompressionMiddleware({ maxTokens: 200, strategy: 'truncate' });
121
+ const result = await middleware(msgs);
122
+ // Should have fewer messages than original (some older ones truncated)
123
+ expect(result.length).toBeLessThan(msgs.length);
124
+ // Should always include the recent protected messages
125
+ expect(result[result.length - 1]).toEqual(msgs[msgs.length - 1]);
126
+ });
127
+ it('protects the specified number of recent turns', async () => {
128
+ const longText = 'x'.repeat(400); // 100 tokens
129
+ const msgs = [
130
+ makeUser(longText, 1),
131
+ makeAssistant(longText, 2),
132
+ makeUser('q1', 3),
133
+ makeAssistant('a1', 4),
134
+ ];
135
+ const middleware = createCompressionMiddleware({
136
+ maxTokens: 50,
137
+ strategy: 'truncate',
138
+ protectedRecentTurns: 1, // protect last 3 messages
139
+ });
140
+ const result = await middleware(msgs);
141
+ // The last 3 messages should be protected
142
+ expect(result.length).toBeGreaterThanOrEqual(2);
143
+ expect(result[result.length - 1]).toEqual(msgs[msgs.length - 1]);
144
+ expect(result[result.length - 2]).toEqual(msgs[msgs.length - 2]);
145
+ });
146
+ it('summarize strategy falls back to truncate', async () => {
147
+ const longText = 'x'.repeat(400);
148
+ const msgs = [
149
+ makeUser(longText, 1),
150
+ makeAssistant(longText, 2),
151
+ makeUser('recent', 3),
152
+ makeAssistant('recent', 4),
153
+ ];
154
+ const middleware = createCompressionMiddleware({
155
+ maxTokens: 50,
156
+ strategy: 'summarize',
157
+ protectedRecentTurns: 1,
158
+ });
159
+ const result = await middleware(msgs);
160
+ expect(result.length).toBeLessThanOrEqual(msgs.length);
161
+ });
162
+ it('handles abort signal', async () => {
163
+ const msgs = [makeUser('hi')];
164
+ const controller = new AbortController();
165
+ const middleware = createCompressionMiddleware({ maxTokens: 1000, strategy: 'truncate' });
166
+ const result = await middleware(msgs, controller.signal);
167
+ expect(result).toEqual(msgs);
168
+ });
169
+ });
170
+ //# sourceMappingURL=compression.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.test.js","sourceRoot":"","sources":["../../src/context/compression.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Message } from '@mariozechner/pi-ai';
2
+ import type { AgentMessage } from '@mariozechner/pi-agent-core';
3
+ /**
4
+ * Converts AgentMessage[] to LLM-compatible Message[].
5
+ *
6
+ * Standard messages (user, assistant, toolResult) pass through unchanged.
7
+ * Custom SDK messages are converted to UserMessages with descriptive prefixes.
8
+ * Unknown roles are skipped.
9
+ */
10
+ export declare function convertToLlm(messages: AgentMessage[]): Message[];
11
+ //# sourceMappingURL=converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../src/context/converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAiChE"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Converts AgentMessage[] to LLM-compatible Message[].
3
+ *
4
+ * Standard messages (user, assistant, toolResult) pass through unchanged.
5
+ * Custom SDK messages are converted to UserMessages with descriptive prefixes.
6
+ * Unknown roles are skipped.
7
+ */
8
+ export function convertToLlm(messages) {
9
+ const result = [];
10
+ for (const msg of messages) {
11
+ const m = msg;
12
+ switch (m.role) {
13
+ case 'user':
14
+ case 'assistant':
15
+ case 'toolResult':
16
+ result.push(msg);
17
+ break;
18
+ case 'memory': {
19
+ const mem = msg;
20
+ result.push({ role: 'user', content: `[Memory] ${mem.content}`, timestamp: mem.timestamp });
21
+ break;
22
+ }
23
+ case 'summary': {
24
+ const sum = msg;
25
+ result.push({ role: 'user', content: `[Context Summary] ${sum.content}`, timestamp: sum.timestamp });
26
+ break;
27
+ }
28
+ case 'swarmReport': {
29
+ const rep = msg;
30
+ result.push({ role: 'user', content: `[Agent Report: ${rep.fromAgent}] ${rep.content}`, timestamp: rep.timestamp });
31
+ break;
32
+ }
33
+ default:
34
+ // Unknown roles are skipped
35
+ break;
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ //# sourceMappingURL=converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../../src/context/converter.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,GAAuB,CAAC;QAClC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,MAAM,CAAC;YACZ,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,MAAM,CAAC,IAAI,CAAC,GAAc,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,GAA6B,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC5F,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,GAAG,GAAG,GAA+B,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBACrG,MAAM;YACR,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,GAAG,GAAG,GAAyB,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBACpH,MAAM;YACR,CAAC;YACD;gBACE,4BAA4B;gBAC5B,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=converter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.test.d.ts","sourceRoot":"","sources":["../../src/context/converter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { convertToLlm } from './converter.js';
3
+ describe('convertToLlm', () => {
4
+ it('passes through UserMessage unchanged', () => {
5
+ const user = { role: 'user', content: 'hello', timestamp: 1 };
6
+ const result = convertToLlm([user]);
7
+ expect(result).toEqual([user]);
8
+ });
9
+ it('passes through AssistantMessage unchanged', () => {
10
+ const assistant = {
11
+ role: 'assistant',
12
+ content: [{ type: 'text', text: 'hi' }],
13
+ api: 'anthropic-messages',
14
+ provider: 'anthropic',
15
+ model: 'claude-3',
16
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
17
+ stopReason: 'stop',
18
+ timestamp: 1,
19
+ };
20
+ const result = convertToLlm([assistant]);
21
+ expect(result).toEqual([assistant]);
22
+ });
23
+ it('passes through ToolResultMessage unchanged', () => {
24
+ const toolResult = {
25
+ role: 'toolResult',
26
+ toolCallId: 'tc1',
27
+ toolName: 'Read',
28
+ content: [{ type: 'text', text: 'file content' }],
29
+ isError: false,
30
+ timestamp: 1,
31
+ };
32
+ const result = convertToLlm([toolResult]);
33
+ expect(result).toEqual([toolResult]);
34
+ });
35
+ it('converts MemoryInjectionMessage to UserMessage with [Memory] prefix', () => {
36
+ const memory = {
37
+ role: 'memory',
38
+ content: 'remembered fact',
39
+ sources: ['file.md'],
40
+ timestamp: 100,
41
+ };
42
+ const result = convertToLlm([memory]);
43
+ expect(result).toHaveLength(1);
44
+ expect(result[0]).toEqual({
45
+ role: 'user',
46
+ content: '[Memory] remembered fact',
47
+ timestamp: 100,
48
+ });
49
+ });
50
+ it('converts CompactionSummaryMessage to UserMessage with [Context Summary] prefix', () => {
51
+ const summary = {
52
+ role: 'summary',
53
+ content: 'conversation summary here',
54
+ compactedCount: 10,
55
+ timestamp: 200,
56
+ };
57
+ const result = convertToLlm([summary]);
58
+ expect(result).toHaveLength(1);
59
+ expect(result[0]).toEqual({
60
+ role: 'user',
61
+ content: '[Context Summary] conversation summary here',
62
+ timestamp: 200,
63
+ });
64
+ });
65
+ it('converts SwarmReportMessage to UserMessage with [Agent Report: <name>] prefix', () => {
66
+ const report = {
67
+ role: 'swarmReport',
68
+ content: 'task completed',
69
+ fromAgent: 'worker-1',
70
+ taskId: 'task-abc',
71
+ timestamp: 300,
72
+ };
73
+ const result = convertToLlm([report]);
74
+ expect(result).toHaveLength(1);
75
+ expect(result[0]).toEqual({
76
+ role: 'user',
77
+ content: '[Agent Report: worker-1] task completed',
78
+ timestamp: 300,
79
+ });
80
+ });
81
+ it('skips unknown roles', () => {
82
+ const unknown = { role: 'unknown', content: 'mystery', timestamp: 1 };
83
+ const result = convertToLlm([unknown]);
84
+ expect(result).toEqual([]);
85
+ });
86
+ it('handles mixed message types in order', () => {
87
+ const user = { role: 'user', content: 'hello', timestamp: 1 };
88
+ const memory = { role: 'memory', content: 'fact', sources: [], timestamp: 2 };
89
+ const assistant = {
90
+ role: 'assistant',
91
+ content: [{ type: 'text', text: 'response' }],
92
+ api: 'anthropic-messages',
93
+ provider: 'anthropic',
94
+ model: 'claude-3',
95
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
96
+ stopReason: 'stop',
97
+ timestamp: 3,
98
+ };
99
+ const unknown = { role: 'alien', timestamp: 4 };
100
+ const result = convertToLlm([user, memory, assistant, unknown]);
101
+ expect(result).toHaveLength(3);
102
+ expect(result[0]).toEqual(user);
103
+ expect(result[1].content).toBe('[Memory] fact');
104
+ expect(result[2]).toEqual(assistant);
105
+ });
106
+ it('returns empty array for empty input', () => {
107
+ expect(convertToLlm([])).toEqual([]);
108
+ });
109
+ });
110
+ //# sourceMappingURL=converter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.test.js","sourceRoot":"","sources":["../../src/context/converter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RunContext } from '../types.js';
2
+ export interface RunContextOptions {
3
+ cwd: string;
4
+ sessionId?: string;
5
+ traceId?: string;
6
+ signal?: AbortSignal;
7
+ }
8
+ export declare function createRunContext(options: RunContextOptions): RunContext;
9
+ //# sourceMappingURL=run-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.d.ts","sourceRoot":"","sources":["../../src/context/run-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CASvE"}
@@ -0,0 +1,14 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createCostTracker } from '../observability/cost-tracker.js';
3
+ import { generateTraceId } from '../observability/trace.js';
4
+ export function createRunContext(options) {
5
+ return {
6
+ cwd: options.cwd,
7
+ sessionId: options.sessionId ?? randomUUID(),
8
+ traceId: options.traceId ?? generateTraceId(),
9
+ signal: options.signal ?? AbortSignal.timeout(2_147_483_647),
10
+ costTracker: createCostTracker(),
11
+ permissionDecisions: [],
12
+ };
13
+ }
14
+ //# sourceMappingURL=run-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.js","sourceRoot":"","sources":["../../src/context/run-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAU5D,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,UAAU,EAAE;QAC5C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe,EAAE;QAC7C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC;QAC5D,WAAW,EAAE,iBAAiB,EAAE;QAChC,mBAAmB,EAAE,EAAE;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.test.d.ts","sourceRoot":"","sources":["../../src/context/run-context.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createRunContext } from './run-context.js';
3
+ describe('createRunContext', () => {
4
+ it('creates a RunContext with required cwd', () => {
5
+ const ctx = createRunContext({ cwd: '/tmp' });
6
+ expect(ctx.cwd).toBe('/tmp');
7
+ expect(ctx.sessionId).toBeTruthy();
8
+ expect(ctx.traceId).toBeTruthy();
9
+ expect(ctx.signal).toBeDefined();
10
+ expect(ctx.costTracker).toBeDefined();
11
+ expect(ctx.permissionDecisions).toEqual([]);
12
+ });
13
+ it('uses provided sessionId and traceId', () => {
14
+ const ctx = createRunContext({ cwd: '/tmp', sessionId: 'my-session', traceId: 'my-trace' });
15
+ expect(ctx.sessionId).toBe('my-session');
16
+ expect(ctx.traceId).toBe('my-trace');
17
+ });
18
+ it('uses provided signal', () => {
19
+ const controller = new AbortController();
20
+ const ctx = createRunContext({ cwd: '/tmp', signal: controller.signal });
21
+ expect(ctx.signal).toBe(controller.signal);
22
+ });
23
+ it('generates unique sessionIds and traceIds', () => {
24
+ const ctx1 = createRunContext({ cwd: '/tmp' });
25
+ const ctx2 = createRunContext({ cwd: '/tmp' });
26
+ expect(ctx1.sessionId).not.toBe(ctx2.sessionId);
27
+ expect(ctx1.traceId).not.toBe(ctx2.traceId);
28
+ });
29
+ it('costTracker works correctly', () => {
30
+ const ctx = createRunContext({ cwd: '/tmp' });
31
+ expect(ctx.costTracker.total()).toEqual({ tokens: 0, cost: 0 });
32
+ });
33
+ });
34
+ //# sourceMappingURL=run-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.test.js","sourceRoot":"","sources":["../../src/context/run-context.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { SdkTool, MemorySelection, PermissionMode, ResolvedSkill } from '../types.js';
2
+ export interface SystemPromptConfig {
3
+ basePrompt?: string;
4
+ skills?: ResolvedSkill[];
5
+ tools?: SdkTool<any, any>[];
6
+ memories?: MemorySelection[];
7
+ permissionMode?: PermissionMode;
8
+ swarmContext?: {
9
+ teammates: string[];
10
+ instructions?: string;
11
+ };
12
+ }
13
+ /**
14
+ * Builds a system prompt by assembling sections in order:
15
+ * 1. Base prompt
16
+ * 2. Skill instructions
17
+ * 3. Tool descriptions
18
+ * 4. Memory context
19
+ * 5. Memory instructions
20
+ * 6. Permission context
21
+ * 7. Swarm context
22
+ */
23
+ export declare function buildSystemPrompt(config: SystemPromptConfig): string;
24
+ //# sourceMappingURL=system-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/context/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3F,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAID;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAuEpE"}