@ouro.bot/cli 0.1.0-alpha.16 → 0.1.0-alpha.160

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 (165) hide show
  1. package/AdoptionSpecialist.ouro/agent.json +3 -2
  2. package/AdoptionSpecialist.ouro/psyche/SOUL.md +3 -3
  3. package/AdoptionSpecialist.ouro/psyche/identities/monty.md +2 -2
  4. package/README.md +186 -191
  5. package/changelog.json +1081 -0
  6. package/dist/heart/active-work.js +633 -0
  7. package/dist/heart/bridges/manager.js +358 -0
  8. package/dist/heart/bridges/state-machine.js +135 -0
  9. package/dist/heart/bridges/store.js +123 -0
  10. package/dist/heart/commitments.js +105 -0
  11. package/dist/heart/config.js +40 -30
  12. package/dist/heart/core.js +608 -123
  13. package/dist/heart/cross-chat-delivery.js +146 -0
  14. package/dist/heart/daemon/agent-discovery.js +81 -0
  15. package/dist/heart/daemon/agent-service.js +360 -0
  16. package/dist/heart/daemon/auth-flow.js +477 -0
  17. package/dist/heart/daemon/cadence.js +70 -0
  18. package/dist/heart/daemon/daemon-cli.js +2467 -205
  19. package/dist/heart/daemon/daemon-entry.js +131 -4
  20. package/dist/heart/daemon/daemon-health.js +136 -0
  21. package/dist/heart/daemon/daemon-runtime-sync.js +212 -0
  22. package/dist/heart/daemon/daemon-tombstone.js +123 -0
  23. package/dist/heart/daemon/daemon.js +434 -17
  24. package/dist/heart/daemon/habit-migration.js +181 -0
  25. package/dist/heart/daemon/habit-parser.js +119 -0
  26. package/dist/heart/daemon/habit-scheduler.js +369 -0
  27. package/dist/heart/daemon/hatch-animation.js +10 -3
  28. package/dist/heart/daemon/hatch-flow.js +30 -111
  29. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  30. package/dist/heart/daemon/hooks/bundle-meta.js +92 -0
  31. package/dist/heart/daemon/inner-status.js +89 -0
  32. package/dist/heart/daemon/launchd.js +159 -0
  33. package/dist/heart/daemon/log-tailer.js +4 -3
  34. package/dist/heart/daemon/mcp-server.js +591 -0
  35. package/dist/heart/daemon/message-router.js +17 -8
  36. package/dist/heart/daemon/os-cron-deps.js +134 -0
  37. package/dist/heart/daemon/ouro-bot-global-installer.js +128 -0
  38. package/dist/heart/daemon/ouro-path-installer.js +78 -34
  39. package/dist/heart/daemon/ouro-version-manager.js +171 -0
  40. package/dist/heart/daemon/outlook-http.js +307 -0
  41. package/dist/heart/daemon/outlook-read.js +1281 -0
  42. package/dist/heart/daemon/outlook-render.js +1032 -0
  43. package/dist/heart/daemon/outlook-types.js +7 -0
  44. package/dist/heart/daemon/outlook-view.js +194 -0
  45. package/dist/heart/daemon/process-manager.js +75 -0
  46. package/dist/heart/daemon/run-hooks.js +39 -0
  47. package/dist/heart/daemon/runtime-logging.js +58 -15
  48. package/dist/heart/daemon/runtime-metadata.js +219 -0
  49. package/dist/heart/daemon/runtime-mode.js +67 -0
  50. package/dist/heart/daemon/safe-mode.js +161 -0
  51. package/dist/heart/daemon/sense-manager.js +50 -2
  52. package/dist/heart/daemon/session-id-resolver.js +131 -0
  53. package/dist/heart/daemon/skill-management-installer.js +94 -0
  54. package/dist/heart/daemon/socket-client.js +202 -0
  55. package/dist/heart/daemon/specialist-orchestrator.js +2 -2
  56. package/dist/heart/daemon/specialist-prompt.js +13 -8
  57. package/dist/heart/daemon/specialist-tools.js +53 -4
  58. package/dist/heart/daemon/staged-restart.js +114 -0
  59. package/dist/heart/daemon/task-scheduler.js +3 -25
  60. package/dist/heart/daemon/thoughts.js +507 -0
  61. package/dist/heart/daemon/update-checker.js +111 -0
  62. package/dist/heart/daemon/update-hooks.js +138 -0
  63. package/dist/heart/daemon/wrapper-publish-guard.js +86 -0
  64. package/dist/heart/delegation.js +62 -0
  65. package/dist/heart/identity.js +136 -55
  66. package/dist/heart/kicks.js +2 -20
  67. package/dist/heart/migrate-config.js +127 -0
  68. package/dist/heart/model-capabilities.js +48 -0
  69. package/dist/heart/obligations.js +197 -0
  70. package/dist/heart/progress-story.js +42 -0
  71. package/dist/heart/provider-failover.js +88 -0
  72. package/dist/heart/provider-ping.js +172 -0
  73. package/dist/heart/providers/anthropic-token.js +163 -0
  74. package/dist/heart/providers/anthropic.js +196 -36
  75. package/dist/heart/providers/azure.js +116 -10
  76. package/dist/heart/providers/github-copilot.js +157 -0
  77. package/dist/heart/providers/minimax.js +33 -3
  78. package/dist/heart/providers/openai-codex.js +51 -16
  79. package/dist/heart/session-activity.js +172 -0
  80. package/dist/heart/session-recall.js +216 -0
  81. package/dist/heart/streaming.js +117 -33
  82. package/dist/heart/target-resolution.js +127 -0
  83. package/dist/heart/tool-activity-callbacks.js +36 -0
  84. package/dist/heart/tool-description.js +135 -0
  85. package/dist/heart/tool-loop.js +200 -0
  86. package/dist/heart/turn-coordinator.js +28 -0
  87. package/dist/mind/associative-recall.js +122 -32
  88. package/dist/mind/bundle-manifest.js +14 -0
  89. package/dist/mind/context.js +125 -14
  90. package/dist/mind/{memory.js → diary.js} +70 -56
  91. package/dist/mind/first-impressions.js +16 -2
  92. package/dist/mind/friends/channel.js +56 -0
  93. package/dist/mind/friends/group-context.js +144 -0
  94. package/dist/mind/friends/store-file.js +19 -0
  95. package/dist/mind/friends/trust-explanation.js +74 -0
  96. package/dist/mind/friends/types.js +8 -0
  97. package/dist/mind/journal-index.js +161 -0
  98. package/dist/mind/obligation-steering.js +221 -0
  99. package/dist/mind/obligations.js +134 -0
  100. package/dist/mind/pending.js +76 -9
  101. package/dist/mind/phrases.js +1 -0
  102. package/dist/mind/prompt.js +651 -91
  103. package/dist/mind/token-estimate.js +8 -12
  104. package/dist/nerves/cli-logging.js +15 -2
  105. package/dist/nerves/coverage/run-artifacts.js +1 -1
  106. package/dist/nerves/event-buffer.js +111 -0
  107. package/dist/nerves/index.js +63 -3
  108. package/dist/nerves/observation.js +20 -0
  109. package/dist/nerves/runtime.js +5 -1
  110. package/dist/repertoire/ado-semantic.js +6 -0
  111. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  112. package/dist/repertoire/coding/context-pack.js +254 -0
  113. package/dist/repertoire/coding/feedback.js +301 -0
  114. package/dist/repertoire/coding/index.js +4 -1
  115. package/dist/repertoire/coding/manager.js +210 -4
  116. package/dist/repertoire/coding/spawner.js +58 -12
  117. package/dist/repertoire/coding/tools.js +176 -4
  118. package/dist/repertoire/guardrails.js +291 -0
  119. package/dist/repertoire/mcp-client.js +254 -0
  120. package/dist/repertoire/mcp-manager.js +198 -0
  121. package/dist/repertoire/skills.js +14 -23
  122. package/dist/repertoire/tasks/board.js +43 -5
  123. package/dist/repertoire/tasks/fix.js +182 -0
  124. package/dist/repertoire/tasks/index.js +28 -10
  125. package/dist/repertoire/tasks/lifecycle.js +2 -2
  126. package/dist/repertoire/tasks/parser.js +3 -2
  127. package/dist/repertoire/tasks/scanner.js +194 -37
  128. package/dist/repertoire/tasks/transitions.js +11 -28
  129. package/dist/repertoire/tools-base.js +992 -273
  130. package/dist/repertoire/tools-bluebubbles.js +94 -0
  131. package/dist/repertoire/tools-github.js +1 -6
  132. package/dist/repertoire/tools-teams.js +12 -59
  133. package/dist/repertoire/tools.js +281 -101
  134. package/dist/scripts/claude-code-hook.js +41 -0
  135. package/dist/scripts/claude-code-stop-hook.js +47 -0
  136. package/dist/senses/attention-queue.js +97 -0
  137. package/dist/senses/bluebubbles-client.js +258 -5
  138. package/dist/senses/bluebubbles-entry.js +2 -0
  139. package/dist/senses/bluebubbles-inbound-log.js +109 -0
  140. package/dist/senses/bluebubbles-media.js +339 -0
  141. package/dist/senses/bluebubbles-model.js +12 -4
  142. package/dist/senses/bluebubbles-mutation-log.js +45 -5
  143. package/dist/senses/bluebubbles-runtime-state.js +109 -0
  144. package/dist/senses/bluebubbles-session-cleanup.js +72 -0
  145. package/dist/senses/bluebubbles.js +1040 -45
  146. package/dist/senses/cli-entry.js +1 -1
  147. package/dist/senses/cli-layout.js +187 -0
  148. package/dist/senses/cli.js +419 -152
  149. package/dist/senses/commands.js +38 -1
  150. package/dist/senses/continuity.js +94 -0
  151. package/dist/senses/habit-turn-message.js +108 -0
  152. package/dist/senses/inner-dialog-worker.js +112 -19
  153. package/dist/senses/inner-dialog.js +592 -84
  154. package/dist/senses/pipeline.js +502 -0
  155. package/dist/senses/shared-turn.js +196 -0
  156. package/dist/senses/surface-tool.js +95 -0
  157. package/dist/senses/teams.js +667 -120
  158. package/dist/senses/trust-gate.js +112 -2
  159. package/package.json +12 -4
  160. package/skills/configure-dev-tools.md +81 -0
  161. package/subagents/README.md +4 -70
  162. package/dist/heart/daemon/subagent-installer.js +0 -134
  163. package/subagents/work-doer.md +0 -233
  164. package/subagents/work-merger.md +0 -624
  165. package/subagents/work-planner.md +0 -373
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startOutlookHttpServer = startOutlookHttpServer;
37
+ const fs = __importStar(require("fs"));
38
+ const http = __importStar(require("http"));
39
+ const path = __importStar(require("path"));
40
+ const runtime_1 = require("../../nerves/runtime");
41
+ const outlook_read_1 = require("./outlook-read");
42
+ const outlook_render_1 = require("./outlook-render");
43
+ function createSseBroadcaster() {
44
+ let nextId = 1;
45
+ const clients = new Set();
46
+ function add(response) {
47
+ const client = { id: nextId++, response };
48
+ clients.add(client);
49
+ response.on("close", () => clients.delete(client));
50
+ return client;
51
+ }
52
+ function broadcast(event, data = {}) {
53
+ const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
54
+ for (const client of clients) {
55
+ try {
56
+ client.response.write(payload);
57
+ /* v8 ignore start */
58
+ }
59
+ catch {
60
+ clients.delete(client);
61
+ }
62
+ /* v8 ignore stop */
63
+ }
64
+ }
65
+ function disconnectAll() {
66
+ for (const client of clients) {
67
+ try {
68
+ client.response.end();
69
+ /* v8 ignore start */
70
+ }
71
+ catch {
72
+ /* already closed */
73
+ }
74
+ /* v8 ignore stop */
75
+ }
76
+ clients.clear();
77
+ }
78
+ return { add, broadcast, disconnectAll };
79
+ }
80
+ /* v8 ignore start — filesystem watcher, tested via integration */
81
+ function createBundleWatcher(bundlesRoot, onChange) {
82
+ const watchers = [];
83
+ let debounceTimer = null;
84
+ const DEBOUNCE_MS = 500;
85
+ function debouncedOnChange() {
86
+ if (debounceTimer)
87
+ clearTimeout(debounceTimer);
88
+ debounceTimer = setTimeout(onChange, DEBOUNCE_MS);
89
+ }
90
+ try {
91
+ if (fs.existsSync(bundlesRoot)) {
92
+ const watcher = fs.watch(bundlesRoot, { recursive: true }, debouncedOnChange);
93
+ watchers.push(watcher);
94
+ }
95
+ }
96
+ catch {
97
+ // watch not available — SSE will rely on manual broadcast
98
+ }
99
+ return {
100
+ stop() {
101
+ if (debounceTimer)
102
+ clearTimeout(debounceTimer);
103
+ for (const w of watchers)
104
+ try {
105
+ w.close();
106
+ }
107
+ catch { /* ignore */ }
108
+ watchers.length = 0;
109
+ },
110
+ };
111
+ }
112
+ /* v8 ignore stop */
113
+ function writeJson(response, statusCode, payload) {
114
+ response.writeHead(statusCode, { "content-type": "application/json; charset=utf-8" });
115
+ response.end(`${JSON.stringify(payload, null, 2)}\n`);
116
+ }
117
+ function writeHtml(response, html) {
118
+ response.writeHead(200, { "content-type": "text/html; charset=utf-8" });
119
+ response.end(html);
120
+ }
121
+ function normalizePath(urlValue = "/") {
122
+ const parsed = new URL(urlValue, "http://127.0.0.1");
123
+ const normalizedPath = parsed.pathname.replace(/\/+$/, "");
124
+ if (normalizedPath.length === 0)
125
+ return "/";
126
+ return normalizedPath;
127
+ }
128
+ async function startOutlookHttpServer(options = {}) {
129
+ const host = options.host ?? "127.0.0.1";
130
+ const port = options.port ?? 0;
131
+ const bundlesRoot = options.bundlesRoot;
132
+ const opts = bundlesRoot ? { bundlesRoot } : undefined;
133
+ const readMachineState = options.readMachineState ?? (() => (0, outlook_read_1.readOutlookMachineState)(opts));
134
+ const readMachineView = options.readMachineView;
135
+ /* v8 ignore start */
136
+ const readAgentState = options.readAgentState ?? ((agentName) => {
137
+ if (opts)
138
+ return (0, outlook_read_1.readOutlookAgentState)(agentName, opts);
139
+ return (0, outlook_read_1.readOutlookAgentState)(agentName);
140
+ });
141
+ /* v8 ignore stop */
142
+ const readAgentView = options.readAgentView;
143
+ const renderApp = options.renderApp ?? outlook_render_1.renderOutlookApp;
144
+ /* v8 ignore start — default hook wiring, tested via integration */
145
+ const agentRoot = (agentName) => {
146
+ const base = bundlesRoot ?? "";
147
+ return path.join(base, `${agentName}.ouro`);
148
+ };
149
+ const hooks = {
150
+ readAgentSessions: options.readAgentSessions ?? ((agentName) => (0, outlook_read_1.readSessionInventory)(agentName, bundlesRoot ? { bundlesRoot } : undefined)),
151
+ readAgentTranscript: options.readAgentTranscript ?? ((agentName, friendId, channel, key) => (0, outlook_read_1.readSessionTranscript)(agentName, friendId, channel, key, bundlesRoot ? { bundlesRoot } : undefined)),
152
+ readAgentCoding: options.readAgentCoding ?? ((agentName) => (0, outlook_read_1.readCodingDeep)(agentRoot(agentName))),
153
+ readAgentAttention: options.readAgentAttention ?? ((agentName) => (0, outlook_read_1.readAttentionView)(agentName, bundlesRoot ? { bundlesRoot } : undefined)),
154
+ readAgentBridges: options.readAgentBridges ?? ((agentName) => (0, outlook_read_1.readBridgeInventory)(agentRoot(agentName))),
155
+ readAgentMemory: options.readAgentMemory ?? ((agentName) => (0, outlook_read_1.readMemoryView)(agentRoot(agentName))),
156
+ readAgentFriends: options.readAgentFriends ?? ((agentName) => (0, outlook_read_1.readFriendView)(agentName, bundlesRoot ? { bundlesRoot } : undefined)),
157
+ readAgentHabits: options.readAgentHabits ?? ((agentName) => (0, outlook_read_1.readHabitView)(agentRoot(agentName))),
158
+ readDaemonHealth: options.readDaemonHealth ?? (() => (0, outlook_read_1.readDaemonHealthDeep)(options.healthPath)),
159
+ readLogs: options.readLogs ?? (() => (0, outlook_read_1.readLogView)(options.logPath ?? null)),
160
+ };
161
+ /* v8 ignore stop */
162
+ const sse = createSseBroadcaster();
163
+ /* v8 ignore start — watcher callback fires on filesystem changes */
164
+ const bundleWatcher = bundlesRoot ? createBundleWatcher(bundlesRoot, () => {
165
+ sse.broadcast("state-changed", { at: new Date().toISOString() });
166
+ }) : null;
167
+ /* v8 ignore stop */
168
+ const server = http.createServer((request, response) => {
169
+ const pathname = normalizePath(request.url);
170
+ const origin = `http://${host}:${server.address().port}`;
171
+ if (pathname === "/outlook/api/events") {
172
+ response.writeHead(200, { "content-type": "text/event-stream", "cache-control": "no-cache", "connection": "keep-alive", "access-control-allow-origin": "*" });
173
+ response.write(":ok\n\n");
174
+ sse.add(response);
175
+ return;
176
+ }
177
+ if (pathname === "/outlook") {
178
+ const machine = readMachineState();
179
+ const machineView = readMachineView?.({ origin, machine });
180
+ writeHtml(response, renderApp({ origin, machine, machineView }));
181
+ return;
182
+ }
183
+ if (pathname === "/outlook/api/machine") {
184
+ const machine = readMachineState();
185
+ const machineView = readMachineView?.({ origin, machine });
186
+ writeJson(response, 200, machineView ?? machine);
187
+ return;
188
+ }
189
+ if (pathname === "/outlook/api/machine/health") {
190
+ const health = hooks.readDaemonHealth();
191
+ writeJson(response, 200, health ?? { status: "unavailable" });
192
+ return;
193
+ }
194
+ if (pathname === "/outlook/api/machine/logs") {
195
+ writeJson(response, 200, hooks.readLogs());
196
+ return;
197
+ }
198
+ // Agent-level endpoints: /outlook/api/agents/:agent[/:surface[/:params...]]
199
+ const agentMatch = /^\/outlook\/api\/agents\/([^/]+)(?:\/(.+))?$/.exec(pathname);
200
+ if (agentMatch) {
201
+ const agent = decodeURIComponent(agentMatch[1]);
202
+ const surface = agentMatch[2] ?? null;
203
+ if (!surface) {
204
+ const view = readAgentView?.(agent);
205
+ if (view) {
206
+ writeJson(response, 200, view);
207
+ return;
208
+ }
209
+ const state = readAgentState(agent);
210
+ if (!state) {
211
+ writeJson(response, 404, { ok: false, error: `unknown agent: ${agent}` });
212
+ return;
213
+ }
214
+ writeJson(response, 200, state);
215
+ return;
216
+ }
217
+ if (surface === "sessions") {
218
+ writeJson(response, 200, hooks.readAgentSessions(agent));
219
+ return;
220
+ }
221
+ const transcriptMatch = /^sessions\/([^/]+)\/([^/]+)\/([^/]+)$/.exec(surface);
222
+ if (transcriptMatch) {
223
+ const friendId = decodeURIComponent(transcriptMatch[1]);
224
+ const channel = decodeURIComponent(transcriptMatch[2]);
225
+ const key = decodeURIComponent(transcriptMatch[3]);
226
+ const transcript = hooks.readAgentTranscript(agent, friendId, channel, key);
227
+ if (!transcript) {
228
+ writeJson(response, 404, { ok: false, error: "session not found" });
229
+ return;
230
+ }
231
+ writeJson(response, 200, transcript);
232
+ return;
233
+ }
234
+ if (surface === "coding") {
235
+ writeJson(response, 200, hooks.readAgentCoding(agent));
236
+ return;
237
+ }
238
+ if (surface === "attention") {
239
+ writeJson(response, 200, hooks.readAgentAttention(agent));
240
+ return;
241
+ }
242
+ if (surface === "bridges") {
243
+ writeJson(response, 200, hooks.readAgentBridges(agent));
244
+ return;
245
+ }
246
+ if (surface === "memory") {
247
+ writeJson(response, 200, hooks.readAgentMemory(agent));
248
+ return;
249
+ }
250
+ if (surface === "friends") {
251
+ writeJson(response, 200, hooks.readAgentFriends(agent));
252
+ return;
253
+ }
254
+ /* v8 ignore start — desk prefs + needs-me use direct reads */
255
+ if (surface === "desk-prefs") {
256
+ writeJson(response, 200, (0, outlook_read_1.readDeskPrefs)(agentRoot(agent)));
257
+ return;
258
+ }
259
+ if (surface === "needs-me") {
260
+ writeJson(response, 200, (0, outlook_read_1.readNeedsMeView)(agent, opts));
261
+ return;
262
+ }
263
+ /* v8 ignore stop */
264
+ if (surface === "habits") {
265
+ writeJson(response, 200, hooks.readAgentHabits(agent));
266
+ return;
267
+ }
268
+ if (surface === "inner-transcript") {
269
+ const transcript = hooks.readAgentTranscript(agent, "self", "inner", "dialog");
270
+ writeJson(response, 200, transcript ?? { messageCount: 0, messages: [] });
271
+ return;
272
+ }
273
+ writeJson(response, 404, { ok: false, error: `unknown agent surface: ${surface}` });
274
+ return;
275
+ }
276
+ writeJson(response, 404, { ok: false, error: `unknown outlook path: ${pathname}` });
277
+ });
278
+ await new Promise((resolve, reject) => {
279
+ server.once("error", reject);
280
+ server.listen(port, host, () => resolve());
281
+ });
282
+ const address = server.address();
283
+ const origin = `http://${host}:${address.port}`;
284
+ (0, runtime_1.emitNervesEvent)({
285
+ component: "daemon",
286
+ event: "daemon.outlook_http_started",
287
+ message: "started Outlook HTTP server",
288
+ meta: { origin },
289
+ });
290
+ return {
291
+ origin,
292
+ broadcast(event, data) {
293
+ sse.broadcast(event, data);
294
+ },
295
+ async stop() {
296
+ bundleWatcher?.stop();
297
+ sse.disconnectAll();
298
+ await new Promise((resolve) => server.close(() => resolve()));
299
+ (0, runtime_1.emitNervesEvent)({
300
+ component: "daemon",
301
+ event: "daemon.outlook_http_stopped",
302
+ message: "stopped Outlook HTTP server",
303
+ meta: { origin },
304
+ });
305
+ },
306
+ };
307
+ }