folder structure refactor
4
build.js
@ -14,8 +14,8 @@ const baseConfig = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const entryPoints = [
|
const entryPoints = [
|
||||||
{ in: 'src/app/HeaderController.js', out: 'public/build/header' },
|
{ in: 'src/ui/app/HeaderController.js', out: 'public/build/header' },
|
||||||
{ in: 'src/app/PickleGlassApp.js', out: 'public/build/content' },
|
{ in: 'src/ui/app/PickleGlassApp.js', out: 'public/build/content' },
|
||||||
];
|
];
|
||||||
|
|
||||||
async function build() {
|
async function build() {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// src/bridge/windowBridge.js
|
// src/bridge/windowBridge.js
|
||||||
const { ipcMain, BrowserWindow } = require('electron');
|
const { ipcMain, BrowserWindow } = require('electron');
|
||||||
const { windowPool, settingsHideTimer, app, shell } = require('../electron/windowManager'); // 필요 변수 require
|
const { windowPool, settingsHideTimer, app, shell } = require('../window/windowManager'); // 필요 변수 require
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
// Renderer로부터의 요청을 수신
|
// Renderer로부터의 요청을 수신
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
const { ipcMain, BrowserWindow } = require('electron');
|
const { ipcMain, BrowserWindow } = require('electron');
|
||||||
const { createStreamingLLM } = require('../../common/ai/factory');
|
const { createStreamingLLM } = require('../../common/ai/factory');
|
||||||
const { getStoredApiKey, getStoredProvider, getCurrentModelInfo, windowPool, captureScreenshot } = require('../../electron/windowManager');
|
const { getStoredApiKey, getStoredProvider, getCurrentModelInfo, windowPool, captureScreenshot } = require('../../window/windowManager');
|
||||||
const authService = require('../../common/services/authService');
|
const authService = require('../../common/services/authService');
|
||||||
const sessionRepository = require('../../common/repositories/session');
|
const sessionRepository = require('../../common/repositories/session');
|
||||||
const askRepository = require('./repositories');
|
const askRepository = require('./repositories');
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
const { BrowserWindow } = require('electron');
|
const { BrowserWindow } = require('electron');
|
||||||
const { spawn } = require('child_process');
|
const { spawn } = require('child_process');
|
||||||
const { createSTT } = require('../../../common/ai/factory');
|
const { createSTT } = require('../../../common/ai/factory');
|
||||||
const { getStoredApiKey, getStoredProvider, getCurrentModelInfo } = require('../../../electron/windowManager');
|
const { getStoredApiKey, getStoredProvider, getCurrentModelInfo } = require('../../../window/windowManager');
|
||||||
|
|
||||||
const COMPLETION_DEBOUNCE_MS = 2000;
|
const COMPLETION_DEBOUNCE_MS = 2000;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ const { createLLM } = require('../../../common/ai/factory');
|
|||||||
const authService = require('../../../common/services/authService');
|
const authService = require('../../../common/services/authService');
|
||||||
const sessionRepository = require('../../../common/repositories/session');
|
const sessionRepository = require('../../../common/repositories/session');
|
||||||
const summaryRepository = require('./repositories');
|
const summaryRepository = require('./repositories');
|
||||||
const { getStoredApiKey, getStoredProvider, getCurrentModelInfo } = require('../../../electron/windowManager');
|
const { getStoredApiKey, getStoredProvider, getCurrentModelInfo } = require('../../../window/windowManager.js');
|
||||||
|
|
||||||
class SummaryService {
|
class SummaryService {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -2,7 +2,7 @@ const { ipcMain, BrowserWindow } = require('electron');
|
|||||||
const Store = require('electron-store');
|
const Store = require('electron-store');
|
||||||
const authService = require('../../common/services/authService');
|
const authService = require('../../common/services/authService');
|
||||||
const settingsRepository = require('./repositories');
|
const settingsRepository = require('./repositories');
|
||||||
const { getStoredApiKey, getStoredProvider, windowPool } = require('../../electron/windowManager');
|
const { getStoredApiKey, getStoredProvider, windowPool } = require('../../window/windowManager');
|
||||||
|
|
||||||
const store = new Store({
|
const store = new Store({
|
||||||
name: 'pickle-glass-settings',
|
name: 'pickle-glass-settings',
|
||||||
|
12
src/index.js
@ -12,7 +12,7 @@ if (require('electron-squirrel-startup')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { app, BrowserWindow, shell, ipcMain, dialog, desktopCapturer, session } = require('electron');
|
const { app, BrowserWindow, shell, ipcMain, dialog, desktopCapturer, session } = require('electron');
|
||||||
const { createWindows } = require('./electron/windowManager.js');
|
const { createWindows } = require('./window/windowManager.js');
|
||||||
const ListenService = require('./features/listen/listenService');
|
const ListenService = require('./features/listen/listenService');
|
||||||
const { initializeFirebase } = require('./common/services/firebaseClient');
|
const { initializeFirebase } = require('./common/services/firebaseClient');
|
||||||
const databaseInitializer = require('./common/services/databaseInitializer');
|
const databaseInitializer = require('./common/services/databaseInitializer');
|
||||||
@ -124,7 +124,7 @@ function setupProtocolHandling() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function focusMainWindow() {
|
function focusMainWindow() {
|
||||||
const { windowPool } = require('./electron/windowManager');
|
const { windowPool } = require('./window/windowManager.js');
|
||||||
if (windowPool) {
|
if (windowPool) {
|
||||||
const header = windowPool.get('header');
|
const header = windowPool.get('header');
|
||||||
if (header && !header.isDestroyed()) {
|
if (header && !header.isDestroyed()) {
|
||||||
@ -790,7 +790,7 @@ async function handleCustomUrl(url) {
|
|||||||
handlePersonalizeFromUrl(params);
|
handlePersonalizeFromUrl(params);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
const { windowPool } = require('./electron/windowManager');
|
const { windowPool } = require('./window/windowManager.js');
|
||||||
const header = windowPool.get('header');
|
const header = windowPool.get('header');
|
||||||
if (header) {
|
if (header) {
|
||||||
if (header.isMinimized()) header.restore();
|
if (header.isMinimized()) header.restore();
|
||||||
@ -852,7 +852,7 @@ async function handleFirebaseAuthCallback(params) {
|
|||||||
console.log('[Auth] Main process sign-in initiated. Waiting for onAuthStateChanged...');
|
console.log('[Auth] Main process sign-in initiated. Waiting for onAuthStateChanged...');
|
||||||
|
|
||||||
// 3. Focus the app window
|
// 3. Focus the app window
|
||||||
const { windowPool } = require('./electron/windowManager');
|
const { windowPool } = require('./window/windowManager.js');
|
||||||
const header = windowPool.get('header');
|
const header = windowPool.get('header');
|
||||||
if (header) {
|
if (header) {
|
||||||
if (header.isMinimized()) header.restore();
|
if (header.isMinimized()) header.restore();
|
||||||
@ -865,7 +865,7 @@ async function handleFirebaseAuthCallback(params) {
|
|||||||
console.error('[Auth] Error during custom token exchange or sign-in:', error);
|
console.error('[Auth] Error during custom token exchange or sign-in:', error);
|
||||||
// The UI will not change, and the user can try again.
|
// The UI will not change, and the user can try again.
|
||||||
// Optionally, send a generic error event to the renderer.
|
// Optionally, send a generic error event to the renderer.
|
||||||
const { windowPool } = require('./electron/windowManager');
|
const { windowPool } = require('./window/windowManager.js');
|
||||||
const header = windowPool.get('header');
|
const header = windowPool.get('header');
|
||||||
if (header) {
|
if (header) {
|
||||||
header.webContents.send('auth-failed', { message: error.message });
|
header.webContents.send('auth-failed', { message: error.message });
|
||||||
@ -876,7 +876,7 @@ async function handleFirebaseAuthCallback(params) {
|
|||||||
function handlePersonalizeFromUrl(params) {
|
function handlePersonalizeFromUrl(params) {
|
||||||
console.log('[Custom URL] Personalize params:', params);
|
console.log('[Custom URL] Personalize params:', params);
|
||||||
|
|
||||||
const { windowPool } = require('./electron/windowManager');
|
const { windowPool } = require('./window/windowManager.js');
|
||||||
const header = windowPool.get('header');
|
const header = windowPool.get('header');
|
||||||
|
|
||||||
if (header) {
|
if (header) {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { html, css, LitElement } from '../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../assets/lit-core-2.7.4.min.js';
|
||||||
import { SettingsView } from '../features/settings/SettingsView.js';
|
import { SettingsView } from '../settings/SettingsView.js';
|
||||||
import { AssistantView } from '../features/listen/AssistantView.js';
|
import { ListenView } from '../listen/ListenView.js';
|
||||||
import { AskView } from '../features/ask/AskView.js';
|
import { AskView } from '../../features/ask/AskView.js';
|
||||||
import { ShortcutSettingsView } from '../features/settings/ShortCutSettingsView.js';
|
import { ShortcutSettingsView } from '../../features/settings/ShortCutSettingsView.js';
|
||||||
|
|
||||||
import '../features/listen/renderer/renderer.js';
|
import '../listen/audioCore/renderer.js';
|
||||||
|
|
||||||
export class PickleGlassApp extends LitElement {
|
export class PickleGlassApp extends LitElement {
|
||||||
static styles = css`
|
static styles = css`
|
||||||
@ -17,7 +17,7 @@ export class PickleGlassApp extends LitElement {
|
|||||||
border-radius: 7px;
|
border-radius: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
assistant-view {
|
listen-view {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@ -172,12 +172,12 @@ export class PickleGlassApp extends LitElement {
|
|||||||
render() {
|
render() {
|
||||||
switch (this.currentView) {
|
switch (this.currentView) {
|
||||||
case 'listen':
|
case 'listen':
|
||||||
return html`<assistant-view
|
return html`<listen-view
|
||||||
.currentResponseIndex=${this.currentResponseIndex}
|
.currentResponseIndex=${this.currentResponseIndex}
|
||||||
.selectedProfile=${this.selectedProfile}
|
.selectedProfile=${this.selectedProfile}
|
||||||
.structuredData=${this.structuredData}
|
.structuredData=${this.structuredData}
|
||||||
@response-index-changed=${e => (this.currentResponseIndex = e.detail.index)}
|
@response-index-changed=${e => (this.currentResponseIndex = e.detail.index)}
|
||||||
></assistant-view>`;
|
></listen-view>`;
|
||||||
case 'ask':
|
case 'ask':
|
||||||
return html`<ask-view></ask-view>`;
|
return html`<ask-view></ask-view>`;
|
||||||
case 'settings':
|
case 'settings':
|
@ -1,4 +1,4 @@
|
|||||||
import { html, css, LitElement } from '../../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../../ui/assets/lit-core-2.7.4.min.js';
|
||||||
|
|
||||||
export class AskView extends LitElement {
|
export class AskView extends LitElement {
|
||||||
static properties = {
|
static properties = {
|
||||||
@ -898,7 +898,7 @@ export class AskView extends LitElement {
|
|||||||
if (container) this.resizeObserver.observe(container);
|
if (container) this.resizeObserver.observe(container);
|
||||||
|
|
||||||
this.handleQuestionFromAssistant = (event, question) => {
|
this.handleQuestionFromAssistant = (event, question) => {
|
||||||
console.log('📨 AskView: Received question from AssistantView:', question);
|
console.log('📨 AskView: Received question from ListenView:', question);
|
||||||
this.currentResponse = '';
|
this.currentResponse = '';
|
||||||
this.isStreaming = false;
|
this.isStreaming = false;
|
||||||
this.requestUpdate();
|
this.requestUpdate();
|
Before Width: | Height: | Size: 877 B After Width: | Height: | Size: 877 B |
Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@ -1,8 +1,8 @@
|
|||||||
import { html, css, LitElement } from '../../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../assets/lit-core-2.7.4.min.js';
|
||||||
import './stt/SttView.js';
|
import './stt/SttView.js';
|
||||||
import './summary/SummaryView.js';
|
import './summary/SummaryView.js';
|
||||||
|
|
||||||
export class AssistantView extends LitElement {
|
export class ListenView extends LitElement {
|
||||||
static styles = css`
|
static styles = css`
|
||||||
:host {
|
:host {
|
||||||
display: block;
|
display: block;
|
||||||
@ -689,4 +689,4 @@ export class AssistantView extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define('assistant-view', AssistantView);
|
customElements.define('listen-view', ListenView);
|
@ -1,5 +1,5 @@
|
|||||||
const { ipcRenderer } = require('electron');
|
const { ipcRenderer } = require('electron');
|
||||||
const createAecModule = require('../../../assets/aec.js');
|
const createAecModule = require('./aec.js');
|
||||||
|
|
||||||
let aecModPromise = null; // 한 번만 로드
|
let aecModPromise = null; // 한 번만 로드
|
||||||
let aecMod = null;
|
let aecMod = null;
|
@ -1,4 +1,4 @@
|
|||||||
import { html, css, LitElement } from '../../../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../../assets/lit-core-2.7.4.min.js';
|
||||||
|
|
||||||
export class SttView extends LitElement {
|
export class SttView extends LitElement {
|
||||||
static styles = css`
|
static styles = css`
|
@ -1,4 +1,4 @@
|
|||||||
import { html, css, LitElement } from '../../../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../../assets/lit-core-2.7.4.min.js';
|
||||||
|
|
||||||
export class SummaryView extends LitElement {
|
export class SummaryView extends LitElement {
|
||||||
static styles = css`
|
static styles = css`
|
@ -1,4 +1,4 @@
|
|||||||
import { html, css, LitElement } from '../../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../assets/lit-core-2.7.4.min.js';
|
||||||
import { getOllamaProgressTracker } from '../../common/services/localProgressTracker.js';
|
import { getOllamaProgressTracker } from '../../common/services/localProgressTracker.js';
|
||||||
|
|
||||||
export class SettingsView extends LitElement {
|
export class SettingsView extends LitElement {
|
@ -1,4 +1,4 @@
|
|||||||
import { html, css, LitElement } from '../../assets/lit-core-2.7.4.min.js';
|
import { html, css, LitElement } from '../../ui/assets/lit-core-2.7.4.min.js';
|
||||||
|
|
||||||
const commonSystemShortcuts = new Set([
|
const commonSystemShortcuts = new Set([
|
||||||
'Cmd+Q', 'Cmd+W', 'Cmd+A', 'Cmd+S', 'Cmd+Z', 'Cmd+X', 'Cmd+C', 'Cmd+V', 'Cmd+P', 'Cmd+F', 'Cmd+G', 'Cmd+H', 'Cmd+M', 'Cmd+N', 'Cmd+O', 'Cmd+T',
|
'Cmd+Q', 'Cmd+W', 'Cmd+A', 'Cmd+S', 'Cmd+Z', 'Cmd+X', 'Cmd+C', 'Cmd+V', 'Cmd+P', 'Cmd+F', 'Cmd+G', 'Cmd+H', 'Cmd+M', 'Cmd+N', 'Cmd+O', 'Cmd+T',
|