@agentscope-ai/agentscope 0.0.2 → 0.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 (90) hide show
  1. package/LICENSE +202 -0
  2. package/dist/agent/index.d.mts +10 -10
  3. package/dist/agent/index.d.ts +10 -10
  4. package/dist/agent/index.js +104 -93
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/agent/index.mjs +104 -93
  7. package/dist/agent/index.mjs.map +1 -1
  8. package/dist/{base-BOx3UzOl.d.mts → base-1YVBgB4n.d.mts} +2 -2
  9. package/dist/{base-DYlBMCy_.d.mts → base-B_MQMHWr.d.mts} +3 -3
  10. package/dist/{base-Cwi4bjze.d.ts → base-BherSLRs.d.ts} +3 -3
  11. package/dist/{base-NX-knWOv.d.ts → base-CY4DMBH1.d.ts} +1 -1
  12. package/dist/{base-BoIps2RL.d.ts → base-ChWjyzPL.d.ts} +2 -2
  13. package/dist/{base-C7jwyH4Z.d.mts → base-ClilytRZ.d.mts} +1 -1
  14. package/dist/{block-VsnHrllL.d.mts → block-B72uPF1H.d.mts} +7 -5
  15. package/dist/{block-VsnHrllL.d.ts → block-B72uPF1H.d.ts} +7 -5
  16. package/dist/event/index.d.mts +105 -89
  17. package/dist/event/index.d.ts +105 -89
  18. package/dist/event/index.js +8 -8
  19. package/dist/event/index.js.map +1 -1
  20. package/dist/event/index.mjs +8 -8
  21. package/dist/event/index.mjs.map +1 -1
  22. package/dist/formatter/index.d.mts +4 -3
  23. package/dist/formatter/index.d.ts +4 -3
  24. package/dist/formatter/index.js +17 -17
  25. package/dist/formatter/index.js.map +1 -1
  26. package/dist/formatter/index.mjs +17 -17
  27. package/dist/formatter/index.mjs.map +1 -1
  28. package/dist/{index-BcatlwXQ.d.ts → index-BNfyKbQN.d.ts} +1 -1
  29. package/dist/{index-BTJDlKvQ.d.mts → index-UQCwdfet.d.mts} +1 -1
  30. package/dist/mcp/index.d.mts +2 -2
  31. package/dist/mcp/index.d.ts +2 -2
  32. package/dist/mcp/index.js +1 -1
  33. package/dist/mcp/index.js.map +1 -1
  34. package/dist/mcp/index.mjs +1 -1
  35. package/dist/mcp/index.mjs.map +1 -1
  36. package/dist/message/index.d.mts +3 -2
  37. package/dist/message/index.d.ts +3 -2
  38. package/dist/message/index.js +204 -5
  39. package/dist/message/index.js.map +1 -1
  40. package/dist/message/index.mjs +200 -5
  41. package/dist/message/index.mjs.map +1 -1
  42. package/dist/message-CPZd0NIc.d.ts +133 -0
  43. package/dist/message-DgpfAaHK.d.mts +133 -0
  44. package/dist/model/index.d.mts +6 -5
  45. package/dist/model/index.d.ts +6 -5
  46. package/dist/model/index.js +39 -28
  47. package/dist/model/index.js.map +1 -1
  48. package/dist/model/index.mjs +39 -28
  49. package/dist/model/index.mjs.map +1 -1
  50. package/dist/storage/index.d.mts +4 -3
  51. package/dist/storage/index.d.ts +4 -3
  52. package/dist/storage/index.js +4 -4
  53. package/dist/storage/index.js.map +1 -1
  54. package/dist/storage/index.mjs +4 -4
  55. package/dist/storage/index.mjs.map +1 -1
  56. package/dist/tool/index.d.mts +4 -4
  57. package/dist/tool/index.d.ts +4 -4
  58. package/dist/{toolkit-CEpulFi0.d.ts → toolkit-DeOlul5Y.d.ts} +2 -2
  59. package/dist/{toolkit-CGEZSZPa.d.mts → toolkit-jwe7NmVJ.d.mts} +2 -2
  60. package/package.json +87 -87
  61. package/src/agent/agent.test.ts +104 -71
  62. package/src/agent/agent.ts +112 -104
  63. package/src/agent/test-compression.ts +1 -1
  64. package/src/event/index.ts +96 -98
  65. package/src/formatter/base.ts +3 -3
  66. package/src/formatter/dashscope-chat-formatter.test.ts +11 -8
  67. package/src/formatter/dashscope-chat-formatter.ts +3 -3
  68. package/src/formatter/openai-chat-formatter.test.ts +13 -5
  69. package/src/formatter/openai-chat-formatter.ts +6 -6
  70. package/src/mcp/base.ts +1 -1
  71. package/src/mcp/http.test.ts +2 -0
  72. package/src/mcp/stdio.test.ts +1 -0
  73. package/src/message/append-event.test.ts +783 -0
  74. package/src/message/block.ts +8 -4
  75. package/src/message/index.ts +12 -1
  76. package/src/message/message.test.ts +3 -1
  77. package/src/message/message.ts +310 -47
  78. package/src/model/dashscope-model.test.ts +4 -0
  79. package/src/model/dashscope-model.ts +3 -0
  80. package/src/model/deepseek-model.test.ts +2 -0
  81. package/src/model/deepseek-model.ts +3 -0
  82. package/src/model/ollama-model.test.ts +1 -0
  83. package/src/model/ollama-model.ts +2 -0
  84. package/src/model/openai-model.ts +3 -0
  85. package/src/permission/index.ts +13 -0
  86. package/src/storage/file-system.test.ts +4 -3
  87. package/src/storage/file-system.ts +4 -4
  88. package/src/tool/toolkit.test.ts +12 -0
  89. package/dist/message-CkN21KaY.d.mts +0 -99
  90. package/dist/message-CzLeTlua.d.ts +0 -99
@@ -1,7 +1,8 @@
1
- import { S as StorageBase, A as AgentState } from '../base-C7jwyH4Z.mjs';
2
- import { M as Msg } from '../message-CkN21KaY.mjs';
1
+ import { S as StorageBase, A as AgentState } from '../base-ClilytRZ.mjs';
2
+ import { M as Msg } from '../message-DgpfAaHK.mjs';
3
3
  import '../index-CAxQAkiP.mjs';
4
- import '../block-VsnHrllL.mjs';
4
+ import '../block-B72uPF1H.mjs';
5
+ import '../event/index.mjs';
5
6
 
6
7
  /**
7
8
  * Local file system storage implementation.
@@ -1,7 +1,8 @@
1
- import { S as StorageBase, A as AgentState } from '../base-NX-knWOv.js';
2
- import { M as Msg } from '../message-CzLeTlua.js';
1
+ import { S as StorageBase, A as AgentState } from '../base-CY4DMBH1.js';
2
+ import { M as Msg } from '../message-CPZd0NIc.js';
3
3
  import '../index-CAxQAkiP.js';
4
- import '../block-VsnHrllL.js';
4
+ import '../block-B72uPF1H.js';
5
+ import '../event/index.js';
5
6
 
6
7
  /**
7
8
  * Local file system storage implementation.
@@ -212,11 +212,11 @@ var LocalFileStorage = class extends StorageBase {
212
212
  case "data":
213
213
  if (block.source.type === "url") {
214
214
  msgContent.push(
215
- `${msg.name}: <data src={${block.source.url}} type={${block.source.mediaType}} />`
215
+ `${msg.name}: <data src={${block.source.url}} type={${block.source.media_type}} />`
216
216
  );
217
217
  } else if (block.source.type === "base64") {
218
- const mainType = block.source.mediaType.split("/")[0];
219
- const extension2 = mime.extension(block.source.mediaType) || "bin";
218
+ const mainType = block.source.media_type.split("/")[0];
219
+ const extension2 = mime.extension(block.source.media_type) || "bin";
220
220
  const filePath = import_path.default.join(
221
221
  offloadDataDir,
222
222
  `${mainType}-${Date.now()}.${extension2}`
@@ -227,7 +227,7 @@ var LocalFileStorage = class extends StorageBase {
227
227
  const buffer = Buffer.from(block.source.data, "base64");
228
228
  import_fs.default.writeFileSync(filePath, buffer);
229
229
  msgContent.push(
230
- `${msg.name}: <data src={${filePath}} type={${block.source.mediaType}} />`
230
+ `${msg.name}: <data src={${filePath}} type={${block.source.media_type}} />`
231
231
  );
232
232
  }
233
233
  break;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/index.ts","../../src/storage/base.ts","../../src/storage/file-system.ts"],"sourcesContent":["export { AgentState, StorageBase } from './base';\nexport { LocalFileStorage } from './file-system';\n","import { Msg } from '../message';\n\n/**\n * The complete agent state including both conversation context and metadata.\n */\nexport interface AgentState {\n /**\n * The conversation context (message history).\n */\n context: Msg[];\n /**\n * Agent metadata (replyId, curIter, curSummary, etc.).\n */\n metadata: Record<string, unknown>;\n}\n\n/**\n * The base storage class that responsible for\n * - loading/saving agent context and state, and\n * - offloading compressed context to external storage for agentic search if needed\n */\nexport abstract class StorageBase {\n /**\n * Load the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata\n */\n abstract loadAgentState(options?: { agentId?: string }): Promise<AgentState>;\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n abstract saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void>;\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param _options.msgs\n * @param _options\n * @returns The identifier or URL of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(_options: { msgs: Msg[] }): Promise<string | undefined> {\n console.log('Offloading context is not implemented for this storage. Skipping offloading.');\n return undefined;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nimport * as mime from 'mime-types';\n\nimport { Msg } from '../message';\nimport { AgentState, StorageBase } from './base';\n\n/**\n * Local file system storage implementation.\n * Stores agent state in JSON files with support for incremental context updates.\n */\nexport class LocalFileStorage extends StorageBase {\n saveDir: string;\n offloadDir?: string;\n\n /**\n * Internal metadata key prefix for storage-layer fields.\n * Fields with this prefix are managed by storage and filtered out when returning to agent layer.\n */\n private readonly INTERNAL_PREFIX = '_storage_';\n\n /**\n * Initialize a LocalFileStorage instance.\n * @param root0\n * @param root0.pathSegments - Path segments to determine the directory for saving agent state (e.g. ['rootDir', '{sessionId}'])\n * @param root0.offloadPathSegments - Optional path segments for offloading compressed context for agentic search (e.g. ['rootDir', 'offload'])\n */\n constructor({\n pathSegments = [],\n offloadPathSegments = [],\n }: {\n pathSegments?: string[];\n offloadPathSegments?: string[];\n }) {\n super();\n this.saveDir = path.join(...pathSegments);\n this.offloadDir =\n offloadPathSegments.length > 0 ? path.join(...offloadPathSegments) : undefined;\n }\n\n /**\n * Load the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata (internal fields filtered out)\n */\n async loadAgentState(options?: { agentId?: string }): Promise<AgentState> {\n const agentDir = path.join(this.saveDir, options?.agentId || '');\n\n // If the agent directory doesn't exist, return empty state\n if (!fs.existsSync(agentDir)) {\n console.log(`Agent directory ${agentDir} does not exist. Returning empty state.`);\n return {\n context: [],\n metadata: {},\n };\n }\n console.log(`Loading agent state from directory: ${agentDir}`);\n\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Load metadata\n let metadata: Record<string, unknown> = {};\n if (fs.existsSync(stateFile)) {\n const content = fs.readFileSync(stateFile, 'utf-8');\n metadata = JSON.parse(content);\n }\n\n // Extract internal compression boundary ID\n const compressionBoundaryMsgId = metadata[\n `${this.INTERNAL_PREFIX}compressionBoundaryMsgId`\n ] as string | undefined;\n\n // Load context (incrementally if compression boundary exists)\n let context: Msg[] = [];\n if (fs.existsSync(contextFile)) {\n const content = fs.readFileSync(contextFile, 'utf-8');\n const allMsgs = content\n .trim()\n .split('\\n')\n .filter(line => line.length > 0)\n .map(line => JSON.parse(line));\n\n if (compressionBoundaryMsgId) {\n // Load only messages after the compression boundary\n const boundaryIndex = allMsgs.findIndex(msg => msg.id === compressionBoundaryMsgId);\n if (boundaryIndex !== -1) {\n // Include the boundary message itself\n context = allMsgs.slice(boundaryIndex);\n } else {\n // Boundary not found, load all messages\n context = allMsgs;\n }\n } else {\n // No compression, load all messages\n context = allMsgs;\n }\n }\n\n // Filter out internal fields from metadata before returning\n const publicMetadata = this._filterInternalFields(metadata);\n\n return {\n context,\n metadata: publicMetadata,\n };\n }\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n async saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void> {\n const agentDir = path.join(this.saveDir, options.agentId || '');\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Ensure directory exists\n if (!fs.existsSync(agentDir)) {\n fs.mkdirSync(agentDir, { recursive: true });\n }\n\n // Determine compression boundary (first message in current context)\n const compressionBoundaryMsgId = options.context[0]?.id;\n\n // Save context with incremental append optimization\n if (!fs.existsSync(contextFile)) {\n // First time: write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n } else {\n // File exists: append only new messages\n const existingContent = fs.readFileSync(contextFile, 'utf-8');\n const existingLines = existingContent\n .trim()\n .split('\\n')\n .filter(line => line.length > 0);\n\n if (existingLines.length > 0) {\n const lastLine = existingLines[existingLines.length - 1];\n const lastMsg = JSON.parse(lastLine);\n\n // Find new messages that need to be saved (including the last saved message to overwrite it)\n const lastMsgIndex = options.context.findIndex(msg => msg.id === lastMsg.id);\n const newMsgs =\n lastMsgIndex >= 0 ? options.context.slice(lastMsgIndex) : options.context;\n\n if (newMsgs.length > 0) {\n // Combine existing messages (without last line) with new messages\n const allLines = [\n ...existingLines.slice(0, -1),\n ...newMsgs.map(msg => JSON.stringify(msg)),\n ];\n const content = allLines.join('\\n') + '\\n';\n fs.writeFileSync(contextFile, content, 'utf-8');\n }\n } else {\n // File is empty, write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n }\n }\n\n // Save metadata with internal compression boundary\n const internalMetadata = {\n ...options.metadata,\n [`${this.INTERNAL_PREFIX}compressionBoundaryMsgId`]: compressionBoundaryMsgId,\n };\n fs.writeFileSync(stateFile, JSON.stringify(internalMetadata, null, 2), 'utf-8');\n }\n\n /**\n * Filter out internal storage fields from metadata.\n * @param metadata - The metadata object\n * @returns Metadata with internal fields removed\n */\n private _filterInternalFields(metadata: Record<string, unknown>): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (!key.startsWith(this.INTERNAL_PREFIX)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.msgs - The messages to offload\n * @returns The file path of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(options: { agentId?: string; msgs: Msg[] }): Promise<string | undefined> {\n if (!this.offloadDir) {\n return;\n }\n\n // Offload the compressed context to the text file\n // e.g. 2026-03-01.txt\n const fileName = `${new Date().toISOString().split('T')[0]}.txt`;\n const offloadFile = path.join(this.offloadDir, options.agentId || '', fileName);\n const offloadDataDir = path.join(this.offloadDir, options.agentId || '', 'data');\n\n // Create the dir if it doesn't exist\n const offloadAgentDir = path.dirname(offloadFile);\n if (!fs.existsSync(offloadAgentDir)) {\n fs.mkdirSync(offloadAgentDir, { recursive: true });\n }\n\n // Append the new context to the offload file\n let appendContent = '';\n for (const msg of options.msgs) {\n const msgContent: string[] = [];\n for (const block of msg.content) {\n switch (block.type) {\n case 'text':\n msgContent.push(`${msg.name}: ${block.text}`);\n break;\n case 'data':\n if (block.source.type === 'url') {\n msgContent.push(\n `${msg.name}: <data src={${block.source.url}} type={${block.source.mediaType}} />`\n );\n } else if (block.source.type === 'base64') {\n // Save the base64 data to a file and add a reference to the file in the offload content\n const mainType = block.source.mediaType.split('/')[0];\n const extension = mime.extension(block.source.mediaType) || 'bin';\n const filePath = path.join(\n offloadDataDir,\n `${mainType}-${Date.now()}.${extension}`\n );\n if (!fs.existsSync(offloadDataDir)) {\n fs.mkdirSync(offloadDataDir, { recursive: true });\n }\n const buffer = Buffer.from(block.source.data, 'base64');\n fs.writeFileSync(filePath, buffer);\n msgContent.push(\n `${msg.name}: <data src={${filePath}} type={${block.source.mediaType}} />`\n );\n }\n break;\n case 'tool_call':\n msgContent.push(`${msg.name}: Calling tool ${block.name} ...`);\n break;\n }\n }\n appendContent += msgContent.join('\\n') + '\\n';\n }\n\n // Append to the offload file\n fs.appendFileSync(offloadFile, appendContent, 'utf-8');\n\n return offloadFile;\n }\n}\n"],"mappings":"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","names":["path","fs","extension"]}
1
+ {"version":3,"sources":["../../src/storage/index.ts","../../src/storage/base.ts","../../src/storage/file-system.ts"],"sourcesContent":["export { AgentState, StorageBase } from './base';\nexport { LocalFileStorage } from './file-system';\n","import { Msg } from '../message';\n\n/**\n * The complete agent state including both conversation context and metadata.\n */\nexport interface AgentState {\n /**\n * The conversation context (message history).\n */\n context: Msg[];\n /**\n * Agent metadata (replyId, curIter, curSummary, etc.).\n */\n metadata: Record<string, unknown>;\n}\n\n/**\n * The base storage class that responsible for\n * - loading/saving agent context and state, and\n * - offloading compressed context to external storage for agentic search if needed\n */\nexport abstract class StorageBase {\n /**\n * Load the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata\n */\n abstract loadAgentState(options?: { agentId?: string }): Promise<AgentState>;\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n abstract saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void>;\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param _options.msgs\n * @param _options\n * @returns The identifier or URL of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(_options: { msgs: Msg[] }): Promise<string | undefined> {\n console.log('Offloading context is not implemented for this storage. Skipping offloading.');\n return undefined;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nimport * as mime from 'mime-types';\n\nimport { Msg } from '../message';\nimport { AgentState, StorageBase } from './base';\n\n/**\n * Local file system storage implementation.\n * Stores agent state in JSON files with support for incremental context updates.\n */\nexport class LocalFileStorage extends StorageBase {\n saveDir: string;\n offloadDir?: string;\n\n /**\n * Internal metadata key prefix for storage-layer fields.\n * Fields with this prefix are managed by storage and filtered out when returning to agent layer.\n */\n private readonly INTERNAL_PREFIX = '_storage_';\n\n /**\n * Initialize a LocalFileStorage instance.\n * @param root0\n * @param root0.pathSegments - Path segments to determine the directory for saving agent state (e.g. ['rootDir', '{sessionId}'])\n * @param root0.offloadPathSegments - Optional path segments for offloading compressed context for agentic search (e.g. ['rootDir', 'offload'])\n */\n constructor({\n pathSegments = [],\n offloadPathSegments = [],\n }: {\n pathSegments?: string[];\n offloadPathSegments?: string[];\n }) {\n super();\n this.saveDir = path.join(...pathSegments);\n this.offloadDir =\n offloadPathSegments.length > 0 ? path.join(...offloadPathSegments) : undefined;\n }\n\n /**\n * Load the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata (internal fields filtered out)\n */\n async loadAgentState(options?: { agentId?: string }): Promise<AgentState> {\n const agentDir = path.join(this.saveDir, options?.agentId || '');\n\n // If the agent directory doesn't exist, return empty state\n if (!fs.existsSync(agentDir)) {\n console.log(`Agent directory ${agentDir} does not exist. Returning empty state.`);\n return {\n context: [],\n metadata: {},\n };\n }\n console.log(`Loading agent state from directory: ${agentDir}`);\n\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Load metadata\n let metadata: Record<string, unknown> = {};\n if (fs.existsSync(stateFile)) {\n const content = fs.readFileSync(stateFile, 'utf-8');\n metadata = JSON.parse(content);\n }\n\n // Extract internal compression boundary ID\n const compressionBoundaryMsgId = metadata[\n `${this.INTERNAL_PREFIX}compressionBoundaryMsgId`\n ] as string | undefined;\n\n // Load context (incrementally if compression boundary exists)\n let context: Msg[] = [];\n if (fs.existsSync(contextFile)) {\n const content = fs.readFileSync(contextFile, 'utf-8');\n const allMsgs = content\n .trim()\n .split('\\n')\n .filter(line => line.length > 0)\n .map(line => JSON.parse(line));\n\n if (compressionBoundaryMsgId) {\n // Load only messages after the compression boundary\n const boundaryIndex = allMsgs.findIndex(msg => msg.id === compressionBoundaryMsgId);\n if (boundaryIndex !== -1) {\n // Include the boundary message itself\n context = allMsgs.slice(boundaryIndex);\n } else {\n // Boundary not found, load all messages\n context = allMsgs;\n }\n } else {\n // No compression, load all messages\n context = allMsgs;\n }\n }\n\n // Filter out internal fields from metadata before returning\n const publicMetadata = this._filterInternalFields(metadata);\n\n return {\n context,\n metadata: publicMetadata,\n };\n }\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n async saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void> {\n const agentDir = path.join(this.saveDir, options.agentId || '');\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Ensure directory exists\n if (!fs.existsSync(agentDir)) {\n fs.mkdirSync(agentDir, { recursive: true });\n }\n\n // Determine compression boundary (first message in current context)\n const compressionBoundaryMsgId = options.context[0]?.id;\n\n // Save context with incremental append optimization\n if (!fs.existsSync(contextFile)) {\n // First time: write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n } else {\n // File exists: append only new messages\n const existingContent = fs.readFileSync(contextFile, 'utf-8');\n const existingLines = existingContent\n .trim()\n .split('\\n')\n .filter(line => line.length > 0);\n\n if (existingLines.length > 0) {\n const lastLine = existingLines[existingLines.length - 1];\n const lastMsg = JSON.parse(lastLine);\n\n // Find new messages that need to be saved (including the last saved message to overwrite it)\n const lastMsgIndex = options.context.findIndex(msg => msg.id === lastMsg.id);\n const newMsgs =\n lastMsgIndex >= 0 ? options.context.slice(lastMsgIndex) : options.context;\n\n if (newMsgs.length > 0) {\n // Combine existing messages (without last line) with new messages\n const allLines = [\n ...existingLines.slice(0, -1),\n ...newMsgs.map(msg => JSON.stringify(msg)),\n ];\n const content = allLines.join('\\n') + '\\n';\n fs.writeFileSync(contextFile, content, 'utf-8');\n }\n } else {\n // File is empty, write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n }\n }\n\n // Save metadata with internal compression boundary\n const internalMetadata = {\n ...options.metadata,\n [`${this.INTERNAL_PREFIX}compressionBoundaryMsgId`]: compressionBoundaryMsgId,\n };\n fs.writeFileSync(stateFile, JSON.stringify(internalMetadata, null, 2), 'utf-8');\n }\n\n /**\n * Filter out internal storage fields from metadata.\n * @param metadata - The metadata object\n * @returns Metadata with internal fields removed\n */\n private _filterInternalFields(metadata: Record<string, unknown>): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (!key.startsWith(this.INTERNAL_PREFIX)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.msgs - The messages to offload\n * @returns The file path of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(options: { agentId?: string; msgs: Msg[] }): Promise<string | undefined> {\n if (!this.offloadDir) {\n return;\n }\n\n // Offload the compressed context to the text file\n // e.g. 2026-03-01.txt\n const fileName = `${new Date().toISOString().split('T')[0]}.txt`;\n const offloadFile = path.join(this.offloadDir, options.agentId || '', fileName);\n const offloadDataDir = path.join(this.offloadDir, options.agentId || '', 'data');\n\n // Create the dir if it doesn't exist\n const offloadAgentDir = path.dirname(offloadFile);\n if (!fs.existsSync(offloadAgentDir)) {\n fs.mkdirSync(offloadAgentDir, { recursive: true });\n }\n\n // Append the new context to the offload file\n let appendContent = '';\n for (const msg of options.msgs) {\n const msgContent: string[] = [];\n for (const block of msg.content) {\n switch (block.type) {\n case 'text':\n msgContent.push(`${msg.name}: ${block.text}`);\n break;\n case 'data':\n if (block.source.type === 'url') {\n msgContent.push(\n `${msg.name}: <data src={${block.source.url}} type={${block.source.media_type}} />`\n );\n } else if (block.source.type === 'base64') {\n // Save the base64 data to a file and add a reference to the file in the offload content\n const mainType = block.source.media_type.split('/')[0];\n const extension = mime.extension(block.source.media_type) || 'bin';\n const filePath = path.join(\n offloadDataDir,\n `${mainType}-${Date.now()}.${extension}`\n );\n if (!fs.existsSync(offloadDataDir)) {\n fs.mkdirSync(offloadDataDir, { recursive: true });\n }\n const buffer = Buffer.from(block.source.data, 'base64');\n fs.writeFileSync(filePath, buffer);\n msgContent.push(\n `${msg.name}: <data src={${filePath}} type={${block.source.media_type}} />`\n );\n }\n break;\n case 'tool_call':\n msgContent.push(`${msg.name}: Calling tool ${block.name} ...`);\n break;\n }\n }\n appendContent += msgContent.join('\\n') + '\\n';\n }\n\n // Append to the offload file\n fs.appendFileSync(offloadFile, appendContent, 'utf-8');\n\n return offloadFile;\n }\n}\n"],"mappings":"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","names":["path","fs","extension"]}
@@ -175,11 +175,11 @@ var LocalFileStorage = class extends StorageBase {
175
175
  case "data":
176
176
  if (block.source.type === "url") {
177
177
  msgContent.push(
178
- `${msg.name}: <data src={${block.source.url}} type={${block.source.mediaType}} />`
178
+ `${msg.name}: <data src={${block.source.url}} type={${block.source.media_type}} />`
179
179
  );
180
180
  } else if (block.source.type === "base64") {
181
- const mainType = block.source.mediaType.split("/")[0];
182
- const extension2 = mime.extension(block.source.mediaType) || "bin";
181
+ const mainType = block.source.media_type.split("/")[0];
182
+ const extension2 = mime.extension(block.source.media_type) || "bin";
183
183
  const filePath = path.join(
184
184
  offloadDataDir,
185
185
  `${mainType}-${Date.now()}.${extension2}`
@@ -190,7 +190,7 @@ var LocalFileStorage = class extends StorageBase {
190
190
  const buffer = Buffer.from(block.source.data, "base64");
191
191
  fs.writeFileSync(filePath, buffer);
192
192
  msgContent.push(
193
- `${msg.name}: <data src={${filePath}} type={${block.source.mediaType}} />`
193
+ `${msg.name}: <data src={${filePath}} type={${block.source.media_type}} />`
194
194
  );
195
195
  }
196
196
  break;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/base.ts","../../src/storage/file-system.ts"],"sourcesContent":["import { Msg } from '../message';\n\n/**\n * The complete agent state including both conversation context and metadata.\n */\nexport interface AgentState {\n /**\n * The conversation context (message history).\n */\n context: Msg[];\n /**\n * Agent metadata (replyId, curIter, curSummary, etc.).\n */\n metadata: Record<string, unknown>;\n}\n\n/**\n * The base storage class that responsible for\n * - loading/saving agent context and state, and\n * - offloading compressed context to external storage for agentic search if needed\n */\nexport abstract class StorageBase {\n /**\n * Load the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata\n */\n abstract loadAgentState(options?: { agentId?: string }): Promise<AgentState>;\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n abstract saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void>;\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param _options.msgs\n * @param _options\n * @returns The identifier or URL of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(_options: { msgs: Msg[] }): Promise<string | undefined> {\n console.log('Offloading context is not implemented for this storage. Skipping offloading.');\n return undefined;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nimport * as mime from 'mime-types';\n\nimport { Msg } from '../message';\nimport { AgentState, StorageBase } from './base';\n\n/**\n * Local file system storage implementation.\n * Stores agent state in JSON files with support for incremental context updates.\n */\nexport class LocalFileStorage extends StorageBase {\n saveDir: string;\n offloadDir?: string;\n\n /**\n * Internal metadata key prefix for storage-layer fields.\n * Fields with this prefix are managed by storage and filtered out when returning to agent layer.\n */\n private readonly INTERNAL_PREFIX = '_storage_';\n\n /**\n * Initialize a LocalFileStorage instance.\n * @param root0\n * @param root0.pathSegments - Path segments to determine the directory for saving agent state (e.g. ['rootDir', '{sessionId}'])\n * @param root0.offloadPathSegments - Optional path segments for offloading compressed context for agentic search (e.g. ['rootDir', 'offload'])\n */\n constructor({\n pathSegments = [],\n offloadPathSegments = [],\n }: {\n pathSegments?: string[];\n offloadPathSegments?: string[];\n }) {\n super();\n this.saveDir = path.join(...pathSegments);\n this.offloadDir =\n offloadPathSegments.length > 0 ? path.join(...offloadPathSegments) : undefined;\n }\n\n /**\n * Load the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata (internal fields filtered out)\n */\n async loadAgentState(options?: { agentId?: string }): Promise<AgentState> {\n const agentDir = path.join(this.saveDir, options?.agentId || '');\n\n // If the agent directory doesn't exist, return empty state\n if (!fs.existsSync(agentDir)) {\n console.log(`Agent directory ${agentDir} does not exist. Returning empty state.`);\n return {\n context: [],\n metadata: {},\n };\n }\n console.log(`Loading agent state from directory: ${agentDir}`);\n\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Load metadata\n let metadata: Record<string, unknown> = {};\n if (fs.existsSync(stateFile)) {\n const content = fs.readFileSync(stateFile, 'utf-8');\n metadata = JSON.parse(content);\n }\n\n // Extract internal compression boundary ID\n const compressionBoundaryMsgId = metadata[\n `${this.INTERNAL_PREFIX}compressionBoundaryMsgId`\n ] as string | undefined;\n\n // Load context (incrementally if compression boundary exists)\n let context: Msg[] = [];\n if (fs.existsSync(contextFile)) {\n const content = fs.readFileSync(contextFile, 'utf-8');\n const allMsgs = content\n .trim()\n .split('\\n')\n .filter(line => line.length > 0)\n .map(line => JSON.parse(line));\n\n if (compressionBoundaryMsgId) {\n // Load only messages after the compression boundary\n const boundaryIndex = allMsgs.findIndex(msg => msg.id === compressionBoundaryMsgId);\n if (boundaryIndex !== -1) {\n // Include the boundary message itself\n context = allMsgs.slice(boundaryIndex);\n } else {\n // Boundary not found, load all messages\n context = allMsgs;\n }\n } else {\n // No compression, load all messages\n context = allMsgs;\n }\n }\n\n // Filter out internal fields from metadata before returning\n const publicMetadata = this._filterInternalFields(metadata);\n\n return {\n context,\n metadata: publicMetadata,\n };\n }\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n async saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void> {\n const agentDir = path.join(this.saveDir, options.agentId || '');\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Ensure directory exists\n if (!fs.existsSync(agentDir)) {\n fs.mkdirSync(agentDir, { recursive: true });\n }\n\n // Determine compression boundary (first message in current context)\n const compressionBoundaryMsgId = options.context[0]?.id;\n\n // Save context with incremental append optimization\n if (!fs.existsSync(contextFile)) {\n // First time: write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n } else {\n // File exists: append only new messages\n const existingContent = fs.readFileSync(contextFile, 'utf-8');\n const existingLines = existingContent\n .trim()\n .split('\\n')\n .filter(line => line.length > 0);\n\n if (existingLines.length > 0) {\n const lastLine = existingLines[existingLines.length - 1];\n const lastMsg = JSON.parse(lastLine);\n\n // Find new messages that need to be saved (including the last saved message to overwrite it)\n const lastMsgIndex = options.context.findIndex(msg => msg.id === lastMsg.id);\n const newMsgs =\n lastMsgIndex >= 0 ? options.context.slice(lastMsgIndex) : options.context;\n\n if (newMsgs.length > 0) {\n // Combine existing messages (without last line) with new messages\n const allLines = [\n ...existingLines.slice(0, -1),\n ...newMsgs.map(msg => JSON.stringify(msg)),\n ];\n const content = allLines.join('\\n') + '\\n';\n fs.writeFileSync(contextFile, content, 'utf-8');\n }\n } else {\n // File is empty, write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n }\n }\n\n // Save metadata with internal compression boundary\n const internalMetadata = {\n ...options.metadata,\n [`${this.INTERNAL_PREFIX}compressionBoundaryMsgId`]: compressionBoundaryMsgId,\n };\n fs.writeFileSync(stateFile, JSON.stringify(internalMetadata, null, 2), 'utf-8');\n }\n\n /**\n * Filter out internal storage fields from metadata.\n * @param metadata - The metadata object\n * @returns Metadata with internal fields removed\n */\n private _filterInternalFields(metadata: Record<string, unknown>): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (!key.startsWith(this.INTERNAL_PREFIX)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.msgs - The messages to offload\n * @returns The file path of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(options: { agentId?: string; msgs: Msg[] }): Promise<string | undefined> {\n if (!this.offloadDir) {\n return;\n }\n\n // Offload the compressed context to the text file\n // e.g. 2026-03-01.txt\n const fileName = `${new Date().toISOString().split('T')[0]}.txt`;\n const offloadFile = path.join(this.offloadDir, options.agentId || '', fileName);\n const offloadDataDir = path.join(this.offloadDir, options.agentId || '', 'data');\n\n // Create the dir if it doesn't exist\n const offloadAgentDir = path.dirname(offloadFile);\n if (!fs.existsSync(offloadAgentDir)) {\n fs.mkdirSync(offloadAgentDir, { recursive: true });\n }\n\n // Append the new context to the offload file\n let appendContent = '';\n for (const msg of options.msgs) {\n const msgContent: string[] = [];\n for (const block of msg.content) {\n switch (block.type) {\n case 'text':\n msgContent.push(`${msg.name}: ${block.text}`);\n break;\n case 'data':\n if (block.source.type === 'url') {\n msgContent.push(\n `${msg.name}: <data src={${block.source.url}} type={${block.source.mediaType}} />`\n );\n } else if (block.source.type === 'base64') {\n // Save the base64 data to a file and add a reference to the file in the offload content\n const mainType = block.source.mediaType.split('/')[0];\n const extension = mime.extension(block.source.mediaType) || 'bin';\n const filePath = path.join(\n offloadDataDir,\n `${mainType}-${Date.now()}.${extension}`\n );\n if (!fs.existsSync(offloadDataDir)) {\n fs.mkdirSync(offloadDataDir, { recursive: true });\n }\n const buffer = Buffer.from(block.source.data, 'base64');\n fs.writeFileSync(filePath, buffer);\n msgContent.push(\n `${msg.name}: <data src={${filePath}} type={${block.source.mediaType}} />`\n );\n }\n break;\n case 'tool_call':\n msgContent.push(`${msg.name}: Calling tool ${block.name} ...`);\n break;\n }\n }\n appendContent += msgContent.join('\\n') + '\\n';\n }\n\n // Append to the offload file\n fs.appendFileSync(offloadFile, appendContent, 'utf-8');\n\n return offloadFile;\n }\n}\n"],"mappings":"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","names":["extension"]}
1
+ {"version":3,"sources":["../../src/storage/base.ts","../../src/storage/file-system.ts"],"sourcesContent":["import { Msg } from '../message';\n\n/**\n * The complete agent state including both conversation context and metadata.\n */\nexport interface AgentState {\n /**\n * The conversation context (message history).\n */\n context: Msg[];\n /**\n * Agent metadata (replyId, curIter, curSummary, etc.).\n */\n metadata: Record<string, unknown>;\n}\n\n/**\n * The base storage class that responsible for\n * - loading/saving agent context and state, and\n * - offloading compressed context to external storage for agentic search if needed\n */\nexport abstract class StorageBase {\n /**\n * Load the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata\n */\n abstract loadAgentState(options?: { agentId?: string }): Promise<AgentState>;\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n abstract saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void>;\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param _options.msgs\n * @param _options\n * @returns The identifier or URL of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(_options: { msgs: Msg[] }): Promise<string | undefined> {\n console.log('Offloading context is not implemented for this storage. Skipping offloading.');\n return undefined;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nimport * as mime from 'mime-types';\n\nimport { Msg } from '../message';\nimport { AgentState, StorageBase } from './base';\n\n/**\n * Local file system storage implementation.\n * Stores agent state in JSON files with support for incremental context updates.\n */\nexport class LocalFileStorage extends StorageBase {\n saveDir: string;\n offloadDir?: string;\n\n /**\n * Internal metadata key prefix for storage-layer fields.\n * Fields with this prefix are managed by storage and filtered out when returning to agent layer.\n */\n private readonly INTERNAL_PREFIX = '_storage_';\n\n /**\n * Initialize a LocalFileStorage instance.\n * @param root0\n * @param root0.pathSegments - Path segments to determine the directory for saving agent state (e.g. ['rootDir', '{sessionId}'])\n * @param root0.offloadPathSegments - Optional path segments for offloading compressed context for agentic search (e.g. ['rootDir', 'offload'])\n */\n constructor({\n pathSegments = [],\n offloadPathSegments = [],\n }: {\n pathSegments?: string[];\n offloadPathSegments?: string[];\n }) {\n super();\n this.saveDir = path.join(...pathSegments);\n this.offloadDir =\n offloadPathSegments.length > 0 ? path.join(...offloadPathSegments) : undefined;\n }\n\n /**\n * Load the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @returns The agent state with context and metadata (internal fields filtered out)\n */\n async loadAgentState(options?: { agentId?: string }): Promise<AgentState> {\n const agentDir = path.join(this.saveDir, options?.agentId || '');\n\n // If the agent directory doesn't exist, return empty state\n if (!fs.existsSync(agentDir)) {\n console.log(`Agent directory ${agentDir} does not exist. Returning empty state.`);\n return {\n context: [],\n metadata: {},\n };\n }\n console.log(`Loading agent state from directory: ${agentDir}`);\n\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Load metadata\n let metadata: Record<string, unknown> = {};\n if (fs.existsSync(stateFile)) {\n const content = fs.readFileSync(stateFile, 'utf-8');\n metadata = JSON.parse(content);\n }\n\n // Extract internal compression boundary ID\n const compressionBoundaryMsgId = metadata[\n `${this.INTERNAL_PREFIX}compressionBoundaryMsgId`\n ] as string | undefined;\n\n // Load context (incrementally if compression boundary exists)\n let context: Msg[] = [];\n if (fs.existsSync(contextFile)) {\n const content = fs.readFileSync(contextFile, 'utf-8');\n const allMsgs = content\n .trim()\n .split('\\n')\n .filter(line => line.length > 0)\n .map(line => JSON.parse(line));\n\n if (compressionBoundaryMsgId) {\n // Load only messages after the compression boundary\n const boundaryIndex = allMsgs.findIndex(msg => msg.id === compressionBoundaryMsgId);\n if (boundaryIndex !== -1) {\n // Include the boundary message itself\n context = allMsgs.slice(boundaryIndex);\n } else {\n // Boundary not found, load all messages\n context = allMsgs;\n }\n } else {\n // No compression, load all messages\n context = allMsgs;\n }\n }\n\n // Filter out internal fields from metadata before returning\n const publicMetadata = this._filterInternalFields(metadata);\n\n return {\n context,\n metadata: publicMetadata,\n };\n }\n\n /**\n * Save the complete agent state including context and metadata.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.context - The conversation context to save\n * @param options.metadata - The agent metadata to save\n */\n async saveAgentState(options: {\n agentId?: string;\n context: Msg[];\n metadata: Record<string, unknown>;\n }): Promise<void> {\n const agentDir = path.join(this.saveDir, options.agentId || '');\n const contextFile = path.join(agentDir, 'context.jsonl');\n const stateFile = path.join(agentDir, 'state.json');\n\n // Ensure directory exists\n if (!fs.existsSync(agentDir)) {\n fs.mkdirSync(agentDir, { recursive: true });\n }\n\n // Determine compression boundary (first message in current context)\n const compressionBoundaryMsgId = options.context[0]?.id;\n\n // Save context with incremental append optimization\n if (!fs.existsSync(contextFile)) {\n // First time: write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n } else {\n // File exists: append only new messages\n const existingContent = fs.readFileSync(contextFile, 'utf-8');\n const existingLines = existingContent\n .trim()\n .split('\\n')\n .filter(line => line.length > 0);\n\n if (existingLines.length > 0) {\n const lastLine = existingLines[existingLines.length - 1];\n const lastMsg = JSON.parse(lastLine);\n\n // Find new messages that need to be saved (including the last saved message to overwrite it)\n const lastMsgIndex = options.context.findIndex(msg => msg.id === lastMsg.id);\n const newMsgs =\n lastMsgIndex >= 0 ? options.context.slice(lastMsgIndex) : options.context;\n\n if (newMsgs.length > 0) {\n // Combine existing messages (without last line) with new messages\n const allLines = [\n ...existingLines.slice(0, -1),\n ...newMsgs.map(msg => JSON.stringify(msg)),\n ];\n const content = allLines.join('\\n') + '\\n';\n fs.writeFileSync(contextFile, content, 'utf-8');\n }\n } else {\n // File is empty, write all messages\n const content = options.context.map(msg => JSON.stringify(msg)).join('\\n');\n if (content) {\n fs.writeFileSync(contextFile, content + '\\n', 'utf-8');\n }\n }\n }\n\n // Save metadata with internal compression boundary\n const internalMetadata = {\n ...options.metadata,\n [`${this.INTERNAL_PREFIX}compressionBoundaryMsgId`]: compressionBoundaryMsgId,\n };\n fs.writeFileSync(stateFile, JSON.stringify(internalMetadata, null, 2), 'utf-8');\n }\n\n /**\n * Filter out internal storage fields from metadata.\n * @param metadata - The metadata object\n * @returns Metadata with internal fields removed\n */\n private _filterInternalFields(metadata: Record<string, unknown>): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (!key.startsWith(this.INTERNAL_PREFIX)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n /**\n * Offload the compressed context to external storage for agentic search if needed.\n * @param options\n * @param options.agentId - The agent identifier\n * @param options.msgs - The messages to offload\n * @returns The file path of the offloaded context, or undefined if offloading is not implemented or not needed\n */\n async offloadContext(options: { agentId?: string; msgs: Msg[] }): Promise<string | undefined> {\n if (!this.offloadDir) {\n return;\n }\n\n // Offload the compressed context to the text file\n // e.g. 2026-03-01.txt\n const fileName = `${new Date().toISOString().split('T')[0]}.txt`;\n const offloadFile = path.join(this.offloadDir, options.agentId || '', fileName);\n const offloadDataDir = path.join(this.offloadDir, options.agentId || '', 'data');\n\n // Create the dir if it doesn't exist\n const offloadAgentDir = path.dirname(offloadFile);\n if (!fs.existsSync(offloadAgentDir)) {\n fs.mkdirSync(offloadAgentDir, { recursive: true });\n }\n\n // Append the new context to the offload file\n let appendContent = '';\n for (const msg of options.msgs) {\n const msgContent: string[] = [];\n for (const block of msg.content) {\n switch (block.type) {\n case 'text':\n msgContent.push(`${msg.name}: ${block.text}`);\n break;\n case 'data':\n if (block.source.type === 'url') {\n msgContent.push(\n `${msg.name}: <data src={${block.source.url}} type={${block.source.media_type}} />`\n );\n } else if (block.source.type === 'base64') {\n // Save the base64 data to a file and add a reference to the file in the offload content\n const mainType = block.source.media_type.split('/')[0];\n const extension = mime.extension(block.source.media_type) || 'bin';\n const filePath = path.join(\n offloadDataDir,\n `${mainType}-${Date.now()}.${extension}`\n );\n if (!fs.existsSync(offloadDataDir)) {\n fs.mkdirSync(offloadDataDir, { recursive: true });\n }\n const buffer = Buffer.from(block.source.data, 'base64');\n fs.writeFileSync(filePath, buffer);\n msgContent.push(\n `${msg.name}: <data src={${filePath}} type={${block.source.media_type}} />`\n );\n }\n break;\n case 'tool_call':\n msgContent.push(`${msg.name}: Calling tool ${block.name} ...`);\n break;\n }\n }\n appendContent += msgContent.join('\\n') + '\\n';\n }\n\n // Append to the offload file\n fs.appendFileSync(offloadFile, appendContent, 'utf-8');\n\n return offloadFile;\n }\n}\n"],"mappings":"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","names":["extension"]}
@@ -1,13 +1,13 @@
1
- import { a as ToolResponse } from '../index-BTJDlKvQ.mjs';
2
- export { T as Tool } from '../index-BTJDlKvQ.mjs';
3
- export { T as Toolkit } from '../toolkit-CGEZSZPa.mjs';
1
+ import { a as ToolResponse } from '../index-UQCwdfet.mjs';
2
+ export { T as Tool } from '../index-UQCwdfet.mjs';
3
+ export { T as Toolkit } from '../toolkit-jwe7NmVJ.mjs';
4
4
  import { z } from 'zod';
5
5
  import '@modelcontextprotocol/sdk/client/index.js';
6
6
  import '@modelcontextprotocol/sdk/client/sse.js';
7
7
  import '@modelcontextprotocol/sdk/client/streamableHttp.js';
8
8
  import '@modelcontextprotocol/sdk/shared/protocol.js';
9
9
  import '../index-CAxQAkiP.mjs';
10
- import '../block-VsnHrllL.mjs';
10
+ import '../block-B72uPF1H.mjs';
11
11
  import '@modelcontextprotocol/sdk/client/stdio.js';
12
12
 
13
13
  /**
@@ -1,13 +1,13 @@
1
- import { a as ToolResponse } from '../index-BcatlwXQ.js';
2
- export { T as Tool } from '../index-BcatlwXQ.js';
3
- export { T as Toolkit } from '../toolkit-CEpulFi0.js';
1
+ import { a as ToolResponse } from '../index-BNfyKbQN.js';
2
+ export { T as Tool } from '../index-BNfyKbQN.js';
3
+ export { T as Toolkit } from '../toolkit-DeOlul5Y.js';
4
4
  import { z } from 'zod';
5
5
  import '@modelcontextprotocol/sdk/client/index.js';
6
6
  import '@modelcontextprotocol/sdk/client/sse.js';
7
7
  import '@modelcontextprotocol/sdk/client/streamableHttp.js';
8
8
  import '@modelcontextprotocol/sdk/shared/protocol.js';
9
9
  import '../index-CAxQAkiP.js';
10
- import '../block-VsnHrllL.js';
10
+ import '../block-B72uPF1H.js';
11
11
  import '@modelcontextprotocol/sdk/client/stdio.js';
12
12
 
13
13
  /**
@@ -1,6 +1,6 @@
1
- import { T as Tool, H as HTTPMCPClient, S as StdioMCPClient, a as ToolResponse } from './index-BcatlwXQ.js';
1
+ import { T as Tool, H as HTTPMCPClient, S as StdioMCPClient, a as ToolResponse } from './index-BNfyKbQN.js';
2
2
  import { T as ToolSchema } from './index-CAxQAkiP.js';
3
- import { b as ToolCallBlock } from './block-VsnHrllL.js';
3
+ import { b as ToolCallBlock } from './block-B72uPF1H.js';
4
4
 
5
5
  interface RegisteredTool extends Tool {
6
6
  type: 'function' | 'mcp';
@@ -1,6 +1,6 @@
1
- import { T as Tool, H as HTTPMCPClient, S as StdioMCPClient, a as ToolResponse } from './index-BTJDlKvQ.mjs';
1
+ import { T as Tool, H as HTTPMCPClient, S as StdioMCPClient, a as ToolResponse } from './index-UQCwdfet.mjs';
2
2
  import { T as ToolSchema } from './index-CAxQAkiP.mjs';
3
- import { b as ToolCallBlock } from './block-VsnHrllL.mjs';
3
+ import { b as ToolCallBlock } from './block-B72uPF1H.mjs';
4
4
 
5
5
  interface RegisteredTool extends Tool {
6
6
  type: 'function' | 'mcp';
package/package.json CHANGED
@@ -1,92 +1,92 @@
1
1
  {
2
- "name": "@agentscope-ai/agentscope",
3
- "version": "0.0.2",
4
- "description": "",
5
- "exports": {
6
- "./message": {
7
- "types": "./dist/message/index.d.ts",
8
- "import": "./dist/message/index.mjs",
9
- "require": "./dist/message/index.js"
10
- },
11
- "./model": {
12
- "types": "./dist/model/index.d.ts",
13
- "import": "./dist/model/index.mjs",
14
- "require": "./dist/model/index.js"
15
- },
16
- "./tool": {
17
- "types": "./dist/tool/index.d.ts",
18
- "import": "./dist/tool/index.mjs",
19
- "require": "./dist/tool/index.js"
20
- },
21
- "./agent": {
22
- "types": "./dist/agent/index.d.ts",
23
- "import": "./dist/agent/index.mjs",
24
- "require": "./dist/agent/index.js"
25
- },
26
- "./formatter": {
27
- "types": "./dist/formatter/index.d.ts",
28
- "import": "./dist/formatter/index.mjs",
29
- "require": "./dist/formatter/index.js"
30
- },
31
- "./event": {
32
- "types": "./dist/event/index.d.ts",
33
- "development": "./src/event/index.ts",
34
- "import": "./dist/event/index.mjs",
35
- "require": "./dist/event/index.js"
36
- },
37
- "./mcp": {
38
- "types": "./dist/mcp/index.d.ts",
39
- "import": "./dist/mcp/index.mjs",
40
- "require": "./dist/mcp/index.js"
41
- },
42
- "./storage": {
43
- "types": "./dist/storage/index.d.ts",
44
- "import": "./dist/storage/index.mjs",
45
- "require": "./dist/storage/index.js"
46
- }
2
+ "name": "@agentscope-ai/agentscope",
3
+ "version": "0.0.4",
4
+ "description": "",
5
+ "exports": {
6
+ "./message": {
7
+ "types": "./dist/message/index.d.ts",
8
+ "import": "./dist/message/index.mjs",
9
+ "require": "./dist/message/index.js"
47
10
  },
48
- "scripts": {
49
- "build": "tsup",
50
- "dev": "tsup --watch",
51
- "test": "jest",
52
- "clean": "rm -rf dist",
53
- "docs:generate": "typedoc"
11
+ "./model": {
12
+ "types": "./dist/model/index.d.ts",
13
+ "import": "./dist/model/index.mjs",
14
+ "require": "./dist/model/index.js"
54
15
  },
55
- "devDependencies": {
56
- "@commitlint/cli": "^20.2.0",
57
- "@commitlint/config-conventional": "^20.2.0",
58
- "@types/jest": "^30.0.0",
59
- "@types/mime-types": "^3.0.1",
60
- "@types/node": "^22.19.15",
61
- "@types/uuid": "^10.0.0",
62
- "@typescript-eslint/eslint-plugin": "^8.49.0",
63
- "@typescript-eslint/parser": "^8.49.0",
64
- "eslint": "^9.39.1",
65
- "eslint-config-prettier": "^10.1.8",
66
- "eslint-plugin-import": "^2.32.0",
67
- "eslint-plugin-jsdoc": "^61.5.0",
68
- "eslint-plugin-prettier": "^5.5.4",
69
- "husky": "^9.1.7",
70
- "jest": "^30.2.0",
71
- "lint-staged": "^16.2.7",
72
- "prettier": "^3.7.4",
73
- "ts-jest": "^29.4.6",
74
- "tsup": "^8.5.1",
75
- "typedoc": "^0.28.17",
76
- "typedoc-plugin-markdown": "^4.10.0",
77
- "typescript": "^5.5.3"
16
+ "./tool": {
17
+ "types": "./dist/tool/index.d.ts",
18
+ "import": "./dist/tool/index.mjs",
19
+ "require": "./dist/tool/index.js"
78
20
  },
79
- "dependencies": {
80
- "@cfworker/json-schema": "^4.1.1",
81
- "@modelcontextprotocol/sdk": "^1.27.1",
82
- "gray-matter": "^4.0.3",
83
- "jsonrepair": "^3.13.1",
84
- "mime-types": "^3.0.2",
85
- "ollama": "^0.6.3",
86
- "openai": "^6.16.0",
87
- "string-format": "^2.0.0",
88
- "uuid": "^13.0.0",
89
- "zod": "^4.3.6",
90
- "zod-to-json-schema": "^3.25.1"
21
+ "./agent": {
22
+ "types": "./dist/agent/index.d.ts",
23
+ "import": "./dist/agent/index.mjs",
24
+ "require": "./dist/agent/index.js"
25
+ },
26
+ "./formatter": {
27
+ "types": "./dist/formatter/index.d.ts",
28
+ "import": "./dist/formatter/index.mjs",
29
+ "require": "./dist/formatter/index.js"
30
+ },
31
+ "./event": {
32
+ "types": "./dist/event/index.d.ts",
33
+ "development": "./src/event/index.ts",
34
+ "import": "./dist/event/index.mjs",
35
+ "require": "./dist/event/index.js"
36
+ },
37
+ "./mcp": {
38
+ "types": "./dist/mcp/index.d.ts",
39
+ "import": "./dist/mcp/index.mjs",
40
+ "require": "./dist/mcp/index.js"
41
+ },
42
+ "./storage": {
43
+ "types": "./dist/storage/index.d.ts",
44
+ "import": "./dist/storage/index.mjs",
45
+ "require": "./dist/storage/index.js"
91
46
  }
92
- }
47
+ },
48
+ "devDependencies": {
49
+ "@commitlint/cli": "^20.2.0",
50
+ "@commitlint/config-conventional": "^20.2.0",
51
+ "@types/jest": "^30.0.0",
52
+ "@types/mime-types": "^3.0.1",
53
+ "@types/node": "^22.19.15",
54
+ "@types/uuid": "^10.0.0",
55
+ "@typescript-eslint/eslint-plugin": "^8.49.0",
56
+ "@typescript-eslint/parser": "^8.49.0",
57
+ "eslint": "^9.39.1",
58
+ "eslint-config-prettier": "^10.1.8",
59
+ "eslint-plugin-import": "^2.32.0",
60
+ "eslint-plugin-jsdoc": "^61.5.0",
61
+ "eslint-plugin-prettier": "^5.5.4",
62
+ "husky": "^9.1.7",
63
+ "jest": "^30.2.0",
64
+ "lint-staged": "^16.2.7",
65
+ "prettier": "^3.7.4",
66
+ "ts-jest": "^29.4.6",
67
+ "tsup": "^8.5.1",
68
+ "typedoc": "^0.28.17",
69
+ "typedoc-plugin-markdown": "^4.10.0",
70
+ "typescript": "^5.5.3"
71
+ },
72
+ "dependencies": {
73
+ "@cfworker/json-schema": "^4.1.1",
74
+ "@modelcontextprotocol/sdk": "^1.27.1",
75
+ "gray-matter": "^4.0.3",
76
+ "jsonrepair": "^3.13.1",
77
+ "mime-types": "^3.0.2",
78
+ "ollama": "^0.6.3",
79
+ "openai": "^6.16.0",
80
+ "string-format": "^2.0.0",
81
+ "uuid": "^13.0.0",
82
+ "zod": "^4.3.6",
83
+ "zod-to-json-schema": "^3.25.1"
84
+ },
85
+ "scripts": {
86
+ "build": "tsup",
87
+ "dev": "tsup --watch",
88
+ "test": "jest",
89
+ "clean": "rm -rf dist",
90
+ "docs:generate": "typedoc"
91
+ }
92
+ }