@bryti/agent 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/Dockerfile +27 -0
  2. package/README.md +77 -50
  3. package/config.example.yml +265 -0
  4. package/dist/active-hours.d.ts +23 -0
  5. package/dist/active-hours.d.ts.map +1 -0
  6. package/dist/active-hours.js +68 -0
  7. package/dist/active-hours.js.map +1 -0
  8. package/dist/agent.d.ts +84 -0
  9. package/dist/agent.d.ts.map +1 -0
  10. package/dist/agent.js +383 -0
  11. package/dist/agent.js.map +1 -0
  12. package/dist/channels/markdown/ir.d.ts +79 -0
  13. package/dist/channels/markdown/ir.d.ts.map +1 -0
  14. package/dist/channels/markdown/ir.js +824 -0
  15. package/dist/channels/markdown/ir.js.map +1 -0
  16. package/dist/channels/markdown/render.d.ts +35 -0
  17. package/dist/channels/markdown/render.d.ts.map +1 -0
  18. package/dist/channels/markdown/render.js +178 -0
  19. package/dist/channels/markdown/render.js.map +1 -0
  20. package/dist/channels/telegram-network-errors.d.ts +27 -0
  21. package/dist/channels/telegram-network-errors.d.ts.map +1 -0
  22. package/dist/channels/telegram-network-errors.js +156 -0
  23. package/dist/channels/telegram-network-errors.js.map +1 -0
  24. package/dist/channels/telegram.d.ts +76 -0
  25. package/dist/channels/telegram.d.ts.map +1 -0
  26. package/dist/channels/telegram.js +814 -0
  27. package/dist/channels/telegram.js.map +1 -0
  28. package/dist/channels/types.d.ts +59 -0
  29. package/dist/channels/types.d.ts.map +1 -0
  30. package/dist/channels/types.js +9 -0
  31. package/dist/channels/types.js.map +1 -0
  32. package/dist/channels/whatsapp.d.ts +45 -0
  33. package/dist/channels/whatsapp.d.ts.map +1 -0
  34. package/dist/channels/whatsapp.js +310 -0
  35. package/dist/channels/whatsapp.js.map +1 -0
  36. package/dist/cli.d.ts +13 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +635 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/commands.d.ts +35 -0
  41. package/dist/commands.d.ts.map +1 -0
  42. package/dist/commands.js +113 -0
  43. package/dist/commands.js.map +1 -0
  44. package/dist/compaction/history.d.ts +17 -0
  45. package/dist/compaction/history.d.ts.map +1 -0
  46. package/dist/compaction/history.js +35 -0
  47. package/dist/compaction/history.js.map +1 -0
  48. package/dist/compaction/index.d.ts +3 -0
  49. package/dist/compaction/index.d.ts.map +1 -0
  50. package/dist/compaction/index.js +3 -0
  51. package/dist/compaction/index.js.map +1 -0
  52. package/dist/compaction/proactive.d.ts +25 -0
  53. package/dist/compaction/proactive.d.ts.map +1 -0
  54. package/dist/compaction/proactive.js +87 -0
  55. package/dist/compaction/proactive.js.map +1 -0
  56. package/dist/compaction/transcript-repair.d.ts +55 -0
  57. package/dist/compaction/transcript-repair.d.ts.map +1 -0
  58. package/dist/compaction/transcript-repair.js +215 -0
  59. package/dist/compaction/transcript-repair.js.map +1 -0
  60. package/dist/config.d.ts +128 -0
  61. package/dist/config.d.ts.map +1 -0
  62. package/dist/config.js +317 -0
  63. package/dist/config.js.map +1 -0
  64. package/dist/crash-recovery.d.ts +23 -0
  65. package/dist/crash-recovery.d.ts.map +1 -0
  66. package/dist/crash-recovery.js +96 -0
  67. package/dist/crash-recovery.js.map +1 -0
  68. package/dist/defaults/extensions/EXTENSIONS.md +158 -0
  69. package/dist/defaults/extensions/documents-hedgedoc.ts +153 -0
  70. package/dist/history.d.ts +31 -0
  71. package/dist/history.d.ts.map +1 -0
  72. package/dist/history.js +49 -0
  73. package/dist/history.js.map +1 -0
  74. package/dist/index.d.ts +19 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +673 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/logger.d.ts +39 -0
  79. package/dist/logger.d.ts.map +1 -0
  80. package/dist/logger.js +143 -0
  81. package/dist/logger.js.map +1 -0
  82. package/dist/memory/conversation-search.d.ts +15 -0
  83. package/dist/memory/conversation-search.d.ts.map +1 -0
  84. package/dist/memory/conversation-search.js +60 -0
  85. package/dist/memory/conversation-search.js.map +1 -0
  86. package/dist/memory/core-memory.d.ts +28 -0
  87. package/dist/memory/core-memory.d.ts.map +1 -0
  88. package/dist/memory/core-memory.js +102 -0
  89. package/dist/memory/core-memory.js.map +1 -0
  90. package/dist/memory/embeddings.d.ts +44 -0
  91. package/dist/memory/embeddings.d.ts.map +1 -0
  92. package/dist/memory/embeddings.js +139 -0
  93. package/dist/memory/embeddings.js.map +1 -0
  94. package/dist/memory/search.d.ts +49 -0
  95. package/dist/memory/search.d.ts.map +1 -0
  96. package/dist/memory/search.js +97 -0
  97. package/dist/memory/search.js.map +1 -0
  98. package/dist/memory/store.d.ts +32 -0
  99. package/dist/memory/store.d.ts.map +1 -0
  100. package/dist/memory/store.js +205 -0
  101. package/dist/memory/store.js.map +1 -0
  102. package/dist/message-queue.d.ts +73 -0
  103. package/dist/message-queue.d.ts.map +1 -0
  104. package/dist/message-queue.js +188 -0
  105. package/dist/message-queue.js.map +1 -0
  106. package/dist/model-infra.d.ts +64 -0
  107. package/dist/model-infra.d.ts.map +1 -0
  108. package/dist/model-infra.js +202 -0
  109. package/dist/model-infra.js.map +1 -0
  110. package/dist/projection/format.d.ts +10 -0
  111. package/dist/projection/format.d.ts.map +1 -0
  112. package/dist/projection/format.js +30 -0
  113. package/dist/projection/format.js.map +1 -0
  114. package/dist/projection/index.d.ts +11 -0
  115. package/dist/projection/index.d.ts.map +1 -0
  116. package/dist/projection/index.js +9 -0
  117. package/dist/projection/index.js.map +1 -0
  118. package/dist/projection/reflection.d.ts +94 -0
  119. package/dist/projection/reflection.d.ts.map +1 -0
  120. package/dist/projection/reflection.js +334 -0
  121. package/dist/projection/reflection.js.map +1 -0
  122. package/dist/projection/store.d.ts +144 -0
  123. package/dist/projection/store.d.ts.map +1 -0
  124. package/dist/projection/store.js +519 -0
  125. package/dist/projection/store.js.map +1 -0
  126. package/dist/projection/tools.d.ts +11 -0
  127. package/dist/projection/tools.d.ts.map +1 -0
  128. package/dist/projection/tools.js +237 -0
  129. package/dist/projection/tools.js.map +1 -0
  130. package/dist/scheduler.d.ts +36 -0
  131. package/dist/scheduler.d.ts.map +1 -0
  132. package/dist/scheduler.js +286 -0
  133. package/dist/scheduler.js.map +1 -0
  134. package/dist/system-prompt.d.ts +41 -0
  135. package/dist/system-prompt.d.ts.map +1 -0
  136. package/dist/system-prompt.js +162 -0
  137. package/dist/system-prompt.js.map +1 -0
  138. package/dist/time.d.ts +52 -0
  139. package/dist/time.d.ts.map +1 -0
  140. package/dist/time.js +138 -0
  141. package/dist/time.js.map +1 -0
  142. package/dist/tools/archival-memory-tool.d.ts +8 -0
  143. package/dist/tools/archival-memory-tool.d.ts.map +1 -0
  144. package/dist/tools/archival-memory-tool.js +68 -0
  145. package/dist/tools/archival-memory-tool.js.map +1 -0
  146. package/dist/tools/conversation-search-tool.d.ts +6 -0
  147. package/dist/tools/conversation-search-tool.d.ts.map +1 -0
  148. package/dist/tools/conversation-search-tool.js +28 -0
  149. package/dist/tools/conversation-search-tool.js.map +1 -0
  150. package/dist/tools/core-memory-tool.d.ts +7 -0
  151. package/dist/tools/core-memory-tool.d.ts.map +1 -0
  152. package/dist/tools/core-memory-tool.js +59 -0
  153. package/dist/tools/core-memory-tool.js.map +1 -0
  154. package/dist/tools/fetch-url.d.ts +15 -0
  155. package/dist/tools/fetch-url.d.ts.map +1 -0
  156. package/dist/tools/fetch-url.js +76 -0
  157. package/dist/tools/fetch-url.js.map +1 -0
  158. package/dist/tools/files.d.ts +10 -0
  159. package/dist/tools/files.d.ts.map +1 -0
  160. package/dist/tools/files.js +127 -0
  161. package/dist/tools/files.js.map +1 -0
  162. package/dist/tools/index.d.ts +17 -0
  163. package/dist/tools/index.d.ts.map +1 -0
  164. package/dist/tools/index.js +118 -0
  165. package/dist/tools/index.js.map +1 -0
  166. package/dist/tools/result.d.ts +21 -0
  167. package/dist/tools/result.d.ts.map +1 -0
  168. package/dist/tools/result.js +36 -0
  169. package/dist/tools/result.js.map +1 -0
  170. package/dist/tools/skill-install.d.ts +17 -0
  171. package/dist/tools/skill-install.d.ts.map +1 -0
  172. package/dist/tools/skill-install.js +148 -0
  173. package/dist/tools/skill-install.js.map +1 -0
  174. package/dist/tools/web-search.d.ts +42 -0
  175. package/dist/tools/web-search.d.ts.map +1 -0
  176. package/dist/tools/web-search.js +237 -0
  177. package/dist/tools/web-search.js.map +1 -0
  178. package/dist/trust/guardrail.d.ts +60 -0
  179. package/dist/trust/guardrail.d.ts.map +1 -0
  180. package/dist/trust/guardrail.js +171 -0
  181. package/dist/trust/guardrail.js.map +1 -0
  182. package/dist/trust/index.d.ts +12 -0
  183. package/dist/trust/index.d.ts.map +1 -0
  184. package/dist/trust/index.js +12 -0
  185. package/dist/trust/index.js.map +1 -0
  186. package/dist/trust/store.d.ts +118 -0
  187. package/dist/trust/store.d.ts.map +1 -0
  188. package/dist/trust/store.js +209 -0
  189. package/dist/trust/store.js.map +1 -0
  190. package/dist/trust/wrapper.d.ts +36 -0
  191. package/dist/trust/wrapper.d.ts.map +1 -0
  192. package/dist/trust/wrapper.js +142 -0
  193. package/dist/trust/wrapper.js.map +1 -0
  194. package/dist/usage.d.ts +53 -0
  195. package/dist/usage.d.ts.map +1 -0
  196. package/dist/usage.js +124 -0
  197. package/dist/usage.js.map +1 -0
  198. package/dist/util/math.d.ts +9 -0
  199. package/dist/util/math.d.ts.map +1 -0
  200. package/dist/util/math.js +22 -0
  201. package/dist/util/math.js.map +1 -0
  202. package/dist/util/ssrf.d.ts +21 -0
  203. package/dist/util/ssrf.d.ts.map +1 -0
  204. package/dist/util/ssrf.js +77 -0
  205. package/dist/util/ssrf.js.map +1 -0
  206. package/dist/workers/index.d.ts +8 -0
  207. package/dist/workers/index.d.ts.map +1 -0
  208. package/dist/workers/index.js +7 -0
  209. package/dist/workers/index.js.map +1 -0
  210. package/dist/workers/registry.d.ts +53 -0
  211. package/dist/workers/registry.d.ts.map +1 -0
  212. package/dist/workers/registry.js +38 -0
  213. package/dist/workers/registry.js.map +1 -0
  214. package/dist/workers/scoped-tools.d.ts +21 -0
  215. package/dist/workers/scoped-tools.d.ts.map +1 -0
  216. package/dist/workers/scoped-tools.js +111 -0
  217. package/dist/workers/scoped-tools.js.map +1 -0
  218. package/dist/workers/spawn.d.ts +62 -0
  219. package/dist/workers/spawn.d.ts.map +1 -0
  220. package/dist/workers/spawn.js +314 -0
  221. package/dist/workers/spawn.js.map +1 -0
  222. package/dist/workers/tools.d.ts +26 -0
  223. package/dist/workers/tools.d.ts.map +1 -0
  224. package/dist/workers/tools.js +380 -0
  225. package/dist/workers/tools.js.map +1 -0
  226. package/docker-compose.yml +72 -0
  227. package/package.json +16 -1
  228. package/run.sh +27 -0
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Worker session spawner and lifecycle management.
3
+ *
4
+ * Extracted from tools.ts to reduce file size and separate concerns:
5
+ * - tools.ts handles the tool definitions (public API)
6
+ * - spawn.ts handles session creation and lifecycle
7
+ */
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import { createAgentSession, DefaultResourceLoader, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
11
+ import { embed } from "../memory/embeddings.js";
12
+ import { createBraveSearchTool, createWebSearchTool } from "../tools/web-search.js";
13
+ import { createFetchUrlTool } from "../tools/fetch-url.js";
14
+ import { createWorkerScopedTools } from "./scoped-tools.js";
15
+ import { createModelInfra, resolveModel } from "../model-infra.js";
16
+ // ---------------------------------------------------------------------------
17
+ // Constants
18
+ // ---------------------------------------------------------------------------
19
+ const DEFAULT_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
20
+ // ---------------------------------------------------------------------------
21
+ // Worker system prompt
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Build the system prompt for a worker session.
25
+ *
26
+ * The steering.md polling instruction embedded here (check every 3 tool calls)
27
+ * is the only communication channel from the main agent to a worker that is
28
+ * already running. worker_steer writes the file; the worker reads it on its
29
+ * own schedule. There is no push mechanism — the interval of 3 tool calls is
30
+ * a trade-off between responsiveness and unnecessary read_file overhead.
31
+ */
32
+ function buildWorkerSystemPrompt(task, workerDir) {
33
+ return [
34
+ `You are a research worker. Your task is described below.`,
35
+ ``,
36
+ `Write your findings to result.md in your working directory.`,
37
+ `Structure the output as markdown with clear sections.`,
38
+ `Be thorough but concise. Include sources where relevant.`,
39
+ ``,
40
+ `Rules:`,
41
+ `- Your working directory is the root path you have access to.`,
42
+ `- Write your main output to result.md.`,
43
+ `- You may create additional files (notes.md, sources.md, etc.) as needed.`,
44
+ `- Do not ask for feedback or confirmation. Work autonomously.`,
45
+ `- When you are done, stop. Write your last thoughts to result.md and end.`,
46
+ ``,
47
+ `## Steering`,
48
+ ``,
49
+ `After every 3 tool calls, check for a file called steering.md using read_file.`,
50
+ `If the file exists, read it and immediately incorporate the guidance into your work.`,
51
+ `The steering note may narrow your focus, redirect your research, or add new requirements.`,
52
+ `Treat it as an authoritative update from the agent that dispatched you.`,
53
+ ``,
54
+ `## Task`,
55
+ ``,
56
+ task,
57
+ ``,
58
+ `## Working directory`,
59
+ ``,
60
+ workerDir,
61
+ ].join("\n");
62
+ }
63
+ /**
64
+ * Write (or overwrite) the status.json file in the worker directory.
65
+ *
66
+ * This is the primary way the main agent reads worker status via worker_check.
67
+ * worker_check first consults the in-memory registry; if the worker is no
68
+ * longer there (e.g. after a restart or 24-hour cleanup) it falls back to
69
+ * reading this file from disk. Writing is best-effort: failures are swallowed
70
+ * so they never abort a completion or timeout handler.
71
+ */
72
+ export function writeStatusFile(workerDir, data) {
73
+ try {
74
+ fs.writeFileSync(path.join(workerDir, "status.json"), JSON.stringify(data, null, 2), "utf-8");
75
+ }
76
+ catch {
77
+ // Best-effort — don't crash the completion handler
78
+ }
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Types
82
+ // ---------------------------------------------------------------------------
83
+ const ALLOWED_TOOLS = ["web_search", "fetch_url"];
84
+ // ---------------------------------------------------------------------------
85
+ // Worker session spawner
86
+ // ---------------------------------------------------------------------------
87
+ export async function spawnWorkerSession(opts) {
88
+ const { config, workerId, workerDir, task, modelOverride, toolNames, memoryStore, registry, timeoutMs, onTrigger, } = opts;
89
+ const { authStorage, modelRegistry, agentDir } = createModelInfra(config);
90
+ const modelsDir = path.join(config.data_dir, ".models");
91
+ const resultPath = path.join(workerDir, "result.md");
92
+ // Resolve model. Workers default to the first fallback model (cheaper) rather
93
+ // than the primary model. The primary might be Opus/Sonnet via OAuth; we don't
94
+ // want workers burning those tokens on research tasks.
95
+ const workerDefault = config.tools.workers.model
96
+ ?? config.agent.fallback_models?.[0]
97
+ ?? config.agent.model;
98
+ const modelString = modelOverride ?? workerDefault;
99
+ const model = resolveModel(modelString, modelRegistry);
100
+ if (!model) {
101
+ throw new Error(`Worker model not found: ${modelString}`);
102
+ }
103
+ // ---- Tool selection -------------------------------------------------------
104
+ // Only the tools explicitly requested by the dispatcher are included. The
105
+ // scoped file tools (write_file, read_file) are always added regardless.
106
+ const workerTools = [];
107
+ if (toolNames.includes("web_search") && config.tools.web_search.enabled) {
108
+ const ws = config.tools.web_search;
109
+ if (ws.brave_api_key) {
110
+ workerTools.push(createBraveSearchTool(ws.brave_api_key));
111
+ }
112
+ else if (ws.searxng_url) {
113
+ workerTools.push(createWebSearchTool(ws.searxng_url));
114
+ }
115
+ // If neither is configured, web_search is silently omitted from worker tools.
116
+ }
117
+ if (toolNames.includes("fetch_url")) {
118
+ workerTools.push(createFetchUrlTool(config.tools.fetch_url.timeout_ms));
119
+ }
120
+ // Scoped file tools are always present — they are the worker's only way to
121
+ // persist findings. The worker cannot access files outside workerDir.
122
+ workerTools.push(...createWorkerScopedTools(workerDir));
123
+ // ---- Session creation -----------------------------------------------------
124
+ const systemPrompt = buildWorkerSystemPrompt(task, workerDir);
125
+ const loader = new DefaultResourceLoader({
126
+ cwd: config.data_dir,
127
+ agentDir,
128
+ settingsManager: SettingsManager.create(config.data_dir, agentDir),
129
+ systemPromptOverride: () => systemPrompt,
130
+ });
131
+ await loader.reload();
132
+ const settingsManager = SettingsManager.create(config.data_dir, agentDir);
133
+ // Spawn the session (no persistence — in-memory only)
134
+ const { session } = await createAgentSession({
135
+ cwd: workerDir,
136
+ agentDir,
137
+ authStorage,
138
+ modelRegistry,
139
+ model,
140
+ thinkingLevel: "off",
141
+ tools: [],
142
+ customTools: workerTools,
143
+ resourceLoader: loader,
144
+ sessionManager: SessionManager.inMemory(workerDir),
145
+ settingsManager,
146
+ });
147
+ // ---- Timeout setup --------------------------------------------------------
148
+ registry.update(workerId, {
149
+ abort: () => session.abort(),
150
+ });
151
+ // Set up timeout
152
+ const timeoutHandle = setTimeout(async () => {
153
+ console.log(`[worker] ${workerId} timed out after ${timeoutMs / 1000}s`);
154
+ registry.update(workerId, {
155
+ status: "timeout",
156
+ completedAt: new Date(),
157
+ error: `Timed out after ${timeoutMs / 1000}s`,
158
+ });
159
+ const entry = registry.get(workerId);
160
+ try {
161
+ await session.abort();
162
+ }
163
+ catch {
164
+ // Best-effort abort
165
+ }
166
+ session.dispose();
167
+ if (entry) {
168
+ writeStatusFile(workerDir, {
169
+ worker_id: workerId,
170
+ status: "timeout",
171
+ task,
172
+ started_at: entry.startedAt.toISOString(),
173
+ completed_at: new Date().toISOString(),
174
+ model: modelString,
175
+ error: `Timed out after ${timeoutMs / 1000}s`,
176
+ result_path: resultPath,
177
+ });
178
+ const factContent = `Worker ${workerId} failed: timed out after ${timeoutMs / 1000}s`;
179
+ try {
180
+ const embedding = await embed(factContent, modelsDir);
181
+ memoryStore.addFact(factContent, "worker", embedding);
182
+ console.log(`[worker] ${workerId} timeout fact archived`);
183
+ }
184
+ catch (err) {
185
+ console.error(`[worker] ${workerId} failed to archive timeout fact:`, err.message);
186
+ }
187
+ }
188
+ scheduleCleanup(registry, workerId, workerDir);
189
+ }, timeoutMs);
190
+ // Store handle so we can cancel it if the worker finishes first
191
+ registry.update(workerId, { timeoutHandle });
192
+ // ---- Task execution and completion callback --------------------------------
193
+ // session.prompt() runs the worker to completion. Everything below the await
194
+ // is the completion callback — it runs once the model has stopped generating.
195
+ const taskPrompt = `Please complete the task described in the system prompt. ` +
196
+ `Write your findings to result.md when done.`;
197
+ try {
198
+ await session.prompt(taskPrompt);
199
+ // Check for model errors
200
+ const lastAssistant = session.messages
201
+ .filter((m) => m.role === "assistant")
202
+ .pop();
203
+ if (lastAssistant?.stopReason === "error") {
204
+ throw new Error(String(lastAssistant.errorMessage ?? "Model error"));
205
+ }
206
+ // Success path
207
+ clearTimeout(timeoutHandle);
208
+ registry.update(workerId, {
209
+ status: "complete",
210
+ completedAt: new Date(),
211
+ error: null,
212
+ timeoutHandle: null,
213
+ });
214
+ const entry = registry.get(workerId);
215
+ // Step 1: Write status.json so worker_check can read the result from disk
216
+ // even after the registry entry has been cleaned up.
217
+ writeStatusFile(workerDir, {
218
+ worker_id: workerId,
219
+ status: "complete",
220
+ task,
221
+ started_at: entry?.startedAt.toISOString() ?? new Date().toISOString(),
222
+ completed_at: new Date().toISOString(),
223
+ model: modelString,
224
+ error: null,
225
+ result_path: resultPath,
226
+ });
227
+ console.log(`[worker] ${workerId} complete`);
228
+ const factContent = `Worker ${workerId} complete, results at ${resultPath}`;
229
+ try {
230
+ // Step 2: Archive the completion fact. This is what the main agent's
231
+ // projection matched against trigger_on_fact (e.g. "worker w-xxx complete").
232
+ const embedding = await embed(factContent, modelsDir);
233
+ memoryStore.addFact(factContent, "worker", embedding);
234
+ console.log(`[worker] ${workerId} completion fact archived`);
235
+ // Step 3: Check the fact against active projections and invoke the
236
+ // onTrigger callback if any match. The callback injects a scheduler
237
+ // message immediately rather than waiting for the 5-minute cron tick,
238
+ // so the main agent wakes up as soon as the worker finishes.
239
+ if (onTrigger && opts.projectionStore) {
240
+ try {
241
+ const triggered = await opts.projectionStore.checkTriggers(factContent, (text) => embed(text, modelsDir));
242
+ if (triggered.length > 0) {
243
+ console.log(`[worker] ${workerId} triggered ${triggered.length} projection(s)`);
244
+ onTrigger(triggered);
245
+ }
246
+ }
247
+ catch (triggerErr) {
248
+ console.error(`[worker] ${workerId} trigger check failed:`, triggerErr.message);
249
+ }
250
+ }
251
+ }
252
+ catch (err) {
253
+ console.error(`[worker] ${workerId} failed to archive completion fact:`, err.message);
254
+ }
255
+ }
256
+ catch (error) {
257
+ const errMsg = error.message;
258
+ // Don't overwrite a terminal status set externally (timeout handler or
259
+ // worker_interrupt). Both set their own status before aborting the session,
260
+ // so the error thrown by abort() here would otherwise clobber it.
261
+ const currentEntry = registry.get(workerId);
262
+ if (currentEntry?.status === "timeout" || currentEntry?.status === "cancelled") {
263
+ session.dispose();
264
+ return;
265
+ }
266
+ clearTimeout(timeoutHandle);
267
+ registry.update(workerId, {
268
+ status: "failed",
269
+ completedAt: new Date(),
270
+ error: errMsg,
271
+ timeoutHandle: null,
272
+ });
273
+ const entry = registry.get(workerId);
274
+ writeStatusFile(workerDir, {
275
+ worker_id: workerId,
276
+ status: "failed",
277
+ task,
278
+ started_at: entry?.startedAt.toISOString() ?? new Date().toISOString(),
279
+ completed_at: new Date().toISOString(),
280
+ model: modelString,
281
+ error: errMsg,
282
+ result_path: resultPath,
283
+ });
284
+ console.error(`[worker] ${workerId} failed:`, errMsg);
285
+ const factContent = `Worker ${workerId} failed: ${errMsg}`;
286
+ try {
287
+ const embedding = await embed(factContent, modelsDir);
288
+ memoryStore.addFact(factContent, "worker", embedding);
289
+ console.log(`[worker] ${workerId} failure fact archived`);
290
+ }
291
+ catch (err2) {
292
+ console.error(`[worker] ${workerId} failed to archive failure fact:`, err2.message);
293
+ }
294
+ }
295
+ finally {
296
+ session.dispose();
297
+ scheduleCleanup(registry, workerId, workerDir);
298
+ }
299
+ }
300
+ // ---------------------------------------------------------------------------
301
+ // Cleanup
302
+ // ---------------------------------------------------------------------------
303
+ /**
304
+ * Remove the worker's registry entry after 24 hours. Result files stay on
305
+ * disk; only the in-memory tracking is cleared.
306
+ */
307
+ export function scheduleCleanup(registry, workerId, _workerDir) {
308
+ // Keep the entry for 24 hours so worker_check still works.
309
+ setTimeout(() => {
310
+ registry.remove(workerId);
311
+ console.log(`[worker] ${workerId} removed from registry after 24h`);
312
+ }, 24 * 60 * 60 * 1000);
313
+ }
314
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/workers/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Worker tools: dispatch, check, interrupt, steer.
3
+ *
4
+ * Workers are background LLM sessions with a scoped tool set. They write
5
+ * results to a file and signal completion by archiving a fact, which triggers
6
+ * any matching projection in the main agent.
7
+ *
8
+ * Lifecycle:
9
+ * 1. dispatch: create worker dir, write task.md, spawn session
10
+ * 2. Worker runs autonomously (web search, fetch URL, write result.md)
11
+ * 3. On completion/failure/timeout: write status.json, archive a fact
12
+ * 4. check: query status; interrupt: cancel immediately; steer: redirect
13
+ */
14
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
15
+ import type { Config } from "../config.js";
16
+ import type { MemoryStore } from "../memory/store.js";
17
+ import type { WorkerRegistry } from "./registry.js";
18
+ import type { ProjectionStore } from "../projection/store.js";
19
+ import { type WorkerTriggerCallback } from "./spawn.js";
20
+ export type { WorkerTriggerCallback } from "./spawn.js";
21
+ /**
22
+ * Create worker tools (dispatch, check, interrupt, steer).
23
+ * When isWorkerSession is true, dispatch rejects all calls (no nesting).
24
+ */
25
+ export declare function createWorkerTools(config: Config, memoryStore: MemoryStore, registry: WorkerRegistry, isWorkerSession?: boolean, projectionStore?: ProjectionStore, onTrigger?: WorkerTriggerCallback): AgentTool<any>[];
26
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/workers/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,6BAA6B,CAAC;AAG9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AAYpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA8DxD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,cAAc,EACxB,eAAe,UAAQ,EACvB,eAAe,CAAC,EAAE,eAAe,EACjC,SAAS,CAAC,EAAE,qBAAqB,GAChC,SAAS,CAAC,GAAG,CAAC,EAAE,CAoWlB"}