-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpreload.js
More file actions
116 lines (115 loc) · 9.84 KB
/
Copy pathpreload.js
File metadata and controls
116 lines (115 loc) · 9.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('cowork', {
quitSaver: () => ipcRenderer.send('quit-saver'),
close: () => ipcRenderer.send('win-close'),
pin: (v) => ipcRenderer.send('win-pin', v),
maximize: () => ipcRenderer.send('win-max'),
onTasks: (cb) => ipcRenderer.on('tasks-update', (_e, payload) => cb(payload)),
refreshTasks: () => ipcRenderer.send('tasks-refresh'),
getRefreshMinutes: () => ipcRenderer.invoke('get-refresh-minutes'),
saveRefreshMinutes: (n) => ipcRenderer.invoke('save-refresh-minutes', n),
openLink: (url) => ipcRenderer.send('open-link', url),
getVersion: () => ipcRenderer.invoke('get-app-version'),
onWorkspace: (cb) => ipcRenderer.on('workspace-update', (_e, payload) => cb(payload)),
openFile: (p) => ipcRenderer.send('open-file', p),
refreshWorkspace: () => ipcRenderer.send('workspace-refresh'),
getIssuePreview: (id) => ipcRenderer.invoke('get-issue-preview', id),
closeIssue: (id, customField) => ipcRenderer.invoke('close-issue', id, customField),
getRedmineConfig: () => ipcRenderer.invoke('get-redmine-config'),
testRedmineConnection: (cfg) => ipcRenderer.invoke('test-redmine-connection', cfg),
saveRedmineConfig: (cfg) => ipcRenderer.invoke('save-redmine-config', cfg),
getWorkspaceDir: () => ipcRenderer.invoke('get-workspace-dir'),
saveWorkspaceDir: (dir) => ipcRenderer.invoke('save-workspace-dir', dir),
onMeetings: (cb) => ipcRenderer.on('meetings-update', (_e, payload) => cb(payload)),
refreshMeetings: () => ipcRenderer.send('meetings-refresh'),
getMeetingTranscript: (id) => ipcRenderer.invoke('get-meeting-transcript', id),
getMeetingsDir: () => ipcRenderer.invoke('get-meetings-dir'),
saveMeetingsDir: (dir) => ipcRenderer.invoke('save-meetings-dir', dir),
getGlossaryState: () => ipcRenderer.invoke('get-glossary-state'),
appendGlossary: (entries, meta) => ipcRenderer.invoke('append-glossary', entries, meta),
saveNote: (issueId, text) => ipcRenderer.invoke('save-note', issueId, text),
onQaTests: (cb) => ipcRenderer.on('qatest-update', (_e, payload) => cb(payload)),
refreshQaTests: () => ipcRenderer.send('qatest-refresh'),
// name = ชื่อไฟล์ในโฟลเดอร์รอบนั้น (ผู้ใช้เลือกจากชิป) ไม่ใช่ path เต็ม — main เป็นคนต่อ path เอง
getQaRunXml: (runDir, name) => ipcRenderer.invoke('get-qa-run-xml', runDir, name),
getQaRunShot: (runDir, name) => ipcRenderer.invoke('get-qa-run-shot', runDir, name),
getQaSources: () => ipcRenderer.invoke('get-qa-sources'),
saveQaSources: (sources) => ipcRenderer.invoke('save-qa-sources', sources),
// Testing Room — สร้างใบเทส (Qtest) จากงานที่สถานะ Test เขียนไฟล์ในเครื่องอย่างเดียว
createQtest: (issueId, model) => ipcRenderer.invoke('create-qtest', issueId, model),
listQtests: () => ipcRenderer.invoke('list-qtests'),
createSystemQtest: (name, items) => ipcRenderer.invoke('create-system-qtest', name, items),
listAutoTests: () => ipcRenderer.invoke('list-auto-tests'),
latestAutoResults: (testIds) => ipcRenderer.invoke('latest-auto-results', testIds),
saveQtest: (file, sheet) => ipcRenderer.invoke('save-qtest', file, sheet),
// ปุ่ม ✅/❌ — ขอผลสรุปมาให้ QA ตรวจก่อน แล้วค่อยสั่งเขียนกลับ Redmine เป็นคนละคำสั่ง
getFinishPreview: (issueId, outcome) => ipcRenderer.invoke('get-finish-preview', issueId, outcome),
// extra = { notes, uploads } โน้ต + รูปที่ QA แนบในแผง (ไม่บังคับ) ไปพร้อมกันในคำขอเดียว
finishTest: (issueId, outcome, value, fieldId, extra) => ipcRenderer.invoke('finish-test', issueId, outcome, value, fieldId, extra),
// สั่งรันชุดเทสจากในแอป — ส่งไปแค่ [{system, test}] คำสั่งจริงประกอบที่ main
startTestRun: (items) => ipcRenderer.invoke('start-test-run', items),
cancelTestRun: (mode) => ipcRenderer.invoke('cancel-test-run', mode),
getTestRun: () => ipcRenderer.invoke('get-test-run'),
onTestRun: (cb) => ipcRenderer.on('test-run-update', (_e, payload) => cb(payload)),
onScheduleNotice: (cb) => ipcRenderer.on('schedule-notice', (_e, payload) => cb(payload)),
// เพดานเวลาต่อไฟล์เทส (นาที) — 0 = ไม่จับเวลา
getTestRunTimeout: () => ipcRenderer.invoke('get-testrun-timeout'),
saveTestRunTimeout: (n) => ipcRenderer.invoke('save-testrun-timeout', n),
getAutoTestSources: () => ipcRenderer.invoke('get-auto-test-sources'),
saveAutoTestSources: (sources) => ipcRenderer.invoke('save-auto-test-sources', sources),
getQtestDir: () => ipcRenderer.invoke('get-qtest-dir'),
saveQtestDir: (dir) => ipcRenderer.invoke('save-qtest-dir', dir),
getIssueFormMeta: (projectId, trackerName) => ipcRenderer.invoke('get-issue-form-meta', projectId, trackerName),
getProjectMembers: (projectId) => ipcRenderer.invoke('get-project-members', projectId),
draftIssueText: (rawNotes, opts) => ipcRenderer.invoke('draft-issue-text', rawNotes, opts),
// ถอดหน้าเว็บเป็นรูป + UI hierarchy — main เป็นคนเปิดหน้าต่างและส่งผลกลับมาทาง onWebGrab
openWebGrab: () => ipcRenderer.invoke('open-web-grab'),
closeWebGrab: () => ipcRenderer.send('close-web-grab'),
onWebGrab: (cb) => ipcRenderer.on('web-grab-result', (_e, payload) => cb(payload)),
// BlueStacks — ต่างจาก onWebGrab ตรงที่ผลกลับมาทาง invoke ตรง ๆ เพราะเป็นการกดครั้งเดียว
// รอผลเดียว ไม่ใช่หน้าต่างแยกที่กดถอดกี่ครั้งก็ได้
bsListInstances: () => ipcRenderer.invoke('bs-list-instances'),
bsSetInstance: (name) => ipcRenderer.invoke('bs-set-instance', name),
bsGrab: (name) => ipcRenderer.invoke('bs-grab', name),
getLlmConfig: () => ipcRenderer.invoke('get-llm-config'),
saveLlmConfig: (cfg) => ipcRenderer.invoke('save-llm-config', cfg),
uploadIssueAttachment: (fileBuffer, filename) => ipcRenderer.invoke('upload-issue-attachment', fileBuffer, filename),
createIssue: (form) => ipcRenderer.invoke('create-issue', form),
// Grafana/Loki — pull-based, unlike the tabs above: the query depends on filters the
// user is moving, so the renderer asks rather than main broadcasting. getGrafanaConfig
// returns whether a token exists and its last four characters, never the token itself.
getGrafanaConfig: () => ipcRenderer.invoke('get-grafana-config'),
saveGrafanaConfig: (cfg) => ipcRenderer.invoke('save-grafana-config', cfg),
testGrafanaConnection: (cfg) => ipcRenderer.invoke('test-grafana-connection', cfg),
grafanaQuery: (params) => ipcRenderer.invoke('grafana-query', params),
grafanaOverview: (params) => ipcRenderer.invoke('grafana-overview', params),
grafanaSummary: (params) => ipcRenderer.invoke('grafana-summary', params),
grafanaHistory: (params) => ipcRenderer.invoke('grafana-history', params),
grafanaAppGroups: () => ipcRenderer.invoke('grafana-app-groups'),
// meeting-notes recorder service — see main.js, the renderer never fetches it directly
getRunnerState: () => ipcRenderer.invoke('runner-get-state'),
onRunnerState: (cb) => ipcRenderer.on('runner-update', (_e, payload) => cb(payload)),
startMeeting: (model, name, profile, engine) => ipcRenderer.invoke('runner-start', model, name, profile, engine),
stopMeeting: () => ipcRenderer.invoke('runner-stop'),
getRunnerConfig: () => ipcRenderer.invoke('get-runner-config'),
saveRunnerConfig: (cfg) => ipcRenderer.invoke('save-runner-config', cfg),
// Friday — โปรเซสข้างเคียงที่ meeting-notes เป็นคนเปิด/ปิดให้ renderer ไม่ยิง HTTP เอง
// สถานะมากับ onRunnerState อยู่แล้ว จึงไม่มี getFridayState แยก
startFriday: () => ipcRenderer.invoke('friday-start'),
stopFriday: () => ipcRenderer.invoke('friday-stop'),
// Flow Builder — renderer ส่งแค่ label ของ suite + ชื่อ flow, path จริงประกอบที่ main
flowSuites: () => ipcRenderer.invoke('flow-suites'),
flowList: (label) => ipcRenderer.invoke('flow-list', label),
flowSaveBlocks: (label, catalog) => ipcRenderer.invoke('flow-save-blocks', label, catalog),
flowSave: (label, flow) => ipcRenderer.invoke('flow-save', label, flow),
flowDelete: (label, name) => ipcRenderer.invoke('flow-delete', label, name),
flowRunStart: (label, name, breaks) => ipcRenderer.invoke('flow-run-start', label, name, breaks),
flowRunSignal: (sig) => ipcRenderer.invoke('flow-run-signal', sig),
flowRunCancel: () => ipcRenderer.invoke('flow-run-cancel'),
getFlowRun: () => ipcRenderer.invoke('get-flow-run'),
onFlowRun: (cb) => ipcRenderer.on('flow-run-update', (_e, payload) => cb(payload)),
// model = ตัวเลือกจากเมนู LLM บนหัวแอป (shell().llmModel(), tab-flowbuilder.js ส่งผ่าน fbllm.js) — เดิม
// ไม่ถูกส่งมาเลย ทุกร่างจึงใช้ DEFAULT_MODEL ของ llm.js เสมอไม่ว่าผู้ใช้จะเลือกโมเดลไหนไว้บนหัวแอป
// (Fix pass 1 Finding 1 — ท่าเดียวกับ draftIssueText ที่ opts.model ข้างบน)
draftFlowFromText: (label, text, model) => ipcRenderer.invoke('draft-flow-from-text', label, text, model)
});