psadk 1.4.7 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +153 -0
  2. package/build/main/index.d.ts +1 -0
  3. package/build/main/lib/PSAI.js +1 -2
  4. package/build/main/lib/PSAgent.d.ts +50 -13
  5. package/build/main/lib/PSAgent.js +179 -502
  6. package/build/main/lib/PSAgentConfig.d.ts +114 -2
  7. package/build/main/lib/PSAgentLogger.js +1 -2
  8. package/build/main/lib/PSAgentTool.d.ts +8 -3
  9. package/build/main/lib/PSAgentTool.js +3 -3
  10. package/build/main/lib/agent-core/package.json +1 -1
  11. package/build/main/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  12. package/build/main/lib/agent-core/src/agent-loop.js +514 -0
  13. package/build/{module/lib/agent-core → main/lib/agent-core/src}/agent.d.ts +2 -2
  14. package/build/main/lib/agent-core/src/agent.js +419 -0
  15. package/build/main/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  16. package/build/main/lib/agent-core/src/harness/agent-harness.js +1028 -0
  17. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  18. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  19. package/build/main/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  20. package/build/main/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  21. package/build/main/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  22. package/build/main/lib/agent-core/src/harness/compaction/utils.js +131 -0
  23. package/build/main/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  24. package/build/main/lib/agent-core/src/harness/env/nodejs.js +494 -0
  25. package/build/main/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  26. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/messages.js +1 -1
  27. package/build/main/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  28. package/build/main/lib/agent-core/src/harness/prompt-templates.js +235 -0
  29. package/build/{module/lib/agent-core/harness/session/repo/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  30. package/build/main/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  31. package/build/{module/lib/agent-core/harness/session/storage/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  32. package/build/main/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  33. package/build/main/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  34. package/build/main/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  35. package/build/main/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  36. package/build/main/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  37. package/build/main/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  38. package/build/main/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  39. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  40. package/build/main/lib/agent-core/src/harness/session/session.js +213 -0
  41. package/build/main/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  42. package/build/main/lib/agent-core/src/harness/session/uuid.js +54 -0
  43. package/build/main/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  44. package/build/main/lib/agent-core/src/harness/skills.js +353 -0
  45. package/build/main/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  46. package/build/main/lib/agent-core/src/harness/system-prompt.js +30 -0
  47. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/types.d.ts +160 -70
  48. package/build/main/lib/agent-core/src/harness/types.js +94 -0
  49. package/build/main/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  50. package/build/main/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  51. package/build/main/lib/agent-core/src/harness/utils/truncate.js +294 -0
  52. package/build/main/lib/agent-core/src/index.d.ts +19 -0
  53. package/build/main/lib/agent-core/src/index.js +25 -0
  54. package/build/main/lib/agent-core/src/node.d.ts +2 -0
  55. package/build/main/lib/agent-core/src/node.js +3 -0
  56. package/build/main/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  57. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.d.ts +13 -1
  58. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.js +1 -1
  59. package/build/main/lib/localAgent.d.ts +35 -0
  60. package/build/main/lib/localAgent.js +329 -0
  61. package/build/main/lib/remoteAgent.d.ts +25 -0
  62. package/build/main/lib/remoteAgent.js +311 -0
  63. package/build/main/lib/tools/BraveWebSearchTool.js +1 -2
  64. package/build/main/lib/tools/PSArtifactTool.js +1 -2
  65. package/build/main/lib/tools/PSClarifyTool.js +1 -2
  66. package/build/main/lib/tools/PSCommandLineTool.js +1 -2
  67. package/build/main/lib/tools/PSMemoryTool.js +1 -2
  68. package/build/main/lib/tools/PSReadFileTool.js +1 -2
  69. package/build/main/lib/tools/PSRetrievalTool.js +1 -2
  70. package/build/main/lib/tools/PSSkillTool.js +1 -2
  71. package/build/main/lib/tools/PSSubAgentTool.js +1 -1
  72. package/build/main/lib/tools/PSWriteFileTool.js +1 -2
  73. package/build/main/lib/tools/TodoTool.js +1 -2
  74. package/build/main/lib/utils/debuglogger.js +1 -2
  75. package/build/main/lib/utils/helpers.js +1 -6
  76. package/build/module/index.d.ts +1 -0
  77. package/build/module/lib/PSAI.js +1 -2
  78. package/build/module/lib/PSAgent.d.ts +50 -13
  79. package/build/module/lib/PSAgent.js +179 -502
  80. package/build/module/lib/PSAgentConfig.d.ts +114 -2
  81. package/build/module/lib/PSAgentLogger.js +1 -2
  82. package/build/module/lib/PSAgentTool.d.ts +8 -3
  83. package/build/module/lib/PSAgentTool.js +3 -3
  84. package/build/module/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  85. package/build/module/lib/agent-core/src/agent-loop.js +514 -0
  86. package/build/{main/lib/agent-core → module/lib/agent-core/src}/agent.d.ts +2 -2
  87. package/build/module/lib/agent-core/src/agent.js +419 -0
  88. package/build/module/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  89. package/build/module/lib/agent-core/src/harness/agent-harness.js +1028 -0
  90. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  91. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  92. package/build/module/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  93. package/build/module/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  94. package/build/module/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  95. package/build/module/lib/agent-core/src/harness/compaction/utils.js +131 -0
  96. package/build/module/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  97. package/build/module/lib/agent-core/src/harness/env/nodejs.js +494 -0
  98. package/build/module/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  99. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/messages.js +1 -1
  100. package/build/module/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  101. package/build/module/lib/agent-core/src/harness/prompt-templates.js +235 -0
  102. package/build/{main/lib/agent-core/harness/session/repo/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  103. package/build/module/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  104. package/build/{main/lib/agent-core/harness/session/storage/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  105. package/build/module/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  106. package/build/module/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  107. package/build/module/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  108. package/build/module/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  109. package/build/module/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  110. package/build/module/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  111. package/build/module/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  112. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  113. package/build/module/lib/agent-core/src/harness/session/session.js +213 -0
  114. package/build/module/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  115. package/build/module/lib/agent-core/src/harness/session/uuid.js +54 -0
  116. package/build/module/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  117. package/build/module/lib/agent-core/src/harness/skills.js +353 -0
  118. package/build/module/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  119. package/build/module/lib/agent-core/src/harness/system-prompt.js +30 -0
  120. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/types.d.ts +160 -70
  121. package/build/module/lib/agent-core/src/harness/types.js +94 -0
  122. package/build/module/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  123. package/build/module/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  124. package/build/module/lib/agent-core/src/harness/utils/truncate.js +294 -0
  125. package/build/module/lib/agent-core/src/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/src/index.js +25 -0
  127. package/build/module/lib/agent-core/src/node.d.ts +2 -0
  128. package/build/module/lib/agent-core/src/node.js +3 -0
  129. package/build/module/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  130. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.d.ts +13 -1
  131. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.js +1 -1
  132. package/build/module/lib/localAgent.d.ts +35 -0
  133. package/build/module/lib/localAgent.js +329 -0
  134. package/build/module/lib/remoteAgent.d.ts +25 -0
  135. package/build/module/lib/remoteAgent.js +311 -0
  136. package/build/module/lib/tools/BraveWebSearchTool.js +1 -2
  137. package/build/module/lib/tools/PSArtifactTool.js +1 -2
  138. package/build/module/lib/tools/PSClarifyTool.js +1 -2
  139. package/build/module/lib/tools/PSCommandLineTool.js +1 -2
  140. package/build/module/lib/tools/PSMemoryTool.js +1 -2
  141. package/build/module/lib/tools/PSReadFileTool.js +1 -2
  142. package/build/module/lib/tools/PSRetrievalTool.js +1 -2
  143. package/build/module/lib/tools/PSSkillTool.js +1 -2
  144. package/build/module/lib/tools/PSSubAgentTool.js +1 -1
  145. package/build/module/lib/tools/PSWriteFileTool.js +1 -2
  146. package/build/module/lib/tools/TodoTool.js +1 -2
  147. package/build/module/lib/utils/debuglogger.js +1 -2
  148. package/build/module/lib/utils/helpers.js +1 -6
  149. package/package.json +3 -2
  150. package/build/main/lib/agent-core/agent-loop.js +0 -483
  151. package/build/main/lib/agent-core/agent.js +0 -419
  152. package/build/main/lib/agent-core/harness/agent-harness.js +0 -772
  153. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  154. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  155. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  156. package/build/main/lib/agent-core/harness/compaction/compaction.js +0 -637
  157. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  158. package/build/main/lib/agent-core/harness/compaction/utils.js +0 -153
  159. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  160. package/build/main/lib/agent-core/harness/env/nodejs.js +0 -353
  161. package/build/main/lib/agent-core/harness/execution-env.d.ts +0 -3
  162. package/build/main/lib/agent-core/harness/execution-env.js +0 -3
  163. package/build/main/lib/agent-core/harness/prompt-templates.js +0 -204
  164. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  165. package/build/main/lib/agent-core/harness/session/repo/memory.js +0 -46
  166. package/build/main/lib/agent-core/harness/session/repo/shared.js +0 -31
  167. package/build/main/lib/agent-core/harness/session/session.js +0 -199
  168. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  169. package/build/main/lib/agent-core/harness/session/storage/memory.js +0 -94
  170. package/build/main/lib/agent-core/harness/skills.js +0 -266
  171. package/build/main/lib/agent-core/harness/system-prompt.js +0 -30
  172. package/build/main/lib/agent-core/harness/types.js +0 -16
  173. package/build/main/lib/agent-core/harness/utils/shell-output.js +0 -101
  174. package/build/main/lib/agent-core/harness/utils/truncate.js +0 -208
  175. package/build/main/lib/agent-core/index.d.ts +0 -19
  176. package/build/main/lib/agent-core/index.js +0 -25
  177. package/build/module/lib/agent-core/agent-loop.js +0 -483
  178. package/build/module/lib/agent-core/agent.js +0 -419
  179. package/build/module/lib/agent-core/harness/agent-harness.js +0 -772
  180. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  181. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  182. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  183. package/build/module/lib/agent-core/harness/compaction/compaction.js +0 -637
  184. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  185. package/build/module/lib/agent-core/harness/compaction/utils.js +0 -153
  186. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  187. package/build/module/lib/agent-core/harness/env/nodejs.js +0 -353
  188. package/build/module/lib/agent-core/harness/execution-env.d.ts +0 -3
  189. package/build/module/lib/agent-core/harness/execution-env.js +0 -3
  190. package/build/module/lib/agent-core/harness/prompt-templates.js +0 -204
  191. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  192. package/build/module/lib/agent-core/harness/session/repo/memory.js +0 -46
  193. package/build/module/lib/agent-core/harness/session/repo/shared.js +0 -31
  194. package/build/module/lib/agent-core/harness/session/session.js +0 -199
  195. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  196. package/build/module/lib/agent-core/harness/session/storage/memory.js +0 -94
  197. package/build/module/lib/agent-core/harness/skills.js +0 -266
  198. package/build/module/lib/agent-core/harness/system-prompt.js +0 -30
  199. package/build/module/lib/agent-core/harness/types.js +0 -16
  200. package/build/module/lib/agent-core/harness/utils/shell-output.js +0 -101
  201. package/build/module/lib/agent-core/harness/utils/truncate.js +0 -208
  202. package/build/module/lib/agent-core/index.d.ts +0 -19
  203. package/build/module/lib/agent-core/index.js +0 -25
  204. /package/build/main/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  205. /package/build/main/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
  206. /package/build/module/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  207. /package/build/module/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
@@ -0,0 +1,52 @@
1
+ import type { Model } from '@earendil-works/pi-ai';
2
+ import type { AgentMessage } from '../../types.ts';
3
+ import type { BranchSummaryResult, Session, SessionTreeEntry } from '../types.ts';
4
+ import { BranchSummaryError, type Result } from '../types.ts';
5
+ import { type FileOperations } from './utils.ts';
6
+ /** File-operation details stored on generated branch summary entries. */
7
+ export interface BranchSummaryDetails {
8
+ /** Files read while exploring the summarized branch. */
9
+ readFiles: string[];
10
+ /** Files modified while exploring the summarized branch. */
11
+ modifiedFiles: string[];
12
+ }
13
+ export type { FileOperations } from './utils.ts';
14
+ /** Prepared branch content for summarization. */
15
+ export interface BranchPreparation {
16
+ /** Messages selected for the branch summary. */
17
+ messages: AgentMessage[];
18
+ /** File operations extracted from the branch. */
19
+ fileOps: FileOperations;
20
+ /** Estimated token count for selected messages. */
21
+ totalTokens: number;
22
+ }
23
+ /** Entries selected for branch summarization. */
24
+ export interface CollectEntriesResult {
25
+ /** Entries to summarize in chronological order. */
26
+ entries: SessionTreeEntry[];
27
+ /** Deepest common ancestor between the previous leaf and target entry. */
28
+ commonAncestorId: string | null;
29
+ }
30
+ /** Options for generating a branch summary. */
31
+ export interface GenerateBranchSummaryOptions {
32
+ /** Model used for summarization. */
33
+ model: Model<any>;
34
+ /** API key forwarded to the provider. */
35
+ apiKey: string;
36
+ /** Optional request headers forwarded to the provider. */
37
+ headers?: Record<string, string>;
38
+ /** Abort signal for the summarization request. */
39
+ signal: AbortSignal;
40
+ /** Optional instructions appended to or replacing the default prompt. */
41
+ customInstructions?: string;
42
+ /** Replace the default prompt with custom instructions instead of appending them. */
43
+ replaceInstructions?: boolean;
44
+ /** Tokens reserved for prompt and model output. Defaults to 16384. */
45
+ reserveTokens?: number;
46
+ }
47
+ /** Collect entries that should be summarized before navigating to a different session tree entry. */
48
+ export declare function collectEntriesForBranchSummary(session: Session, oldLeafId: string | null, targetId: string): Promise<CollectEntriesResult>;
49
+ /** Prepare branch entries for summarization within an optional token budget. */
50
+ export declare function prepareBranchEntries(entries: SessionTreeEntry[], tokenBudget?: number): BranchPreparation;
51
+ /** Generate a summary for abandoned branch entries. */
52
+ export declare function generateBranchSummary(entries: SessionTreeEntry[], options: GenerateBranchSummaryOptions): Promise<Result<BranchSummaryResult, BranchSummaryError>>;
@@ -0,0 +1,182 @@
1
+ import { completeSimple } from '@earendil-works/pi-ai';
2
+ import { convertToLlm, createBranchSummaryMessage, createCompactionSummaryMessage, createCustomMessage, } from "../messages.js";
3
+ import { BranchSummaryError, err, ok, SessionError, } from "../types.js";
4
+ import { estimateTokens, SUMMARIZATION_SYSTEM_PROMPT } from "./compaction.js";
5
+ import { computeFileLists, createFileOps, extractFileOpsFromMessage, formatFileOperations, serializeConversation, } from "./utils.js";
6
+ /** Collect entries that should be summarized before navigating to a different session tree entry. */
7
+ export async function collectEntriesForBranchSummary(session, oldLeafId, targetId) {
8
+ if (!oldLeafId) {
9
+ return { entries: [], commonAncestorId: null };
10
+ }
11
+ const oldPath = new Set((await session.getBranch(oldLeafId)).map((e) => e.id));
12
+ const targetPath = await session.getBranch(targetId);
13
+ let commonAncestorId = null;
14
+ for (let i = targetPath.length - 1; i >= 0; i--) {
15
+ if (oldPath.has(targetPath[i].id)) {
16
+ commonAncestorId = targetPath[i].id;
17
+ break;
18
+ }
19
+ }
20
+ const entries = [];
21
+ let current = oldLeafId;
22
+ while (current && current !== commonAncestorId) {
23
+ const entry = await session.getEntry(current);
24
+ if (!entry)
25
+ throw new SessionError('invalid_session', `Entry ${current} not found`);
26
+ entries.push(entry);
27
+ current = entry.parentId;
28
+ }
29
+ entries.reverse();
30
+ return { entries, commonAncestorId };
31
+ }
32
+ function getMessageFromEntry(entry) {
33
+ switch (entry.type) {
34
+ case 'message':
35
+ if (entry.message.role === 'toolResult')
36
+ return undefined;
37
+ return entry.message;
38
+ case 'custom_message':
39
+ return createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp);
40
+ case 'branch_summary':
41
+ return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
42
+ case 'compaction':
43
+ return createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
44
+ case 'thinking_level_change':
45
+ case 'model_change':
46
+ case 'active_tools_change':
47
+ case 'custom':
48
+ case 'label':
49
+ case 'session_info':
50
+ case 'leaf':
51
+ return undefined;
52
+ }
53
+ }
54
+ /** Prepare branch entries for summarization within an optional token budget. */
55
+ export function prepareBranchEntries(entries, tokenBudget = 0) {
56
+ const messages = [];
57
+ const fileOps = createFileOps();
58
+ let totalTokens = 0;
59
+ for (const entry of entries) {
60
+ if (entry.type === 'branch_summary' && !entry.fromHook && entry.details) {
61
+ const details = entry.details;
62
+ if (Array.isArray(details.readFiles)) {
63
+ for (const f of details.readFiles)
64
+ fileOps.read.add(f);
65
+ }
66
+ if (Array.isArray(details.modifiedFiles)) {
67
+ for (const f of details.modifiedFiles) {
68
+ fileOps.edited.add(f);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ for (let i = entries.length - 1; i >= 0; i--) {
74
+ const entry = entries[i];
75
+ const message = getMessageFromEntry(entry);
76
+ if (!message)
77
+ continue;
78
+ extractFileOpsFromMessage(message, fileOps);
79
+ const tokens = estimateTokens(message);
80
+ if (tokenBudget > 0 && totalTokens + tokens > tokenBudget) {
81
+ if (entry.type === 'compaction' || entry.type === 'branch_summary') {
82
+ if (totalTokens < tokenBudget * 0.9) {
83
+ messages.unshift(message);
84
+ totalTokens += tokens;
85
+ }
86
+ }
87
+ break;
88
+ }
89
+ messages.unshift(message);
90
+ totalTokens += tokens;
91
+ }
92
+ return { messages, fileOps, totalTokens };
93
+ }
94
+ const BRANCH_SUMMARY_PREAMBLE = `The user explored a different conversation branch before returning here.
95
+ Summary of that exploration:
96
+
97
+ `;
98
+ const BRANCH_SUMMARY_PROMPT = `Create a structured summary of this conversation branch for context when returning later.
99
+
100
+ Use this EXACT format:
101
+
102
+ ## Goal
103
+ [What was the user trying to accomplish in this branch?]
104
+
105
+ ## Constraints & Preferences
106
+ - [Any constraints, preferences, or requirements mentioned]
107
+ - [Or "(none)" if none were mentioned]
108
+
109
+ ## Progress
110
+ ### Done
111
+ - [x] [Completed tasks/changes]
112
+
113
+ ### In Progress
114
+ - [ ] [Work that was started but not finished]
115
+
116
+ ### Blocked
117
+ - [Issues preventing progress, if any]
118
+
119
+ ## Key Decisions
120
+ - **[Decision]**: [Brief rationale]
121
+
122
+ ## Next Steps
123
+ 1. [What should happen next to continue this work]
124
+
125
+ Keep each section concise. Preserve exact file paths, function names, and error messages.`;
126
+ /** Generate a summary for abandoned branch entries. */
127
+ export async function generateBranchSummary(entries, options) {
128
+ const { model, apiKey, headers, signal, customInstructions, replaceInstructions, reserveTokens = 16384, } = options;
129
+ const contextWindow = model.contextWindow || 128000;
130
+ const tokenBudget = contextWindow - reserveTokens;
131
+ const { messages, fileOps } = prepareBranchEntries(entries, tokenBudget);
132
+ if (messages.length === 0) {
133
+ return ok({
134
+ summary: 'No content to summarize',
135
+ readFiles: [],
136
+ modifiedFiles: [],
137
+ });
138
+ }
139
+ const llmMessages = convertToLlm(messages);
140
+ const conversationText = serializeConversation(llmMessages);
141
+ let instructions;
142
+ if (replaceInstructions && customInstructions) {
143
+ instructions = customInstructions;
144
+ }
145
+ else if (customInstructions) {
146
+ instructions = `${BRANCH_SUMMARY_PROMPT}\n\nAdditional focus: ${customInstructions}`;
147
+ }
148
+ else {
149
+ instructions = BRANCH_SUMMARY_PROMPT;
150
+ }
151
+ const promptText = `<conversation>\n${conversationText}\n</conversation>\n\n${instructions}`;
152
+ const summarizationMessages = [
153
+ {
154
+ role: 'user',
155
+ content: [{ type: 'text', text: promptText }],
156
+ timestamp: Date.now(),
157
+ },
158
+ ];
159
+ const response = await completeSimple(model, {
160
+ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT,
161
+ messages: summarizationMessages,
162
+ }, { apiKey, headers, signal, maxTokens: 2048 });
163
+ if (response.stopReason === 'aborted') {
164
+ return err(new BranchSummaryError('aborted', response.errorMessage || 'Branch summary aborted'));
165
+ }
166
+ if (response.stopReason === 'error') {
167
+ return err(new BranchSummaryError('summarization_failed', `Branch summary failed: ${response.errorMessage || 'Unknown error'}`));
168
+ }
169
+ let summary = response.content
170
+ .filter((c) => c.type === 'text')
171
+ .map((c) => c.text)
172
+ .join('\n');
173
+ summary = BRANCH_SUMMARY_PREAMBLE + summary;
174
+ const { readFiles, modifiedFiles } = computeFileLists(fileOps);
175
+ summary += formatFileOperations(readFiles, modifiedFiles);
176
+ return ok({
177
+ summary: summary || 'No summary generated',
178
+ readFiles,
179
+ modifiedFiles,
180
+ });
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoLXN1bW1hcml6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvc3JjL2hhcm5lc3MvY29tcGFjdGlvbi9icmFuY2gtc3VtbWFyaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkQsT0FBTyxFQUNMLFlBQVksRUFDWiwwQkFBMEIsRUFDMUIsOEJBQThCLEVBQzlCLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBTXhCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsR0FBRyxFQUNILEVBQUUsRUFFRixZQUFZLEdBQ2IsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLHlCQUF5QixFQUV6QixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sWUFBWSxDQUFDO0FBZ0RwQixxR0FBcUc7QUFDckcsTUFBTSxDQUFDLEtBQUssVUFBVSw4QkFBOEIsQ0FDbEQsT0FBZ0IsRUFDaEIsU0FBd0IsRUFDeEIsUUFBZ0I7SUFFaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUNyQixDQUFDLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUN0RCxDQUFDO0lBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFP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
@@ -0,0 +1,94 @@
1
+ import type { Model, Usage } from '@earendil-works/pi-ai';
2
+ import type { AgentMessage, ThinkingLevel } from '../../types.ts';
3
+ import { CompactionError, type Result, type SessionTreeEntry } from '../types.ts';
4
+ import { type FileOperations } from './utils.ts';
5
+ /** File-operation details stored on generated compaction entries. */
6
+ export interface CompactionDetails {
7
+ /** Files read in the compacted history. */
8
+ readFiles: string[];
9
+ /** Files modified in the compacted history. */
10
+ modifiedFiles: string[];
11
+ }
12
+ /** Generated compaction data ready to be persisted as a compaction entry. */
13
+ export interface CompactionResult<T = unknown> {
14
+ /** Summary text that replaces compacted history in future context. */
15
+ summary: string;
16
+ /** Entry id where retained history starts. */
17
+ firstKeptEntryId: string;
18
+ /** Estimated context tokens before compaction. */
19
+ tokensBefore: number;
20
+ /** Optional implementation-specific details stored with the compaction entry. */
21
+ details?: T;
22
+ }
23
+ /** Compaction thresholds and retention settings. */
24
+ export interface CompactionSettings {
25
+ /** Enable automatic compaction decisions. */
26
+ enabled: boolean;
27
+ /** Tokens reserved for summary prompt and output. */
28
+ reserveTokens: number;
29
+ /** Approximate recent-context tokens to keep after compaction. */
30
+ keepRecentTokens: number;
31
+ }
32
+ /** Default compaction settings used by the harness. */
33
+ export declare const DEFAULT_COMPACTION_SETTINGS: CompactionSettings;
34
+ /** Calculate total context tokens from provider usage. */
35
+ export declare function calculateContextTokens(usage: Usage): number;
36
+ /** Return usage from the last successful assistant message in session entries. */
37
+ export declare function getLastAssistantUsage(entries: SessionTreeEntry[]): Usage | undefined;
38
+ /** Estimated context-token usage for a message list. */
39
+ export interface ContextUsageEstimate {
40
+ /** Estimated total context tokens. */
41
+ tokens: number;
42
+ /** Tokens reported by the most recent assistant usage block. */
43
+ usageTokens: number;
44
+ /** Estimated tokens after the most recent assistant usage block. */
45
+ trailingTokens: number;
46
+ /** Index of the message that provided usage, or null when none exists. */
47
+ lastUsageIndex: number | null;
48
+ }
49
+ /** Estimate context tokens for messages using provider usage when available. */
50
+ export declare function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate;
51
+ /** Return whether context usage exceeds the configured compaction threshold. */
52
+ export declare function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean;
53
+ /** Estimate token count for one message using a conservative character heuristic. */
54
+ export declare function estimateTokens(message: AgentMessage): number;
55
+ /** Find the user-visible message that starts the turn containing an entry. */
56
+ export declare function findTurnStartIndex(entries: SessionTreeEntry[], entryIndex: number, startIndex: number): number;
57
+ /** Cut point selected for compaction. */
58
+ export interface CutPointResult {
59
+ /** Index of the first entry retained after compaction. */
60
+ firstKeptEntryIndex: number;
61
+ /** Index of the turn-start entry when the cut splits a turn, otherwise -1. */
62
+ turnStartIndex: number;
63
+ /** Whether the selected cut point splits an in-progress turn. */
64
+ isSplitTurn: boolean;
65
+ }
66
+ /** Find the compaction cut point that keeps approximately the requested recent-token budget. */
67
+ export declare function findCutPoint(entries: SessionTreeEntry[], startIndex: number, endIndex: number, keepRecentTokens: number): CutPointResult;
68
+ export declare const SUMMARIZATION_SYSTEM_PROMPT = "You are a context summarization assistant. Your task is to read a conversation between a user and an AI assistant, then produce a structured summary following the exact format specified.\n\nDo NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.";
69
+ /** Generate or update a conversation summary for compaction. */
70
+ export declare function generateSummary(currentMessages: AgentMessage[], model: Model<any>, reserveTokens: number, apiKey: string, headers?: Record<string, string>, signal?: AbortSignal, customInstructions?: string, previousSummary?: string, thinkingLevel?: ThinkingLevel): Promise<Result<string, CompactionError>>;
71
+ /** Prepared inputs for a compaction run. */
72
+ export interface CompactionPreparation {
73
+ /** Entry id where retained history starts. */
74
+ firstKeptEntryId: string;
75
+ /** Messages summarized into the history summary. */
76
+ messagesToSummarize: AgentMessage[];
77
+ /** Prefix messages summarized separately when compaction splits a turn. */
78
+ turnPrefixMessages: AgentMessage[];
79
+ /** Whether compaction splits a turn. */
80
+ isSplitTurn: boolean;
81
+ /** Estimated context tokens before compaction. */
82
+ tokensBefore: number;
83
+ /** Previous compaction summary used for iterative updates. */
84
+ previousSummary?: string;
85
+ /** File operations extracted from summarized history. */
86
+ fileOps: FileOperations;
87
+ /** Settings used to prepare compaction. */
88
+ settings: CompactionSettings;
89
+ }
90
+ /** Prepare session entries for compaction, or return undefined when compaction is not applicable. */
91
+ export declare function prepareCompaction(pathEntries: SessionTreeEntry[], settings: CompactionSettings): Result<CompactionPreparation | undefined, CompactionError>;
92
+ export { serializeConversation } from './utils.ts';
93
+ /** Generate compaction summary data from prepared session history. */
94
+ export declare function compact(preparation: CompactionPreparation, model: Model<any>, apiKey: string, headers?: Record<string, string>, customInstructions?: string, signal?: AbortSignal, thinkingLevel?: ThinkingLevel): Promise<Result<CompactionResult, CompactionError>>;