hammoc 1.7.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/package.json +1 -1
- package/packages/client/dist/assets/{agentExampleHighlight-Du5I7v6o.js → agentExampleHighlight-B2IJxYzN.js} +1 -1
- package/packages/client/dist/assets/{commandTokenHighlight-Dfo51Aof.js → commandTokenHighlight-BdGXkDR5.js} +1 -1
- package/packages/client/dist/assets/{index-4l4YwxEs.js → index-BFWGN51V.js} +1 -1
- package/packages/client/dist/assets/index-BX7y_Qt3.css +32 -0
- package/packages/client/dist/assets/{index-CqAHxPRw.js → index-lmx-m-iP.js} +587 -499
- package/packages/client/dist/assets/{snippetTokenHighlight-26DWljQA.js → snippetTokenHighlight-B9bH9Npx.js} +1 -1
- package/packages/client/dist/index.html +2 -2
- package/packages/client/dist/sw.js +1 -1
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +25 -1
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/config/index.d.ts +10 -0
- package/packages/server/dist/config/index.d.ts.map +1 -1
- package/packages/server/dist/config/index.js +10 -0
- package/packages/server/dist/config/index.js.map +1 -1
- package/packages/server/dist/controllers/accountController.d.ts +19 -0
- package/packages/server/dist/controllers/accountController.d.ts.map +1 -0
- package/packages/server/dist/controllers/accountController.js +92 -0
- package/packages/server/dist/controllers/accountController.js.map +1 -0
- package/packages/server/dist/controllers/gitController.d.ts.map +1 -1
- package/packages/server/dist/controllers/gitController.js +37 -0
- package/packages/server/dist/controllers/gitController.js.map +1 -1
- package/packages/server/dist/controllers/projectController.d.ts +1 -1
- package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
- package/packages/server/dist/controllers/projectController.js +20 -4
- package/packages/server/dist/controllers/projectController.js.map +1 -1
- package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
- package/packages/server/dist/controllers/serverController.js +8 -1
- package/packages/server/dist/controllers/serverController.js.map +1 -1
- package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
- package/packages/server/dist/controllers/sessionController.js +3 -1
- package/packages/server/dist/controllers/sessionController.js.map +1 -1
- package/packages/server/dist/handlers/websocket.d.ts +4 -0
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +146 -8
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/index.js +8 -0
- package/packages/server/dist/index.js.map +1 -1
- package/packages/server/dist/locales/en/server.json +2 -0
- package/packages/server/dist/locales/es/server.json +2 -0
- package/packages/server/dist/locales/ja/server.json +2 -0
- package/packages/server/dist/locales/ko/server.json +2 -0
- package/packages/server/dist/locales/pt/server.json +2 -0
- package/packages/server/dist/locales/zh-CN/server.json +2 -0
- package/packages/server/dist/middleware/session.d.ts.map +1 -1
- package/packages/server/dist/middleware/session.js +7 -5
- package/packages/server/dist/middleware/session.js.map +1 -1
- package/packages/server/dist/routes/accounts.d.ts +13 -0
- package/packages/server/dist/routes/accounts.d.ts.map +1 -0
- package/packages/server/dist/routes/accounts.js +18 -0
- package/packages/server/dist/routes/accounts.js.map +1 -0
- package/packages/server/dist/routes/config.d.ts +3 -0
- package/packages/server/dist/routes/config.d.ts.map +1 -0
- package/packages/server/dist/routes/config.js +59 -0
- package/packages/server/dist/routes/config.js.map +1 -0
- package/packages/server/dist/routes/preferences.d.ts.map +1 -1
- package/packages/server/dist/routes/preferences.js +22 -4
- package/packages/server/dist/routes/preferences.js.map +1 -1
- package/packages/server/dist/services/accountInfoService.js +6 -6
- package/packages/server/dist/services/accountInfoService.js.map +1 -1
- package/packages/server/dist/services/accountStorageService.d.ts +119 -0
- package/packages/server/dist/services/accountStorageService.d.ts.map +1 -0
- package/packages/server/dist/services/accountStorageService.js +285 -0
- package/packages/server/dist/services/accountStorageService.js.map +1 -0
- package/packages/server/dist/services/chatService.d.ts.map +1 -1
- package/packages/server/dist/services/chatService.js +4 -8
- package/packages/server/dist/services/chatService.js.map +1 -1
- package/packages/server/dist/services/claudeLoginService.d.ts +124 -0
- package/packages/server/dist/services/claudeLoginService.d.ts.map +1 -0
- package/packages/server/dist/services/claudeLoginService.js +417 -0
- package/packages/server/dist/services/claudeLoginService.js.map +1 -0
- package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -1
- package/packages/server/dist/services/cliChatEngine.js +85 -33
- package/packages/server/dist/services/cliChatEngine.js.map +1 -1
- package/packages/server/dist/services/cliGridCards.d.ts +30 -10
- package/packages/server/dist/services/cliGridCards.d.ts.map +1 -1
- package/packages/server/dist/services/cliGridCards.js +80 -34
- package/packages/server/dist/services/cliGridCards.js.map +1 -1
- package/packages/server/dist/services/cliModalDetect.d.ts +15 -7
- package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -1
- package/packages/server/dist/services/cliModalDetect.js +16 -12
- package/packages/server/dist/services/cliModalDetect.js.map +1 -1
- package/packages/server/dist/services/cliScreenModel.d.ts +3 -2
- package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -1
- package/packages/server/dist/services/cliScreenModel.js +2 -0
- package/packages/server/dist/services/cliScreenModel.js.map +1 -1
- package/packages/server/dist/services/cliService.d.ts.map +1 -1
- package/packages/server/dist/services/cliService.js +2 -7
- package/packages/server/dist/services/cliService.js.map +1 -1
- package/packages/server/dist/services/cliSessionPool.d.ts +13 -1
- package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -1
- package/packages/server/dist/services/cliSessionPool.js +14 -4
- package/packages/server/dist/services/cliSessionPool.js.map +1 -1
- package/packages/server/dist/services/dashboardService.d.ts.map +1 -1
- package/packages/server/dist/services/dashboardService.js +6 -1
- package/packages/server/dist/services/dashboardService.js.map +1 -1
- package/packages/server/dist/services/gitService.d.ts +2 -0
- package/packages/server/dist/services/gitService.d.ts.map +1 -1
- package/packages/server/dist/services/gitService.js +41 -3
- package/packages/server/dist/services/gitService.js.map +1 -1
- package/packages/server/dist/services/preferencesService.d.ts +1 -0
- package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
- package/packages/server/dist/services/preferencesService.js +25 -2
- package/packages/server/dist/services/preferencesService.js.map +1 -1
- package/packages/server/dist/services/queueService.d.ts +1 -0
- package/packages/server/dist/services/queueService.d.ts.map +1 -1
- package/packages/server/dist/services/queueService.js +14 -3
- package/packages/server/dist/services/queueService.js.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.d.ts +7 -0
- package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.js +10 -0
- package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
- package/packages/server/dist/services/workspaceContext.d.ts +31 -4
- package/packages/server/dist/services/workspaceContext.d.ts.map +1 -1
- package/packages/server/dist/services/workspaceContext.js +110 -10
- package/packages/server/dist/services/workspaceContext.js.map +1 -1
- package/packages/server/dist/snippets/promote-to-story +86 -9
- package/packages/server/dist/utils/cliDebugLog.d.ts +6 -5
- package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -1
- package/packages/server/dist/utils/cliDebugLog.js +11 -8
- package/packages/server/dist/utils/cliDebugLog.js.map +1 -1
- package/packages/server/dist/utils/logger.d.ts +7 -0
- package/packages/server/dist/utils/logger.d.ts.map +1 -1
- package/packages/server/dist/utils/logger.js +13 -1
- package/packages/server/dist/utils/logger.js.map +1 -1
- package/packages/server/resources/bmad-method/4.44.3/LICENSE +30 -0
- package/packages/server/resources/manual/01-getting-started.md +11 -5
- package/packages/server/resources/manual/02-chat.md +2 -2
- package/packages/server/resources/manual/03-sessions.md +2 -0
- package/packages/server/resources/manual/04-slash-commands-favorites.md +1 -0
- package/packages/server/resources/manual/05-projects.md +2 -2
- package/packages/server/resources/manual/07-git.md +23 -2
- package/packages/server/resources/manual/08-terminal.md +24 -1
- package/packages/server/resources/manual/11-bmad-method-integration.md +1 -0
- package/packages/server/resources/manual/13-settings.md +52 -20
- package/packages/server/resources/manual/16-troubleshooting.md +4 -7
- package/packages/shared/dist/index.d.ts +2 -1
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +2 -0
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/accounts.d.ts +104 -0
- package/packages/shared/dist/types/accounts.d.ts.map +1 -0
- package/packages/shared/dist/types/accounts.js +14 -0
- package/packages/shared/dist/types/accounts.js.map +1 -0
- package/packages/shared/dist/types/dashboard.d.ts +1 -0
- package/packages/shared/dist/types/dashboard.d.ts.map +1 -1
- package/packages/shared/dist/types/git.d.ts +12 -0
- package/packages/shared/dist/types/git.d.ts.map +1 -1
- package/packages/shared/dist/types/git.js +10 -0
- package/packages/shared/dist/types/git.js.map +1 -1
- package/packages/shared/dist/types/preferences.d.ts +40 -0
- package/packages/shared/dist/types/preferences.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.js.map +1 -1
- package/packages/shared/dist/types/sdk.d.ts +5 -1
- package/packages/shared/dist/types/sdk.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.js.map +1 -1
- package/packages/shared/dist/types/session.d.ts +1 -0
- package/packages/shared/dist/types/session.d.ts.map +1 -1
- package/packages/shared/dist/types/session.js.map +1 -1
- package/packages/shared/dist/types/websocket.d.ts +28 -1
- package/packages/shared/dist/types/websocket.d.ts.map +1 -1
- package/packages/client/dist/assets/index-CVy582lU.css +0 -32
- package/packages/server/dist/snippets/promote-issue +0 -9
|
@@ -178,6 +178,8 @@
|
|
|
178
178
|
"branchCreated": "{{value}} 브랜치가 성공적으로 생성되었습니다"
|
|
179
179
|
},
|
|
180
180
|
"error": {
|
|
181
|
+
"notInstalled": "Git이 시스템에 설치되어 있지 않습니다.",
|
|
182
|
+
"authFailed": "Git 인증에 실패했습니다. SSH 키 또는 자격 증명을 설정해 주세요.",
|
|
181
183
|
"operationFailed": "Git 작업이 실패했습니다.",
|
|
182
184
|
"notInitialized": "Git 저장소가 초기화되지 않았습니다.",
|
|
183
185
|
"conflict": "Git 충돌이 감지되었습니다.",
|
|
@@ -171,6 +171,8 @@
|
|
|
171
171
|
"branchCreated": "Branch {{value}} criada com sucesso"
|
|
172
172
|
},
|
|
173
173
|
"error": {
|
|
174
|
+
"notInstalled": "Git não está instalado no sistema.",
|
|
175
|
+
"authFailed": "A autenticação Git falhou. Configure chaves SSH ou credenciais.",
|
|
174
176
|
"operationFailed": "A operação Git falhou.",
|
|
175
177
|
"notInitialized": "O repositório Git não está inicializado.",
|
|
176
178
|
"conflict": "Conflito de Git detectado.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIzC,eAAO,MAAM,cAAc,QAA2B,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIzC,eAAO,MAAM,cAAc,QAA2B,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,cAAc,CAAC,CAqBvE"}
|
|
@@ -19,11 +19,13 @@ export const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;
|
|
|
19
19
|
export async function createSessionMiddleware() {
|
|
20
20
|
const authConfig = new AuthConfigService();
|
|
21
21
|
const secret = await authConfig.getSessionSecret();
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
// Cookie name. SESSION_COOKIE_NAME lets a secondary instance on the same
|
|
23
|
+
// hostname (e.g. a Docker test container alongside a host install) use a
|
|
24
|
+
// distinct cookie so the two sessions don't overwrite each other.
|
|
25
|
+
const cookieName = process.env.SESSION_COOKIE_NAME
|
|
26
|
+
?? (process.env.NODE_ENV === 'production'
|
|
27
|
+
? 'bmad-session'
|
|
28
|
+
: `bmad-session-${process.env.PORT || '3000'}`);
|
|
27
29
|
return cookieSession({
|
|
28
30
|
name: cookieName,
|
|
29
31
|
keys: [secret],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAEnD,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAEnD,yEAAyE;IACzE,yEAAyE;IACzE,kEAAkE;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB;WAC7C,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACvC,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,gBAAgB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;IAEpD,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,sFAAsF;QACtF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;KACjC,CAA8B,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account Management Routes (Story BS-8)
|
|
3
|
+
*
|
|
4
|
+
* Multi-account credential store endpoints. Mounted at `/api/accounts` (plural) —
|
|
5
|
+
* distinct from the existing `/api/account` (singular) which serves the active-account
|
|
6
|
+
* info + usage. Auth is automatic via authMiddlewareWithExclusions.
|
|
7
|
+
*
|
|
8
|
+
* The `:key` param is the store key — the account email, or the `account:<hash>` fallback
|
|
9
|
+
* (AC1a). Clients must `encodeURIComponent` it (the fallback key contains a colon).
|
|
10
|
+
*/
|
|
11
|
+
declare const router: import("express-serve-static-core").Router;
|
|
12
|
+
export default router;
|
|
13
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/routes/accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAMxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account Management Routes (Story BS-8)
|
|
3
|
+
*
|
|
4
|
+
* Multi-account credential store endpoints. Mounted at `/api/accounts` (plural) —
|
|
5
|
+
* distinct from the existing `/api/account` (singular) which serves the active-account
|
|
6
|
+
* info + usage. Auth is automatic via authMiddlewareWithExclusions.
|
|
7
|
+
*
|
|
8
|
+
* The `:key` param is the store key — the account email, or the `account:<hash>` fallback
|
|
9
|
+
* (AC1a). Clients must `encodeURIComponent` it (the fallback key contains a colon).
|
|
10
|
+
*/
|
|
11
|
+
import { Router } from 'express';
|
|
12
|
+
import { listAccounts, switchAccount, removeAccount } from '../controllers/accountController.js';
|
|
13
|
+
const router = Router();
|
|
14
|
+
router.get('/', listAccounts);
|
|
15
|
+
router.post('/switch', switchAccount);
|
|
16
|
+
router.delete('/:key', removeAccount);
|
|
17
|
+
export default router;
|
|
18
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/routes/accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEjG,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAEtC,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA4DxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import { createLogger } from '../utils/logger.js';
|
|
6
|
+
const log = createLogger('config-routes');
|
|
7
|
+
const router = Router();
|
|
8
|
+
const HAMMOC_DIR = '.hammoc';
|
|
9
|
+
const CONFIG_FILE = 'config.json';
|
|
10
|
+
function getConfigPath() {
|
|
11
|
+
return path.join(os.homedir(), HAMMOC_DIR, CONFIG_FILE);
|
|
12
|
+
}
|
|
13
|
+
function ensureConfigDirectory() {
|
|
14
|
+
const configDir = path.join(os.homedir(), HAMMOC_DIR);
|
|
15
|
+
if (!fs.existsSync(configDir)) {
|
|
16
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function readConfig() {
|
|
20
|
+
const configPath = getConfigPath();
|
|
21
|
+
if (!fs.existsSync(configPath))
|
|
22
|
+
return {};
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function writeConfig(config) {
|
|
31
|
+
ensureConfigDirectory();
|
|
32
|
+
fs.writeFileSync(getConfigPath(), JSON.stringify(config, null, 2));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* POST /api/config/api-key
|
|
36
|
+
* Persist Anthropic API key to ~/.hammoc/config.json and load into process.env
|
|
37
|
+
*/
|
|
38
|
+
router.post('/api-key', (req, res) => {
|
|
39
|
+
const { apiKey } = req.body;
|
|
40
|
+
if (!apiKey || typeof apiKey !== 'string' || !apiKey.trim()) {
|
|
41
|
+
res.status(400).json({ error: 'API key is required' });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const trimmed = apiKey.trim();
|
|
45
|
+
try {
|
|
46
|
+
const config = readConfig();
|
|
47
|
+
config.anthropicApiKey = trimmed;
|
|
48
|
+
writeConfig(config);
|
|
49
|
+
process.env.ANTHROPIC_API_KEY = trimmed;
|
|
50
|
+
log.info('API key persisted and loaded into environment');
|
|
51
|
+
res.json({ success: true });
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
log.error('Failed to save API key', { error: err instanceof Error ? err.message : String(err) });
|
|
55
|
+
res.status(500).json({ error: 'Failed to save API key' });
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
export default router;
|
|
59
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../src/routes/preferences.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../src/routes/preferences.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA0NxB,eAAe,MAAM,CAAC"}
|
|
@@ -7,8 +7,10 @@ import { preferencesService } from '../services/preferencesService.js';
|
|
|
7
7
|
import { notificationService } from '../services/notificationService.js';
|
|
8
8
|
import { webPushService } from '../services/webPushService.js';
|
|
9
9
|
import { invalidateI18nCache } from '../middleware/i18n.js';
|
|
10
|
-
import {
|
|
10
|
+
import { SECTION_COMMON, SECTION_SDK, SECTION_CLI, SECTION_BMAD, TEMPLATE_VARIABLES } from '../services/workspaceContext.js';
|
|
11
|
+
import { parseLogLevel } from '@hammoc/shared';
|
|
11
12
|
import { broadcastPreferencesChange } from '../handlers/websocket.js';
|
|
13
|
+
import { setLogLevel } from '../utils/logger.js';
|
|
12
14
|
const router = Router();
|
|
13
15
|
// GET /api/preferences/telegram — Get Telegram settings (masked)
|
|
14
16
|
router.get('/telegram', async (req, res) => {
|
|
@@ -157,10 +159,17 @@ router.post('/webpush/test', async (_req, res) => {
|
|
|
157
159
|
res.status(500).json({ success: false, error: 'Failed to send test push notification' });
|
|
158
160
|
}
|
|
159
161
|
});
|
|
160
|
-
// GET /api/preferences/system-prompt — Get
|
|
161
|
-
router.get('/system-prompt', (_req, res) => {
|
|
162
|
+
// GET /api/preferences/system-prompt — Get system prompt sections (no project required)
|
|
163
|
+
router.get('/system-prompt', async (_req, res) => {
|
|
164
|
+
let userArea;
|
|
165
|
+
try {
|
|
166
|
+
const prefs = await preferencesService.readPreferences();
|
|
167
|
+
userArea = prefs.customSystemPrompt;
|
|
168
|
+
}
|
|
169
|
+
catch { /* no user area */ }
|
|
162
170
|
res.json({
|
|
163
|
-
|
|
171
|
+
sections: { common: SECTION_COMMON, sdk: SECTION_SDK, cli: SECTION_CLI, bmad: SECTION_BMAD },
|
|
172
|
+
userArea,
|
|
164
173
|
variables: TEMPLATE_VARIABLES,
|
|
165
174
|
});
|
|
166
175
|
});
|
|
@@ -188,6 +197,15 @@ router.patch('/', async (req, res) => {
|
|
|
188
197
|
if (req.body.language) {
|
|
189
198
|
invalidateI18nCache();
|
|
190
199
|
}
|
|
200
|
+
// Story BS-6: apply a server log level change at runtime (no restart). The field
|
|
201
|
+
// persisted automatically via the wholesale writePreferences merge above; here we
|
|
202
|
+
// additionally push it to the live logger. Guard against an undefined parse result
|
|
203
|
+
// (invalid level string → leave the current level untouched).
|
|
204
|
+
if (req.body.debugServerLogLevel !== undefined) {
|
|
205
|
+
const level = parseLogLevel(req.body.debugServerLogLevel);
|
|
206
|
+
if (level !== undefined)
|
|
207
|
+
setLogLevel(level);
|
|
208
|
+
}
|
|
191
209
|
// Reload notification service when telegram/webPush settings change via the merge endpoint,
|
|
192
210
|
// so the in-memory service state matches the newly persisted file.
|
|
193
211
|
if (req.body.telegram !== undefined || req.body.webPush !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/routes/preferences.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/routes/preferences.ts"],"names":[],"mappings":"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"}
|
|
@@ -88,12 +88,12 @@ class AccountInfoService {
|
|
|
88
88
|
});
|
|
89
89
|
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
90
90
|
try {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
// initializationResult() resolves from the SDK control-init handshake and does
|
|
92
|
+
// NOT require pumping the message stream. We must NOT await iter.next() first:
|
|
93
|
+
// this bootstrap prompt never yields input, so the current bundled CLI emits no
|
|
94
|
+
// SDKMessage to advance the iterator — iter.next() then blocks until the abort
|
|
95
|
+
// timeout (verified on both host and container: iter.next() stalls the full
|
|
96
|
+
// FETCH_TIMEOUT_MS, while initializationResult() alone returns the account in ~1s).
|
|
97
97
|
const initResult = await q.initializationResult();
|
|
98
98
|
return initResult?.account ?? null;
|
|
99
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountInfoService.js","sourceRoot":"","sources":["../../src/services/accountInfoService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAuB,MAAM,gCAAgC,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;AAE/C,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,kBAAkB;IACd,MAAM,GAA8D,IAAI,CAAC;IACzE,QAAQ,GAAuC,IAAI,CAAC;IAE5D,SAAS;QACP,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;YACrC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;SAC1C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,+CAA+C,OAAO,CAAC,gBAAgB,IAAI,SAAS,cAAc,OAAO,CAAC,WAAW,IAAI,SAAS,GAAG,CAAC,CAAC;YAClJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;aAClC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc;QAC1B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,aAAa,GAAkC;YACnD,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpB,OAAO;oBACL,IAAI;wBACF,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;4BACtC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gCAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;4BACzC,CAAC,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;QAEF,MAAM,CAAC,GAAG,KAAK,CAAC;YACd,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE;gBACjB,eAAe,EAAE,UAAU;gBAC3B,sBAAsB,EAAE,KAAK;aAC9B;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC;YACH
|
|
1
|
+
{"version":3,"file":"accountInfoService.js","sourceRoot":"","sources":["../../src/services/accountInfoService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Account Storage Service (Story BS-8)
|
|
3
|
+
*
|
|
4
|
+
* Multi-account credential store at `~/.hammoc/accounts.json`. Each Claude Code login
|
|
5
|
+
* accumulates its `claudeAiOauth` credential block here keyed by account email (or an
|
|
6
|
+
* `account:<hash>` fallback when the email is unavailable — AC1a). Switching writes the
|
|
7
|
+
* chosen account's credential back to the single-account `~/.claude/.credentials.json`
|
|
8
|
+
* the CLI binary reads (it has no `--profile` flag — see Dev Notes › CLI Credential Path).
|
|
9
|
+
*
|
|
10
|
+
* Follows the `preferencesService` JSON-file pattern (`~/.hammoc/*.json`) and the
|
|
11
|
+
* `rateLimitProbeService` credential-read path. Token material never leaves this layer:
|
|
12
|
+
* the controller projects entries through {@link toSummary} before responding.
|
|
13
|
+
*
|
|
14
|
+
* Data safety (AC13): the store file is hardened after every write — `chmod 0600` on Unix,
|
|
15
|
+
* `icacls /inheritance:r /grant:r` on Windows. The credentials file is written atomically
|
|
16
|
+
* (temp file in the same dir + rename) so a concurrent CLI read never sees a partial file.
|
|
17
|
+
*/
|
|
18
|
+
import type { StoredAccount, AccountSummary, ClaudeOAuthCredential } from '@hammoc/shared';
|
|
19
|
+
/** Metadata supplied alongside a credential on upsert. */
|
|
20
|
+
export interface UpsertAccountMeta {
|
|
21
|
+
/** Account email, or null when unavailable (AC1a → fallback key). */
|
|
22
|
+
email: string | null;
|
|
23
|
+
/** Subscription tier (from `credential.claudeAiOauth.subscriptionType`). */
|
|
24
|
+
tier: string | null;
|
|
25
|
+
}
|
|
26
|
+
declare class AccountStorageService {
|
|
27
|
+
private getDataDir;
|
|
28
|
+
private getStorePath;
|
|
29
|
+
private getCredentialsPath;
|
|
30
|
+
/** Read the store, returning an empty store when the file is absent/unreadable. */
|
|
31
|
+
private readStore;
|
|
32
|
+
/** Write the store as pretty JSON, then harden file permissions (AC13). */
|
|
33
|
+
private writeStore;
|
|
34
|
+
/**
|
|
35
|
+
* Restrict the credential file to the owning user only.
|
|
36
|
+
* - Unix: `chmod 0600`.
|
|
37
|
+
* - Windows: POSIX modes are a no-op, so strip inherited ACEs and grant only the current
|
|
38
|
+
* user via `icacls`. Failure is logged and non-fatal (never blocks the write).
|
|
39
|
+
*/
|
|
40
|
+
private hardenFilePermissions;
|
|
41
|
+
/** `icacls <file> /inheritance:r /grant:r "<USER>:F"` — best-effort, non-fatal. */
|
|
42
|
+
private hardenWindowsAcl;
|
|
43
|
+
/** Deterministic fallback key for a credential whose email is unknown (AC1a). */
|
|
44
|
+
private fallbackKey;
|
|
45
|
+
/** Project a stored entry to its token-free public summary (AC14/AC15). */
|
|
46
|
+
private toSummary;
|
|
47
|
+
/** All stored accounts as token-free summaries (active account marked). */
|
|
48
|
+
listAccounts(): Promise<AccountSummary[]>;
|
|
49
|
+
/** The active store key (mirrors which credential is in `~/.claude/.credentials.json`). */
|
|
50
|
+
getActiveKey(): Promise<string | null>;
|
|
51
|
+
/** Set the active store key (no credential file write — see {@link switchAccount}). */
|
|
52
|
+
setActiveKey(key: string | null): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Insert or update an account entry (AC1, AC2, AC3). Keyed by email when present,
|
|
55
|
+
* otherwise by the `account:<hash>` fallback (AC1a). Re-upserting the same key updates
|
|
56
|
+
* in place — no duplicate (AC2). `Date()` is captured by the caller via `lastUsedAt`
|
|
57
|
+
* defaulting to now here. Returns the resolved store key.
|
|
58
|
+
*/
|
|
59
|
+
upsertAccount(credential: ClaudeOAuthCredential, meta: UpsertAccountMeta): Promise<{
|
|
60
|
+
key: string;
|
|
61
|
+
account: StoredAccount;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Remove a stored account (AC8). Removing the currently active account is disallowed —
|
|
65
|
+
* returns `{ removed: false, reason: 'active' }` so the caller can surface a 409.
|
|
66
|
+
*/
|
|
67
|
+
removeAccount(key: string): Promise<{
|
|
68
|
+
removed: boolean;
|
|
69
|
+
reason?: 'active' | 'not-found';
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Capture the CURRENTLY ACTIVE credential file into the store (Task 3 / AC1, AC1a, AC2, AC3).
|
|
73
|
+
* Called right after a BS-7 login completes, when `~/.claude/.credentials.json` already holds
|
|
74
|
+
* the new account's credential. Reads the full `claudeAiOauth` block verbatim, takes the tier
|
|
75
|
+
* directly from it, and uses the email resolved by accountInfoService (or the fallback key).
|
|
76
|
+
* Marks the captured account active. Returns null when no credential file is present.
|
|
77
|
+
*/
|
|
78
|
+
captureActiveCredential(email: string | null): Promise<{
|
|
79
|
+
key: string;
|
|
80
|
+
account: StoredAccount;
|
|
81
|
+
} | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Switch the active account (AC9, AC10, AC11, AC12). Writes the stored credential to
|
|
84
|
+
* `~/.claude/.credentials.json` atomically (temp + rename) so concurrent CLI readers never
|
|
85
|
+
* see a partial file, then updates the active marker and `lastUsedAt`. Running CLI sessions
|
|
86
|
+
* are untouched — only NEW sessions pick up the switched credential (AC11).
|
|
87
|
+
*
|
|
88
|
+
* Expiry (AC12) is detected by `expiresAt < Date.now()` — NO custom OAuth refresh call in
|
|
89
|
+
* Phase 1 (Dev Notes › Token Refresh). When expired, the switch still completes and
|
|
90
|
+
* `reauthRequired` is true so the client can offer the BS-7 re-login flow.
|
|
91
|
+
*/
|
|
92
|
+
switchAccount(key: string): Promise<{
|
|
93
|
+
switched: true;
|
|
94
|
+
reauthRequired: boolean;
|
|
95
|
+
account: StoredAccount;
|
|
96
|
+
} | {
|
|
97
|
+
switched: false;
|
|
98
|
+
reason: 'not-found';
|
|
99
|
+
}>;
|
|
100
|
+
/**
|
|
101
|
+
* Back-fill the email on the ACTIVE account when it was stored under the `account:<hash>`
|
|
102
|
+
* fallback (AC1a / AC3). Called after a switch once accountInfoService resolves an email for
|
|
103
|
+
* the now-active credential. Re-keys the entry from the fallback to the email key, clears the
|
|
104
|
+
* back-fill flag, and moves the active marker. No-op when the active account already has an
|
|
105
|
+
* email or no active account exists. Returns the (possibly new) active key.
|
|
106
|
+
*/
|
|
107
|
+
backfillActiveEmail(email: string): Promise<string | null>;
|
|
108
|
+
/** Read & parse `~/.claude/.credentials.json` into a credential block, or null. */
|
|
109
|
+
private readActiveCredential;
|
|
110
|
+
/**
|
|
111
|
+
* Atomically write the credential block to `~/.claude/.credentials.json`:
|
|
112
|
+
* write to a temp file in the SAME directory, harden its perms, then `fs.rename`
|
|
113
|
+
* (atomic on the same filesystem). Readers see either the old or the new complete file.
|
|
114
|
+
*/
|
|
115
|
+
private writeCredentialFileAtomic;
|
|
116
|
+
}
|
|
117
|
+
export declare const accountStorageService: AccountStorageService;
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=accountStorageService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accountStorageService.d.ts","sourceRoot":"","sources":["../../src/services/accountStorageService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAKxB,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAID,cAAM,qBAAqB;IACzB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAI1B,mFAAmF;YACrE,SAAS;IAcvB,2EAA2E;YAC7D,UAAU;IAQxB;;;;;OAKG;YACW,qBAAqB;IAYnC,mFAAmF;IACnF,OAAO,CAAC,gBAAgB;IA2BxB,iFAAiF;IACjF,OAAO,CAAC,WAAW;IAMnB,2EAA2E;IAC3E,OAAO,CAAC,SAAS;IAajB,2EAA2E;IACrE,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAO/C,2FAA2F;IACrF,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI5C,uFAAuF;IACjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;OAKG;IACG,aAAa,CACjB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IAmBnD;;;OAGG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;KAAE,CAAC;IAShG;;;;;;OAMG;IACG,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI,CAAC;IAa5G;;;;;;;;;OASG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACrC;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GACnE;QAAE,QAAQ,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAC3C;IAiBD;;;;;;OAMG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsBhE,mFAAmF;YACrE,oBAAoB;IAYlC;;;;OAIG;YACW,yBAAyB;CAgBxC;AAED,eAAO,MAAM,qBAAqB,uBAA8B,CAAC"}
|