aemeathcli 1.0.10 → 1.0.12

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -54
  3. package/dist/App-JQ622M66.js +4431 -0
  4. package/dist/App-JQ622M66.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/auth-status-JQJOKUPF.js.map +1 -0
  17. package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/chunk-36RXCZOV.js +88 -0
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
  26. package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
  27. package/dist/chunk-BIMQL4AG.js +186 -0
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
  36. package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
  37. package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
  38. package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
  39. package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
  40. package/dist/chunk-K2FCMRXH.js.map +1 -0
  41. package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
  42. package/dist/chunk-KIC7UI5U.js.map +1 -0
  43. package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
  44. package/dist/chunk-KMOAJRDE.js.map +1 -0
  45. package/dist/chunk-LQBALETG.js +71 -0
  46. package/dist/chunk-LQBALETG.js.map +1 -0
  47. package/dist/chunk-M3FPQSRU.js +12 -0
  48. package/dist/chunk-M3FPQSRU.js.map +1 -0
  49. package/dist/chunk-NQEUK763.js +26 -0
  50. package/dist/chunk-NQEUK763.js.map +1 -0
  51. package/dist/chunk-OPWAFS6Y.js +38 -0
  52. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  53. package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
  54. package/dist/chunk-PS4WEFW6.js.map +1 -0
  55. package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
  56. package/dist/chunk-QK7TKNHV.js.map +1 -0
  57. package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
  58. package/dist/chunk-RADJSEG5.js.map +1 -0
  59. package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
  60. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  61. package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
  62. package/dist/chunk-UM7MSLOV.js.map +1 -0
  63. package/dist/chunk-VNZ3YTQD.js +232 -0
  64. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  65. package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
  66. package/dist/chunk-WXIN65UG.js.map +1 -0
  67. package/dist/chunk-XEXWX7C7.js +241 -0
  68. package/dist/chunk-XEXWX7C7.js.map +1 -0
  69. package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
  70. package/dist/chunk-YCCYXDW7.js.map +1 -0
  71. package/dist/chunk-YPQ2MLAV.js +140 -0
  72. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  73. package/dist/chunk-ZCOVMVK4.js +26 -0
  74. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  75. package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
  76. package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
  77. package/dist/cli.js +370 -171
  78. package/dist/cli.js.map +1 -1
  79. package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
  80. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  81. package/dist/config-store-NF56VHFU.js +7 -0
  82. package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
  83. package/dist/conversation-store-7GRDQZD2.js +4 -0
  84. package/dist/conversation-store-7GRDQZD2.js.map +1 -0
  85. package/dist/detect-providers-QICJ5U3R.js +4 -0
  86. package/dist/detect-providers-QICJ5U3R.js.map +1 -0
  87. package/dist/executor-FTABX2AW.js +4 -0
  88. package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
  89. package/dist/first-run-ADROZVYF.js +230 -0
  90. package/dist/first-run-ADROZVYF.js.map +1 -0
  91. package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
  92. package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
  93. package/dist/index.d.ts +46 -70
  94. package/dist/index.js +79 -468
  95. package/dist/index.js.map +1 -1
  96. package/dist/input-history-BEICE7PT.js +57 -0
  97. package/dist/input-history-BEICE7PT.js.map +1 -0
  98. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  99. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  100. package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
  101. package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
  102. package/dist/logger-KGHUQ4VE.js +3 -0
  103. package/dist/logger-KGHUQ4VE.js.map +1 -0
  104. package/dist/model-discovery-AAJDHRFO.js +6 -0
  105. package/dist/model-discovery-AAJDHRFO.js.map +1 -0
  106. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  107. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  108. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  109. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  110. package/dist/pathResolver-UVAB2FCW.js +3 -0
  111. package/dist/pathResolver-UVAB2FCW.js.map +1 -0
  112. package/dist/profile-loader-EMLV4J7S.js +162 -0
  113. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  114. package/dist/registry-LRURZVUL.js +5 -0
  115. package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
  116. package/dist/registry-MVNSXCEF.js +6 -0
  117. package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
  118. package/dist/server-manager-THGZBBZB.js +5 -0
  119. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
  120. package/dist/session-manager-X3DXT53M.js +12 -0
  121. package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
  122. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  123. package/dist/skills/built-in/commit/SKILL.md +83 -0
  124. package/dist/skills/built-in/debug/SKILL.md +119 -0
  125. package/dist/skills/built-in/plan/SKILL.md +123 -0
  126. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  127. package/dist/skills/built-in/test/SKILL.md +128 -0
  128. package/dist/sqlite-store-7OECRTXM.js +5 -0
  129. package/dist/sqlite-store-7OECRTXM.js.map +1 -0
  130. package/dist/team-manager-2VSMALAA.js +11 -0
  131. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
  132. package/dist/team-state-HZNVMQHT.js +3 -0
  133. package/dist/team-state-HZNVMQHT.js.map +1 -0
  134. package/dist/tmux-manager-57QCUVHU.js +6 -0
  135. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  136. package/dist/tools-KWFSYT56.js +6 -0
  137. package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
  138. package/package.json +11 -11
  139. package/dist/App-FKRSMFMB.js +0 -2789
  140. package/dist/App-FKRSMFMB.js.map +0 -1
  141. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  142. package/dist/chunk-4IJD72YB.js.map +0 -1
  143. package/dist/chunk-6PDJ45T4.js.map +0 -1
  144. package/dist/chunk-CARHU3DO.js.map +0 -1
  145. package/dist/chunk-CGEV3ARR.js.map +0 -1
  146. package/dist/chunk-CS5X3BWX.js +0 -27
  147. package/dist/chunk-CS5X3BWX.js.map +0 -1
  148. package/dist/chunk-CYQNBB25.js.map +0 -1
  149. package/dist/chunk-DAHGLHNR.js.map +0 -1
  150. package/dist/chunk-H66O5Z2V.js.map +0 -1
  151. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  152. package/dist/chunk-IYW62KKR.js.map +0 -1
  153. package/dist/chunk-LSOYPSAT.js.map +0 -1
  154. package/dist/chunk-MFBHNWGV.js.map +0 -1
  155. package/dist/chunk-MXZSI3AY.js.map +0 -1
  156. package/dist/chunk-NBR3GHMT.js.map +0 -1
  157. package/dist/chunk-RWCNNAL7.js.map +0 -1
  158. package/dist/chunk-TEVZS4FA.js.map +0 -1
  159. package/dist/chunk-UY2SYSEZ.js +0 -211
  160. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  161. package/dist/chunk-WAHVZH7V.js +0 -260
  162. package/dist/chunk-WAHVZH7V.js.map +0 -1
  163. package/dist/chunk-WPP3PEDE.js +0 -234
  164. package/dist/chunk-WPP3PEDE.js.map +0 -1
  165. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  166. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  167. package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
  168. package/dist/codex-login-GZIFXUWD.js.map +0 -1
  169. package/dist/config-store-W6FBCQAQ.js +0 -6
  170. package/dist/executor-6RIKIGXK.js +0 -4
  171. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  172. package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
  173. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  174. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  175. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  176. package/dist/openai-adapter-XU46EN7B.js +0 -6
  177. package/dist/openai-adapter-XU46EN7B.js.map +0 -1
  178. package/dist/registry-AZ2LOHHJ.js +0 -6
  179. package/dist/registry-H7B3AHPQ.js +0 -5
  180. package/dist/server-manager-PTGBHCLS.js +0 -5
  181. package/dist/session-manager-XOMDMC77.js +0 -12
  182. package/dist/team-manager-HC4XGCFY.js +0 -11
  183. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  184. package/dist/tools-TSMXMHIF.js +0 -6
@@ -1,142 +1,7 @@
1
1
  import { getEventBus } from './chunk-YL5XFHR3.js';
2
- import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-CGEV3ARR.js';
3
- import { isCommandBlocked } from './chunk-CS5X3BWX.js';
4
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
5
- import { ModelNotFoundError } from './chunk-ZGOHARPV.js';
6
- import { logger } from './chunk-JAXXTYID.js';
7
-
8
- // src/core/model-router.ts
9
- var ModelRouter = class {
10
- config;
11
- userOverride;
12
- constructor(config) {
13
- this.config = config;
14
- }
15
- /**
16
- * Set a temporary user override that takes highest priority.
17
- */
18
- setUserOverride(modelId) {
19
- if (modelId !== void 0) {
20
- this.validateModel(modelId);
21
- }
22
- this.userOverride = modelId;
23
- }
24
- /**
25
- * Resolve the best model for a given role through the priority pipeline.
26
- */
27
- resolve(role) {
28
- if (this.userOverride) {
29
- const info = this.getModelInfo(this.userOverride);
30
- return {
31
- modelId: this.userOverride,
32
- provider: info.provider,
33
- source: "user_override",
34
- role
35
- };
36
- }
37
- if (role) {
38
- const roleConfig = this.config.roles[role];
39
- if (roleConfig) {
40
- if (this.isModelAvailable(roleConfig.primary)) {
41
- const info = this.getModelInfo(roleConfig.primary);
42
- return {
43
- modelId: roleConfig.primary,
44
- provider: info.provider,
45
- source: "role_config",
46
- role
47
- };
48
- }
49
- for (const fallbackModel of roleConfig.fallback) {
50
- if (this.isModelAvailable(fallbackModel)) {
51
- const info = this.getModelInfo(fallbackModel);
52
- logger.info(
53
- { role, primary: roleConfig.primary, fallback: fallbackModel },
54
- "Using fallback model for role"
55
- );
56
- return {
57
- modelId: fallbackModel,
58
- provider: info.provider,
59
- source: "fallback_chain",
60
- role
61
- };
62
- }
63
- }
64
- }
65
- }
66
- const defaultModel = this.config.defaultModel;
67
- if (this.isModelAvailable(defaultModel)) {
68
- const info = this.getModelInfo(defaultModel);
69
- return {
70
- modelId: defaultModel,
71
- provider: info.provider,
72
- source: "system_default",
73
- role
74
- };
75
- }
76
- const anyAvailable = this.getAvailableModels()[0];
77
- if (anyAvailable) {
78
- return {
79
- modelId: anyAvailable.id,
80
- provider: anyAvailable.provider,
81
- source: "system_default",
82
- role
83
- };
84
- }
85
- throw new ModelNotFoundError(defaultModel);
86
- }
87
- /**
88
- * Check if a model is available (provider is enabled and model is known).
89
- */
90
- isModelAvailable(modelId) {
91
- const info = SUPPORTED_MODELS[modelId];
92
- if (!info) {
93
- return false;
94
- }
95
- return this.config.enabledProviders.includes(info.provider);
96
- }
97
- /**
98
- * Get model info by ID. Throws if not found.
99
- */
100
- getModelInfo(modelId) {
101
- const info = SUPPORTED_MODELS[modelId];
102
- if (!info) {
103
- throw new ModelNotFoundError(modelId);
104
- }
105
- return info;
106
- }
107
- /**
108
- * Get all available models (from enabled providers).
109
- */
110
- getAvailableModels() {
111
- return Object.values(SUPPORTED_MODELS).filter(
112
- (model) => this.config.enabledProviders.includes(model.provider)
113
- );
114
- }
115
- /**
116
- * List models recommended for a specific role.
117
- */
118
- getModelsForRole(role) {
119
- return this.getAvailableModels().filter(
120
- (model) => model.supportedRoles.includes(role)
121
- );
122
- }
123
- /**
124
- * Validate that a model ID exists. Throws ModelNotFoundError if not.
125
- */
126
- validateModel(modelId) {
127
- if (!SUPPORTED_MODELS[modelId]) {
128
- throw new ModelNotFoundError(modelId);
129
- }
130
- }
131
- };
132
- function createModelRouter(config) {
133
- const enabledProviders = Object.entries(config.providers).filter(([, providerConfig]) => providerConfig?.enabled).map(([name]) => name);
134
- return new ModelRouter({
135
- defaultModel: config.defaultModel,
136
- roles: config.roles,
137
- enabledProviders
138
- });
139
- }
2
+ import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-YCCYXDW7.js';
3
+ import { isCommandBlocked } from './chunk-OPWAFS6Y.js';
4
+ import { logger } from './chunk-IR5HLBMH.js';
140
5
 
141
6
  // src/core/context-manager.ts
142
7
  var CONTEXT_BUDGET_RATIO = 0.85;
@@ -652,6 +517,6 @@ var TaskOrchestrator = class {
652
517
  }
653
518
  };
654
519
 
655
- export { ContextManager, CostTracker, ModelRouter, PermissionManager, TaskOrchestrator, createModelRouter };
656
- //# sourceMappingURL=chunk-DAHGLHNR.js.map
657
- //# sourceMappingURL=chunk-DAHGLHNR.js.map
520
+ export { ContextManager, CostTracker, PermissionManager, TaskOrchestrator };
521
+ //# sourceMappingURL=chunk-2ZYK5IJG.js.map
522
+ //# sourceMappingURL=chunk-2ZYK5IJG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/context-manager.ts","../src/core/cost-tracker.ts","../src/core/permission-manager.ts","../src/core/task-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-2ZYK5IJG.js","sourcesContent":["/**\n * Context window management per PRD section 7.4\n * - Token budgeting: 85% conversation, 15% buffer\n * - Smart truncation: prioritize recent + system prompt\n * - Compression: summarize old messages when approaching limits\n * - File context tracking with LRU eviction\n */\n\nimport type { IChatMessage, IModelInfo } from \"../types/index.js\";\nimport { estimateTokenCount } from \"../utils/index.js\";\nimport { logger } from \"../utils/index.js\";\n\nconst CONTEXT_BUDGET_RATIO = 0.85;\nconst SYSTEM_PROMPT_RESERVE = 4_000;\n\ninterface IFileContextEntry {\n readonly filePath: string;\n readonly tokenCount: number;\n lastAccessedAt: number;\n}\n\nexport class ContextManager {\n private readonly maxTokens: number;\n private readonly budgetTokens: number;\n private readonly fileContext = new Map<string, IFileContextEntry>();\n private currentTokenCount = 0;\n\n constructor(modelInfo: IModelInfo) {\n this.maxTokens = modelInfo.contextWindow;\n this.budgetTokens = Math.floor(this.maxTokens * CONTEXT_BUDGET_RATIO);\n }\n\n /**\n * Get the available token budget for new content.\n */\n getAvailableBudget(): number {\n return Math.max(0, this.budgetTokens - this.currentTokenCount - SYSTEM_PROMPT_RESERVE);\n }\n\n /**\n * Get total context usage.\n */\n getUsage(): { used: number; budget: number; max: number; percentage: number } {\n return {\n used: this.currentTokenCount,\n budget: this.budgetTokens,\n max: this.maxTokens,\n percentage: Math.round((this.currentTokenCount / this.budgetTokens) * 100),\n };\n }\n\n /**\n * Trim messages to fit within the context window.\n * Preserves system prompt and most recent messages.\n */\n trimMessages(messages: readonly IChatMessage[], systemPrompt?: string): IChatMessage[] {\n const systemTokens = systemPrompt ? estimateTokenCount(systemPrompt) : 0;\n const availableTokens = this.budgetTokens - systemTokens - SYSTEM_PROMPT_RESERVE;\n\n if (availableTokens <= 0) {\n logger.warn(\"System prompt alone exceeds context budget\");\n return [];\n }\n\n // Work backwards from most recent, accumulating tokens\n const result: IChatMessage[] = [];\n let usedTokens = 0;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg) {\n continue;\n }\n const msgTokens = estimateTokenCount(msg.content);\n\n if (usedTokens + msgTokens > availableTokens) {\n break;\n }\n\n result.unshift(msg);\n usedTokens += msgTokens;\n }\n\n this.currentTokenCount = usedTokens + systemTokens;\n\n if (result.length < messages.length) {\n logger.info(\n {\n original: messages.length,\n trimmed: result.length,\n droppedMessages: messages.length - result.length,\n },\n \"Trimmed conversation to fit context window\",\n );\n }\n\n return result;\n }\n\n /**\n * Track a file being added to context.\n */\n addFileContext(filePath: string, content: string): void {\n const tokenCount = estimateTokenCount(content);\n this.fileContext.set(filePath, {\n filePath,\n tokenCount,\n lastAccessedAt: Date.now(),\n });\n this.currentTokenCount += tokenCount;\n }\n\n /**\n * Touch a file (update last accessed time).\n */\n touchFile(filePath: string): void {\n const entry = this.fileContext.get(filePath);\n if (entry) {\n entry.lastAccessedAt = Date.now();\n }\n }\n\n /**\n * Remove a file from context.\n */\n removeFileContext(filePath: string): void {\n const entry = this.fileContext.get(filePath);\n if (entry) {\n this.currentTokenCount -= entry.tokenCount;\n this.fileContext.delete(filePath);\n }\n }\n\n /**\n * Evict least-recently-used files to free space.\n */\n evictLRU(tokensNeeded: number): string[] {\n const evicted: string[] = [];\n const sorted = [...this.fileContext.entries()].sort(\n ([, a], [, b]) => a.lastAccessedAt - b.lastAccessedAt,\n );\n\n let freedTokens = 0;\n for (const [filePath, entry] of sorted) {\n if (freedTokens >= tokensNeeded) {\n break;\n }\n this.removeFileContext(filePath);\n freedTokens += entry.tokenCount;\n evicted.push(filePath);\n }\n\n if (evicted.length > 0) {\n logger.info(\n { evicted, freedTokens },\n \"Evicted files from context to free space\",\n );\n }\n\n return evicted;\n }\n\n /**\n * Get all tracked files.\n */\n getTrackedFiles(): readonly IFileContextEntry[] {\n return [...this.fileContext.values()];\n }\n\n /**\n * Reset context tracking (for model switch).\n */\n reset(): void {\n this.fileContext.clear();\n this.currentTokenCount = 0;\n }\n}\n","/**\n * Real-time cost tracking per PRD section 7.5\n * - Per-request cost calculation\n * - Session total\n * - Breakdown by provider, model, and role\n * - Configurable budget alerts\n */\n\nimport type { ProviderName, ModelRole, ITokenUsage, ICostConfig } from \"../types/index.js\";\nimport { createTokenUsage, formatCost } from \"../utils/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { getEventBus } from \"./event-bus.js\";\n\ninterface ICostEntry {\n readonly provider: ProviderName;\n readonly model: string;\n readonly role?: ModelRole | undefined;\n readonly usage: ITokenUsage;\n readonly timestamp: Date;\n}\n\ninterface ICostBreakdown {\n readonly byProvider: Record<string, number>;\n readonly byModel: Record<string, number>;\n readonly byRole: Record<string, number>;\n}\n\nexport class CostTracker {\n private readonly entries: ICostEntry[] = [];\n private readonly budgetConfig: ICostConfig;\n private warningEmitted = false;\n\n constructor(budgetConfig: ICostConfig) {\n this.budgetConfig = budgetConfig;\n }\n\n /**\n * Record a cost entry from a model response.\n */\n record(\n provider: ProviderName,\n model: string,\n inputTokens: number,\n outputTokens: number,\n role?: ModelRole,\n ): ITokenUsage {\n const usage = createTokenUsage(model, inputTokens, outputTokens);\n\n const entry: ICostEntry = {\n provider,\n model,\n role,\n usage,\n timestamp: new Date(),\n };\n\n this.entries.push(entry);\n\n const total = this.getSessionTotal();\n const eventBus = getEventBus();\n\n eventBus.emit(\"cost:updated\", {\n total,\n provider,\n delta: usage.costUsd,\n });\n\n // Budget warning\n if (total >= this.budgetConfig.budgetWarning && !this.warningEmitted) {\n this.warningEmitted = true;\n eventBus.emit(\"cost:warning\", {\n current: total,\n limit: this.budgetConfig.budgetWarning,\n });\n logger.warn(\n { current: formatCost(total), warning: formatCost(this.budgetConfig.budgetWarning) },\n \"Budget warning threshold reached\",\n );\n }\n\n // Budget hard stop\n if (total >= this.budgetConfig.budgetHardStop) {\n eventBus.emit(\"cost:exceeded\", {\n current: total,\n limit: this.budgetConfig.budgetHardStop,\n });\n logger.error(\n { current: formatCost(total), limit: formatCost(this.budgetConfig.budgetHardStop) },\n \"Budget hard stop reached\",\n );\n }\n\n return usage;\n }\n\n /**\n * Get total session cost.\n */\n getSessionTotal(): number {\n return this.entries.reduce((sum, entry) => sum + entry.usage.costUsd, 0);\n }\n\n /**\n * Get total token counts.\n */\n getSessionTokens(): { input: number; output: number; total: number } {\n const input = this.entries.reduce((sum, e) => sum + e.usage.inputTokens, 0);\n const output = this.entries.reduce((sum, e) => sum + e.usage.outputTokens, 0);\n return { input, output, total: input + output };\n }\n\n /**\n * Get cost breakdown by provider, model, and role.\n */\n getBreakdown(): ICostBreakdown {\n const byProvider: Record<string, number> = {};\n const byModel: Record<string, number> = {};\n const byRole: Record<string, number> = {};\n\n for (const entry of this.entries) {\n byProvider[entry.provider] = (byProvider[entry.provider] ?? 0) + entry.usage.costUsd;\n byModel[entry.model] = (byModel[entry.model] ?? 0) + entry.usage.costUsd;\n if (entry.role) {\n byRole[entry.role] = (byRole[entry.role] ?? 0) + entry.usage.costUsd;\n }\n }\n\n return { byProvider, byModel, byRole };\n }\n\n /**\n * Check if budget hard stop has been exceeded.\n */\n isBudgetExceeded(): boolean {\n return this.getSessionTotal() >= this.budgetConfig.budgetHardStop;\n }\n\n /**\n * Get formatted session summary.\n */\n getSummary(): string {\n const total = this.getSessionTotal();\n const tokens = this.getSessionTokens();\n return `${formatCost(total)} (${tokens.total.toLocaleString()} tokens)`;\n }\n\n /**\n * Get all cost entries (for export).\n */\n getEntries(): readonly ICostEntry[] {\n return this.entries;\n }\n\n /**\n * Reset cost tracking for a new session.\n */\n reset(): void {\n this.entries.length = 0;\n this.warningEmitted = false;\n }\n}\n","/**\n * Tool permission management per PRD section 14.4\n * Permission modes: strict, standard, permissive\n */\n\nimport type { PermissionMode, ToolCategory } from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { isCommandBlocked } from \"../utils/index.js\";\n\n// Commands that ALWAYS require confirmation regardless of mode\nconst DANGEROUS_COMMANDS = [\n \"rm -rf\",\n \"git push --force\",\n \"git reset --hard\",\n \"git checkout .\",\n \"git clean -f\",\n \"git branch -D\",\n \"drop table\",\n \"drop database\",\n \"truncate\",\n \"format c:\",\n \"del /f /s /q\",\n] as const;\n\nexport interface IPermissionRequest {\n readonly toolName: string;\n readonly category: ToolCategory;\n readonly operation: string;\n readonly resource?: string;\n readonly command?: string;\n}\n\nexport interface IPermissionResult {\n readonly allowed: boolean;\n readonly reason?: string;\n readonly requiresUserApproval: boolean;\n}\n\nexport class PermissionManager {\n private mode: PermissionMode;\n private readonly allowedPaths: readonly string[];\n private readonly blockedCommands: readonly string[];\n private readonly approvedOperations = new Set<string>();\n\n constructor(\n mode: PermissionMode,\n allowedPaths: readonly string[],\n blockedCommands: readonly string[],\n ) {\n this.mode = mode;\n this.allowedPaths = allowedPaths;\n this.blockedCommands = blockedCommands;\n }\n\n /**\n * Check if an operation is permitted.\n */\n check(request: IPermissionRequest): IPermissionResult {\n // Always-blocked operations\n if (request.command && this.isDangerousCommand(request.command)) {\n return {\n allowed: false,\n reason: `Dangerous command detected: \"${request.command}\"`,\n requiresUserApproval: true,\n };\n }\n\n // Check against blocked commands list\n if (request.command && isCommandBlocked(request.command, this.blockedCommands)) {\n return {\n allowed: false,\n reason: `Command is on the blocked list`,\n requiresUserApproval: true,\n };\n }\n\n // Previously approved operations\n const opKey = this.getOperationKey(request);\n if (this.approvedOperations.has(opKey)) {\n return { allowed: true, requiresUserApproval: false };\n }\n\n // Mode-based permissions\n switch (this.mode) {\n case \"permissive\":\n return { allowed: true, requiresUserApproval: false };\n\n case \"standard\":\n return this.checkStandardMode(request);\n\n case \"strict\":\n return this.checkStrictMode(request);\n }\n }\n\n /**\n * Record that the user has approved an operation.\n */\n approve(request: IPermissionRequest): void {\n const opKey = this.getOperationKey(request);\n this.approvedOperations.add(opKey);\n logger.info({ operation: opKey }, \"Operation approved by user\");\n }\n\n /**\n * Update permission mode.\n */\n setMode(mode: PermissionMode): void {\n this.mode = mode;\n this.approvedOperations.clear();\n logger.info({ mode }, \"Permission mode changed\");\n }\n\n /**\n * Get current mode.\n */\n getMode(): PermissionMode {\n return this.mode;\n }\n\n private checkStandardMode(request: IPermissionRequest): IPermissionResult {\n // Read operations auto-approved in standard mode\n if (this.isReadOperation(request)) {\n return { allowed: true, requiresUserApproval: false };\n }\n\n // Write and shell operations require approval\n return {\n allowed: false,\n reason: `${request.operation} requires approval in standard mode`,\n requiresUserApproval: true,\n };\n }\n\n private checkStrictMode(request: IPermissionRequest): IPermissionResult {\n // Everything requires approval in strict mode\n return {\n allowed: false,\n reason: `${request.operation} requires approval in strict mode`,\n requiresUserApproval: true,\n };\n }\n\n private isReadOperation(request: IPermissionRequest): boolean {\n const readTools = [\"read\", \"glob\", \"grep\", \"web-search\", \"web-fetch\"];\n return readTools.includes(request.toolName);\n }\n\n private isDangerousCommand(command: string): boolean {\n const lower = command.toLowerCase().trim();\n return DANGEROUS_COMMANDS.some((dangerous) => lower.includes(dangerous));\n }\n\n private getOperationKey(request: IPermissionRequest): string {\n return `${request.toolName}:${request.operation}:${request.resource ?? \"\"}`;\n }\n}\n","/**\n * Agent team task coordination per PRD section 8\n * Manages task creation, assignment, dependency resolution, and completion tracking.\n */\n\nimport type { ITask, TaskStatus, ModelRole } from \"../types/index.js\";\nimport { logger } from \"../utils/index.js\";\nimport { getEventBus } from \"./event-bus.js\";\n\nlet nextTaskId = 1;\n\nfunction generateTaskId(): string {\n return String(nextTaskId++);\n}\n\nexport class TaskOrchestrator {\n private readonly tasks = new Map<string, ITask>();\n\n /**\n * Create a new task.\n */\n createTask(\n subject: string,\n description: string,\n options?: {\n owner?: string;\n model?: string;\n role?: ModelRole;\n blockedBy?: string[];\n },\n ): ITask {\n const id = generateTaskId();\n const now = new Date();\n\n const task: ITask = {\n id,\n subject,\n description,\n status: \"pending\",\n owner: options?.owner,\n model: options?.model,\n role: options?.role,\n blocks: [],\n blockedBy: options?.blockedBy ? [...options.blockedBy] : [],\n createdAt: now,\n updatedAt: now,\n };\n\n this.tasks.set(id, task);\n\n // Set up reverse blocking relationships\n if (options?.blockedBy) {\n for (const blockerId of options.blockedBy) {\n const blocker = this.tasks.get(blockerId);\n if (blocker && !blocker.blocks.includes(id)) {\n blocker.blocks.push(id);\n }\n }\n }\n\n getEventBus().emit(\"task:created\", { taskId: id, subject });\n logger.info({ taskId: id, subject }, \"Task created\");\n\n return task;\n }\n\n /**\n * Update task status.\n */\n updateStatus(taskId: string, status: TaskStatus): void {\n const task = this.getTask(taskId);\n task.status = status;\n task.updatedAt = new Date();\n\n getEventBus().emit(\"task:updated\", { taskId, status });\n\n if (status === \"completed\") {\n getEventBus().emit(\"task:completed\", { taskId });\n this.resolveBlockedTasks(taskId);\n }\n\n logger.info({ taskId, status }, \"Task status updated\");\n }\n\n /**\n * Assign a task to an agent.\n */\n assignTask(taskId: string, owner: string, model?: string): void {\n const task = this.getTask(taskId);\n task.owner = owner;\n if (model) {\n (task as { model?: string }).model = model;\n }\n task.updatedAt = new Date();\n logger.info({ taskId, owner, model }, \"Task assigned\");\n }\n\n /**\n * Get a task by ID. Throws if not found.\n */\n getTask(taskId: string): ITask {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n return task;\n }\n\n /**\n * Get all tasks.\n */\n getAllTasks(): readonly ITask[] {\n return [...this.tasks.values()];\n }\n\n /**\n * Get tasks by status.\n */\n getTasksByStatus(status: TaskStatus): readonly ITask[] {\n return [...this.tasks.values()].filter((t) => t.status === status);\n }\n\n /**\n * Get tasks assigned to an agent.\n */\n getTasksByOwner(owner: string): readonly ITask[] {\n return [...this.tasks.values()].filter((t) => t.owner === owner);\n }\n\n /**\n * Get tasks that are ready to be worked on (pending, not blocked).\n */\n getAvailableTasks(): readonly ITask[] {\n return [...this.tasks.values()].filter(\n (t) =>\n t.status === \"pending\" &&\n !t.owner &&\n t.blockedBy.every((blockerId) => {\n const blocker = this.tasks.get(blockerId);\n return blocker?.status === \"completed\";\n }),\n );\n }\n\n /**\n * Check if all tasks are completed.\n */\n isAllComplete(): boolean {\n return [...this.tasks.values()].every((t) => t.status === \"completed\");\n }\n\n /**\n * Get progress summary.\n */\n getProgress(): { total: number; completed: number; inProgress: number; pending: number; blocked: number } {\n const tasks = [...this.tasks.values()];\n return {\n total: tasks.length,\n completed: tasks.filter((t) => t.status === \"completed\").length,\n inProgress: tasks.filter((t) => t.status === \"in_progress\").length,\n pending: tasks.filter((t) => t.status === \"pending\").length,\n blocked: tasks.filter((t) => t.status === \"blocked\").length,\n };\n }\n\n /**\n * Delete a task.\n */\n deleteTask(taskId: string): void {\n const task = this.tasks.get(taskId);\n if (task) {\n // Remove from blockedBy references\n for (const [, otherTask] of this.tasks) {\n otherTask.blockedBy = otherTask.blockedBy.filter((id) => id !== taskId);\n otherTask.blocks = otherTask.blocks.filter((id) => id !== taskId);\n }\n this.tasks.delete(taskId);\n }\n }\n\n /**\n * When a task completes, check if any blocked tasks can now proceed.\n */\n private resolveBlockedTasks(completedTaskId: string): void {\n for (const [, task] of this.tasks) {\n if (task.status === \"blocked\" || task.status === \"pending\") {\n const allDepsComplete = task.blockedBy.every((depId) => {\n const dep = this.tasks.get(depId);\n return dep?.status === \"completed\";\n });\n\n if (allDepsComplete && task.status === \"blocked\") {\n task.status = \"pending\";\n task.updatedAt = new Date();\n logger.info(\n { taskId: task.id, unblockedBy: completedTaskId },\n \"Task unblocked\",\n );\n }\n }\n }\n }\n}\n"]}
@@ -0,0 +1,88 @@
1
+ import { SessionManager } from './chunk-7EBLXPL4.js';
2
+ import { ApiKeyFallback } from './chunk-HESQLCLU.js';
3
+
4
+ // src/auth/auth-status.ts
5
+ var LOGIN_PROVIDERS = ["claude", "codex", "gemini", "kimi"];
6
+ var PROVIDER_MODEL_SWITCH = {
7
+ claude: { provider: "anthropic", model: "claude-sonnet-4-6" },
8
+ codex: { provider: "openai", model: "gpt-5.2" },
9
+ gemini: { provider: "google", model: "gemini-2.5-pro" },
10
+ kimi: { provider: "kimi", model: "kimi-for-coding" }
11
+ };
12
+ function formatAuthMethodLabel(method) {
13
+ switch (method) {
14
+ case "native_login":
15
+ return "CLI login";
16
+ case "api_key":
17
+ return "API key";
18
+ case "env_variable":
19
+ return "env var";
20
+ case "credential_helper":
21
+ return "credential helper";
22
+ default:
23
+ return "configured";
24
+ }
25
+ }
26
+ function formatCompactLoginState(email, plan) {
27
+ if (email !== void 0 && plan !== void 0) {
28
+ return `Logged in as ${email} (${plan})`;
29
+ }
30
+ if (email !== void 0) {
31
+ return `Logged in as ${email}`;
32
+ }
33
+ if (plan !== void 0) {
34
+ return `Logged in (${plan})`;
35
+ }
36
+ return "Logged in";
37
+ }
38
+ async function getAuthStatusRecord(provider) {
39
+ const providerName = PROVIDER_MODEL_SWITCH[provider].provider;
40
+ const sessionManager = new SessionManager();
41
+ const fallback = new ApiKeyFallback();
42
+ const activeCredential = await sessionManager.getActiveCredential(providerName).catch(() => void 0);
43
+ const storedApiKey = await fallback.getCredential(providerName);
44
+ const envCredential = fallback.getFromEnvironment(providerName);
45
+ const launchCredential = storedApiKey ?? envCredential;
46
+ let email;
47
+ let plan;
48
+ if (activeCredential?.method === "native_login") {
49
+ const status = await sessionManager.getStatus(providerName);
50
+ email = status.email;
51
+ plan = status.plan;
52
+ }
53
+ const launchReady = activeCredential !== void 0 || launchCredential !== void 0;
54
+ const launchMethod = launchCredential?.method ?? activeCredential?.method;
55
+ return {
56
+ provider,
57
+ loggedIn: activeCredential !== void 0,
58
+ ...activeCredential?.method !== void 0 ? { authMethod: activeCredential.method } : {},
59
+ ...email !== void 0 ? { email } : {},
60
+ ...plan !== void 0 ? { plan } : {},
61
+ launchReady,
62
+ ...launchMethod !== void 0 ? { launchMethod } : {}
63
+ };
64
+ }
65
+ async function getAuthStatusRecords() {
66
+ return Promise.all(LOGIN_PROVIDERS.map(async (provider) => getAuthStatusRecord(provider)));
67
+ }
68
+ function formatDetailedAuthStatusLine(record) {
69
+ if (!record.loggedIn) {
70
+ return ` \u2717 ${record.provider} \u2014 Not logged in`;
71
+ }
72
+ const identity = record.email !== void 0 ? ` as ${record.email}${record.plan !== void 0 ? ` (${record.plan})` : ""}` : record.plan !== void 0 ? ` (${record.plan})` : "";
73
+ const launchStatus = record.launchReady ? `swarm-ready via ${formatAuthMethodLabel(record.launchMethod)}` : "not authenticated \u2014 run `aemeathcli auth login` or set an API key";
74
+ return ` \u2713 ${record.provider} \u2014 ${formatAuthMethodLabel(record.authMethod)}${identity}; ${launchStatus}`;
75
+ }
76
+ function formatCompactAuthStatusLine(record) {
77
+ if (!record.loggedIn) {
78
+ return ` \u2717 ${record.provider} \u2014 Not logged in`;
79
+ }
80
+ if (record.authMethod === "native_login" || record.authMethod === void 0) {
81
+ return ` \u2713 ${record.provider} \u2014 ${formatCompactLoginState(record.email, record.plan)}`;
82
+ }
83
+ return ` \u2713 ${record.provider} \u2014 Configured via ${formatAuthMethodLabel(record.authMethod)}`;
84
+ }
85
+
86
+ export { LOGIN_PROVIDERS, formatCompactAuthStatusLine, formatDetailedAuthStatusLine, getAuthStatusRecord, getAuthStatusRecords };
87
+ //# sourceMappingURL=chunk-36RXCZOV.js.map
88
+ //# sourceMappingURL=chunk-36RXCZOV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/auth-status.ts"],"names":[],"mappings":"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","file":"chunk-36RXCZOV.js","sourcesContent":["import { ApiKeyFallback } from \"./api-key-fallback.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport type { AuthMethod, ProviderName } from \"../types/index.js\";\n\nexport const LOGIN_PROVIDERS = [\"claude\", \"codex\", \"gemini\", \"kimi\"] as const;\nexport type LoginProvider = (typeof LOGIN_PROVIDERS)[number];\n\nexport interface IAuthStatusRecord {\n readonly provider: LoginProvider;\n readonly loggedIn: boolean;\n readonly authMethod?: AuthMethod;\n readonly email?: string;\n readonly plan?: string;\n readonly launchReady: boolean;\n readonly launchMethod?: AuthMethod;\n}\n\nconst PROVIDER_MODEL_SWITCH: Readonly<Record<LoginProvider, { provider: ProviderName; model: string }>> = {\n claude: { provider: \"anthropic\", model: \"claude-sonnet-4-6\" },\n codex: { provider: \"openai\", model: \"gpt-5.2\" },\n gemini: { provider: \"google\", model: \"gemini-2.5-pro\" },\n kimi: { provider: \"kimi\", model: \"kimi-for-coding\" },\n};\n\nfunction formatAuthMethodLabel(method?: AuthMethod): string {\n switch (method) {\n case \"native_login\":\n return \"CLI login\";\n case \"api_key\":\n return \"API key\";\n case \"env_variable\":\n return \"env var\";\n case \"credential_helper\":\n return \"credential helper\";\n default:\n return \"configured\";\n }\n}\n\nfunction formatCompactLoginState(email?: string, plan?: string): string {\n if (email !== undefined && plan !== undefined) {\n return `Logged in as ${email} (${plan})`;\n }\n\n if (email !== undefined) {\n return `Logged in as ${email}`;\n }\n\n if (plan !== undefined) {\n return `Logged in (${plan})`;\n }\n\n return \"Logged in\";\n}\n\nexport async function getAuthStatusRecord(provider: LoginProvider): Promise<IAuthStatusRecord> {\n const providerName = PROVIDER_MODEL_SWITCH[provider].provider;\n const sessionManager = new SessionManager();\n const fallback = new ApiKeyFallback();\n const activeCredential = await sessionManager.getActiveCredential(providerName).catch(() => undefined);\n const storedApiKey = await fallback.getCredential(providerName);\n const envCredential = fallback.getFromEnvironment(providerName);\n const launchCredential = storedApiKey ?? envCredential;\n\n let email: string | undefined;\n let plan: string | undefined;\n if (activeCredential?.method === \"native_login\") {\n const status = await sessionManager.getStatus(providerName);\n email = status.email;\n plan = status.plan;\n }\n\n // Swarm mode is ready if ANY credential exists — native CLI login (OAuth)\n // is sufficient because the native CLI adapters shell out to the provider's\n // own CLI (claude, codex, gemini, kimi) which already holds the session.\n const launchReady = activeCredential !== undefined || launchCredential !== undefined;\n const launchMethod = launchCredential?.method ?? activeCredential?.method;\n\n return {\n provider,\n loggedIn: activeCredential !== undefined,\n ...(activeCredential?.method !== undefined ? { authMethod: activeCredential.method } : {}),\n ...(email !== undefined ? { email } : {}),\n ...(plan !== undefined ? { plan } : {}),\n launchReady,\n ...(launchMethod !== undefined ? { launchMethod } : {}),\n };\n}\n\nexport async function getAuthStatusRecords(): Promise<readonly IAuthStatusRecord[]> {\n return Promise.all(LOGIN_PROVIDERS.map(async (provider) => getAuthStatusRecord(provider)));\n}\n\nexport function formatDetailedAuthStatusLine(record: IAuthStatusRecord): string {\n if (!record.loggedIn) {\n return ` ✗ ${record.provider} — Not logged in`;\n }\n\n const identity =\n record.email !== undefined\n ? ` as ${record.email}${record.plan !== undefined ? ` (${record.plan})` : \"\"}`\n : record.plan !== undefined\n ? ` (${record.plan})`\n : \"\";\n const launchStatus = record.launchReady\n ? `swarm-ready via ${formatAuthMethodLabel(record.launchMethod)}`\n : \"not authenticated — run `aemeathcli auth login` or set an API key\";\n\n return ` ✓ ${record.provider} — ${formatAuthMethodLabel(record.authMethod)}${identity}; ${launchStatus}`;\n}\n\nexport function formatCompactAuthStatusLine(record: IAuthStatusRecord): string {\n if (!record.loggedIn) {\n return ` ✗ ${record.provider} — Not logged in`;\n }\n\n if (record.authMethod === \"native_login\" || record.authMethod === undefined) {\n return ` ✓ ${record.provider} — ${formatCompactLoginState(record.email, record.plan)}`;\n }\n\n return ` ✓ ${record.provider} — Configured via ${formatAuthMethodLabel(record.authMethod)}`;\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { ApiKeyFallback } from './chunk-I5PZ4JTS.js';
2
- import { CredentialStore } from './chunk-4IJD72YB.js';
1
+ import { ApiKeyFallback } from './chunk-HESQLCLU.js';
2
+ import { CredentialStore } from './chunk-SNWPI6XJ.js';
3
3
  import { AuthenticationError } from './chunk-ZGOHARPV.js';
4
- import { logger } from './chunk-JAXXTYID.js';
4
+ import { logger } from './chunk-IR5HLBMH.js';
5
5
 
6
6
  // src/auth/session-manager.ts
7
7
  var SessionManager = class {
@@ -124,19 +124,19 @@ var SessionManager = class {
124
124
  try {
125
125
  switch (provider) {
126
126
  case "anthropic": {
127
- const mod = await import('./claude-login-5WELXPKT.js');
127
+ const mod = await import('./claude-login-AIFIWTYF.js');
128
128
  return new mod.ClaudeLogin(this.credentialStore);
129
129
  }
130
130
  case "openai": {
131
- const mod = await import('./codex-login-GZIFXUWD.js');
131
+ const mod = await import('./codex-login-LW5X7GAM.js');
132
132
  return new mod.CodexLogin(this.credentialStore);
133
133
  }
134
134
  case "google": {
135
- const mod = await import('./gemini-login-AZGL3CE7.js');
135
+ const mod = await import('./gemini-login-TST454MX.js');
136
136
  return new mod.GeminiLogin(this.credentialStore);
137
137
  }
138
138
  case "kimi": {
139
- const mod = await import('./kimi-login-6LUWB7P6.js');
139
+ const mod = await import('./kimi-login-3IGVOBJI.js');
140
140
  return new mod.KimiLogin(this.credentialStore);
141
141
  }
142
142
  default:
@@ -177,5 +177,5 @@ var SessionManager = class {
177
177
  };
178
178
 
179
179
  export { SessionManager };
180
- //# sourceMappingURL=chunk-DMBPX3RG.js.map
181
- //# sourceMappingURL=chunk-DMBPX3RG.js.map
180
+ //# sourceMappingURL=chunk-7EBLXPL4.js.map
181
+ //# sourceMappingURL=chunk-7EBLXPL4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth/session-manager.ts"],"names":[],"mappings":"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","file":"chunk-DMBPX3RG.js","sourcesContent":["/**\n * Multi-provider session lifecycle per PRD section 13.5\n * Resolution priority: native login (CLI delegation) > API key > env variable > credential helper\n *\n * Credentials are obtained by delegating to official CLI tools:\n * - Claude Code CLI → macOS Keychain\n * - Codex CLI → ~/.codex/auth.json\n * - Gemini CLI → ~/.gemini/oauth_creds.json\n * - Kimi CLI → ~/.kimi/credentials/kimi-code.json\n */\n\nimport type { ProviderName, ICredential, AuthMethod } from \"../types/index.js\";\nimport { AuthenticationError } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { ApiKeyFallback } from \"./api-key-fallback.js\";\nimport { logger } from \"../utils/index.js\";\n\nexport class SessionManager {\n private readonly credentialStore: CredentialStore;\n private readonly apiKeyFallback: ApiKeyFallback;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n this.apiKeyFallback = new ApiKeyFallback(this.credentialStore);\n }\n\n /**\n * Get the best available credential for a provider.\n * Follows resolution priority from PRD section 13.5.\n */\n async getActiveCredential(provider: ProviderName): Promise<ICredential> {\n // 1. Native account session (delegated CLI login — stored in our credential store)\n const nativeCredential = await this.credentialStore.get(provider);\n if (nativeCredential && nativeCredential.method === \"native_login\" && !this.isExpired(nativeCredential)) {\n return nativeCredential;\n }\n\n // 1b. If expired, try re-reading from the official CLI's cached tokens\n if (nativeCredential && nativeCredential.method === \"native_login\" && this.isExpired(nativeCredential)) {\n const refreshed = await this.refreshFromCliCache(provider);\n if (refreshed) {\n return refreshed;\n }\n }\n\n // 1c. Even if no native credential stored, check CLI caches directly\n if (!nativeCredential || nativeCredential.method !== \"native_login\") {\n const fromCli = await this.refreshFromCliCache(provider);\n if (fromCli) {\n return fromCli;\n }\n }\n\n // 2. API key set via auth set-key\n const apiKeyCredential = await this.apiKeyFallback.getCredential(provider);\n if (apiKeyCredential) {\n return apiKeyCredential;\n }\n\n // 3. Environment variable\n const envCredential = this.getFromEnvironment(provider);\n if (envCredential) {\n return envCredential;\n }\n\n throw new AuthenticationError(provider, `No credentials found for ${provider}`);\n }\n\n /**\n * Check if a provider has any available credential.\n */\n async isAuthenticated(provider: ProviderName): Promise<boolean> {\n try {\n await this.getActiveCredential(provider);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get status info for a provider.\n */\n async getStatus(provider: ProviderName): Promise<{\n loggedIn: boolean;\n method?: AuthMethod | undefined;\n email?: string | undefined;\n plan?: string | undefined;\n }> {\n try {\n const credential = await this.getActiveCredential(provider);\n return {\n loggedIn: true,\n method: credential.method,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\n };\n } catch {\n return { loggedIn: false };\n }\n }\n\n /**\n * Get the API key or token string for a provider.\n */\n async getToken(provider: ProviderName): Promise<string> {\n const credential = await this.getActiveCredential(provider);\n if (!credential.token) {\n throw new AuthenticationError(provider, \"Credential has no token\");\n }\n return credential.token;\n }\n\n /**\n * Re-read tokens from the official CLI's cached storage.\n * This is the \"refresh\" mechanism — instead of doing HTTP refresh ourselves,\n * we re-read from the CLI tool's cache which may have been refreshed by the CLI.\n */\n private async refreshFromCliCache(provider: ProviderName): Promise<ICredential | undefined> {\n try {\n const loginModule = await this.loadLoginModule(provider);\n if (!loginModule) {\n return undefined;\n }\n\n // Prefer direct cached credential extraction from the provider login module.\n if (typeof loginModule.getCachedCredential === \"function\") {\n const cached = await loginModule.getCachedCredential();\n if (cached) {\n await this.credentialStore.set(provider, cached);\n if (!this.isExpired(cached) || cached.refreshToken !== undefined) {\n logger.info({ provider }, \"Loaded credentials from provider CLI cache\");\n return cached;\n }\n }\n }\n\n const status = await loginModule.getStatus();\n if (!status.loggedIn) {\n return undefined;\n }\n\n // The login module reads from the CLI's cache, check if we can get a fresh credential\n const isStillLoggedIn = await loginModule.isLoggedIn();\n if (!isStillLoggedIn) {\n return undefined;\n }\n\n // Re-read by checking the stored credential in our store\n // The login modules update the credential store when they find valid tokens\n const credential = await this.credentialStore.get(provider);\n if (credential && !this.isExpired(credential)) {\n logger.info({ provider }, \"Refreshed credentials from CLI cache\");\n return credential;\n }\n\n return undefined;\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.debug({ provider, error: msg }, \"Failed to refresh from CLI cache\");\n return undefined;\n }\n }\n\n private async loadLoginModule(provider: ProviderName): Promise<{\n getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }>;\n isLoggedIn(): Promise<boolean>;\n getCachedCredential?(): Promise<ICredential | undefined>;\n } | undefined> {\n try {\n switch (provider) {\n case \"anthropic\": {\n const mod = await import(\"./providers/claude-login.js\");\n return new mod.ClaudeLogin(this.credentialStore);\n }\n case \"openai\": {\n const mod = await import(\"./providers/codex-login.js\");\n return new mod.CodexLogin(this.credentialStore);\n }\n case \"google\": {\n const mod = await import(\"./providers/gemini-login.js\");\n return new mod.GeminiLogin(this.credentialStore);\n }\n case \"kimi\": {\n const mod = await import(\"./providers/kimi-login.js\");\n return new mod.KimiLogin(this.credentialStore);\n }\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n private isExpired(credential: ICredential): boolean {\n if (!credential.expiresAt) {\n return false;\n }\n return new Date() > credential.expiresAt;\n }\n\n private getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envMap: Record<ProviderName, string> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: \"\",\n };\n\n const envKey = envMap[provider];\n if (!envKey) {\n return undefined;\n }\n\n const token = process.env[envKey];\n if (!token) {\n return undefined;\n }\n\n return {\n provider,\n method: \"env_variable\",\n token,\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth/session-manager.ts"],"names":[],"mappings":"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","file":"chunk-7EBLXPL4.js","sourcesContent":["/**\n * Multi-provider session lifecycle per PRD section 13.5\n * Resolution priority: native login (CLI delegation) > API key > env variable > credential helper\n *\n * Credentials are obtained by delegating to official CLI tools:\n * - Claude Code CLI → macOS Keychain\n * - Codex CLI → ~/.codex/auth.json\n * - Gemini CLI → ~/.gemini/oauth_creds.json\n * - Kimi CLI → ~/.kimi/credentials/kimi-code.json\n */\n\nimport type { ProviderName, ICredential, AuthMethod } from \"../types/index.js\";\nimport { AuthenticationError } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { ApiKeyFallback } from \"./api-key-fallback.js\";\nimport { logger } from \"../utils/index.js\";\n\nexport class SessionManager {\n private readonly credentialStore: CredentialStore;\n private readonly apiKeyFallback: ApiKeyFallback;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n this.apiKeyFallback = new ApiKeyFallback(this.credentialStore);\n }\n\n /**\n * Get the best available credential for a provider.\n * Follows resolution priority from PRD section 13.5.\n */\n async getActiveCredential(provider: ProviderName): Promise<ICredential> {\n // 1. Native account session (delegated CLI login — stored in our credential store)\n const nativeCredential = await this.credentialStore.get(provider);\n if (nativeCredential && nativeCredential.method === \"native_login\" && !this.isExpired(nativeCredential)) {\n return nativeCredential;\n }\n\n // 1b. If expired, try re-reading from the official CLI's cached tokens\n if (nativeCredential && nativeCredential.method === \"native_login\" && this.isExpired(nativeCredential)) {\n const refreshed = await this.refreshFromCliCache(provider);\n if (refreshed) {\n return refreshed;\n }\n }\n\n // 1c. Even if no native credential stored, check CLI caches directly\n if (!nativeCredential || nativeCredential.method !== \"native_login\") {\n const fromCli = await this.refreshFromCliCache(provider);\n if (fromCli) {\n return fromCli;\n }\n }\n\n // 2. API key set via auth set-key\n const apiKeyCredential = await this.apiKeyFallback.getCredential(provider);\n if (apiKeyCredential) {\n return apiKeyCredential;\n }\n\n // 3. Environment variable\n const envCredential = this.getFromEnvironment(provider);\n if (envCredential) {\n return envCredential;\n }\n\n throw new AuthenticationError(provider, `No credentials found for ${provider}`);\n }\n\n /**\n * Check if a provider has any available credential.\n */\n async isAuthenticated(provider: ProviderName): Promise<boolean> {\n try {\n await this.getActiveCredential(provider);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get status info for a provider.\n */\n async getStatus(provider: ProviderName): Promise<{\n loggedIn: boolean;\n method?: AuthMethod | undefined;\n email?: string | undefined;\n plan?: string | undefined;\n }> {\n try {\n const credential = await this.getActiveCredential(provider);\n return {\n loggedIn: true,\n method: credential.method,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\n };\n } catch {\n return { loggedIn: false };\n }\n }\n\n /**\n * Get the API key or token string for a provider.\n */\n async getToken(provider: ProviderName): Promise<string> {\n const credential = await this.getActiveCredential(provider);\n if (!credential.token) {\n throw new AuthenticationError(provider, \"Credential has no token\");\n }\n return credential.token;\n }\n\n /**\n * Re-read tokens from the official CLI's cached storage.\n * This is the \"refresh\" mechanism — instead of doing HTTP refresh ourselves,\n * we re-read from the CLI tool's cache which may have been refreshed by the CLI.\n */\n private async refreshFromCliCache(provider: ProviderName): Promise<ICredential | undefined> {\n try {\n const loginModule = await this.loadLoginModule(provider);\n if (!loginModule) {\n return undefined;\n }\n\n // Prefer direct cached credential extraction from the provider login module.\n if (typeof loginModule.getCachedCredential === \"function\") {\n const cached = await loginModule.getCachedCredential();\n if (cached) {\n await this.credentialStore.set(provider, cached);\n if (!this.isExpired(cached) || cached.refreshToken !== undefined) {\n logger.info({ provider }, \"Loaded credentials from provider CLI cache\");\n return cached;\n }\n }\n }\n\n const status = await loginModule.getStatus();\n if (!status.loggedIn) {\n return undefined;\n }\n\n // The login module reads from the CLI's cache, check if we can get a fresh credential\n const isStillLoggedIn = await loginModule.isLoggedIn();\n if (!isStillLoggedIn) {\n return undefined;\n }\n\n // Re-read by checking the stored credential in our store\n // The login modules update the credential store when they find valid tokens\n const credential = await this.credentialStore.get(provider);\n if (credential && !this.isExpired(credential)) {\n logger.info({ provider }, \"Refreshed credentials from CLI cache\");\n return credential;\n }\n\n return undefined;\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.debug({ provider, error: msg }, \"Failed to refresh from CLI cache\");\n return undefined;\n }\n }\n\n private async loadLoginModule(provider: ProviderName): Promise<{\n getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }>;\n isLoggedIn(): Promise<boolean>;\n getCachedCredential?(): Promise<ICredential | undefined>;\n } | undefined> {\n try {\n switch (provider) {\n case \"anthropic\": {\n const mod = await import(\"./providers/claude-login.js\");\n return new mod.ClaudeLogin(this.credentialStore);\n }\n case \"openai\": {\n const mod = await import(\"./providers/codex-login.js\");\n return new mod.CodexLogin(this.credentialStore);\n }\n case \"google\": {\n const mod = await import(\"./providers/gemini-login.js\");\n return new mod.GeminiLogin(this.credentialStore);\n }\n case \"kimi\": {\n const mod = await import(\"./providers/kimi-login.js\");\n return new mod.KimiLogin(this.credentialStore);\n }\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n private isExpired(credential: ICredential): boolean {\n if (!credential.expiresAt) {\n return false;\n }\n return new Date() > credential.expiresAt;\n }\n\n private getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envMap: Record<ProviderName, string> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: \"\",\n };\n\n const envKey = envMap[provider];\n if (!envKey) {\n return undefined;\n }\n\n const token = process.env[envKey];\n if (!token) {\n return undefined;\n }\n\n return {\n provider,\n method: \"env_variable\",\n token,\n };\n }\n}\n"]}
@@ -0,0 +1,186 @@
1
+ import { logger } from './chunk-IR5HLBMH.js';
2
+ import { getDatabasePath, ensureDirectory, getDatabaseDir } from './chunk-D275MCIH.js';
3
+ import Database from 'better-sqlite3';
4
+ import { chmodSync } from 'fs';
5
+
6
+ // src/storage/migrations/001-initial.ts
7
+ var CREATE_CONVERSATIONS = `
8
+ CREATE TABLE IF NOT EXISTS conversations (
9
+ id TEXT PRIMARY KEY,
10
+ project_root TEXT NOT NULL,
11
+ default_model TEXT,
12
+ created_at TEXT DEFAULT (datetime('now')),
13
+ updated_at TEXT DEFAULT (datetime('now')),
14
+ metadata TEXT DEFAULT '{}'
15
+ )`;
16
+ var CREATE_MESSAGES = `
17
+ CREATE TABLE IF NOT EXISTS messages (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
20
+ role TEXT NOT NULL,
21
+ model TEXT,
22
+ provider TEXT,
23
+ content TEXT NOT NULL,
24
+ tool_calls TEXT,
25
+ token_usage TEXT,
26
+ created_at TEXT DEFAULT (datetime('now'))
27
+ )`;
28
+ var CREATE_FILE_CONTEXT = `
29
+ CREATE TABLE IF NOT EXISTS file_context (
30
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
31
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
32
+ file_path TEXT NOT NULL,
33
+ content_hash TEXT,
34
+ token_count INTEGER,
35
+ added_at TEXT DEFAULT (datetime('now'))
36
+ )`;
37
+ var CREATE_COST_TRACKING = `
38
+ CREATE TABLE IF NOT EXISTS cost_tracking (
39
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
40
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
41
+ provider TEXT NOT NULL,
42
+ model TEXT NOT NULL,
43
+ role TEXT,
44
+ input_tokens INTEGER,
45
+ output_tokens INTEGER,
46
+ cost_usd REAL,
47
+ created_at TEXT DEFAULT (datetime('now'))
48
+ )`;
49
+ var CREATE_TEAMS = `
50
+ CREATE TABLE IF NOT EXISTS teams (
51
+ id TEXT PRIMARY KEY,
52
+ name TEXT NOT NULL,
53
+ status TEXT DEFAULT 'active',
54
+ config TEXT,
55
+ created_at TEXT DEFAULT (datetime('now'))
56
+ )`;
57
+ var CREATE_INDEXES = [
58
+ "CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id)",
59
+ "CREATE INDEX IF NOT EXISTS idx_cost_conversation ON cost_tracking(conversation_id)",
60
+ "CREATE INDEX IF NOT EXISTS idx_cost_provider ON cost_tracking(provider)",
61
+ "CREATE INDEX IF NOT EXISTS idx_file_context_conversation ON file_context(conversation_id)"
62
+ ];
63
+ function up(db) {
64
+ db.transaction(() => {
65
+ db.exec(CREATE_CONVERSATIONS);
66
+ db.exec(CREATE_MESSAGES);
67
+ db.exec(CREATE_FILE_CONTEXT);
68
+ db.exec(CREATE_COST_TRACKING);
69
+ db.exec(CREATE_TEAMS);
70
+ for (const sql of CREATE_INDEXES) {
71
+ db.exec(sql);
72
+ }
73
+ })();
74
+ }
75
+
76
+ // src/storage/sqlite-store.ts
77
+ var MIGRATIONS_TABLE_DDL = `
78
+ CREATE TABLE IF NOT EXISTS _migrations (
79
+ id TEXT PRIMARY KEY,
80
+ applied_at TEXT DEFAULT (datetime('now'))
81
+ )`;
82
+ var MIGRATIONS = [
83
+ { id: "001-initial", up }
84
+ ];
85
+ var SqliteStore = class {
86
+ db;
87
+ closed = false;
88
+ get database() {
89
+ if (this.closed || !this.db) {
90
+ throw new Error("SqliteStore is closed or not initialized");
91
+ }
92
+ return this.db;
93
+ }
94
+ open(dbPath) {
95
+ if (this.db) {
96
+ return;
97
+ }
98
+ const resolvedPath = dbPath ?? getDatabasePath();
99
+ ensureDirectory(getDatabaseDir());
100
+ logger.info({ path: resolvedPath }, "Opening SQLite database");
101
+ this.db = new Database(resolvedPath);
102
+ this.db.pragma("journal_mode = WAL");
103
+ this.db.pragma("busy_timeout = 5000");
104
+ this.db.pragma("foreign_keys = ON");
105
+ this.db.pragma("synchronous = NORMAL");
106
+ try {
107
+ chmodSync(resolvedPath, 384);
108
+ } catch {
109
+ logger.warn(
110
+ { path: resolvedPath },
111
+ "Could not set database file permissions to 600"
112
+ );
113
+ }
114
+ this.runMigrations();
115
+ this.registerCleanupHandlers();
116
+ }
117
+ runMigrations() {
118
+ const db = this.database;
119
+ db.exec(MIGRATIONS_TABLE_DDL);
120
+ const appliedStmt = db.prepare(
121
+ "SELECT id FROM _migrations WHERE id = ?"
122
+ );
123
+ const insertStmt = db.prepare(
124
+ "INSERT INTO _migrations (id) VALUES (?)"
125
+ );
126
+ for (const migration of MIGRATIONS) {
127
+ const existing = appliedStmt.get(migration.id);
128
+ if (!existing) {
129
+ logger.info({ migrationId: migration.id }, "Running migration");
130
+ db.transaction(() => {
131
+ migration.up(db);
132
+ insertStmt.run(migration.id);
133
+ })();
134
+ logger.info({ migrationId: migration.id }, "Migration applied");
135
+ }
136
+ }
137
+ }
138
+ prepare(sql) {
139
+ return this.database.prepare(sql);
140
+ }
141
+ run(sql, ...params) {
142
+ return this.database.prepare(sql).run(...params);
143
+ }
144
+ get(sql, ...params) {
145
+ return this.database.prepare(sql).get(...params);
146
+ }
147
+ all(sql, ...params) {
148
+ return this.database.prepare(sql).all(...params);
149
+ }
150
+ transaction(fn) {
151
+ return this.database.transaction(fn)();
152
+ }
153
+ close() {
154
+ if (this.closed || !this.db) {
155
+ return;
156
+ }
157
+ logger.info("Closing SQLite database");
158
+ this.closed = true;
159
+ try {
160
+ this.db.pragma("wal_checkpoint(TRUNCATE)");
161
+ this.db.close();
162
+ } catch (error) {
163
+ const message = error instanceof Error ? error.message : String(error);
164
+ logger.error({ error: message }, "Error closing database");
165
+ }
166
+ this.db = void 0;
167
+ }
168
+ registerCleanupHandlers() {
169
+ const cleanup = () => {
170
+ this.close();
171
+ };
172
+ process.on("exit", cleanup);
173
+ process.on("SIGINT", () => {
174
+ cleanup();
175
+ process.exit(130);
176
+ });
177
+ process.on("SIGTERM", () => {
178
+ cleanup();
179
+ process.exit(143);
180
+ });
181
+ }
182
+ };
183
+
184
+ export { SqliteStore };
185
+ //# sourceMappingURL=chunk-BIMQL4AG.js.map
186
+ //# sourceMappingURL=chunk-BIMQL4AG.js.map