@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.
- package/LICENSE +21 -0
- package/dist/adapters/whatsapp-adapter.d.ts.map +1 -1
- package/dist/adapters/whatsapp-adapter.js +0 -1
- package/dist/adapters/whatsapp-adapter.js.map +1 -1
- package/dist/api/integration-route-gate.d.ts +15 -11
- package/dist/api/integration-route-gate.d.ts.map +1 -1
- package/dist/api/integration-route-gate.js +60 -23
- package/dist/api/integration-route-gate.js.map +1 -1
- package/dist/api/json-body.d.ts +22 -7
- package/dist/api/json-body.d.ts.map +1 -1
- package/dist/api/json-body.js +27 -8
- package/dist/api/json-body.js.map +1 -1
- package/dist/api/routes/agent.d.ts.map +1 -1
- package/dist/api/routes/agent.js +18 -0
- package/dist/api/routes/agent.js.map +1 -1
- package/dist/api/routes/backends.d.ts.map +1 -1
- package/dist/api/routes/backends.js +96 -1
- package/dist/api/routes/backends.js.map +1 -1
- package/dist/api/routes/books.js +1 -1
- package/dist/api/routes/books.js.map +1 -1
- package/dist/api/routes/context.d.ts.map +1 -1
- package/dist/api/routes/context.js +13 -1
- package/dist/api/routes/context.js.map +1 -1
- package/dist/api/routes/dashboard.d.ts.map +1 -1
- package/dist/api/routes/dashboard.js +75 -5
- package/dist/api/routes/dashboard.js.map +1 -1
- package/dist/api/routes/github.d.ts.map +1 -1
- package/dist/api/routes/github.js +38 -5
- package/dist/api/routes/github.js.map +1 -1
- package/dist/api/routes/integrations.d.ts +35 -6
- package/dist/api/routes/integrations.d.ts.map +1 -1
- package/dist/api/routes/integrations.js +191 -16
- package/dist/api/routes/integrations.js.map +1 -1
- package/dist/api/routes/mail.d.ts.map +1 -1
- package/dist/api/routes/mail.js +112 -46
- package/dist/api/routes/mail.js.map +1 -1
- package/dist/api/routes/observations.d.ts.map +1 -1
- package/dist/api/routes/observations.js +161 -8
- package/dist/api/routes/observations.js.map +1 -1
- package/dist/api/routes/setup-migrate.d.ts +9 -1
- package/dist/api/routes/setup-migrate.d.ts.map +1 -1
- package/dist/api/routes/setup-migrate.js +4 -2
- package/dist/api/routes/setup-migrate.js.map +1 -1
- package/dist/api/routes/skills.d.ts.map +1 -1
- package/dist/api/routes/skills.js +39 -1
- package/dist/api/routes/skills.js.map +1 -1
- package/dist/api/routes/voice.d.ts.map +1 -1
- package/dist/api/routes/voice.js +154 -14
- package/dist/api/routes/voice.js.map +1 -1
- package/dist/bootstrap/adapters.d.ts +109 -0
- package/dist/bootstrap/adapters.d.ts.map +1 -0
- package/dist/bootstrap/adapters.js +237 -0
- package/dist/bootstrap/adapters.js.map +1 -0
- package/dist/bootstrap/catchup.d.ts +23 -0
- package/dist/bootstrap/catchup.d.ts.map +1 -0
- package/dist/bootstrap/catchup.js +124 -0
- package/dist/bootstrap/catchup.js.map +1 -0
- package/dist/bootstrap/schedule-helpers.d.ts +18 -0
- package/dist/bootstrap/schedule-helpers.d.ts.map +1 -0
- package/dist/bootstrap/schedule-helpers.js +96 -0
- package/dist/bootstrap/schedule-helpers.js.map +1 -0
- package/dist/bootstrap/services.d.ts +60 -0
- package/dist/bootstrap/services.d.ts.map +1 -0
- package/dist/bootstrap/services.js +209 -0
- package/dist/bootstrap/services.js.map +1 -0
- package/dist/core/backends/backend-router.d.ts +23 -0
- package/dist/core/backends/backend-router.d.ts.map +1 -1
- package/dist/core/backends/backend-router.js +48 -3
- package/dist/core/backends/backend-router.js.map +1 -1
- package/dist/core/backends/claude-auth.d.ts +70 -0
- package/dist/core/backends/claude-auth.d.ts.map +1 -0
- package/dist/core/backends/claude-auth.js +198 -0
- package/dist/core/backends/claude-auth.js.map +1 -0
- package/dist/core/backends/claude-code-core.d.ts +47 -119
- package/dist/core/backends/claude-code-core.d.ts.map +1 -1
- package/dist/core/backends/claude-code-core.js +112 -1565
- package/dist/core/backends/claude-code-core.js.map +1 -1
- package/dist/core/backends/claude-delegated.d.ts +86 -0
- package/dist/core/backends/claude-delegated.d.ts.map +1 -0
- package/dist/core/backends/claude-delegated.js +801 -0
- package/dist/core/backends/claude-delegated.js.map +1 -0
- package/dist/core/backends/claude-errors.d.ts +39 -0
- package/dist/core/backends/claude-errors.d.ts.map +1 -0
- package/dist/core/backends/claude-errors.js +71 -0
- package/dist/core/backends/claude-errors.js.map +1 -0
- package/dist/core/backends/claude-probe.d.ts +103 -0
- package/dist/core/backends/claude-probe.d.ts.map +1 -0
- package/dist/core/backends/claude-probe.js +336 -0
- package/dist/core/backends/claude-probe.js.map +1 -0
- package/dist/core/backends/claude-tool-collection.d.ts +135 -0
- package/dist/core/backends/claude-tool-collection.d.ts.map +1 -0
- package/dist/core/backends/claude-tool-collection.js +831 -0
- package/dist/core/backends/claude-tool-collection.js.map +1 -0
- package/dist/core/backends/gemini-cli-core.d.ts +21 -0
- package/dist/core/backends/gemini-cli-core.d.ts.map +1 -1
- package/dist/core/backends/gemini-cli-core.js +84 -6
- package/dist/core/backends/gemini-cli-core.js.map +1 -1
- package/dist/core/backends/prompt-utils.d.ts +1 -0
- package/dist/core/backends/prompt-utils.d.ts.map +1 -1
- package/dist/core/backends/prompt-utils.js +60 -3
- package/dist/core/backends/prompt-utils.js.map +1 -1
- package/dist/core/context-builder.d.ts +36 -12
- package/dist/core/context-builder.d.ts.map +1 -1
- package/dist/core/context-builder.js +179 -89
- package/dist/core/context-builder.js.map +1 -1
- package/dist/core/dispatcher-date-utils.d.ts +49 -0
- package/dist/core/dispatcher-date-utils.d.ts.map +1 -0
- package/dist/core/dispatcher-date-utils.js +132 -0
- package/dist/core/dispatcher-date-utils.js.map +1 -0
- package/dist/core/dispatcher-error-handling.d.ts +159 -0
- package/dist/core/dispatcher-error-handling.d.ts.map +1 -0
- package/dist/core/dispatcher-error-handling.js +393 -0
- package/dist/core/dispatcher-error-handling.js.map +1 -0
- package/dist/core/dispatcher-hourly-check.d.ts +150 -0
- package/dist/core/dispatcher-hourly-check.d.ts.map +1 -0
- package/dist/core/dispatcher-hourly-check.js +665 -0
- package/dist/core/dispatcher-hourly-check.js.map +1 -0
- package/dist/core/dispatcher-message-handler.d.ts +170 -0
- package/dist/core/dispatcher-message-handler.d.ts.map +1 -0
- package/dist/core/dispatcher-message-handler.js +1054 -0
- package/dist/core/dispatcher-message-handler.js.map +1 -0
- package/dist/core/dispatcher-morning-routine.d.ts +169 -0
- package/dist/core/dispatcher-morning-routine.d.ts.map +1 -0
- package/dist/core/dispatcher-morning-routine.js +434 -0
- package/dist/core/dispatcher-morning-routine.js.map +1 -0
- package/dist/core/dispatcher-prompt.d.ts +107 -0
- package/dist/core/dispatcher-prompt.d.ts.map +1 -0
- package/dist/core/dispatcher-prompt.js +227 -0
- package/dist/core/dispatcher-prompt.js.map +1 -0
- package/dist/core/dispatcher-repository-helpers.d.ts +39 -0
- package/dist/core/dispatcher-repository-helpers.d.ts.map +1 -0
- package/dist/core/dispatcher-repository-helpers.js +86 -0
- package/dist/core/dispatcher-repository-helpers.js.map +1 -0
- package/dist/core/dispatcher-result-processor.d.ts +145 -0
- package/dist/core/dispatcher-result-processor.d.ts.map +1 -0
- package/dist/core/dispatcher-result-processor.js +414 -0
- package/dist/core/dispatcher-result-processor.js.map +1 -0
- package/dist/core/dispatcher-scheduled-tasks.d.ts +406 -0
- package/dist/core/dispatcher-scheduled-tasks.d.ts.map +1 -0
- package/dist/core/dispatcher-scheduled-tasks.js +998 -0
- package/dist/core/dispatcher-scheduled-tasks.js.map +1 -0
- package/dist/core/dispatcher-types.d.ts +296 -0
- package/dist/core/dispatcher-types.d.ts.map +1 -0
- package/dist/core/dispatcher-types.js +106 -0
- package/dist/core/dispatcher-types.js.map +1 -0
- package/dist/core/dispatcher.d.ts +86 -610
- package/dist/core/dispatcher.d.ts.map +1 -1
- package/dist/core/dispatcher.js +293 -3542
- package/dist/core/dispatcher.js.map +1 -1
- package/dist/core/integration-health.d.ts +18 -10
- package/dist/core/integration-health.d.ts.map +1 -1
- package/dist/core/integration-health.js +31 -1
- package/dist/core/integration-health.js.map +1 -1
- package/dist/core/integration-lifecycle.d.ts +65 -0
- package/dist/core/integration-lifecycle.d.ts.map +1 -1
- package/dist/core/integration-lifecycle.js +167 -16
- package/dist/core/integration-lifecycle.js.map +1 -1
- package/dist/core/integration-main-backend.d.ts +40 -0
- package/dist/core/integration-main-backend.d.ts.map +1 -1
- package/dist/core/integration-main-backend.js +89 -2
- package/dist/core/integration-main-backend.js.map +1 -1
- package/dist/core/management-md.d.ts +51 -17
- package/dist/core/management-md.d.ts.map +1 -1
- package/dist/core/management-md.js +233 -56
- package/dist/core/management-md.js.map +1 -1
- package/dist/core/output-language-policy.d.ts +74 -0
- package/dist/core/output-language-policy.d.ts.map +1 -0
- package/dist/core/output-language-policy.js +194 -0
- package/dist/core/output-language-policy.js.map +1 -0
- package/dist/core/prompts.d.ts +1 -0
- package/dist/core/prompts.d.ts.map +1 -1
- package/dist/core/prompts.js +121 -3
- package/dist/core/prompts.js.map +1 -1
- package/dist/core/repository-management-docs.d.ts +24 -0
- package/dist/core/repository-management-docs.d.ts.map +1 -1
- package/dist/core/repository-management-docs.js +210 -26
- package/dist/core/repository-management-docs.js.map +1 -1
- package/dist/core/routine-acquisition-plan.d.ts +131 -0
- package/dist/core/routine-acquisition-plan.d.ts.map +1 -0
- package/dist/core/routine-acquisition-plan.js +268 -0
- package/dist/core/routine-acquisition-plan.js.map +1 -0
- package/dist/core/routine-fetch-window-runner.d.ts +201 -0
- package/dist/core/routine-fetch-window-runner.d.ts.map +1 -0
- package/dist/core/routine-fetch-window-runner.js +661 -0
- package/dist/core/routine-fetch-window-runner.js.map +1 -0
- package/dist/core/routine-windows.d.ts +156 -0
- package/dist/core/routine-windows.d.ts.map +1 -0
- package/dist/core/routine-windows.js +330 -0
- package/dist/core/routine-windows.js.map +1 -0
- package/dist/core/skills-compiler.d.ts +11 -0
- package/dist/core/skills-compiler.d.ts.map +1 -1
- package/dist/core/skills-compiler.js +102 -13
- package/dist/core/skills-compiler.js.map +1 -1
- package/dist/core/skills-manifest.d.ts.map +1 -1
- package/dist/core/skills-manifest.js +26 -0
- package/dist/core/skills-manifest.js.map +1 -1
- package/dist/core/system-reset.d.ts.map +1 -1
- package/dist/core/system-reset.js +25 -2
- package/dist/core/system-reset.js.map +1 -1
- package/dist/db/observations.d.ts +45 -2
- package/dist/db/observations.d.ts.map +1 -1
- package/dist/db/observations.js +112 -14
- package/dist/db/observations.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +13 -25
- package/dist/db/schema.js.map +1 -1
- package/dist/index.js +83 -610
- package/dist/index.js.map +1 -1
- package/dist/observers/delegated-sync-worker.d.ts +45 -2
- package/dist/observers/delegated-sync-worker.d.ts.map +1 -1
- package/dist/observers/delegated-sync-worker.js +71 -21
- package/dist/observers/delegated-sync-worker.js.map +1 -1
- package/dist/observers/mail-poller.d.ts +12 -5
- package/dist/observers/mail-poller.d.ts.map +1 -1
- package/dist/observers/mail-poller.js +36 -14
- package/dist/observers/mail-poller.js.map +1 -1
- package/dist/observers/manager.d.ts +37 -5
- package/dist/observers/manager.d.ts.map +1 -1
- package/dist/observers/manager.js +28 -10
- package/dist/observers/manager.js.map +1 -1
- package/dist/safety/risk-classifier.d.ts.map +1 -1
- package/dist/safety/risk-classifier.js +5 -0
- package/dist/safety/risk-classifier.js.map +1 -1
- package/dist/services/delegated-backend-invoker.d.ts +1 -51
- package/dist/services/delegated-backend-invoker.d.ts.map +1 -1
- package/dist/services/delegated-backend-invoker.js +41 -480
- package/dist/services/delegated-backend-invoker.js.map +1 -1
- package/dist/services/delegated-invoker-audit.d.ts +94 -0
- package/dist/services/delegated-invoker-audit.d.ts.map +1 -0
- package/dist/services/delegated-invoker-audit.js +238 -0
- package/dist/services/delegated-invoker-audit.js.map +1 -0
- package/dist/services/delegated-invoker-cache-hits.d.ts +34 -0
- package/dist/services/delegated-invoker-cache-hits.d.ts.map +1 -0
- package/dist/services/delegated-invoker-cache-hits.js +104 -0
- package/dist/services/delegated-invoker-cache-hits.js.map +1 -0
- package/dist/services/delegated-invoker-janitors.d.ts +28 -0
- package/dist/services/delegated-invoker-janitors.d.ts.map +1 -0
- package/dist/services/delegated-invoker-janitors.js +104 -0
- package/dist/services/delegated-invoker-janitors.js.map +1 -0
- package/dist/services/delegated-invoker-utils.d.ts +42 -0
- package/dist/services/delegated-invoker-utils.d.ts.map +1 -0
- package/dist/services/delegated-invoker-utils.js +100 -0
- package/dist/services/delegated-invoker-utils.js.map +1 -0
- package/dist/services/delegated-task-runtime.d.ts +1 -1
- package/dist/services/delegated-task-runtime.js +1 -1
- package/dist/services/integrations/snapshot-partitions.d.ts +5 -0
- package/dist/services/integrations/snapshot-partitions.d.ts.map +1 -1
- package/dist/services/integrations/snapshot-partitions.js +12 -0
- package/dist/services/integrations/snapshot-partitions.js.map +1 -1
- package/dist/services/voice/transcriber-impl.d.ts.map +1 -1
- package/dist/services/voice/transcriber-impl.js +46 -0
- package/dist/services/voice/transcriber-impl.js.map +1 -1
- 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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"}
|