@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,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Pool - Claude CLI Session Reuse Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages Claude CLI session IDs per channel to enable conversation continuity.
|
|
6
|
+
* Instead of creating new sessions for each message, reuses existing sessions
|
|
7
|
+
* so Claude CLI maintains its own conversation history.
|
|
8
|
+
*
|
|
9
|
+
* Benefits:
|
|
10
|
+
* - 6x token reduction (no manual history injection needed)
|
|
11
|
+
* - Natural conversation flow (Claude remembers context)
|
|
12
|
+
* - Automatic summarization by Claude when context fills up
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SessionPool = void 0;
|
|
16
|
+
exports.getSessionPool = getSessionPool;
|
|
17
|
+
exports.setSessionPool = setSessionPool;
|
|
18
|
+
exports.buildChannelKey = buildChannelKey;
|
|
19
|
+
const crypto_1 = require("crypto");
|
|
20
|
+
/**
|
|
21
|
+
* Context window threshold (80% of 200K)
|
|
22
|
+
* When exceeded, session will be reset on next request
|
|
23
|
+
*/
|
|
24
|
+
const CONTEXT_THRESHOLD_TOKENS = 160000;
|
|
25
|
+
const DEFAULT_SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
26
|
+
const DEFAULT_MAX_SESSIONS = 100;
|
|
27
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
28
|
+
/**
|
|
29
|
+
* Session Pool for Claude CLI session management
|
|
30
|
+
*
|
|
31
|
+
* Key design:
|
|
32
|
+
* - Channel key format: "{source}:{channelId}" (e.g., "discord:123456")
|
|
33
|
+
* - Sessions expire after timeout (default 30 min)
|
|
34
|
+
* - Automatic cleanup of stale sessions
|
|
35
|
+
*/
|
|
36
|
+
class SessionPool {
|
|
37
|
+
sessions = new Map();
|
|
38
|
+
config;
|
|
39
|
+
cleanupTimer = null;
|
|
40
|
+
constructor(config = {}) {
|
|
41
|
+
this.config = {
|
|
42
|
+
sessionTimeoutMs: config.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS,
|
|
43
|
+
maxSessions: config.maxSessions ?? DEFAULT_MAX_SESSIONS,
|
|
44
|
+
cleanupIntervalMs: config.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS,
|
|
45
|
+
};
|
|
46
|
+
// Start periodic cleanup
|
|
47
|
+
this.startCleanupTimer();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get or create session ID for a channel
|
|
51
|
+
*
|
|
52
|
+
* With --no-session-persistence flag, Claude CLI doesn't lock session IDs.
|
|
53
|
+
* This allows session reuse for conversation continuity.
|
|
54
|
+
*
|
|
55
|
+
* Auto-resets session when context window reaches 80% (160K tokens).
|
|
56
|
+
*
|
|
57
|
+
* @param channelKey - Channel identifier (format: "{source}:{channelId}")
|
|
58
|
+
* @returns Object with sessionId and isNew flag
|
|
59
|
+
*/
|
|
60
|
+
getSession(channelKey) {
|
|
61
|
+
const existing = this.sessions.get(channelKey);
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
// Check if existing session is still valid
|
|
64
|
+
if (existing) {
|
|
65
|
+
const isExpired = now - existing.lastActive > this.config.sessionTimeoutMs;
|
|
66
|
+
const isContextFull = existing.totalInputTokens >= CONTEXT_THRESHOLD_TOKENS;
|
|
67
|
+
if (isExpired) {
|
|
68
|
+
this.sessions.delete(channelKey);
|
|
69
|
+
console.log(`[SessionPool] Session expired for ${channelKey}, creating new one`);
|
|
70
|
+
}
|
|
71
|
+
else if (isContextFull) {
|
|
72
|
+
this.sessions.delete(channelKey);
|
|
73
|
+
console.log(`[SessionPool] Context 80% full (${existing.totalInputTokens} tokens) for ${channelKey}, creating fresh session`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Reuse existing session
|
|
77
|
+
existing.lastActive = now;
|
|
78
|
+
existing.messageCount++;
|
|
79
|
+
const usagePercent = Math.round((existing.totalInputTokens / 200000) * 100);
|
|
80
|
+
console.log(`[SessionPool] Reusing session for ${channelKey}: ${existing.sessionId} (msg #${existing.messageCount}, ${usagePercent}% context)`);
|
|
81
|
+
return { sessionId: existing.sessionId, isNew: false };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Create new session
|
|
85
|
+
const sessionId = this.createSession(channelKey);
|
|
86
|
+
return { sessionId, isNew: true };
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Update token usage for a session
|
|
90
|
+
* Called after each Claude CLI response
|
|
91
|
+
*
|
|
92
|
+
* @param channelKey - Channel identifier
|
|
93
|
+
* @param inputTokens - Input tokens from this request
|
|
94
|
+
* @returns Current total tokens and whether threshold is approaching
|
|
95
|
+
*/
|
|
96
|
+
updateTokens(channelKey, inputTokens) {
|
|
97
|
+
const existing = this.sessions.get(channelKey);
|
|
98
|
+
if (!existing) {
|
|
99
|
+
return { totalTokens: 0, nearThreshold: false };
|
|
100
|
+
}
|
|
101
|
+
existing.totalInputTokens += inputTokens;
|
|
102
|
+
const nearThreshold = existing.totalInputTokens >= CONTEXT_THRESHOLD_TOKENS * 0.9; // 90% of threshold
|
|
103
|
+
if (nearThreshold) {
|
|
104
|
+
console.log(`[SessionPool] ⚠️ Context approaching limit: ${existing.totalInputTokens} tokens (${Math.round(existing.totalInputTokens / 2000)}% of 200K)`);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
totalTokens: existing.totalInputTokens,
|
|
108
|
+
nearThreshold,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get current token usage for a session
|
|
113
|
+
*/
|
|
114
|
+
getTokenUsage(channelKey) {
|
|
115
|
+
const existing = this.sessions.get(channelKey);
|
|
116
|
+
return existing?.totalInputTokens ?? 0;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Legacy method for backward compatibility
|
|
120
|
+
* @deprecated Use getSession() instead
|
|
121
|
+
*/
|
|
122
|
+
getSessionId(channelKey) {
|
|
123
|
+
return this.getSession(channelKey).sessionId;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Release a session after use (no-op since we use fresh sessions)
|
|
127
|
+
*/
|
|
128
|
+
releaseSession(_channelKey) {
|
|
129
|
+
// No-op: Each request uses a fresh session ID
|
|
130
|
+
// Claude CLI locks session IDs, preventing reuse
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Create a new session for a channel
|
|
134
|
+
*/
|
|
135
|
+
createSession(channelKey) {
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
const sessionId = (0, crypto_1.randomUUID)();
|
|
138
|
+
// Enforce max sessions limit
|
|
139
|
+
if (this.sessions.size >= this.config.maxSessions) {
|
|
140
|
+
this.evictOldestSession();
|
|
141
|
+
}
|
|
142
|
+
const entry = {
|
|
143
|
+
sessionId,
|
|
144
|
+
lastActive: now,
|
|
145
|
+
messageCount: 1,
|
|
146
|
+
createdAt: now,
|
|
147
|
+
inUse: true, // Lock on creation
|
|
148
|
+
totalInputTokens: 0,
|
|
149
|
+
};
|
|
150
|
+
this.sessions.set(channelKey, entry);
|
|
151
|
+
console.log(`[SessionPool] Created new session for ${channelKey}: ${sessionId}`);
|
|
152
|
+
return sessionId;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Force create a new session (for /clear command)
|
|
156
|
+
*/
|
|
157
|
+
resetSession(channelKey) {
|
|
158
|
+
this.sessions.delete(channelKey);
|
|
159
|
+
return this.createSession(channelKey);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if a session exists and is active
|
|
163
|
+
*/
|
|
164
|
+
hasActiveSession(channelKey) {
|
|
165
|
+
const existing = this.sessions.get(channelKey);
|
|
166
|
+
if (!existing)
|
|
167
|
+
return false;
|
|
168
|
+
const isExpired = Date.now() - existing.lastActive > this.config.sessionTimeoutMs;
|
|
169
|
+
return !isExpired;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get session info for a channel
|
|
173
|
+
*/
|
|
174
|
+
getSessionInfo(channelKey) {
|
|
175
|
+
return this.sessions.get(channelKey) || null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get all active sessions (for debugging/monitoring)
|
|
179
|
+
*/
|
|
180
|
+
listSessions() {
|
|
181
|
+
return new Map(this.sessions);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get active session count
|
|
185
|
+
*/
|
|
186
|
+
getActiveSessionCount() {
|
|
187
|
+
return this.sessions.size;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Evict the oldest (least recently used) session
|
|
191
|
+
*/
|
|
192
|
+
evictOldestSession() {
|
|
193
|
+
let oldestKey = null;
|
|
194
|
+
let oldestTime = Infinity;
|
|
195
|
+
for (const [key, entry] of this.sessions) {
|
|
196
|
+
if (entry.lastActive < oldestTime) {
|
|
197
|
+
oldestTime = entry.lastActive;
|
|
198
|
+
oldestKey = key;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (oldestKey) {
|
|
202
|
+
this.sessions.delete(oldestKey);
|
|
203
|
+
console.log(`[SessionPool] Evicted oldest session: ${oldestKey}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clean up expired sessions
|
|
208
|
+
*/
|
|
209
|
+
cleanup() {
|
|
210
|
+
const now = Date.now();
|
|
211
|
+
let cleaned = 0;
|
|
212
|
+
for (const [key, entry] of this.sessions) {
|
|
213
|
+
if (now - entry.lastActive > this.config.sessionTimeoutMs) {
|
|
214
|
+
this.sessions.delete(key);
|
|
215
|
+
cleaned++;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (cleaned > 0) {
|
|
219
|
+
console.log(`[SessionPool] Cleaned up ${cleaned} expired sessions`);
|
|
220
|
+
}
|
|
221
|
+
return cleaned;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Start periodic cleanup timer
|
|
225
|
+
*/
|
|
226
|
+
startCleanupTimer() {
|
|
227
|
+
if (this.cleanupTimer)
|
|
228
|
+
return;
|
|
229
|
+
this.cleanupTimer = setInterval(() => {
|
|
230
|
+
this.cleanup();
|
|
231
|
+
}, this.config.cleanupIntervalMs);
|
|
232
|
+
// Don't prevent process exit
|
|
233
|
+
this.cleanupTimer.unref();
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Stop cleanup timer and clear all sessions
|
|
237
|
+
*/
|
|
238
|
+
dispose() {
|
|
239
|
+
if (this.cleanupTimer) {
|
|
240
|
+
clearInterval(this.cleanupTimer);
|
|
241
|
+
this.cleanupTimer = null;
|
|
242
|
+
}
|
|
243
|
+
this.sessions.clear();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.SessionPool = SessionPool;
|
|
247
|
+
/**
|
|
248
|
+
* Global session pool instance
|
|
249
|
+
*/
|
|
250
|
+
let globalSessionPool = null;
|
|
251
|
+
/**
|
|
252
|
+
* Get global session pool instance
|
|
253
|
+
*/
|
|
254
|
+
function getSessionPool() {
|
|
255
|
+
if (!globalSessionPool) {
|
|
256
|
+
globalSessionPool = new SessionPool();
|
|
257
|
+
}
|
|
258
|
+
return globalSessionPool;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Set global session pool instance (for testing)
|
|
262
|
+
*/
|
|
263
|
+
function setSessionPool(pool) {
|
|
264
|
+
globalSessionPool = pool;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Build channel key from source and channel ID
|
|
268
|
+
*/
|
|
269
|
+
function buildChannelKey(source, channelId) {
|
|
270
|
+
return `${source}:${channelId}`;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=session-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-pool.js","sourceRoot":"","sources":["../../src/agent/session-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Callback Manager
|
|
3
|
+
*
|
|
4
|
+
* Coordinates callbacks between ClaudeClient and Discord gateway.
|
|
5
|
+
* Manages placeholder message creation, text accumulation, and error handling.
|
|
6
|
+
*/
|
|
7
|
+
import type { Message } from 'discord.js';
|
|
8
|
+
import type { ClaudeResponse } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Interface for Discord gateway operations
|
|
11
|
+
*/
|
|
12
|
+
export interface DiscordGatewayInterface {
|
|
13
|
+
/**
|
|
14
|
+
* Edit a message with throttling to prevent rate limits
|
|
15
|
+
* @param message Discord message to edit
|
|
16
|
+
* @param content New message content
|
|
17
|
+
*/
|
|
18
|
+
editMessageThrottled(message: Message, content: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Manages streaming callbacks and coordinates with Discord gateway
|
|
22
|
+
*
|
|
23
|
+
* Responsibilities:
|
|
24
|
+
* - Create placeholder message before streaming starts
|
|
25
|
+
* - Accumulate text deltas and update Discord message
|
|
26
|
+
* - Track tool use events
|
|
27
|
+
* - Handle errors and update placeholder with error message
|
|
28
|
+
* - Clean up references after streaming completes
|
|
29
|
+
*/
|
|
30
|
+
export declare class StreamingCallbackManager {
|
|
31
|
+
private discordGateway;
|
|
32
|
+
private originalMessage;
|
|
33
|
+
private placeholderMessage;
|
|
34
|
+
private accumulatedText;
|
|
35
|
+
/**
|
|
36
|
+
* Create a new streaming callback manager
|
|
37
|
+
* @param discordGateway Discord gateway for message operations
|
|
38
|
+
* @param originalMessage Original message to reply to
|
|
39
|
+
*/
|
|
40
|
+
constructor(discordGateway: DiscordGatewayInterface, originalMessage: Message);
|
|
41
|
+
/**
|
|
42
|
+
* Create a placeholder message to be updated with streaming content
|
|
43
|
+
* @throws Error if message creation fails
|
|
44
|
+
*/
|
|
45
|
+
createPlaceholder(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Handle text delta from streaming response
|
|
48
|
+
* Accumulates text and updates Discord message
|
|
49
|
+
* @param text Text delta to add
|
|
50
|
+
*/
|
|
51
|
+
onDelta(text: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Handle tool use event
|
|
54
|
+
* @param name Tool name
|
|
55
|
+
* @param _input Tool input
|
|
56
|
+
*/
|
|
57
|
+
onToolUse(name: string, _input: unknown): void;
|
|
58
|
+
/**
|
|
59
|
+
* Handle final response from streaming
|
|
60
|
+
* @param _response Final Claude response
|
|
61
|
+
*/
|
|
62
|
+
onFinal(_response: ClaudeResponse): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Handle error during streaming
|
|
65
|
+
* Updates placeholder message with error information
|
|
66
|
+
* @param error Error that occurred
|
|
67
|
+
*/
|
|
68
|
+
onError(error: Error): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Clean up resources and clear references
|
|
71
|
+
* Should be called after streaming completes
|
|
72
|
+
*/
|
|
73
|
+
cleanup(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get the current placeholder message
|
|
76
|
+
* @returns Placeholder message or null if not created
|
|
77
|
+
*/
|
|
78
|
+
getPlaceholderMessage(): Message | null;
|
|
79
|
+
/**
|
|
80
|
+
* Get the accumulated text so far
|
|
81
|
+
* @returns Accumulated text content
|
|
82
|
+
*/
|
|
83
|
+
getAccumulatedText(): string;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=streaming-callback-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-callback-manager.d.ts","sourceRoot":"","sources":["../../src/agent/streaming-callback-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IAUjC,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IAVzB,OAAO,CAAC,kBAAkB,CAAwB;IAClD,OAAO,CAAC,eAAe,CAAM;IAE7B;;;;OAIG;gBAEO,cAAc,EAAE,uBAAuB,EACvC,eAAe,EAAE,OAAO;IAGlC;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAI9C;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;OAGG;IACH,qBAAqB,IAAI,OAAO,GAAG,IAAI;IAIvC;;;OAGG;IACH,kBAAkB,IAAI,MAAM;CAG7B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Streaming Callback Manager
|
|
4
|
+
*
|
|
5
|
+
* Coordinates callbacks between ClaudeClient and Discord gateway.
|
|
6
|
+
* Manages placeholder message creation, text accumulation, and error handling.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.StreamingCallbackManager = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Manages streaming callbacks and coordinates with Discord gateway
|
|
12
|
+
*
|
|
13
|
+
* Responsibilities:
|
|
14
|
+
* - Create placeholder message before streaming starts
|
|
15
|
+
* - Accumulate text deltas and update Discord message
|
|
16
|
+
* - Track tool use events
|
|
17
|
+
* - Handle errors and update placeholder with error message
|
|
18
|
+
* - Clean up references after streaming completes
|
|
19
|
+
*/
|
|
20
|
+
class StreamingCallbackManager {
|
|
21
|
+
discordGateway;
|
|
22
|
+
originalMessage;
|
|
23
|
+
placeholderMessage = null;
|
|
24
|
+
accumulatedText = '';
|
|
25
|
+
/**
|
|
26
|
+
* Create a new streaming callback manager
|
|
27
|
+
* @param discordGateway Discord gateway for message operations
|
|
28
|
+
* @param originalMessage Original message to reply to
|
|
29
|
+
*/
|
|
30
|
+
constructor(discordGateway, originalMessage) {
|
|
31
|
+
this.discordGateway = discordGateway;
|
|
32
|
+
this.originalMessage = originalMessage;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a placeholder message to be updated with streaming content
|
|
36
|
+
* @throws Error if message creation fails
|
|
37
|
+
*/
|
|
38
|
+
async createPlaceholder() {
|
|
39
|
+
this.placeholderMessage = await this.originalMessage.reply('⏳ Processing...');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle text delta from streaming response
|
|
43
|
+
* Accumulates text and updates Discord message
|
|
44
|
+
* @param text Text delta to add
|
|
45
|
+
*/
|
|
46
|
+
async onDelta(text) {
|
|
47
|
+
this.accumulatedText += text;
|
|
48
|
+
if (this.placeholderMessage) {
|
|
49
|
+
await this.discordGateway.editMessageThrottled(this.placeholderMessage, this.accumulatedText);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Handle tool use event
|
|
54
|
+
* @param name Tool name
|
|
55
|
+
* @param _input Tool input
|
|
56
|
+
*/
|
|
57
|
+
onToolUse(name, _input) {
|
|
58
|
+
console.log(`[Streaming] Tool called: ${name}`);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Handle final response from streaming
|
|
62
|
+
* @param _response Final Claude response
|
|
63
|
+
*/
|
|
64
|
+
async onFinal(_response) {
|
|
65
|
+
console.log('[Streaming] Stream complete');
|
|
66
|
+
// Final flush handled by Discord gateway's throttle mechanism
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Handle error during streaming
|
|
70
|
+
* Updates placeholder message with error information
|
|
71
|
+
* @param error Error that occurred
|
|
72
|
+
*/
|
|
73
|
+
async onError(error) {
|
|
74
|
+
console.error('[Streaming] Error:', error);
|
|
75
|
+
if (this.placeholderMessage) {
|
|
76
|
+
await this.placeholderMessage.edit(`❌ Translation failed: ${error.message}\n\nPlease try again or use a smaller image.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Clean up resources and clear references
|
|
81
|
+
* Should be called after streaming completes
|
|
82
|
+
*/
|
|
83
|
+
async cleanup() {
|
|
84
|
+
this.placeholderMessage = null;
|
|
85
|
+
this.accumulatedText = '';
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the current placeholder message
|
|
89
|
+
* @returns Placeholder message or null if not created
|
|
90
|
+
*/
|
|
91
|
+
getPlaceholderMessage() {
|
|
92
|
+
return this.placeholderMessage;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get the accumulated text so far
|
|
96
|
+
* @returns Accumulated text content
|
|
97
|
+
*/
|
|
98
|
+
getAccumulatedText() {
|
|
99
|
+
return this.accumulatedText;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.StreamingCallbackManager = StreamingCallbackManager;
|
|
103
|
+
//# sourceMappingURL=streaming-callback-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-callback-manager.js","sourceRoot":"","sources":["../../src/agent/streaming-callback-manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAiBH;;;;;;;;;GASG;AACH,MAAa,wBAAwB;IAUzB;IACA;IAVF,kBAAkB,GAAmB,IAAI,CAAC;IAC1C,eAAe,GAAG,EAAE,CAAC;IAE7B;;;;OAIG;IACH,YACU,cAAuC,EACvC,eAAwB;QADxB,mBAAc,GAAd,cAAc,CAAyB;QACvC,oBAAe,GAAf,eAAe,CAAS;IAC/B,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;QAC7B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,IAAY,EAAE,MAAe;QACrC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,SAAyB;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,8DAA8D;IAChE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,KAAY;QACxB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAChC,yBAAyB,KAAK,CAAC,OAAO,8CAA8C,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AA1FD,4DA0FC"}
|