@jungjaehoon/mama-os 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +67 -0
- package/README.md +643 -0
- package/dist/agent/agent-loop.d.ts +98 -0
- package/dist/agent/agent-loop.d.ts.map +1 -0
- package/dist/agent/agent-loop.js +417 -0
- package/dist/agent/agent-loop.js.map +1 -0
- package/dist/agent/auto-recall.d.ts +48 -0
- package/dist/agent/auto-recall.d.ts.map +1 -0
- package/dist/agent/auto-recall.js +178 -0
- package/dist/agent/auto-recall.js.map +1 -0
- package/dist/agent/claude-cli-wrapper.d.ts +130 -0
- package/dist/agent/claude-cli-wrapper.d.ts.map +1 -0
- package/dist/agent/claude-cli-wrapper.js +227 -0
- package/dist/agent/claude-cli-wrapper.js.map +1 -0
- package/dist/agent/claude-client.d.ts +50 -0
- package/dist/agent/claude-client.d.ts.map +1 -0
- package/dist/agent/claude-client.js +214 -0
- package/dist/agent/claude-client.js.map +1 -0
- package/dist/agent/gateway-tool-executor.d.ts +75 -0
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -0
- package/dist/agent/gateway-tool-executor.js +348 -0
- package/dist/agent/gateway-tool-executor.js.map +1 -0
- package/dist/agent/index.d.ts +13 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +18 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/mcp-executor.d.ts +75 -0
- package/dist/agent/mcp-executor.d.ts.map +1 -0
- package/dist/agent/mcp-executor.js +307 -0
- package/dist/agent/mcp-executor.js.map +1 -0
- package/dist/agent/session-pool.d.ts +148 -0
- package/dist/agent/session-pool.d.ts.map +1 -0
- package/dist/agent/session-pool.js +272 -0
- package/dist/agent/session-pool.js.map +1 -0
- package/dist/agent/streaming-callback-manager.d.ts +85 -0
- package/dist/agent/streaming-callback-manager.d.ts.map +1 -0
- package/dist/agent/streaming-callback-manager.js +103 -0
- package/dist/agent/streaming-callback-manager.js.map +1 -0
- package/dist/agent/types.d.ts +437 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +29 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/api/cron-handler.d.ts +44 -0
- package/dist/api/cron-handler.d.ts.map +1 -0
- package/dist/api/cron-handler.js +195 -0
- package/dist/api/cron-handler.js.map +1 -0
- package/dist/api/error-handler.d.ts +22 -0
- package/dist/api/error-handler.d.ts.map +1 -0
- package/dist/api/error-handler.js +104 -0
- package/dist/api/error-handler.js.map +1 -0
- package/dist/api/heartbeat-handler.d.ts +49 -0
- package/dist/api/heartbeat-handler.d.ts.map +1 -0
- package/dist/api/heartbeat-handler.js +91 -0
- package/dist/api/heartbeat-handler.js.map +1 -0
- package/dist/api/index.d.ts +61 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +145 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types.d.ts +156 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +62 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth-manager.d.ts +59 -0
- package/dist/auth/oauth-manager.d.ts.map +1 -0
- package/dist/auth/oauth-manager.js +237 -0
- package/dist/auth/oauth-manager.js.map +1 -0
- package/dist/auth/types.d.ts +92 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +23 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +155 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +89 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +134 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +24 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +1073 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +85 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +10 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +65 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/config/config-manager.d.ts +51 -0
- package/dist/cli/config/config-manager.d.ts.map +1 -0
- package/dist/cli/config/config-manager.js +216 -0
- package/dist/cli/config/config-manager.js.map +1 -0
- package/dist/cli/config/types.d.ts +172 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +48 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +92 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/pid-manager.d.ts +66 -0
- package/dist/cli/utils/pid-manager.d.ts.map +1 -0
- package/dist/cli/utils/pid-manager.js +167 -0
- package/dist/cli/utils/pid-manager.js.map +1 -0
- package/dist/concurrency/index.d.ts +13 -0
- package/dist/concurrency/index.d.ts.map +1 -0
- package/dist/concurrency/index.js +22 -0
- package/dist/concurrency/index.js.map +1 -0
- package/dist/concurrency/lane-manager.d.ts +113 -0
- package/dist/concurrency/lane-manager.d.ts.map +1 -0
- package/dist/concurrency/lane-manager.js +245 -0
- package/dist/concurrency/lane-manager.js.map +1 -0
- package/dist/concurrency/session-key.d.ts +41 -0
- package/dist/concurrency/session-key.d.ts.map +1 -0
- package/dist/concurrency/session-key.js +61 -0
- package/dist/concurrency/session-key.js.map +1 -0
- package/dist/concurrency/types.d.ts +69 -0
- package/dist/concurrency/types.d.ts.map +1 -0
- package/dist/concurrency/types.js +16 -0
- package/dist/concurrency/types.js.map +1 -0
- package/dist/gateways/channel-history.d.ts +102 -0
- package/dist/gateways/channel-history.d.ts.map +1 -0
- package/dist/gateways/channel-history.js +181 -0
- package/dist/gateways/channel-history.js.map +1 -0
- package/dist/gateways/context-injector.d.ts +74 -0
- package/dist/gateways/context-injector.d.ts.map +1 -0
- package/dist/gateways/context-injector.js +121 -0
- package/dist/gateways/context-injector.js.map +1 -0
- package/dist/gateways/discord.d.ts +122 -0
- package/dist/gateways/discord.d.ts.map +1 -0
- package/dist/gateways/discord.js +602 -0
- package/dist/gateways/discord.js.map +1 -0
- package/dist/gateways/index.d.ts +30 -0
- package/dist/gateways/index.d.ts.map +1 -0
- package/dist/gateways/index.js +49 -0
- package/dist/gateways/index.js.map +1 -0
- package/dist/gateways/message-router.d.ts +116 -0
- package/dist/gateways/message-router.d.ts.map +1 -0
- package/dist/gateways/message-router.js +315 -0
- package/dist/gateways/message-router.js.map +1 -0
- package/dist/gateways/message-splitter.d.ts +54 -0
- package/dist/gateways/message-splitter.d.ts.map +1 -0
- package/dist/gateways/message-splitter.js +146 -0
- package/dist/gateways/message-splitter.js.map +1 -0
- package/dist/gateways/plugin-loader.d.ts +76 -0
- package/dist/gateways/plugin-loader.d.ts.map +1 -0
- package/dist/gateways/plugin-loader.js +221 -0
- package/dist/gateways/plugin-loader.js.map +1 -0
- package/dist/gateways/session-store.d.ts +77 -0
- package/dist/gateways/session-store.d.ts.map +1 -0
- package/dist/gateways/session-store.js +233 -0
- package/dist/gateways/session-store.js.map +1 -0
- package/dist/gateways/slack.d.ts +90 -0
- package/dist/gateways/slack.d.ts.map +1 -0
- package/dist/gateways/slack.js +281 -0
- package/dist/gateways/slack.js.map +1 -0
- package/dist/gateways/telegram.d.ts +79 -0
- package/dist/gateways/telegram.d.ts.map +1 -0
- package/dist/gateways/telegram.js +207 -0
- package/dist/gateways/telegram.js.map +1 -0
- package/dist/gateways/types.d.ts +340 -0
- package/dist/gateways/types.d.ts.map +1 -0
- package/dist/gateways/types.js +6 -0
- package/dist/gateways/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/memory-logger.d.ts +47 -0
- package/dist/memory/memory-logger.d.ts.map +1 -0
- package/dist/memory/memory-logger.js +126 -0
- package/dist/memory/memory-logger.js.map +1 -0
- package/dist/onboarding/all-tools.d.ts +18 -0
- package/dist/onboarding/all-tools.d.ts.map +1 -0
- package/dist/onboarding/all-tools.js +149 -0
- package/dist/onboarding/all-tools.js.map +1 -0
- package/dist/onboarding/autonomous-discovery-tools.d.ts +13 -0
- package/dist/onboarding/autonomous-discovery-tools.d.ts.map +1 -0
- package/dist/onboarding/autonomous-discovery-tools.js +268 -0
- package/dist/onboarding/autonomous-discovery-tools.js.map +1 -0
- package/dist/onboarding/bootstrap-template.d.ts +5 -0
- package/dist/onboarding/bootstrap-template.d.ts.map +1 -0
- package/dist/onboarding/bootstrap-template.js +142 -0
- package/dist/onboarding/bootstrap-template.js.map +1 -0
- package/dist/onboarding/complete-autonomous-prompt.d.ts +13 -0
- package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -0
- package/dist/onboarding/complete-autonomous-prompt.js +1220 -0
- package/dist/onboarding/complete-autonomous-prompt.js.map +1 -0
- package/dist/onboarding/onboarding-state.d.ts +70 -0
- package/dist/onboarding/onboarding-state.d.ts.map +1 -0
- package/dist/onboarding/onboarding-state.js +184 -0
- package/dist/onboarding/onboarding-state.js.map +1 -0
- package/dist/onboarding/personality-quiz.d.ts +35 -0
- package/dist/onboarding/personality-quiz.d.ts.map +1 -0
- package/dist/onboarding/personality-quiz.js +219 -0
- package/dist/onboarding/personality-quiz.js.map +1 -0
- package/dist/onboarding/phase-5-summary.d.ts +22 -0
- package/dist/onboarding/phase-5-summary.d.ts.map +1 -0
- package/dist/onboarding/phase-5-summary.js +151 -0
- package/dist/onboarding/phase-5-summary.js.map +1 -0
- package/dist/onboarding/phase-6-security.d.ts +33 -0
- package/dist/onboarding/phase-6-security.d.ts.map +1 -0
- package/dist/onboarding/phase-6-security.js +473 -0
- package/dist/onboarding/phase-6-security.js.map +1 -0
- package/dist/onboarding/phase-7-integrations.d.ts +66 -0
- package/dist/onboarding/phase-7-integrations.d.ts.map +1 -0
- package/dist/onboarding/phase-7-integrations.js +619 -0
- package/dist/onboarding/phase-7-integrations.js.map +1 -0
- package/dist/onboarding/phase-8-demo.d.ts +43 -0
- package/dist/onboarding/phase-8-demo.d.ts.map +1 -0
- package/dist/onboarding/phase-8-demo.js +346 -0
- package/dist/onboarding/phase-8-demo.js.map +1 -0
- package/dist/onboarding/phase-9-finalization.d.ts +22 -0
- package/dist/onboarding/phase-9-finalization.d.ts.map +1 -0
- package/dist/onboarding/phase-9-finalization.js +375 -0
- package/dist/onboarding/phase-9-finalization.js.map +1 -0
- package/dist/onboarding/ritual-prompt.d.ts +2 -0
- package/dist/onboarding/ritual-prompt.d.ts.map +1 -0
- package/dist/onboarding/ritual-prompt.js +285 -0
- package/dist/onboarding/ritual-prompt.js.map +1 -0
- package/dist/onboarding/ritual-tools.d.ts +13 -0
- package/dist/onboarding/ritual-tools.d.ts.map +1 -0
- package/dist/onboarding/ritual-tools.js +93 -0
- package/dist/onboarding/ritual-tools.js.map +1 -0
- package/dist/runners/cli-runner.d.ts +59 -0
- package/dist/runners/cli-runner.d.ts.map +1 -0
- package/dist/runners/cli-runner.js +190 -0
- package/dist/runners/cli-runner.js.map +1 -0
- package/dist/runners/index.d.ts +11 -0
- package/dist/runners/index.d.ts.map +1 -0
- package/dist/runners/index.js +15 -0
- package/dist/runners/index.js.map +1 -0
- package/dist/runners/types.d.ts +81 -0
- package/dist/runners/types.d.ts.map +1 -0
- package/dist/runners/types.js +31 -0
- package/dist/runners/types.js.map +1 -0
- package/dist/scheduler/cron-scheduler.d.ts +115 -0
- package/dist/scheduler/cron-scheduler.d.ts.map +1 -0
- package/dist/scheduler/cron-scheduler.js +320 -0
- package/dist/scheduler/cron-scheduler.js.map +1 -0
- package/dist/scheduler/heartbeat.d.ts +53 -0
- package/dist/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/scheduler/heartbeat.js +160 -0
- package/dist/scheduler/heartbeat.js.map +1 -0
- package/dist/scheduler/index.d.ts +22 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +31 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/job-lock.d.ts +85 -0
- package/dist/scheduler/job-lock.d.ts.map +1 -0
- package/dist/scheduler/job-lock.js +137 -0
- package/dist/scheduler/job-lock.js.map +1 -0
- package/dist/scheduler/recovery.d.ts +78 -0
- package/dist/scheduler/recovery.d.ts.map +1 -0
- package/dist/scheduler/recovery.js +124 -0
- package/dist/scheduler/recovery.js.map +1 -0
- package/dist/scheduler/schedule-store.d.ts +112 -0
- package/dist/scheduler/schedule-store.d.ts.map +1 -0
- package/dist/scheduler/schedule-store.js +259 -0
- package/dist/scheduler/schedule-store.js.map +1 -0
- package/dist/scheduler/token-keep-alive.d.ts +49 -0
- package/dist/scheduler/token-keep-alive.d.ts.map +1 -0
- package/dist/scheduler/token-keep-alive.js +102 -0
- package/dist/scheduler/token-keep-alive.js.map +1 -0
- package/dist/scheduler/types.d.ts +96 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +21 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/setup/setup-prompt.d.ts +2 -0
- package/dist/setup/setup-prompt.d.ts.map +1 -0
- package/dist/setup/setup-prompt.js +138 -0
- package/dist/setup/setup-prompt.js.map +1 -0
- package/dist/setup/setup-server.d.ts +8 -0
- package/dist/setup/setup-server.d.ts.map +1 -0
- package/dist/setup/setup-server.js +71 -0
- package/dist/setup/setup-server.js.map +1 -0
- package/dist/setup/setup-tools.d.ts +13 -0
- package/dist/setup/setup-tools.d.ts.map +1 -0
- package/dist/setup/setup-tools.js +103 -0
- package/dist/setup/setup-tools.js.map +1 -0
- package/dist/setup/setup-websocket.d.ts +6 -0
- package/dist/setup/setup-websocket.d.ts.map +1 -0
- package/dist/setup/setup-websocket.js +312 -0
- package/dist/setup/setup-websocket.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +26 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +48 -0
- package/dist/skills/skill-executor.d.ts.map +1 -0
- package/dist/skills/skill-executor.js +483 -0
- package/dist/skills/skill-executor.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +40 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +225 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-matcher.d.ts +33 -0
- package/dist/skills/skill-matcher.d.ts.map +1 -0
- package/dist/skills/skill-matcher.js +190 -0
- package/dist/skills/skill-matcher.js.map +1 -0
- package/dist/skills/types.d.ts +123 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +12 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/browser-tool.d.ts +149 -0
- package/dist/tools/browser-tool.d.ts.map +1 -0
- package/dist/tools/browser-tool.js +257 -0
- package/dist/tools/browser-tool.js.map +1 -0
- package/package.json +84 -0
- package/public/favicon.ico +0 -0
- package/public/setup.html +1026 -0
- package/public/viewer/icons/icon-192.png +0 -0
- package/public/viewer/icons/icon-512.png +0 -0
- package/public/viewer/js/modules/chat.js +1587 -0
- package/public/viewer/js/modules/dashboard.js +275 -0
- package/public/viewer/js/modules/graph.js +997 -0
- package/public/viewer/js/modules/memory.js +353 -0
- package/public/viewer/js/modules/settings.js +255 -0
- package/public/viewer/js/utils/api.js +169 -0
- package/public/viewer/js/utils/dom.js +92 -0
- package/public/viewer/js/utils/format.js +192 -0
- package/public/viewer/manifest.json +26 -0
- package/public/viewer/sw.js +131 -0
- package/public/viewer/viewer.css +500 -0
- package/public/viewer/viewer.html +1535 -0
- package/scripts/postinstall.js +118 -0
- package/templates/skills/document-analyze.md +63 -0
- package/templates/skills/heartbeat-report.md +75 -0
- package/templates/skills/image-translate.md +67 -0
- package/templates/workspace/skill-forge/DESIGN.md +115 -0
- package/templates/workspace/skill-forge/agents/architect.ts +295 -0
- package/templates/workspace/skill-forge/agents/developer.ts +364 -0
- package/templates/workspace/skill-forge/agents/qa.ts +313 -0
- package/templates/workspace/skill-forge/claude-api.ts +353 -0
- package/templates/workspace/skill-forge/discord-ui.ts +580 -0
- package/templates/workspace/skill-forge/error-handler.ts +354 -0
- package/templates/workspace/skill-forge/mama-integration.ts +357 -0
- package/templates/workspace/skill-forge/orchestrator.ts +495 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/README.md +24 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/index.ts +79 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/types.ts +17 -0
- package/templates/workspace/skill-forge/package.json +21 -0
- package/templates/workspace/skill-forge/state/session.json +132 -0
- package/templates/workspace/skill-forge/test-e2e.ts +139 -0
- package/templates/workspace/skill-forge/tsconfig.json +20 -0
- package/templates/workspace/skill-forge/types.ts +159 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session store for messenger conversations
|
|
4
|
+
*
|
|
5
|
+
* Manages conversation sessions with rolling context (history)
|
|
6
|
+
* for cross-platform messenger integration.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SessionStore = void 0;
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// SessionStore Class
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* SQLite-backed session store for messenger conversations
|
|
16
|
+
*/
|
|
17
|
+
class SessionStore {
|
|
18
|
+
db;
|
|
19
|
+
maxTurns;
|
|
20
|
+
maxResponseLength;
|
|
21
|
+
constructor(db, options = {}) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
this.maxTurns = options.maxTurns ?? 50; // Extended from 10 to 50 for better conversation continuity
|
|
24
|
+
this.maxResponseLength = options.maxResponseLength ?? 500; // Extended from 200 to 500
|
|
25
|
+
this.runMigration();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run database migration
|
|
29
|
+
*/
|
|
30
|
+
runMigration() {
|
|
31
|
+
this.db.exec(`
|
|
32
|
+
CREATE TABLE IF NOT EXISTS messenger_sessions (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
source TEXT NOT NULL,
|
|
35
|
+
channel_id TEXT NOT NULL,
|
|
36
|
+
user_id TEXT,
|
|
37
|
+
context TEXT,
|
|
38
|
+
created_at INTEGER,
|
|
39
|
+
last_active INTEGER,
|
|
40
|
+
UNIQUE(source, channel_id)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_messenger_source_channel
|
|
44
|
+
ON messenger_sessions(source, channel_id);
|
|
45
|
+
`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get existing session or create new one
|
|
49
|
+
*/
|
|
50
|
+
getOrCreate(source, channelId, userId) {
|
|
51
|
+
const existing = this.db
|
|
52
|
+
.prepare(`
|
|
53
|
+
SELECT * FROM messenger_sessions
|
|
54
|
+
WHERE source = ? AND channel_id = ?
|
|
55
|
+
`)
|
|
56
|
+
.get(source, channelId);
|
|
57
|
+
if (existing) {
|
|
58
|
+
return this.rowToSession(existing);
|
|
59
|
+
}
|
|
60
|
+
// Create new session
|
|
61
|
+
const id = (0, crypto_1.randomUUID)();
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
this.db
|
|
64
|
+
.prepare(`
|
|
65
|
+
INSERT INTO messenger_sessions (id, source, channel_id, user_id, context, created_at, last_active)
|
|
66
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
67
|
+
`)
|
|
68
|
+
.run(id, source, channelId, userId || null, '[]', now, now);
|
|
69
|
+
return {
|
|
70
|
+
id,
|
|
71
|
+
source,
|
|
72
|
+
channelId,
|
|
73
|
+
userId,
|
|
74
|
+
context: '[]',
|
|
75
|
+
createdAt: now,
|
|
76
|
+
lastActive: now,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get session by ID
|
|
81
|
+
*/
|
|
82
|
+
getById(sessionId) {
|
|
83
|
+
const row = this.db.prepare('SELECT * FROM messenger_sessions WHERE id = ?').get(sessionId);
|
|
84
|
+
return row ? this.rowToSession(row) : null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Update session with new conversation turn
|
|
88
|
+
*/
|
|
89
|
+
updateSession(sessionId, userMessage, botResponse) {
|
|
90
|
+
const session = this.getById(sessionId);
|
|
91
|
+
if (!session)
|
|
92
|
+
return false;
|
|
93
|
+
// Parse existing context
|
|
94
|
+
let history;
|
|
95
|
+
try {
|
|
96
|
+
history = JSON.parse(session.context || '[]');
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
history = [];
|
|
100
|
+
}
|
|
101
|
+
// Add new turn
|
|
102
|
+
history.push({
|
|
103
|
+
user: userMessage,
|
|
104
|
+
bot: this.truncate(botResponse, this.maxResponseLength),
|
|
105
|
+
timestamp: Date.now(),
|
|
106
|
+
});
|
|
107
|
+
// Keep only recent turns
|
|
108
|
+
const recentHistory = history.slice(-this.maxTurns);
|
|
109
|
+
// Update database
|
|
110
|
+
const result = this.db
|
|
111
|
+
.prepare(`
|
|
112
|
+
UPDATE messenger_sessions
|
|
113
|
+
SET context = ?, last_active = ?
|
|
114
|
+
WHERE id = ?
|
|
115
|
+
`)
|
|
116
|
+
.run(JSON.stringify(recentHistory), Date.now(), sessionId);
|
|
117
|
+
return result.changes > 0;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get conversation history for a session
|
|
121
|
+
*/
|
|
122
|
+
getHistory(sessionId) {
|
|
123
|
+
const session = this.getById(sessionId);
|
|
124
|
+
if (!session)
|
|
125
|
+
return [];
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(session.context || '[]');
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Clear session context (start fresh)
|
|
135
|
+
*/
|
|
136
|
+
clearContext(sessionId) {
|
|
137
|
+
const result = this.db
|
|
138
|
+
.prepare(`
|
|
139
|
+
UPDATE messenger_sessions
|
|
140
|
+
SET context = ?, last_active = ?
|
|
141
|
+
WHERE id = ?
|
|
142
|
+
`)
|
|
143
|
+
.run('[]', Date.now(), sessionId);
|
|
144
|
+
return result.changes > 0;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Delete a session
|
|
148
|
+
*/
|
|
149
|
+
deleteSession(sessionId) {
|
|
150
|
+
const result = this.db.prepare('DELETE FROM messenger_sessions WHERE id = ?').run(sessionId);
|
|
151
|
+
return result.changes > 0;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* List all sessions for a source
|
|
155
|
+
*/
|
|
156
|
+
listSessions(source) {
|
|
157
|
+
let stmt;
|
|
158
|
+
if (source) {
|
|
159
|
+
stmt = this.db.prepare('SELECT * FROM messenger_sessions WHERE source = ? ORDER BY last_active DESC');
|
|
160
|
+
return stmt.all(source).map((row) => this.rowToSession(row));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
stmt = this.db.prepare('SELECT * FROM messenger_sessions ORDER BY last_active DESC');
|
|
164
|
+
return stmt.all().map((row) => this.rowToSession(row));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Delete inactive sessions older than specified age
|
|
169
|
+
*/
|
|
170
|
+
cleanupInactiveSessions(maxAgeMs) {
|
|
171
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
172
|
+
const result = this.db
|
|
173
|
+
.prepare('DELETE FROM messenger_sessions WHERE last_active < ?')
|
|
174
|
+
.run(cutoff);
|
|
175
|
+
return result.changes;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get the most recently active session for a specific source
|
|
179
|
+
*/
|
|
180
|
+
getLastActiveSession(source) {
|
|
181
|
+
let stmt;
|
|
182
|
+
let row;
|
|
183
|
+
if (source) {
|
|
184
|
+
stmt = this.db.prepare('SELECT * FROM messenger_sessions WHERE source = ? ORDER BY last_active DESC LIMIT 1');
|
|
185
|
+
row = stmt.get(source);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
stmt = this.db.prepare('SELECT * FROM messenger_sessions ORDER BY last_active DESC LIMIT 1');
|
|
189
|
+
row = stmt.get();
|
|
190
|
+
}
|
|
191
|
+
return row ? this.rowToSession(row) : null;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Format context as readable string for system prompt
|
|
195
|
+
*/
|
|
196
|
+
formatContextForPrompt(sessionId) {
|
|
197
|
+
const history = this.getHistory(sessionId);
|
|
198
|
+
if (history.length === 0) {
|
|
199
|
+
return 'New conversation';
|
|
200
|
+
}
|
|
201
|
+
return history.map((turn) => `User: ${turn.user}\nAssistant: ${turn.bot}`).join('\n\n');
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Convert database row to Session object
|
|
205
|
+
*/
|
|
206
|
+
rowToSession(row) {
|
|
207
|
+
return {
|
|
208
|
+
id: row.id,
|
|
209
|
+
source: row.source,
|
|
210
|
+
channelId: row.channel_id,
|
|
211
|
+
userId: row.user_id || undefined,
|
|
212
|
+
context: row.context || '[]',
|
|
213
|
+
createdAt: row.created_at,
|
|
214
|
+
lastActive: row.last_active,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Truncate text to specified length
|
|
219
|
+
*/
|
|
220
|
+
truncate(text, maxLength) {
|
|
221
|
+
if (text.length <= maxLength)
|
|
222
|
+
return text;
|
|
223
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Close database connection
|
|
227
|
+
*/
|
|
228
|
+
close() {
|
|
229
|
+
this.db.close();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.SessionStore = SessionStore;
|
|
233
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/gateways/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Gateway for MAMA Standalone
|
|
3
|
+
*
|
|
4
|
+
* Provides Slack integration using Socket Mode for receiving and responding to messages.
|
|
5
|
+
* Supports both DM and channel mentions with thread context preservation.
|
|
6
|
+
*/
|
|
7
|
+
import { MessageRouter } from './message-router.js';
|
|
8
|
+
import type { Gateway, GatewayEventHandler, SlackGatewayConfig, SlackChannelConfig } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Slack Gateway options
|
|
11
|
+
*/
|
|
12
|
+
export interface SlackGatewayOptions {
|
|
13
|
+
/** Slack bot token (xoxb-...) */
|
|
14
|
+
botToken: string;
|
|
15
|
+
/** Slack app token for Socket Mode (xapp-...) */
|
|
16
|
+
appToken: string;
|
|
17
|
+
/** Message router for processing messages */
|
|
18
|
+
messageRouter: MessageRouter;
|
|
19
|
+
/** Gateway configuration */
|
|
20
|
+
config?: Partial<SlackGatewayConfig>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Slack Gateway class
|
|
24
|
+
*
|
|
25
|
+
* Connects to Slack via Socket Mode and routes messages
|
|
26
|
+
* to the MessageRouter for processing.
|
|
27
|
+
*/
|
|
28
|
+
export declare class SlackGateway implements Gateway {
|
|
29
|
+
readonly source: "slack";
|
|
30
|
+
private socketClient;
|
|
31
|
+
private webClient;
|
|
32
|
+
private messageRouter;
|
|
33
|
+
private config;
|
|
34
|
+
private eventHandlers;
|
|
35
|
+
private connected;
|
|
36
|
+
constructor(options: SlackGatewayOptions);
|
|
37
|
+
/**
|
|
38
|
+
* Set up Socket Mode event listeners
|
|
39
|
+
*/
|
|
40
|
+
private setupEventListeners;
|
|
41
|
+
/**
|
|
42
|
+
* Handle incoming Slack message
|
|
43
|
+
*/
|
|
44
|
+
private handleMessage;
|
|
45
|
+
/**
|
|
46
|
+
* Check if bot should respond to this message
|
|
47
|
+
*/
|
|
48
|
+
private shouldRespond;
|
|
49
|
+
/**
|
|
50
|
+
* Clean message content (remove mentions)
|
|
51
|
+
*/
|
|
52
|
+
private cleanMessageContent;
|
|
53
|
+
/**
|
|
54
|
+
* Send response to Slack (handling length limits and threading)
|
|
55
|
+
*/
|
|
56
|
+
private sendResponse;
|
|
57
|
+
/**
|
|
58
|
+
* Emit event to registered handlers
|
|
59
|
+
*/
|
|
60
|
+
private emitEvent;
|
|
61
|
+
/**
|
|
62
|
+
* Start the Slack gateway
|
|
63
|
+
*/
|
|
64
|
+
start(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Stop the Slack gateway
|
|
67
|
+
*/
|
|
68
|
+
stop(): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Check if gateway is connected
|
|
71
|
+
*/
|
|
72
|
+
isConnected(): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Register event handler
|
|
75
|
+
*/
|
|
76
|
+
onEvent(handler: GatewayEventHandler): void;
|
|
77
|
+
/**
|
|
78
|
+
* Update gateway configuration
|
|
79
|
+
*/
|
|
80
|
+
setConfig(config: Partial<SlackGatewayConfig>): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get current configuration
|
|
83
|
+
*/
|
|
84
|
+
getConfig(): SlackGatewayConfig;
|
|
85
|
+
/**
|
|
86
|
+
* Add channel configuration
|
|
87
|
+
*/
|
|
88
|
+
addChannelConfig(channelId: string, config: SlackChannelConfig): void;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/gateways/slack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EACV,OAAO,EAEP,mBAAmB,EAEnB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAgBpB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,aAAa,EAAE,aAAa,CAAC;IAC7B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,OAAO;IAC1C,QAAQ,CAAC,MAAM,EAAG,OAAO,CAAU;IAEnC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,mBAAmB;IAoBxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsD3B;;OAEG;YACW,aAAa;IAgE3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;YACW,YAAY;IAa1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAQ3C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IASpD;;OAEG;IACH,SAAS,IAAI,kBAAkB;IAI/B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI;CAItE"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Slack Gateway for MAMA Standalone
|
|
4
|
+
*
|
|
5
|
+
* Provides Slack integration using Socket Mode for receiving and responding to messages.
|
|
6
|
+
* Supports both DM and channel mentions with thread context preservation.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SlackGateway = void 0;
|
|
10
|
+
const socket_mode_1 = require("@slack/socket-mode");
|
|
11
|
+
const web_api_1 = require("@slack/web-api");
|
|
12
|
+
const message_splitter_js_1 = require("./message-splitter.js");
|
|
13
|
+
/**
|
|
14
|
+
* Slack Gateway class
|
|
15
|
+
*
|
|
16
|
+
* Connects to Slack via Socket Mode and routes messages
|
|
17
|
+
* to the MessageRouter for processing.
|
|
18
|
+
*/
|
|
19
|
+
class SlackGateway {
|
|
20
|
+
source = 'slack';
|
|
21
|
+
socketClient;
|
|
22
|
+
webClient;
|
|
23
|
+
messageRouter;
|
|
24
|
+
config;
|
|
25
|
+
eventHandlers = [];
|
|
26
|
+
connected = false;
|
|
27
|
+
constructor(options) {
|
|
28
|
+
this.messageRouter = options.messageRouter;
|
|
29
|
+
this.config = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
botToken: options.botToken,
|
|
32
|
+
appToken: options.appToken,
|
|
33
|
+
channels: options.config?.channels || {},
|
|
34
|
+
};
|
|
35
|
+
// Create Socket Mode client for real-time events
|
|
36
|
+
this.socketClient = new socket_mode_1.SocketModeClient({
|
|
37
|
+
appToken: options.appToken,
|
|
38
|
+
});
|
|
39
|
+
// Create Web client for API calls
|
|
40
|
+
this.webClient = new web_api_1.WebClient(options.botToken);
|
|
41
|
+
this.setupEventListeners();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Set up Socket Mode event listeners
|
|
45
|
+
*/
|
|
46
|
+
setupEventListeners() {
|
|
47
|
+
// Connection events
|
|
48
|
+
this.socketClient.on('connected', () => {
|
|
49
|
+
console.log('Slack gateway connected via Socket Mode');
|
|
50
|
+
this.connected = true;
|
|
51
|
+
this.emitEvent({
|
|
52
|
+
type: 'connected',
|
|
53
|
+
source: 'slack',
|
|
54
|
+
timestamp: new Date(),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
this.socketClient.on('disconnected', () => {
|
|
58
|
+
this.connected = false;
|
|
59
|
+
this.emitEvent({
|
|
60
|
+
type: 'disconnected',
|
|
61
|
+
source: 'slack',
|
|
62
|
+
timestamp: new Date(),
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// Direct message events
|
|
66
|
+
this.socketClient.on('message', async ({ event, ack }) => {
|
|
67
|
+
try {
|
|
68
|
+
await ack();
|
|
69
|
+
await this.handleMessage(event, false);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Error handling Slack message:', error);
|
|
73
|
+
this.emitEvent({
|
|
74
|
+
type: 'error',
|
|
75
|
+
source: 'slack',
|
|
76
|
+
timestamp: new Date(),
|
|
77
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
// App mention events (when @bot is mentioned in a channel)
|
|
82
|
+
this.socketClient.on('app_mention', async ({ event, ack }) => {
|
|
83
|
+
try {
|
|
84
|
+
await ack();
|
|
85
|
+
await this.handleMessage(event, true);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('Error handling Slack mention:', error);
|
|
89
|
+
this.emitEvent({
|
|
90
|
+
type: 'error',
|
|
91
|
+
source: 'slack',
|
|
92
|
+
timestamp: new Date(),
|
|
93
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Handle incoming Slack message
|
|
100
|
+
*/
|
|
101
|
+
async handleMessage(event, isMention) {
|
|
102
|
+
// Ignore bot messages
|
|
103
|
+
if (event.bot_id)
|
|
104
|
+
return;
|
|
105
|
+
const isDM = event.channel_type === 'im';
|
|
106
|
+
// Check if we should respond to this message
|
|
107
|
+
if (!this.shouldRespond(event, isDM, isMention)) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Emit message received event
|
|
111
|
+
this.emitEvent({
|
|
112
|
+
type: 'message_received',
|
|
113
|
+
source: 'slack',
|
|
114
|
+
timestamp: new Date(),
|
|
115
|
+
data: {
|
|
116
|
+
channelId: event.channel,
|
|
117
|
+
userId: event.user,
|
|
118
|
+
isDM,
|
|
119
|
+
isMention,
|
|
120
|
+
hasThread: !!event.thread_ts,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
// Remove mentions from message content
|
|
124
|
+
const cleanContent = this.cleanMessageContent(event.text);
|
|
125
|
+
if (!cleanContent.trim()) {
|
|
126
|
+
return; // Don't process empty messages
|
|
127
|
+
}
|
|
128
|
+
// Normalize message for router
|
|
129
|
+
const normalizedMessage = {
|
|
130
|
+
source: 'slack',
|
|
131
|
+
channelId: event.channel,
|
|
132
|
+
userId: event.user,
|
|
133
|
+
text: cleanContent,
|
|
134
|
+
metadata: {
|
|
135
|
+
threadTs: event.thread_ts || event.ts,
|
|
136
|
+
messageId: event.ts,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
// Process through message router
|
|
140
|
+
const result = await this.messageRouter.process(normalizedMessage);
|
|
141
|
+
// Send response in thread
|
|
142
|
+
await this.sendResponse(event, result.response);
|
|
143
|
+
// Emit message sent event
|
|
144
|
+
this.emitEvent({
|
|
145
|
+
type: 'message_sent',
|
|
146
|
+
source: 'slack',
|
|
147
|
+
timestamp: new Date(),
|
|
148
|
+
data: {
|
|
149
|
+
channelId: event.channel,
|
|
150
|
+
responseLength: result.response.length,
|
|
151
|
+
duration: result.duration,
|
|
152
|
+
threadTs: event.thread_ts || event.ts,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Check if bot should respond to this message
|
|
158
|
+
*/
|
|
159
|
+
shouldRespond(event, isDM, isMention) {
|
|
160
|
+
// Always respond to DMs
|
|
161
|
+
if (isDM)
|
|
162
|
+
return true;
|
|
163
|
+
// For channel messages, check if mention is required
|
|
164
|
+
const channelConfig = this.config.channels?.[event.channel];
|
|
165
|
+
if (channelConfig) {
|
|
166
|
+
// Channel-specific config
|
|
167
|
+
if (channelConfig.requireMention === false) {
|
|
168
|
+
return true; // No mention required for this channel
|
|
169
|
+
}
|
|
170
|
+
return isMention;
|
|
171
|
+
}
|
|
172
|
+
// Default: require mention for channel messages
|
|
173
|
+
return isMention;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Clean message content (remove mentions)
|
|
177
|
+
*/
|
|
178
|
+
cleanMessageContent(content) {
|
|
179
|
+
// Remove user/bot mentions (<@U12345> or <@W12345>)
|
|
180
|
+
return content
|
|
181
|
+
.replace(/<@[UW]\w+>/g, '')
|
|
182
|
+
.replace(/<@[UW]\w+\|[^>]+>/g, '') // Mentions with display name
|
|
183
|
+
.trim();
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Send response to Slack (handling length limits and threading)
|
|
187
|
+
*/
|
|
188
|
+
async sendResponse(originalEvent, response) {
|
|
189
|
+
const threadTs = originalEvent.thread_ts || originalEvent.ts;
|
|
190
|
+
const chunks = (0, message_splitter_js_1.splitForSlack)(response);
|
|
191
|
+
for (const chunk of chunks) {
|
|
192
|
+
await this.webClient.chat.postMessage({
|
|
193
|
+
channel: originalEvent.channel,
|
|
194
|
+
text: chunk,
|
|
195
|
+
thread_ts: threadTs, // Always reply in thread
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Emit event to registered handlers
|
|
201
|
+
*/
|
|
202
|
+
emitEvent(event) {
|
|
203
|
+
for (const handler of this.eventHandlers) {
|
|
204
|
+
try {
|
|
205
|
+
handler(event);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
console.error('Error in gateway event handler:', error);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ============================================================================
|
|
213
|
+
// Gateway Interface Implementation
|
|
214
|
+
// ============================================================================
|
|
215
|
+
/**
|
|
216
|
+
* Start the Slack gateway
|
|
217
|
+
*/
|
|
218
|
+
async start() {
|
|
219
|
+
if (this.connected) {
|
|
220
|
+
console.log('Slack gateway already connected');
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
await this.socketClient.start();
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Stop the Slack gateway
|
|
227
|
+
*/
|
|
228
|
+
async stop() {
|
|
229
|
+
if (!this.connected) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
await this.socketClient.disconnect();
|
|
233
|
+
this.connected = false;
|
|
234
|
+
this.emitEvent({
|
|
235
|
+
type: 'disconnected',
|
|
236
|
+
source: 'slack',
|
|
237
|
+
timestamp: new Date(),
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if gateway is connected
|
|
242
|
+
*/
|
|
243
|
+
isConnected() {
|
|
244
|
+
return this.connected;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Register event handler
|
|
248
|
+
*/
|
|
249
|
+
onEvent(handler) {
|
|
250
|
+
this.eventHandlers.push(handler);
|
|
251
|
+
}
|
|
252
|
+
// ============================================================================
|
|
253
|
+
// Configuration
|
|
254
|
+
// ============================================================================
|
|
255
|
+
/**
|
|
256
|
+
* Update gateway configuration
|
|
257
|
+
*/
|
|
258
|
+
setConfig(config) {
|
|
259
|
+
if (config.channels) {
|
|
260
|
+
this.config.channels = { ...this.config.channels, ...config.channels };
|
|
261
|
+
}
|
|
262
|
+
if (config.enabled !== undefined) {
|
|
263
|
+
this.config.enabled = config.enabled;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get current configuration
|
|
268
|
+
*/
|
|
269
|
+
getConfig() {
|
|
270
|
+
return { ...this.config };
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Add channel configuration
|
|
274
|
+
*/
|
|
275
|
+
addChannelConfig(channelId, config) {
|
|
276
|
+
this.config.channels = this.config.channels || {};
|
|
277
|
+
this.config.channels[channelId] = config;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.SlackGateway = SlackGateway;
|
|
281
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/gateways/slack.ts"],"names":[],"mappings":"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"}
|