@jungjaehoon/mama-os 0.20.0 → 0.21.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 (296) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/agent/agent-loop.d.ts +2 -1
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +65 -19
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/claude-cli-wrapper.d.ts.map +1 -1
  7. package/dist/agent/claude-cli-wrapper.js +6 -2
  8. package/dist/agent/claude-cli-wrapper.js.map +1 -1
  9. package/dist/agent/cli-arg-redaction.d.ts +2 -0
  10. package/dist/agent/cli-arg-redaction.d.ts.map +1 -0
  11. package/dist/agent/cli-arg-redaction.js +18 -0
  12. package/dist/agent/cli-arg-redaction.js.map +1 -0
  13. package/dist/agent/code-act/constants.d.ts +1 -1
  14. package/dist/agent/code-act/constants.d.ts.map +1 -1
  15. package/dist/agent/code-act/constants.js +24 -3
  16. package/dist/agent/code-act/constants.js.map +1 -1
  17. package/dist/agent/code-act/host-bridge.d.ts +2 -0
  18. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  19. package/dist/agent/code-act/host-bridge.js +43 -7
  20. package/dist/agent/code-act/host-bridge.js.map +1 -1
  21. package/dist/agent/code-act/type-definition-generator.d.ts +2 -2
  22. package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
  23. package/dist/agent/code-act/type-definition-generator.js +29 -4
  24. package/dist/agent/code-act/type-definition-generator.js.map +1 -1
  25. package/dist/agent/codex-home.d.ts +1 -1
  26. package/dist/agent/codex-home.d.ts.map +1 -1
  27. package/dist/agent/codex-home.js +43 -1
  28. package/dist/agent/codex-home.js.map +1 -1
  29. package/dist/agent/codex-mcp-process.d.ts +2 -0
  30. package/dist/agent/codex-mcp-process.d.ts.map +1 -1
  31. package/dist/agent/codex-mcp-process.js +1 -1
  32. package/dist/agent/codex-mcp-process.js.map +1 -1
  33. package/dist/agent/context-compile-service.d.ts +47 -0
  34. package/dist/agent/context-compile-service.d.ts.map +1 -0
  35. package/dist/agent/context-compile-service.js +435 -0
  36. package/dist/agent/context-compile-service.js.map +1 -0
  37. package/dist/agent/gateway-tool-executor.d.ts +16 -11
  38. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  39. package/dist/agent/gateway-tool-executor.js +539 -109
  40. package/dist/agent/gateway-tool-executor.js.map +1 -1
  41. package/dist/agent/gateway-tools.md +4 -3
  42. package/dist/agent/mama-tool-handlers.d.ts.map +1 -1
  43. package/dist/agent/mama-tool-handlers.js +37 -1
  44. package/dist/agent/mama-tool-handlers.js.map +1 -1
  45. package/dist/agent/managed-agent-runtime-sync.d.ts.map +1 -1
  46. package/dist/agent/managed-agent-runtime-sync.js +2 -4
  47. package/dist/agent/managed-agent-runtime-sync.js.map +1 -1
  48. package/dist/agent/managed-agent-validation.d.ts.map +1 -1
  49. package/dist/agent/managed-agent-validation.js +2 -1
  50. package/dist/agent/managed-agent-validation.js.map +1 -1
  51. package/dist/agent/os-agent-capabilities.md +13 -12
  52. package/dist/agent/persistent-cli-process.d.ts +1 -0
  53. package/dist/agent/persistent-cli-process.d.ts.map +1 -1
  54. package/dist/agent/persistent-cli-process.js +6 -1
  55. package/dist/agent/persistent-cli-process.js.map +1 -1
  56. package/dist/agent/tool-registry.d.ts.map +1 -1
  57. package/dist/agent/tool-registry.js +10 -2
  58. package/dist/agent/tool-registry.js.map +1 -1
  59. package/dist/agent/types.d.ts +30 -5
  60. package/dist/agent/types.d.ts.map +1 -1
  61. package/dist/agent/types.js.map +1 -1
  62. package/dist/api/agent-context-handler.d.ts +10 -0
  63. package/dist/api/agent-context-handler.d.ts.map +1 -0
  64. package/dist/api/agent-context-handler.js +216 -0
  65. package/dist/api/agent-context-handler.js.map +1 -0
  66. package/dist/api/agent-handler.d.ts +2 -0
  67. package/dist/api/agent-handler.d.ts.map +1 -1
  68. package/dist/api/agent-handler.js +14 -7
  69. package/dist/api/agent-handler.js.map +1 -1
  70. package/dist/api/graph-api-types.d.ts +6 -1
  71. package/dist/api/graph-api-types.d.ts.map +1 -1
  72. package/dist/api/graph-api.d.ts +2 -1
  73. package/dist/api/graph-api.d.ts.map +1 -1
  74. package/dist/api/graph-api.js +193 -11
  75. package/dist/api/graph-api.js.map +1 -1
  76. package/dist/api/index.d.ts +11 -1
  77. package/dist/api/index.d.ts.map +1 -1
  78. package/dist/api/index.js +13 -2
  79. package/dist/api/index.js.map +1 -1
  80. package/dist/api/intelligence-handler.d.ts +17 -6
  81. package/dist/api/intelligence-handler.d.ts.map +1 -1
  82. package/dist/api/intelligence-handler.js +59 -1
  83. package/dist/api/intelligence-handler.js.map +1 -1
  84. package/dist/api/operator-handler.d.ts +17 -0
  85. package/dist/api/operator-handler.d.ts.map +1 -0
  86. package/dist/api/operator-handler.js +88 -0
  87. package/dist/api/operator-handler.js.map +1 -0
  88. package/dist/api/report-handler.d.ts +7 -0
  89. package/dist/api/report-handler.d.ts.map +1 -1
  90. package/dist/api/report-handler.js +30 -0
  91. package/dist/api/report-handler.js.map +1 -1
  92. package/dist/api/report-persistence.d.ts +17 -0
  93. package/dist/api/report-persistence.d.ts.map +1 -0
  94. package/dist/api/report-persistence.js +91 -0
  95. package/dist/api/report-persistence.js.map +1 -0
  96. package/dist/cli/commands/start.d.ts +45 -0
  97. package/dist/cli/commands/start.d.ts.map +1 -1
  98. package/dist/cli/commands/start.js +610 -197
  99. package/dist/cli/commands/start.js.map +1 -1
  100. package/dist/cli/config/config-manager.d.ts.map +1 -1
  101. package/dist/cli/config/config-manager.js +171 -4
  102. package/dist/cli/config/config-manager.js.map +1 -1
  103. package/dist/cli/config/types.d.ts +25 -5
  104. package/dist/cli/config/types.d.ts.map +1 -1
  105. package/dist/cli/config/types.js +5 -0
  106. package/dist/cli/config/types.js.map +1 -1
  107. package/dist/cli/runtime/agent-loop-init.d.ts +3 -0
  108. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  109. package/dist/cli/runtime/agent-loop-init.js +2 -0
  110. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  111. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  112. package/dist/cli/runtime/api-routes-init.js +396 -259
  113. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  114. package/dist/cli/runtime/api-server-init.d.ts +2 -0
  115. package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
  116. package/dist/cli/runtime/api-server-init.js +19 -8
  117. package/dist/cli/runtime/api-server-init.js.map +1 -1
  118. package/dist/cli/runtime/connector-init.d.ts +26 -7
  119. package/dist/cli/runtime/connector-init.d.ts.map +1 -1
  120. package/dist/cli/runtime/connector-init.js +79 -16
  121. package/dist/cli/runtime/connector-init.js.map +1 -1
  122. package/dist/cli/runtime/envelope-bootstrap.d.ts.map +1 -1
  123. package/dist/cli/runtime/envelope-bootstrap.js +8 -2
  124. package/dist/cli/runtime/envelope-bootstrap.js.map +1 -1
  125. package/dist/cli/runtime/gateway-init.d.ts +1 -1
  126. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  127. package/dist/cli/runtime/gateway-init.js.map +1 -1
  128. package/dist/cli/runtime/message-router-config.d.ts +4 -0
  129. package/dist/cli/runtime/message-router-config.d.ts.map +1 -0
  130. package/dist/cli/runtime/message-router-config.js +11 -0
  131. package/dist/cli/runtime/message-router-config.js.map +1 -0
  132. package/dist/cli/runtime/scheduler-init.d.ts.map +1 -1
  133. package/dist/cli/runtime/scheduler-init.js +12 -12
  134. package/dist/cli/runtime/scheduler-init.js.map +1 -1
  135. package/dist/cli/runtime/utilities.js +2 -2
  136. package/dist/cli/runtime/utilities.js.map +1 -1
  137. package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
  138. package/dist/connectors/framework/polling-scheduler.js +101 -5
  139. package/dist/connectors/framework/polling-scheduler.js.map +1 -1
  140. package/dist/connectors/kagemusha/query-tools.d.ts.map +1 -1
  141. package/dist/connectors/kagemusha/query-tools.js +14 -3
  142. package/dist/connectors/kagemusha/query-tools.js.map +1 -1
  143. package/dist/db/agent-store.d.ts.map +1 -1
  144. package/dist/db/agent-store.js +10 -3
  145. package/dist/db/agent-store.js.map +1 -1
  146. package/dist/db/migrations/wiki-artifacts.d.ts +3 -0
  147. package/dist/db/migrations/wiki-artifacts.d.ts.map +1 -0
  148. package/dist/db/migrations/wiki-artifacts.js +24 -0
  149. package/dist/db/migrations/wiki-artifacts.js.map +1 -0
  150. package/dist/envelope/enforcer.d.ts.map +1 -1
  151. package/dist/envelope/enforcer.js +48 -4
  152. package/dist/envelope/enforcer.js.map +1 -1
  153. package/dist/envelope/key-provider.d.ts +1 -0
  154. package/dist/envelope/key-provider.d.ts.map +1 -1
  155. package/dist/envelope/key-provider.js +86 -0
  156. package/dist/envelope/key-provider.js.map +1 -1
  157. package/dist/gateways/message-router.d.ts.map +1 -1
  158. package/dist/gateways/message-router.js +15 -3
  159. package/dist/gateways/message-router.js.map +1 -1
  160. package/dist/gateways/types.d.ts +5 -1
  161. package/dist/gateways/types.d.ts.map +1 -1
  162. package/dist/mcp/code-act-server.js +50 -7
  163. package/dist/mcp/code-act-server.js.map +1 -1
  164. package/dist/memory/raw-backed-memory-ingest.d.ts +26 -0
  165. package/dist/memory/raw-backed-memory-ingest.d.ts.map +1 -0
  166. package/dist/memory/raw-backed-memory-ingest.js +214 -0
  167. package/dist/memory/raw-backed-memory-ingest.js.map +1 -0
  168. package/dist/memory/scope-context.js +1 -1
  169. package/dist/multi-agent/agent-event-bus.d.ts +10 -0
  170. package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
  171. package/dist/multi-agent/agent-event-bus.js +34 -0
  172. package/dist/multi-agent/agent-event-bus.js.map +1 -1
  173. package/dist/multi-agent/agent-process-manager.d.ts +3 -0
  174. package/dist/multi-agent/agent-process-manager.d.ts.map +1 -1
  175. package/dist/multi-agent/agent-process-manager.js +118 -13
  176. package/dist/multi-agent/agent-process-manager.js.map +1 -1
  177. package/dist/multi-agent/conductor-persona.js +2 -2
  178. package/dist/multi-agent/dashboard-agent-persona.d.ts +6 -2
  179. package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
  180. package/dist/multi-agent/dashboard-agent-persona.js +57 -30
  181. package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
  182. package/dist/multi-agent/memory-agent-persona.d.ts +1 -1
  183. package/dist/multi-agent/memory-agent-persona.d.ts.map +1 -1
  184. package/dist/multi-agent/memory-agent-persona.js +25 -4
  185. package/dist/multi-agent/memory-agent-persona.js.map +1 -1
  186. package/dist/multi-agent/runtime-process.d.ts +1 -0
  187. package/dist/multi-agent/runtime-process.d.ts.map +1 -1
  188. package/dist/multi-agent/runtime-process.js +1 -0
  189. package/dist/multi-agent/runtime-process.js.map +1 -1
  190. package/dist/multi-agent/types.d.ts +14 -4
  191. package/dist/multi-agent/types.d.ts.map +1 -1
  192. package/dist/multi-agent/types.js.map +1 -1
  193. package/dist/multi-agent/wiki-agent-persona.d.ts +7 -1
  194. package/dist/multi-agent/wiki-agent-persona.d.ts.map +1 -1
  195. package/dist/multi-agent/wiki-agent-persona.js +83 -61
  196. package/dist/multi-agent/wiki-agent-persona.js.map +1 -1
  197. package/dist/multi-agent/workflow-types.d.ts +1 -1
  198. package/dist/multi-agent/workflow-types.d.ts.map +1 -1
  199. package/dist/operator/board-slot-instructions.d.ts +18 -0
  200. package/dist/operator/board-slot-instructions.d.ts.map +1 -0
  201. package/dist/operator/board-slot-instructions.js +52 -0
  202. package/dist/operator/board-slot-instructions.js.map +1 -0
  203. package/dist/operator/connector-delta-repo.d.ts +33 -0
  204. package/dist/operator/connector-delta-repo.d.ts.map +1 -0
  205. package/dist/operator/connector-delta-repo.js +0 -0
  206. package/dist/operator/connector-delta-repo.js.map +1 -0
  207. package/dist/operator/mama-memory-port.d.ts +13 -0
  208. package/dist/operator/mama-memory-port.d.ts.map +1 -0
  209. package/dist/operator/mama-memory-port.js +35 -0
  210. package/dist/operator/mama-memory-port.js.map +1 -0
  211. package/dist/operator/operator-interfaces.d.ts +136 -0
  212. package/dist/operator/operator-interfaces.d.ts.map +1 -0
  213. package/dist/operator/operator-interfaces.js +15 -0
  214. package/dist/operator/operator-interfaces.js.map +1 -0
  215. package/dist/operator/operator-trigger-loop.d.ts +106 -0
  216. package/dist/operator/operator-trigger-loop.d.ts.map +1 -0
  217. package/dist/operator/operator-trigger-loop.js +228 -0
  218. package/dist/operator/operator-trigger-loop.js.map +1 -0
  219. package/dist/operator/report-run.d.ts +78 -0
  220. package/dist/operator/report-run.d.ts.map +1 -0
  221. package/dist/operator/report-run.js +141 -0
  222. package/dist/operator/report-run.js.map +1 -0
  223. package/dist/operator/report-scheduler.d.ts +43 -0
  224. package/dist/operator/report-scheduler.d.ts.map +1 -0
  225. package/dist/operator/report-scheduler.js +87 -0
  226. package/dist/operator/report-scheduler.js.map +1 -0
  227. package/dist/operator/situation-report.d.ts +86 -0
  228. package/dist/operator/situation-report.d.ts.map +1 -0
  229. package/dist/operator/situation-report.js +211 -0
  230. package/dist/operator/situation-report.js.map +1 -0
  231. package/dist/operator/trigger-author.d.ts +45 -0
  232. package/dist/operator/trigger-author.d.ts.map +1 -0
  233. package/dist/operator/trigger-author.js +217 -0
  234. package/dist/operator/trigger-author.js.map +1 -0
  235. package/dist/operator/trigger-evolve.d.ts +31 -0
  236. package/dist/operator/trigger-evolve.d.ts.map +1 -0
  237. package/dist/operator/trigger-evolve.js +51 -0
  238. package/dist/operator/trigger-evolve.js.map +1 -0
  239. package/dist/operator/trigger-fire.d.ts +29 -0
  240. package/dist/operator/trigger-fire.d.ts.map +1 -0
  241. package/dist/operator/trigger-fire.js +41 -0
  242. package/dist/operator/trigger-fire.js.map +1 -0
  243. package/dist/operator/trigger-matcher.d.ts +19 -0
  244. package/dist/operator/trigger-matcher.d.ts.map +1 -0
  245. package/dist/operator/trigger-matcher.js +61 -0
  246. package/dist/operator/trigger-matcher.js.map +1 -0
  247. package/dist/operator/trigger-registry.d.ts +36 -0
  248. package/dist/operator/trigger-registry.d.ts.map +1 -0
  249. package/dist/operator/trigger-registry.js +135 -0
  250. package/dist/operator/trigger-registry.js.map +1 -0
  251. package/dist/operator/trigger-review.d.ts +23 -0
  252. package/dist/operator/trigger-review.d.ts.map +1 -0
  253. package/dist/operator/trigger-review.js +127 -0
  254. package/dist/operator/trigger-review.js.map +1 -0
  255. package/dist/operator/trigger-types.d.ts +84 -0
  256. package/dist/operator/trigger-types.d.ts.map +1 -0
  257. package/dist/operator/trigger-types.js +14 -0
  258. package/dist/operator/trigger-types.js.map +1 -0
  259. package/dist/scheduler/cron-worker.d.ts.map +1 -1
  260. package/dist/scheduler/cron-worker.js +3 -1
  261. package/dist/scheduler/cron-worker.js.map +1 -1
  262. package/dist/security/security-monitor.d.ts.map +1 -1
  263. package/dist/security/security-monitor.js +1 -0
  264. package/dist/security/security-monitor.js.map +1 -1
  265. package/dist/wiki/obsidian-writer.d.ts +1 -1
  266. package/dist/wiki/obsidian-writer.d.ts.map +1 -1
  267. package/dist/wiki/obsidian-writer.js +67 -27
  268. package/dist/wiki/obsidian-writer.js.map +1 -1
  269. package/dist/wiki/path-safety.d.ts +2 -0
  270. package/dist/wiki/path-safety.d.ts.map +1 -0
  271. package/dist/wiki/path-safety.js +40 -0
  272. package/dist/wiki/path-safety.js.map +1 -0
  273. package/dist/wiki/types.d.ts +4 -2
  274. package/dist/wiki/types.d.ts.map +1 -1
  275. package/dist/wiki/types.js +1 -1
  276. package/dist/wiki/types.js.map +1 -1
  277. package/dist/wiki-artifacts/normalization.d.ts +8 -0
  278. package/dist/wiki-artifacts/normalization.d.ts.map +1 -0
  279. package/dist/wiki-artifacts/normalization.js +41 -0
  280. package/dist/wiki-artifacts/normalization.js.map +1 -0
  281. package/dist/wiki-artifacts/types.d.ts +52 -0
  282. package/dist/wiki-artifacts/types.d.ts.map +1 -0
  283. package/dist/wiki-artifacts/types.js +3 -0
  284. package/dist/wiki-artifacts/types.js.map +1 -0
  285. package/dist/wiki-artifacts/wiki-publish-adapter.d.ts +14 -0
  286. package/dist/wiki-artifacts/wiki-publish-adapter.d.ts.map +1 -0
  287. package/dist/wiki-artifacts/wiki-publish-adapter.js +71 -0
  288. package/dist/wiki-artifacts/wiki-publish-adapter.js.map +1 -0
  289. package/package.json +6 -4
  290. package/public/ui/assets/index-BDsaQNGd.js +62 -0
  291. package/public/ui/assets/index-C4URnm_X.css +1 -0
  292. package/public/ui/index.html +13 -0
  293. package/public/viewer/js/utils/api.js +2 -2
  294. package/public/viewer/src/utils/api.ts +9 -2
  295. package/public/viewer/sw.js +1 -1
  296. package/public/viewer/viewer.html +6 -0
@@ -45,6 +45,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
45
45
  return (mod && mod.__esModule) ? mod : { "default": mod };
46
46
  };
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.deriveCodeActToolPolicy = deriveCodeActToolPolicy;
49
+ exports.resolveCodeActAgentPolicy = resolveCodeActAgentPolicy;
50
+ exports.resolveCodeActRawConnectors = resolveCodeActRawConnectors;
51
+ exports.resolveCodeActMemoryScopes = resolveCodeActMemoryScopes;
52
+ exports.bindCodeActParentModelRun = bindCodeActParentModelRun;
53
+ exports.finalizeCodeActParentModelRun = finalizeCodeActParentModelRun;
54
+ exports.failCodeActParentModelRun = failCodeActParentModelRun;
55
+ exports.buildSystemAgentProcessDefaults = buildSystemAgentProcessDefaults;
48
56
  exports.startCommand = startCommand;
49
57
  exports.runAgentLoop = runAgentLoop;
50
58
  const config_manager_js_1 = require("../config/config-manager.js");
@@ -52,10 +60,12 @@ const pid_manager_js_1 = require("../utils/pid-manager.js");
52
60
  const stop_js_1 = require("./stop.js");
53
61
  const index_js_1 = require("../../auth/index.js");
54
62
  const gateway_tool_executor_js_1 = require("../../agent/gateway-tool-executor.js");
63
+ const context_compile_service_js_1 = require("../../agent/context-compile-service.js");
55
64
  const index_js_2 = require("../../gateways/index.js");
56
65
  const graph_api_js_1 = require("../../api/graph-api.js");
57
66
  const sqlite_js_1 = __importDefault(require("../../sqlite.js"));
58
67
  const node_fs_1 = require("node:fs");
68
+ const minimatch_1 = require("minimatch");
59
69
  const ui_command_handler_js_1 = require("../../api/ui-command-handler.js");
60
70
  const agent_store_js_1 = require("../../db/agent-store.js");
61
71
  const store_js_1 = require("../../validation/store.js");
@@ -75,16 +85,20 @@ const api_routes_init_js_1 = require("../runtime/api-routes-init.js");
75
85
  const server_start_js_1 = require("../runtime/server-start.js");
76
86
  const shutdown_js_1 = require("../runtime/shutdown.js");
77
87
  const envelope_bootstrap_js_1 = require("../runtime/envelope-bootstrap.js");
88
+ const message_router_config_js_1 = require("../runtime/message-router-config.js");
78
89
  const reactive_config_js_1 = require("../../envelope/reactive-config.js");
79
90
  const scope_context_js_1 = require("../../memory/scope-context.js");
80
91
  const types_js_1 = require("../config/types.js");
92
+ const role_manager_js_1 = require("../../agent/role-manager.js");
81
93
  const node_crypto_1 = require("node:crypto");
82
94
  const debugLogger = __importStar(require("@jungjaehoon/mama-core/debug-logger"));
95
+ const mama_core_1 = require("@jungjaehoon/mama-core");
83
96
  const { DebugLogger } = debugLogger;
84
97
  const codeActLogger = new DebugLogger('CodeAct');
85
98
  const TRUTHY_ENV_VALUES = new Set(['1', 'true', 'yes', 'on']);
86
99
  const CODE_ACT_MUTATION_TOOLS = new Set([
87
100
  'mama_save',
101
+ 'context_compile',
88
102
  'mama_update',
89
103
  'mama_add',
90
104
  'mama_ingest',
@@ -94,6 +108,210 @@ const CODE_ACT_MUTATION_TOOLS = new Set([
94
108
  function isTruthyEnvValue(value) {
95
109
  return value !== undefined && TRUTHY_ENV_VALUES.has(value.trim().toLowerCase());
96
110
  }
111
+ function uniqueToolList(values) {
112
+ return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
113
+ }
114
+ function isWildcardToolList(values) {
115
+ return Boolean(values?.includes('*'));
116
+ }
117
+ function isGlobToolPattern(value) {
118
+ return /[*?[{]/.test(value);
119
+ }
120
+ function toolPatternAllows(pattern, toolName) {
121
+ return (0, minimatch_1.minimatch)(toolName, pattern);
122
+ }
123
+ function intersectAllowedToolPolicies(configuredAllowed, requestedAllowed) {
124
+ const configured = configuredAllowed !== undefined ? uniqueToolList(configuredAllowed) : undefined;
125
+ const requested = requestedAllowed !== undefined ? uniqueToolList(requestedAllowed) : undefined;
126
+ // Treat explicit empty arrays as deny-all so a caller cannot widen a fully
127
+ // restricted policy by sending a wildcard. Only an undefined (truly absent)
128
+ // policy falls back to the other side.
129
+ if (configured === undefined) {
130
+ return requested;
131
+ }
132
+ if (requested === undefined) {
133
+ return configured;
134
+ }
135
+ if (isWildcardToolList(configured)) {
136
+ return requested;
137
+ }
138
+ if (isWildcardToolList(requested)) {
139
+ return configured;
140
+ }
141
+ const narrowed = [];
142
+ for (const requestedPattern of requested) {
143
+ for (const configuredPattern of configured) {
144
+ if (requestedPattern === configuredPattern) {
145
+ narrowed.push(requestedPattern);
146
+ }
147
+ else if (!isGlobToolPattern(requestedPattern) &&
148
+ toolPatternAllows(configuredPattern, requestedPattern)) {
149
+ narrowed.push(requestedPattern);
150
+ }
151
+ else if (!isGlobToolPattern(configuredPattern) &&
152
+ toolPatternAllows(requestedPattern, configuredPattern)) {
153
+ narrowed.push(configuredPattern);
154
+ }
155
+ }
156
+ }
157
+ return uniqueToolList(narrowed);
158
+ }
159
+ function mergeBlockedToolPolicies(configuredBlocked, requestedBlocked) {
160
+ const merged = uniqueToolList([...(configuredBlocked ?? []), ...(requestedBlocked ?? [])]);
161
+ return merged.length > 0 ? merged : undefined;
162
+ }
163
+ function deriveCodeActToolPolicy(requestContext, agentConfig) {
164
+ const configuredAllowed = agentConfig?.gateway_tool_permissions?.allowed ?? agentConfig?.tool_permissions?.allowed;
165
+ const configuredBlocked = agentConfig?.gateway_tool_permissions?.blocked ?? agentConfig?.tool_permissions?.blocked;
166
+ const allowedTools = intersectAllowedToolPolicies(configuredAllowed, requestContext?.allowedTools);
167
+ const blockedTools = mergeBlockedToolPolicies(configuredBlocked, requestContext?.blockedTools);
168
+ return { allowedTools, blockedTools };
169
+ }
170
+ function resolveCodeActAgentPolicy(requestContext, agents, defaultAgentId) {
171
+ const agentId = requestContext?.agentId || defaultAgentId;
172
+ const agentConfig = agents?.[agentId];
173
+ if (!agentConfig) {
174
+ return { agentId, error: `Unknown Code-Act agent: ${agentId}` };
175
+ }
176
+ if (agentConfig.useCodeAct !== true) {
177
+ return { agentId, error: `Agent is not configured for Code-Act: ${agentId}` };
178
+ }
179
+ const policy = deriveCodeActToolPolicy(requestContext, agentConfig);
180
+ if (!policy.allowedTools || policy.allowedTools.length === 0) {
181
+ // Fail closed: an agent that resolves to no allowed tools must be rejected
182
+ // rather than silently widened to wildcard access.
183
+ return {
184
+ agentId,
185
+ agentConfig,
186
+ policy,
187
+ error: `Agent has no allowed Code-Act tools: ${agentId}`,
188
+ };
189
+ }
190
+ return {
191
+ agentId,
192
+ agentConfig,
193
+ policy,
194
+ };
195
+ }
196
+ function resolveCodeActRawConnectors(enabledConnectorNames) {
197
+ return [...new Set((enabledConnectorNames ?? []).map((name) => name.trim()).filter(Boolean))];
198
+ }
199
+ const CODE_ACT_RAW_MEMORY_SCOPE_LIMIT = 500;
200
+ const MEMORY_SCOPE_KINDS = new Set(['global', 'user', 'channel', 'project']);
201
+ function isMemoryScopeKind(value) {
202
+ return typeof value === 'string' && MEMORY_SCOPE_KINDS.has(value);
203
+ }
204
+ function uniqueMemoryScopes(scopes) {
205
+ const seen = new Set();
206
+ const unique = [];
207
+ for (const scope of scopes) {
208
+ const id = scope.id.trim();
209
+ if (!id) {
210
+ continue;
211
+ }
212
+ const key = `${scope.kind}:${id}`;
213
+ if (seen.has(key)) {
214
+ continue;
215
+ }
216
+ seen.add(key);
217
+ unique.push({ kind: scope.kind, id });
218
+ }
219
+ return unique;
220
+ }
221
+ function resolveCodeActMemoryScopes(baseScopes, adapter) {
222
+ const scopes = [...baseScopes];
223
+ if (!adapter) {
224
+ return uniqueMemoryScopes(scopes);
225
+ }
226
+ try {
227
+ const rows = adapter
228
+ .prepare(`
229
+ SELECT DISTINCT ms.kind AS kind, ms.external_id AS id
230
+ FROM memory_scopes ms
231
+ JOIN memory_scope_bindings msb ON msb.scope_id = ms.id
232
+ JOIN decisions d ON d.id = msb.memory_id
233
+ WHERE d.topic LIKE 'raw/%'
234
+ AND (d.status = 'active' OR d.status IS NULL)
235
+ AND d.superseded_by IS NULL
236
+ ORDER BY ms.kind, ms.external_id
237
+ LIMIT ?
238
+ `)
239
+ .all(CODE_ACT_RAW_MEMORY_SCOPE_LIMIT);
240
+ for (const row of rows) {
241
+ if (!isMemoryScopeKind(row.kind) || typeof row.id !== 'string') {
242
+ continue;
243
+ }
244
+ scopes.push({ kind: row.kind, id: row.id });
245
+ }
246
+ }
247
+ catch {
248
+ return uniqueMemoryScopes(scopes);
249
+ }
250
+ return uniqueMemoryScopes(scopes);
251
+ }
252
+ function buildCodeActRole(policy) {
253
+ // Caller (resolveCodeActAgentPolicy) rejects empty/undefined allowedTools, so
254
+ // here we honor the resolved policy verbatim instead of widening to wildcard.
255
+ return {
256
+ allowedTools: policy.allowedTools ?? [],
257
+ blockedTools: policy.blockedTools,
258
+ allowedPaths: [],
259
+ systemControl: false,
260
+ sensitiveAccess: false,
261
+ };
262
+ }
263
+ function bindCodeActParentModelRun(adapter, executionContext, options) {
264
+ if (!executionContext?.envelope) {
265
+ return { executionContext, modelRunId: null };
266
+ }
267
+ const run = (0, mama_core_1.beginModelRunInAdapter)(adapter, {
268
+ agent_id: executionContext.agentId,
269
+ instance_id: executionContext.envelope.instance_id,
270
+ envelope_hash: executionContext.envelope.envelope_hash,
271
+ input_snapshot_ref: options.inputSnapshotRef,
272
+ input_refs: options.inputRefs,
273
+ });
274
+ return {
275
+ executionContext: {
276
+ ...executionContext,
277
+ modelRunId: run.model_run_id,
278
+ },
279
+ modelRunId: run.model_run_id,
280
+ };
281
+ }
282
+ function codeActErrorSummary(error) {
283
+ if (error instanceof Error) {
284
+ return error.message;
285
+ }
286
+ return String(error);
287
+ }
288
+ function resultErrorSummary(result) {
289
+ if (typeof result.error === 'string') {
290
+ return result.error;
291
+ }
292
+ return result.error?.message ?? 'Code-Act execution failed';
293
+ }
294
+ function finalizeCodeActParentModelRun(adapter, modelRunId, result) {
295
+ if (!modelRunId) {
296
+ return;
297
+ }
298
+ if (result.success === false) {
299
+ (0, mama_core_1.failModelRunInAdapter)(adapter, modelRunId, resultErrorSummary(result));
300
+ return;
301
+ }
302
+ (0, mama_core_1.commitModelRunInAdapter)(adapter, modelRunId, 'code-act completed');
303
+ }
304
+ function failCodeActParentModelRun(adapter, modelRunId, error) {
305
+ if (!modelRunId) {
306
+ return;
307
+ }
308
+ (0, mama_core_1.failModelRunInAdapter)(adapter, modelRunId, codeActErrorSummary(error));
309
+ }
310
+ function buildSystemAgentProcessDefaults(config) {
311
+ return {
312
+ dangerouslySkipPermissions: config.multi_agent?.dangerouslySkipPermissions ?? true,
313
+ };
314
+ }
97
315
  /**
98
316
  * Execute start command
99
317
  */
@@ -126,9 +344,11 @@ async function startCommand(options = {}) {
126
344
  console.error(`Failed to load config: ${error instanceof Error ? error.message : String(error)}\n`);
127
345
  process.exit(1);
128
346
  }
347
+ const validBackends = ['claude', 'codex', 'codex-mcp'];
129
348
  const backend = config.agent.backend;
130
- process.env.MAMA_BACKEND = backend;
131
- if (backend === 'codex-mcp') {
349
+ const isValidBackend = validBackends.includes(backend);
350
+ process.env.MAMA_BACKEND = isValidBackend ? backend : 'claude';
351
+ if (backend === 'codex' || backend === 'codex-mcp') {
132
352
  console.log('✓ Codex-MCP backend (OAuth handled by Codex login)');
133
353
  }
134
354
  else {
@@ -214,7 +434,9 @@ async function startCommand(options = {}) {
214
434
  async function runAgentLoop(config, options = {}) {
215
435
  // ── Phase 1: Foundation ───────────────────────────────────────────────────
216
436
  const startupBackend = config.agent.backend;
217
- const usesCodexBackend = startupBackend === 'codex-mcp' || (0, utilities_js_1.hasCodexBackendConfigured)(config);
437
+ const usesCodexBackend = startupBackend === 'codex' ||
438
+ startupBackend === 'codex-mcp' ||
439
+ (0, utilities_js_1.hasCodexBackendConfigured)(config);
218
440
  if (usesCodexBackend) {
219
441
  const codexCommand = (0, utilities_js_1.resolveCodexCommandForStartup)();
220
442
  process.env.MAMA_CODEX_COMMAND = codexCommand;
@@ -267,30 +489,35 @@ async function runAgentLoop(config, options = {}) {
267
489
  envelopeIssuanceMode: envelopeBootstrap.metadata.issuance,
268
490
  metricsStore,
269
491
  });
270
- const validBackends = ['claude', 'codex-mcp'];
492
+ const validBackends = ['claude', 'codex', 'codex-mcp'];
271
493
  const rawBackend = config.agent.backend;
272
494
  const isValidBackend = validBackends.includes(rawBackend);
273
- const runtimeBackend = isValidBackend
274
- ? rawBackend
275
- : 'claude';
495
+ const runtimeBackend = isValidBackend ? rawBackend : 'claude';
496
+ process.env.MAMA_BACKEND = runtimeBackend;
276
497
  if (rawBackend && !isValidBackend) {
277
498
  console.warn(`[Config] Unknown backend "${rawBackend}", falling back to "claude"`);
278
- process.env.MAMA_BACKEND = 'claude';
279
499
  }
500
+ const agentLoopBackend = runtimeBackend === 'codex' || runtimeBackend === 'codex-mcp' ? 'codex-mcp' : 'claude';
280
501
  // Initialize main agent loop + client (reasoning state is closure-scoped inside)
281
- const { agentLoop, agentLoopClient } = (0, agent_loop_init_js_1.initMainAgentLoop)(config, oauthManager, db, metricsStore, runtimeBackend, { ...options, envelopeIssuanceMode: envelopeBootstrap.metadata.issuance });
502
+ const { agentLoop, agentLoopClient } = (0, agent_loop_init_js_1.initMainAgentLoop)(config, oauthManager, db, metricsStore, agentLoopBackend, {
503
+ ...options,
504
+ envelopeIssuanceMode: envelopeBootstrap.metadata.issuance,
505
+ });
282
506
  // ── Phase 3: MAMA Core API ────────────────────────────────────────────────
283
507
  const { mamaApi, mamaApiClient, connectorExtractionFn } = await (0, mama_core_init_js_1.initMamaCore)(config);
284
508
  // getAdapter is still used directly in this file for DB queries after initDB has run
285
509
  // eslint-disable-next-line @typescript-eslint/no-require-imports
286
510
  const { getAdapter } = require('@jungjaehoon/mama-core/db-manager');
511
+ const contextCompileService = (0, context_compile_service_js_1.createContextCompileService)({
512
+ memoryAdapter: getAdapter(),
513
+ });
514
+ toolExecutor.setContextCompileService(contextCompileService);
515
+ agentLoop.setContextCompileService(contextCompileService);
287
516
  // ── Phase 4: Memory Agent + MessageRouter ─────────────────────────────────
288
- const messageRouter = new index_js_2.MessageRouter(sessionStore, agentLoopClient, mamaApiClient, {
289
- backend: runtimeBackend,
290
- }, envelopeBootstrap.envelopeConfig, envelopeBootstrap.envelopeAuthority);
517
+ const messageRouter = new index_js_2.MessageRouter(sessionStore, agentLoopClient, mamaApiClient, (0, message_router_config_js_1.resolveMessageRouterConfig)(config, runtimeBackend), envelopeBootstrap.envelopeConfig, envelopeBootstrap.envelopeAuthority);
291
518
  messageRouter.setSessionsDb(db);
292
519
  // validationService wired after creation (Phase 5 below)
293
- const { memoryAgentLoop } = await (0, memory_agent_init_js_1.initMemoryAgent)(oauthManager, config, mamaApi, mamaApiClient, messageRouter, runtimeBackend);
520
+ const { memoryAgentLoop } = await (0, memory_agent_init_js_1.initMemoryAgent)(oauthManager, config, mamaApi, mamaApiClient, messageRouter, agentLoopBackend);
294
521
  // ── Phase 5: Graph Handler + Embedding ────────────────────────────────────
295
522
  // Create singleton UI command queue for Agent↔Viewer communication
296
523
  const uiCommandQueue = new ui_command_handler_js_1.UICommandQueue();
@@ -302,6 +529,7 @@ async function runAgentLoop(config, options = {}) {
302
529
  sessionsDb: db,
303
530
  uiCommandQueue,
304
531
  };
532
+ let codeActRawConnectors = [];
305
533
  // Wire uiCommandQueue into messageRouter for page context awareness
306
534
  messageRouter.setUICommandQueue(uiCommandQueue);
307
535
  // Wire sessionsDb and uiCommandQueue into gateway tool executor
@@ -311,113 +539,132 @@ async function runAgentLoop(config, options = {}) {
311
539
  agentLoop.setUICommandQueue(uiCommandQueue);
312
540
  // Wire up Code-Act executor for POST /api/code-act endpoint
313
541
  // Always register: Dashboard/Wiki agents use code-act via MCP → HTTP proxy
314
- {
315
- graphHandlerOptions.executeCodeAct = async (code) => {
316
- const { CodeActSandbox, HostBridge } = await import('../../agent/code-act/index.js');
317
- const sandbox = new CodeActSandbox();
318
- const codeActAgentId = config.multi_agent?.default_agent || 'conductor';
319
- const codeActReadOnly = isTruthyEnvValue(process.env.MAMA_CODE_ACT_READ_ONLY);
320
- const codeActTier = codeActReadOnly ? 3 : 2;
321
- let executionContext = null;
322
- if (envelopeBootstrap.envelopeAuthority && envelopeBootstrap.metadata.issuance !== 'off') {
323
- const projectId = (0, reactive_config_js_1.resolveReactiveProjectRoot)(config, process.env);
324
- const projectRef = { kind: 'project', id: projectId };
325
- const memoryScopes = (0, scope_context_js_1.deriveMemoryScopes)({
326
- source: 'watch',
327
- channelId: 'api:code-act',
328
- userId: 'api',
329
- projectId,
330
- });
331
- const instanceId = (0, node_crypto_1.randomUUID)();
332
- const wallSeconds = Math.min(Math.max(Math.floor((config.timeouts?.agent_ms ?? 300_000) / 1000), 1), 300);
333
- const envelope = envelopeBootstrap.envelopeAuthority.buildAndPersist({
334
- agent_id: codeActAgentId,
335
- instance_id: instanceId,
336
- source: 'watch',
337
- channel_id: 'api:code-act',
338
- trigger_context: { user_text: '<api-code-act invocation>' },
339
- scope: {
340
- project_refs: [projectRef],
341
- raw_connectors: [],
342
- memory_scopes: memoryScopes,
343
- allowed_destinations: [],
344
- },
345
- tier: codeActTier,
346
- budget: { wall_seconds: wallSeconds },
347
- expires_at: new Date(Date.now() + wallSeconds * 1000 + 30_000).toISOString(),
348
- });
349
- const roleName = config.roles?.sourceMapping?.watch ?? 'os_agent';
350
- const role = config.roles?.definitions?.[roleName] ?? types_js_1.DEFAULT_ROLES.definitions.os_agent;
351
- const agentContext = {
352
- source: 'watch',
353
- platform: 'cli',
354
- roleName,
355
- role,
356
- session: {
357
- sessionId: `api:code-act:${instanceId}`,
358
- channelId: 'api:code-act',
359
- startedAt: new Date(),
360
- },
361
- capabilities: ['code_act'],
362
- limitations: codeActReadOnly ? ['Code-Act read-only mode: memory writes disabled'] : [],
363
- tier: codeActTier,
364
- backend: 'claude',
365
- };
366
- executionContext = {
367
- agentContext,
368
- agentId: codeActAgentId,
369
- source: 'watch',
542
+ graphHandlerOptions.executeCodeAct = async (code, codeActContext) => {
543
+ const { CodeActSandbox, HostBridge } = await import('../../agent/code-act/index.js');
544
+ const sandbox = new CodeActSandbox();
545
+ const resolvedCodeActPolicy = resolveCodeActAgentPolicy(codeActContext, config.multi_agent?.agents, config.multi_agent?.default_agent || 'conductor');
546
+ if (resolvedCodeActPolicy.error) {
547
+ return { success: false, error: resolvedCodeActPolicy.error };
548
+ }
549
+ const codeActAgentId = resolvedCodeActPolicy.agentId;
550
+ const codeActPolicy = resolvedCodeActPolicy.policy ?? {};
551
+ const codeActRole = buildCodeActRole(codeActPolicy);
552
+ const codeActReadOnly = isTruthyEnvValue(process.env.MAMA_CODE_ACT_READ_ONLY);
553
+ const codeActTier = codeActReadOnly ? 3 : 2;
554
+ const instanceId = (0, node_crypto_1.randomUUID)();
555
+ let executionContext = null;
556
+ if (envelopeBootstrap.envelopeAuthority && envelopeBootstrap.metadata.issuance !== 'off') {
557
+ const projectId = (0, reactive_config_js_1.resolveReactiveProjectRoot)(config, process.env);
558
+ const projectRef = { kind: 'project', id: projectId };
559
+ const memoryScopes = resolveCodeActMemoryScopes((0, scope_context_js_1.deriveMemoryScopes)({
560
+ source: 'watch',
561
+ channelId: 'api:code-act',
562
+ userId: 'api',
563
+ projectId,
564
+ }), getAdapter());
565
+ const wallSeconds = Math.min(Math.max(Math.floor((config.timeouts?.agent_ms ?? 300_000) / 1000), 1), 300);
566
+ const envelope = envelopeBootstrap.envelopeAuthority.buildAndPersist({
567
+ agent_id: codeActAgentId,
568
+ instance_id: instanceId,
569
+ source: 'watch',
570
+ channel_id: 'api:code-act',
571
+ trigger_context: { user_text: '<api-code-act invocation>' },
572
+ scope: {
573
+ project_refs: [projectRef],
574
+ raw_connectors: codeActRawConnectors,
575
+ memory_scopes: memoryScopes,
576
+ allowed_destinations: [],
577
+ },
578
+ tier: codeActTier,
579
+ budget: { wall_seconds: wallSeconds },
580
+ expires_at: new Date(Date.now() + wallSeconds * 1000 + 30_000).toISOString(),
581
+ });
582
+ const roleName = `code_act_${codeActAgentId}`;
583
+ const role = codeActRole;
584
+ const agentContext = {
585
+ source: 'watch',
586
+ platform: 'cli',
587
+ roleName,
588
+ role,
589
+ session: {
590
+ sessionId: `api:code-act:${instanceId}`,
370
591
  channelId: 'api:code-act',
371
- envelope,
372
- executionSurface: 'code_act',
373
- };
374
- }
375
- const bridge = new HostBridge(toolExecutor, undefined, executionContext);
376
- const toolCalls = [];
377
- bridge.onToolUse = (toolName, input, result) => {
378
- if (result !== undefined) {
379
- toolCalls.push({ name: toolName, input });
380
- if (CODE_ACT_MUTATION_TOOLS.has(toolName)) {
381
- codeActLogger.warn('[CodeAct] mutation tool call', {
382
- toolName,
383
- success: Boolean(result.success),
384
- readOnly: codeActReadOnly,
385
- envelopeHash: executionContext?.envelope?.envelope_hash ?? null,
386
- });
387
- }
388
- }
592
+ startedAt: new Date(),
593
+ },
594
+ capabilities: ['code_act'],
595
+ limitations: codeActReadOnly ? ['Code-Act read-only mode: memory writes disabled'] : [],
596
+ tier: codeActTier,
597
+ backend: runtimeBackend,
389
598
  };
390
- const previousRoutingContext = toolExecutor.getCurrentAgentRoutingContext();
391
- try {
392
- // Set default agent context for /api/code-act calls (Conductor, tiered sandbox).
393
- // Per-request executionContext carries envelope data; this routing context is legacy fallback.
394
- toolExecutor.setCurrentAgentContext(codeActAgentId, 'api', 'code-act');
395
- bridge.injectInto(sandbox, codeActTier);
396
- const result = await sandbox.execute(code);
397
- return {
398
- success: result.success,
399
- value: result.value,
400
- logs: result.logs,
401
- error: result.error?.message,
402
- metrics: result.metrics,
403
- toolCalls,
404
- };
405
- }
406
- finally {
407
- toolExecutor.restoreCurrentAgentRoutingContext(previousRoutingContext);
599
+ executionContext = {
600
+ agentContext,
601
+ agentId: codeActAgentId,
602
+ source: 'watch',
603
+ channelId: 'api:code-act',
604
+ envelope,
605
+ executionSurface: 'code_act',
606
+ };
607
+ }
608
+ const parentRun = bindCodeActParentModelRun(getAdapter(), executionContext, {
609
+ inputSnapshotRef: `code-act:${instanceId}`,
610
+ inputRefs: {
611
+ tool: 'code_act',
612
+ source: 'api',
613
+ channel_id: 'api:code-act',
614
+ read_only: codeActReadOnly,
615
+ },
616
+ });
617
+ executionContext = parentRun.executionContext;
618
+ const bridge = new HostBridge(toolExecutor, new role_manager_js_1.RoleManager({ rolesConfig: config.roles ?? types_js_1.DEFAULT_ROLES }), executionContext);
619
+ const toolCalls = [];
620
+ bridge.onToolUse = (toolName, input, result) => {
621
+ if (result !== undefined) {
622
+ toolCalls.push({ name: toolName, input });
623
+ if (CODE_ACT_MUTATION_TOOLS.has(toolName)) {
624
+ codeActLogger.warn('[CodeAct] mutation tool call', {
625
+ toolName,
626
+ success: Boolean(result.success),
627
+ readOnly: codeActReadOnly,
628
+ envelopeHash: executionContext?.envelope?.envelope_hash ?? null,
629
+ });
630
+ }
408
631
  }
409
632
  };
410
- // Pre-warm Code-Act WASM module for fast first execution
411
- (async () => {
412
- try {
413
- const { CodeActSandbox } = await import('../../agent/code-act/index.js');
414
- await CodeActSandbox.warmup();
415
- }
416
- catch (err) {
417
- console.warn('[CodeAct] WASM warmup failed (non-fatal):', err);
418
- }
419
- })();
420
- }
633
+ const previousRoutingContext = toolExecutor.getCurrentAgentRoutingContext();
634
+ try {
635
+ // Set default agent context for /api/code-act calls (Conductor, tiered sandbox).
636
+ // Per-request executionContext carries envelope data; this routing context is legacy fallback.
637
+ toolExecutor.setCurrentAgentContext(codeActAgentId, 'api', 'code-act');
638
+ bridge.injectInto(sandbox, codeActTier, codeActRole);
639
+ const result = await sandbox.execute(code);
640
+ finalizeCodeActParentModelRun(getAdapter(), parentRun.modelRunId, result);
641
+ return {
642
+ success: result.success,
643
+ value: result.value,
644
+ logs: result.logs,
645
+ error: result.error?.message,
646
+ metrics: result.metrics,
647
+ toolCalls,
648
+ };
649
+ }
650
+ catch (error) {
651
+ failCodeActParentModelRun(getAdapter(), parentRun.modelRunId, error);
652
+ throw error;
653
+ }
654
+ finally {
655
+ toolExecutor.restoreCurrentAgentRoutingContext(previousRoutingContext);
656
+ }
657
+ };
658
+ // Pre-warm Code-Act WASM module for fast first execution
659
+ (async () => {
660
+ try {
661
+ const { CodeActSandbox } = await import('../../agent/code-act/index.js');
662
+ await CodeActSandbox.warmup();
663
+ }
664
+ catch (err) {
665
+ console.warn('[CodeAct] WASM warmup failed (non-fatal):', err);
666
+ }
667
+ })();
421
668
  const graphHandler = (0, graph_api_js_1.createGraphHandler)(graphHandlerOptions);
422
669
  // Seed initial agent versions from config (version 1 for new agents)
423
670
  // initAgentTables is idempotent (CREATE IF NOT EXISTS) — safe to call before apiServer
@@ -428,83 +675,83 @@ async function runAgentLoop(config, options = {}) {
428
675
  toolExecutor.setValidationService(validationService);
429
676
  messageRouter.setValidationService(validationService);
430
677
  agentLoop.setValidationService(validationService);
431
- {
432
- // Ensure OS system agents exist in config (memory agent may be missing in older configs)
433
- if (!config.multi_agent) {
434
- config.multi_agent = (0, config_manager_js_1.getDefaultMultiAgentConfig)();
678
+ // Ensure current primary system agents exist in config. Legacy self-paced
679
+ // dashboard/wiki agents are opt-in and must not be backfilled here.
680
+ if (!config.multi_agent) {
681
+ config.multi_agent = (0, config_manager_js_1.getDefaultMultiAgentConfig)();
682
+ }
683
+ if (!config.multi_agent.agents) {
684
+ config.multi_agent.agents = {};
685
+ }
686
+ const osAgents = {
687
+ 'os-agent': {
688
+ name: 'OS Agent',
689
+ display_name: '🖥️ OS Agent',
690
+ trigger_prefix: '!os',
691
+ persona_file: '~/.mama/personas/os-agent.md',
692
+ tier: 1,
693
+ backend: runtimeBackend,
694
+ model: config.agent.model,
695
+ can_delegate: true,
696
+ enabled: true,
697
+ },
698
+ memory: {
699
+ name: 'Memory Agent',
700
+ display_name: '🧠 Memory',
701
+ trigger_prefix: '!memory',
702
+ persona_file: '~/.mama/personas/memory.md',
703
+ tier: 3,
704
+ backend: runtimeBackend,
705
+ model: config.agent.model,
706
+ can_delegate: false,
707
+ enabled: true,
708
+ },
709
+ };
710
+ let osAgentsAdded = false;
711
+ for (const [id, cfg] of Object.entries(osAgents)) {
712
+ if (!config.multi_agent.agents[id]) {
713
+ config.multi_agent.agents[id] = cfg;
714
+ osAgentsAdded = true;
435
715
  }
436
- if (!config.multi_agent.agents) {
437
- config.multi_agent.agents = {};
716
+ }
717
+ // Persist to config.yaml so /api/agents sees them too
718
+ if (osAgentsAdded) {
719
+ try {
720
+ const { saveConfig } = await import('../config/config-manager.js');
721
+ await saveConfig(config);
722
+ console.log('✓ OS agents added to config.yaml');
438
723
  }
439
- const osAgents = {
440
- 'os-agent': {
441
- name: 'OS Agent',
442
- display_name: '🖥️ OS Agent',
443
- trigger_prefix: '!os',
444
- persona_file: '~/.mama/personas/os-agent.md',
445
- tier: 1,
446
- backend: runtimeBackend,
447
- model: config.agent.model,
448
- can_delegate: true,
449
- enabled: true,
450
- },
451
- memory: {
452
- name: 'Memory Agent',
453
- display_name: '🧠 Memory',
454
- trigger_prefix: '!memory',
455
- persona_file: '~/.mama/personas/memory.md',
456
- tier: 3,
457
- backend: runtimeBackend,
458
- model: config.agent.model,
459
- can_delegate: false,
460
- enabled: true,
461
- },
462
- };
463
- let osAgentsAdded = false;
464
- for (const [id, cfg] of Object.entries(osAgents)) {
465
- if (!config.multi_agent.agents[id]) {
466
- config.multi_agent.agents[id] = cfg;
467
- osAgentsAdded = true;
468
- }
724
+ catch {
725
+ /* non-fatal — runtime config still has them */
469
726
  }
470
- // Persist to config.yaml so /api/agents sees them too
471
- if (osAgentsAdded) {
727
+ }
728
+ const agents = config.multi_agent.agents;
729
+ for (const [id, cfg] of Object.entries(agents)) {
730
+ if (!(0, agent_store_js_1.getLatestVersion)(db, id)) {
731
+ let personaText = null;
472
732
  try {
473
- const { saveConfig } = await import('../config/config-manager.js');
474
- await saveConfig(config);
475
- console.log('✓ OS agents added to config.yaml');
733
+ const pPath = (0, config_manager_js_1.expandPath)(cfg.persona_file);
734
+ if ((0, node_fs_1.existsSync)(pPath))
735
+ personaText = (0, node_fs_1.readFileSync)(pPath, 'utf-8');
476
736
  }
477
737
  catch {
478
- /* non-fatal — runtime config still has them */
479
- }
480
- }
481
- const agents = config.multi_agent.agents;
482
- for (const [id, cfg] of Object.entries(agents)) {
483
- if (!(0, agent_store_js_1.getLatestVersion)(db, id)) {
484
- let personaText = null;
485
- try {
486
- const pPath = (0, config_manager_js_1.expandPath)(cfg.persona_file);
487
- if ((0, node_fs_1.existsSync)(pPath))
488
- personaText = (0, node_fs_1.readFileSync)(pPath, 'utf-8');
489
- }
490
- catch {
491
- /* ignore */
492
- }
493
- (0, agent_store_js_1.createAgentVersion)(db, {
494
- agent_id: id,
495
- snapshot: { model: cfg.model, tier: cfg.tier, backend: cfg.backend },
496
- persona_text: personaText,
497
- change_note: 'Initial version (migrated from config.yaml)',
498
- });
738
+ /* ignore */
499
739
  }
740
+ (0, agent_store_js_1.createAgentVersion)(db, {
741
+ agent_id: id,
742
+ snapshot: { model: cfg.model, tier: cfg.tier, backend: cfg.backend },
743
+ persona_text: personaText,
744
+ change_note: 'Initial version (migrated from config.yaml)',
745
+ });
500
746
  }
501
- console.log(`✓ Agent versions seeded (${Object.keys(agents).length} agents)`);
502
747
  }
748
+ console.log(`✓ Agent versions seeded (${Object.keys(agents).length} agents)`);
503
749
  await (0, utilities_js_1.startEmbeddingServerIfAvailable)(messageRouter, sessionStore, graphHandler);
504
750
  // ── Phase 6: Cron Scheduler ───────────────────────────────────────────────
505
751
  const { scheduler, cronWorker, cronEmitter } = (0, scheduler_init_js_1.initCronScheduler)(config);
506
752
  // ── Phase 7: Gateways ────────────────────────────────────────────────────
507
- const { discordGateway, slackGateway, telegramGateway, gateways } = await (0, gateway_init_js_1.initGateways)(config, messageRouter, toolExecutor, agentLoop, runtimeBackend, db);
753
+ const gatewayInit = await (0, gateway_init_js_1.initGateways)(config, messageRouter, toolExecutor, agentLoop, runtimeBackend, db);
754
+ const { discordGateway, slackGateway, telegramGateway, gateways } = gatewayInit;
508
755
  // ── Phase 8: Gateway Wiring ──────────────────────────────────────────────
509
756
  const { pluginLoader } = await (0, gateway_wiring_js_1.wireGateways)({
510
757
  config,
@@ -531,25 +778,22 @@ async function runAgentLoop(config, options = {}) {
531
778
  // If no Discord/Slack handler wired the delegate tool, create standalone
532
779
  // DelegationManager + AgentProcessManager so delegate() works from any path
533
780
  // (Viewer, Telegram, iMessage, Terminal).
534
- if (!toolExecutor.hasDelegateSupport() && config.multi_agent?.enabled) {
781
+ const fallbackMultiAgentConfig = config.multi_agent;
782
+ const hasSystemRunAgents = Boolean(fallbackMultiAgentConfig?.agents?.['dashboard-agent'] ||
783
+ fallbackMultiAgentConfig?.agents?.['wiki-agent']);
784
+ if (fallbackMultiAgentConfig &&
785
+ !toolExecutor.getAgentProcessManager() &&
786
+ (fallbackMultiAgentConfig.enabled || hasSystemRunAgents)) {
535
787
  const { AgentProcessManager } = await import('../../multi-agent/agent-process-manager.js');
536
- const { DelegationManager } = await import('../../multi-agent/delegation-manager.js');
537
- const agentConfigs = Object.entries(config.multi_agent.agents || {}).map(([id, cfg]) => ({
538
- id,
539
- ...cfg,
540
- }));
541
- const pm = new AgentProcessManager(config.multi_agent, {}, {
788
+ const pm = new AgentProcessManager(fallbackMultiAgentConfig, buildSystemAgentProcessDefaults(config), {
542
789
  backend: runtimeBackend,
543
790
  model: config.agent.model,
544
791
  });
545
- const dm = new DelegationManager(agentConfigs);
546
- dm.setSessionsDb(db);
547
792
  toolExecutor.setAgentProcessManager(pm);
548
- toolExecutor.setDelegationManager(dm);
793
+ agentLoop.setAgentProcessManager(pm);
549
794
  graphHandlerOptions.applyMultiAgentConfig = async (rawConfig) => {
550
795
  const nextConfig = rawConfig;
551
796
  pm.updateConfig(nextConfig);
552
- dm.updateAgents(Object.entries(nextConfig.agents || {}).map(([id, cfg]) => ({ id, ...cfg })));
553
797
  };
554
798
  graphHandlerOptions.restartMultiAgentAgent = async (agentId) => {
555
799
  pm.reloadPersona(agentId);
@@ -558,15 +802,38 @@ async function runAgentLoop(config, options = {}) {
558
802
  toolExecutor.setRestartMultiAgentAgent(graphHandlerOptions.restartMultiAgentAgent);
559
803
  agentLoop.setApplyMultiAgentConfig(graphHandlerOptions.applyMultiAgentConfig);
560
804
  agentLoop.setRestartMultiAgentAgent(graphHandlerOptions.restartMultiAgentAgent);
561
- // Also wire to the main AgentLoop's internal GatewayToolExecutor
562
- // (MessageRouter uses agentLoop which has its own executor instance)
563
- agentLoop.setAgentProcessManager(pm);
564
- agentLoop.setDelegationManager(dm);
565
- console.log('[start] ✓ Delegate tool wired (standalone — no Discord/Slack handler)');
805
+ if (fallbackMultiAgentConfig.enabled && !toolExecutor.hasDelegateSupport()) {
806
+ const { DelegationManager } = await import('../../multi-agent/delegation-manager.js');
807
+ const agentConfigs = Object.entries(fallbackMultiAgentConfig.agents || {}).map(([id, cfg]) => ({
808
+ id,
809
+ ...cfg,
810
+ }));
811
+ const dm = new DelegationManager(agentConfigs);
812
+ dm.setSessionsDb(db);
813
+ toolExecutor.setDelegationManager(dm);
814
+ agentLoop.setDelegationManager(dm);
815
+ graphHandlerOptions.applyMultiAgentConfig = async (rawConfig) => {
816
+ const nextConfig = rawConfig;
817
+ pm.updateConfig(nextConfig);
818
+ dm.updateAgents(Object.entries(nextConfig.agents || {}).map(([id, cfg]) => ({ id, ...cfg })));
819
+ };
820
+ toolExecutor.setApplyMultiAgentConfig(graphHandlerOptions.applyMultiAgentConfig);
821
+ agentLoop.setApplyMultiAgentConfig(graphHandlerOptions.applyMultiAgentConfig);
822
+ console.log('[start] ✓ Delegate tool wired (standalone — no Discord/Slack handler)');
823
+ }
824
+ else {
825
+ console.log('[start] ✓ System agent process manager wired');
826
+ }
566
827
  }
567
828
  // ── Phase 9: Heartbeat + Connectors ──────────────────────────────────────
568
829
  const { heartbeatScheduler, tokenKeepAlive, healthWarningInterval } = (0, scheduler_init_js_1.initHeartbeat)(config, agentLoop, discordGateway, scheduler, healthCheckService);
569
- const { rawStoreForApi, enabledConnectorNames, connectorSchedulerStop } = await (0, connector_init_js_1.initConnectors)(connectorExtractionFn);
830
+ // M2.4 freshness: the connector sink nudges the trigger loop when a poll indexes new rows. The
831
+ // loop is constructed AFTER initConnectors (below), so hand initConnectors a stable forwarder now
832
+ // and point it at the loop once it exists. Null until then -> nudge no-ops (no loop = nothing to
833
+ // wake), which preserves today's behavior when MAMA_TRIGGER_LOOP is unset.
834
+ const triggerLoopNudge = { current: null };
835
+ const { rawStoreForApi, enabledConnectorNames, connectorSchedulerStop } = await (0, connector_init_js_1.initConnectors)(connectorExtractionFn, { nudge: () => triggerLoopNudge.current?.() });
836
+ codeActRawConnectors = resolveCodeActRawConnectors(enabledConnectorNames);
570
837
  // Inject rawStore into tool executor for agent_test connector data access
571
838
  if (rawStoreForApi) {
572
839
  toolExecutor.setRawStore(rawStoreForApi);
@@ -576,6 +843,151 @@ async function runAgentLoop(config, options = {}) {
576
843
  if (connectorSchedulerStop) {
577
844
  gateways.push({ stop: () => Promise.resolve(connectorSchedulerStop()) });
578
845
  }
846
+ // ── Trigger loop (M1, flag-gated, additive): agent-evolved triggers on the live stream ──
847
+ // Runs ONLY with MAMA_TRIGGER_LOOP=1. Placed after initConnectors (which feeds
848
+ // connector_event_index) and after mama-core initDB. Read-only: recall/surface/log.
849
+ if (process.env.MAMA_TRIGGER_LOOP === '1') {
850
+ // Component isolation (PR #119 review): a trigger-loop bootstrap failure (bad import,
851
+ // DB permission, registry constructor) must not abort the whole daemon before Phase
852
+ // 10/11 - the gateways/viewer/agent serve independently of this optional leg. The
853
+ // failure is still surfaced LOUDLY below (console.error), never swallowed silently.
854
+ try {
855
+ const { OperatorTriggerLoop } = await import('../../operator/operator-trigger-loop.js');
856
+ const { ConnectorDeltaRepo } = await import('../../operator/connector-delta-repo.js');
857
+ const { TriggerRegistry } = await import('../../operator/trigger-registry.js');
858
+ const { createMamaMemoryPort } = await import('../../operator/mama-memory-port.js');
859
+ const { askAgentCLI } = await import('../../operator/trigger-author.js');
860
+ const { reviewTriggerCLI } = await import('../../operator/trigger-review.js');
861
+ const { mkdirSync } = await import('node:fs');
862
+ const { dirname } = await import('node:path');
863
+ const { ReportScheduler, FileReportScheduleStore, parseReportHours } = await import('../../operator/report-scheduler.js');
864
+ const { createPersonaReportAsk, OPERATOR_REPORT_SESSION_KEY } = await import('../../operator/report-run.js');
865
+ const { OPERATOR_FULL_REPORT_TAG } = await import('../../operator/situation-report.js');
866
+ const { buildBoardPublishLines } = await import('../../operator/board-slot-instructions.js');
867
+ const triggerDbPath = (0, config_manager_js_1.expandPath)('~/.mama/operator/triggers.db');
868
+ mkdirSync(dirname(triggerDbPath), { recursive: true });
869
+ const triggerRegistry = new TriggerRegistry(new sqlite_js_1.default(triggerDbPath));
870
+ // Owner-report leg (M1.5): destination chat comes from env (~/.mama/start.sh),
871
+ // never source. No chat configured or no telegram gateway -> loop stays read-only.
872
+ const reportChatId = process.env.MAMA_TRIGGER_LOOP_REPORT_CHAT || '';
873
+ const reportOutput = reportChatId && telegramGateway
874
+ ? { send: (text) => telegramGateway.sendMessage(reportChatId, text) }
875
+ : undefined;
876
+ // Scheduled full-report leg (M2): local hours from env (~/.mama/start.sh), never source.
877
+ // Empty/absent -> [] -> leg off. Requires the same telegram sink as the digest leg.
878
+ const fullReportHours = parseReportHours(process.env.MAMA_TRIGGER_LOOP_FULL_REPORT_HOURS || '');
879
+ const reportScheduler = fullReportHours.length > 0 && reportOutput
880
+ ? new ReportScheduler(fullReportHours, new FileReportScheduleStore((0, config_manager_js_1.expandPath)('~/.mama/operator/report-schedule-state.json')))
881
+ : undefined;
882
+ const triggerLoop = new OperatorTriggerLoop({
883
+ delta: new ConnectorDeltaRepo(getAdapter(), (0, config_manager_js_1.expandPath)('~/.mama/operator/trigger-loop-cursors.json')),
884
+ memory: createMamaMemoryPort(),
885
+ registry: triggerRegistry,
886
+ askAgent: askAgentCLI,
887
+ // M2.2: reports go through the daemon's persona agent (system prompt, pinned model,
888
+ // session lanes) instead of the bare CLI - report tone comes from generation inputs.
889
+ // JSON tasks (authoring/review) stay on the bare CLI for reliable parsing.
890
+ // M3 (GAP1+GAP2): run reports in a dedicated persona session lane so the multi-turn gather
891
+ // loop is isolated from chat and continuous across cadences (runWithContent honors
892
+ // options.sessionKey - agent-loop.ts:879, no agent-loop internal change). Gateway
893
+ // 'model_tool' executions are envelope-gated (gateway-tool-executor.ts:252-256) and
894
+ // issuance defaults to 'enabled' (envelope-bootstrap.ts:28-30), so each report carries a
895
+ // per-run scoped envelope (mirrors the code-act issuance at start.ts:1834-1865); without it
896
+ // every call is denied with code 'envelope_missing'. Then audit the gateway tools the agent
897
+ // actually EXECUTED: a full report that executed NO gateway gather tool is logged loudly
898
+ // (no-fallback), and every write (mama_save) is logged (observability).
899
+ reportAsk: createPersonaReportAsk({
900
+ issueEnvelope: envelopeBootstrap.envelopeAuthority && envelopeBootstrap.metadata.issuance !== 'off'
901
+ ? async () => {
902
+ const projectId = (0, reactive_config_js_1.resolveReactiveProjectRoot)(config, process.env);
903
+ const wallSeconds = Math.min(Math.max(Math.floor((config.timeouts?.agent_ms ?? 300_000) / 1000), 1), 300);
904
+ return envelopeBootstrap.envelopeAuthority.buildAndPersist({
905
+ agent_id: 'operator-report',
906
+ instance_id: (0, node_crypto_1.randomUUID)(),
907
+ // 'operator' is not a member of EnvelopeSource (envelope/types.ts is a closed
908
+ // union); 'watch' is the daemon-internal source used by the mirrored code-act
909
+ // issuance (start.ts:1834-1865). This field is issuing-source metadata only -
910
+ // enforcement authorizes on scope.memory_scopes (which cover the operator:report
911
+ // run below), never on envelope.source (gateway-tool-executor.ts:1421,1511,1590).
912
+ source: 'watch',
913
+ channel_id: 'report',
914
+ trigger_context: { user_text: '<operator scheduled report>' },
915
+ scope: {
916
+ // Reads: the enabled raw connectors (kagemusha_* gathers) + memory scopes
917
+ // covering mama_recall/mama_save. allowed_destinations stays [] - NO new
918
+ // send surface (constraint 2).
919
+ project_refs: [{ kind: 'project', id: projectId }],
920
+ raw_connectors: codeActRawConnectors,
921
+ memory_scopes: resolveCodeActMemoryScopes((0, scope_context_js_1.deriveMemoryScopes)({ source: 'operator', channelId: 'report', projectId }), getAdapter()),
922
+ allowed_destinations: [],
923
+ },
924
+ tier: 2, // write tier: the report may mama_save (matches code-act write tier)
925
+ budget: { wall_seconds: wallSeconds },
926
+ expires_at: new Date(Date.now() + wallSeconds * 1000 + 30_000).toISOString(),
927
+ });
928
+ }
929
+ : undefined,
930
+ run: async (prompt, envelope) => {
931
+ const result = await agentLoop.runWithContent([{ type: 'text', text: prompt }], {
932
+ sessionKey: OPERATOR_REPORT_SESSION_KEY,
933
+ source: 'operator',
934
+ channelId: 'report',
935
+ ...(envelope ? { envelope } : {}),
936
+ });
937
+ return { response: result.response, history: result.history };
938
+ },
939
+ log: (line) => console.log(line),
940
+ fullReportTag: OPERATOR_FULL_REPORT_TAG,
941
+ }),
942
+ review: (trigger, context) => reviewTriggerCLI(trigger, context),
943
+ output: reportOutput,
944
+ reportScheduler,
945
+ // M2.3: the scheduled full report self-gathers via the persona agent's gateway tools
946
+ // (the Kagemusha lesson: a reporter with tools has substance; a window summary alone
947
+ // reports "quiet" whenever polling is between batches).
948
+ fullReportSelfGather: [
949
+ 'kagemusha_overview() for room/task/message counts',
950
+ 'kagemusha_tasks({}) for the open task board, plus kagemusha_tasks({ status: "review" }) for items awaiting review (status values must be real board statuses like pending/in_progress/review - invented labels match nothing)',
951
+ 'kagemusha_entities({ activeOnly: true }) for active channels, then kagemusha_messages({ channelId }) on the busiest 2-3 (since defaults to the last 7 days; pass an ISO-8601 timestamp like since: "2026-07-09T00:00:00Z" to narrow it - never a phrase like "24h ago")',
952
+ 'mama_recall(query) for memory relevant to what you find',
953
+ ],
954
+ // Kagemusha dual output: the same scheduled run updates the /ui operator board
955
+ // slots via report_publish, then writes the plain-text owner report.
956
+ fullReportBoardLines: buildBoardPublishLines(),
957
+ config: {
958
+ tickMs: Number(process.env.MAMA_TRIGGER_LOOP_TICK_MS || 60_000),
959
+ drainLimit: Number(process.env.MAMA_TRIGGER_LOOP_DRAIN_LIMIT || 200),
960
+ authorEveryNTicks: Number(process.env.MAMA_TRIGGER_LOOP_AUTHOR_EVERY || 30),
961
+ reviewEveryNTicks: Number(process.env.MAMA_TRIGGER_LOOP_REVIEW_EVERY || 240),
962
+ authorWindowSize: 50,
963
+ reportEveryNTicks: Number(process.env.MAMA_TRIGGER_LOOP_REPORT_EVERY || 15),
964
+ nudgeDebounceMs: Number(process.env.MAMA_TRIGGER_LOOP_NUDGE_DEBOUNCE_MS || 15_000),
965
+ },
966
+ log: (line) => console.log(line),
967
+ });
968
+ if (reportOutput) {
969
+ console.log('✓ Trigger loop owner-report leg enabled (telegram)');
970
+ }
971
+ if (reportScheduler) {
972
+ console.log(`✓ Trigger loop scheduled full-report leg enabled (local hours: ${fullReportHours.join(', ')})`);
973
+ }
974
+ const stopTriggerLoop = triggerLoop.start();
975
+ // M2.4: point the connector sink's forwarder at this loop now that it exists.
976
+ triggerLoopNudge.current = () => triggerLoop.nudge();
977
+ gateways.push({
978
+ stop: async () => {
979
+ triggerLoopNudge.current = null;
980
+ stopTriggerLoop();
981
+ // Close the operator triggers.db handle (PR #119 review: was leaked on shutdown).
982
+ triggerRegistry.close();
983
+ },
984
+ });
985
+ console.log('✓ Trigger loop enabled (MAMA_TRIGGER_LOOP=1, read-only surface mode)');
986
+ }
987
+ catch (error) {
988
+ console.error('[trigger-loop] FAILED to start - daemon continues WITHOUT the trigger loop. Fix and restart:', error);
989
+ }
990
+ }
579
991
  // ── Phase 10: API Server + Routes ────────────────────────────────────────
580
992
  const { apiServer, eventBus } = await (0, api_server_init_js_1.initApiServer)({
581
993
  config,
@@ -589,6 +1001,7 @@ async function runAgentLoop(config, options = {}) {
589
1001
  getAdapter,
590
1002
  envelopeMetadata: envelopeBootstrap.metadata,
591
1003
  envelopeAuthority: envelopeBootstrap.envelopeAuthority,
1004
+ contextCompileService,
592
1005
  });
593
1006
  await (0, api_routes_init_js_1.registerApiRoutes)({
594
1007
  config,