@aigne/agent-runtime 1.12.0-beta.5

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 (234) hide show
  1. package/LICENSE.md +26 -0
  2. package/README.md +79 -0
  3. package/dist/agent-runners/ai-runner.cjs +133 -0
  4. package/dist/agent-runners/ai-runner.d.cts +33 -0
  5. package/dist/agent-runners/ai-runner.d.cts.map +1 -0
  6. package/dist/agent-runners/ai-runner.d.mts +33 -0
  7. package/dist/agent-runners/ai-runner.d.mts.map +1 -0
  8. package/dist/agent-runners/ai-runner.mjs +134 -0
  9. package/dist/agent-runners/ai-runner.mjs.map +1 -0
  10. package/dist/agent-runners/ash-runner.cjs +272 -0
  11. package/dist/agent-runners/ash-runner.d.cts +30 -0
  12. package/dist/agent-runners/ash-runner.d.cts.map +1 -0
  13. package/dist/agent-runners/ash-runner.d.mts +30 -0
  14. package/dist/agent-runners/ash-runner.d.mts.map +1 -0
  15. package/dist/agent-runners/ash-runner.mjs +273 -0
  16. package/dist/agent-runners/ash-runner.mjs.map +1 -0
  17. package/dist/agent-runners/budget.cjs +71 -0
  18. package/dist/agent-runners/budget.d.cts +40 -0
  19. package/dist/agent-runners/budget.d.cts.map +1 -0
  20. package/dist/agent-runners/budget.d.mts +40 -0
  21. package/dist/agent-runners/budget.d.mts.map +1 -0
  22. package/dist/agent-runners/budget.mjs +67 -0
  23. package/dist/agent-runners/budget.mjs.map +1 -0
  24. package/dist/agent-runners/code-runner.cjs +61 -0
  25. package/dist/agent-runners/code-runner.mjs +61 -0
  26. package/dist/agent-runners/code-runner.mjs.map +1 -0
  27. package/dist/agent-runners/env-whitelist.cjs +36 -0
  28. package/dist/agent-runners/env-whitelist.d.cts +5 -0
  29. package/dist/agent-runners/env-whitelist.d.cts.map +1 -0
  30. package/dist/agent-runners/env-whitelist.d.mts +5 -0
  31. package/dist/agent-runners/env-whitelist.d.mts.map +1 -0
  32. package/dist/agent-runners/env-whitelist.mjs +36 -0
  33. package/dist/agent-runners/env-whitelist.mjs.map +1 -0
  34. package/dist/agent-runners/guide-rails.cjs +47 -0
  35. package/dist/agent-runners/guide-rails.d.cts +16 -0
  36. package/dist/agent-runners/guide-rails.d.cts.map +1 -0
  37. package/dist/agent-runners/guide-rails.d.mts +16 -0
  38. package/dist/agent-runners/guide-rails.d.mts.map +1 -0
  39. package/dist/agent-runners/guide-rails.mjs +48 -0
  40. package/dist/agent-runners/guide-rails.mjs.map +1 -0
  41. package/dist/agent-runners/hook-channel.cjs +55 -0
  42. package/dist/agent-runners/hook-channel.d.cts +38 -0
  43. package/dist/agent-runners/hook-channel.d.cts.map +1 -0
  44. package/dist/agent-runners/hook-channel.d.mts +38 -0
  45. package/dist/agent-runners/hook-channel.d.mts.map +1 -0
  46. package/dist/agent-runners/hook-channel.mjs +55 -0
  47. package/dist/agent-runners/hook-channel.mjs.map +1 -0
  48. package/dist/agent-runners/hooks.cjs +107 -0
  49. package/dist/agent-runners/hooks.d.cts +41 -0
  50. package/dist/agent-runners/hooks.d.cts.map +1 -0
  51. package/dist/agent-runners/hooks.d.mts +41 -0
  52. package/dist/agent-runners/hooks.d.mts.map +1 -0
  53. package/dist/agent-runners/hooks.mjs +107 -0
  54. package/dist/agent-runners/hooks.mjs.map +1 -0
  55. package/dist/agent-runners/memory-afs.cjs +342 -0
  56. package/dist/agent-runners/memory-afs.d.cts +221 -0
  57. package/dist/agent-runners/memory-afs.d.cts.map +1 -0
  58. package/dist/agent-runners/memory-afs.d.mts +221 -0
  59. package/dist/agent-runners/memory-afs.d.mts.map +1 -0
  60. package/dist/agent-runners/memory-afs.mjs +326 -0
  61. package/dist/agent-runners/memory-afs.mjs.map +1 -0
  62. package/dist/agent-runners/memory-archive.cjs +263 -0
  63. package/dist/agent-runners/memory-archive.d.cts +47 -0
  64. package/dist/agent-runners/memory-archive.d.cts.map +1 -0
  65. package/dist/agent-runners/memory-archive.d.mts +47 -0
  66. package/dist/agent-runners/memory-archive.d.mts.map +1 -0
  67. package/dist/agent-runners/memory-archive.mjs +257 -0
  68. package/dist/agent-runners/memory-archive.mjs.map +1 -0
  69. package/dist/agent-runners/orchestrator-runner.cjs +302 -0
  70. package/dist/agent-runners/orchestrator-runner.d.cts +23 -0
  71. package/dist/agent-runners/orchestrator-runner.d.cts.map +1 -0
  72. package/dist/agent-runners/orchestrator-runner.d.mts +23 -0
  73. package/dist/agent-runners/orchestrator-runner.d.mts.map +1 -0
  74. package/dist/agent-runners/orchestrator-runner.mjs +303 -0
  75. package/dist/agent-runners/orchestrator-runner.mjs.map +1 -0
  76. package/dist/agent-runners/orchestrator-state.cjs +68 -0
  77. package/dist/agent-runners/orchestrator-state.d.cts +23 -0
  78. package/dist/agent-runners/orchestrator-state.d.cts.map +1 -0
  79. package/dist/agent-runners/orchestrator-state.d.mts +23 -0
  80. package/dist/agent-runners/orchestrator-state.d.mts.map +1 -0
  81. package/dist/agent-runners/orchestrator-state.mjs +65 -0
  82. package/dist/agent-runners/orchestrator-state.mjs.map +1 -0
  83. package/dist/agent-runners/retry.cjs +30 -0
  84. package/dist/agent-runners/retry.d.cts +13 -0
  85. package/dist/agent-runners/retry.d.cts.map +1 -0
  86. package/dist/agent-runners/retry.d.mts +13 -0
  87. package/dist/agent-runners/retry.d.mts.map +1 -0
  88. package/dist/agent-runners/retry.mjs +30 -0
  89. package/dist/agent-runners/retry.mjs.map +1 -0
  90. package/dist/agent-runners/scratchpad-afs.cjs +276 -0
  91. package/dist/agent-runners/scratchpad-afs.d.cts +103 -0
  92. package/dist/agent-runners/scratchpad-afs.d.cts.map +1 -0
  93. package/dist/agent-runners/scratchpad-afs.d.mts +103 -0
  94. package/dist/agent-runners/scratchpad-afs.d.mts.map +1 -0
  95. package/dist/agent-runners/scratchpad-afs.mjs +271 -0
  96. package/dist/agent-runners/scratchpad-afs.mjs.map +1 -0
  97. package/dist/agent-runners/stream-router.cjs +72 -0
  98. package/dist/agent-runners/stream-router.d.cts +22 -0
  99. package/dist/agent-runners/stream-router.d.cts.map +1 -0
  100. package/dist/agent-runners/stream-router.d.mts +22 -0
  101. package/dist/agent-runners/stream-router.d.mts.map +1 -0
  102. package/dist/agent-runners/stream-router.mjs +72 -0
  103. package/dist/agent-runners/stream-router.mjs.map +1 -0
  104. package/dist/agent-runners/system-prompt.cjs +35 -0
  105. package/dist/agent-runners/system-prompt.d.cts +17 -0
  106. package/dist/agent-runners/system-prompt.d.cts.map +1 -0
  107. package/dist/agent-runners/system-prompt.d.mts +17 -0
  108. package/dist/agent-runners/system-prompt.d.mts.map +1 -0
  109. package/dist/agent-runners/system-prompt.mjs +34 -0
  110. package/dist/agent-runners/system-prompt.mjs.map +1 -0
  111. package/dist/agent-runners/team-modes/aggregates.cjs +36 -0
  112. package/dist/agent-runners/team-modes/aggregates.mjs +35 -0
  113. package/dist/agent-runners/team-modes/aggregates.mjs.map +1 -0
  114. package/dist/agent-runners/team-modes/iterate.cjs +46 -0
  115. package/dist/agent-runners/team-modes/iterate.mjs +47 -0
  116. package/dist/agent-runners/team-modes/iterate.mjs.map +1 -0
  117. package/dist/agent-runners/team-modes/parallel.cjs +59 -0
  118. package/dist/agent-runners/team-modes/parallel.mjs +60 -0
  119. package/dist/agent-runners/team-modes/parallel.mjs.map +1 -0
  120. package/dist/agent-runners/team-modes/reflection.cjs +155 -0
  121. package/dist/agent-runners/team-modes/reflection.mjs +156 -0
  122. package/dist/agent-runners/team-modes/reflection.mjs.map +1 -0
  123. package/dist/agent-runners/team-modes/sequential.cjs +63 -0
  124. package/dist/agent-runners/team-modes/sequential.mjs +64 -0
  125. package/dist/agent-runners/team-modes/sequential.mjs.map +1 -0
  126. package/dist/agent-runners/team-modes/utils.cjs +39 -0
  127. package/dist/agent-runners/team-modes/utils.mjs +36 -0
  128. package/dist/agent-runners/team-modes/utils.mjs.map +1 -0
  129. package/dist/agent-runners/team-runner.cjs +277 -0
  130. package/dist/agent-runners/team-runner.d.cts +34 -0
  131. package/dist/agent-runners/team-runner.d.cts.map +1 -0
  132. package/dist/agent-runners/team-runner.d.mts +34 -0
  133. package/dist/agent-runners/team-runner.d.mts.map +1 -0
  134. package/dist/agent-runners/team-runner.mjs +278 -0
  135. package/dist/agent-runners/team-runner.mjs.map +1 -0
  136. package/dist/agent-runners/template-context.cjs +32 -0
  137. package/dist/agent-runners/template-context.d.cts +43 -0
  138. package/dist/agent-runners/template-context.d.cts.map +1 -0
  139. package/dist/agent-runners/template-context.d.mts +43 -0
  140. package/dist/agent-runners/template-context.d.mts.map +1 -0
  141. package/dist/agent-runners/template-context.mjs +33 -0
  142. package/dist/agent-runners/template-context.mjs.map +1 -0
  143. package/dist/index.cjs +123 -0
  144. package/dist/index.d.cts +29 -0
  145. package/dist/index.d.mts +29 -0
  146. package/dist/index.mjs +29 -0
  147. package/dist/program/agent-action.cjs +496 -0
  148. package/dist/program/agent-action.d.cts +42 -0
  149. package/dist/program/agent-action.d.cts.map +1 -0
  150. package/dist/program/agent-action.d.mts +42 -0
  151. package/dist/program/agent-action.d.mts.map +1 -0
  152. package/dist/program/agent-action.mjs +497 -0
  153. package/dist/program/agent-action.mjs.map +1 -0
  154. package/dist/program/agent-messages-tools.cjs +137 -0
  155. package/dist/program/agent-messages-tools.d.cts +59 -0
  156. package/dist/program/agent-messages-tools.d.cts.map +1 -0
  157. package/dist/program/agent-messages-tools.d.mts +59 -0
  158. package/dist/program/agent-messages-tools.d.mts.map +1 -0
  159. package/dist/program/agent-messages-tools.mjs +130 -0
  160. package/dist/program/agent-messages-tools.mjs.map +1 -0
  161. package/dist/program/agent-runner-registry.cjs +314 -0
  162. package/dist/program/agent-runner-registry.d.cts +52 -0
  163. package/dist/program/agent-runner-registry.d.cts.map +1 -0
  164. package/dist/program/agent-runner-registry.d.mts +52 -0
  165. package/dist/program/agent-runner-registry.d.mts.map +1 -0
  166. package/dist/program/agent-runner-registry.mjs +313 -0
  167. package/dist/program/agent-runner-registry.mjs.map +1 -0
  168. package/dist/program/agent-subscribe.cjs +72 -0
  169. package/dist/program/agent-subscribe.d.cts +18 -0
  170. package/dist/program/agent-subscribe.d.cts.map +1 -0
  171. package/dist/program/agent-subscribe.d.mts +18 -0
  172. package/dist/program/agent-subscribe.d.mts.map +1 -0
  173. package/dist/program/agent-subscribe.mjs +73 -0
  174. package/dist/program/agent-subscribe.mjs.map +1 -0
  175. package/dist/program/agent-tools.cjs +135 -0
  176. package/dist/program/agent-tools.d.cts +35 -0
  177. package/dist/program/agent-tools.d.cts.map +1 -0
  178. package/dist/program/agent-tools.d.mts +35 -0
  179. package/dist/program/agent-tools.d.mts.map +1 -0
  180. package/dist/program/agent-tools.mjs +136 -0
  181. package/dist/program/agent-tools.mjs.map +1 -0
  182. package/dist/program/manifest-nesting.cjs +57 -0
  183. package/dist/program/manifest-nesting.d.cts +13 -0
  184. package/dist/program/manifest-nesting.d.cts.map +1 -0
  185. package/dist/program/manifest-nesting.d.mts +13 -0
  186. package/dist/program/manifest-nesting.d.mts.map +1 -0
  187. package/dist/program/manifest-nesting.mjs +57 -0
  188. package/dist/program/manifest-nesting.mjs.map +1 -0
  189. package/dist/program/result-contract.cjs +55 -0
  190. package/dist/program/result-contract.d.cts +23 -0
  191. package/dist/program/result-contract.d.cts.map +1 -0
  192. package/dist/program/result-contract.d.mts +23 -0
  193. package/dist/program/result-contract.d.mts.map +1 -0
  194. package/dist/program/result-contract.mjs +51 -0
  195. package/dist/program/result-contract.mjs.map +1 -0
  196. package/dist/program/runner-error.cjs +71 -0
  197. package/dist/program/runner-error.d.cts +25 -0
  198. package/dist/program/runner-error.d.cts.map +1 -0
  199. package/dist/program/runner-error.d.mts +25 -0
  200. package/dist/program/runner-error.d.mts.map +1 -0
  201. package/dist/program/runner-error.mjs +72 -0
  202. package/dist/program/runner-error.mjs.map +1 -0
  203. package/dist/program/scoped-afs.cjs +538 -0
  204. package/dist/program/scoped-afs.d.cts +245 -0
  205. package/dist/program/scoped-afs.d.cts.map +1 -0
  206. package/dist/program/scoped-afs.d.mts +245 -0
  207. package/dist/program/scoped-afs.d.mts.map +1 -0
  208. package/dist/program/scoped-afs.mjs +531 -0
  209. package/dist/program/scoped-afs.mjs.map +1 -0
  210. package/dist/program/session-hierarchy.cjs +1 -0
  211. package/dist/program/session-hierarchy.d.cts +2 -0
  212. package/dist/program/session-hierarchy.d.mts +2 -0
  213. package/dist/program/session-hierarchy.mjs +3 -0
  214. package/dist/program/tool-discovery/ash-frontmatter.cjs +83 -0
  215. package/dist/program/tool-discovery/ash-frontmatter.d.cts +21 -0
  216. package/dist/program/tool-discovery/ash-frontmatter.d.cts.map +1 -0
  217. package/dist/program/tool-discovery/ash-frontmatter.d.mts +21 -0
  218. package/dist/program/tool-discovery/ash-frontmatter.d.mts.map +1 -0
  219. package/dist/program/tool-discovery/ash-frontmatter.mjs +84 -0
  220. package/dist/program/tool-discovery/ash-frontmatter.mjs.map +1 -0
  221. package/dist/program/tool-discovery/dot-path-resolver.cjs +60 -0
  222. package/dist/program/tool-discovery/dot-path-resolver.mjs +61 -0
  223. package/dist/program/tool-discovery/dot-path-resolver.mjs.map +1 -0
  224. package/dist/program/tool-discovery/skill-gate.cjs +36 -0
  225. package/dist/program/tool-discovery/skill-gate.d.cts +10 -0
  226. package/dist/program/tool-discovery/skill-gate.d.cts.map +1 -0
  227. package/dist/program/tool-discovery/skill-gate.d.mts +10 -0
  228. package/dist/program/tool-discovery/skill-gate.d.mts.map +1 -0
  229. package/dist/program/tool-discovery/skill-gate.mjs +35 -0
  230. package/dist/program/tool-discovery/skill-gate.mjs.map +1 -0
  231. package/dist/providers/basic/ash/dist/index.cjs +1809 -0
  232. package/dist/providers/basic/ash/dist/index.mjs +1807 -0
  233. package/dist/providers/basic/ash/dist/index.mjs.map +1 -0
  234. package/package.json +67 -0
@@ -0,0 +1,137 @@
1
+ let ufo = require("ufo");
2
+ let _aigne_afs = require("@aigne/afs");
3
+ let _aigne_uuid = require("@aigne/uuid");
4
+
5
+ //#region src/program/agent-messages-tools.ts
6
+ /** Host-owned runtime messaging namespace. */
7
+ const MESSAGING_ROOT = "/proc/messaging";
8
+ /** Tool catalog mount path surfaced to agent runners. */
9
+ const MESSAGING_TOOLS_ROOT = `${MESSAGING_ROOT}/tools`;
10
+ /** Tool glob injected into agent scopes. */
11
+ const MESSAGING_TOOLS_GLOB = `${MESSAGING_TOOLS_ROOT}/*`;
12
+ /** Durable mailbox storage keyed by logical agent/blocklet id. */
13
+ const MESSAGING_AGENTS_ROOT = `${MESSAGING_ROOT}/agents`;
14
+ /** @deprecated use `MESSAGING_AGENTS_ROOT`. */
15
+ const AGENTS_ROOT = MESSAGING_AGENTS_ROOT;
16
+ const MAX_BODY_BYTES = 64 * 1024;
17
+ function getMessagingToolDefinitions() {
18
+ return [{
19
+ type: "function",
20
+ function: {
21
+ name: "agent_post_message",
22
+ description: "Send an async message to another agent. Writes one JSON file per message to /proc/messaging/agents/<to>/msg/ via AFS; the recipient receives an afs:write event and wakes up without polling.",
23
+ parameters: {
24
+ type: "object",
25
+ properties: {
26
+ to: {
27
+ type: "string",
28
+ description: "Recipient agent blocklet ID"
29
+ },
30
+ body: { description: "Message body (string or JSON, max 64KB serialized)" },
31
+ kind: {
32
+ type: "string",
33
+ description: "Message kind (default: \"message\")"
34
+ }
35
+ },
36
+ required: ["to", "body"]
37
+ }
38
+ }
39
+ }, {
40
+ type: "function",
41
+ function: {
42
+ name: "agent_read_messages",
43
+ description: "Read messages from this agent's own /proc/messaging/agents/<self>/msg/ directory. Returns every message file parsed.",
44
+ parameters: {
45
+ type: "object",
46
+ properties: {},
47
+ required: []
48
+ }
49
+ }
50
+ }];
51
+ }
52
+ function invalidRecipient(to) {
53
+ if (typeof to !== "string" || to.length === 0) return "recipient must be a non-empty string";
54
+ if (to.includes("..") || to.includes("/") || to.includes("\\")) return "recipient must not contain path separators";
55
+ if (to.includes("\0")) return "recipient must not contain null bytes";
56
+ return null;
57
+ }
58
+ /** AFS directory that holds one agent's inbound messages. */
59
+ function agentMsgDir(blockletId) {
60
+ return (0, ufo.joinURL)(MESSAGING_AGENTS_ROOT, blockletId, "msg");
61
+ }
62
+ async function handlePostMessage(ctx, args) {
63
+ const invalid = invalidRecipient(args.to);
64
+ if (invalid) return {
65
+ ok: false,
66
+ delivery: "failed",
67
+ error: {
68
+ code: "RECIPIENT_UNKNOWN",
69
+ message: invalid
70
+ }
71
+ };
72
+ if ((typeof args.body === "string" ? args.body : JSON.stringify(args.body)).length > MAX_BODY_BYTES) return {
73
+ ok: false,
74
+ delivery: "failed",
75
+ error: {
76
+ code: "PAYLOAD_TOO_LARGE",
77
+ message: "Message body exceeds 64KB limit"
78
+ }
79
+ };
80
+ if (!ctx.afs.write) return {
81
+ ok: false,
82
+ delivery: "failed",
83
+ error: {
84
+ code: "NO_WRITE",
85
+ message: "Host AFS does not expose a write method"
86
+ }
87
+ };
88
+ const messageId = (0, _aigne_uuid.v7)();
89
+ const entry = {
90
+ message_id: messageId,
91
+ from: ctx.blockletId,
92
+ to: args.to,
93
+ kind: args.kind ?? "message",
94
+ ts: (/* @__PURE__ */ new Date()).toISOString(),
95
+ body: args.body
96
+ };
97
+ const path = (0, ufo.joinURL)(agentMsgDir(args.to), `${messageId}.json`);
98
+ await ctx.afs.write(path, { content: JSON.stringify(entry) });
99
+ return {
100
+ ok: true,
101
+ delivery: "async",
102
+ message_id: messageId
103
+ };
104
+ }
105
+ async function handleReadMessages(ctx, _args) {
106
+ if (!ctx.afs.list || !ctx.afs.read) return [];
107
+ const dir = agentMsgDir(ctx.blockletId);
108
+ let listing;
109
+ try {
110
+ listing = await ctx.afs.list(dir);
111
+ } catch (err) {
112
+ if (err instanceof _aigne_afs.AFSNotFoundError) return [];
113
+ const message = err instanceof Error ? err.message : String(err);
114
+ if (/not found/i.test(message)) return [];
115
+ throw err;
116
+ }
117
+ const messages = [];
118
+ for (const entry of listing.data) {
119
+ const raw = (await ctx.afs.read(entry.path))?.data?.content;
120
+ if (raw == null) continue;
121
+ try {
122
+ messages.push(JSON.parse(String(raw)));
123
+ } catch {}
124
+ }
125
+ return messages;
126
+ }
127
+
128
+ //#endregion
129
+ exports.AGENTS_ROOT = AGENTS_ROOT;
130
+ exports.MESSAGING_AGENTS_ROOT = MESSAGING_AGENTS_ROOT;
131
+ exports.MESSAGING_ROOT = MESSAGING_ROOT;
132
+ exports.MESSAGING_TOOLS_GLOB = MESSAGING_TOOLS_GLOB;
133
+ exports.MESSAGING_TOOLS_ROOT = MESSAGING_TOOLS_ROOT;
134
+ exports.agentMsgDir = agentMsgDir;
135
+ exports.getMessagingToolDefinitions = getMessagingToolDefinitions;
136
+ exports.handlePostMessage = handlePostMessage;
137
+ exports.handleReadMessages = handleReadMessages;
@@ -0,0 +1,59 @@
1
+ import { AFSRoot } from "@aigne/afs";
2
+
3
+ //#region src/program/agent-messages-tools.d.ts
4
+ /** Host-owned runtime messaging namespace. */
5
+ declare const MESSAGING_ROOT = "/proc/messaging";
6
+ /** Tool catalog mount path surfaced to agent runners. */
7
+ declare const MESSAGING_TOOLS_ROOT = "/proc/messaging/tools";
8
+ /** Tool glob injected into agent scopes. */
9
+ declare const MESSAGING_TOOLS_GLOB = "/proc/messaging/tools/*";
10
+ /** Durable mailbox storage keyed by logical agent/blocklet id. */
11
+ declare const MESSAGING_AGENTS_ROOT = "/proc/messaging/agents";
12
+ /** @deprecated use `MESSAGING_AGENTS_ROOT`. */
13
+ declare const AGENTS_ROOT = "/proc/messaging/agents";
14
+ interface MessagingContext {
15
+ /** Host AFS instance with write/list/read support. */
16
+ afs: AFSRoot;
17
+ /** Caller identity — becomes `from` on outbound messages and the recipient key for inbound reads. */
18
+ blockletId: string;
19
+ }
20
+ interface AgentMessage {
21
+ message_id: string;
22
+ from: string;
23
+ to: string;
24
+ kind: string;
25
+ ts: string;
26
+ body: unknown;
27
+ }
28
+ interface ToolDefinition {
29
+ type: "function";
30
+ function: {
31
+ name: string;
32
+ description: string;
33
+ parameters: {
34
+ type: "object";
35
+ properties: Record<string, Record<string, unknown>>;
36
+ required: string[];
37
+ };
38
+ };
39
+ }
40
+ declare function getMessagingToolDefinitions(): ToolDefinition[];
41
+ /** AFS directory that holds one agent's inbound messages. */
42
+ declare function agentMsgDir(blockletId: string): string;
43
+ declare function handlePostMessage(ctx: MessagingContext, args: {
44
+ to: string;
45
+ body: unknown;
46
+ kind?: string;
47
+ }): Promise<{
48
+ ok: boolean;
49
+ delivery: string;
50
+ message_id?: string;
51
+ error?: {
52
+ code: string;
53
+ message: string;
54
+ };
55
+ }>;
56
+ declare function handleReadMessages(ctx: MessagingContext, _args: Record<string, never>): Promise<AgentMessage[]>;
57
+ //#endregion
58
+ export { AGENTS_ROOT, AgentMessage, MESSAGING_AGENTS_ROOT, MESSAGING_ROOT, MESSAGING_TOOLS_GLOB, MESSAGING_TOOLS_ROOT, MessagingContext, ToolDefinition, agentMsgDir, getMessagingToolDefinitions, handlePostMessage, handleReadMessages };
59
+ //# sourceMappingURL=agent-messages-tools.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messages-tools.d.cts","names":[],"sources":["../../src/program/agent-messages-tools.ts"],"mappings":";;;AA8BA;AAAA,cANa,cAAA;;cAEA,oBAAA;;cAEA,oBAAA;;cAEA,qBAAA;;cAEA,WAAA;AAAA,UAEI,gBAAA;EAAgB;EAE/B,GAAA,EAAK,OAAA;EAAO;EAEZ,UAAA;AAAA;AAAA,UAGe,YAAA;EACf,UAAA;EACA,IAAA;EACA,EAAA;EACA,IAAA;EACA,EAAA;EACA,IAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA;EACA,QAAA;IACE,IAAA;IACA,WAAA;IACA,UAAA;MACE,IAAA;MACA,UAAA,EAAY,MAAA,SAAe,MAAA;MAC3B,QAAA;IAAA;EAAA;AAAA;AAAA,iBAOU,2BAAA,CAAA,GAA+B,cAAA;;iBA+C/B,WAAA,CAAY,UAAA;AAAA,iBAIN,iBAAA,CACpB,GAAA,EAAK,gBAAA,EACL,IAAA;EAAQ,EAAA;EAAY,IAAA;EAAe,IAAA;AAAA,IAClC,OAAA;EACD,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;IAAU,IAAA;IAAc,OAAA;EAAA;AAAA;AAAA,iBA2CJ,kBAAA,CACpB,GAAA,EAAK,gBAAA,EACL,KAAA,EAAO,MAAA,kBACN,OAAA,CAAQ,YAAA"}
@@ -0,0 +1,59 @@
1
+ import { AFSRoot } from "@aigne/afs";
2
+
3
+ //#region src/program/agent-messages-tools.d.ts
4
+ /** Host-owned runtime messaging namespace. */
5
+ declare const MESSAGING_ROOT = "/proc/messaging";
6
+ /** Tool catalog mount path surfaced to agent runners. */
7
+ declare const MESSAGING_TOOLS_ROOT = "/proc/messaging/tools";
8
+ /** Tool glob injected into agent scopes. */
9
+ declare const MESSAGING_TOOLS_GLOB = "/proc/messaging/tools/*";
10
+ /** Durable mailbox storage keyed by logical agent/blocklet id. */
11
+ declare const MESSAGING_AGENTS_ROOT = "/proc/messaging/agents";
12
+ /** @deprecated use `MESSAGING_AGENTS_ROOT`. */
13
+ declare const AGENTS_ROOT = "/proc/messaging/agents";
14
+ interface MessagingContext {
15
+ /** Host AFS instance with write/list/read support. */
16
+ afs: AFSRoot;
17
+ /** Caller identity — becomes `from` on outbound messages and the recipient key for inbound reads. */
18
+ blockletId: string;
19
+ }
20
+ interface AgentMessage {
21
+ message_id: string;
22
+ from: string;
23
+ to: string;
24
+ kind: string;
25
+ ts: string;
26
+ body: unknown;
27
+ }
28
+ interface ToolDefinition {
29
+ type: "function";
30
+ function: {
31
+ name: string;
32
+ description: string;
33
+ parameters: {
34
+ type: "object";
35
+ properties: Record<string, Record<string, unknown>>;
36
+ required: string[];
37
+ };
38
+ };
39
+ }
40
+ declare function getMessagingToolDefinitions(): ToolDefinition[];
41
+ /** AFS directory that holds one agent's inbound messages. */
42
+ declare function agentMsgDir(blockletId: string): string;
43
+ declare function handlePostMessage(ctx: MessagingContext, args: {
44
+ to: string;
45
+ body: unknown;
46
+ kind?: string;
47
+ }): Promise<{
48
+ ok: boolean;
49
+ delivery: string;
50
+ message_id?: string;
51
+ error?: {
52
+ code: string;
53
+ message: string;
54
+ };
55
+ }>;
56
+ declare function handleReadMessages(ctx: MessagingContext, _args: Record<string, never>): Promise<AgentMessage[]>;
57
+ //#endregion
58
+ export { AGENTS_ROOT, AgentMessage, MESSAGING_AGENTS_ROOT, MESSAGING_ROOT, MESSAGING_TOOLS_GLOB, MESSAGING_TOOLS_ROOT, MessagingContext, ToolDefinition, agentMsgDir, getMessagingToolDefinitions, handlePostMessage, handleReadMessages };
59
+ //# sourceMappingURL=agent-messages-tools.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messages-tools.d.mts","names":[],"sources":["../../src/program/agent-messages-tools.ts"],"mappings":";;;AA8BA;AAAA,cANa,cAAA;;cAEA,oBAAA;;cAEA,oBAAA;;cAEA,qBAAA;;cAEA,WAAA;AAAA,UAEI,gBAAA;EAAgB;EAE/B,GAAA,EAAK,OAAA;EAAO;EAEZ,UAAA;AAAA;AAAA,UAGe,YAAA;EACf,UAAA;EACA,IAAA;EACA,EAAA;EACA,IAAA;EACA,EAAA;EACA,IAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA;EACA,QAAA;IACE,IAAA;IACA,WAAA;IACA,UAAA;MACE,IAAA;MACA,UAAA,EAAY,MAAA,SAAe,MAAA;MAC3B,QAAA;IAAA;EAAA;AAAA;AAAA,iBAOU,2BAAA,CAAA,GAA+B,cAAA;;iBA+C/B,WAAA,CAAY,UAAA;AAAA,iBAIN,iBAAA,CACpB,GAAA,EAAK,gBAAA,EACL,IAAA;EAAQ,EAAA;EAAY,IAAA;EAAe,IAAA;AAAA,IAClC,OAAA;EACD,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;IAAU,IAAA;IAAc,OAAA;EAAA;AAAA;AAAA,iBA2CJ,kBAAA,CACpB,GAAA,EAAK,gBAAA,EACL,KAAA,EAAO,MAAA,kBACN,OAAA,CAAQ,YAAA"}
@@ -0,0 +1,130 @@
1
+ import { joinURL } from "ufo";
2
+ import { AFSNotFoundError } from "@aigne/afs";
3
+ import { v7 } from "@aigne/uuid";
4
+
5
+ //#region src/program/agent-messages-tools.ts
6
+ /** Host-owned runtime messaging namespace. */
7
+ const MESSAGING_ROOT = "/proc/messaging";
8
+ /** Tool catalog mount path surfaced to agent runners. */
9
+ const MESSAGING_TOOLS_ROOT = `${MESSAGING_ROOT}/tools`;
10
+ /** Tool glob injected into agent scopes. */
11
+ const MESSAGING_TOOLS_GLOB = `${MESSAGING_TOOLS_ROOT}/*`;
12
+ /** Durable mailbox storage keyed by logical agent/blocklet id. */
13
+ const MESSAGING_AGENTS_ROOT = `${MESSAGING_ROOT}/agents`;
14
+ /** @deprecated use `MESSAGING_AGENTS_ROOT`. */
15
+ const AGENTS_ROOT = MESSAGING_AGENTS_ROOT;
16
+ const MAX_BODY_BYTES = 64 * 1024;
17
+ function getMessagingToolDefinitions() {
18
+ return [{
19
+ type: "function",
20
+ function: {
21
+ name: "agent_post_message",
22
+ description: "Send an async message to another agent. Writes one JSON file per message to /proc/messaging/agents/<to>/msg/ via AFS; the recipient receives an afs:write event and wakes up without polling.",
23
+ parameters: {
24
+ type: "object",
25
+ properties: {
26
+ to: {
27
+ type: "string",
28
+ description: "Recipient agent blocklet ID"
29
+ },
30
+ body: { description: "Message body (string or JSON, max 64KB serialized)" },
31
+ kind: {
32
+ type: "string",
33
+ description: "Message kind (default: \"message\")"
34
+ }
35
+ },
36
+ required: ["to", "body"]
37
+ }
38
+ }
39
+ }, {
40
+ type: "function",
41
+ function: {
42
+ name: "agent_read_messages",
43
+ description: "Read messages from this agent's own /proc/messaging/agents/<self>/msg/ directory. Returns every message file parsed.",
44
+ parameters: {
45
+ type: "object",
46
+ properties: {},
47
+ required: []
48
+ }
49
+ }
50
+ }];
51
+ }
52
+ function invalidRecipient(to) {
53
+ if (typeof to !== "string" || to.length === 0) return "recipient must be a non-empty string";
54
+ if (to.includes("..") || to.includes("/") || to.includes("\\")) return "recipient must not contain path separators";
55
+ if (to.includes("\0")) return "recipient must not contain null bytes";
56
+ return null;
57
+ }
58
+ /** AFS directory that holds one agent's inbound messages. */
59
+ function agentMsgDir(blockletId) {
60
+ return joinURL(MESSAGING_AGENTS_ROOT, blockletId, "msg");
61
+ }
62
+ async function handlePostMessage(ctx, args) {
63
+ const invalid = invalidRecipient(args.to);
64
+ if (invalid) return {
65
+ ok: false,
66
+ delivery: "failed",
67
+ error: {
68
+ code: "RECIPIENT_UNKNOWN",
69
+ message: invalid
70
+ }
71
+ };
72
+ if ((typeof args.body === "string" ? args.body : JSON.stringify(args.body)).length > MAX_BODY_BYTES) return {
73
+ ok: false,
74
+ delivery: "failed",
75
+ error: {
76
+ code: "PAYLOAD_TOO_LARGE",
77
+ message: "Message body exceeds 64KB limit"
78
+ }
79
+ };
80
+ if (!ctx.afs.write) return {
81
+ ok: false,
82
+ delivery: "failed",
83
+ error: {
84
+ code: "NO_WRITE",
85
+ message: "Host AFS does not expose a write method"
86
+ }
87
+ };
88
+ const messageId = v7();
89
+ const entry = {
90
+ message_id: messageId,
91
+ from: ctx.blockletId,
92
+ to: args.to,
93
+ kind: args.kind ?? "message",
94
+ ts: (/* @__PURE__ */ new Date()).toISOString(),
95
+ body: args.body
96
+ };
97
+ const path = joinURL(agentMsgDir(args.to), `${messageId}.json`);
98
+ await ctx.afs.write(path, { content: JSON.stringify(entry) });
99
+ return {
100
+ ok: true,
101
+ delivery: "async",
102
+ message_id: messageId
103
+ };
104
+ }
105
+ async function handleReadMessages(ctx, _args) {
106
+ if (!ctx.afs.list || !ctx.afs.read) return [];
107
+ const dir = agentMsgDir(ctx.blockletId);
108
+ let listing;
109
+ try {
110
+ listing = await ctx.afs.list(dir);
111
+ } catch (err) {
112
+ if (err instanceof AFSNotFoundError) return [];
113
+ const message = err instanceof Error ? err.message : String(err);
114
+ if (/not found/i.test(message)) return [];
115
+ throw err;
116
+ }
117
+ const messages = [];
118
+ for (const entry of listing.data) {
119
+ const raw = (await ctx.afs.read(entry.path))?.data?.content;
120
+ if (raw == null) continue;
121
+ try {
122
+ messages.push(JSON.parse(String(raw)));
123
+ } catch {}
124
+ }
125
+ return messages;
126
+ }
127
+
128
+ //#endregion
129
+ export { AGENTS_ROOT, MESSAGING_AGENTS_ROOT, MESSAGING_ROOT, MESSAGING_TOOLS_GLOB, MESSAGING_TOOLS_ROOT, agentMsgDir, getMessagingToolDefinitions, handlePostMessage, handleReadMessages };
130
+ //# sourceMappingURL=agent-messages-tools.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-messages-tools.mjs","names":[],"sources":["../../src/program/agent-messages-tools.ts"],"sourcesContent":["/**\n * Built-in messaging tools for inter-agent communication (S14, rewritten on AFS).\n *\n * Each post is a single JSON file under\n * `/proc/messaging/agents/<to>/msg/<uuid>.json` written\n * through `afs.write`. The write automatically dispatches an `afs:write` event\n * through the AFS EventBus (see packages/core/src/afs.ts:notifyChange), so a\n * receiver can subscribe with\n * `{ type: \"afs:write\", path: \"/proc/messaging/agents/<self>/msg\" }`\n * and wake up on every new message without polling. Reading messages is\n * `afs.list` + `afs.read`; acking is `afs.delete` on the entry path.\n *\n * Path rationale: messaging is host-owned runtime state, not a blocklet root\n * namespace, so it lives under `/proc/messaging`. The transport remains\n * addressed by logical agent/blocklet id for now, which keeps the delivery\n * semantics unchanged while removing the root-level `/agents` leak.\n */\n\nimport type { AFSRoot } from \"@aigne/afs\";\nimport { AFSNotFoundError } from \"@aigne/afs\";\nimport { v7 } from \"@aigne/uuid\";\nimport { joinURL } from \"ufo\";\n\n/** Host-owned runtime messaging namespace. */\nexport const MESSAGING_ROOT = \"/proc/messaging\";\n/** Tool catalog mount path surfaced to agent runners. */\nexport const MESSAGING_TOOLS_ROOT = `${MESSAGING_ROOT}/tools`;\n/** Tool glob injected into agent scopes. */\nexport const MESSAGING_TOOLS_GLOB = `${MESSAGING_TOOLS_ROOT}/*`;\n/** Durable mailbox storage keyed by logical agent/blocklet id. */\nexport const MESSAGING_AGENTS_ROOT = `${MESSAGING_ROOT}/agents`;\n/** @deprecated use `MESSAGING_AGENTS_ROOT`. */\nexport const AGENTS_ROOT = MESSAGING_AGENTS_ROOT;\n\nexport interface MessagingContext {\n /** Host AFS instance with write/list/read support. */\n afs: AFSRoot;\n /** Caller identity — becomes `from` on outbound messages and the recipient key for inbound reads. */\n blockletId: string;\n}\n\nexport interface AgentMessage {\n message_id: string;\n from: string;\n to: string;\n kind: string;\n ts: string;\n body: unknown;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, Record<string, unknown>>;\n required: string[];\n };\n };\n}\n\nconst MAX_BODY_BYTES = 64 * 1024;\n\nexport function getMessagingToolDefinitions(): ToolDefinition[] {\n return [\n {\n type: \"function\",\n function: {\n name: \"agent_post_message\",\n description:\n \"Send an async message to another agent. Writes one JSON file per message to /proc/messaging/agents/<to>/msg/ via AFS; the recipient receives an afs:write event and wakes up without polling.\",\n parameters: {\n type: \"object\",\n properties: {\n to: { type: \"string\", description: \"Recipient agent blocklet ID\" },\n body: { description: \"Message body (string or JSON, max 64KB serialized)\" },\n kind: {\n type: \"string\",\n description: 'Message kind (default: \"message\")',\n },\n },\n required: [\"to\", \"body\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"agent_read_messages\",\n description:\n \"Read messages from this agent's own /proc/messaging/agents/<self>/msg/ directory. Returns every message file parsed.\",\n parameters: {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n },\n ];\n}\n\nfunction invalidRecipient(to: unknown): string | null {\n if (typeof to !== \"string\" || to.length === 0) return \"recipient must be a non-empty string\";\n if (to.includes(\"..\") || to.includes(\"/\") || to.includes(\"\\\\\"))\n return \"recipient must not contain path separators\";\n if (to.includes(\"\\0\")) return \"recipient must not contain null bytes\";\n return null;\n}\n\n/** AFS directory that holds one agent's inbound messages. */\nexport function agentMsgDir(blockletId: string): string {\n return joinURL(MESSAGING_AGENTS_ROOT, blockletId, \"msg\");\n}\n\nexport async function handlePostMessage(\n ctx: MessagingContext,\n args: { to: string; body: unknown; kind?: string },\n): Promise<{\n ok: boolean;\n delivery: string;\n message_id?: string;\n error?: { code: string; message: string };\n}> {\n const invalid = invalidRecipient(args.to);\n if (invalid) {\n return {\n ok: false,\n delivery: \"failed\",\n error: { code: \"RECIPIENT_UNKNOWN\", message: invalid },\n };\n }\n\n const bodyStr = typeof args.body === \"string\" ? args.body : JSON.stringify(args.body);\n if (bodyStr.length > MAX_BODY_BYTES) {\n return {\n ok: false,\n delivery: \"failed\",\n error: { code: \"PAYLOAD_TOO_LARGE\", message: \"Message body exceeds 64KB limit\" },\n };\n }\n\n if (!ctx.afs.write) {\n return {\n ok: false,\n delivery: \"failed\",\n error: { code: \"NO_WRITE\", message: \"Host AFS does not expose a write method\" },\n };\n }\n\n const messageId = v7();\n const entry: AgentMessage = {\n message_id: messageId,\n from: ctx.blockletId,\n to: args.to,\n kind: args.kind ?? \"message\",\n ts: new Date().toISOString(),\n body: args.body,\n };\n const path = joinURL(agentMsgDir(args.to), `${messageId}.json`);\n await ctx.afs.write(path, { content: JSON.stringify(entry) });\n\n return { ok: true, delivery: \"async\", message_id: messageId };\n}\n\nexport async function handleReadMessages(\n ctx: MessagingContext,\n _args: Record<string, never>,\n): Promise<AgentMessage[]> {\n if (!ctx.afs.list || !ctx.afs.read) return [];\n\n const dir = agentMsgDir(ctx.blockletId);\n let listing: Awaited<ReturnType<AFSRoot[\"list\"] & {}>>;\n try {\n listing = await ctx.afs.list(dir);\n } catch (err) {\n // An unwritten-to msg dir is \"empty\", not an error. `afs.list` wraps the\n // underlying provider's AFSNotFoundError in a generic Error whose message\n // still contains the original \"Path not found\" fragment (see afs.ts's\n // _list wrapper). Match both shapes so callers don't have to pre-stat.\n if (err instanceof AFSNotFoundError) return [];\n const message = err instanceof Error ? err.message : String(err);\n if (/not found/i.test(message)) return [];\n throw err;\n }\n\n const messages: AgentMessage[] = [];\n for (const entry of listing.data) {\n const read = await ctx.afs.read(entry.path);\n const raw = read?.data?.content;\n if (raw == null) continue;\n try {\n messages.push(JSON.parse(String(raw)) as AgentMessage);\n } catch {\n // skip unreadable entries — a malformed file must not block the rest\n }\n }\n return messages;\n}\n"],"mappings":"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"}