@jungjaehoon/mama-os 0.18.2 → 0.19.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 (171) hide show
  1. package/dist/agent/agent-loop.d.ts +25 -0
  2. package/dist/agent/agent-loop.d.ts.map +1 -1
  3. package/dist/agent/agent-loop.js +67 -14
  4. package/dist/agent/agent-loop.js.map +1 -1
  5. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  6. package/dist/agent/code-act/host-bridge.js +98 -0
  7. package/dist/agent/code-act/host-bridge.js.map +1 -1
  8. package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
  9. package/dist/agent/code-act/type-definition-generator.js +0 -1
  10. package/dist/agent/code-act/type-definition-generator.js.map +1 -1
  11. package/dist/agent/gateway-tool-executor.d.ts +36 -1
  12. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  13. package/dist/agent/gateway-tool-executor.js +938 -54
  14. package/dist/agent/gateway-tool-executor.js.map +1 -1
  15. package/dist/agent/gateway-tools.md +9 -0
  16. package/dist/agent/managed-agent-runtime-sync.d.ts +36 -0
  17. package/dist/agent/managed-agent-runtime-sync.d.ts.map +1 -0
  18. package/dist/agent/managed-agent-runtime-sync.js +207 -0
  19. package/dist/agent/managed-agent-runtime-sync.js.map +1 -0
  20. package/dist/agent/managed-agent-validation.d.ts +4 -0
  21. package/dist/agent/managed-agent-validation.d.ts.map +1 -0
  22. package/dist/agent/managed-agent-validation.js +84 -0
  23. package/dist/agent/managed-agent-validation.js.map +1 -0
  24. package/dist/agent/os-agent-capabilities.md +400 -0
  25. package/dist/agent/skill-loader.d.ts +2 -0
  26. package/dist/agent/skill-loader.d.ts.map +1 -1
  27. package/dist/agent/skill-loader.js +28 -0
  28. package/dist/agent/skill-loader.js.map +1 -1
  29. package/dist/agent/tool-registry.d.ts.map +1 -1
  30. package/dist/agent/tool-registry.js +66 -0
  31. package/dist/agent/tool-registry.js.map +1 -1
  32. package/dist/agent/types.d.ts +2 -1
  33. package/dist/agent/types.d.ts.map +1 -1
  34. package/dist/agent/types.js.map +1 -1
  35. package/dist/api/agent-handler.d.ts +34 -0
  36. package/dist/api/agent-handler.d.ts.map +1 -0
  37. package/dist/api/agent-handler.js +216 -0
  38. package/dist/api/agent-handler.js.map +1 -0
  39. package/dist/api/graph-api-types.d.ts +4 -0
  40. package/dist/api/graph-api-types.d.ts.map +1 -1
  41. package/dist/api/graph-api.d.ts +2 -2
  42. package/dist/api/graph-api.d.ts.map +1 -1
  43. package/dist/api/graph-api.js +480 -51
  44. package/dist/api/graph-api.js.map +1 -1
  45. package/dist/api/index.d.ts.map +1 -1
  46. package/dist/api/index.js +4 -0
  47. package/dist/api/index.js.map +1 -1
  48. package/dist/api/token-handler.d.ts +1 -0
  49. package/dist/api/token-handler.d.ts.map +1 -1
  50. package/dist/api/token-handler.js +4 -3
  51. package/dist/api/token-handler.js.map +1 -1
  52. package/dist/api/ui-command-handler.d.ts +48 -0
  53. package/dist/api/ui-command-handler.d.ts.map +1 -0
  54. package/dist/api/ui-command-handler.js +160 -0
  55. package/dist/api/ui-command-handler.js.map +1 -0
  56. package/dist/cli/commands/start.d.ts.map +1 -1
  57. package/dist/cli/commands/start.js +127 -1
  58. package/dist/cli/commands/start.js.map +1 -1
  59. package/dist/cli/config/config-manager.d.ts.map +1 -1
  60. package/dist/cli/config/config-manager.js +16 -31
  61. package/dist/cli/config/config-manager.js.map +1 -1
  62. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  63. package/dist/cli/runtime/agent-loop-init.js +31 -7
  64. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  65. package/dist/cli/runtime/api-routes-init.d.ts +3 -0
  66. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  67. package/dist/cli/runtime/api-routes-init.js +283 -34
  68. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  69. package/dist/cli/runtime/gateway-init.d.ts +2 -1
  70. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  71. package/dist/cli/runtime/gateway-init.js +5 -1
  72. package/dist/cli/runtime/gateway-init.js.map +1 -1
  73. package/dist/connectors/framework/raw-store.d.ts +4 -0
  74. package/dist/connectors/framework/raw-store.d.ts.map +1 -1
  75. package/dist/connectors/framework/raw-store.js +33 -10
  76. package/dist/connectors/framework/raw-store.js.map +1 -1
  77. package/dist/db/agent-store.d.ts +115 -0
  78. package/dist/db/agent-store.d.ts.map +1 -0
  79. package/dist/db/agent-store.js +248 -0
  80. package/dist/db/agent-store.js.map +1 -0
  81. package/dist/db/migrations/agent-activity-validation-columns.d.ts +3 -0
  82. package/dist/db/migrations/agent-activity-validation-columns.d.ts.map +1 -0
  83. package/dist/db/migrations/agent-activity-validation-columns.js +22 -0
  84. package/dist/db/migrations/agent-activity-validation-columns.js.map +1 -0
  85. package/dist/db/migrations/agent-metrics-response-avg.d.ts +3 -0
  86. package/dist/db/migrations/agent-metrics-response-avg.d.ts.map +1 -0
  87. package/dist/db/migrations/agent-metrics-response-avg.js +19 -0
  88. package/dist/db/migrations/agent-metrics-response-avg.js.map +1 -0
  89. package/dist/db/migrations/agent-store-tables.d.ts +3 -0
  90. package/dist/db/migrations/agent-store-tables.d.ts.map +1 -0
  91. package/dist/db/migrations/agent-store-tables.js +59 -0
  92. package/dist/db/migrations/agent-store-tables.js.map +1 -0
  93. package/dist/db/migrations/token-usage-agent-version.d.ts +3 -0
  94. package/dist/db/migrations/token-usage-agent-version.d.ts.map +1 -0
  95. package/dist/db/migrations/token-usage-agent-version.js +16 -0
  96. package/dist/db/migrations/token-usage-agent-version.js.map +1 -0
  97. package/dist/db/migrations/validation-session-tables.d.ts +3 -0
  98. package/dist/db/migrations/validation-session-tables.d.ts.map +1 -0
  99. package/dist/db/migrations/validation-session-tables.js +59 -0
  100. package/dist/db/migrations/validation-session-tables.js.map +1 -0
  101. package/dist/gateways/message-router.d.ts +10 -0
  102. package/dist/gateways/message-router.d.ts.map +1 -1
  103. package/dist/gateways/message-router.js +188 -14
  104. package/dist/gateways/message-router.js.map +1 -1
  105. package/dist/gateways/types.d.ts +1 -1
  106. package/dist/gateways/types.d.ts.map +1 -1
  107. package/dist/multi-agent/agent-process-manager.js +1 -1
  108. package/dist/multi-agent/agent-process-manager.js.map +1 -1
  109. package/dist/multi-agent/conductor-persona.d.ts +13 -0
  110. package/dist/multi-agent/conductor-persona.d.ts.map +1 -0
  111. package/dist/multi-agent/conductor-persona.js +157 -0
  112. package/dist/multi-agent/conductor-persona.js.map +1 -0
  113. package/dist/multi-agent/dashboard-agent-persona.d.ts +1 -1
  114. package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
  115. package/dist/multi-agent/dashboard-agent-persona.js +7 -3
  116. package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
  117. package/dist/multi-agent/delegation-manager.d.ts +5 -0
  118. package/dist/multi-agent/delegation-manager.d.ts.map +1 -1
  119. package/dist/multi-agent/delegation-manager.js +37 -0
  120. package/dist/multi-agent/delegation-manager.js.map +1 -1
  121. package/dist/multi-agent/ultrawork.d.ts +3 -0
  122. package/dist/multi-agent/ultrawork.d.ts.map +1 -1
  123. package/dist/multi-agent/ultrawork.js +9 -0
  124. package/dist/multi-agent/ultrawork.js.map +1 -1
  125. package/dist/validation/session-service.d.ts +72 -0
  126. package/dist/validation/session-service.d.ts.map +1 -0
  127. package/dist/validation/session-service.js +298 -0
  128. package/dist/validation/session-service.js.map +1 -0
  129. package/dist/validation/store.d.ts +25 -0
  130. package/dist/validation/store.d.ts.map +1 -0
  131. package/dist/validation/store.js +200 -0
  132. package/dist/validation/store.js.map +1 -0
  133. package/dist/validation/types.d.ts +119 -0
  134. package/dist/validation/types.d.ts.map +1 -0
  135. package/dist/validation/types.js +57 -0
  136. package/dist/validation/types.js.map +1 -0
  137. package/package.json +3 -3
  138. package/public/viewer/js/modules/agents.js +1148 -0
  139. package/public/viewer/js/modules/chat.js +20 -11
  140. package/public/viewer/js/modules/connector-feed.js +35 -0
  141. package/public/viewer/js/modules/dashboard.js +49 -0
  142. package/public/viewer/js/modules/memory.js +32 -0
  143. package/public/viewer/js/modules/settings.js +34 -79
  144. package/public/viewer/js/modules/wiki.js +59 -4
  145. package/public/viewer/js/utils/api.js +70 -0
  146. package/public/viewer/js/utils/dom.js +3 -0
  147. package/public/viewer/js/utils/ui-commands.js +93 -0
  148. package/public/viewer/log-viewer.html +2 -2
  149. package/public/viewer/src/modules/agents.ts +1299 -0
  150. package/public/viewer/src/modules/chat.ts +23 -14
  151. package/public/viewer/src/modules/connector-feed.ts +35 -0
  152. package/public/viewer/src/modules/dashboard.ts +50 -0
  153. package/public/viewer/src/modules/memory.ts +31 -0
  154. package/public/viewer/src/modules/settings.ts +36 -96
  155. package/public/viewer/src/modules/wiki.ts +73 -6
  156. package/public/viewer/src/types/global.d.ts +0 -9
  157. package/public/viewer/src/utils/api.ts +156 -2
  158. package/public/viewer/src/utils/dom.ts +6 -1
  159. package/public/viewer/src/utils/ui-commands.ts +118 -0
  160. package/public/viewer/viewer.css +105 -10
  161. package/public/viewer/viewer.html +1868 -777
  162. package/scripts/generate-gateway-tools.ts +5 -1
  163. package/public/viewer/js/modules/playground.js +0 -148
  164. package/public/viewer/js/modules/skills.js +0 -451
  165. package/public/viewer/src/modules/playground.ts +0 -173
  166. package/public/viewer/src/modules/skills.ts +0 -491
  167. package/templates/playgrounds/cron-workflow-lab.html +0 -1601
  168. package/templates/playgrounds/mama-log-viewer.html +0 -1341
  169. package/templates/playgrounds/skill-lab-playground.html +0 -1625
  170. package/templates/playgrounds/wave-visualizer.html +0 -694
  171. package/templates/skills/playground.md +0 -197
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyAgentStoreTablesMigration = applyAgentStoreTablesMigration;
4
+ function applyAgentStoreTablesMigration(db) {
5
+ db.exec(`
6
+ CREATE TABLE IF NOT EXISTS agent_versions (
7
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
8
+ agent_id TEXT NOT NULL,
9
+ version INTEGER NOT NULL,
10
+ snapshot TEXT NOT NULL,
11
+ persona_text TEXT,
12
+ change_note TEXT,
13
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
14
+ UNIQUE(agent_id, version)
15
+ )
16
+ `);
17
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_versions_agent ON agent_versions(agent_id)`);
18
+ db.exec(`
19
+ CREATE TABLE IF NOT EXISTS agent_metrics (
20
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+ agent_id TEXT NOT NULL,
22
+ agent_version INTEGER NOT NULL,
23
+ period_start TEXT NOT NULL,
24
+ period_end TEXT NOT NULL,
25
+ input_tokens INTEGER DEFAULT 0,
26
+ output_tokens INTEGER DEFAULT 0,
27
+ tool_calls INTEGER DEFAULT 0,
28
+ delegations INTEGER DEFAULT 0,
29
+ errors INTEGER DEFAULT 0,
30
+ avg_response_ms REAL DEFAULT 0,
31
+ response_ms_sum REAL DEFAULT 0,
32
+ response_count INTEGER DEFAULT 0,
33
+ UNIQUE(agent_id, agent_version, period_start)
34
+ )
35
+ `);
36
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_metrics_agent ON agent_metrics(agent_id, agent_version)`);
37
+ db.exec(`
38
+ CREATE TABLE IF NOT EXISTS agent_activity (
39
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
40
+ agent_id TEXT NOT NULL,
41
+ agent_version INTEGER NOT NULL,
42
+ type TEXT NOT NULL,
43
+ input_summary TEXT,
44
+ output_summary TEXT,
45
+ tokens_used INTEGER DEFAULT 0,
46
+ tools_called TEXT,
47
+ duration_ms INTEGER DEFAULT 0,
48
+ score REAL,
49
+ details TEXT,
50
+ error_message TEXT,
51
+ run_id TEXT,
52
+ execution_status TEXT,
53
+ trigger_reason TEXT,
54
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
55
+ )
56
+ `);
57
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_agent_activity_agent ON agent_activity(agent_id, created_at)`);
58
+ }
59
+ //# sourceMappingURL=agent-store-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-store-tables.js","sourceRoot":"","sources":["../../../src/db/migrations/agent-store-tables.ts"],"names":[],"mappings":";;AAEA,wEA4DC;AA5DD,SAAgB,8BAA8B,CAAC,EAAkB;IAC/D,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;GAWP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAE3F,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;GAiBP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CACL,8FAA8F,CAC/F,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;GAmBP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CACL,6FAA6F,CAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SQLiteDatabase } from '../../sqlite.js';
2
+ export declare function applyTokenUsageAgentVersionMigration(db: SQLiteDatabase): void;
3
+ //# sourceMappingURL=token-usage-agent-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage-agent-version.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/token-usage-agent-version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,oCAAoC,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAe7E"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyTokenUsageAgentVersionMigration = applyTokenUsageAgentVersionMigration;
4
+ function applyTokenUsageAgentVersionMigration(db) {
5
+ const tableExists = db
6
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'token_usage'")
7
+ .get();
8
+ if (!tableExists?.name) {
9
+ return;
10
+ }
11
+ const columns = db.prepare('PRAGMA table_info(token_usage)').all().map((column) => column.name);
12
+ if (!columns.includes('agent_version')) {
13
+ db.exec('ALTER TABLE token_usage ADD COLUMN agent_version INTEGER');
14
+ }
15
+ }
16
+ //# sourceMappingURL=token-usage-agent-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage-agent-version.js","sourceRoot":"","sources":["../../../src/db/migrations/token-usage-agent-version.ts"],"names":[],"mappings":";;AAEA,oFAeC;AAfD,SAAgB,oCAAoC,CAAC,EAAkB;IACrE,MAAM,WAAW,GAAG,EAAE;SACnB,OAAO,CAAC,8EAA8E,CAAC;SACvF,GAAG,EAAmC,CAAC;IAC1C,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GACX,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EACjD,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACvC,EAAE,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SQLiteDatabase } from '../../sqlite.js';
2
+ export declare function applyValidationSessionTablesMigration(db: SQLiteDatabase): void;
3
+ //# sourceMappingURL=validation-session-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-session-tables.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/validation-session-tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,qCAAqC,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CA8D9E"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyValidationSessionTablesMigration = applyValidationSessionTablesMigration;
4
+ function applyValidationSessionTablesMigration(db) {
5
+ db.exec(`
6
+ CREATE TABLE IF NOT EXISTS validation_sessions (
7
+ id TEXT PRIMARY KEY,
8
+ agent_id TEXT NOT NULL,
9
+ agent_version INTEGER NOT NULL,
10
+ trigger_type TEXT NOT NULL,
11
+ goal TEXT,
12
+ metric_profile_json TEXT NOT NULL,
13
+ baseline_version INTEGER,
14
+ baseline_session_id TEXT,
15
+ execution_status TEXT NOT NULL,
16
+ validation_outcome TEXT NOT NULL,
17
+ summary TEXT,
18
+ recommendation TEXT,
19
+ before_snapshot_json TEXT,
20
+ after_snapshot_json TEXT,
21
+ report_json TEXT,
22
+ schema_version INTEGER NOT NULL DEFAULT 1,
23
+ requires_approval INTEGER DEFAULT 0,
24
+ started_at INTEGER NOT NULL,
25
+ ended_at INTEGER
26
+ )
27
+ `);
28
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_val_sessions_agent_status
29
+ ON validation_sessions(agent_id, validation_outcome)`);
30
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_val_sessions_agent_trigger
31
+ ON validation_sessions(agent_id, trigger_type, started_at)`);
32
+ db.exec(`
33
+ CREATE TABLE IF NOT EXISTS validation_metrics (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ validation_session_id TEXT NOT NULL,
36
+ name TEXT NOT NULL,
37
+ value REAL NOT NULL,
38
+ baseline_value REAL,
39
+ delta_value REAL,
40
+ direction TEXT NOT NULL,
41
+ created_at INTEGER NOT NULL
42
+ )
43
+ `);
44
+ db.exec(`CREATE INDEX IF NOT EXISTS idx_val_metrics_session
45
+ ON validation_metrics(validation_session_id)`);
46
+ db.exec(`
47
+ CREATE TABLE IF NOT EXISTS agent_validation_state (
48
+ agent_id TEXT NOT NULL,
49
+ trigger_type TEXT NOT NULL,
50
+ approved_version INTEGER,
51
+ approved_session_id TEXT,
52
+ current_status TEXT,
53
+ last_validation_at INTEGER,
54
+ updated_at INTEGER NOT NULL,
55
+ PRIMARY KEY (agent_id, trigger_type)
56
+ )
57
+ `);
58
+ }
59
+ //# sourceMappingURL=validation-session-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-session-tables.js","sourceRoot":"","sources":["../../../src/db/migrations/validation-session-tables.ts"],"names":[],"mappings":";;AAEA,sFA8DC;AA9DD,SAAgB,qCAAqC,CAAC,EAAkB;IACtE,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;GAsBP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CACL;0DACsD,CACvD,CAAC;IACF,EAAE,CAAC,IAAI,CACL;gEAC4D,CAC7D,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;GAWP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CACL;kDAC8C,CAC/C,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;GAWP,CAAC,CAAC;AACL,CAAC"}
@@ -104,6 +104,13 @@ export declare class MessageRouter {
104
104
  private memoryNoticeQueue;
105
105
  private memoryAuditCooldowns;
106
106
  private memoryAgentStats;
107
+ private sessionsDb;
108
+ setSessionsDb(db: import('../sqlite.js').default): void;
109
+ private uiCommandQueue;
110
+ setUICommandQueue(queue: import('../api/ui-command-handler.js').UICommandQueue): void;
111
+ private validationService;
112
+ setValidationService(svc: import('../validation/session-service.js').ValidationSessionService): void;
113
+ private getPageContextPrefix;
107
114
  setGatewayRegistry(registry: GatewayRegistry): void;
108
115
  setMemoryAgent(processManager: MemoryAgentProcessManagerLike): void;
109
116
  getMemoryAgentStats(): {
@@ -219,6 +226,9 @@ export declare class MessageRouter {
219
226
  private recordMemoryAuditAck;
220
227
  private getPerTurnMemoryPrefix;
221
228
  private triggerMemoryAgent;
229
+ private resolveFrontdoorAgentId;
230
+ private logFrontdoorActivity;
231
+ private logAgentActivity;
222
232
  }
223
233
  /**
224
234
  * Create a mock agent loop for testing
@@ -1 +1 @@
1
- {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/gateways/message-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/gateways/message-router.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,7 @@ const agent_notice_queue_js_1 = require("../memory/agent-notice-queue.js");
65
65
  const scope_context_js_1 = require("../memory/scope-context.js");
66
66
  const recall_bundle_formatter_js_1 = require("../memory/recall-bundle-formatter.js");
67
67
  const save_candidate_extractor_js_1 = require("../memory/save-candidate-extractor.js");
68
+ const agent_store_js_1 = require("../db/agent-store.js");
68
69
  const { DebugLogger } = debugLogger;
69
70
  const logger = new DebugLogger('MessageRouter');
70
71
  /**
@@ -85,6 +86,8 @@ const SENSITIVE_PATTERNS = [
85
86
  /비밀.*키/i,
86
87
  ];
87
88
  const KOREAN_TARGETS = new Set(['korean', '한국어']);
89
+ const VIEWER_CONTEXT_AGENT_LIST_LIMIT = 5;
90
+ const VIEWER_CONTEXT_ALERT_LIMIT = 3;
88
91
  /**
89
92
  * Sanitize user-supplied text before injecting into prompts.
90
93
  * Escapes characters that can alter prompt structure.
@@ -99,7 +102,9 @@ function sanitizeForPrompt(text) {
99
102
  .replace(/`/g, '\\`')
100
103
  .replace(/\$/g, '\\$')
101
104
  .replace(/\{/g, '\\{')
102
- .replace(/\}/g, '\\}');
105
+ .replace(/\}/g, '\\}')
106
+ .replace(/</g, '&lt;')
107
+ .replace(/>/g, '&gt;');
103
108
  }
104
109
  function stripGatewayDecorations(text) {
105
110
  return text.replace(/^(?:\s*\|\|[\s\S]*?\|\|\s*)+/u, '').trim();
@@ -147,6 +152,96 @@ class MessageRouter {
147
152
  lastExtraction: null,
148
153
  recentExtractions: [],
149
154
  };
155
+ // Sessions DB for conductor activity logging
156
+ sessionsDb = null;
157
+ setSessionsDb(db) {
158
+ this.sessionsDb = db;
159
+ }
160
+ // UI command queue for page context awareness
161
+ uiCommandQueue = null;
162
+ setUICommandQueue(queue) {
163
+ this.uiCommandQueue = queue;
164
+ }
165
+ // Validation service for memory agent + conductor sessions
166
+ validationService = null;
167
+ setValidationService(svc) {
168
+ this.validationService = svc;
169
+ }
170
+ getPageContextPrefix(message) {
171
+ if (!this.uiCommandQueue) {
172
+ return '';
173
+ }
174
+ if (message.source !== 'viewer') {
175
+ return '';
176
+ }
177
+ const ctx = this.uiCommandQueue.getPageContext(message.channelId);
178
+ if (!ctx || !ctx.currentRoute) {
179
+ return '';
180
+ }
181
+ const data = ctx.pageData ?? null;
182
+ // Build rich context that tells conductor exactly what the user sees
183
+ const lines = ['<viewer-context>'];
184
+ lines.push(`route: ${sanitizeForPrompt(ctx.currentRoute)}`);
185
+ if (ctx.selectedItem?.type && ctx.selectedItem?.id) {
186
+ lines.push(`selected_item: ${sanitizeForPrompt(ctx.selectedItem.type)}:${sanitizeForPrompt(ctx.selectedItem.id)}`);
187
+ }
188
+ if (data?.summary) {
189
+ lines.push(`summary: ${sanitizeForPrompt(String(data.summary))}`);
190
+ }
191
+ if (data?.pageType === 'agent-list' && Array.isArray(data.agents)) {
192
+ lines.push(`agents:`);
193
+ const selectedAgentId = ctx.selectedItem?.type === 'agent' ? ctx.selectedItem.id : null;
194
+ const allAgents = data.agents;
195
+ const shownAgents = selectedAgentId !== null
196
+ ? allAgents.filter((agent) => String(agent.id ?? '') === selectedAgentId).slice(0, 1)
197
+ : allAgents.slice(0, VIEWER_CONTEXT_AGENT_LIST_LIMIT);
198
+ for (const a of shownAgents) {
199
+ const parts = [` - ${sanitizeForPrompt(String(a.name || a.id || 'unknown'))}`];
200
+ if (a.validation) {
201
+ parts.push(`validation:${sanitizeForPrompt(String(a.validation))}`);
202
+ }
203
+ if (a.enabled === false) {
204
+ parts.push('(disabled)');
205
+ }
206
+ if (a.system === true) {
207
+ parts.push('(system)');
208
+ }
209
+ lines.push(parts.join(' '));
210
+ }
211
+ const totalAgents = allAgents.length;
212
+ const enabledAgents = allAgents.filter((agent) => agent.enabled !== false).length;
213
+ const disabledAgents = totalAgents - enabledAgents;
214
+ const systemAgents = allAgents.filter((agent) => agent.system === true).length;
215
+ const hiddenAgents = Math.max(0, totalAgents - shownAgents.length);
216
+ lines.push(`agent_counts: total=${totalAgents} enabled=${enabledAgents} disabled=${disabledAgents} system=${systemAgents}`);
217
+ if (hiddenAgents > 0) {
218
+ lines.push(`(+${hiddenAgents} more agents)`);
219
+ }
220
+ if (Array.isArray(data.alerts) && data.alerts.length > 0) {
221
+ const shownAlerts = data.alerts.slice(0, VIEWER_CONTEXT_ALERT_LIMIT);
222
+ lines.push(`alerts: ${shownAlerts.map((item) => sanitizeForPrompt(String(item))).join(', ')}`);
223
+ const hiddenAlerts = data.alerts.length - shownAlerts.length;
224
+ if (hiddenAlerts > 0) {
225
+ lines.push(`(+${hiddenAlerts} more alerts)`);
226
+ }
227
+ }
228
+ }
229
+ if (data?.pageType === 'agent-detail') {
230
+ const agent = data.agent;
231
+ if (agent) {
232
+ lines.push(`agent: ${sanitizeForPrompt(String(agent.name))} (${sanitizeForPrompt(String(agent.id))}) v${sanitizeForPrompt(String(agent.version))} tier:${sanitizeForPrompt(String(agent.tier))} model:${sanitizeForPrompt(String(agent.model))}`);
233
+ }
234
+ if (data.activeTab) {
235
+ lines.push(`active_tab: ${sanitizeForPrompt(String(data.activeTab))}`);
236
+ }
237
+ const val = data.validation;
238
+ if (val) {
239
+ lines.push(`validation: outcome=${sanitizeForPrompt(String(val.outcome))} execution=${sanitizeForPrompt(String(val.execution))} baseline=v${sanitizeForPrompt(String(val.baseline_version ?? 'none'))}`);
240
+ }
241
+ }
242
+ lines.push('</viewer-context>');
243
+ return lines.join('\n') + '\n';
244
+ }
150
245
  setGatewayRegistry(registry) {
151
246
  this.gatewayRegistry = registry;
152
247
  }
@@ -493,8 +588,9 @@ This protects your credentials from being exposed in chat logs.`;
493
588
  console.log(`[MessageRouter] Auto-injected translation prompt for image`);
494
589
  }
495
590
  }
496
- // Add text content (with memory context and skill context if matched)
497
- const effectiveMessageText = `${memoryPrefix}${skillPrefix}${messageText || ''}`;
591
+ // Add text content (with memory context, skill context, and page context)
592
+ const pageCtx = this.getPageContextPrefix(message);
593
+ const effectiveMessageText = `${pageCtx}${memoryPrefix}${skillPrefix}${messageText || ''}`;
498
594
  if (effectiveMessageText) {
499
595
  contentBlocks.push({ type: 'text', text: effectiveMessageText });
500
596
  }
@@ -515,13 +611,18 @@ This protects your credentials from being exposed in chat logs.`;
515
611
  }
516
612
  }
517
613
  }
614
+ const conductorStart = Date.now();
518
615
  const result = await this.agentLoop.runWithContent(contentBlocks, options);
519
616
  response = result.response;
617
+ this.logFrontdoorActivity(message, message.text, response, Date.now() - conductorStart);
520
618
  }
521
619
  else {
522
- const effectiveText = `${memoryPrefix}${skillPrefix}${message.text}`;
620
+ const pageCtx = this.getPageContextPrefix(message);
621
+ const effectiveText = `${pageCtx}${memoryPrefix}${skillPrefix}${message.text}`;
622
+ const conductorStart = Date.now();
523
623
  const result = await this.agentLoop.run(effectiveText, options);
524
624
  response = result.response;
625
+ this.logFrontdoorActivity(message, message.text, response, Date.now() - conductorStart);
525
626
  }
526
627
  // Auto-extract facts from conversation (fire-and-forget, non-blocking)
527
628
  if (response && message.text) {
@@ -540,6 +641,8 @@ This protects your credentials from being exposed in chat logs.`;
540
641
  }
541
642
  }
542
643
  catch (error) {
644
+ const durationMs = Date.now() - startTime;
645
+ this.logAgentActivity(this.resolveFrontdoorAgentId(message), 'task_error', message.text?.slice(0, 200), undefined, durationMs, error instanceof Error ? error.message : String(error));
543
646
  // CLI timeout or resume failure - invalidate session to force fresh start next time
544
647
  const errorMsg = error instanceof Error ? error.message : String(error);
545
648
  const isCriticalError = errorMsg.includes('timeout') ||
@@ -1059,8 +1162,10 @@ INSTRUCTION:
1059
1162
  return `[MAMA Memory]\n${context.prompt}\n[/MAMA Memory]\n\n`;
1060
1163
  }
1061
1164
  async triggerMemoryAgent(channelKey, userText, botResponse, message) {
1062
- if (!this.memoryAgentProcessManager || !this.memoryAuditQueue)
1165
+ const memoryAuditQueue = this.memoryAuditQueue;
1166
+ if (!this.memoryAgentProcessManager || !memoryAuditQueue) {
1063
1167
  return;
1168
+ }
1064
1169
  const now = Date.now();
1065
1170
  const source = message?.source ?? 'memory-agent';
1066
1171
  const channelId = message?.channelId ?? 'shared';
@@ -1123,15 +1228,84 @@ INSTRUCTION:
1123
1228
  const displayTopic = candidates[0]?.topicHint || userText.slice(0, 80).trim() || 'memory_audit';
1124
1229
  const deltaKeySource = candidates[0]?.id || userText;
1125
1230
  const deltaKey = (0, node_crypto_1.createHash)('sha256').update(deltaKeySource).digest('hex').slice(0, 16);
1126
- this.memoryAuditQueue
1127
- .enqueue(job)
1128
- .then((ack) => {
1129
- this.recordMemoryAuditAck(ack, topic, channelKey, displayTopic, deltaKey);
1130
- })
1131
- .catch((err) => {
1132
- this.memoryAgentStats.acksFailed++;
1133
- logger.warn(`[memory-agent] Failed: ${err instanceof Error ? err.message : String(err)}`);
1134
- });
1231
+ const memoryStart = Date.now();
1232
+ // Start validation session for memory agent
1233
+ let memValSession = null;
1234
+ if (this.validationService && this.sessionsDb) {
1235
+ try {
1236
+ const ver = (0, agent_store_js_1.getLatestVersion)(this.sessionsDb, 'memory');
1237
+ memValSession = this.validationService.startSession('memory', ver?.version ?? 0, 'audit', {
1238
+ goal: `Extract: ${displayTopic.slice(0, 100)}`,
1239
+ });
1240
+ }
1241
+ catch {
1242
+ /* non-fatal */
1243
+ }
1244
+ }
1245
+ void (async () => {
1246
+ try {
1247
+ const ack = await memoryAuditQueue.enqueue(job);
1248
+ this.recordMemoryAuditAck(ack, topic, channelKey, displayTopic, deltaKey);
1249
+ const dur = Date.now() - memoryStart;
1250
+ this.logAgentActivity('memory', 'task_complete', displayTopic.slice(0, 200), undefined, dur);
1251
+ if (memValSession && this.validationService) {
1252
+ try {
1253
+ this.validationService.finalizeSession(memValSession.id, {
1254
+ execution_status: 'completed',
1255
+ metrics: { duration_ms: dur },
1256
+ });
1257
+ }
1258
+ catch {
1259
+ /* non-fatal */
1260
+ }
1261
+ }
1262
+ }
1263
+ catch (err) {
1264
+ this.memoryAgentStats.acksFailed++;
1265
+ const dur = Date.now() - memoryStart;
1266
+ this.logAgentActivity('memory', 'task_error', displayTopic.slice(0, 200), undefined, dur, err instanceof Error ? err.message : String(err));
1267
+ if (memValSession && this.validationService) {
1268
+ try {
1269
+ this.validationService.finalizeSession(memValSession.id, {
1270
+ execution_status: 'failed',
1271
+ error_message: err instanceof Error ? err.message : String(err),
1272
+ metrics: { duration_ms: dur },
1273
+ });
1274
+ }
1275
+ catch {
1276
+ /* non-fatal */
1277
+ }
1278
+ }
1279
+ logger.warn(`[memory-agent] Failed: ${err instanceof Error ? err.message : String(err)}`);
1280
+ }
1281
+ })();
1282
+ }
1283
+ // ── Activity Logging (shared by conductor + memory agent) ───────────
1284
+ resolveFrontdoorAgentId(message) {
1285
+ return message.source === 'viewer' ? 'os-agent' : 'conductor';
1286
+ }
1287
+ logFrontdoorActivity(message, inputText, responseText, durationMs) {
1288
+ this.logAgentActivity(this.resolveFrontdoorAgentId(message), 'task_complete', inputText?.slice(0, 200), responseText?.slice(0, 500), durationMs);
1289
+ }
1290
+ logAgentActivity(agentId, type, inputSummary, outputSummary, durationMs, errorMessage) {
1291
+ if (!this.sessionsDb) {
1292
+ return;
1293
+ }
1294
+ try {
1295
+ const ver = (0, agent_store_js_1.getLatestVersion)(this.sessionsDb, agentId);
1296
+ (0, agent_store_js_1.logActivity)(this.sessionsDb, {
1297
+ agent_id: agentId,
1298
+ agent_version: ver?.version ?? 0,
1299
+ type,
1300
+ input_summary: inputSummary,
1301
+ output_summary: outputSummary,
1302
+ duration_ms: durationMs ?? 0,
1303
+ error_message: errorMessage,
1304
+ });
1305
+ }
1306
+ catch {
1307
+ // Non-fatal — activity logging should never break message handling
1308
+ }
1135
1309
  }
1136
1310
  }
1137
1311
  exports.MessageRouter = MessageRouter;