@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,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Recall Module for MAMA Standalone
|
|
4
|
+
*
|
|
5
|
+
* OpenClaw 플러그인의 auto-recall 로직을 standalone으로 이식.
|
|
6
|
+
* 에이전트 시작 전에 관련 메모리를 자동으로 검색하여 컨텍스트에 주입.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - 프롬프트 기반 시맨틱 검색
|
|
10
|
+
* - 최근 체크포인트 로드
|
|
11
|
+
* - 관련 결정 컨텍스트 주입
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.autoRecall = autoRecall;
|
|
18
|
+
exports.getMAMAApi = getMAMAApi;
|
|
19
|
+
exports.isInitialized = isInitialized;
|
|
20
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
21
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
22
|
+
// Singleton state
|
|
23
|
+
let initialized = false;
|
|
24
|
+
let mamaApi = null;
|
|
25
|
+
/**
|
|
26
|
+
* Format reasoning with link extraction (OpenClaw 로직 재사용)
|
|
27
|
+
*/
|
|
28
|
+
function formatReasoning(reasoning, maxLen = 80) {
|
|
29
|
+
if (!reasoning)
|
|
30
|
+
return '';
|
|
31
|
+
// Extract link patterns
|
|
32
|
+
const linkMatch = reasoning.match(/(builds_on|debates|synthesizes):\s*[\w\[\],\s_-]+/i);
|
|
33
|
+
// Truncate main reasoning
|
|
34
|
+
const truncated = reasoning.length > maxLen ? reasoning.substring(0, maxLen) + '...' : reasoning;
|
|
35
|
+
// Add link info if found and not already in truncated part
|
|
36
|
+
if (linkMatch && !truncated.includes(linkMatch[0])) {
|
|
37
|
+
return `${truncated}\n 🔗 ${linkMatch[0]}`;
|
|
38
|
+
}
|
|
39
|
+
return truncated;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize MAMA API (lazy, singleton)
|
|
43
|
+
*/
|
|
44
|
+
async function initMAMA(dbPath) {
|
|
45
|
+
if (initialized && mamaApi) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const finalDbPath = dbPath || process.env.MAMA_DB_PATH || node_path_1.default.join(node_os_1.default.homedir(), '.claude/mama-memory.db');
|
|
49
|
+
process.env.MAMA_DB_PATH = finalDbPath;
|
|
50
|
+
try {
|
|
51
|
+
// Dynamic import of mama-server modules
|
|
52
|
+
const mamaModulePath = node_path_1.default.dirname(require.resolve('@jungjaehoon/mama-server/src/mama/mama-api.js'));
|
|
53
|
+
mamaApi = require(node_path_1.default.join(mamaModulePath, 'mama-api.js'));
|
|
54
|
+
// Initialize database
|
|
55
|
+
const memoryStore = require(node_path_1.default.join(mamaModulePath, 'memory-store.js'));
|
|
56
|
+
await memoryStore.initDB();
|
|
57
|
+
initialized = true;
|
|
58
|
+
console.log(`[AutoRecall] MAMA initialized (db: ${finalDbPath})`);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error('[AutoRecall] MAMA init failed:', err.message);
|
|
62
|
+
// Don't throw - auto-recall should be optional
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 프롬프트 기반 auto-recall 실행
|
|
67
|
+
*
|
|
68
|
+
* OpenClaw의 before_agent_start 훅 로직을 standalone으로 이식.
|
|
69
|
+
*
|
|
70
|
+
* @param userPrompt - 사용자 프롬프트 (시맨틱 검색 쿼리로 사용)
|
|
71
|
+
* @param options - 옵션
|
|
72
|
+
* @returns AutoRecallResult 또는 null (메모리 없음)
|
|
73
|
+
*/
|
|
74
|
+
async function autoRecall(userPrompt, options = {}) {
|
|
75
|
+
try {
|
|
76
|
+
await initMAMA(options.dbPath);
|
|
77
|
+
if (!mamaApi) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const semanticLimit = options.semanticLimit ?? 3;
|
|
81
|
+
const recentLimit = options.recentLimit ?? 3;
|
|
82
|
+
const threshold = options.threshold ?? 0.5;
|
|
83
|
+
// 1. 시맨틱 검색 (프롬프트가 충분히 길 때만)
|
|
84
|
+
let semanticResults = [];
|
|
85
|
+
if (userPrompt && userPrompt.length >= 5) {
|
|
86
|
+
try {
|
|
87
|
+
const searchResult = await mamaApi.suggest(userPrompt, {
|
|
88
|
+
limit: semanticLimit,
|
|
89
|
+
threshold,
|
|
90
|
+
});
|
|
91
|
+
semanticResults = searchResult?.results || [];
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
console.error('[AutoRecall] Semantic search error:', err.message);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 2. 체크포인트 로드
|
|
98
|
+
let checkpoint = null;
|
|
99
|
+
try {
|
|
100
|
+
checkpoint = await mamaApi.loadCheckpoint();
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error('[AutoRecall] Checkpoint load error:', err.message);
|
|
104
|
+
}
|
|
105
|
+
// 3. 최근 결정 로드 (시맨틱 결과가 없을 때만)
|
|
106
|
+
let recentDecisions = [];
|
|
107
|
+
if (semanticResults.length === 0) {
|
|
108
|
+
try {
|
|
109
|
+
recentDecisions = await mamaApi.listDecisions({ limit: recentLimit });
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
console.error('[AutoRecall] Recent decisions error:', err.message);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 4. 컨텍스트가 없으면 null 반환
|
|
116
|
+
if (!checkpoint && semanticResults.length === 0 && recentDecisions.length === 0) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
// 5. 컨텍스트 문자열 생성
|
|
120
|
+
let content = '<relevant-memories>\n';
|
|
121
|
+
content += '# MAMA Memory Context\n\n';
|
|
122
|
+
if (semanticResults.length > 0) {
|
|
123
|
+
content += '## 관련 결정 (시맨틱 매치)\n\n';
|
|
124
|
+
semanticResults.forEach((r) => {
|
|
125
|
+
const pct = Math.round((r.similarity || 0) * 100);
|
|
126
|
+
content += `- **${r.topic}** [${pct}%]: ${r.decision}`;
|
|
127
|
+
if (r.outcome)
|
|
128
|
+
content += ` (${r.outcome})`;
|
|
129
|
+
content += `\n _${formatReasoning(r.reasoning, 100)}_\n`;
|
|
130
|
+
content += ` ID: \`${r.id}\`\n`;
|
|
131
|
+
});
|
|
132
|
+
content += '\n';
|
|
133
|
+
}
|
|
134
|
+
if (checkpoint) {
|
|
135
|
+
const ts = new Date(checkpoint.timestamp).toLocaleString('ko-KR');
|
|
136
|
+
content += `## 마지막 체크포인트 (${ts})\n\n`;
|
|
137
|
+
content += `**요약:** ${checkpoint.summary}\n\n`;
|
|
138
|
+
if (checkpoint.next_steps) {
|
|
139
|
+
content += `**다음 단계:** ${checkpoint.next_steps}\n\n`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (recentDecisions.length > 0) {
|
|
143
|
+
content += '## 최근 결정\n\n';
|
|
144
|
+
recentDecisions.forEach((d) => {
|
|
145
|
+
content += `- **${d.topic}**: ${d.decision}`;
|
|
146
|
+
if (d.outcome)
|
|
147
|
+
content += ` (${d.outcome})`;
|
|
148
|
+
content += '\n';
|
|
149
|
+
});
|
|
150
|
+
content += '\n';
|
|
151
|
+
}
|
|
152
|
+
content += '</relevant-memories>';
|
|
153
|
+
console.log(`[AutoRecall] Found: ${semanticResults.length} semantic, ${recentDecisions.length} recent, checkpoint: ${!!checkpoint}`);
|
|
154
|
+
return {
|
|
155
|
+
context: content,
|
|
156
|
+
semanticMatches: semanticResults.length,
|
|
157
|
+
recentDecisions: recentDecisions.length,
|
|
158
|
+
hasCheckpoint: !!checkpoint,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.error('[AutoRecall] Error:', err.message);
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* MAMA API 직접 접근 (고급 사용)
|
|
168
|
+
*/
|
|
169
|
+
function getMAMAApi() {
|
|
170
|
+
return mamaApi;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 초기화 상태 확인
|
|
174
|
+
*/
|
|
175
|
+
function isInitialized() {
|
|
176
|
+
return initialized;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=auto-recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../../src/agent/auto-recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI Subprocess Wrapper - ToS-Compliant Alternative to Pi Agent
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS:
|
|
5
|
+
* - Current Pi Agent uses OAuth token directly via API (ToS violation, ban risk)
|
|
6
|
+
* - Claude CLI is official Anthropic tool (ToS compliant)
|
|
7
|
+
* - Keeps $200/month subscription benefits vs $1000+/month API costs
|
|
8
|
+
*
|
|
9
|
+
* ARCHITECTURE:
|
|
10
|
+
* - Spawns `claude` CLI as subprocess
|
|
11
|
+
* - Communicates via stdin (prompts) / stdout (JSON responses)
|
|
12
|
+
* - Uses --output-format json for structured data
|
|
13
|
+
* - Session continuity via --session-id flag
|
|
14
|
+
*
|
|
15
|
+
* TRADEOFFS:
|
|
16
|
+
* + ✅ ToS compliant (official Claude tool)
|
|
17
|
+
* + ✅ Keeps subscription pricing
|
|
18
|
+
* + ✅ Real usage tracking (cost, tokens)
|
|
19
|
+
* - ⚠️ More complex than direct API
|
|
20
|
+
* - ⚠️ Requires claude CLI installed
|
|
21
|
+
* - ⚠️ Tool integration via MCP (future work)
|
|
22
|
+
*/
|
|
23
|
+
export interface ClaudeCLIWrapperOptions {
|
|
24
|
+
model?: string;
|
|
25
|
+
sessionId?: string;
|
|
26
|
+
systemPrompt?: string;
|
|
27
|
+
mcpConfigPath?: string;
|
|
28
|
+
dangerouslySkipPermissions?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface PromptCallbacks {
|
|
31
|
+
onDelta?: (text: string) => void;
|
|
32
|
+
onToolUse?: (name: string, input: any) => void;
|
|
33
|
+
onFinal?: (response: any) => void;
|
|
34
|
+
onError?: (error: Error) => void;
|
|
35
|
+
}
|
|
36
|
+
export interface PromptResult {
|
|
37
|
+
response: string;
|
|
38
|
+
usage: {
|
|
39
|
+
input_tokens: number;
|
|
40
|
+
output_tokens: number;
|
|
41
|
+
cache_creation_input_tokens?: number;
|
|
42
|
+
cache_read_input_tokens?: number;
|
|
43
|
+
};
|
|
44
|
+
session_id: string;
|
|
45
|
+
cost_usd?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* ClaudeCLIWrapper - Wraps Claude CLI for programmatic use
|
|
49
|
+
*
|
|
50
|
+
* Usage:
|
|
51
|
+
* const wrapper = new ClaudeCLIWrapper({ sessionId: 'my-session' });
|
|
52
|
+
* const result = await wrapper.prompt('Hello, Claude!', {
|
|
53
|
+
* onDelta: (text) => console.log('Delta:', text)
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* Key Features:
|
|
57
|
+
* - Session continuity (multi-turn conversations)
|
|
58
|
+
* - Real-time streaming (--output-format json streams)
|
|
59
|
+
* - Usage tracking (tokens, cost)
|
|
60
|
+
* - ToS compliant (official CLI)
|
|
61
|
+
*
|
|
62
|
+
* IMPORTANT:
|
|
63
|
+
* - Requires `claude` CLI in PATH
|
|
64
|
+
* - Uses subscription credentials from ~/.claude/.credentials.json
|
|
65
|
+
* - Tools not yet supported (future: via MCP)
|
|
66
|
+
*/
|
|
67
|
+
export declare class ClaudeCLIWrapper {
|
|
68
|
+
private sessionId;
|
|
69
|
+
private options;
|
|
70
|
+
constructor(options?: ClaudeCLIWrapperOptions);
|
|
71
|
+
/**
|
|
72
|
+
* Send a prompt to Claude CLI
|
|
73
|
+
*
|
|
74
|
+
* Workflow:
|
|
75
|
+
* 1. Spawn `claude -p "<prompt>" --output-format json`
|
|
76
|
+
* 2. Parse JSON output (type: result | error | delta)
|
|
77
|
+
* 3. Aggregate deltas for streaming
|
|
78
|
+
* 4. Return final result with usage stats
|
|
79
|
+
*
|
|
80
|
+
* @param content - Prompt text (images not yet supported)
|
|
81
|
+
* @param callbacks - Streaming callbacks
|
|
82
|
+
* @returns PromptResult with response and usage
|
|
83
|
+
*/
|
|
84
|
+
prompt(content: string, callbacks?: PromptCallbacks): Promise<PromptResult>;
|
|
85
|
+
/**
|
|
86
|
+
* Get current session ID
|
|
87
|
+
*/
|
|
88
|
+
getSessionId(): string;
|
|
89
|
+
/**
|
|
90
|
+
* Create a new session (resets conversation history)
|
|
91
|
+
*/
|
|
92
|
+
resetSession(): void;
|
|
93
|
+
/**
|
|
94
|
+
* Set session ID (for channel-specific conversations)
|
|
95
|
+
*/
|
|
96
|
+
setSessionId(sessionId: string): void;
|
|
97
|
+
/**
|
|
98
|
+
* Set system prompt (updates options for next prompt)
|
|
99
|
+
*/
|
|
100
|
+
setSystemPrompt(prompt: string): void;
|
|
101
|
+
/**
|
|
102
|
+
* Get current options (for debugging)
|
|
103
|
+
*/
|
|
104
|
+
getOptions(): ClaudeCLIWrapperOptions;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Usage Example:
|
|
108
|
+
*
|
|
109
|
+
* const wrapper = new ClaudeCLIWrapper({ sessionId: 'discord-channel-123' });
|
|
110
|
+
*
|
|
111
|
+
* // First message
|
|
112
|
+
* const result1 = await wrapper.prompt('Hello, what is 2+2?', {
|
|
113
|
+
* onDelta: (text) => console.log('Streaming:', text)
|
|
114
|
+
* });
|
|
115
|
+
*
|
|
116
|
+
* console.log(result1.response); // "4"
|
|
117
|
+
* console.log(result1.usage.input_tokens); // 3
|
|
118
|
+
* console.log(result1.cost_usd); // 0.045
|
|
119
|
+
*
|
|
120
|
+
* // Follow-up (same session)
|
|
121
|
+
* const result2 = await wrapper.prompt('What about 3+3?');
|
|
122
|
+
* console.log(result2.response); // "6"
|
|
123
|
+
*
|
|
124
|
+
* // Cost Tracking Example:
|
|
125
|
+
* let totalCost = 0;
|
|
126
|
+
* const result = await wrapper.prompt('...');
|
|
127
|
+
* totalCost += result.cost_usd || 0;
|
|
128
|
+
* console.log(`Total spent: $${totalCost.toFixed(4)}`);
|
|
129
|
+
*/
|
|
130
|
+
//# sourceMappingURL=claude-cli-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli-wrapper.d.ts","sourceRoot":"","sources":["../../src/agent/claude-cli-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,2BAA2B,CAAC,EAAE,MAAM,CAAC;QACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,GAAE,uBAA4B;IAKjD;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAoHjF;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,UAAU,IAAI,uBAAuB;CAGtC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude CLI Subprocess Wrapper - ToS-Compliant Alternative to Pi Agent
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS:
|
|
6
|
+
* - Current Pi Agent uses OAuth token directly via API (ToS violation, ban risk)
|
|
7
|
+
* - Claude CLI is official Anthropic tool (ToS compliant)
|
|
8
|
+
* - Keeps $200/month subscription benefits vs $1000+/month API costs
|
|
9
|
+
*
|
|
10
|
+
* ARCHITECTURE:
|
|
11
|
+
* - Spawns `claude` CLI as subprocess
|
|
12
|
+
* - Communicates via stdin (prompts) / stdout (JSON responses)
|
|
13
|
+
* - Uses --output-format json for structured data
|
|
14
|
+
* - Session continuity via --session-id flag
|
|
15
|
+
*
|
|
16
|
+
* TRADEOFFS:
|
|
17
|
+
* + ✅ ToS compliant (official Claude tool)
|
|
18
|
+
* + ✅ Keeps subscription pricing
|
|
19
|
+
* + ✅ Real usage tracking (cost, tokens)
|
|
20
|
+
* - ⚠️ More complex than direct API
|
|
21
|
+
* - ⚠️ Requires claude CLI installed
|
|
22
|
+
* - ⚠️ Tool integration via MCP (future work)
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.ClaudeCLIWrapper = void 0;
|
|
26
|
+
const child_process_1 = require("child_process");
|
|
27
|
+
const crypto_1 = require("crypto");
|
|
28
|
+
/**
|
|
29
|
+
* ClaudeCLIWrapper - Wraps Claude CLI for programmatic use
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* const wrapper = new ClaudeCLIWrapper({ sessionId: 'my-session' });
|
|
33
|
+
* const result = await wrapper.prompt('Hello, Claude!', {
|
|
34
|
+
* onDelta: (text) => console.log('Delta:', text)
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* Key Features:
|
|
38
|
+
* - Session continuity (multi-turn conversations)
|
|
39
|
+
* - Real-time streaming (--output-format json streams)
|
|
40
|
+
* - Usage tracking (tokens, cost)
|
|
41
|
+
* - ToS compliant (official CLI)
|
|
42
|
+
*
|
|
43
|
+
* IMPORTANT:
|
|
44
|
+
* - Requires `claude` CLI in PATH
|
|
45
|
+
* - Uses subscription credentials from ~/.claude/.credentials.json
|
|
46
|
+
* - Tools not yet supported (future: via MCP)
|
|
47
|
+
*/
|
|
48
|
+
class ClaudeCLIWrapper {
|
|
49
|
+
sessionId;
|
|
50
|
+
options;
|
|
51
|
+
constructor(options = {}) {
|
|
52
|
+
this.options = options;
|
|
53
|
+
this.sessionId = options.sessionId || (0, crypto_1.randomUUID)();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Send a prompt to Claude CLI
|
|
57
|
+
*
|
|
58
|
+
* Workflow:
|
|
59
|
+
* 1. Spawn `claude -p "<prompt>" --output-format json`
|
|
60
|
+
* 2. Parse JSON output (type: result | error | delta)
|
|
61
|
+
* 3. Aggregate deltas for streaming
|
|
62
|
+
* 4. Return final result with usage stats
|
|
63
|
+
*
|
|
64
|
+
* @param content - Prompt text (images not yet supported)
|
|
65
|
+
* @param callbacks - Streaming callbacks
|
|
66
|
+
* @returns PromptResult with response and usage
|
|
67
|
+
*/
|
|
68
|
+
async prompt(content, callbacks) {
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const args = [
|
|
71
|
+
'-p',
|
|
72
|
+
content,
|
|
73
|
+
'--output-format',
|
|
74
|
+
'json',
|
|
75
|
+
'--session-id',
|
|
76
|
+
this.sessionId,
|
|
77
|
+
'--no-session-persistence', // Prevent "session already in use" errors
|
|
78
|
+
];
|
|
79
|
+
if (this.options.systemPrompt) {
|
|
80
|
+
args.push('--system-prompt', this.options.systemPrompt);
|
|
81
|
+
}
|
|
82
|
+
if (this.options.mcpConfigPath) {
|
|
83
|
+
args.push('--mcp-config', this.options.mcpConfigPath);
|
|
84
|
+
args.push('--strict-mcp-config');
|
|
85
|
+
}
|
|
86
|
+
if (this.options.dangerouslySkipPermissions) {
|
|
87
|
+
args.push('--dangerously-skip-permissions');
|
|
88
|
+
}
|
|
89
|
+
console.log(`[ClaudeCLI] Spawning: claude ${args.join(' ')}`);
|
|
90
|
+
console.log(`[ClaudeCLI] Args count: ${args.length}`);
|
|
91
|
+
console.log(`[ClaudeCLI] Content length: ${content.length} chars`);
|
|
92
|
+
if (this.options.systemPrompt) {
|
|
93
|
+
console.log(`[ClaudeCLI] SystemPrompt length: ${this.options.systemPrompt.length} chars`);
|
|
94
|
+
}
|
|
95
|
+
const claude = (0, child_process_1.spawn)('claude', args, {
|
|
96
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
97
|
+
});
|
|
98
|
+
// Close stdin immediately - we use -p flag, not stdin input
|
|
99
|
+
// Without this, Claude CLI hangs waiting for stdin input
|
|
100
|
+
claude.stdin.end();
|
|
101
|
+
let stdout = '';
|
|
102
|
+
let stderr = '';
|
|
103
|
+
let lastDelta = '';
|
|
104
|
+
claude.stderr.on('data', (chunk) => {
|
|
105
|
+
const text = chunk.toString();
|
|
106
|
+
stderr += text;
|
|
107
|
+
console.error(`[ClaudeCLI:stderr] ${text.trim()}`);
|
|
108
|
+
});
|
|
109
|
+
claude.stdout.on('data', (chunk) => {
|
|
110
|
+
stdout += chunk.toString();
|
|
111
|
+
const lines = stdout.split('\n');
|
|
112
|
+
for (const line of lines) {
|
|
113
|
+
if (!line.trim())
|
|
114
|
+
continue;
|
|
115
|
+
try {
|
|
116
|
+
const event = JSON.parse(line);
|
|
117
|
+
if (event.type === 'delta' && event.delta) {
|
|
118
|
+
lastDelta += event.delta;
|
|
119
|
+
callbacks?.onDelta?.(lastDelta);
|
|
120
|
+
}
|
|
121
|
+
else if (event.type === 'tool_use') {
|
|
122
|
+
callbacks?.onToolUse?.(event.name, event.input);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
// Not JSON yet, accumulate more
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
claude.on('close', (code) => {
|
|
131
|
+
if (code !== 0) {
|
|
132
|
+
const error = new Error(`Claude CLI exited with code ${code}: ${stderr}`);
|
|
133
|
+
callbacks?.onError?.(error);
|
|
134
|
+
reject(error);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
// Parse final JSON output
|
|
139
|
+
const result = JSON.parse(stdout.trim());
|
|
140
|
+
if (result.type === 'result' && result.subtype === 'success') {
|
|
141
|
+
const promptResult = {
|
|
142
|
+
response: result.result || '',
|
|
143
|
+
session_id: result.session_id || this.sessionId,
|
|
144
|
+
cost_usd: result.total_cost_usd,
|
|
145
|
+
usage: {
|
|
146
|
+
input_tokens: result.usage?.input_tokens || 0,
|
|
147
|
+
output_tokens: result.usage?.output_tokens || 0,
|
|
148
|
+
cache_creation_input_tokens: result.usage?.cache_creation_input_tokens,
|
|
149
|
+
cache_read_input_tokens: result.usage?.cache_read_input_tokens,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
callbacks?.onFinal?.({ content: promptResult.response });
|
|
153
|
+
resolve(promptResult);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
throw new Error(`Unexpected result type: ${result.type}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (parseError) {
|
|
160
|
+
const error = new Error(`Failed to parse Claude CLI output: ${parseError}`);
|
|
161
|
+
callbacks?.onError?.(error);
|
|
162
|
+
reject(error);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
claude.on('error', (error) => {
|
|
166
|
+
callbacks?.onError?.(error);
|
|
167
|
+
reject(error);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get current session ID
|
|
173
|
+
*/
|
|
174
|
+
getSessionId() {
|
|
175
|
+
return this.sessionId;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Create a new session (resets conversation history)
|
|
179
|
+
*/
|
|
180
|
+
resetSession() {
|
|
181
|
+
this.sessionId = (0, crypto_1.randomUUID)();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Set session ID (for channel-specific conversations)
|
|
185
|
+
*/
|
|
186
|
+
setSessionId(sessionId) {
|
|
187
|
+
this.sessionId = sessionId;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Set system prompt (updates options for next prompt)
|
|
191
|
+
*/
|
|
192
|
+
setSystemPrompt(prompt) {
|
|
193
|
+
this.options.systemPrompt = prompt;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get current options (for debugging)
|
|
197
|
+
*/
|
|
198
|
+
getOptions() {
|
|
199
|
+
return { ...this.options };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.ClaudeCLIWrapper = ClaudeCLIWrapper;
|
|
203
|
+
/**
|
|
204
|
+
* Usage Example:
|
|
205
|
+
*
|
|
206
|
+
* const wrapper = new ClaudeCLIWrapper({ sessionId: 'discord-channel-123' });
|
|
207
|
+
*
|
|
208
|
+
* // First message
|
|
209
|
+
* const result1 = await wrapper.prompt('Hello, what is 2+2?', {
|
|
210
|
+
* onDelta: (text) => console.log('Streaming:', text)
|
|
211
|
+
* });
|
|
212
|
+
*
|
|
213
|
+
* console.log(result1.response); // "4"
|
|
214
|
+
* console.log(result1.usage.input_tokens); // 3
|
|
215
|
+
* console.log(result1.cost_usd); // 0.045
|
|
216
|
+
*
|
|
217
|
+
* // Follow-up (same session)
|
|
218
|
+
* const result2 = await wrapper.prompt('What about 3+3?');
|
|
219
|
+
* console.log(result2.response); // "6"
|
|
220
|
+
*
|
|
221
|
+
* // Cost Tracking Example:
|
|
222
|
+
* let totalCost = 0;
|
|
223
|
+
* const result = await wrapper.prompt('...');
|
|
224
|
+
* totalCost += result.cost_usd || 0;
|
|
225
|
+
* console.log(`Total spent: $${totalCost.toFixed(4)}`);
|
|
226
|
+
*/
|
|
227
|
+
//# sourceMappingURL=claude-cli-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli-wrapper.js","sourceRoot":"","sources":["../../src/agent/claude-cli-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude API Client for MAMA Standalone
|
|
3
|
+
*
|
|
4
|
+
* Uses Claude Messages API with OAuth tokens (OpenClaw Gateway 방식 이식).
|
|
5
|
+
* @anthropic-ai/sdk의 authToken 옵션 사용 (pi-ai 방식)
|
|
6
|
+
*/
|
|
7
|
+
import type { OAuthManager } from '../auth/index.js';
|
|
8
|
+
import type { ClaudeResponse, ClaudeClientOptions, ToolDefinition, Message } from './types.js';
|
|
9
|
+
export declare class ClaudeClient {
|
|
10
|
+
private oauthManager;
|
|
11
|
+
private client;
|
|
12
|
+
private lastToken;
|
|
13
|
+
constructor(oauthManager: OAuthManager, _options?: ClaudeClientOptions);
|
|
14
|
+
/**
|
|
15
|
+
* Get or create Anthropic client with OAuth token
|
|
16
|
+
* Recreates client if token changes (refresh)
|
|
17
|
+
*/
|
|
18
|
+
private getClient;
|
|
19
|
+
/**
|
|
20
|
+
* Send a message to Claude via API
|
|
21
|
+
*
|
|
22
|
+
* @param messages - Conversation history
|
|
23
|
+
* @param options - Request options including tools
|
|
24
|
+
* @returns Claude API response
|
|
25
|
+
* @throws AgentError on API errors
|
|
26
|
+
*/
|
|
27
|
+
sendMessage(messages: Message[], options?: {
|
|
28
|
+
system?: string;
|
|
29
|
+
tools?: ToolDefinition[];
|
|
30
|
+
model?: string;
|
|
31
|
+
maxTokens?: number;
|
|
32
|
+
}): Promise<ClaudeResponse>;
|
|
33
|
+
/**
|
|
34
|
+
* Format messages for API
|
|
35
|
+
*/
|
|
36
|
+
private formatMessages;
|
|
37
|
+
/**
|
|
38
|
+
* Format content blocks for API
|
|
39
|
+
*/
|
|
40
|
+
private formatContent;
|
|
41
|
+
/**
|
|
42
|
+
* Get the default model name
|
|
43
|
+
*/
|
|
44
|
+
static getDefaultModel(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get the default max tokens
|
|
47
|
+
*/
|
|
48
|
+
static getDefaultMaxTokens(): number;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=claude-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-client.d.ts","sourceRoot":"","sources":["../../src/agent/claude-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,OAAO,EAER,MAAM,YAAY,CAAC;AAiCpB,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAuB;gBAE5B,YAAY,EAAE,YAAY,EAAE,QAAQ,GAAE,mBAAwB;IAI1E;;;OAGG;YACW,SAAS;IA8BvB;;;;;;;OAOG;IACG,WAAW,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,cAAc,CAAC;IA4G1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,MAAM;IAIhC;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,MAAM;CAGrC"}
|