hammoc 1.7.2 → 1.8.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.
Files changed (130) hide show
  1. package/README.md +2 -2
  2. package/package.json +4 -1
  3. package/packages/client/dist/assets/{agentExampleHighlight-De1SlBXH.js → agentExampleHighlight-B2IJxYzN.js} +1 -1
  4. package/packages/client/dist/assets/{commandTokenHighlight-COQi5YnH.js → commandTokenHighlight-BdGXkDR5.js} +1 -1
  5. package/packages/client/dist/assets/{index-D8XvfvVS.js → index-BFWGN51V.js} +1 -1
  6. package/packages/client/dist/assets/index-BX7y_Qt3.css +32 -0
  7. package/packages/client/dist/assets/{index-CQgqPGOG.js → index-lmx-m-iP.js} +552 -478
  8. package/packages/client/dist/assets/{snippetTokenHighlight-jMAHlrFd.js → snippetTokenHighlight-B9bH9Npx.js} +1 -1
  9. package/packages/client/dist/index.html +2 -2
  10. package/packages/client/dist/sw.js +1 -1
  11. package/packages/server/dist/app.d.ts.map +1 -1
  12. package/packages/server/dist/app.js +25 -1
  13. package/packages/server/dist/app.js.map +1 -1
  14. package/packages/server/dist/config/index.d.ts +10 -0
  15. package/packages/server/dist/config/index.d.ts.map +1 -1
  16. package/packages/server/dist/config/index.js +10 -0
  17. package/packages/server/dist/config/index.js.map +1 -1
  18. package/packages/server/dist/controllers/accountController.d.ts +19 -0
  19. package/packages/server/dist/controllers/accountController.d.ts.map +1 -0
  20. package/packages/server/dist/controllers/accountController.js +92 -0
  21. package/packages/server/dist/controllers/accountController.js.map +1 -0
  22. package/packages/server/dist/controllers/projectController.d.ts +1 -1
  23. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  24. package/packages/server/dist/controllers/projectController.js +19 -5
  25. package/packages/server/dist/controllers/projectController.js.map +1 -1
  26. package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
  27. package/packages/server/dist/controllers/serverController.js +8 -1
  28. package/packages/server/dist/controllers/serverController.js.map +1 -1
  29. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  30. package/packages/server/dist/handlers/websocket.js +83 -6
  31. package/packages/server/dist/handlers/websocket.js.map +1 -1
  32. package/packages/server/dist/index.js +8 -0
  33. package/packages/server/dist/index.js.map +1 -1
  34. package/packages/server/dist/middleware/session.d.ts.map +1 -1
  35. package/packages/server/dist/middleware/session.js +7 -5
  36. package/packages/server/dist/middleware/session.js.map +1 -1
  37. package/packages/server/dist/routes/accounts.d.ts +13 -0
  38. package/packages/server/dist/routes/accounts.d.ts.map +1 -0
  39. package/packages/server/dist/routes/accounts.js +18 -0
  40. package/packages/server/dist/routes/accounts.js.map +1 -0
  41. package/packages/server/dist/routes/config.d.ts +3 -0
  42. package/packages/server/dist/routes/config.d.ts.map +1 -0
  43. package/packages/server/dist/routes/config.js +59 -0
  44. package/packages/server/dist/routes/config.js.map +1 -0
  45. package/packages/server/dist/routes/preferences.d.ts.map +1 -1
  46. package/packages/server/dist/routes/preferences.js +22 -4
  47. package/packages/server/dist/routes/preferences.js.map +1 -1
  48. package/packages/server/dist/services/accountInfoService.js +6 -6
  49. package/packages/server/dist/services/accountInfoService.js.map +1 -1
  50. package/packages/server/dist/services/accountStorageService.d.ts +119 -0
  51. package/packages/server/dist/services/accountStorageService.d.ts.map +1 -0
  52. package/packages/server/dist/services/accountStorageService.js +285 -0
  53. package/packages/server/dist/services/accountStorageService.js.map +1 -0
  54. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  55. package/packages/server/dist/services/chatService.js +4 -8
  56. package/packages/server/dist/services/chatService.js.map +1 -1
  57. package/packages/server/dist/services/claudeLoginService.d.ts +124 -0
  58. package/packages/server/dist/services/claudeLoginService.d.ts.map +1 -0
  59. package/packages/server/dist/services/claudeLoginService.js +417 -0
  60. package/packages/server/dist/services/claudeLoginService.js.map +1 -0
  61. package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -1
  62. package/packages/server/dist/services/cliChatEngine.js +85 -33
  63. package/packages/server/dist/services/cliChatEngine.js.map +1 -1
  64. package/packages/server/dist/services/cliGridCards.d.ts +30 -10
  65. package/packages/server/dist/services/cliGridCards.d.ts.map +1 -1
  66. package/packages/server/dist/services/cliGridCards.js +80 -34
  67. package/packages/server/dist/services/cliGridCards.js.map +1 -1
  68. package/packages/server/dist/services/cliModalDetect.d.ts +15 -7
  69. package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -1
  70. package/packages/server/dist/services/cliModalDetect.js +16 -12
  71. package/packages/server/dist/services/cliModalDetect.js.map +1 -1
  72. package/packages/server/dist/services/cliScreenModel.d.ts +3 -2
  73. package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -1
  74. package/packages/server/dist/services/cliScreenModel.js +2 -0
  75. package/packages/server/dist/services/cliScreenModel.js.map +1 -1
  76. package/packages/server/dist/services/cliService.d.ts.map +1 -1
  77. package/packages/server/dist/services/cliService.js +2 -7
  78. package/packages/server/dist/services/cliService.js.map +1 -1
  79. package/packages/server/dist/services/cliSessionPool.d.ts +13 -1
  80. package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -1
  81. package/packages/server/dist/services/cliSessionPool.js +14 -4
  82. package/packages/server/dist/services/cliSessionPool.js.map +1 -1
  83. package/packages/server/dist/services/preferencesService.d.ts +1 -0
  84. package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
  85. package/packages/server/dist/services/preferencesService.js +25 -2
  86. package/packages/server/dist/services/preferencesService.js.map +1 -1
  87. package/packages/server/dist/services/queueService.d.ts +1 -0
  88. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  89. package/packages/server/dist/services/queueService.js +3 -0
  90. package/packages/server/dist/services/queueService.js.map +1 -1
  91. package/packages/server/dist/services/rateLimitProbeService.d.ts +7 -0
  92. package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
  93. package/packages/server/dist/services/rateLimitProbeService.js +10 -0
  94. package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
  95. package/packages/server/dist/services/workspaceContext.d.ts +29 -3
  96. package/packages/server/dist/services/workspaceContext.d.ts.map +1 -1
  97. package/packages/server/dist/services/workspaceContext.js +100 -8
  98. package/packages/server/dist/services/workspaceContext.js.map +1 -1
  99. package/packages/server/dist/snippets/promote-to-story +86 -9
  100. package/packages/server/dist/utils/cliDebugLog.d.ts +6 -5
  101. package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -1
  102. package/packages/server/dist/utils/cliDebugLog.js +11 -8
  103. package/packages/server/dist/utils/cliDebugLog.js.map +1 -1
  104. package/packages/server/dist/utils/logger.d.ts +7 -0
  105. package/packages/server/dist/utils/logger.d.ts.map +1 -1
  106. package/packages/server/dist/utils/logger.js +13 -1
  107. package/packages/server/dist/utils/logger.js.map +1 -1
  108. package/packages/server/resources/manual/01-getting-started.md +11 -5
  109. package/packages/server/resources/manual/03-sessions.md +1 -0
  110. package/packages/server/resources/manual/04-slash-commands-favorites.md +1 -0
  111. package/packages/server/resources/manual/13-settings.md +34 -10
  112. package/packages/server/resources/manual/16-troubleshooting.md +4 -7
  113. package/packages/shared/dist/index.d.ts +2 -1
  114. package/packages/shared/dist/index.d.ts.map +1 -1
  115. package/packages/shared/dist/index.js +2 -0
  116. package/packages/shared/dist/index.js.map +1 -1
  117. package/packages/shared/dist/types/accounts.d.ts +104 -0
  118. package/packages/shared/dist/types/accounts.d.ts.map +1 -0
  119. package/packages/shared/dist/types/accounts.js +14 -0
  120. package/packages/shared/dist/types/accounts.js.map +1 -0
  121. package/packages/shared/dist/types/preferences.d.ts +39 -0
  122. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  123. package/packages/shared/dist/types/preferences.js.map +1 -1
  124. package/packages/shared/dist/types/sdk.d.ts +3 -1
  125. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  126. package/packages/shared/dist/types/sdk.js.map +1 -1
  127. package/packages/shared/dist/types/websocket.d.ts +23 -1
  128. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  129. package/packages/client/dist/assets/index-BsHMOF5r.css +0 -32
  130. package/packages/server/dist/snippets/promote-issue +0 -9
@@ -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
- // Use environment-specific cookie name to prevent session conflicts
23
- // when running multiple instances on same hostname (different ports)
24
- const cookieName = process.env.NODE_ENV === 'production'
25
- ? 'bmad-session'
26
- : `bmad-session-${process.env.PORT || '3000'}`;
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,oEAAoE;IACpE,qEAAqE;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACtD,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,gBAAgB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjD,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"}
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,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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;AAWH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA4MxB,eAAe,MAAM,CAAC"}
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 { DEFAULT_WORKSPACE_TEMPLATE, TEMPLATE_VARIABLES } from '../services/workspaceContext.js';
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 default system prompt template (no project required)
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
- template: DEFAULT_WORKSPACE_TEMPLATE,
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,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAEjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB,iEAAiE;AACjE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE,CAAC,gCAAgC,CAAC,EAAE;SACnG,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,EACJ,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAChD,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAC7C,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,wBAAwB,GAClF,GAAG,GAAG,CAAC,IAAqC,CAAC;QAC9C,MAAM,MAAM,GAAkC;YAC5C,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY;YAChD,gBAAgB,EAAE,cAAc,EAAE,WAAW;YAC7C,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,wBAAwB;SAClF,CAAC;QAEF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9D,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE,CAAC,sCAAsC,CAAC,EAAE;iBAC9F,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE,CAAC,oCAAoC,CAAC,EAAE;iBAC1F,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,mBAAmB,CAAC,MAAM,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE,CAAC,iCAAiC,CAAC,EAAE;SACrG,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAClE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAA8B,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAA4B,EAAE;YACtG,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,CAAC,CAAE,CAAC,gCAAgC,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,0EAA0E;AAC1E,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,CAAC;QACzD,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK;YACxC,cAAc;YACd,iBAAiB,EAAE,cAAc,CAAC,oBAAoB,EAAE;SACzD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,kCAAkC,EAAE,EAAE,CAAC,CAAC;IACxH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAA6B,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC;QAChE,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,MAAM,mBAAmB,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,cAAc;YACd,iBAAiB,EAAE,cAAc,CAAC,oBAAoB,EAAE;SACzD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAC3H,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAA+B,CAAC;QACxE,IAAI,CAAC,YAAY,EAAE,QAAQ,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACxF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;YACxG,OAAO;QACT,CAAC;QACD,MAAM,cAAc,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC;QACxF,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAC/D,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,yBAAyB,EAAE,OAAO,EAAE;SACxF,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACxE,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAA4B,CAAC;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;YAC/F,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,oCAAoC,EAAE,EAAE,CAAC,CAAC;IACxH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,mEAAmE;AACnE,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,gGAAgG;AAChG,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC5D,GAAG,CAAC,IAAI,CAAC;QACP,QAAQ,EAAE,0BAA0B;QACpC,SAAS,EAAE,kBAAkB;KAC9B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,uBAAuB,EAAE,CAAC;QACvE,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;YAAE,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC;YACP,GAAG,WAAW;YACd,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC,CAAC;IAChH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpE,qDAAqD;QACrD,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,mBAAmB,EAAE,CAAC;QACxB,CAAC;QACD,4FAA4F;QAC5F,mEAAmE;QACnE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACtE,MAAM,mBAAmB,CAAC,MAAM,EAAE,CAAC;QACrC,CAAC;QACD,6EAA6E;QAC7E,6EAA6E;QAC7E,+DAA+D;QAC/D,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,0BAA0B,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC;IAClH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
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
- const iter = q[Symbol.asyncIterator]();
92
- const first = await iter.next();
93
- if (first.done) {
94
- log.warn('bootstrap query ended before init message');
95
- return null;
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":"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"}
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"}