@jungjaehoon/mama-os 0.20.1 → 0.22.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 (264) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +12 -4
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +76 -11
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  7. package/dist/agent/code-act/host-bridge.js +88 -3
  8. package/dist/agent/code-act/host-bridge.js.map +1 -1
  9. package/dist/agent/codex-mcp-process.d.ts +1 -0
  10. package/dist/agent/codex-mcp-process.d.ts.map +1 -1
  11. package/dist/agent/codex-mcp-process.js +3 -2
  12. package/dist/agent/codex-mcp-process.js.map +1 -1
  13. package/dist/agent/gateway-tool-executor.d.ts +24 -11
  14. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  15. package/dist/agent/gateway-tool-executor.js +349 -30
  16. package/dist/agent/gateway-tool-executor.js.map +1 -1
  17. package/dist/agent/gateway-tools.md +7 -2
  18. package/dist/agent/model-runner.d.ts +8 -0
  19. package/dist/agent/model-runner.d.ts.map +1 -1
  20. package/dist/agent/model-runner.js.map +1 -1
  21. package/dist/agent/os-agent-capabilities.md +13 -12
  22. package/dist/agent/persistent-cli-adapter.d.ts +6 -0
  23. package/dist/agent/persistent-cli-adapter.d.ts.map +1 -1
  24. package/dist/agent/persistent-cli-adapter.js +21 -10
  25. package/dist/agent/persistent-cli-adapter.js.map +1 -1
  26. package/dist/agent/tool-registry.d.ts.map +1 -1
  27. package/dist/agent/tool-registry.js +33 -2
  28. package/dist/agent/tool-registry.js.map +1 -1
  29. package/dist/agent/types.d.ts +30 -2
  30. package/dist/agent/types.d.ts.map +1 -1
  31. package/dist/agent/types.js.map +1 -1
  32. package/dist/api/graph-api.d.ts.map +1 -1
  33. package/dist/api/graph-api.js +78 -5
  34. package/dist/api/graph-api.js.map +1 -1
  35. package/dist/api/index.d.ts +8 -1
  36. package/dist/api/index.d.ts.map +1 -1
  37. package/dist/api/index.js +18 -12
  38. package/dist/api/index.js.map +1 -1
  39. package/dist/api/operator-handler.d.ts +19 -0
  40. package/dist/api/operator-handler.d.ts.map +1 -0
  41. package/dist/api/operator-handler.js +106 -0
  42. package/dist/api/operator-handler.js.map +1 -0
  43. package/dist/api/operator-summary.d.ts +3 -0
  44. package/dist/api/operator-summary.d.ts.map +1 -0
  45. package/dist/api/operator-summary.js +72 -0
  46. package/dist/api/operator-summary.js.map +1 -0
  47. package/dist/api/operator-tasks-handler.d.ts +7 -0
  48. package/dist/api/operator-tasks-handler.d.ts.map +1 -0
  49. package/dist/api/operator-tasks-handler.js +165 -0
  50. package/dist/api/operator-tasks-handler.js.map +1 -0
  51. package/dist/api/report-handler.d.ts +7 -0
  52. package/dist/api/report-handler.d.ts.map +1 -1
  53. package/dist/api/report-handler.js +30 -0
  54. package/dist/api/report-handler.js.map +1 -1
  55. package/dist/api/report-persistence.d.ts +17 -0
  56. package/dist/api/report-persistence.d.ts.map +1 -0
  57. package/dist/api/report-persistence.js +91 -0
  58. package/dist/api/report-persistence.js.map +1 -0
  59. package/dist/cli/commands/start.d.ts.map +1 -1
  60. package/dist/cli/commands/start.js +402 -250
  61. package/dist/cli/commands/start.js.map +1 -1
  62. package/dist/cli/config/config-manager.d.ts.map +1 -1
  63. package/dist/cli/config/config-manager.js +93 -55
  64. package/dist/cli/config/config-manager.js.map +1 -1
  65. package/dist/cli/config/types.d.ts +17 -2
  66. package/dist/cli/config/types.d.ts.map +1 -1
  67. package/dist/cli/config/types.js +4 -0
  68. package/dist/cli/config/types.js.map +1 -1
  69. package/dist/cli/runtime/agent-loop-init.d.ts +3 -1
  70. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  71. package/dist/cli/runtime/agent-loop-init.js +16 -7
  72. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  73. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  74. package/dist/cli/runtime/api-routes-init.js +503 -259
  75. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  76. package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
  77. package/dist/cli/runtime/api-server-init.js +12 -7
  78. package/dist/cli/runtime/api-server-init.js.map +1 -1
  79. package/dist/cli/runtime/connector-init.d.ts +19 -1
  80. package/dist/cli/runtime/connector-init.d.ts.map +1 -1
  81. package/dist/cli/runtime/connector-init.js +32 -2
  82. package/dist/cli/runtime/connector-init.js.map +1 -1
  83. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  84. package/dist/cli/runtime/gateway-init.js +3 -1
  85. package/dist/cli/runtime/gateway-init.js.map +1 -1
  86. package/dist/cli/runtime/memory-agent-init.d.ts +2 -1
  87. package/dist/cli/runtime/memory-agent-init.d.ts.map +1 -1
  88. package/dist/cli/runtime/memory-agent-init.js +15 -3
  89. package/dist/cli/runtime/memory-agent-init.js.map +1 -1
  90. package/dist/cli/runtime/message-router-config.d.ts +4 -0
  91. package/dist/cli/runtime/message-router-config.d.ts.map +1 -0
  92. package/dist/cli/runtime/message-router-config.js +11 -0
  93. package/dist/cli/runtime/message-router-config.js.map +1 -0
  94. package/dist/cli/runtime/scheduler-init.d.ts.map +1 -1
  95. package/dist/cli/runtime/scheduler-init.js +12 -12
  96. package/dist/cli/runtime/scheduler-init.js.map +1 -1
  97. package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
  98. package/dist/connectors/framework/polling-scheduler.js +53 -2
  99. package/dist/connectors/framework/polling-scheduler.js.map +1 -1
  100. package/dist/connectors/framework/types.d.ts +8 -0
  101. package/dist/connectors/framework/types.d.ts.map +1 -1
  102. package/dist/connectors/kagemusha/query-tools.d.ts.map +1 -1
  103. package/dist/connectors/kagemusha/query-tools.js +14 -3
  104. package/dist/connectors/kagemusha/query-tools.js.map +1 -1
  105. package/dist/connectors/slack/index.d.ts.map +1 -1
  106. package/dist/connectors/slack/index.js +3 -1
  107. package/dist/connectors/slack/index.js.map +1 -1
  108. package/dist/connectors/trello/index.d.ts.map +1 -1
  109. package/dist/connectors/trello/index.js +6 -2
  110. package/dist/connectors/trello/index.js.map +1 -1
  111. package/dist/db/agent-store.d.ts +5 -0
  112. package/dist/db/agent-store.d.ts.map +1 -1
  113. package/dist/db/agent-store.js +6 -3
  114. package/dist/db/agent-store.js.map +1 -1
  115. package/dist/db/migrations/agent-activity-tool-name.d.ts +8 -0
  116. package/dist/db/migrations/agent-activity-tool-name.d.ts.map +1 -0
  117. package/dist/db/migrations/agent-activity-tool-name.js +24 -0
  118. package/dist/db/migrations/agent-activity-tool-name.js.map +1 -0
  119. package/dist/db/migrations/wiki-artifacts.d.ts +3 -0
  120. package/dist/db/migrations/wiki-artifacts.d.ts.map +1 -0
  121. package/dist/db/migrations/wiki-artifacts.js +24 -0
  122. package/dist/db/migrations/wiki-artifacts.js.map +1 -0
  123. package/dist/envelope/run-guard.d.ts +10 -0
  124. package/dist/envelope/run-guard.d.ts.map +1 -0
  125. package/dist/envelope/run-guard.js +19 -0
  126. package/dist/envelope/run-guard.js.map +1 -0
  127. package/dist/gateways/message-router.d.ts.map +1 -1
  128. package/dist/gateways/message-router.js +15 -3
  129. package/dist/gateways/message-router.js.map +1 -1
  130. package/dist/gateways/types.d.ts +4 -0
  131. package/dist/gateways/types.d.ts.map +1 -1
  132. package/dist/multi-agent/agent-event-bus.d.ts +14 -0
  133. package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
  134. package/dist/multi-agent/agent-event-bus.js +34 -0
  135. package/dist/multi-agent/agent-event-bus.js.map +1 -1
  136. package/dist/multi-agent/conductor-persona.js +2 -2
  137. package/dist/multi-agent/dashboard-agent-persona.d.ts +6 -2
  138. package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
  139. package/dist/multi-agent/dashboard-agent-persona.js +65 -32
  140. package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
  141. package/dist/multi-agent/memory-agent-persona.d.ts +1 -1
  142. package/dist/multi-agent/memory-agent-persona.d.ts.map +1 -1
  143. package/dist/multi-agent/memory-agent-persona.js +25 -4
  144. package/dist/multi-agent/memory-agent-persona.js.map +1 -1
  145. package/dist/multi-agent/runtime-process.d.ts +4 -2
  146. package/dist/multi-agent/runtime-process.d.ts.map +1 -1
  147. package/dist/multi-agent/runtime-process.js +7 -4
  148. package/dist/multi-agent/runtime-process.js.map +1 -1
  149. package/dist/multi-agent/types.d.ts +1 -1
  150. package/dist/multi-agent/wiki-agent-persona.d.ts +7 -1
  151. package/dist/multi-agent/wiki-agent-persona.d.ts.map +1 -1
  152. package/dist/multi-agent/wiki-agent-persona.js +82 -68
  153. package/dist/multi-agent/wiki-agent-persona.js.map +1 -1
  154. package/dist/operator/action-verifier.d.ts +50 -0
  155. package/dist/operator/action-verifier.d.ts.map +1 -0
  156. package/dist/operator/action-verifier.js +68 -0
  157. package/dist/operator/action-verifier.js.map +1 -0
  158. package/dist/operator/board-reconcile.d.ts +62 -0
  159. package/dist/operator/board-reconcile.d.ts.map +1 -0
  160. package/dist/operator/board-reconcile.js +160 -0
  161. package/dist/operator/board-reconcile.js.map +1 -0
  162. package/dist/operator/board-slot-instructions.d.ts +26 -0
  163. package/dist/operator/board-slot-instructions.d.ts.map +1 -0
  164. package/dist/operator/board-slot-instructions.js +76 -0
  165. package/dist/operator/board-slot-instructions.js.map +1 -0
  166. package/dist/operator/connector-delta-repo.d.ts +33 -0
  167. package/dist/operator/connector-delta-repo.d.ts.map +1 -0
  168. package/dist/operator/connector-delta-repo.js +0 -0
  169. package/dist/operator/connector-delta-repo.js.map +1 -0
  170. package/dist/operator/mama-memory-port.d.ts +13 -0
  171. package/dist/operator/mama-memory-port.d.ts.map +1 -0
  172. package/dist/operator/mama-memory-port.js +35 -0
  173. package/dist/operator/mama-memory-port.js.map +1 -0
  174. package/dist/operator/operator-interfaces.d.ts +136 -0
  175. package/dist/operator/operator-interfaces.d.ts.map +1 -0
  176. package/dist/operator/operator-interfaces.js +15 -0
  177. package/dist/operator/operator-interfaces.js.map +1 -0
  178. package/dist/operator/operator-trigger-loop.d.ts +119 -0
  179. package/dist/operator/operator-trigger-loop.d.ts.map +1 -0
  180. package/dist/operator/operator-trigger-loop.js +267 -0
  181. package/dist/operator/operator-trigger-loop.js.map +1 -0
  182. package/dist/operator/report-run.d.ts +78 -0
  183. package/dist/operator/report-run.d.ts.map +1 -0
  184. package/dist/operator/report-run.js +141 -0
  185. package/dist/operator/report-run.js.map +1 -0
  186. package/dist/operator/report-scheduler.d.ts +66 -0
  187. package/dist/operator/report-scheduler.d.ts.map +1 -0
  188. package/dist/operator/report-scheduler.js +135 -0
  189. package/dist/operator/report-scheduler.js.map +1 -0
  190. package/dist/operator/situation-report.d.ts +90 -0
  191. package/dist/operator/situation-report.d.ts.map +1 -0
  192. package/dist/operator/situation-report.js +221 -0
  193. package/dist/operator/situation-report.js.map +1 -0
  194. package/dist/operator/task-ledger.d.ts +96 -0
  195. package/dist/operator/task-ledger.d.ts.map +1 -0
  196. package/dist/operator/task-ledger.js +277 -0
  197. package/dist/operator/task-ledger.js.map +1 -0
  198. package/dist/operator/trigger-author.d.ts +45 -0
  199. package/dist/operator/trigger-author.d.ts.map +1 -0
  200. package/dist/operator/trigger-author.js +217 -0
  201. package/dist/operator/trigger-author.js.map +1 -0
  202. package/dist/operator/trigger-evolve.d.ts +31 -0
  203. package/dist/operator/trigger-evolve.d.ts.map +1 -0
  204. package/dist/operator/trigger-evolve.js +51 -0
  205. package/dist/operator/trigger-evolve.js.map +1 -0
  206. package/dist/operator/trigger-fire.d.ts +29 -0
  207. package/dist/operator/trigger-fire.d.ts.map +1 -0
  208. package/dist/operator/trigger-fire.js +41 -0
  209. package/dist/operator/trigger-fire.js.map +1 -0
  210. package/dist/operator/trigger-matcher.d.ts +19 -0
  211. package/dist/operator/trigger-matcher.d.ts.map +1 -0
  212. package/dist/operator/trigger-matcher.js +61 -0
  213. package/dist/operator/trigger-matcher.js.map +1 -0
  214. package/dist/operator/trigger-registry.d.ts +36 -0
  215. package/dist/operator/trigger-registry.d.ts.map +1 -0
  216. package/dist/operator/trigger-registry.js +135 -0
  217. package/dist/operator/trigger-registry.js.map +1 -0
  218. package/dist/operator/trigger-review.d.ts +23 -0
  219. package/dist/operator/trigger-review.d.ts.map +1 -0
  220. package/dist/operator/trigger-review.js +127 -0
  221. package/dist/operator/trigger-review.js.map +1 -0
  222. package/dist/operator/trigger-types.d.ts +84 -0
  223. package/dist/operator/trigger-types.d.ts.map +1 -0
  224. package/dist/operator/trigger-types.js +14 -0
  225. package/dist/operator/trigger-types.js.map +1 -0
  226. package/dist/scheduler/cron-worker.d.ts.map +1 -1
  227. package/dist/scheduler/cron-worker.js +3 -1
  228. package/dist/scheduler/cron-worker.js.map +1 -1
  229. package/dist/security/security-monitor.d.ts.map +1 -1
  230. package/dist/security/security-monitor.js +1 -0
  231. package/dist/security/security-monitor.js.map +1 -1
  232. package/dist/wiki/obsidian-writer.d.ts +1 -1
  233. package/dist/wiki/obsidian-writer.d.ts.map +1 -1
  234. package/dist/wiki/obsidian-writer.js +67 -27
  235. package/dist/wiki/obsidian-writer.js.map +1 -1
  236. package/dist/wiki/path-safety.d.ts +2 -0
  237. package/dist/wiki/path-safety.d.ts.map +1 -0
  238. package/dist/wiki/path-safety.js +40 -0
  239. package/dist/wiki/path-safety.js.map +1 -0
  240. package/dist/wiki/types.d.ts +4 -2
  241. package/dist/wiki/types.d.ts.map +1 -1
  242. package/dist/wiki/types.js +1 -1
  243. package/dist/wiki/types.js.map +1 -1
  244. package/dist/wiki-artifacts/normalization.d.ts +8 -0
  245. package/dist/wiki-artifacts/normalization.d.ts.map +1 -0
  246. package/dist/wiki-artifacts/normalization.js +41 -0
  247. package/dist/wiki-artifacts/normalization.js.map +1 -0
  248. package/dist/wiki-artifacts/types.d.ts +52 -0
  249. package/dist/wiki-artifacts/types.d.ts.map +1 -0
  250. package/dist/wiki-artifacts/types.js +3 -0
  251. package/dist/wiki-artifacts/types.js.map +1 -0
  252. package/dist/wiki-artifacts/wiki-publish-adapter.d.ts +14 -0
  253. package/dist/wiki-artifacts/wiki-publish-adapter.d.ts.map +1 -0
  254. package/dist/wiki-artifacts/wiki-publish-adapter.js +71 -0
  255. package/dist/wiki-artifacts/wiki-publish-adapter.js.map +1 -0
  256. package/package.json +5 -3
  257. package/public/ui/assets/index-CKOJQYXA.css +1 -0
  258. package/public/ui/assets/index-OSgiwL24.js +62 -0
  259. package/public/ui/index.html +14 -0
  260. package/public/ui/theme-init.js +20 -0
  261. package/public/viewer/js/utils/api.js +2 -2
  262. package/public/viewer/src/utils/api.ts +9 -2
  263. package/public/viewer/sw.js +1 -1
  264. package/public/viewer/viewer.html +17 -27
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Generic operator mechanism interfaces (PUBLIC-SAFE).
3
+ *
4
+ * Extracted from Kagemusha's `AgentAwarenessOptions` injection seam
5
+ * (~/project/mama-suite/apps/kagemusha/src/runtime/agent-awareness.ts:199-237).
6
+ * Kagemusha's operator is already dependency-injected; these interfaces genericize the
7
+ * Kagemusha-typed deps so MAMA OS can supply its own implementations.
8
+ *
9
+ * HARD RULE: no personal/business data here. Channel rosters, personas, prompts, Trello,
10
+ * schedule times, tokens are INJECTED via implementations/config, never in this source.
11
+ * See memory: project_kagemusha_port_privacy_boundary.
12
+ */
13
+ /**
14
+ * A raw channel event pulled from the delta source.
15
+ * Ports Kagemusha `DbChannelMessage` (db/channel-message-repo.ts:3-11) - generic, no platform.
16
+ */
17
+ export interface OperatorChannelEvent {
18
+ id: number;
19
+ /** logical channel kind key, e.g. "discord" | "slack" | "telegram" (impl-defined) */
20
+ channel: string;
21
+ /** opaque per-channel conversation id */
22
+ channelId: string;
23
+ /** opaque author id */
24
+ userId: string;
25
+ role: 'user' | 'assistant';
26
+ content: string;
27
+ createdAt: number;
28
+ /** stable provenance id when the source is connector_event_index (TEXT PK); optional. */
29
+ eventIndexId?: string;
30
+ }
31
+ /**
32
+ * Per-channel delta source: "only-new-since-cursor", at-least-once.
33
+ * Ports Kagemusha `ChannelMessageRepository` (db/channel-message-repo.ts:18,25,219).
34
+ */
35
+ export interface ChannelDeltaRepo {
36
+ /** Contiguous, ordered events with id > sinceId, excluding the given channels. */
37
+ getNewSince(sinceId: number, excludeChannels?: string[], limit?: number): OperatorChannelEvent[];
38
+ record(channel: string, channelId: string, userId: string, role: 'user' | 'assistant', content: string, options?: {
39
+ createdAt?: number;
40
+ }): OperatorChannelEvent;
41
+ }
42
+ /** Ports Kagemusha `KagemushaAgentResponse`. */
43
+ export interface OperatorAgentResponse {
44
+ text: string;
45
+ isError?: boolean;
46
+ }
47
+ /**
48
+ * The single serial agent (queue -> one prompt in flight).
49
+ * Ports Kagemusha `KagemushaAgentLoop.chat` (agent/agent-loop.ts:269).
50
+ */
51
+ export interface OperatorAgentLoop {
52
+ chat(userMessage: string, callbacks?: unknown, channel?: string): Promise<OperatorAgentResponse>;
53
+ }
54
+ /**
55
+ * Memory port - bound to mama-core in the MAMA implementation (Task 3).
56
+ * The operator delegates ONLY memory here; operational state stays operator-owned.
57
+ */
58
+ export interface OperatorMemoryPort {
59
+ /** Persist an operational decision/lesson. Binds to mama-core `save`/`saveMemory`. */
60
+ save(input: {
61
+ topic: string;
62
+ content: string;
63
+ scopes?: unknown;
64
+ }): Promise<{
65
+ id: string;
66
+ } | void>;
67
+ /** Semantic recall. Binds to mama-core `recallMemory`/`suggest`. */
68
+ recall(query: string, opts?: {
69
+ limit?: number;
70
+ }): Promise<ReadonlyArray<{
71
+ topic: string;
72
+ content: string;
73
+ similarity?: number;
74
+ }>>;
75
+ }
76
+ /** Operator-owned task. Ports Kagemusha `Task` (runtime/task-store.ts:3). */
77
+ export interface OperatorTask {
78
+ id: number;
79
+ title: string;
80
+ status: string;
81
+ priority: string;
82
+ deadline: number | null;
83
+ createdAt: number;
84
+ updatedAt: number;
85
+ }
86
+ /** Task source - operator-owned operational state. */
87
+ export interface TaskSource {
88
+ getTasks(): OperatorTask[];
89
+ }
90
+ /** Ports Kagemusha `ReportSlotSnapshot` (runtime/report-fallback.ts:1). */
91
+ export interface ReportSlotSnapshot {
92
+ html: string;
93
+ updatedAt: number;
94
+ }
95
+ /** Report sink - the deterministic report board. */
96
+ export interface ReportSink {
97
+ getReportSlots(): Record<string, ReportSlotSnapshot>;
98
+ setReportSlots(slots: Record<string, string>): void;
99
+ }
100
+ /**
101
+ * Output sink - generic outbound send. The personal destination (which chat/room) is
102
+ * bound inside the implementation, never here. Ports Kagemusha `sendTelegram`.
103
+ */
104
+ export interface OutputSink {
105
+ send(text: string): Promise<void>;
106
+ }
107
+ /**
108
+ * Operator schedule/timing config. Values are loaded from `~/.mama/operator/*.json`, NOT
109
+ * hardcoded in source. Ports Kagemusha `KagemushaDigestScheduleConfig` (config/ai-config.ts:12).
110
+ */
111
+ export interface OperatorScheduleConfig {
112
+ /** proactive delta-drain interval */
113
+ deltaDigestIntervalMinutes: number;
114
+ /** local hours (0-23) at which a full report fires */
115
+ fullReportHours: number[];
116
+ /** hourly task-reminder window */
117
+ reminderStartHour: number;
118
+ reminderEndHour: number;
119
+ }
120
+ /**
121
+ * The full injection surface for the operator mechanism.
122
+ * Genericizes Kagemusha `AgentAwarenessOptions` - every field is injected; the mechanism
123
+ * hardcodes nothing personal.
124
+ */
125
+ export interface OperatorRuntimeDeps {
126
+ agentLoop: OperatorAgentLoop;
127
+ channelRepo: ChannelDeltaRepo;
128
+ memory: OperatorMemoryPort | null;
129
+ tasks: TaskSource;
130
+ reports: ReportSink | null;
131
+ output: OutputSink;
132
+ schedule: OperatorScheduleConfig;
133
+ /** logical channel kinds the delta drain excludes (e.g. the reactive owner-DM channel) */
134
+ excludeFromDelta?: string[];
135
+ }
136
+ //# sourceMappingURL=operator-interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-interfaces.d.ts","sourceRoot":"","sources":["../../src/operator/operator-interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Generic operator mechanism interfaces (PUBLIC-SAFE).
4
+ *
5
+ * Extracted from Kagemusha's `AgentAwarenessOptions` injection seam
6
+ * (~/project/mama-suite/apps/kagemusha/src/runtime/agent-awareness.ts:199-237).
7
+ * Kagemusha's operator is already dependency-injected; these interfaces genericize the
8
+ * Kagemusha-typed deps so MAMA OS can supply its own implementations.
9
+ *
10
+ * HARD RULE: no personal/business data here. Channel rosters, personas, prompts, Trello,
11
+ * schedule times, tokens are INJECTED via implementations/config, never in this source.
12
+ * See memory: project_kagemusha_port_privacy_boundary.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ //# sourceMappingURL=operator-interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-interfaces.js","sourceRoot":"","sources":["../../src/operator/operator-interfaces.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * OperatorTriggerLoop - the live runtime of the trigger loop (M1-T3, extended for M2).
3
+ *
4
+ * A setInterval tick (NOT scheduler.addJob, which executes an agent prompt, not a callback;
5
+ * precedent: connector-ingress-manual-memory-commit.ts:742) that:
6
+ * 1. drains new deltas (at-least-once: commit only after processing),
7
+ * 2. matches active triggers -> fires them (recall memoryQuery + surface) + recordFire,
8
+ * 3. every authorEveryNTicks: the agent authors new triggers from the recent-events window,
9
+ * 4. every reviewEveryNTicks: the agent reviews fired triggers (keep/refine/retire),
10
+ * 5. every reportEveryNTicks: the agent composes a situational digest of the window (M2),
11
+ * 6. at configured LOCAL hours: the agent composes a fuller scheduled report (M2).
12
+ *
13
+ * Read-only: recall/surface/log/report-to-owner only, no write-actions (M1/M2). All deps are
14
+ * injected so the pipeline is unit-testable.
15
+ */
16
+ import type { OperatorChannelEvent, OperatorMemoryPort, OutputSink } from './operator-interfaces.js';
17
+ import type { TriggerRecord } from './trigger-types.js';
18
+ import type { TriggerRegistry } from './trigger-registry.js';
19
+ import { type AskAgent } from './trigger-author.js';
20
+ import { type ReviewDecision } from './trigger-review.js';
21
+ import type { ReportSchedule } from './report-scheduler.js';
22
+ /** Structural delta source - satisfied by ConnectorDeltaRepo. */
23
+ export interface DeltaSource {
24
+ drainNew(limit: number): OperatorChannelEvent[];
25
+ commit(events: OperatorChannelEvent[]): void;
26
+ }
27
+ export interface TriggerLoopConfig {
28
+ tickMs: number;
29
+ drainLimit: number;
30
+ authorEveryNTicks: number;
31
+ reviewEveryNTicks: number;
32
+ authorWindowSize: number;
33
+ /** Situational-digest cadence (M1.5 + M2 output leg). Only used when deps.output is set. */
34
+ reportEveryNTicks?: number;
35
+ /**
36
+ * M2.4 freshness nudge debounce (ms). A poll batch that indexes new rows wakes the loop this many
37
+ * ms later (Kagemusha fast-flush port). Default 15000. 0 == tick immediately on nudge.
38
+ */
39
+ nudgeDebounceMs?: number;
40
+ }
41
+ export interface TriggerLoopDeps {
42
+ delta: DeltaSource;
43
+ memory: OperatorMemoryPort;
44
+ registry: TriggerRegistry;
45
+ /** Agent for structured-JSON tasks: authorTriggers (real: askAgentCLI - bare CLI parses reliably). */
46
+ askAgent: AskAgent;
47
+ /**
48
+ * Agent for REPORT composition (M2.2). Bind this to the daemon's persona AgentLoop
49
+ * (SOUL.md system prompt, pinned model, session continuity) - tone/quality come from the
50
+ * generation inputs, and reports deserve the persona path while JSON tasks stay on the
51
+ * bare CLI. Absent -> reports use askAgent (explicit config choice, not a failure fallback).
52
+ */
53
+ reportAsk?: AskAgent;
54
+ /** Agent review of one trigger (real: reviewTriggerCLI). */
55
+ review: (trigger: TriggerRecord, recentContext: string[]) => Promise<ReviewDecision>;
56
+ /** Owner-report sink (real: telegram gateway send). Absent -> loop stays read-only. */
57
+ output?: Pick<OutputSink, 'send'>;
58
+ /** Scheduled full-report cadence (real: ReportScheduler). Absent -> full leg off (M2). */
59
+ reportScheduler?: ReportSchedule;
60
+ /**
61
+ * M2.3: tool-call instructions for the FULL report so the agent self-gathers context.
62
+ * A provider form receives the last successful report's anchor so the heavy gather
63
+ * can scope its delta (`since=<lastSuccessIso>`); it is resolved AT FIRE TIME.
64
+ */
65
+ fullReportSelfGather?: string[] | ((ctx: {
66
+ lastSuccessIso: string | null;
67
+ }) => string[]);
68
+ /**
69
+ * M8: board-reconcile feed. Invoked after commit with connector-qualified
70
+ * channelKey ("<connector>:<channelId>") and bounded delta excerpt lines
71
+ * (each carrying the event id so reconcile task writes can pass
72
+ * source_event_id). Absent -> no reconcile leg.
73
+ */
74
+ onChannelDelta?: (channelKey: string, lines: string[]) => void;
75
+ /** Kagemusha dual output: FULL report also publishes the operator board slots. */
76
+ fullReportBoardLines?: string[];
77
+ config: TriggerLoopConfig;
78
+ log: (line: string) => void;
79
+ }
80
+ export interface TickResult {
81
+ tick: number;
82
+ drained: number;
83
+ fires: number;
84
+ authored: number;
85
+ reviewed: number;
86
+ reported: boolean;
87
+ fullReported: boolean;
88
+ }
89
+ export declare class OperatorTriggerLoop {
90
+ private deps;
91
+ private tickCount;
92
+ private recentEvents;
93
+ private running;
94
+ private nudgeTimer;
95
+ private digest;
96
+ private fullReporter;
97
+ constructor(deps: TriggerLoopDeps);
98
+ tick(): Promise<TickResult>;
99
+ /**
100
+ * M2.4 freshness nudge: wake the loop to tick ~nudgeDebounceMs from now instead of waiting for the
101
+ * next scheduled interval. The connector sink calls this (via a forwarder) whenever a poll batch
102
+ * indexes new rows.
103
+ *
104
+ * Debounced (Kagemusha fast-flush port, agent-awareness.ts:322-332 mechanism): the FIRST nudge in
105
+ * a quiet window arms one timer; further nudges while it is armed are ignored, so a burst of poll
106
+ * batches collapses to a single extra tick. Busy-safe (agent-awareness.ts:343-346 mechanism): if a
107
+ * tick is in flight when the timer fires, the nudge is skipped - never concurrent ticks; the
108
+ * uncommitted deltas simply wait for the next tick. Pure timing assist: it only changes WHEN an
109
+ * existing tick runs, never WHAT it does.
110
+ */
111
+ nudge(): void;
112
+ /**
113
+ * Start ticking on the configured interval. Returns a stop function.
114
+ * The interval wrapper catches + logs tick errors so one bad tick does not kill the loop
115
+ * (the error is still surfaced loudly in the log - not swallowed).
116
+ */
117
+ start(): () => void;
118
+ }
119
+ //# sourceMappingURL=operator-trigger-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-trigger-loop.d.ts","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * OperatorTriggerLoop - the live runtime of the trigger loop (M1-T3, extended for M2).
4
+ *
5
+ * A setInterval tick (NOT scheduler.addJob, which executes an agent prompt, not a callback;
6
+ * precedent: connector-ingress-manual-memory-commit.ts:742) that:
7
+ * 1. drains new deltas (at-least-once: commit only after processing),
8
+ * 2. matches active triggers -> fires them (recall memoryQuery + surface) + recordFire,
9
+ * 3. every authorEveryNTicks: the agent authors new triggers from the recent-events window,
10
+ * 4. every reviewEveryNTicks: the agent reviews fired triggers (keep/refine/retire),
11
+ * 5. every reportEveryNTicks: the agent composes a situational digest of the window (M2),
12
+ * 6. at configured LOCAL hours: the agent composes a fuller scheduled report (M2).
13
+ *
14
+ * Read-only: recall/surface/log/report-to-owner only, no write-actions (M1/M2). All deps are
15
+ * injected so the pipeline is unit-testable.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.OperatorTriggerLoop = void 0;
19
+ const trigger_matcher_js_1 = require("./trigger-matcher.js");
20
+ const trigger_fire_js_1 = require("./trigger-fire.js");
21
+ const trigger_author_js_1 = require("./trigger-author.js");
22
+ const trigger_review_js_1 = require("./trigger-review.js");
23
+ const situation_report_js_1 = require("./situation-report.js");
24
+ class OperatorTriggerLoop {
25
+ deps;
26
+ tickCount = 0;
27
+ recentEvents = [];
28
+ running = false;
29
+ nudgeTimer = null;
30
+ digest;
31
+ fullReporter;
32
+ constructor(deps) {
33
+ this.deps = deps;
34
+ // G2 success signal: when a sent report cites fired triggers (USED_TRIGGERS
35
+ // trailer, window-validated), record 'succeeded' on each. Uncited fires stay
36
+ // neutral; elimination still comes from the review pass. Detector-based fires
37
+ // carry the detector name as id and are not in the registry -- skip loudly.
38
+ const recordTriggerUse = (ids) => {
39
+ for (const id of ids) {
40
+ try {
41
+ deps.registry.recordOutcome(id, 'succeeded');
42
+ deps.log(`[trigger-loop] outcome succeeded trigger=${id} (cited in owner report)`);
43
+ }
44
+ catch (err) {
45
+ deps.log(`[trigger-loop] outcome skip trigger=${id}: ${err instanceof Error ? err.message : String(err)}`);
46
+ }
47
+ }
48
+ };
49
+ this.digest = new situation_report_js_1.SituationReporter({ recordTriggerUse });
50
+ this.fullReporter = new situation_report_js_1.SituationReporter({
51
+ // Wrap a provider into a zero-arg closure resolved AT FIRE TIME (buildPrompt
52
+ // calls it): the delta anchor is the last SUCCESSFUL full report, so a run
53
+ // that failed never widens the next window (defer, never drop).
54
+ selfGatherLines: typeof deps.fullReportSelfGather === 'function'
55
+ ? () => deps.fullReportSelfGather({
56
+ lastSuccessIso: deps.reportScheduler?.loadLastSuccess() ?? null,
57
+ })
58
+ : (deps.fullReportSelfGather ?? []),
59
+ boardPublishLines: deps.fullReportBoardLines,
60
+ recordTriggerUse,
61
+ });
62
+ }
63
+ async tick() {
64
+ const { delta, memory, registry, askAgent, review, config, log } = this.deps;
65
+ const { output, reportScheduler } = this.deps;
66
+ const fullLegOn = Boolean(output && reportScheduler);
67
+ this.tickCount += 1;
68
+ const tick = this.tickCount;
69
+ // 1. Drain new deltas (commit AFTER processing - at-least-once).
70
+ const events = delta.drainNew(config.drainLimit);
71
+ if (events.length > 0) {
72
+ log(`[trigger-loop] tick ${tick}: drained ${events.length} events`);
73
+ }
74
+ // 2. Match + fire + recordFire, folding fire activity into the report accumulators.
75
+ let fires = 0;
76
+ for (const event of events) {
77
+ const signals = (0, trigger_matcher_js_1.matchTriggers)(event, registry);
78
+ for (const signal of signals) {
79
+ const result = await (0, trigger_fire_js_1.fireTrigger)(signal, memory);
80
+ fires += 1;
81
+ if (signal.triggerId) {
82
+ registry.recordFire(signal.triggerId);
83
+ }
84
+ // Carry the recalled {topic, content} (agent-authored memoryQuery drove it) into the report.
85
+ this.digest.recordFire({
86
+ triggerId: signal.triggerId ?? signal.detector,
87
+ kind: signal.kind,
88
+ channelId: signal.channelId,
89
+ recalled: result.recalled,
90
+ });
91
+ if (fullLegOn) {
92
+ this.fullReporter.recordFire({
93
+ triggerId: signal.triggerId ?? signal.detector,
94
+ kind: signal.kind,
95
+ channelId: signal.channelId,
96
+ recalled: result.recalled,
97
+ });
98
+ }
99
+ log(`[trigger-loop] tick ${tick}: fire trigger=${signal.triggerId ?? signal.detector} ` +
100
+ `recalled=${result.recalled.length} channel=${signal.channelId}`);
101
+ }
102
+ }
103
+ delta.commit(events);
104
+ // M8: feed the board-reconcile leg AFTER commit (the loop's cursor is
105
+ // authoritative; reconcile is a freshness layer repaired by the 30-min cron).
106
+ if (this.deps.onChannelDelta && events.length > 0) {
107
+ const byChannel = new Map();
108
+ for (const event of events) {
109
+ const key = `${event.channel}:${event.channelId}`;
110
+ const bucket = byChannel.get(key) ?? [];
111
+ bucket.push(event);
112
+ byChannel.set(key, bucket);
113
+ }
114
+ for (const [channelKey, channelEvents] of byChannel) {
115
+ const lines = channelEvents
116
+ .slice(-10)
117
+ .map((e) => `- [id:${e.eventIndexId ?? e.id}] ${e.userId}: ${e.content.trim().slice(0, 200)}`);
118
+ try {
119
+ this.deps.onChannelDelta(channelKey, lines);
120
+ }
121
+ catch (err) {
122
+ log(`[trigger-loop] onChannelDelta failed for ${channelKey}: ${err instanceof Error ? err.message : String(err)}`);
123
+ }
124
+ }
125
+ }
126
+ // Feed the drained window into the report accumulators (bounded per-channel) and keep the
127
+ // author window. The digest reports on ALL channels seen, not only the ones that fired.
128
+ if (events.length > 0) {
129
+ this.digest.recordWindow(events);
130
+ if (fullLegOn) {
131
+ this.fullReporter.recordWindow(events);
132
+ }
133
+ this.recentEvents = [...this.recentEvents, ...events].slice(-config.authorWindowSize);
134
+ }
135
+ // 3. Agent authors new triggers from the recent window.
136
+ let authored = 0;
137
+ if (tick % config.authorEveryNTicks === 0 && this.recentEvents.length > 0) {
138
+ const created = await (0, trigger_author_js_1.authorTriggers)(this.recentEvents, registry, askAgent, {
139
+ note: `authored at tick ${tick}`,
140
+ });
141
+ authored = created.length;
142
+ if (authored > 0) {
143
+ this.digest.recordAuthored(authored);
144
+ if (fullLegOn) {
145
+ this.fullReporter.recordAuthored(authored);
146
+ }
147
+ }
148
+ log(`[trigger-loop] tick ${tick}: author pass created ${authored} trigger(s)`);
149
+ }
150
+ // 4. Agent reviews triggers that have actually fired.
151
+ let reviewed = 0;
152
+ if (tick % config.reviewEveryNTicks === 0) {
153
+ const firedTriggers = registry.listActive().filter((t) => t.stats.fired > 0);
154
+ const context = this.recentEvents.map((e) => `[${e.channelId}] ${e.content}`);
155
+ for (const trigger of firedTriggers) {
156
+ const decision = await review(trigger, context);
157
+ const action = (0, trigger_review_js_1.applyReview)(decision, trigger.id, registry);
158
+ reviewed += 1;
159
+ log(`[trigger-loop] tick ${tick}: review trigger=${trigger.id} -> ${action}`);
160
+ }
161
+ }
162
+ // 5. Situational digest (M1.5 cadence, M2 window-aware): the agent composes it from the
163
+ // window + fire activity + recalled memory; the sink delivers it. Agent may reply NOTHING.
164
+ let reported = false;
165
+ const reportAsk = this.deps.reportAsk ?? askAgent;
166
+ const reportEvery = config.reportEveryNTicks ?? 0;
167
+ if (output && reportEvery > 0 && tick % reportEvery === 0 && this.digest.hasActivity()) {
168
+ reported = await this.digest.report(reportAsk, output, 'digest');
169
+ log(`[trigger-loop] tick ${tick}: owner digest ${reported ? 'SENT' : 'suppressed by agent'}`);
170
+ }
171
+ // 6. Scheduled full report (M2): fires at configured LOCAL hours - even on a completely
172
+ // quiet window (M2.1 aliveness: the agent reports "quiet" instead of skipping; owners
173
+ // rely on the scheduled report arriving). Fires once per hour (markFired persists the
174
+ // hour key -> restart-safe). Send failure throws (no-fallback) WITHOUT marking the hour,
175
+ // so the next tick retries with the buffer intact.
176
+ let fullReported = false;
177
+ if (output && reportScheduler) {
178
+ const { fire, hourKey } = reportScheduler.shouldFire(new Date());
179
+ if (fire) {
180
+ // Anchor = FIRE time, captured BEFORE the run: anchoring at completion would
181
+ // leave a gap (messages arriving while the run executes fall after the gather
182
+ // but before a completion-time anchor). Overlap is tolerable; gaps are not.
183
+ const firedAtIso = new Date().toISOString();
184
+ fullReported = await this.fullReporter.report(reportAsk, output, 'full');
185
+ reportScheduler.markFired(hourKey); // reached only if report() did not throw (sent OR agent-suppressed)
186
+ if (fullReported) {
187
+ // ONLY a delivered report advances the delta anchor. A NOTHING-suppressed
188
+ // report or a Task-4 ENVELOPE_EXPIRED abort must NOT advance it, so the
189
+ // next report's window still covers everything this run missed.
190
+ reportScheduler.markSuccess(firedAtIso);
191
+ }
192
+ log(`[trigger-loop] tick ${tick}: full report ${fullReported ? 'SENT' : 'suppressed by agent'} (${hourKey})`);
193
+ }
194
+ }
195
+ return { tick, drained: events.length, fires, authored, reviewed, reported, fullReported };
196
+ }
197
+ /**
198
+ * M2.4 freshness nudge: wake the loop to tick ~nudgeDebounceMs from now instead of waiting for the
199
+ * next scheduled interval. The connector sink calls this (via a forwarder) whenever a poll batch
200
+ * indexes new rows.
201
+ *
202
+ * Debounced (Kagemusha fast-flush port, agent-awareness.ts:322-332 mechanism): the FIRST nudge in
203
+ * a quiet window arms one timer; further nudges while it is armed are ignored, so a burst of poll
204
+ * batches collapses to a single extra tick. Busy-safe (agent-awareness.ts:343-346 mechanism): if a
205
+ * tick is in flight when the timer fires, the nudge is skipped - never concurrent ticks; the
206
+ * uncommitted deltas simply wait for the next tick. Pure timing assist: it only changes WHEN an
207
+ * existing tick runs, never WHAT it does.
208
+ */
209
+ nudge() {
210
+ if (this.nudgeTimer)
211
+ return; // already armed - debounce collapses the burst
212
+ const configured = this.deps.config.nudgeDebounceMs;
213
+ const debounceMs = typeof configured === 'number' && Number.isFinite(configured) && configured >= 0
214
+ ? configured
215
+ : 15_000;
216
+ this.nudgeTimer = setTimeout(() => {
217
+ this.nudgeTimer = null;
218
+ if (this.running) {
219
+ this.deps.log('[trigger-loop] nudge: tick already running - skipped (deltas wait for next tick)');
220
+ return;
221
+ }
222
+ this.running = true;
223
+ void this.tick()
224
+ .catch((error) => {
225
+ this.deps.log(`[trigger-loop] nudge tick failed: ${error instanceof Error ? error.message : String(error)}`);
226
+ })
227
+ .finally(() => {
228
+ this.running = false;
229
+ });
230
+ }, debounceMs);
231
+ this.nudgeTimer.unref?.();
232
+ }
233
+ /**
234
+ * Start ticking on the configured interval. Returns a stop function.
235
+ * The interval wrapper catches + logs tick errors so one bad tick does not kill the loop
236
+ * (the error is still surfaced loudly in the log - not swallowed).
237
+ */
238
+ start() {
239
+ const { config, log } = this.deps;
240
+ const handle = setInterval(() => {
241
+ if (this.running) {
242
+ log('[trigger-loop] tick skipped: previous tick still running');
243
+ return;
244
+ }
245
+ this.running = true;
246
+ void this.tick()
247
+ .catch((error) => {
248
+ log(`[trigger-loop] tick failed: ${error instanceof Error ? error.message : String(error)}`);
249
+ })
250
+ .finally(() => {
251
+ this.running = false;
252
+ });
253
+ }, config.tickMs);
254
+ handle.unref?.();
255
+ log(`[trigger-loop] started (tick every ${config.tickMs}ms)`);
256
+ return () => {
257
+ clearInterval(handle);
258
+ if (this.nudgeTimer) {
259
+ clearTimeout(this.nudgeTimer);
260
+ this.nudgeTimer = null;
261
+ }
262
+ log('[trigger-loop] stopped');
263
+ };
264
+ }
265
+ }
266
+ exports.OperatorTriggerLoop = OperatorTriggerLoop;
267
+ //# sourceMappingURL=operator-trigger-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-trigger-loop.js","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Operator report-run wiring + tool-use audit (M3 "Operator Hands").
3
+ *
4
+ * PURE half (this file, Task 1): classify the gateway tools the persona agent actually EXECUTED
5
+ * during a report. Gateway calls are prompt-based ```tool_call blocks, parsed by AgentLoop into
6
+ * tool_use blocks (agent-loop.ts:1218-1226,1330-1333); each execution's tool_result is pushed
7
+ * into the NEXT user message (agent-loop.ts:1408-1411). We pair tool_use.id with its tool_result
8
+ * and count executions only - errored results and envelope denials ("success":false /
9
+ * envelope_missing, gateway-tool-executor.ts:1090-1142) do NOT count. History is read
10
+ * structurally (no agent-internal imports) so the audit is trivially unit-testable.
11
+ *
12
+ * The audit powers two M3 guarantees:
13
+ * - no-fallback (GAP 1): a FULL report that EXECUTED no gateway gather tool (none emitted, or
14
+ * every call denied/errored) is WARNED loudly, never silently accepted as if it had
15
+ * task-board substance.
16
+ * - observability (GAP 2): every write (mama_save) is logged loudly.
17
+ *
18
+ * ASCII-only. No personal strings.
19
+ */
20
+ import type { AskAgent } from './trigger-author.js';
21
+ /** Dedicated persona session lane for operator reports; isolates the multi-turn gather loop from
22
+ * chat. runWithContent honors options.sessionKey (agent-loop.ts:879). */
23
+ export declare const OPERATOR_REPORT_SESSION_KEY = "operator:report";
24
+ /** Minimal structural view of AgentLoopResult.history (types.ts:1105). Structural on purpose:
25
+ * keeps this module free of agent-internal imports so tests use plain synthetic objects. */
26
+ export interface ReportHistoryMessage {
27
+ role: string;
28
+ content: unknown;
29
+ }
30
+ export interface ReportToolAudit {
31
+ gatherTools: string[];
32
+ writeTools: string[];
33
+ all: string[];
34
+ }
35
+ /** Pair assistant tool_use blocks with their tool_result and classify EXECUTIONS as gather vs
36
+ * write. `all` inventories every emission (executed or not) for honest logging. */
37
+ export declare function summarizeReportToolUse(history: ReadonlyArray<ReportHistoryMessage>): ReportToolAudit;
38
+ /**
39
+ * Build the operator-log lines for one report.
40
+ * isFullReport gates the no-fallback gather WARNING (only the FULL report is instructed to gather;
41
+ * the digest is intentionally tool-free, so absence of gather tools there is normal).
42
+ */
43
+ export declare function formatReportToolAudit(audit: ReportToolAudit, isFullReport: boolean): string[];
44
+ export interface PersonaReportRunResult {
45
+ response: string;
46
+ history: ReadonlyArray<ReportHistoryMessage>;
47
+ }
48
+ /** E = the envelope type; generic keeps this module free of agent/envelope imports while start.ts
49
+ * gets full inference (no casts): E is inferred from the injected issuer's return type. */
50
+ export interface PersonaReportRunner<E = unknown> {
51
+ (prompt: string, envelope?: E): Promise<PersonaReportRunResult>;
52
+ }
53
+ export interface PersonaReportAskDeps<E = unknown> {
54
+ run: PersonaReportRunner<E>;
55
+ log: (line: string) => void;
56
+ /** Marker that identifies a FULL report prompt (situation-report.OPERATOR_FULL_REPORT_TAG). */
57
+ fullReportTag: string;
58
+ /**
59
+ * Issue a per-report scoped worker envelope. Gateway 'model_tool' executions are envelope-gated
60
+ * (gateway-tool-executor.ts:252-256): without an envelope every call is denied with code
61
+ * 'envelope_missing' (:1090-1142). Injected from start.ts (envelopeAuthority.buildAndPersist);
62
+ * omit ONLY when issuance mode is 'off'. Failures propagate (no-fallback).
63
+ */
64
+ issueEnvelope?: () => Promise<E>;
65
+ }
66
+ /**
67
+ * Build the report-composition AskAgent (M3). Envelope-first: gateway 'model_tool' executions are
68
+ * envelope-gated (gateway-tool-executor.ts:252-256), so issue the per-report scoped envelope
69
+ * BEFORE running - without one every call is denied with code 'envelope_missing' (:1090-1142),
70
+ * the enforcement that killed the ancestor scheduled-report path. Issuance failure propagates
71
+ * loudly (no-fallback; the buffer is kept and the next cadence retries). Then run the persona
72
+ * agent (injected runner isolates the report into its own session lane and carries the envelope),
73
+ * audit + log the gateway tools it actually EXECUTED (no-fallback WARNING when a full report
74
+ * executed none; observability line for every write), and enforce the empty-report guard
75
+ * (M2 semantics).
76
+ */
77
+ export declare function createPersonaReportAsk<E = unknown>(deps: PersonaReportAskDeps<E>): AskAgent;
78
+ //# sourceMappingURL=report-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-run.d.ts","sourceRoot":"","sources":["../../src/operator/report-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;0EAC0E;AAC1E,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAwB7D;6FAC6F;AAC7F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AA2BD;oFACoF;AACpF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,CAAC,oBAAoB,CAAC,GAC3C,eAAe,CAgCjB;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM,EAAE,CAmB7F;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC9C;AACD;4FAC4F;AAC5F,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACjE;AACD,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC/C,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,+FAA+F;IAC/F,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAa3F"}