intent-hub 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.turbo/cache/019f5ae385027cb1-meta.json +1 -0
  3. package/.turbo/cache/019f5ae385027cb1.tar.zst +0 -0
  4. package/.turbo/cache/040af6112a552a64-meta.json +1 -0
  5. package/.turbo/cache/040af6112a552a64.tar.zst +0 -0
  6. package/.turbo/cache/11195eac3ca5c6ce-meta.json +1 -0
  7. package/.turbo/cache/11195eac3ca5c6ce.tar.zst +0 -0
  8. package/.turbo/cache/13d11166efdf11cf-meta.json +1 -0
  9. package/.turbo/cache/13d11166efdf11cf.tar.zst +0 -0
  10. package/.turbo/cache/19af1af3b136706c-meta.json +1 -0
  11. package/.turbo/cache/19af1af3b136706c.tar.zst +0 -0
  12. package/.turbo/cache/1d33efac91c05b50-meta.json +1 -0
  13. package/.turbo/cache/1d33efac91c05b50.tar.zst +0 -0
  14. package/.turbo/cache/200b85a612af2d13-meta.json +1 -0
  15. package/.turbo/cache/200b85a612af2d13.tar.zst +0 -0
  16. package/.turbo/cache/210308c9ea929858-meta.json +1 -0
  17. package/.turbo/cache/210308c9ea929858.tar.zst +0 -0
  18. package/.turbo/cache/38df8e44c617835e-meta.json +1 -0
  19. package/.turbo/cache/38df8e44c617835e.tar.zst +0 -0
  20. package/.turbo/cache/3e449de5ef60a7a0-meta.json +1 -0
  21. package/.turbo/cache/3e449de5ef60a7a0.tar.zst +0 -0
  22. package/.turbo/cache/51ff024a97c2b4f5-meta.json +1 -0
  23. package/.turbo/cache/51ff024a97c2b4f5.tar.zst +0 -0
  24. package/.turbo/cache/54bc756eeebb377a-meta.json +1 -0
  25. package/.turbo/cache/54bc756eeebb377a.tar.zst +0 -0
  26. package/.turbo/cache/5ed6a840acafc873-meta.json +1 -0
  27. package/.turbo/cache/5ed6a840acafc873.tar.zst +0 -0
  28. package/.turbo/cache/6702dc24e5ca3c2e-meta.json +1 -0
  29. package/.turbo/cache/6702dc24e5ca3c2e.tar.zst +0 -0
  30. package/.turbo/cache/725c72cf71ea854f-meta.json +1 -0
  31. package/.turbo/cache/725c72cf71ea854f.tar.zst +0 -0
  32. package/.turbo/cache/7344ca28d348037a-meta.json +1 -0
  33. package/.turbo/cache/7344ca28d348037a.tar.zst +0 -0
  34. package/.turbo/cache/748fb444cdc0b78c-meta.json +1 -0
  35. package/.turbo/cache/748fb444cdc0b78c.tar.zst +0 -0
  36. package/.turbo/cache/789677c36fe7fb98-meta.json +1 -0
  37. package/.turbo/cache/789677c36fe7fb98.tar.zst +0 -0
  38. package/.turbo/cache/89ff6c6f38dd4a18-meta.json +1 -0
  39. package/.turbo/cache/89ff6c6f38dd4a18.tar.zst +0 -0
  40. package/.turbo/cache/8dbc92d00de0c92e-meta.json +1 -0
  41. package/.turbo/cache/8dbc92d00de0c92e.tar.zst +0 -0
  42. package/.turbo/cache/8eb03f40082b9441-meta.json +1 -0
  43. package/.turbo/cache/8eb03f40082b9441.tar.zst +0 -0
  44. package/.turbo/cache/9157134d4b916017-meta.json +1 -0
  45. package/.turbo/cache/9157134d4b916017.tar.zst +0 -0
  46. package/.turbo/cache/94219ffd32b48e93-meta.json +1 -0
  47. package/.turbo/cache/94219ffd32b48e93.tar.zst +0 -0
  48. package/.turbo/cache/95c1d160b4fa84eb-meta.json +1 -0
  49. package/.turbo/cache/95c1d160b4fa84eb.tar.zst +0 -0
  50. package/.turbo/cache/998833ea02dfb225-meta.json +1 -0
  51. package/.turbo/cache/998833ea02dfb225.tar.zst +0 -0
  52. package/.turbo/cache/a5974ef6ade3eb90-meta.json +1 -0
  53. package/.turbo/cache/a5974ef6ade3eb90.tar.zst +0 -0
  54. package/.turbo/cache/aab811809257decb-meta.json +1 -0
  55. package/.turbo/cache/aab811809257decb.tar.zst +0 -0
  56. package/.turbo/cache/ab2f82a54da854fd-meta.json +1 -0
  57. package/.turbo/cache/ab2f82a54da854fd.tar.zst +0 -0
  58. package/.turbo/cache/abbf4d95d62a7303-meta.json +1 -0
  59. package/.turbo/cache/abbf4d95d62a7303.tar.zst +0 -0
  60. package/.turbo/cache/af4441f519f9ce50-meta.json +1 -0
  61. package/.turbo/cache/af4441f519f9ce50.tar.zst +0 -0
  62. package/.turbo/cache/b9b85aaaf03d00a6-meta.json +1 -0
  63. package/.turbo/cache/b9b85aaaf03d00a6.tar.zst +0 -0
  64. package/.turbo/cache/cd58ee8721bbfed7-meta.json +1 -0
  65. package/.turbo/cache/cd58ee8721bbfed7.tar.zst +0 -0
  66. package/.turbo/cache/d285e48b8afa30b5-meta.json +1 -0
  67. package/.turbo/cache/d285e48b8afa30b5.tar.zst +0 -0
  68. package/.turbo/cache/d33e90229142acce-meta.json +1 -0
  69. package/.turbo/cache/d33e90229142acce.tar.zst +0 -0
  70. package/.turbo/cache/d57839a0d3b04540-meta.json +1 -0
  71. package/.turbo/cache/d57839a0d3b04540.tar.zst +0 -0
  72. package/.turbo/cache/d8554ef2c8b6e5eb-meta.json +1 -0
  73. package/.turbo/cache/d8554ef2c8b6e5eb.tar.zst +0 -0
  74. package/.turbo/cache/dc7375b51290e102-meta.json +1 -0
  75. package/.turbo/cache/dc7375b51290e102.tar.zst +0 -0
  76. package/.turbo/cache/e5310fe547fdbf0a-meta.json +1 -0
  77. package/.turbo/cache/e5310fe547fdbf0a.tar.zst +0 -0
  78. package/.turbo/cache/f12bb5f2f188758d-meta.json +1 -0
  79. package/.turbo/cache/f12bb5f2f188758d.tar.zst +0 -0
  80. package/.turbo/cache/f2db5af0c0b4d23f-meta.json +1 -0
  81. package/.turbo/cache/f2db5af0c0b4d23f.tar.zst +0 -0
  82. package/.turbo/cache/f8935ade01a88cd7-meta.json +1 -0
  83. package/.turbo/cache/f8935ade01a88cd7.tar.zst +0 -0
  84. package/.turbo/cache/f982b8dd966f823a-meta.json +1 -0
  85. package/.turbo/cache/f982b8dd966f823a.tar.zst +0 -0
  86. package/.turbo/cache/f9d4036dd350ba1a-meta.json +1 -0
  87. package/.turbo/cache/f9d4036dd350ba1a.tar.zst +0 -0
  88. package/README.md +661 -0
  89. package/README_ko.md +577 -0
  90. package/bun.lock +135 -0
  91. package/package.json +26 -0
  92. package/packages/agent/.turbo/turbo-build.log +5 -0
  93. package/packages/agent/.turbo/turbo-typecheck.log +1 -0
  94. package/packages/agent/dist/connection/hub-client.d.ts +33 -0
  95. package/packages/agent/dist/connection/hub-client.d.ts.map +1 -0
  96. package/packages/agent/dist/connection/index.d.ts +2 -0
  97. package/packages/agent/dist/connection/index.d.ts.map +1 -0
  98. package/packages/agent/dist/hooks/index.d.ts +3 -0
  99. package/packages/agent/dist/hooks/index.d.ts.map +1 -0
  100. package/packages/agent/dist/hooks/intent-hub-hooks.d.ts +47 -0
  101. package/packages/agent/dist/hooks/intent-hub-hooks.d.ts.map +1 -0
  102. package/packages/agent/dist/index.d.ts +6 -0
  103. package/packages/agent/dist/index.d.ts.map +1 -0
  104. package/packages/agent/dist/index.js +3315 -0
  105. package/packages/agent/dist/plugin/index.d.ts +3 -0
  106. package/packages/agent/dist/plugin/index.d.ts.map +1 -0
  107. package/packages/agent/dist/plugin/intent-hub-plugin.d.ts +54 -0
  108. package/packages/agent/dist/plugin/intent-hub-plugin.d.ts.map +1 -0
  109. package/packages/agent/package.json +32 -0
  110. package/packages/agent/src/connection/hub-client.ts +152 -0
  111. package/packages/agent/src/connection/index.ts +1 -0
  112. package/packages/agent/src/hooks/index.ts +2 -0
  113. package/packages/agent/src/hooks/intent-hub-hooks.ts +245 -0
  114. package/packages/agent/src/index.ts +5 -0
  115. package/packages/agent/src/plugin/index.ts +2 -0
  116. package/packages/agent/src/plugin/intent-hub-plugin.ts +153 -0
  117. package/packages/agent/tsconfig.json +9 -0
  118. package/packages/hub/.turbo/turbo-build.log +6 -0
  119. package/packages/hub/.turbo/turbo-typecheck.log +1 -0
  120. package/packages/hub/dist/api/dashboard.d.ts +17 -0
  121. package/packages/hub/dist/api/dashboard.d.ts.map +1 -0
  122. package/packages/hub/dist/cli.d.ts +3 -0
  123. package/packages/hub/dist/cli.d.ts.map +1 -0
  124. package/packages/hub/dist/cli.js +7719 -0
  125. package/packages/hub/dist/core/conflict-detector.d.ts +36 -0
  126. package/packages/hub/dist/core/conflict-detector.d.ts.map +1 -0
  127. package/packages/hub/dist/core/index.d.ts +7 -0
  128. package/packages/hub/dist/core/index.d.ts.map +1 -0
  129. package/packages/hub/dist/core/intent-analyzer.d.ts +8 -0
  130. package/packages/hub/dist/core/intent-analyzer.d.ts.map +1 -0
  131. package/packages/hub/dist/core/lock-manager.d.ts +13 -0
  132. package/packages/hub/dist/core/lock-manager.d.ts.map +1 -0
  133. package/packages/hub/dist/core/orchestrator.d.ts +46 -0
  134. package/packages/hub/dist/core/orchestrator.d.ts.map +1 -0
  135. package/packages/hub/dist/index.d.ts +9 -0
  136. package/packages/hub/dist/index.d.ts.map +1 -0
  137. package/packages/hub/dist/index.js +4686 -0
  138. package/packages/hub/dist/llm/index.d.ts +7 -0
  139. package/packages/hub/dist/llm/index.d.ts.map +1 -0
  140. package/packages/hub/dist/llm/negotiation-engine.d.ts +40 -0
  141. package/packages/hub/dist/llm/negotiation-engine.d.ts.map +1 -0
  142. package/packages/hub/dist/llm/provider.d.ts +46 -0
  143. package/packages/hub/dist/llm/provider.d.ts.map +1 -0
  144. package/packages/hub/dist/llm/smart-analyzer.d.ts +20 -0
  145. package/packages/hub/dist/llm/smart-analyzer.d.ts.map +1 -0
  146. package/packages/hub/dist/server/hub-server.d.ts +35 -0
  147. package/packages/hub/dist/server/hub-server.d.ts.map +1 -0
  148. package/packages/hub/dist/server/index.d.ts +5 -0
  149. package/packages/hub/dist/server/index.d.ts.map +1 -0
  150. package/packages/hub/dist/server/message-handler.d.ts +18 -0
  151. package/packages/hub/dist/server/message-handler.d.ts.map +1 -0
  152. package/packages/hub/dist/server/smart-hub-server.d.ts +43 -0
  153. package/packages/hub/dist/server/smart-hub-server.d.ts.map +1 -0
  154. package/packages/hub/dist/state/index.d.ts +2 -0
  155. package/packages/hub/dist/state/index.d.ts.map +1 -0
  156. package/packages/hub/dist/state/session-manager.d.ts +19 -0
  157. package/packages/hub/dist/state/session-manager.d.ts.map +1 -0
  158. package/packages/hub/dist/tunnel/index.d.ts +14 -0
  159. package/packages/hub/dist/tunnel/index.d.ts.map +1 -0
  160. package/packages/hub/package.json +54 -0
  161. package/packages/hub/src/api/dashboard.ts +261 -0
  162. package/packages/hub/src/cli.ts +193 -0
  163. package/packages/hub/src/core/conflict-detector.ts +138 -0
  164. package/packages/hub/src/core/index.ts +6 -0
  165. package/packages/hub/src/core/intent-analyzer.ts +112 -0
  166. package/packages/hub/src/core/lock-manager.ts +95 -0
  167. package/packages/hub/src/core/orchestrator.ts +255 -0
  168. package/packages/hub/src/index.ts +8 -0
  169. package/packages/hub/src/llm/index.ts +17 -0
  170. package/packages/hub/src/llm/negotiation-engine.ts +297 -0
  171. package/packages/hub/src/llm/provider.ts +175 -0
  172. package/packages/hub/src/llm/smart-analyzer.ts +169 -0
  173. package/packages/hub/src/server/hub-server.ts +219 -0
  174. package/packages/hub/src/server/index.ts +4 -0
  175. package/packages/hub/src/server/message-handler.ts +111 -0
  176. package/packages/hub/src/server/smart-hub-server.ts +374 -0
  177. package/packages/hub/src/state/index.ts +1 -0
  178. package/packages/hub/src/state/session-manager.ts +59 -0
  179. package/packages/hub/src/tunnel/index.ts +153 -0
  180. package/packages/hub/tsconfig.json +9 -0
  181. package/packages/shared/.turbo/turbo-build.log +5 -0
  182. package/packages/shared/.turbo/turbo-typecheck.log +1 -0
  183. package/packages/shared/dist/index.d.ts +3 -0
  184. package/packages/shared/dist/index.d.ts.map +1 -0
  185. package/packages/shared/dist/index.js +50 -0
  186. package/packages/shared/dist/types/domain.d.ts +50 -0
  187. package/packages/shared/dist/types/domain.d.ts.map +1 -0
  188. package/packages/shared/dist/types/index.d.ts +4 -0
  189. package/packages/shared/dist/types/index.d.ts.map +1 -0
  190. package/packages/shared/dist/types/intent.d.ts +24 -0
  191. package/packages/shared/dist/types/intent.d.ts.map +1 -0
  192. package/packages/shared/dist/types/message.d.ts +151 -0
  193. package/packages/shared/dist/types/message.d.ts.map +1 -0
  194. package/packages/shared/dist/utils/id.d.ts +6 -0
  195. package/packages/shared/dist/utils/id.d.ts.map +1 -0
  196. package/packages/shared/dist/utils/index.d.ts +3 -0
  197. package/packages/shared/dist/utils/index.d.ts.map +1 -0
  198. package/packages/shared/dist/utils/message.d.ts +5 -0
  199. package/packages/shared/dist/utils/message.d.ts.map +1 -0
  200. package/packages/shared/package.json +33 -0
  201. package/packages/shared/src/index.ts +2 -0
  202. package/packages/shared/src/types/domain.ts +57 -0
  203. package/packages/shared/src/types/index.ts +3 -0
  204. package/packages/shared/src/types/intent.ts +34 -0
  205. package/packages/shared/src/types/message.ts +188 -0
  206. package/packages/shared/src/utils/id.ts +21 -0
  207. package/packages/shared/src/utils/index.ts +2 -0
  208. package/packages/shared/src/utils/message.ts +30 -0
  209. package/packages/shared/tsconfig.json +9 -0
  210. package/scripts/test-e2e.ts +194 -0
  211. package/scripts/test-mvp2.ts +167 -0
  212. package/scripts/test-mvp3.ts +405 -0
  213. package/tsconfig.json +19 -0
  214. package/turbo.json +22 -0
@@ -0,0 +1,7 @@
1
+ export { OpenAIProvider, AnthropicProvider, MockProvider, createProvider } from './provider.js';
2
+ export type { LLMProvider, LLMMessage, LLMCompletionOptions, LLMCompletionResult } from './provider.js';
3
+ export { SmartIntentAnalyzer } from './smart-analyzer.js';
4
+ export type { SmartIntentAnalysis } from './smart-analyzer.js';
5
+ export { NegotiationEngine } from './negotiation-engine.js';
6
+ export type { NegotiationParticipant, NegotiationProposal, NegotiationResult } from './negotiation-engine.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAExG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { LLMProvider } from './provider.js';
2
+ import type { SmartIntentAnalysis } from './smart-analyzer.js';
3
+ import type { ExecutionPlan } from '@anthropic-for-korea/intent-hub-shared';
4
+ export interface NegotiationParticipant {
5
+ sessionId: string;
6
+ userId: string;
7
+ username: string;
8
+ intent: SmartIntentAnalysis;
9
+ prompt: string;
10
+ }
11
+ export interface NegotiationProposal {
12
+ fromUserId: string;
13
+ fromUsername: string;
14
+ proposal: string;
15
+ suggestedOrder: string[];
16
+ reasoning: string;
17
+ }
18
+ export interface NegotiationResult {
19
+ conflictId: string;
20
+ status: 'agreed' | 'disagreed' | 'timeout';
21
+ plan?: ExecutionPlan;
22
+ proposals: NegotiationProposal[];
23
+ disagreementReason?: string;
24
+ requiresUserDecision: boolean;
25
+ options?: Array<{
26
+ id: string;
27
+ description: string;
28
+ proposedBy: string;
29
+ }>;
30
+ }
31
+ export declare class NegotiationEngine {
32
+ private provider;
33
+ private activeNegotiations;
34
+ constructor(provider: LLMProvider);
35
+ startNegotiation(participant1: NegotiationParticipant, participant2: NegotiationParticipant): Promise<NegotiationResult>;
36
+ private getProposal;
37
+ private findConsensus;
38
+ getActiveNegotiations(): string[];
39
+ }
40
+ //# sourceMappingURL=negotiation-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negotiation-engine.d.ts","sourceRoot":"","sources":["../../src/llm/negotiation-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,wCAAwC,CAAC;AAG5F,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAsBD,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,kBAAkB,CAIX;gBAEK,QAAQ,EAAE,WAAW;IAEnC,gBAAgB,CACpB,YAAY,EAAE,sBAAsB,EACpC,YAAY,EAAE,sBAAsB,GACnC,OAAO,CAAC,iBAAiB,CAAC;YA0Bf,WAAW;YAmDX,aAAa;IAqJ3B,qBAAqB,IAAI,MAAM,EAAE;CAGlC"}
@@ -0,0 +1,46 @@
1
+ export interface LLMMessage {
2
+ role: 'system' | 'user' | 'assistant';
3
+ content: string;
4
+ }
5
+ export interface LLMCompletionOptions {
6
+ model?: string;
7
+ temperature?: number;
8
+ maxTokens?: number;
9
+ }
10
+ export interface LLMCompletionResult {
11
+ content: string;
12
+ model: string;
13
+ usage?: {
14
+ promptTokens: number;
15
+ completionTokens: number;
16
+ totalTokens: number;
17
+ };
18
+ }
19
+ export interface LLMProvider {
20
+ name: string;
21
+ complete(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<LLMCompletionResult>;
22
+ completeJSON<T>(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<T>;
23
+ }
24
+ export declare class OpenAIProvider implements LLMProvider {
25
+ private apiKey;
26
+ private defaultModel;
27
+ name: string;
28
+ constructor(apiKey: string, defaultModel?: string);
29
+ complete(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<LLMCompletionResult>;
30
+ completeJSON<T>(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<T>;
31
+ }
32
+ export declare class AnthropicProvider implements LLMProvider {
33
+ private apiKey;
34
+ private defaultModel;
35
+ name: string;
36
+ constructor(apiKey: string, defaultModel?: string);
37
+ complete(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<LLMCompletionResult>;
38
+ completeJSON<T>(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<T>;
39
+ }
40
+ export declare class MockProvider implements LLMProvider {
41
+ name: string;
42
+ complete(messages: LLMMessage[]): Promise<LLMCompletionResult>;
43
+ completeJSON<T>(): Promise<T>;
44
+ }
45
+ export declare function createProvider(type: 'openai' | 'anthropic' | 'mock', apiKey?: string): LLMProvider;
46
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/F,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACrF;AAED,qBAAa,cAAe,YAAW,WAAW;IAGpC,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,YAAY;IAFxD,IAAI,SAAY;gBAEI,MAAM,EAAE,MAAM,EAAU,YAAY,SAAgB;IAElE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgC9F,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC;CAwB1F;AAED,qBAAa,iBAAkB,YAAW,WAAW;IAGvC,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,YAAY;IAFxD,IAAI,SAAe;gBAEC,MAAM,EAAE,MAAM,EAAU,YAAY,SAA+B;IAEjF,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuC9F,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC;CAS1F;AAED,qBAAa,YAAa,YAAW,WAAW;IAC9C,IAAI,SAAU;IAER,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQ9D,YAAY,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;CAGpC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAalG"}
@@ -0,0 +1,20 @@
1
+ import type { LLMProvider } from './provider.js';
2
+ import type { IntentAnalysis } from '@anthropic-for-korea/intent-hub-shared';
3
+ export interface SmartIntentAnalysis extends IntentAnalysis {
4
+ summary: string;
5
+ confidence: number;
6
+ }
7
+ export declare class SmartIntentAnalyzer {
8
+ private provider;
9
+ constructor(provider: LLMProvider);
10
+ analyze(prompt: string, projectContext?: string): Promise<SmartIntentAnalysis>;
11
+ private fallbackAnalysis;
12
+ checkOverlap(intent1: SmartIntentAnalysis, intent2: SmartIntentAnalysis): Promise<{
13
+ hasOverlap: boolean;
14
+ overlapDomains: string[];
15
+ overlapFiles: string[];
16
+ severity: 'none' | 'low' | 'medium' | 'high';
17
+ reason: string;
18
+ }>;
19
+ }
20
+ //# sourceMappingURL=smart-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-analyzer.d.ts","sourceRoot":"","sources":["../../src/llm/smart-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAsB7E,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,WAAW;IAEnC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA4CpF,OAAO,CAAC,gBAAgB;IAmClB,YAAY,CAChB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;QACT,UAAU,EAAE,OAAO,CAAC;QACpB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QAC7C,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAiDH"}
@@ -0,0 +1,35 @@
1
+ import { WebSocket } from 'ws';
2
+ export interface HubServerOptions {
3
+ port: number;
4
+ host?: string;
5
+ }
6
+ export interface ConnectedClient {
7
+ socket: WebSocket;
8
+ sessionId: string;
9
+ userId: string;
10
+ username: string;
11
+ projectPath: string;
12
+ connectedAt: number;
13
+ }
14
+ export declare class HubServer {
15
+ private options;
16
+ private wss;
17
+ private clients;
18
+ private sessionManager;
19
+ private lockManager;
20
+ private messageHandler;
21
+ constructor(options: HubServerOptions);
22
+ start(): void;
23
+ stop(): void;
24
+ private handleConnection;
25
+ private handleMessage;
26
+ private handleDisconnection;
27
+ private performDisconnection;
28
+ private findClientBySocket;
29
+ private sendToClient;
30
+ private broadcast;
31
+ private broadcastExcept;
32
+ getConnectedClients(): ConnectedClient[];
33
+ getClientCount(): number;
34
+ }
35
+ //# sourceMappingURL=hub-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-server.d.ts","sourceRoot":"","sources":["../../src/server/hub-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAiBhD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAS;IAOR,OAAO,CAAC,OAAO;IAN3B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;gBAEnB,OAAO,EAAE,gBAAgB;IAW7C,KAAK,IAAI,IAAI;IAiBb,IAAI,IAAI,IAAI;IAYZ,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,aAAa;IA+CrB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IASvB,mBAAmB,IAAI,eAAe,EAAE;IAIxC,cAAc,IAAI,MAAM;CAGzB"}
@@ -0,0 +1,5 @@
1
+ export { HubServer } from './hub-server.js';
2
+ export { MessageHandler } from './message-handler.js';
3
+ export { SmartHubServer } from './smart-hub-server.js';
4
+ export type { SmartHubServerOptions } from './smart-hub-server.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AgentMessage, HubMessage, BroadcastMessage } from '@anthropic-for-korea/intent-hub-shared';
2
+ import type { SessionManager } from '../state/session-manager.js';
3
+ import type { LockManager } from '../core/lock-manager.js';
4
+ type SendFn = (sessionId: string, message: HubMessage | BroadcastMessage) => void;
5
+ type BroadcastFn = (message: BroadcastMessage) => void;
6
+ export declare class MessageHandler {
7
+ private sessionManager;
8
+ private lockManager;
9
+ private send;
10
+ private broadcast;
11
+ private intentAnalyzer;
12
+ constructor(sessionManager: SessionManager, lockManager: LockManager, send: SendFn, broadcast: BroadcastFn);
13
+ handle(sessionId: string, message: AgentMessage): void;
14
+ private handleIntentSubmit;
15
+ private handleDecision;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=message-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-handler.d.ts","sourceRoot":"","sources":["../../src/server/message-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAOZ,UAAU,EACV,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,KAAK,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,gBAAgB,KAAK,IAAI,CAAC;AAClF,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEvD,qBAAa,cAAc;IAIvB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,cAAc,CAAiB;gBAG7B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,WAAW;IAKhC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAetD,OAAO,CAAC,kBAAkB;IA4D1B,OAAO,CAAC,cAAc;CAIvB"}
@@ -0,0 +1,43 @@
1
+ import { WebSocket } from 'ws';
2
+ import { Orchestrator, type OrchestratorConfig } from '../core/orchestrator.js';
3
+ import type { LLMProvider } from '../llm/provider.js';
4
+ export interface SmartHubServerOptions {
5
+ port: number;
6
+ host?: string;
7
+ llmProvider: LLMProvider;
8
+ orchestratorConfig?: Partial<OrchestratorConfig>;
9
+ }
10
+ export interface ConnectedClient {
11
+ socket: WebSocket;
12
+ sessionId: string;
13
+ userId: string;
14
+ username: string;
15
+ projectPath: string;
16
+ connectedAt: number;
17
+ }
18
+ export declare class SmartHubServer {
19
+ private options;
20
+ private wss;
21
+ private clients;
22
+ private sessionManager;
23
+ private orchestrator;
24
+ constructor(options: SmartHubServerOptions);
25
+ start(): void;
26
+ stop(): void;
27
+ private handleConnection;
28
+ private handleMessage;
29
+ private handleIntentSubmit;
30
+ private sendIntentResponse;
31
+ private sendNotification;
32
+ private sendNotificationToClient;
33
+ private broadcastLockUpdate;
34
+ private handleDisconnection;
35
+ private findClientBySocket;
36
+ private sendToClient;
37
+ private broadcast;
38
+ private broadcastExcept;
39
+ getConnectedClients(): ConnectedClient[];
40
+ getClientCount(): number;
41
+ getOrchestratorStatus(): ReturnType<Orchestrator['getStatus']>;
42
+ }
43
+ //# sourceMappingURL=smart-hub-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-hub-server.d.ts","sourceRoot":"","sources":["../../src/server/smart-hub-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAsBhD,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAuB,MAAM,yBAAyB,CAAC;AACrG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IAMb,OAAO,CAAC,OAAO;IAL3B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;gBAEf,OAAO,EAAE,qBAAqB;IAgBlD,KAAK,IAAI,IAAI;IAiBb,IAAI,IAAI,IAAI;IAYZ,OAAO,CAAC,gBAAgB;YAsBV,aAAa;YAiDb,kBAAkB;IAsBhC,OAAO,CAAC,kBAAkB;IAiE1B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,wBAAwB;IAkChC,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IASvB,mBAAmB,IAAI,eAAe,EAAE;IAIxC,cAAc,IAAI,MAAM;IAIxB,qBAAqB,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;CAG/D"}
@@ -0,0 +1,2 @@
1
+ export { SessionManager } from './session-manager.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface Session {
2
+ sessionId: string;
3
+ userId: string;
4
+ username: string;
5
+ connectedAt: number;
6
+ lastActiveAt: number;
7
+ }
8
+ export declare class SessionManager {
9
+ private sessions;
10
+ addSession(sessionId: string, userId: string, username: string): Session;
11
+ removeSession(sessionId: string): boolean;
12
+ getSession(sessionId: string): Session | undefined;
13
+ getSessionByUserId(userId: string): Session | undefined;
14
+ getAllSessions(): Session[];
15
+ updateLastActive(sessionId: string): void;
16
+ getActiveUserCount(): number;
17
+ getActiveUsernames(): string[];
18
+ }
19
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/state/session-manager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAmC;IAEnD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYxE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIzC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIlD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IASvD,cAAc,IAAI,OAAO,EAAE;IAI3B,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzC,kBAAkB,IAAI,MAAM;IAI5B,kBAAkB,IAAI,MAAM,EAAE;CAG/B"}
@@ -0,0 +1,14 @@
1
+ export interface TunnelOptions {
2
+ port: number;
3
+ subdomain?: string;
4
+ provider?: 'localtunnel' | 'cloudflared' | 'auto';
5
+ }
6
+ export interface TunnelResult {
7
+ url: string;
8
+ wsUrl: string;
9
+ provider: string;
10
+ close: () => Promise<void>;
11
+ }
12
+ export declare function createTunnel(options: TunnelOptions): Promise<TunnelResult>;
13
+ export declare function printShareInfo(tunnel: TunnelResult): void;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tunnel/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,MAAM,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AA8FD,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA0BhF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAgBzD"}
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "intent-hub",
3
+ "version": "0.1.0",
4
+ "description": "Team-based LLM coordination platform with semantic conflict resolution - Like VS Code Live Share for AI agents",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "intent-hub": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "bun build ./src/index.ts ./src/cli.ts --outdir ./dist --target node && tsc --emitDeclarationOnly",
16
+ "dev": "bun run --watch src/cli.ts",
17
+ "start": "bun run dist/cli.js",
18
+ "typecheck": "tsc --noEmit",
19
+ "clean": "rm -rf dist"
20
+ },
21
+ "dependencies": {
22
+ "@anthropic-for-korea/intent-hub-shared": "^0.1.0",
23
+ "localtunnel": "^2.0.2",
24
+ "ws": "^8.18.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/localtunnel": "^2.0.4",
28
+ "@types/ws": "^8.5.13",
29
+ "typescript": "^5.7.0"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/anthropic-for-korea/intent-hub.git",
34
+ "directory": "packages/hub"
35
+ },
36
+ "homepage": "https://github.com/anthropic-for-korea/intent-hub#readme",
37
+ "license": "MIT",
38
+ "keywords": [
39
+ "intent-hub",
40
+ "llm",
41
+ "ai",
42
+ "coordination",
43
+ "team",
44
+ "collaboration",
45
+ "live-share",
46
+ "claude",
47
+ "opencode",
48
+ "cursor",
49
+ "copilot"
50
+ ],
51
+ "engines": {
52
+ "node": ">=20.0.0"
53
+ }
54
+ }
@@ -0,0 +1,261 @@
1
+ import { createServer, type IncomingMessage, type ServerResponse } from 'http';
2
+ import type { SmartHubServer } from '../server/smart-hub-server.js';
3
+
4
+ export interface DashboardApiOptions {
5
+ port: number;
6
+ hubServer: SmartHubServer;
7
+ }
8
+
9
+ export class DashboardApi {
10
+ private server: ReturnType<typeof createServer> | null = null;
11
+
12
+ constructor(private options: DashboardApiOptions) {}
13
+
14
+ start(): void {
15
+ this.server = createServer((req, res) => {
16
+ this.handleRequest(req, res);
17
+ });
18
+
19
+ this.server.listen(this.options.port, () => {
20
+ console.log(`[Dashboard] API running on http://localhost:${this.options.port}`);
21
+ });
22
+ }
23
+
24
+ stop(): void {
25
+ if (this.server) {
26
+ this.server.close();
27
+ this.server = null;
28
+ }
29
+ }
30
+
31
+ private handleRequest(req: IncomingMessage, res: ServerResponse): void {
32
+ res.setHeader('Access-Control-Allow-Origin', '*');
33
+ res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
34
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
35
+
36
+ if (req.method === 'OPTIONS') {
37
+ res.writeHead(204);
38
+ res.end();
39
+ return;
40
+ }
41
+
42
+ const url = new URL(req.url ?? '/', `http://localhost:${this.options.port}`);
43
+
44
+ if (url.pathname === '/api/status') {
45
+ this.handleStatus(res);
46
+ } else if (url.pathname === '/api/clients') {
47
+ this.handleClients(res);
48
+ } else if (url.pathname === '/') {
49
+ this.handleDashboard(res);
50
+ } else {
51
+ res.writeHead(404, { 'Content-Type': 'application/json' });
52
+ res.end(JSON.stringify({ error: 'Not found' }));
53
+ }
54
+ }
55
+
56
+ private handleStatus(res: ServerResponse): void {
57
+ const status = this.options.hubServer.getOrchestratorStatus();
58
+ const clients = this.options.hubServer.getConnectedClients();
59
+
60
+ res.writeHead(200, { 'Content-Type': 'application/json' });
61
+ res.end(JSON.stringify({
62
+ status: 'running',
63
+ orchestrator: status,
64
+ connectedUsers: clients.length,
65
+ users: clients.map(c => ({
66
+ username: c.username,
67
+ connectedAt: c.connectedAt,
68
+ })),
69
+ }));
70
+ }
71
+
72
+ private handleClients(res: ServerResponse): void {
73
+ const clients = this.options.hubServer.getConnectedClients();
74
+
75
+ res.writeHead(200, { 'Content-Type': 'application/json' });
76
+ res.end(JSON.stringify({
77
+ count: clients.length,
78
+ clients: clients.map(c => ({
79
+ sessionId: c.sessionId,
80
+ userId: c.userId,
81
+ username: c.username,
82
+ projectPath: c.projectPath,
83
+ connectedAt: c.connectedAt,
84
+ connectedFor: Math.round((Date.now() - c.connectedAt) / 1000),
85
+ })),
86
+ }));
87
+ }
88
+
89
+ private handleDashboard(res: ServerResponse): void {
90
+ res.writeHead(200, { 'Content-Type': 'text/html' });
91
+ res.end(DASHBOARD_HTML);
92
+ }
93
+ }
94
+
95
+ const DASHBOARD_HTML = `<!DOCTYPE html>
96
+ <html lang="en">
97
+ <head>
98
+ <meta charset="UTF-8">
99
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
100
+ <title>Intent Hub Dashboard</title>
101
+ <style>
102
+ * { margin: 0; padding: 0; box-sizing: border-box; }
103
+ body {
104
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
105
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
106
+ color: #e4e4e4;
107
+ min-height: 100vh;
108
+ padding: 2rem;
109
+ }
110
+ .container { max-width: 1200px; margin: 0 auto; }
111
+ h1 {
112
+ font-size: 2.5rem;
113
+ margin-bottom: 0.5rem;
114
+ background: linear-gradient(90deg, #00d9ff, #00ff88);
115
+ -webkit-background-clip: text;
116
+ -webkit-text-fill-color: transparent;
117
+ }
118
+ .subtitle { color: #888; margin-bottom: 2rem; }
119
+ .grid {
120
+ display: grid;
121
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
122
+ gap: 1.5rem;
123
+ margin-bottom: 2rem;
124
+ }
125
+ .card {
126
+ background: rgba(255,255,255,0.05);
127
+ border: 1px solid rgba(255,255,255,0.1);
128
+ border-radius: 12px;
129
+ padding: 1.5rem;
130
+ }
131
+ .card h2 {
132
+ font-size: 1rem;
133
+ color: #888;
134
+ margin-bottom: 1rem;
135
+ text-transform: uppercase;
136
+ letter-spacing: 1px;
137
+ }
138
+ .stat {
139
+ font-size: 3rem;
140
+ font-weight: bold;
141
+ color: #00ff88;
142
+ }
143
+ .stat.warn { color: #ffaa00; }
144
+ .stat.error { color: #ff4444; }
145
+ .user-list { list-style: none; }
146
+ .user-item {
147
+ display: flex;
148
+ align-items: center;
149
+ padding: 0.75rem;
150
+ background: rgba(255,255,255,0.03);
151
+ border-radius: 8px;
152
+ margin-bottom: 0.5rem;
153
+ }
154
+ .user-avatar {
155
+ width: 40px;
156
+ height: 40px;
157
+ border-radius: 50%;
158
+ background: linear-gradient(135deg, #00d9ff, #00ff88);
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ font-weight: bold;
163
+ margin-right: 1rem;
164
+ }
165
+ .user-info { flex: 1; }
166
+ .user-name { font-weight: 500; }
167
+ .user-time { font-size: 0.85rem; color: #888; }
168
+ .status-badge {
169
+ padding: 0.25rem 0.75rem;
170
+ border-radius: 20px;
171
+ font-size: 0.75rem;
172
+ text-transform: uppercase;
173
+ }
174
+ .status-active {
175
+ background: rgba(0,255,136,0.2);
176
+ color: #00ff88;
177
+ }
178
+ .refresh-btn {
179
+ background: rgba(0,217,255,0.2);
180
+ color: #00d9ff;
181
+ border: 1px solid rgba(0,217,255,0.3);
182
+ padding: 0.5rem 1rem;
183
+ border-radius: 6px;
184
+ cursor: pointer;
185
+ font-size: 0.9rem;
186
+ }
187
+ .refresh-btn:hover { background: rgba(0,217,255,0.3); }
188
+ .empty { color: #666; font-style: italic; padding: 1rem; }
189
+ </style>
190
+ </head>
191
+ <body>
192
+ <div class="container">
193
+ <h1>Intent Hub</h1>
194
+ <p class="subtitle">Team-based LLM Coordination Platform</p>
195
+
196
+ <div class="grid">
197
+ <div class="card">
198
+ <h2>Connected Users</h2>
199
+ <div class="stat" id="userCount">-</div>
200
+ </div>
201
+ <div class="card">
202
+ <h2>Active Intents</h2>
203
+ <div class="stat" id="intentCount">-</div>
204
+ </div>
205
+ <div class="card">
206
+ <h2>Active Locks</h2>
207
+ <div class="stat" id="lockCount">-</div>
208
+ </div>
209
+ </div>
210
+
211
+ <div class="card">
212
+ <h2>Team Members</h2>
213
+ <button class="refresh-btn" onclick="refresh()">Refresh</button>
214
+ <ul class="user-list" id="userList">
215
+ <li class="empty">No users connected</li>
216
+ </ul>
217
+ </div>
218
+ </div>
219
+
220
+ <script>
221
+ async function refresh() {
222
+ try {
223
+ const res = await fetch('/api/status');
224
+ const data = await res.json();
225
+
226
+ document.getElementById('userCount').textContent = data.connectedUsers;
227
+ document.getElementById('intentCount').textContent = data.orchestrator.activeIntents;
228
+ document.getElementById('lockCount').textContent = data.orchestrator.activeLocks;
229
+
230
+ const list = document.getElementById('userList');
231
+ if (data.users.length === 0) {
232
+ list.innerHTML = '<li class="empty">No users connected</li>';
233
+ } else {
234
+ list.innerHTML = data.users.map(u => \`
235
+ <li class="user-item">
236
+ <div class="user-avatar">\${u.username[0].toUpperCase()}</div>
237
+ <div class="user-info">
238
+ <div class="user-name">\${u.username}</div>
239
+ <div class="user-time">Connected \${formatTime(u.connectedAt)}</div>
240
+ </div>
241
+ <span class="status-badge status-active">Active</span>
242
+ </li>
243
+ \`).join('');
244
+ }
245
+ } catch (e) {
246
+ console.error('Failed to fetch status:', e);
247
+ }
248
+ }
249
+
250
+ function formatTime(ts) {
251
+ const diff = Math.round((Date.now() - ts) / 1000);
252
+ if (diff < 60) return diff + 's ago';
253
+ if (diff < 3600) return Math.round(diff/60) + 'm ago';
254
+ return Math.round(diff/3600) + 'h ago';
255
+ }
256
+
257
+ refresh();
258
+ setInterval(refresh, 5000);
259
+ </script>
260
+ </body>
261
+ </html>`;