@aitne/daemon 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/whatsapp-adapter.d.ts.map +1 -1
  3. package/dist/adapters/whatsapp-adapter.js +0 -1
  4. package/dist/adapters/whatsapp-adapter.js.map +1 -1
  5. package/dist/api/integration-route-gate.d.ts +15 -11
  6. package/dist/api/integration-route-gate.d.ts.map +1 -1
  7. package/dist/api/integration-route-gate.js +60 -23
  8. package/dist/api/integration-route-gate.js.map +1 -1
  9. package/dist/api/json-body.d.ts +22 -7
  10. package/dist/api/json-body.d.ts.map +1 -1
  11. package/dist/api/json-body.js +27 -8
  12. package/dist/api/json-body.js.map +1 -1
  13. package/dist/api/routes/agent.d.ts.map +1 -1
  14. package/dist/api/routes/agent.js +18 -0
  15. package/dist/api/routes/agent.js.map +1 -1
  16. package/dist/api/routes/backends.d.ts.map +1 -1
  17. package/dist/api/routes/backends.js +96 -1
  18. package/dist/api/routes/backends.js.map +1 -1
  19. package/dist/api/routes/books.js +1 -1
  20. package/dist/api/routes/books.js.map +1 -1
  21. package/dist/api/routes/context.d.ts.map +1 -1
  22. package/dist/api/routes/context.js +13 -1
  23. package/dist/api/routes/context.js.map +1 -1
  24. package/dist/api/routes/dashboard.d.ts.map +1 -1
  25. package/dist/api/routes/dashboard.js +75 -5
  26. package/dist/api/routes/dashboard.js.map +1 -1
  27. package/dist/api/routes/github.d.ts.map +1 -1
  28. package/dist/api/routes/github.js +38 -5
  29. package/dist/api/routes/github.js.map +1 -1
  30. package/dist/api/routes/integrations.d.ts +35 -6
  31. package/dist/api/routes/integrations.d.ts.map +1 -1
  32. package/dist/api/routes/integrations.js +191 -16
  33. package/dist/api/routes/integrations.js.map +1 -1
  34. package/dist/api/routes/mail.d.ts.map +1 -1
  35. package/dist/api/routes/mail.js +112 -46
  36. package/dist/api/routes/mail.js.map +1 -1
  37. package/dist/api/routes/observations.d.ts.map +1 -1
  38. package/dist/api/routes/observations.js +161 -8
  39. package/dist/api/routes/observations.js.map +1 -1
  40. package/dist/api/routes/setup-migrate.d.ts +9 -1
  41. package/dist/api/routes/setup-migrate.d.ts.map +1 -1
  42. package/dist/api/routes/setup-migrate.js +4 -2
  43. package/dist/api/routes/setup-migrate.js.map +1 -1
  44. package/dist/api/routes/skills.d.ts.map +1 -1
  45. package/dist/api/routes/skills.js +39 -1
  46. package/dist/api/routes/skills.js.map +1 -1
  47. package/dist/api/routes/voice.d.ts.map +1 -1
  48. package/dist/api/routes/voice.js +154 -14
  49. package/dist/api/routes/voice.js.map +1 -1
  50. package/dist/bootstrap/adapters.d.ts +109 -0
  51. package/dist/bootstrap/adapters.d.ts.map +1 -0
  52. package/dist/bootstrap/adapters.js +237 -0
  53. package/dist/bootstrap/adapters.js.map +1 -0
  54. package/dist/bootstrap/catchup.d.ts +23 -0
  55. package/dist/bootstrap/catchup.d.ts.map +1 -0
  56. package/dist/bootstrap/catchup.js +124 -0
  57. package/dist/bootstrap/catchup.js.map +1 -0
  58. package/dist/bootstrap/schedule-helpers.d.ts +18 -0
  59. package/dist/bootstrap/schedule-helpers.d.ts.map +1 -0
  60. package/dist/bootstrap/schedule-helpers.js +96 -0
  61. package/dist/bootstrap/schedule-helpers.js.map +1 -0
  62. package/dist/bootstrap/services.d.ts +60 -0
  63. package/dist/bootstrap/services.d.ts.map +1 -0
  64. package/dist/bootstrap/services.js +209 -0
  65. package/dist/bootstrap/services.js.map +1 -0
  66. package/dist/core/backends/backend-router.d.ts +23 -0
  67. package/dist/core/backends/backend-router.d.ts.map +1 -1
  68. package/dist/core/backends/backend-router.js +48 -3
  69. package/dist/core/backends/backend-router.js.map +1 -1
  70. package/dist/core/backends/claude-auth.d.ts +70 -0
  71. package/dist/core/backends/claude-auth.d.ts.map +1 -0
  72. package/dist/core/backends/claude-auth.js +198 -0
  73. package/dist/core/backends/claude-auth.js.map +1 -0
  74. package/dist/core/backends/claude-code-core.d.ts +47 -119
  75. package/dist/core/backends/claude-code-core.d.ts.map +1 -1
  76. package/dist/core/backends/claude-code-core.js +112 -1565
  77. package/dist/core/backends/claude-code-core.js.map +1 -1
  78. package/dist/core/backends/claude-delegated.d.ts +86 -0
  79. package/dist/core/backends/claude-delegated.d.ts.map +1 -0
  80. package/dist/core/backends/claude-delegated.js +801 -0
  81. package/dist/core/backends/claude-delegated.js.map +1 -0
  82. package/dist/core/backends/claude-errors.d.ts +39 -0
  83. package/dist/core/backends/claude-errors.d.ts.map +1 -0
  84. package/dist/core/backends/claude-errors.js +71 -0
  85. package/dist/core/backends/claude-errors.js.map +1 -0
  86. package/dist/core/backends/claude-probe.d.ts +103 -0
  87. package/dist/core/backends/claude-probe.d.ts.map +1 -0
  88. package/dist/core/backends/claude-probe.js +336 -0
  89. package/dist/core/backends/claude-probe.js.map +1 -0
  90. package/dist/core/backends/claude-tool-collection.d.ts +135 -0
  91. package/dist/core/backends/claude-tool-collection.d.ts.map +1 -0
  92. package/dist/core/backends/claude-tool-collection.js +831 -0
  93. package/dist/core/backends/claude-tool-collection.js.map +1 -0
  94. package/dist/core/backends/gemini-cli-core.d.ts +21 -0
  95. package/dist/core/backends/gemini-cli-core.d.ts.map +1 -1
  96. package/dist/core/backends/gemini-cli-core.js +84 -6
  97. package/dist/core/backends/gemini-cli-core.js.map +1 -1
  98. package/dist/core/backends/prompt-utils.d.ts +1 -0
  99. package/dist/core/backends/prompt-utils.d.ts.map +1 -1
  100. package/dist/core/backends/prompt-utils.js +60 -3
  101. package/dist/core/backends/prompt-utils.js.map +1 -1
  102. package/dist/core/context-builder.d.ts +36 -12
  103. package/dist/core/context-builder.d.ts.map +1 -1
  104. package/dist/core/context-builder.js +179 -89
  105. package/dist/core/context-builder.js.map +1 -1
  106. package/dist/core/dispatcher-date-utils.d.ts +49 -0
  107. package/dist/core/dispatcher-date-utils.d.ts.map +1 -0
  108. package/dist/core/dispatcher-date-utils.js +132 -0
  109. package/dist/core/dispatcher-date-utils.js.map +1 -0
  110. package/dist/core/dispatcher-error-handling.d.ts +159 -0
  111. package/dist/core/dispatcher-error-handling.d.ts.map +1 -0
  112. package/dist/core/dispatcher-error-handling.js +393 -0
  113. package/dist/core/dispatcher-error-handling.js.map +1 -0
  114. package/dist/core/dispatcher-hourly-check.d.ts +150 -0
  115. package/dist/core/dispatcher-hourly-check.d.ts.map +1 -0
  116. package/dist/core/dispatcher-hourly-check.js +665 -0
  117. package/dist/core/dispatcher-hourly-check.js.map +1 -0
  118. package/dist/core/dispatcher-message-handler.d.ts +170 -0
  119. package/dist/core/dispatcher-message-handler.d.ts.map +1 -0
  120. package/dist/core/dispatcher-message-handler.js +1054 -0
  121. package/dist/core/dispatcher-message-handler.js.map +1 -0
  122. package/dist/core/dispatcher-morning-routine.d.ts +169 -0
  123. package/dist/core/dispatcher-morning-routine.d.ts.map +1 -0
  124. package/dist/core/dispatcher-morning-routine.js +434 -0
  125. package/dist/core/dispatcher-morning-routine.js.map +1 -0
  126. package/dist/core/dispatcher-prompt.d.ts +107 -0
  127. package/dist/core/dispatcher-prompt.d.ts.map +1 -0
  128. package/dist/core/dispatcher-prompt.js +227 -0
  129. package/dist/core/dispatcher-prompt.js.map +1 -0
  130. package/dist/core/dispatcher-repository-helpers.d.ts +39 -0
  131. package/dist/core/dispatcher-repository-helpers.d.ts.map +1 -0
  132. package/dist/core/dispatcher-repository-helpers.js +86 -0
  133. package/dist/core/dispatcher-repository-helpers.js.map +1 -0
  134. package/dist/core/dispatcher-result-processor.d.ts +145 -0
  135. package/dist/core/dispatcher-result-processor.d.ts.map +1 -0
  136. package/dist/core/dispatcher-result-processor.js +414 -0
  137. package/dist/core/dispatcher-result-processor.js.map +1 -0
  138. package/dist/core/dispatcher-scheduled-tasks.d.ts +406 -0
  139. package/dist/core/dispatcher-scheduled-tasks.d.ts.map +1 -0
  140. package/dist/core/dispatcher-scheduled-tasks.js +998 -0
  141. package/dist/core/dispatcher-scheduled-tasks.js.map +1 -0
  142. package/dist/core/dispatcher-types.d.ts +296 -0
  143. package/dist/core/dispatcher-types.d.ts.map +1 -0
  144. package/dist/core/dispatcher-types.js +106 -0
  145. package/dist/core/dispatcher-types.js.map +1 -0
  146. package/dist/core/dispatcher.d.ts +86 -610
  147. package/dist/core/dispatcher.d.ts.map +1 -1
  148. package/dist/core/dispatcher.js +293 -3542
  149. package/dist/core/dispatcher.js.map +1 -1
  150. package/dist/core/integration-health.d.ts +18 -10
  151. package/dist/core/integration-health.d.ts.map +1 -1
  152. package/dist/core/integration-health.js +31 -1
  153. package/dist/core/integration-health.js.map +1 -1
  154. package/dist/core/integration-lifecycle.d.ts +65 -0
  155. package/dist/core/integration-lifecycle.d.ts.map +1 -1
  156. package/dist/core/integration-lifecycle.js +167 -16
  157. package/dist/core/integration-lifecycle.js.map +1 -1
  158. package/dist/core/integration-main-backend.d.ts +40 -0
  159. package/dist/core/integration-main-backend.d.ts.map +1 -1
  160. package/dist/core/integration-main-backend.js +89 -2
  161. package/dist/core/integration-main-backend.js.map +1 -1
  162. package/dist/core/management-md.d.ts +51 -17
  163. package/dist/core/management-md.d.ts.map +1 -1
  164. package/dist/core/management-md.js +233 -56
  165. package/dist/core/management-md.js.map +1 -1
  166. package/dist/core/output-language-policy.d.ts +74 -0
  167. package/dist/core/output-language-policy.d.ts.map +1 -0
  168. package/dist/core/output-language-policy.js +194 -0
  169. package/dist/core/output-language-policy.js.map +1 -0
  170. package/dist/core/prompts.d.ts +1 -0
  171. package/dist/core/prompts.d.ts.map +1 -1
  172. package/dist/core/prompts.js +121 -3
  173. package/dist/core/prompts.js.map +1 -1
  174. package/dist/core/repository-management-docs.d.ts +24 -0
  175. package/dist/core/repository-management-docs.d.ts.map +1 -1
  176. package/dist/core/repository-management-docs.js +210 -26
  177. package/dist/core/repository-management-docs.js.map +1 -1
  178. package/dist/core/routine-acquisition-plan.d.ts +131 -0
  179. package/dist/core/routine-acquisition-plan.d.ts.map +1 -0
  180. package/dist/core/routine-acquisition-plan.js +268 -0
  181. package/dist/core/routine-acquisition-plan.js.map +1 -0
  182. package/dist/core/routine-fetch-window-runner.d.ts +201 -0
  183. package/dist/core/routine-fetch-window-runner.d.ts.map +1 -0
  184. package/dist/core/routine-fetch-window-runner.js +661 -0
  185. package/dist/core/routine-fetch-window-runner.js.map +1 -0
  186. package/dist/core/routine-windows.d.ts +156 -0
  187. package/dist/core/routine-windows.d.ts.map +1 -0
  188. package/dist/core/routine-windows.js +330 -0
  189. package/dist/core/routine-windows.js.map +1 -0
  190. package/dist/core/skills-compiler.d.ts +11 -0
  191. package/dist/core/skills-compiler.d.ts.map +1 -1
  192. package/dist/core/skills-compiler.js +102 -13
  193. package/dist/core/skills-compiler.js.map +1 -1
  194. package/dist/core/skills-manifest.d.ts.map +1 -1
  195. package/dist/core/skills-manifest.js +26 -0
  196. package/dist/core/skills-manifest.js.map +1 -1
  197. package/dist/core/system-reset.d.ts.map +1 -1
  198. package/dist/core/system-reset.js +25 -2
  199. package/dist/core/system-reset.js.map +1 -1
  200. package/dist/db/observations.d.ts +45 -2
  201. package/dist/db/observations.d.ts.map +1 -1
  202. package/dist/db/observations.js +112 -14
  203. package/dist/db/observations.js.map +1 -1
  204. package/dist/db/schema.d.ts.map +1 -1
  205. package/dist/db/schema.js +13 -25
  206. package/dist/db/schema.js.map +1 -1
  207. package/dist/index.js +83 -610
  208. package/dist/index.js.map +1 -1
  209. package/dist/observers/delegated-sync-worker.d.ts +45 -2
  210. package/dist/observers/delegated-sync-worker.d.ts.map +1 -1
  211. package/dist/observers/delegated-sync-worker.js +71 -21
  212. package/dist/observers/delegated-sync-worker.js.map +1 -1
  213. package/dist/observers/mail-poller.d.ts +12 -5
  214. package/dist/observers/mail-poller.d.ts.map +1 -1
  215. package/dist/observers/mail-poller.js +36 -14
  216. package/dist/observers/mail-poller.js.map +1 -1
  217. package/dist/observers/manager.d.ts +37 -5
  218. package/dist/observers/manager.d.ts.map +1 -1
  219. package/dist/observers/manager.js +28 -10
  220. package/dist/observers/manager.js.map +1 -1
  221. package/dist/safety/risk-classifier.d.ts.map +1 -1
  222. package/dist/safety/risk-classifier.js +5 -0
  223. package/dist/safety/risk-classifier.js.map +1 -1
  224. package/dist/services/delegated-backend-invoker.d.ts +1 -51
  225. package/dist/services/delegated-backend-invoker.d.ts.map +1 -1
  226. package/dist/services/delegated-backend-invoker.js +41 -480
  227. package/dist/services/delegated-backend-invoker.js.map +1 -1
  228. package/dist/services/delegated-invoker-audit.d.ts +94 -0
  229. package/dist/services/delegated-invoker-audit.d.ts.map +1 -0
  230. package/dist/services/delegated-invoker-audit.js +238 -0
  231. package/dist/services/delegated-invoker-audit.js.map +1 -0
  232. package/dist/services/delegated-invoker-cache-hits.d.ts +34 -0
  233. package/dist/services/delegated-invoker-cache-hits.d.ts.map +1 -0
  234. package/dist/services/delegated-invoker-cache-hits.js +104 -0
  235. package/dist/services/delegated-invoker-cache-hits.js.map +1 -0
  236. package/dist/services/delegated-invoker-janitors.d.ts +28 -0
  237. package/dist/services/delegated-invoker-janitors.d.ts.map +1 -0
  238. package/dist/services/delegated-invoker-janitors.js +104 -0
  239. package/dist/services/delegated-invoker-janitors.js.map +1 -0
  240. package/dist/services/delegated-invoker-utils.d.ts +42 -0
  241. package/dist/services/delegated-invoker-utils.d.ts.map +1 -0
  242. package/dist/services/delegated-invoker-utils.js +100 -0
  243. package/dist/services/delegated-invoker-utils.js.map +1 -0
  244. package/dist/services/delegated-task-runtime.d.ts +1 -1
  245. package/dist/services/delegated-task-runtime.js +1 -1
  246. package/dist/services/integrations/snapshot-partitions.d.ts +5 -0
  247. package/dist/services/integrations/snapshot-partitions.d.ts.map +1 -1
  248. package/dist/services/integrations/snapshot-partitions.js +12 -0
  249. package/dist/services/integrations/snapshot-partitions.js.map +1 -1
  250. package/dist/services/voice/transcriber-impl.d.ts.map +1 -1
  251. package/dist/services/voice/transcriber-impl.js +46 -0
  252. package/dist/services/voice/transcriber-impl.js.map +1 -1
  253. package/package.json +12 -12
@@ -0,0 +1,414 @@
1
+ /**
2
+ * `ResultProcessor` — closes out the dispatch lifecycle on the success
3
+ * side: forwards the agent's final output to the notification manager
4
+ * (when applicable), writes the audit log row, finalizes the
5
+ * agent_schedule + repository_management bookkeeping, and exposes the
6
+ * cross-session conversation history + proactive-forward heuristics
7
+ * the message handler consults.
8
+ *
9
+ * Extracted from `core/dispatcher.ts` as part of phase D-2 of
10
+ * `docs/design/appendices/file-split-plan.md`. Pattern B (stateful
11
+ * coordinator): the processor holds no mutable state of its own; it
12
+ * borrows the dispatcher's `notifiedEvents` Set as a live reference
13
+ * (the post-success consume site) and reads dispatcher-state via a
14
+ * minimal isReactive callback so the cost-cap / autonomous-trigger
15
+ * classification stays single-sourced.
16
+ *
17
+ * Dispatcher entry points served:
18
+ * - the message handler / routine handler / scheduled-task handler
19
+ * all call `processResult` once the backend run terminates;
20
+ * - `handleError` (now on `DispatcherErrorRouter`) bridges back into
21
+ * `finalizeRetemplateRun` / `finalizeManagementScan` via the
22
+ * `onRetemplateFinalize` / `onManagementScanFinalize` callbacks
23
+ * wired from `EventDispatcher` so the failure path lands the same
24
+ * bookkeeping rows as the success path;
25
+ * - the message handler reads
26
+ * `hasRecentProactiveForwardContext` /
27
+ * `buildCrossSessionConversationHistory` /
28
+ * `formatSummaryRole` for cross-surface DM continuity, and calls
29
+ * `logProactiveForwardDisavowalIfMatched` after the assistant
30
+ * reply lands.
31
+ *
32
+ * Shared-state references held:
33
+ * - `notifiedEvents: Set<string>` — live reference; `processResult`
34
+ * consumes the entry the agent's `/api/notify` call deposited so
35
+ * the dispatcher doesn't double-DM with the closing assistant
36
+ * turn.
37
+ * - `isReactive: (event) => boolean` — getter; mirrors the
38
+ * dispatcher's classification so audit-log `trigger` and observer
39
+ * logs stay consistent.
40
+ */
41
+ import { isAgentTaskEvent, isDocsQAMessage, isMessageEvent, isRoutineEvent, isScheduledEvent, formatSqliteDatetime, } from "@aitne/shared";
42
+ import { getContextDir } from "../config.js";
43
+ import { finalizeRetemplate } from "./template-store.js";
44
+ import { recordManagementInitDone, recordManagementScan, } from "../db/repositories-store.js";
45
+ import { isProactiveForwardMetadata, parseMessageMetadata, } from "./channel-timeline.js";
46
+ import { OWNER_DM_SCOPE, OWNER_SCOPE_KEY, DASHBOARD_CHAT_SCOPE, DASHBOARD_SCOPE_KEY, getConversationScope, } from "../messaging/constants.js";
47
+ import { createLogger } from "../logging.js";
48
+ const logger = createLogger("dispatcher-result");
49
+ /**
50
+ * English-only patterns by CLAUDE.md convention. The disavowal tripwire
51
+ * is a numerator over a `disavowed / injected` ratio (dm-channel-timeline.md
52
+ * §C.1) — false negatives are tolerated; non-English replies that happen to
53
+ * disavow will simply not contribute to the numerator. Operators monitor the
54
+ * ratio and flip `proactiveForwardForceFreshSession` on rise; that fallback
55
+ * path is language-agnostic.
56
+ */
57
+ export const PROACTIVE_FORWARD_DISAVOWAL_PATTERNS = [
58
+ /\b(?:don't|do not) (?:recall|remember)\b/i,
59
+ /\bI (?:didn't|did not) (?:say|send|mention)\b/i,
60
+ /\breferenc(?:ing|e) what\b/i,
61
+ /\bwhat did .* (?:say|mean|refer)\b/i,
62
+ ];
63
+ export class ResultProcessor {
64
+ db;
65
+ config;
66
+ audit;
67
+ notificationMgr;
68
+ sessionMgr;
69
+ notifiedEvents;
70
+ isReactive;
71
+ hasMessageBackendMetadataColumns;
72
+ constructor(deps) {
73
+ this.db = deps.db;
74
+ this.config = deps.config;
75
+ this.audit = deps.audit;
76
+ this.notificationMgr = deps.notificationMgr;
77
+ this.sessionMgr = deps.sessionMgr;
78
+ this.notifiedEvents = deps.notifiedEvents;
79
+ this.isReactive = deps.isReactive;
80
+ this.hasMessageBackendMetadataColumns = deps.hasMessageBackendMetadataColumns;
81
+ }
82
+ async processResult(result, event, skipNotify = false, options = {}) {
83
+ // Notify-dedup: consume the marker (if present) so this method also
84
+ // serves as the cleanup point — every event run reaches processResult
85
+ // exactly once on the success path, and on the error path the entry
86
+ // is harmless (next event gets a fresh UUID).
87
+ const alreadyNotified = this.notifiedEvents.delete(event.correlationId);
88
+ const output = result.output.trim();
89
+ if (!skipNotify
90
+ && !alreadyNotified
91
+ && output.length > 0
92
+ && this.shouldNotify(event)) {
93
+ if (options.originSessionId !== undefined) {
94
+ await this.notificationMgr.send(output, event, {
95
+ originSessionId: options.originSessionId,
96
+ });
97
+ }
98
+ else {
99
+ await this.notificationMgr.send(output, event);
100
+ }
101
+ }
102
+ this.audit.logAction({
103
+ event,
104
+ model: result.model,
105
+ costUsd: result.costUsd,
106
+ usage: result.usage,
107
+ modelUsage: result.modelUsage,
108
+ durationMs: result.durationMs,
109
+ numTurns: result.numTurns,
110
+ trigger: this.isReactive(event) ? "reactive" : "autonomous",
111
+ backend: result.backendId,
112
+ costSource: result.costSource,
113
+ contextUpdated: result.contextUpdated,
114
+ advisorCallCount: result.advisorCallCount,
115
+ ...(options.dmFreshness ? { dmFreshness: options.dmFreshness } : {}),
116
+ });
117
+ // Observer-event observability: log whether an external-change
118
+ // event actually produced a context-file update. Makes it obvious
119
+ // from the logs when the pipeline ran but the agent decided the
120
+ // change wasn't actionable. Covers every autonomous observer:
121
+ // - calendar.* / schedule.approaching (calendar observer)
122
+ // - github.* (GitHub poller high-priority events)
123
+ // - git.* (git watcher batched events)
124
+ // - notion.* (notion poller)
125
+ // - routine.hourly_check (Phase-9 polling sink for obsidian/git/notion)
126
+ if (this.isObserverEvent(event)) {
127
+ logger.info({
128
+ eventType: event.type,
129
+ source: event.source,
130
+ contextUpdated: result.contextUpdated,
131
+ numTurns: result.numTurns,
132
+ costUsd: result.costUsd,
133
+ }, result.contextUpdated
134
+ ? "Observer event processed — context files updated"
135
+ : "Observer event processed — no context updates");
136
+ }
137
+ // Mark scheduled task as completed or failed (covers both
138
+ // scheduled.task and scheduled.dm — both share the agent_schedule
139
+ // row lifecycle).
140
+ if (isScheduledEvent(event) && event.scheduleId) {
141
+ const newStatus = result.isError ? "failed" : "completed";
142
+ this.db
143
+ .prepare("UPDATE agent_schedule SET status = ? WHERE id = ? AND status = 'running'")
144
+ .run(newStatus, event.scheduleId);
145
+ this.finalizeRetemplateRunIfApplicable(event, { errored: result.isError });
146
+ }
147
+ // Repository-management events from the daily cron and the manual
148
+ // /api/repositories/:id/management/{init,scan} routes are
149
+ // `scheduled.task` events emitted directly to the EventBus (no
150
+ // `agent_schedule` row), so the finalize hook lives outside the
151
+ // `scheduleId` guard above. The finalizer is a no-op for any event
152
+ // whose taskContext doesn't match the management ProcessKey set.
153
+ this.finalizeManagementScanIfApplicable(event, { errored: result.isError });
154
+ }
155
+ /**
156
+ * P6 (git-lifecycle-and-triggers.md Decision 8) — restore in-flight
157
+ * `git.project.retemplate` targets from backup whenever a retemplate
158
+ * scheduled task settles. The agent itself cannot reliably roll back
159
+ * its own writes (process exit, exceeded turns, backend faults), so
160
+ * the daemon owns rollback at the dispatcher's two terminal sites
161
+ * (`processResult` + `handleError`). The status grid is the source of
162
+ * truth for which files to restore; `finalizeRetemplate` is idempotent
163
+ * via the `finalizedAt` marker so calling both paths is safe.
164
+ */
165
+ finalizeRetemplateRunIfApplicable(event, options) {
166
+ if (!isAgentTaskEvent(event) || !event.scheduleId)
167
+ return;
168
+ const taskCtx = event.taskContext;
169
+ const processKey = taskCtx
170
+ && typeof taskCtx === "object"
171
+ && typeof taskCtx.processKey === "string"
172
+ ? taskCtx.processKey
173
+ : null;
174
+ if (processKey !== "git.project.retemplate")
175
+ return;
176
+ try {
177
+ const result = finalizeRetemplate({
178
+ db: this.db,
179
+ contextDir: getContextDir(this.config, this.db),
180
+ scheduleId: event.scheduleId,
181
+ errored: options.errored,
182
+ });
183
+ if (result.applied && result.rolledBackSlugs.length > 0) {
184
+ logger.info({
185
+ scheduleId: event.scheduleId,
186
+ rolledBack: result.rolledBackSlugs,
187
+ finalStatus: result.finalStatus,
188
+ }, "Re-template run finalized — rolled back in-flight files from backup");
189
+ }
190
+ }
191
+ catch (err) {
192
+ logger.error({ err, scheduleId: event.scheduleId }, "Failed to finalize re-template run");
193
+ }
194
+ }
195
+ /**
196
+ * Unified-repositories §4.5 — settle a `repository_management` row when
197
+ * a `git.project.init` / `git.project.update` event the daemon emitted
198
+ * for management terminates. Runs unconditionally on every event
199
+ * because management events live on the EventBus only (no
200
+ * `agent_schedule` row), so the scheduleId-guarded path can't see
201
+ * them; the method early-returns for any taskContext that doesn't
202
+ * carry management metadata.
203
+ *
204
+ * Status mapping (v1):
205
+ * - `git.project.init` success → `recordManagementInitDone`
206
+ * - `git.project.update` success → `recordManagementScan('ok')`
207
+ * (resets `scan_failure_count`)
208
+ * - either, error → `recordManagementScan('failed')`
209
+ * (bumps `scan_failure_count`)
210
+ *
211
+ * `'skipped_no_activity'` is reserved for future task-flow callback —
212
+ * the dispatcher cannot reliably distinguish "agent decided no
213
+ * journal entry needed" from "agent succeeded but didn't write" here.
214
+ */
215
+ finalizeManagementScanIfApplicable(event, options) {
216
+ if (!isAgentTaskEvent(event))
217
+ return;
218
+ const taskCtx = event.taskContext;
219
+ if (!taskCtx || typeof taskCtx !== "object")
220
+ return;
221
+ const ctx = taskCtx;
222
+ const processKey = typeof ctx.processKey === "string" ? ctx.processKey : null;
223
+ const repositoryId = typeof ctx.repositoryId === "string" ? ctx.repositoryId : null;
224
+ const triggerSource = typeof ctx.triggerSource === "string" ? ctx.triggerSource : null;
225
+ if (!processKey || !repositoryId || !triggerSource)
226
+ return;
227
+ // Only management-emitted events should mutate `repository_management`.
228
+ // Trigger-fired sessions (`triggerSource === 'repository_trigger'`)
229
+ // share `processKey` in some cases but must not flip the management
230
+ // row — they have their own observability (`fire_count`).
231
+ if (triggerSource !== "repository_management_cron"
232
+ && triggerSource !== "repository_management_manual") {
233
+ return;
234
+ }
235
+ try {
236
+ if (processKey === "git.project.init") {
237
+ if (!options.errored) {
238
+ recordManagementInitDone(this.db, repositoryId);
239
+ }
240
+ else {
241
+ recordManagementScan(this.db, repositoryId, "failed");
242
+ }
243
+ }
244
+ else if (processKey === "git.project.update") {
245
+ recordManagementScan(this.db, repositoryId, options.errored ? "failed" : "ok");
246
+ }
247
+ }
248
+ catch (err) {
249
+ logger.error({ err, repositoryId, processKey, errored: options.errored }, "Failed to finalize repository management state");
250
+ }
251
+ }
252
+ hasRecentProactiveForwardContext(event, sessionId) {
253
+ if (!event.isDm || isDocsQAMessage(event))
254
+ return false;
255
+ const activeRows = this.db
256
+ .prepare(`SELECT metadata
257
+ FROM messages
258
+ WHERE session_id = ?
259
+ ORDER BY timestamp DESC, id DESC
260
+ LIMIT ?`)
261
+ .all(sessionId, this.config.historyInjectionMaxMessages ?? 20);
262
+ if (activeRows.some((row) => isProactiveForwardMetadata(parseMessageMetadata(row.metadata)))) {
263
+ return true;
264
+ }
265
+ const windowMinutes = this.config.historyOtherSurfaceWindowMinutes ?? 1440;
266
+ if (!Number.isFinite(windowMinutes) || windowMinutes <= 0)
267
+ return false;
268
+ const { scope } = getConversationScope({
269
+ platform: event.platform,
270
+ channel: event.channel,
271
+ threadId: event.threadId,
272
+ isDm: true,
273
+ intent: event.intent,
274
+ });
275
+ const other = scope === OWNER_DM_SCOPE
276
+ ? { scope: DASHBOARD_CHAT_SCOPE, scopeKey: DASHBOARD_SCOPE_KEY }
277
+ : scope === DASHBOARD_CHAT_SCOPE
278
+ ? { scope: OWNER_DM_SCOPE, scopeKey: OWNER_SCOPE_KEY }
279
+ : null;
280
+ if (!other)
281
+ return false;
282
+ const sinceUtc = formatSqliteDatetime(new Date(Date.now() - windowMinutes * 60_000));
283
+ const otherRows = this.db
284
+ .prepare(`SELECT m.metadata
285
+ FROM messages m
286
+ JOIN conversation_sessions s ON m.session_id = s.id
287
+ WHERE s.scope = ?
288
+ AND s.scope_key = ?
289
+ AND s.status = 'active'
290
+ AND m.timestamp >= ?
291
+ ORDER BY m.timestamp DESC, m.id DESC
292
+ LIMIT 60`)
293
+ .all(other.scope, other.scopeKey, sinceUtc);
294
+ return otherRows.some((row) => isProactiveForwardMetadata(parseMessageMetadata(row.metadata)));
295
+ }
296
+ logProactiveForwardDisavowalIfMatched(sessionId, reply) {
297
+ const matchedPattern = PROACTIVE_FORWARD_DISAVOWAL_PATTERNS.find((pattern) => pattern.test(reply));
298
+ if (!matchedPattern)
299
+ return;
300
+ try {
301
+ this.db
302
+ .prepare(`INSERT INTO agent_actions (
303
+ action_type, trigger, result, detail, started_at
304
+ )
305
+ VALUES (
306
+ 'proactive_forward_disavowed',
307
+ 'reactive',
308
+ 'success',
309
+ ?,
310
+ CURRENT_TIMESTAMP
311
+ )`)
312
+ .run(JSON.stringify({
313
+ sessionId,
314
+ replyExcerpt: reply.slice(0, 240),
315
+ matchedPattern: matchedPattern.source,
316
+ }));
317
+ }
318
+ catch (err) {
319
+ logger.warn({ err, sessionId }, "Failed to log proactive forward disavowal");
320
+ }
321
+ }
322
+ formatSummaryRole(message) {
323
+ const metadata = parseMessageMetadata(message.metadata);
324
+ if (message.role === "assistant" && isProactiveForwardMetadata(metadata)) {
325
+ return "assistant (forwarded from autonomous run)";
326
+ }
327
+ return message.role;
328
+ }
329
+ buildCrossSessionConversationHistory(event) {
330
+ const { scope, scopeKey } = getConversationScope({
331
+ platform: event.platform,
332
+ channel: event.channel,
333
+ threadId: event.threadId,
334
+ isDm: event.isDm,
335
+ intent: event.intent,
336
+ });
337
+ const summary = event.isDm && scope === OWNER_DM_SCOPE
338
+ ? this.sessionMgr.getPreviousDmSummary(OWNER_SCOPE_KEY)
339
+ : null;
340
+ const statement = this.hasMessageBackendMetadataColumns
341
+ ? this.db.prepare(`SELECT m.role, m.content, m.timestamp, m.metadata, m.backend, m.model_id
342
+ FROM messages m
343
+ JOIN conversation_sessions s ON m.session_id = s.id
344
+ WHERE s.scope = ? AND s.scope_key = ?
345
+ ORDER BY m.timestamp DESC, m.id DESC
346
+ LIMIT 20`)
347
+ : this.db.prepare(`SELECT m.role, m.content, m.timestamp, m.metadata,
348
+ NULL AS backend,
349
+ NULL AS model_id
350
+ FROM messages m
351
+ JOIN conversation_sessions s ON m.session_id = s.id
352
+ WHERE s.scope = ? AND s.scope_key = ?
353
+ ORDER BY m.timestamp DESC, m.id DESC
354
+ LIMIT 20`);
355
+ const rows = statement
356
+ .all(scope, scopeKey);
357
+ if (!summary && rows.length === 0) {
358
+ return null;
359
+ }
360
+ const parts = ["## Previous conversation in this thread"];
361
+ if (summary) {
362
+ parts.push("", "### Earlier summary", summary);
363
+ }
364
+ if (rows.length > 0) {
365
+ parts.push("", "### Recent messages (oldest first)");
366
+ for (const row of rows.reverse()) {
367
+ const tag = row.backend
368
+ ? `[${row.role}/${row.backend}:${row.model_id ?? "?"}]`
369
+ : `[${row.role}/user]`;
370
+ const forwardSuffix = row.role === "assistant"
371
+ && isProactiveForwardMetadata(parseMessageMetadata(row.metadata))
372
+ ? " (forwarded from autonomous run)"
373
+ : "";
374
+ parts.push(`${tag}${forwardSuffix}: ${row.content}`);
375
+ }
376
+ }
377
+ return parts.join("\n");
378
+ }
379
+ shouldNotify(event) {
380
+ if (isMessageEvent(event))
381
+ return true;
382
+ if (isScheduledEvent(event)) {
383
+ // Dashboard-triggered tasks (e.g. regenerate) already show status
384
+ // in the UI — suppress DM notification to avoid noisy messages.
385
+ // Both scheduled.task and scheduled.dm share this gate; the
386
+ // briefing path's final assistant turn IS the DM.
387
+ const ctx = event.taskContext;
388
+ if (ctx?.triggeredBy === "dashboard")
389
+ return false;
390
+ return true;
391
+ }
392
+ // Routine events are silent-by-default: result.output is an internal
393
+ // agent log, never forwarded as a user notification. Routines reach
394
+ // the user only via explicit POST /api/notify from their prompt. Do
395
+ // not re-add routines here — the routine_protocol header injected by
396
+ // the context-builder carries this rule to the agent.
397
+ return false;
398
+ }
399
+ /**
400
+ * Autonomous "observer" events: external-change detections that the
401
+ * daemon pushes into the pipeline, as opposed to user-initiated
402
+ * messages, cron routines, or scheduled tasks. Used for the
403
+ * contextUpdated observability log in processResult.
404
+ */
405
+ isObserverEvent(event) {
406
+ return ((isRoutineEvent(event) && event.routine === "hourly_check") ||
407
+ event.type.startsWith("calendar.") ||
408
+ event.type === "schedule.approaching" ||
409
+ event.type.startsWith("notion.") ||
410
+ event.type.startsWith("github.") ||
411
+ event.type.startsWith("git."));
412
+ }
413
+ }
414
+ //# sourceMappingURL=dispatcher-result-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher-result-processor.js","sourceRoot":"","sources":["../../src/core/dispatcher-result-processor.ts"],"names":[],"mappings":"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"}