@runcore-sh/runcore 0.5.15 → 0.6.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 (66) hide show
  1. package/brain-template/templates/spawn-policy.yaml +12 -6
  2. package/dictionary.json +2 -2
  3. package/dist/agents/autonomous.d.ts.map +1 -1
  4. package/dist/agents/runtime/config.d.ts.map +1 -1
  5. package/dist/agents/runtime/driver.d.ts +12 -3
  6. package/dist/agents/runtime/driver.d.ts.map +1 -1
  7. package/dist/agents/runtime/types.d.ts +4 -0
  8. package/dist/agents/runtime/types.d.ts.map +1 -1
  9. package/dist/agents/runtime.js +3 -3
  10. package/dist/agents/runtime.js.map +1 -1
  11. package/dist/agents/spawn-policy.d.ts +15 -7
  12. package/dist/agents/spawn-policy.d.ts.map +1 -1
  13. package/dist/agents/spawn.d.ts.map +1 -1
  14. package/dist/agents/store.d.ts.map +1 -1
  15. package/dist/agents/store.js +94 -49
  16. package/dist/agents/store.js.map +1 -1
  17. package/dist/agents/types.d.ts +6 -0
  18. package/dist/agents/types.d.ts.map +1 -1
  19. package/dist/alert.d.ts +6 -0
  20. package/dist/alert.d.ts.map +1 -1
  21. package/dist/alert.js +16 -3
  22. package/dist/alert.js.map +1 -1
  23. package/dist/capabilities/definitions/email.d.ts +3 -2
  24. package/dist/capabilities/definitions/email.d.ts.map +1 -1
  25. package/dist/capabilities/definitions/email.js +74 -60
  26. package/dist/capabilities/definitions/email.js.map +1 -1
  27. package/dist/cli.js +49 -12
  28. package/dist/cli.js.map +1 -1
  29. package/dist/goals/planner.d.ts +40 -0
  30. package/dist/goals/planner.d.ts.map +1 -0
  31. package/dist/goals/planner.js +302 -0
  32. package/dist/goals/planner.js.map +1 -0
  33. package/dist/health/alert-defaults.js +6 -6
  34. package/dist/health/alert-defaults.js.map +1 -1
  35. package/dist/health/checks.d.ts.map +1 -1
  36. package/dist/health/checks.js +4 -6
  37. package/dist/health/checks.js.map +1 -1
  38. package/dist/llm/tools/handlers.js +1 -1
  39. package/dist/llm/tools/handlers.js.map +1 -1
  40. package/dist/llm/tools/loop.d.ts +2 -2
  41. package/dist/llm/tools/loop.d.ts.map +1 -1
  42. package/dist/llm/tools/loop.js +36 -8
  43. package/dist/llm/tools/loop.js.map +1 -1
  44. package/dist/queue/grooming.d.ts.map +1 -1
  45. package/dist/queue/grooming.js +27 -3
  46. package/dist/queue/grooming.js.map +1 -1
  47. package/dist/server.d.ts.map +1 -1
  48. package/dist/server.js +121 -50
  49. package/dist/server.js.map +1 -1
  50. package/dist/services/routine-patterns.d.ts.map +1 -1
  51. package/dist/services/routine-patterns.js +9 -0
  52. package/dist/services/routine-patterns.js.map +1 -1
  53. package/dist/services/traceInsights.d.ts.map +1 -1
  54. package/dist/services/traceInsights.js +48 -32
  55. package/dist/services/traceInsights.js.map +1 -1
  56. package/dist/settings.js +2 -2
  57. package/dist/settings.js.map +1 -1
  58. package/dist/tier/token.d.ts.map +1 -1
  59. package/dist/tier/token.js +4 -1
  60. package/dist/tier/token.js.map +1 -1
  61. package/dist/vault/store.d.ts +3 -1
  62. package/dist/vault/store.d.ts.map +1 -1
  63. package/package.json +1 -1
  64. package/public/index.html +102 -16
  65. package/public/settings.html +1411 -0
  66. package/public/sw.js +9 -59
@@ -2,12 +2,24 @@
2
2
  * Tool-calling orchestration loop.
3
3
  *
4
4
  * Wraps a provider's streamChat to handle multi-round tool calling.
5
- * The loop: stream detect tool calls execute append results stream again.
6
- * Caps at MAX_ROUNDS to prevent infinite loops.
5
+ * The loop: stream -> detect tool calls -> execute -> append results -> stream again.
6
+ * Runs until the model stops calling tools. Context size is the natural limit.
7
7
  */
8
8
  import { createLogger } from "../../utils/logger.js";
9
9
  const log = createLogger("llm.tools.loop");
10
- const MAX_ROUNDS = 5;
10
+ /** Rough char budget before we nudge the model to wrap up. ~120k tokens. */
11
+ const CONTEXT_CHAR_BUDGET = 480_000;
12
+ /** Estimate total chars across all messages. */
13
+ function estimateContextChars(messages) {
14
+ let total = 0;
15
+ for (const m of messages) {
16
+ if (typeof m.content === "string")
17
+ total += m.content.length;
18
+ else if (m.content != null)
19
+ total += JSON.stringify(m.content).length;
20
+ }
21
+ return total;
22
+ }
11
23
  /**
12
24
  * Stream with tool-calling support.
13
25
  *
@@ -33,7 +45,14 @@ export async function streamWithTools(options) {
33
45
  }
34
46
  const messages = [...options.messages];
35
47
  let round = 0;
36
- while (round < MAX_ROUNDS) {
48
+ let nudged = false;
49
+ // Loop until the model stops calling tools or context fills up
50
+ while (true) {
51
+ // Check abort signal
52
+ if (options.signal?.aborted) {
53
+ options.onDone();
54
+ return;
55
+ }
37
56
  let toolCalls = [];
38
57
  let roundText = "";
39
58
  // Run one streaming round
@@ -117,10 +136,19 @@ export async function streamWithTools(options) {
117
136
  });
118
137
  }
119
138
  round++;
120
- log.info("Tool loop advancing to next round", { round, maxRounds: MAX_ROUNDS });
139
+ log.info("Tool loop round complete", { round, contextChars: estimateContextChars(messages) });
140
+ // Context pressure check: if we're approaching the limit, nudge once
141
+ if (!nudged && estimateContextChars(messages) > CONTEXT_CHAR_BUDGET) {
142
+ nudged = true;
143
+ log.warn("Context nearing limit, nudging model to wrap up", {
144
+ round,
145
+ contextChars: estimateContextChars(messages),
146
+ });
147
+ messages.push({
148
+ role: "system",
149
+ content: "Context is getting large. Wrap up your current work and respond to the user with a summary. You can suggest continuing in a follow-up message if there is more to do.",
150
+ });
151
+ }
121
152
  }
122
- // Max rounds reached — end gracefully
123
- log.warn("Tool loop hit max rounds without text response", { maxRounds: MAX_ROUNDS });
124
- options.onDone();
125
153
  }
126
154
  //# sourceMappingURL=loop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../../src/llm/tools/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../../src/llm/tools/loop.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"grooming.d.ts","sourceRoot":"","sources":["../../src/queue/grooming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAyQxC;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,UAAU,GAAE,MAAkC,GAC7C,IAAI,CAwBN;AAED,+BAA+B;AAC/B,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"}
1
+ {"version":3,"file":"grooming.d.ts","sourceRoot":"","sources":["../../src/queue/grooming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAiSxC;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,UAAU,GAAE,MAAkC,GAC7C,IAAI,CAwBN;AAED,+BAA+B;AAC/B,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"}
@@ -114,6 +114,22 @@ async function promoteReadyBacklogItems(store, tasks) {
114
114
  async function runGroomingCheck(store) {
115
115
  const tasks = await store.list();
116
116
  const now = Date.now();
117
+ // Cancel open anomaly/bottleneck tickets that were auto-generated by the insight engine.
118
+ // These self-referential tickets poison the board and prevent real work from surfacing.
119
+ const junkTickets = tasks.filter((t) => {
120
+ if (t.state === "done" || t.state === "cancelled")
121
+ return false;
122
+ return /^\[(anomaly|bottleneck)\]/i.test(t.title);
123
+ });
124
+ for (const task of junkTickets) {
125
+ await store.update(task.id, { state: "cancelled" });
126
+ }
127
+ if (junkTickets.length > 0) {
128
+ logActivity({
129
+ source: "board",
130
+ summary: `Grooming: cancelled ${junkTickets.length} auto-generated [anomaly]/[bottleneck] ticket(s)`,
131
+ });
132
+ }
117
133
  // Find backlog/todo items that are genuinely vague — no meaningful description.
118
134
  // Items with exchanges (comments/specs) are considered groomed even if the
119
135
  // original description is short, since specs often arrive as comments.
@@ -130,17 +146,25 @@ async function runGroomingCheck(store) {
130
146
  const hasActionableDetail = /(?:acceptance|criteria|deliverable|must|should|implement|add|create|fix|update|remove|when|endpoint|route|component)/i.test(desc);
131
147
  return desc.length < 80 && !hasFilePaths && !hasActionableDetail;
132
148
  });
133
- // Find in_progress items that have been stale for > 24 hours
149
+ // Find in_progress items that have been stale for > 2 hours — agent likely crashed or
150
+ // runtime wasn't initialized when the item was set to in_progress. Move back to todo.
134
151
  const staleInProgress = tasks.filter((t) => {
135
152
  if (t.state !== "in_progress")
136
153
  return false;
137
154
  const updated = new Date(t.updatedAt).getTime();
138
- return (now - updated) > 24 * 60 * 60 * 1000;
155
+ return (now - updated) > 2 * 60 * 60 * 1000;
139
156
  });
157
+ // Move stale in_progress items back to todo so they can be re-picked
158
+ for (const task of staleInProgress) {
159
+ await store.update(task.id, { state: "todo", assignee: null });
160
+ }
140
161
  // Find items with stale assignees (assigned but not updated in > 2 hours — agent likely crashed)
141
162
  const staleAssigned = tasks.filter((t) => {
142
163
  if (!t.assignee || t.state === "done" || t.state === "cancelled")
143
164
  return false;
165
+ // Skip items we already moved back to todo above
166
+ if (t.state === "in_progress")
167
+ return false;
144
168
  const updated = new Date(t.updatedAt).getTime();
145
169
  return (now - updated) > 2 * 60 * 60 * 1000;
146
170
  });
@@ -170,7 +194,7 @@ async function runGroomingCheck(store) {
170
194
  parts.push(`${vagueItems.length} backlog items need specs (${cap(vagueItems.map((t) => t.identifier))})`);
171
195
  }
172
196
  if (staleInProgress.length > 0) {
173
- parts.push(`${staleInProgress.length} items stale in In Progress (${cap(staleInProgress.map((t) => t.identifier))})`);
197
+ parts.push(`moved ${staleInProgress.length} stale in_progress todo (${cap(staleInProgress.map((t) => t.identifier))})`);
174
198
  }
175
199
  if (staleAssigned.length > 0) {
176
200
  parts.push(`cleared ${staleAssigned.length} stale assignees (${cap(staleAssigned.map((t) => t.identifier))})`);
@@ -1 +1 @@
1
- {"version":3,"file":"grooming.js","sourceRoot":"","sources":["../../src/queue/grooming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grooming.js","sourceRoot":"","sources":["../../src/queue/grooming.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqXH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AA2/MD,iBAAe,KAAK,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,iBAAiB,EAAE,QAAQ,CAAA;CAAE,iBA6tBxE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsXH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAygND,iBAAe,KAAK,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,iBAAiB,EAAE,QAAQ,CAAA;CAAE,iBA6uBxE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
package/dist/server.js CHANGED
@@ -122,6 +122,7 @@ import { createCapabilityRegistry, getCapabilityRegistry, calendarCapability, em
122
122
  let _browser = null;
123
123
  import { MetricsStore, startCollector, stopCollector, registerDefaultThresholds, evaluateAlerts, buildDashboard, metricsMiddleware, collectPrometheus, generatePeriodStats, generateComparisonReport, } from "./metrics/index.js";
124
124
  import { startGroomingTimer, stopGroomingTimer } from "./queue/grooming.js";
125
+ import { startGoalPlanner, stopGoalPlanner } from "./goals/planner.js";
125
126
  import { createSchedulingStore, getSchedulingStore } from "./scheduling/store.js";
126
127
  import { startSchedulingTimer, stopSchedulingTimer } from "./scheduling/timer.js";
127
128
  import { createContactStore, getContactStore } from "./contacts/store.js";
@@ -412,11 +413,11 @@ async function getOrCreateChatSession(sessionId, name) {
412
413
  : (_googleAuth?.isGoogleConfigured() ?? false)
413
414
  ? [`Google Workspace credentials are configured but not yet authorized. Tell ${name} to click "Connect Google" in settings to complete the setup.`, ``]
414
415
  : [`Google Workspace is not connected. ${name} can add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in vault settings to enable Calendar, Gmail, and Drive access.`, ``]),
415
- // Non-Google capability instructions (always injected)
416
- ...(getCapabilityRegistry()?.getPromptInstructions({ origin: "chat", name, exclude: ["calendar", "email", "docs"] }) ?? "").split("\n"),
416
+ // Non-Google capability instructions (always injected; email is Resend-based, not Google)
417
+ ...(getCapabilityRegistry()?.getPromptInstructions({ origin: "chat", name, exclude: ["calendar", "docs"] }) ?? "").split("\n"),
417
418
  // Google capability instructions (only when authenticated)
418
419
  ...((_googleAuth?.isGoogleAuthenticated() ?? false)
419
- ? (getCapabilityRegistry()?.getPromptInstructions({ origin: "chat", name, filter: ["calendar", "email", "docs"] }) ?? "").split("\n")
420
+ ? (getCapabilityRegistry()?.getPromptInstructions({ origin: "chat", name, filter: ["calendar", "docs"] }) ?? "").split("\n")
420
421
  : []),
421
422
  ``,
422
423
  // Capability summary — self-knowledge of full toolset
@@ -1237,10 +1238,12 @@ app.put("/api/vault/:name", async (c) => {
1237
1238
  return unauthorized("Session key not found");
1238
1239
  const name = c.req.param("name");
1239
1240
  const body = await c.req.json();
1240
- const { value, label } = body;
1241
+ const { value, label, type } = body;
1241
1242
  if (!value)
1242
1243
  return badRequest("value required");
1243
- await _vaultStore.setVaultKey(name, value, key, label);
1244
+ if (!_vaultStore)
1245
+ return c.json({ error: "Vault not available — tier may not support it" }, 503);
1246
+ await _vaultStore.setVaultKey(name, value, key, label, type);
1244
1247
  return c.json({ ok: true });
1245
1248
  });
1246
1249
  // Delete a vault key
@@ -1255,6 +1258,8 @@ app.delete("/api/vault/:name", async (c) => {
1255
1258
  if (!key)
1256
1259
  return unauthorized("Session key not found");
1257
1260
  const name = c.req.param("name");
1261
+ if (!_vaultStore)
1262
+ return c.json({ error: "Vault not available — tier may not support it" }, 503);
1258
1263
  await _vaultStore.deleteVaultKey(name, key);
1259
1264
  return c.json({ ok: true });
1260
1265
  });
@@ -1367,6 +1372,8 @@ app.get("/api/google/callback", async (c) => {
1367
1372
  if (!vaultKey) {
1368
1373
  return c.html(`<html><body><h2>Session not found</h2><p>Could not find a session key to store credentials. Please log in first, then try connecting Google again.</p></body></html>`);
1369
1374
  }
1375
+ if (!_vaultStore)
1376
+ return c.html(`<html><body><h2>Vault not available</h2><p>Cannot store credentials — vault module not loaded.</p></body></html>`);
1370
1377
  await _vaultStore.setVaultKey("GOOGLE_REFRESH_TOKEN", result.refreshToken, vaultKey, "Google OAuth refresh token");
1371
1378
  logActivity({ source: "google", summary: "Google OAuth connected — refresh token stored in vault", actionLabel: "PROMPTED", reason: "user connected Google OAuth" });
1372
1379
  // Start Google polling timers now that Google is connected
@@ -3002,6 +3009,8 @@ app.get("/api/slack/callback", async (c) => {
3002
3009
  if (!vaultKey) {
3003
3010
  return c.html(`<html><body><h2>Session not found</h2><p>Log in first, then try connecting Slack again.</p></body></html>`);
3004
3011
  }
3012
+ if (!_vaultStore)
3013
+ return c.html(`<html><body><h2>Vault not available</h2><p>Cannot store credentials — vault module not loaded.</p></body></html>`);
3005
3014
  await _vaultStore.setVaultKey("SLACK_BOT_TOKEN", result.botToken, vaultKey, "Slack Bot Token");
3006
3015
  if (result.teamId) {
3007
3016
  await _vaultStore.setVaultKey("SLACK_TEAM_ID", result.teamId, vaultKey, "Slack Team ID");
@@ -4599,6 +4608,10 @@ app.get("/browser", requireSurface("pages"), async (c) => {
4599
4608
  const html = await serveHtmlTemplate(join(UI_DIR, "browser.html"));
4600
4609
  return c.html(html);
4601
4610
  });
4611
+ app.get("/settings", requireSurface("pages"), async (c) => {
4612
+ const html = await serveHtmlTemplate(join(UI_DIR, "settings.html"));
4613
+ return c.html(html);
4614
+ });
4602
4615
  // Registry is always available — it's the entry point
4603
4616
  app.get("/registry", async (c) => {
4604
4617
  const html = await serveHtmlTemplate(join(UI_DIR, "registry.html"));
@@ -4719,28 +4732,28 @@ app.post("/api/share", async (c) => {
4719
4732
  }
4720
4733
  const { randomBytes } = await import("node:crypto");
4721
4734
  const shareId = `share_${Date.now()}_${randomBytes(4).toString("hex")}`;
4722
- const emailHtml = `
4723
- <div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; max-width: 560px; margin: 0 auto; padding: 32px 24px; color: #e4e4e7; background: #0e0e10;">
4724
- <h1 style="font-size: 20px; font-weight: 600; margin: 0 0 16px;">You've been invited to try Core</h1>
4725
- <p style="color: #8b8b94; font-size: 14px; line-height: 1.6; margin: 0 0 20px;">
4726
- Core is a file-based personal operating system for an AI agent — your own local brain that learns, remembers, and works for you.
4727
- </p>
4728
- ${note ? `<div style="background: #18181b; border: 1px solid #2e2e33; border-radius: 8px; padding: 14px 16px; margin: 0 0 20px; font-size: 13px; color: #e4e4e7;"><strong>Note from sender:</strong> ${note.replace(/</g, "&lt;").replace(/>/g, "&gt;")}</div>` : ""}
4729
- <h2 style="font-size: 14px; font-weight: 600; margin: 0 0 10px;">Install</h2>
4730
- <pre style="background: #18181b; border: 1px solid #2e2e33; border-radius: 8px; padding: 14px 16px; font-size: 13px; color: #a78bfa; overflow-x: auto; margin: 0 0 20px;">
4731
- # Clone the repo
4732
- git clone https://github.com/yourusername/core.git
4733
- cd core && npm install && npm run build
4734
- npm run chat</pre>
4735
- <h2 style="font-size: 14px; font-weight: 600; margin: 0 0 10px;">Your Connection Key</h2>
4736
- <p style="color: #8b8b94; font-size: 13px; line-height: 1.5; margin: 0 0 8px;">
4737
- Paste this key during first-run setup to connect with the person who invited you:
4738
- </p>
4739
- <pre style="background: #18181b; border: 1px solid #2e2e33; border-radius: 8px; padding: 14px 16px; font-size: 14px; color: #22c55e; letter-spacing: 0.5px; margin: 0 0 20px;">${shareId}</pre>
4740
- <p style="color: #8b8b94; font-size: 12px; margin: 0;">
4741
- This creates a connection record — it does <strong>not</strong> enable mesh/hive-mind until you explicitly approve it in network settings.
4742
- </p>
4743
- </div>
4735
+ const emailHtml = `
4736
+ <div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; max-width: 560px; margin: 0 auto; padding: 32px 24px; color: #e4e4e7; background: #0e0e10;">
4737
+ <h1 style="font-size: 20px; font-weight: 600; margin: 0 0 16px;">You've been invited to try Core</h1>
4738
+ <p style="color: #8b8b94; font-size: 14px; line-height: 1.6; margin: 0 0 20px;">
4739
+ Core is a file-based personal operating system for an AI agent — your own local brain that learns, remembers, and works for you.
4740
+ </p>
4741
+ ${note ? `<div style="background: #18181b; border: 1px solid #2e2e33; border-radius: 8px; padding: 14px 16px; margin: 0 0 20px; font-size: 13px; color: #e4e4e7;"><strong>Note from sender:</strong> ${note.replace(/</g, "&lt;").replace(/>/g, "&gt;")}</div>` : ""}
4742
+ <h2 style="font-size: 14px; font-weight: 600; margin: 0 0 10px;">Install</h2>
4743
+ <pre style="background: #18181b; border: 1px solid #2e2e33; border-radius: 8px; padding: 14px 16px; font-size: 13px; color: #a78bfa; overflow-x: auto; margin: 0 0 20px;">
4744
+ # Clone the repo
4745
+ git clone https://github.com/yourusername/core.git
4746
+ cd core && npm install && npm run build
4747
+ npm run chat</pre>
4748
+ <h2 style="font-size: 14px; font-weight: 600; margin: 0 0 10px;">Your Connection Key</h2>
4749
+ <p style="color: #8b8b94; font-size: 13px; line-height: 1.5; margin: 0 0 8px;">
4750
+ Paste this key during first-run setup to connect with the person who invited you:
4751
+ </p>
4752
+ <pre style="background: #18181b; border: 1px solid #2e2e33; border-radius: 8px; padding: 14px 16px; font-size: 14px; color: #22c55e; letter-spacing: 0.5px; margin: 0 0 20px;">${shareId}</pre>
4753
+ <p style="color: #8b8b94; font-size: 12px; margin: 0;">
4754
+ This creates a connection record — it does <strong>not</strong> enable mesh/hive-mind until you explicitly approve it in network settings.
4755
+ </p>
4756
+ </div>
4744
4757
  `.trim();
4745
4758
  try {
4746
4759
  const res = await fetch("https://api.resend.com/emails", {
@@ -6164,9 +6177,13 @@ app.post("/api/chat", async (c) => {
6164
6177
  if (!def || def.pattern !== "action")
6165
6178
  continue;
6166
6179
  try {
6167
- await def.execute(block.payload, { origin: "chat" });
6180
+ const result = await def.execute(block.payload, { origin: "chat" });
6181
+ if (!result.ok)
6182
+ log.warn(`Action block [${block.tag}] failed: ${result.message}`);
6183
+ }
6184
+ catch (err) {
6185
+ log.error(`Action block [${block.tag}] error: ${err instanceof Error ? err.message : String(err)}`);
6168
6186
  }
6169
- catch { }
6170
6187
  }
6171
6188
  })();
6172
6189
  }
@@ -6629,6 +6646,7 @@ async function start(opts) {
6629
6646
  }
6630
6647
  });
6631
6648
  startGroomingTimer(queueProvider.getStore());
6649
+ startGoalPlanner(queueProvider.getStore());
6632
6650
  const schedulingStore = createSchedulingStore(BRAIN_DIR);
6633
6651
  startSchedulingTimer(schedulingStore);
6634
6652
  createContactStore(BRAIN_DIR);
@@ -6694,11 +6712,24 @@ async function start(opts) {
6694
6712
  if (pulseSettings.mode !== "timer" && _agentAutonomous) {
6695
6713
  const pulse = initPressureIntegrator(_agentAutonomous.triggerPulse, { threshold: pulseSettings.threshold });
6696
6714
  log.info(`Metabolic pulse initialized: Θ=${pulseSettings.threshold}mV, mode=${pulseSettings.mode}`);
6697
- // Boot scan: if todos already exist, inject tension so Core starts working immediately
6698
- const todoCount = (await queueProvider.getStore().list()).filter((t) => t.state === "todo").length;
6699
- if (todoCount > 0) {
6700
- pulse.addTension("board", `Boot: ${todoCount} todo(s) waiting`);
6701
- log.info(`Boot tension: ${todoCount} todo(s) found — pulse should fire`);
6715
+ // Boot scan: detect all non-terminal board items and inject tension.
6716
+ // Items in_progress with no running agent are orphans from a previous session —
6717
+ // move them back to triage so the planner can re-evaluate.
6718
+ const allBoardItems = await queueProvider.getStore().list();
6719
+ let orphanCount = 0;
6720
+ for (const item of allBoardItems) {
6721
+ if (item.state === "in_progress") {
6722
+ await queueProvider.getStore().update(item.id, { state: "triage", assignee: null });
6723
+ orphanCount++;
6724
+ }
6725
+ }
6726
+ if (orphanCount > 0) {
6727
+ log.info(`Boot: recovered ${orphanCount} orphaned in_progress item(s) → triage`);
6728
+ }
6729
+ const actionableCount = allBoardItems.filter((t) => t.state === "todo" || t.state === "triage" || t.state === "in_progress").length;
6730
+ if (actionableCount > 0) {
6731
+ pulse.addTension("board", `Boot: ${actionableCount} actionable item(s) waiting`);
6732
+ log.info(`Boot tension: ${actionableCount} actionable item(s) found — pulse should fire`);
6702
6733
  }
6703
6734
  }
6704
6735
  // Initialize nerve push notifications (VAPID keys + subscriptions)
@@ -7076,28 +7107,28 @@ async function start(opts) {
7076
7107
  }
7077
7108
  resolve();
7078
7109
  }
7079
- try {
7080
- const server = serve({ fetch: app.fetch, port: PORT }, () => onListening(server));
7110
+ const tryBind = (port, retriesLeft = 2) => {
7111
+ const server = serve({ fetch: app.fetch, port }, () => onListening(server));
7081
7112
  server.on("error", (err) => {
7082
- if (err.code === "EADDRINUSE" && PORT !== 0) {
7083
- log.warn(`Port ${PORT} in use, falling back to random port`);
7084
- const fallback = serve({ fetch: app.fetch, port: 0 }, () => onListening(fallback));
7113
+ if (err.code === "EADDRINUSE") {
7114
+ if (retriesLeft > 0 && port !== 0) {
7115
+ log.warn(`Port ${port} in use, retrying in 1s (${retriesLeft} left)`);
7116
+ setTimeout(() => tryBind(port, retriesLeft - 1), 1000);
7117
+ }
7118
+ else if (port !== 0) {
7119
+ log.warn(`Port ${port} in use after retries, falling back to random port`);
7120
+ tryBind(0, 0);
7121
+ }
7122
+ else {
7123
+ throw err;
7124
+ }
7085
7125
  }
7086
7126
  else {
7087
7127
  throw err;
7088
7128
  }
7089
7129
  });
7090
- }
7091
- catch (err) {
7092
- // If serve() throws synchronously (unlikely but safe)
7093
- if (PORT !== 0) {
7094
- log.warn(`Port ${PORT} failed, falling back to random port`);
7095
- const fallback = serve({ fetch: app.fetch, port: 0 }, () => onListening(fallback));
7096
- }
7097
- else {
7098
- throw err;
7099
- }
7100
- }
7130
+ };
7131
+ tryBind(PORT);
7101
7132
  });
7102
7133
  }
7103
7134
  /** Returns the port the server is actually listening on (resolves port 0). */
@@ -7230,6 +7261,7 @@ async function gracefulShutdown(signal) {
7230
7261
  }
7231
7262
  catch { }
7232
7263
  stopGroomingTimer();
7264
+ stopGoalPlanner();
7233
7265
  stopSchedulingTimer();
7234
7266
  try {
7235
7267
  _integrationsGithub?.shutdownGitHub();
@@ -7278,10 +7310,49 @@ async function gracefulShutdown(signal) {
7278
7310
  }
7279
7311
  catch { }
7280
7312
  releaseLock();
7313
+ // Self-restart: re-exec with same args instead of exiting
7314
+ if (signal === "self-restart") {
7315
+ const { spawn: spawnProcess } = await import("node:child_process");
7316
+ log.info("Re-executing process for self-restart");
7317
+ const child = spawnProcess(process.execPath, process.argv.slice(1), {
7318
+ cwd: process.cwd(),
7319
+ env: process.env,
7320
+ stdio: "inherit",
7321
+ detached: true,
7322
+ });
7323
+ child.unref();
7324
+ }
7281
7325
  process.exit(0);
7282
7326
  }
7283
7327
  process.on("SIGINT", () => { gracefulShutdown("SIGINT"); });
7284
7328
  process.on("SIGTERM", () => { gracefulShutdown("SIGTERM"); });
7329
+ // ── Self-restart: watch for restart signal from autonomous agents ──────────
7330
+ // When an agent builds new code and writes brain/.restart-requested,
7331
+ // the server gracefully shuts down and re-execs itself with the same args.
7332
+ // This is event-driven (fs.watch), not a timer.
7333
+ import { watch as fsWatch, unlinkSync } from "node:fs";
7334
+ try {
7335
+ const restartSignalDir = BRAIN_DIR;
7336
+ const restartWatcher = fsWatch(restartSignalDir, { persistent: false }, (_, filename) => {
7337
+ if (filename === ".restart-requested") {
7338
+ log.info("Restart signal detected — graceful restart in progress");
7339
+ logActivity({ source: "system", summary: "Self-restart triggered by agent build", actionLabel: "AUTONOMOUS", reason: "agent wrote .restart-requested" });
7340
+ try {
7341
+ unlinkSync(join(BRAIN_DIR, ".restart-requested"));
7342
+ }
7343
+ catch { }
7344
+ restartWatcher.close();
7345
+ // Graceful shutdown then re-exec
7346
+ gracefulShutdown("self-restart").then(() => { }).catch(() => {
7347
+ // gracefulShutdown calls process.exit(0), but if it doesn't:
7348
+ process.exit(0);
7349
+ });
7350
+ }
7351
+ });
7352
+ }
7353
+ catch {
7354
+ // Non-fatal — restart signal just won't work
7355
+ }
7285
7356
  // Crash diagnostics — write to file since terminal output may be lost on tsx watch restart
7286
7357
  process.on("uncaughtException", (err) => {
7287
7358
  const msg = `[${new Date().toISOString()}] UNCAUGHT: ${err.stack ?? err.message}\n`;