@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,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OAuth Token Manager for MAMA Standalone
|
|
4
|
+
*
|
|
5
|
+
* Manages Claude Pro OAuth tokens from ~/.claude/.credentials.json
|
|
6
|
+
* - Reads tokens from Claude Code credentials file
|
|
7
|
+
* - Caches tokens with TTL
|
|
8
|
+
* - Auto-refreshes tokens before expiry
|
|
9
|
+
* - Writes refreshed tokens back to file
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.OAuthManager = void 0;
|
|
13
|
+
const promises_1 = require("node:fs/promises");
|
|
14
|
+
const node_fs_1 = require("node:fs");
|
|
15
|
+
const node_os_1 = require("node:os");
|
|
16
|
+
const node_path_1 = require("node:path");
|
|
17
|
+
const types_js_1 = require("./types.js");
|
|
18
|
+
/**
|
|
19
|
+
* Anthropic OAuth constants (from OpenClaw analysis)
|
|
20
|
+
*/
|
|
21
|
+
const TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';
|
|
22
|
+
const CLIENT_ID = 'OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl';
|
|
23
|
+
/**
|
|
24
|
+
* Default configuration
|
|
25
|
+
*/
|
|
26
|
+
const DEFAULT_CREDENTIALS_PATH = '.claude/.credentials.json';
|
|
27
|
+
const DEFAULT_CACHE_TTL_MS = 60_000; // 1 minute
|
|
28
|
+
const DEFAULT_REFRESH_BUFFER_MS = 600_000; // 10 minutes
|
|
29
|
+
const EXPIRY_BUFFER_MS = 300_000; // 5 minutes buffer when calculating expiry
|
|
30
|
+
class OAuthManager {
|
|
31
|
+
credentialsPath;
|
|
32
|
+
cacheTtlMs;
|
|
33
|
+
refreshBufferMs;
|
|
34
|
+
fetchFn;
|
|
35
|
+
cache = null;
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.credentialsPath = options.credentialsPath ?? (0, node_path_1.join)((0, node_os_1.homedir)(), DEFAULT_CREDENTIALS_PATH);
|
|
38
|
+
this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
39
|
+
this.refreshBufferMs = options.refreshBufferMs ?? DEFAULT_REFRESH_BUFFER_MS;
|
|
40
|
+
this.fetchFn = options.fetchFn ?? fetch;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get a valid access token, refreshing if necessary
|
|
44
|
+
*
|
|
45
|
+
* @returns Access token string
|
|
46
|
+
* @throws OAuthError if token cannot be obtained
|
|
47
|
+
*/
|
|
48
|
+
async getToken() {
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
// Check cache first
|
|
51
|
+
if (this.cache && now - this.cache.cachedAt < this.cacheTtlMs) {
|
|
52
|
+
// Cache is valid, but check if token needs refresh
|
|
53
|
+
if (!this.needsRefresh(this.cache.token.expiresAt)) {
|
|
54
|
+
return this.cache.token.accessToken;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Read credentials from file
|
|
58
|
+
const credentials = await this.readCredentials();
|
|
59
|
+
// Check if refresh is needed
|
|
60
|
+
if (this.needsRefresh(credentials.expiresAt)) {
|
|
61
|
+
const refreshedToken = await this.refreshToken(credentials.refreshToken);
|
|
62
|
+
await this.writeCredentials(refreshedToken);
|
|
63
|
+
this.cache = {
|
|
64
|
+
token: refreshedToken,
|
|
65
|
+
cachedAt: now,
|
|
66
|
+
subscriptionType: credentials.subscriptionType,
|
|
67
|
+
rateLimitTier: credentials.rateLimitTier,
|
|
68
|
+
};
|
|
69
|
+
return refreshedToken.accessToken;
|
|
70
|
+
}
|
|
71
|
+
// Token is still valid, cache it
|
|
72
|
+
this.cache = {
|
|
73
|
+
token: {
|
|
74
|
+
accessToken: credentials.accessToken,
|
|
75
|
+
refreshToken: credentials.refreshToken,
|
|
76
|
+
expiresAt: credentials.expiresAt,
|
|
77
|
+
},
|
|
78
|
+
cachedAt: now,
|
|
79
|
+
subscriptionType: credentials.subscriptionType,
|
|
80
|
+
rateLimitTier: credentials.rateLimitTier,
|
|
81
|
+
};
|
|
82
|
+
return credentials.accessToken;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get token status information
|
|
86
|
+
*
|
|
87
|
+
* @returns Token status including validity, expiry, and subscription info
|
|
88
|
+
*/
|
|
89
|
+
async getStatus() {
|
|
90
|
+
try {
|
|
91
|
+
const credentials = await this.readCredentials();
|
|
92
|
+
const now = Date.now();
|
|
93
|
+
const expiresIn = Math.floor((credentials.expiresAt - now) / 1000);
|
|
94
|
+
return {
|
|
95
|
+
valid: credentials.expiresAt > now,
|
|
96
|
+
expiresAt: credentials.expiresAt,
|
|
97
|
+
expiresIn: expiresIn > 0 ? expiresIn : 0,
|
|
98
|
+
needsRefresh: this.needsRefresh(credentials.expiresAt),
|
|
99
|
+
subscriptionType: credentials.subscriptionType,
|
|
100
|
+
rateLimitTier: credentials.rateLimitTier,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof types_js_1.OAuthError) {
|
|
105
|
+
return {
|
|
106
|
+
valid: false,
|
|
107
|
+
expiresAt: null,
|
|
108
|
+
expiresIn: null,
|
|
109
|
+
needsRefresh: false,
|
|
110
|
+
error: error.message,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Force refresh the token
|
|
118
|
+
*
|
|
119
|
+
* @returns New access token
|
|
120
|
+
* @throws OAuthError if refresh fails
|
|
121
|
+
*/
|
|
122
|
+
async forceRefresh() {
|
|
123
|
+
const credentials = await this.readCredentials();
|
|
124
|
+
const refreshedToken = await this.refreshToken(credentials.refreshToken);
|
|
125
|
+
await this.writeCredentials(refreshedToken);
|
|
126
|
+
this.cache = {
|
|
127
|
+
token: refreshedToken,
|
|
128
|
+
cachedAt: Date.now(),
|
|
129
|
+
subscriptionType: credentials.subscriptionType,
|
|
130
|
+
rateLimitTier: credentials.rateLimitTier,
|
|
131
|
+
};
|
|
132
|
+
return refreshedToken.accessToken;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Clear the token cache
|
|
136
|
+
*/
|
|
137
|
+
clearCache() {
|
|
138
|
+
this.cache = null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Check if token needs refresh (expires within buffer time)
|
|
142
|
+
*/
|
|
143
|
+
needsRefresh(expiresAt) {
|
|
144
|
+
return Date.now() >= expiresAt - this.refreshBufferMs;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Read credentials from file
|
|
148
|
+
*/
|
|
149
|
+
async readCredentials() {
|
|
150
|
+
if (!(0, node_fs_1.existsSync)(this.credentialsPath)) {
|
|
151
|
+
throw new types_js_1.OAuthError(`Claude Code credentials not found. Please install Claude Code first and log in.\nExpected path: ${this.credentialsPath}`, 'CREDENTIALS_NOT_FOUND');
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const content = await (0, promises_1.readFile)(this.credentialsPath, 'utf-8');
|
|
155
|
+
const data = JSON.parse(content);
|
|
156
|
+
if (!data.claudeAiOauth) {
|
|
157
|
+
throw new types_js_1.OAuthError('Invalid credentials file: claudeAiOauth object not found. Please log in to Claude Code.', 'INVALID_CREDENTIALS');
|
|
158
|
+
}
|
|
159
|
+
const oauth = data.claudeAiOauth;
|
|
160
|
+
if (!oauth.accessToken || !oauth.refreshToken || !oauth.expiresAt) {
|
|
161
|
+
throw new types_js_1.OAuthError('Invalid credentials: missing required fields (accessToken, refreshToken, expiresAt)', 'INVALID_CREDENTIALS');
|
|
162
|
+
}
|
|
163
|
+
return oauth;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error instanceof types_js_1.OAuthError) {
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
throw new types_js_1.OAuthError(`Failed to read credentials file: ${error instanceof Error ? error.message : String(error)}`, 'INVALID_CREDENTIALS', error instanceof Error ? error : undefined);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Refresh the OAuth token
|
|
174
|
+
*/
|
|
175
|
+
async refreshToken(refreshToken) {
|
|
176
|
+
try {
|
|
177
|
+
const response = await this.fetchFn(TOKEN_URL, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'Content-Type': 'application/json',
|
|
181
|
+
},
|
|
182
|
+
body: JSON.stringify({
|
|
183
|
+
grant_type: 'refresh_token',
|
|
184
|
+
client_id: CLIENT_ID,
|
|
185
|
+
refresh_token: refreshToken,
|
|
186
|
+
}),
|
|
187
|
+
});
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
const errorText = await response.text();
|
|
190
|
+
throw new types_js_1.OAuthError(`Token refresh failed (${response.status}): ${errorText}`, 'REFRESH_FAILED');
|
|
191
|
+
}
|
|
192
|
+
const data = (await response.json());
|
|
193
|
+
// Calculate expiry with 5 minute buffer (matching OpenClaw behavior)
|
|
194
|
+
const expiresAt = Date.now() + data.expires_in * 1000 - EXPIRY_BUFFER_MS;
|
|
195
|
+
return {
|
|
196
|
+
accessToken: data.access_token,
|
|
197
|
+
refreshToken: data.refresh_token,
|
|
198
|
+
expiresAt,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error instanceof types_js_1.OAuthError) {
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
throw new types_js_1.OAuthError(`Network error during token refresh: ${error instanceof Error ? error.message : String(error)}`, 'NETWORK_ERROR', error instanceof Error ? error : undefined);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Write refreshed credentials to file
|
|
210
|
+
*/
|
|
211
|
+
async writeCredentials(token) {
|
|
212
|
+
try {
|
|
213
|
+
// Read existing file to preserve other fields
|
|
214
|
+
const content = await (0, promises_1.readFile)(this.credentialsPath, 'utf-8');
|
|
215
|
+
const data = JSON.parse(content);
|
|
216
|
+
if (!data.claudeAiOauth) {
|
|
217
|
+
throw new types_js_1.OAuthError('Cannot write credentials: claudeAiOauth object not found', 'FILE_WRITE_ERROR');
|
|
218
|
+
}
|
|
219
|
+
// Update only the token fields
|
|
220
|
+
data.claudeAiOauth = {
|
|
221
|
+
...data.claudeAiOauth,
|
|
222
|
+
accessToken: token.accessToken,
|
|
223
|
+
refreshToken: token.refreshToken,
|
|
224
|
+
expiresAt: token.expiresAt,
|
|
225
|
+
};
|
|
226
|
+
await (0, promises_1.writeFile)(this.credentialsPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
if (error instanceof types_js_1.OAuthError) {
|
|
230
|
+
throw error;
|
|
231
|
+
}
|
|
232
|
+
throw new types_js_1.OAuthError(`Failed to write credentials file: ${error instanceof Error ? error.message : String(error)}`, 'FILE_WRITE_ERROR', error instanceof Error ? error : undefined);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.OAuthManager = OAuthManager;
|
|
237
|
+
//# sourceMappingURL=oauth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-manager.js","sourceRoot":"","sources":["../../src/auth/oauth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Types for MAMA Standalone
|
|
3
|
+
*
|
|
4
|
+
* Based on Claude Code credentials structure (~/.claude/.credentials.json)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Raw credentials file structure from Claude Code
|
|
8
|
+
*/
|
|
9
|
+
export interface ClaudeCredentialsFile {
|
|
10
|
+
claudeAiOauth?: ClaudeAiOAuth;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Claude AI OAuth credentials object
|
|
14
|
+
*/
|
|
15
|
+
export interface ClaudeAiOAuth {
|
|
16
|
+
accessToken: string;
|
|
17
|
+
refreshToken: string;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
scopes?: string[];
|
|
20
|
+
subscriptionType?: string;
|
|
21
|
+
rateLimitTier?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Internal token representation
|
|
25
|
+
*/
|
|
26
|
+
export interface OAuthToken {
|
|
27
|
+
accessToken: string;
|
|
28
|
+
refreshToken: string;
|
|
29
|
+
expiresAt: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Token refresh response from Anthropic
|
|
33
|
+
*/
|
|
34
|
+
export interface TokenRefreshResponse {
|
|
35
|
+
access_token: string;
|
|
36
|
+
refresh_token: string;
|
|
37
|
+
expires_in: number;
|
|
38
|
+
token_type: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Token status information
|
|
42
|
+
*/
|
|
43
|
+
export interface TokenStatus {
|
|
44
|
+
valid: boolean;
|
|
45
|
+
expiresAt: number | null;
|
|
46
|
+
expiresIn: number | null;
|
|
47
|
+
needsRefresh: boolean;
|
|
48
|
+
subscriptionType?: string;
|
|
49
|
+
rateLimitTier?: string;
|
|
50
|
+
error?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* OAuth Manager configuration options
|
|
54
|
+
*/
|
|
55
|
+
export interface OAuthManagerOptions {
|
|
56
|
+
/**
|
|
57
|
+
* Path to credentials file (default: ~/.claude/.credentials.json)
|
|
58
|
+
*/
|
|
59
|
+
credentialsPath?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Cache TTL in milliseconds (default: 60000 = 1 minute)
|
|
62
|
+
*/
|
|
63
|
+
cacheTtlMs?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Refresh buffer in milliseconds - refresh token this much before expiry
|
|
66
|
+
* (default: 600000 = 10 minutes)
|
|
67
|
+
*/
|
|
68
|
+
refreshBufferMs?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Custom fetch function for testing
|
|
71
|
+
*/
|
|
72
|
+
fetchFn?: typeof fetch;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Cached token with metadata
|
|
76
|
+
*/
|
|
77
|
+
export interface CachedToken {
|
|
78
|
+
token: OAuthToken;
|
|
79
|
+
cachedAt: number;
|
|
80
|
+
subscriptionType?: string;
|
|
81
|
+
rateLimitTier?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Error types for OAuth operations
|
|
85
|
+
*/
|
|
86
|
+
export declare class OAuthError extends Error {
|
|
87
|
+
readonly code: OAuthErrorCode;
|
|
88
|
+
readonly cause?: Error | undefined;
|
|
89
|
+
constructor(message: string, code: OAuthErrorCode, cause?: Error | undefined);
|
|
90
|
+
}
|
|
91
|
+
export type OAuthErrorCode = 'CREDENTIALS_NOT_FOUND' | 'INVALID_CREDENTIALS' | 'TOKEN_EXPIRED' | 'REFRESH_FAILED' | 'NETWORK_ERROR' | 'FILE_WRITE_ERROR';
|
|
92
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;aAGjB,IAAI,EAAE,cAAc;aACpB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,cAAc,EACpB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,MAAM,MAAM,cAAc,GACtB,uBAAuB,GACvB,qBAAqB,GACrB,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OAuth Token Types for MAMA Standalone
|
|
4
|
+
*
|
|
5
|
+
* Based on Claude Code credentials structure (~/.claude/.credentials.json)
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.OAuthError = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Error types for OAuth operations
|
|
11
|
+
*/
|
|
12
|
+
class OAuthError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
cause;
|
|
15
|
+
constructor(message, code, cause) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.cause = cause;
|
|
19
|
+
this.name = 'OAuthError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.OAuthError = OAuthError;
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAyFH;;GAEG;AACH,MAAa,UAAW,SAAQ,KAAK;IAGjB;IACA;IAHlB,YACE,OAAe,EACC,IAAoB,EACpB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAgB;QACpB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AATD,gCASC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mama init command
|
|
3
|
+
*
|
|
4
|
+
* Initialize MAMA configuration
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Options for init command
|
|
8
|
+
*/
|
|
9
|
+
export interface InitOptions {
|
|
10
|
+
/** Force overwrite existing config */
|
|
11
|
+
force?: boolean;
|
|
12
|
+
/** Skip Claude Code authentication check (for testing) */
|
|
13
|
+
skipAuthCheck?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute init command
|
|
17
|
+
*/
|
|
18
|
+
export declare function initCommand(options?: InitOptions): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsDH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G1E"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* mama init command
|
|
4
|
+
*
|
|
5
|
+
* Initialize MAMA configuration
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.initCommand = initCommand;
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const promises_1 = require("node:fs/promises");
|
|
11
|
+
const config_manager_js_1 = require("../config/config-manager.js");
|
|
12
|
+
const bootstrap_template_js_1 = require("../../onboarding/bootstrap-template.js");
|
|
13
|
+
/**
|
|
14
|
+
* CLAUDE.md template for workspace documentation
|
|
15
|
+
*/
|
|
16
|
+
const CLAUDE_MD_TEMPLATE = `# MAMA
|
|
17
|
+
|
|
18
|
+
저는 MAMA, 지속적 메모리를 가진 AI 비서입니다.
|
|
19
|
+
|
|
20
|
+
## 워크스페이스 (중요!)
|
|
21
|
+
|
|
22
|
+
**모든 파일 작업은 아래 경로에서만 수행하세요:**
|
|
23
|
+
|
|
24
|
+
| 용도 | 경로 |
|
|
25
|
+
|------|------|
|
|
26
|
+
| 작업 디렉토리 | \`~/.mama/workspace/\` |
|
|
27
|
+
| 스킬 저장 | \`~/.mama/skills/\` |
|
|
28
|
+
| 스크립트 | \`~/.mama/workspace/scripts/\` |
|
|
29
|
+
| 데이터 | \`~/.mama/workspace/data/\` |
|
|
30
|
+
| 로그 | \`~/.mama/logs/\` |
|
|
31
|
+
|
|
32
|
+
**절대 사용 금지:**
|
|
33
|
+
- \`~/.openclaw/\` - 다른 프로젝트
|
|
34
|
+
- \`~/project/\` - 사용자 프로젝트 (명시적 요청 없이 수정 금지)
|
|
35
|
+
|
|
36
|
+
## 메모리 시스템
|
|
37
|
+
|
|
38
|
+
MAMA는 결정의 진화를 추적합니다:
|
|
39
|
+
|
|
40
|
+
\`\`\`
|
|
41
|
+
결정 v1 (실패) → v2 (부분 성공) → v3 (성공)
|
|
42
|
+
\`\`\`
|
|
43
|
+
|
|
44
|
+
과거 결정을 검색하면 전체 맥락을 볼 수 있습니다.
|
|
45
|
+
|
|
46
|
+
## 사용 가능한 명령어
|
|
47
|
+
|
|
48
|
+
- \`mama start\` - 에이전트 시작
|
|
49
|
+
- \`mama stop\` - 에이전트 중지
|
|
50
|
+
- \`mama status\` - 상태 확인
|
|
51
|
+
- \`mama run <command>\` - 일회성 명령 실행
|
|
52
|
+
`;
|
|
53
|
+
/**
|
|
54
|
+
* Execute init command
|
|
55
|
+
*/
|
|
56
|
+
async function initCommand(options = {}) {
|
|
57
|
+
console.log('\n🔧 MAMA Standalone 초기화\n');
|
|
58
|
+
if (!options.skipAuthCheck) {
|
|
59
|
+
const credentialsPath = (0, config_manager_js_1.expandPath)('~/.claude/.credentials.json');
|
|
60
|
+
process.stdout.write('Claude Code 인증 확인... ');
|
|
61
|
+
if (!(0, node_fs_1.existsSync)(credentialsPath)) {
|
|
62
|
+
console.log('❌');
|
|
63
|
+
console.error('\n⚠️ Claude Code 인증 파일을 찾을 수 없습니다.');
|
|
64
|
+
console.error(` 예상 경로: ${credentialsPath}`);
|
|
65
|
+
console.error('\n Claude Code를 먼저 설치하고 로그인하세요:');
|
|
66
|
+
console.error(' https://claude.ai/code\n');
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
console.log('✓');
|
|
70
|
+
}
|
|
71
|
+
// Check if config already exists
|
|
72
|
+
if ((0, config_manager_js_1.configExists)() && !options.force) {
|
|
73
|
+
console.log(`\n⚠️ 설정 파일이 이미 존재합니다: ${(0, config_manager_js_1.getConfigPath)()}`);
|
|
74
|
+
console.log(' 덮어쓰려면 --force 옵션을 사용하세요.\n');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
// Create config
|
|
78
|
+
process.stdout.write('설정 파일 생성 중... ');
|
|
79
|
+
try {
|
|
80
|
+
const configPath = await (0, config_manager_js_1.createDefaultConfig)(options.force);
|
|
81
|
+
console.log('✓');
|
|
82
|
+
console.log(`\n${configPath} 생성 완료\n`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.log('❌');
|
|
86
|
+
console.error(`\n설정 파일 생성 실패: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
// Create directory structure
|
|
90
|
+
const directories = [
|
|
91
|
+
{ path: '~/.mama/skills', label: '스킬 디렉토리' },
|
|
92
|
+
{ path: '~/.mama/workspace', label: '워크스페이스' },
|
|
93
|
+
{ path: '~/.mama/workspace/scripts', label: '스크립트 디렉토리' },
|
|
94
|
+
{ path: '~/.mama/workspace/data', label: '데이터 디렉토리' },
|
|
95
|
+
{ path: '~/.mama/logs', label: '로그 디렉토리' },
|
|
96
|
+
];
|
|
97
|
+
for (const dir of directories) {
|
|
98
|
+
const expandedPath = (0, config_manager_js_1.expandPath)(dir.path);
|
|
99
|
+
process.stdout.write(`${dir.label} 생성 중... `);
|
|
100
|
+
try {
|
|
101
|
+
if (!(0, node_fs_1.existsSync)(expandedPath)) {
|
|
102
|
+
await (0, promises_1.mkdir)(expandedPath, { recursive: true });
|
|
103
|
+
console.log('✓');
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log('(이미 존재)');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.log('❌');
|
|
111
|
+
console.error(`\n${dir.label} 생성 실패: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Create CLAUDE.md
|
|
116
|
+
const claudeMdPath = (0, config_manager_js_1.expandPath)('~/.mama/CLAUDE.md');
|
|
117
|
+
process.stdout.write('CLAUDE.md 생성 중... ');
|
|
118
|
+
try {
|
|
119
|
+
if ((0, node_fs_1.existsSync)(claudeMdPath) && !options.force) {
|
|
120
|
+
console.log('(이미 존재)');
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
await (0, promises_1.writeFile)(claudeMdPath, CLAUDE_MD_TEMPLATE, 'utf-8');
|
|
124
|
+
console.log('✓');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.log('❌');
|
|
129
|
+
console.error(`\nCLAUDE.md 생성 실패: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const bootstrapPath = (0, config_manager_js_1.expandPath)('~/.mama/BOOTSTRAP.md');
|
|
133
|
+
process.stdout.write('BOOTSTRAP.md 생성 중... ');
|
|
134
|
+
try {
|
|
135
|
+
if ((0, node_fs_1.existsSync)(bootstrapPath) && !options.force) {
|
|
136
|
+
console.log('(이미 존재)');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
await (0, promises_1.writeFile)(bootstrapPath, bootstrap_template_js_1.BOOTSTRAP_TEMPLATE, 'utf-8');
|
|
140
|
+
console.log('✓');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.log('❌');
|
|
145
|
+
console.error(`\nBOOTSTRAP.md 생성 실패: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
// Show next steps
|
|
149
|
+
console.log('\n다음 단계:');
|
|
150
|
+
console.log(' mama setup 대화형 설정 마법사 (처음 실행)');
|
|
151
|
+
console.log(' mama start 에이전트 시작');
|
|
152
|
+
console.log(' mama status 상태 확인');
|
|
153
|
+
console.log('');
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mama run command
|
|
3
|
+
*
|
|
4
|
+
* Run a single prompt through the agent loop (for testing)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Options for run command
|
|
8
|
+
*/
|
|
9
|
+
export interface RunOptions {
|
|
10
|
+
/** Prompt to execute */
|
|
11
|
+
prompt: string;
|
|
12
|
+
/** Enable verbose output */
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute run command
|
|
17
|
+
*/
|
|
18
|
+
export declare function runCommand(options: RunOptions): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EnE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* mama run command
|
|
4
|
+
*
|
|
5
|
+
* Run a single prompt through the agent loop (for testing)
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.runCommand = runCommand;
|
|
9
|
+
const config_manager_js_1 = require("../config/config-manager.js");
|
|
10
|
+
const index_js_1 = require("../../auth/index.js");
|
|
11
|
+
const index_js_2 = require("../../agent/index.js");
|
|
12
|
+
/**
|
|
13
|
+
* Execute run command
|
|
14
|
+
*/
|
|
15
|
+
async function runCommand(options) {
|
|
16
|
+
console.log('\n🤖 MAMA Run - Single Prompt Execution\n');
|
|
17
|
+
// Check config exists
|
|
18
|
+
if (!(0, config_manager_js_1.configExists)()) {
|
|
19
|
+
console.log('⚠️ 설정 파일이 없습니다.');
|
|
20
|
+
console.log(' 먼저 초기화하세요: mama init\n');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
// Load config
|
|
24
|
+
let config;
|
|
25
|
+
try {
|
|
26
|
+
config = await (0, config_manager_js_1.loadConfig)();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error(`설정 로드 실패: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// Check OAuth token
|
|
33
|
+
process.stdout.write('OAuth 토큰 확인... ');
|
|
34
|
+
let oauthManager;
|
|
35
|
+
try {
|
|
36
|
+
oauthManager = new index_js_1.OAuthManager();
|
|
37
|
+
await oauthManager.getToken();
|
|
38
|
+
console.log('✓');
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.log('❌');
|
|
42
|
+
console.error(`\nOAuth 토큰 오류: ${error instanceof Error ? error.message : String(error)}`);
|
|
43
|
+
console.error('Claude Code에 다시 로그인하세요.\n');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
// Create agent loop
|
|
47
|
+
const agentLoop = new index_js_2.AgentLoop(oauthManager, {
|
|
48
|
+
model: config.agent.model,
|
|
49
|
+
maxTurns: config.agent.max_turns,
|
|
50
|
+
onTurn: options.verbose
|
|
51
|
+
? (turn) => {
|
|
52
|
+
console.log(`\n--- Turn ${turn.turn} (${turn.role}) ---`);
|
|
53
|
+
if (turn.stopReason) {
|
|
54
|
+
console.log(`Stop reason: ${turn.stopReason}`);
|
|
55
|
+
}
|
|
56
|
+
if (turn.usage) {
|
|
57
|
+
console.log(`Tokens: ${turn.usage.input_tokens} in / ${turn.usage.output_tokens} out`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
: undefined,
|
|
61
|
+
onToolUse: options.verbose
|
|
62
|
+
? (toolName, input, result) => {
|
|
63
|
+
console.log(`\n🔧 Tool: ${toolName}`);
|
|
64
|
+
console.log(` Input: ${JSON.stringify(input)}`);
|
|
65
|
+
console.log(` Result: ${JSON.stringify(result).substring(0, 200)}...`);
|
|
66
|
+
}
|
|
67
|
+
: undefined,
|
|
68
|
+
});
|
|
69
|
+
// Run the prompt
|
|
70
|
+
console.log(`\n📝 Prompt: "${options.prompt}"\n`);
|
|
71
|
+
console.log('─'.repeat(50));
|
|
72
|
+
console.log('Processing...\n');
|
|
73
|
+
try {
|
|
74
|
+
const startTime = Date.now();
|
|
75
|
+
const result = await agentLoop.run(options.prompt);
|
|
76
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
77
|
+
console.log('─'.repeat(50));
|
|
78
|
+
console.log('\n📤 Response:\n');
|
|
79
|
+
console.log(result.response);
|
|
80
|
+
console.log('\n─'.repeat(50));
|
|
81
|
+
console.log(`\n✓ 완료 (${result.turns} turns, ${elapsed}s)`);
|
|
82
|
+
console.log(` Tokens: ${result.totalUsage.input_tokens} input / ${result.totalUsage.output_tokens} output\n`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error(`\n❌ 실행 실패: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=run.js.map
|