@prbe.ai/electron-sdk 0.1.13 → 0.1.15
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.
- package/dist/index.d.mts +13 -4
- package/dist/index.d.ts +13 -4
- package/dist/index.js +249 -226
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +248 -226
- package/dist/index.mjs.map +1 -1
- package/dist/{types-B_KS1-FJ.d.mts → types-Cyfgy1uD.d.mts} +31 -12
- package/dist/{types-B_KS1-FJ.d.ts → types-Cyfgy1uD.d.ts} +31 -12
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/dist/types.mjs +4 -0
- package/dist/types.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -50,6 +50,7 @@ declare enum InvestigationSource {
|
|
|
50
50
|
}
|
|
51
51
|
interface PRBEInteractionRequester {
|
|
52
52
|
requestUserInteraction(payload: InteractionPayload): Promise<InteractionResponse>;
|
|
53
|
+
sendConversationMessage(content: string): void;
|
|
53
54
|
readonly investigationSource: InvestigationSource;
|
|
54
55
|
}
|
|
55
56
|
interface PRBEInteractionHandler {
|
|
@@ -72,6 +73,7 @@ declare enum WSMessageType {
|
|
|
72
73
|
START = "start",
|
|
73
74
|
TOOL_RESULT = "tool_result",
|
|
74
75
|
UPLOAD_REQUEST = "upload_request",
|
|
76
|
+
CONVERSATION_MESSAGE = "conversation_message",
|
|
75
77
|
CANCEL = "cancel",
|
|
76
78
|
PONG = "pong",
|
|
77
79
|
THOUGHT = "thought",
|
|
@@ -80,10 +82,21 @@ declare enum WSMessageType {
|
|
|
80
82
|
SERVER_OBSERVATION = "server_observation",
|
|
81
83
|
UPLOAD_URL = "upload_url",
|
|
82
84
|
SESSION_CONFIG = "session_config",
|
|
85
|
+
CONVERSATION_UPDATE = "conversation_update",
|
|
83
86
|
COMPLETE = "complete",
|
|
84
87
|
ERROR = "error",
|
|
85
88
|
PING = "ping"
|
|
86
89
|
}
|
|
90
|
+
declare enum ConversationRole {
|
|
91
|
+
User = "user",
|
|
92
|
+
Agent = "agent"
|
|
93
|
+
}
|
|
94
|
+
interface ConversationEntry {
|
|
95
|
+
role: ConversationRole;
|
|
96
|
+
content: string;
|
|
97
|
+
label?: string;
|
|
98
|
+
ts: string;
|
|
99
|
+
}
|
|
87
100
|
interface WSMessage {
|
|
88
101
|
type: WSMessageType;
|
|
89
102
|
id?: string;
|
|
@@ -134,7 +147,8 @@ declare enum PRBEAgentConfigKey {
|
|
|
134
147
|
ELECTRON_LOG = "electronLog",
|
|
135
148
|
IPC_MAIN = "ipcMain",
|
|
136
149
|
RENDERER_LOG_CHANNEL = "rendererLogChannel",
|
|
137
|
-
APP_DATA_PATH = "appDataPath"
|
|
150
|
+
APP_DATA_PATH = "appDataPath",
|
|
151
|
+
SESSION_METADATA = "sessionMetadata"
|
|
138
152
|
}
|
|
139
153
|
interface PRBEAgentConfig {
|
|
140
154
|
[PRBEAgentConfigKey.API_KEY]: string;
|
|
@@ -158,6 +172,8 @@ interface PRBEAgentConfig {
|
|
|
158
172
|
[PRBEAgentConfigKey.RENDERER_LOG_CHANNEL]?: string;
|
|
159
173
|
/** Path to the application's data directory (e.g. Electron userData). Sent to the agent so it explores this directory first. */
|
|
160
174
|
[PRBEAgentConfigKey.APP_DATA_PATH]?: string;
|
|
175
|
+
/** Custom metadata included in every session submission (e.g. user profile, app version). */
|
|
176
|
+
[PRBEAgentConfigKey.SESSION_METADATA]?: Record<string, unknown>;
|
|
161
177
|
}
|
|
162
178
|
declare enum PRBEAgentStatusType {
|
|
163
179
|
STARTED = "started",
|
|
@@ -186,7 +202,6 @@ type PRBEAgentStatus = {
|
|
|
186
202
|
} | {
|
|
187
203
|
type: PRBEAgentStatusType.COMPLETED;
|
|
188
204
|
report: string;
|
|
189
|
-
userSummary: string;
|
|
190
205
|
ticketId?: string;
|
|
191
206
|
} | {
|
|
192
207
|
type: PRBEAgentStatusType.ERROR;
|
|
@@ -197,7 +212,6 @@ type PRBEAgentStatus = {
|
|
|
197
212
|
};
|
|
198
213
|
interface InvestigationResult {
|
|
199
214
|
report: string;
|
|
200
|
-
userSummary: string;
|
|
201
215
|
ticketId?: string;
|
|
202
216
|
sessionId?: string;
|
|
203
217
|
}
|
|
@@ -257,7 +271,7 @@ interface PRBECRInvestigation {
|
|
|
257
271
|
isCompleted: boolean;
|
|
258
272
|
isFailed: boolean;
|
|
259
273
|
report: string;
|
|
260
|
-
summary
|
|
274
|
+
summary?: string;
|
|
261
275
|
errorMessage?: string;
|
|
262
276
|
agentMessage?: string;
|
|
263
277
|
startedAt: Date;
|
|
@@ -268,10 +282,11 @@ interface PRBECompletedInvestigation {
|
|
|
268
282
|
id: string;
|
|
269
283
|
query: string;
|
|
270
284
|
report: string;
|
|
271
|
-
summary
|
|
285
|
+
summary?: string;
|
|
272
286
|
ticketId?: string;
|
|
273
287
|
events: PRBEStatusEvent[];
|
|
274
288
|
resolvedInteractions: ResolvedInteraction[];
|
|
289
|
+
conversationHistory?: ConversationEntry[];
|
|
275
290
|
completedAt: Date;
|
|
276
291
|
}
|
|
277
292
|
interface ResolveSessionsRequest {
|
|
@@ -313,7 +328,7 @@ declare enum PRBEStateEvent {
|
|
|
313
328
|
STATUS = "status",
|
|
314
329
|
/** Emitted when a new event is appended. Payload: PRBEStatusEvent */
|
|
315
330
|
EVENT = "event",
|
|
316
|
-
/** Emitted when investigation completes. Payload: { report: string
|
|
331
|
+
/** Emitted when investigation completes. Payload: { report: string } */
|
|
317
332
|
COMPLETE = "complete",
|
|
318
333
|
/** Emitted on error. Payload: { message: string } */
|
|
319
334
|
ERROR = "error",
|
|
@@ -342,6 +357,7 @@ declare class PRBEAgentState extends EventEmitter {
|
|
|
342
357
|
pendingInteraction?: InteractionPayload;
|
|
343
358
|
resolvedInteractions: ResolvedInteraction[];
|
|
344
359
|
agentMessage?: string;
|
|
360
|
+
conversationHistory: ConversationEntry[];
|
|
345
361
|
completedInvestigations: PRBECompletedInvestigation[];
|
|
346
362
|
activeCRs: Map<string, PRBECRInvestigation>;
|
|
347
363
|
completedCRs: PRBECRInvestigation[];
|
|
@@ -351,10 +367,11 @@ declare class PRBEAgentState extends EventEmitter {
|
|
|
351
367
|
get activeCRCount(): number;
|
|
352
368
|
get isActive(): boolean;
|
|
353
369
|
beginInvestigation(query: string): void;
|
|
370
|
+
appendConversation(entry: ConversationEntry): void;
|
|
354
371
|
resetInvestigation(): void;
|
|
355
372
|
appendEvent(label: string, detail?: string, completed?: boolean): void;
|
|
356
373
|
attachObservation(text: string): void;
|
|
357
|
-
completeInvestigation(report: string,
|
|
374
|
+
completeInvestigation(report: string, ticketId?: string): void;
|
|
358
375
|
failInvestigation(message: string): void;
|
|
359
376
|
setPendingInteraction(payload: InteractionPayload): void;
|
|
360
377
|
clearPendingInteraction(): void;
|
|
@@ -368,7 +385,7 @@ declare class PRBEAgentState extends EventEmitter {
|
|
|
368
385
|
beginCR(id: string, query: string, slug?: string, ticketId?: string): void;
|
|
369
386
|
appendCREvent(crID: string, label: string, detail?: string, completed?: boolean): void;
|
|
370
387
|
attachCRObservation(crID: string, text: string): void;
|
|
371
|
-
completeCR(id: string, report: string
|
|
388
|
+
completeCR(id: string, report: string): void;
|
|
372
389
|
failCR(id: string, message: string): void;
|
|
373
390
|
updateTrackedSessionIDs(ids: string[]): void;
|
|
374
391
|
updateTicketInfo(info: TicketInfoOut[]): void;
|
|
@@ -391,7 +408,7 @@ interface PRBESerializedCR {
|
|
|
391
408
|
isCompleted: boolean;
|
|
392
409
|
isFailed: boolean;
|
|
393
410
|
report: string;
|
|
394
|
-
summary
|
|
411
|
+
summary?: string;
|
|
395
412
|
errorMessage?: string;
|
|
396
413
|
agentMessage?: string;
|
|
397
414
|
startedAt: string;
|
|
@@ -403,22 +420,24 @@ interface PRBESerializedCompletedInvestigation {
|
|
|
403
420
|
id: string;
|
|
404
421
|
query: string;
|
|
405
422
|
report: string;
|
|
406
|
-
summary
|
|
423
|
+
summary?: string;
|
|
407
424
|
ticketId?: string;
|
|
408
425
|
events: PRBEStatusEvent[];
|
|
409
426
|
resolvedInteractions: ResolvedInteraction[];
|
|
427
|
+
conversationHistory?: ConversationEntry[];
|
|
410
428
|
completedAt: string;
|
|
411
429
|
}
|
|
412
430
|
interface PRBESerializedState {
|
|
413
431
|
isInvestigating: boolean;
|
|
414
432
|
events: PRBEStatusEvent[];
|
|
415
433
|
report: string;
|
|
416
|
-
summary
|
|
434
|
+
summary?: string;
|
|
417
435
|
currentQuery: string;
|
|
418
436
|
investigationError?: string;
|
|
419
437
|
pendingInteraction?: InteractionPayload;
|
|
420
438
|
resolvedInteractions: ResolvedInteraction[];
|
|
421
439
|
agentMessage?: string;
|
|
440
|
+
conversationHistory: ConversationEntry[];
|
|
422
441
|
completedInvestigations: PRBESerializedCompletedInvestigation[];
|
|
423
442
|
activeCRs: PRBESerializedCR[];
|
|
424
443
|
completedCRs: PRBESerializedCR[];
|
|
@@ -429,4 +448,4 @@ interface PRBESerializedState {
|
|
|
429
448
|
declare const DEFAULT_PRBE_STATE: PRBESerializedState;
|
|
430
449
|
declare function serializePRBEState(state: PRBEAgentState): PRBESerializedState;
|
|
431
450
|
|
|
432
|
-
export { API_URL as A, type
|
|
451
|
+
export { API_URL as A, type PRBEStatusEvent as B, type ContextRequestOut as C, DEFAULT_PRBE_STATE as D, type PollRequest as E, type FlaggedFileIn as F, type RequestPathAccessResponse as G, type RequestPermissionPayload as H, InvestigationSource as I, type RequestPermissionResponse as J, type ResolveSessionsRequest as K, type ResolveSessionsResponse as L, MIDDLEWARE_URL as M, type ResolvedInteraction as N, type ResolvedTicketOut as O, type PRBEToolDeclaration as P, type TicketInfoRequest as Q, type RequestPathAccessPayload as R, type TicketInfoResponse as S, type TicketInfoOut as T, type TicketStatusOut as U, ToolName as V, ToolParamType as W, type WSMessage as X, WSMessageType as Y, redactPII as Z, serializePRBEState as _, type PRBEToolParameter as a, type PRBEInteractionRequester as b, PRBEAgentState as c, type PRBEAgentConfig as d, type InteractionPayload as e, type InteractionResponse as f, type PollResponse as g, type AskQuestionPayload as h, type AskQuestionResponse as i, type ConversationEntry as j, ConversationRole as k, InteractionType as l, type InvestigationResult as m, PRBEAgentConfigKey as n, PRBEAgentError as o, PRBEAgentErrorType as p, type PRBEAgentStatus as q, PRBEAgentStatusType as r, type PRBECRInvestigation as s, type PRBECompletedInvestigation as t, type PRBEInteractionHandler as u, type PRBESerializedCR as v, type PRBESerializedCompletedInvestigation as w, type PRBESerializedState as x, type PRBESerializedTicket as y, PRBEStateEvent as z };
|
|
@@ -50,6 +50,7 @@ declare enum InvestigationSource {
|
|
|
50
50
|
}
|
|
51
51
|
interface PRBEInteractionRequester {
|
|
52
52
|
requestUserInteraction(payload: InteractionPayload): Promise<InteractionResponse>;
|
|
53
|
+
sendConversationMessage(content: string): void;
|
|
53
54
|
readonly investigationSource: InvestigationSource;
|
|
54
55
|
}
|
|
55
56
|
interface PRBEInteractionHandler {
|
|
@@ -72,6 +73,7 @@ declare enum WSMessageType {
|
|
|
72
73
|
START = "start",
|
|
73
74
|
TOOL_RESULT = "tool_result",
|
|
74
75
|
UPLOAD_REQUEST = "upload_request",
|
|
76
|
+
CONVERSATION_MESSAGE = "conversation_message",
|
|
75
77
|
CANCEL = "cancel",
|
|
76
78
|
PONG = "pong",
|
|
77
79
|
THOUGHT = "thought",
|
|
@@ -80,10 +82,21 @@ declare enum WSMessageType {
|
|
|
80
82
|
SERVER_OBSERVATION = "server_observation",
|
|
81
83
|
UPLOAD_URL = "upload_url",
|
|
82
84
|
SESSION_CONFIG = "session_config",
|
|
85
|
+
CONVERSATION_UPDATE = "conversation_update",
|
|
83
86
|
COMPLETE = "complete",
|
|
84
87
|
ERROR = "error",
|
|
85
88
|
PING = "ping"
|
|
86
89
|
}
|
|
90
|
+
declare enum ConversationRole {
|
|
91
|
+
User = "user",
|
|
92
|
+
Agent = "agent"
|
|
93
|
+
}
|
|
94
|
+
interface ConversationEntry {
|
|
95
|
+
role: ConversationRole;
|
|
96
|
+
content: string;
|
|
97
|
+
label?: string;
|
|
98
|
+
ts: string;
|
|
99
|
+
}
|
|
87
100
|
interface WSMessage {
|
|
88
101
|
type: WSMessageType;
|
|
89
102
|
id?: string;
|
|
@@ -134,7 +147,8 @@ declare enum PRBEAgentConfigKey {
|
|
|
134
147
|
ELECTRON_LOG = "electronLog",
|
|
135
148
|
IPC_MAIN = "ipcMain",
|
|
136
149
|
RENDERER_LOG_CHANNEL = "rendererLogChannel",
|
|
137
|
-
APP_DATA_PATH = "appDataPath"
|
|
150
|
+
APP_DATA_PATH = "appDataPath",
|
|
151
|
+
SESSION_METADATA = "sessionMetadata"
|
|
138
152
|
}
|
|
139
153
|
interface PRBEAgentConfig {
|
|
140
154
|
[PRBEAgentConfigKey.API_KEY]: string;
|
|
@@ -158,6 +172,8 @@ interface PRBEAgentConfig {
|
|
|
158
172
|
[PRBEAgentConfigKey.RENDERER_LOG_CHANNEL]?: string;
|
|
159
173
|
/** Path to the application's data directory (e.g. Electron userData). Sent to the agent so it explores this directory first. */
|
|
160
174
|
[PRBEAgentConfigKey.APP_DATA_PATH]?: string;
|
|
175
|
+
/** Custom metadata included in every session submission (e.g. user profile, app version). */
|
|
176
|
+
[PRBEAgentConfigKey.SESSION_METADATA]?: Record<string, unknown>;
|
|
161
177
|
}
|
|
162
178
|
declare enum PRBEAgentStatusType {
|
|
163
179
|
STARTED = "started",
|
|
@@ -186,7 +202,6 @@ type PRBEAgentStatus = {
|
|
|
186
202
|
} | {
|
|
187
203
|
type: PRBEAgentStatusType.COMPLETED;
|
|
188
204
|
report: string;
|
|
189
|
-
userSummary: string;
|
|
190
205
|
ticketId?: string;
|
|
191
206
|
} | {
|
|
192
207
|
type: PRBEAgentStatusType.ERROR;
|
|
@@ -197,7 +212,6 @@ type PRBEAgentStatus = {
|
|
|
197
212
|
};
|
|
198
213
|
interface InvestigationResult {
|
|
199
214
|
report: string;
|
|
200
|
-
userSummary: string;
|
|
201
215
|
ticketId?: string;
|
|
202
216
|
sessionId?: string;
|
|
203
217
|
}
|
|
@@ -257,7 +271,7 @@ interface PRBECRInvestigation {
|
|
|
257
271
|
isCompleted: boolean;
|
|
258
272
|
isFailed: boolean;
|
|
259
273
|
report: string;
|
|
260
|
-
summary
|
|
274
|
+
summary?: string;
|
|
261
275
|
errorMessage?: string;
|
|
262
276
|
agentMessage?: string;
|
|
263
277
|
startedAt: Date;
|
|
@@ -268,10 +282,11 @@ interface PRBECompletedInvestigation {
|
|
|
268
282
|
id: string;
|
|
269
283
|
query: string;
|
|
270
284
|
report: string;
|
|
271
|
-
summary
|
|
285
|
+
summary?: string;
|
|
272
286
|
ticketId?: string;
|
|
273
287
|
events: PRBEStatusEvent[];
|
|
274
288
|
resolvedInteractions: ResolvedInteraction[];
|
|
289
|
+
conversationHistory?: ConversationEntry[];
|
|
275
290
|
completedAt: Date;
|
|
276
291
|
}
|
|
277
292
|
interface ResolveSessionsRequest {
|
|
@@ -313,7 +328,7 @@ declare enum PRBEStateEvent {
|
|
|
313
328
|
STATUS = "status",
|
|
314
329
|
/** Emitted when a new event is appended. Payload: PRBEStatusEvent */
|
|
315
330
|
EVENT = "event",
|
|
316
|
-
/** Emitted when investigation completes. Payload: { report: string
|
|
331
|
+
/** Emitted when investigation completes. Payload: { report: string } */
|
|
317
332
|
COMPLETE = "complete",
|
|
318
333
|
/** Emitted on error. Payload: { message: string } */
|
|
319
334
|
ERROR = "error",
|
|
@@ -342,6 +357,7 @@ declare class PRBEAgentState extends EventEmitter {
|
|
|
342
357
|
pendingInteraction?: InteractionPayload;
|
|
343
358
|
resolvedInteractions: ResolvedInteraction[];
|
|
344
359
|
agentMessage?: string;
|
|
360
|
+
conversationHistory: ConversationEntry[];
|
|
345
361
|
completedInvestigations: PRBECompletedInvestigation[];
|
|
346
362
|
activeCRs: Map<string, PRBECRInvestigation>;
|
|
347
363
|
completedCRs: PRBECRInvestigation[];
|
|
@@ -351,10 +367,11 @@ declare class PRBEAgentState extends EventEmitter {
|
|
|
351
367
|
get activeCRCount(): number;
|
|
352
368
|
get isActive(): boolean;
|
|
353
369
|
beginInvestigation(query: string): void;
|
|
370
|
+
appendConversation(entry: ConversationEntry): void;
|
|
354
371
|
resetInvestigation(): void;
|
|
355
372
|
appendEvent(label: string, detail?: string, completed?: boolean): void;
|
|
356
373
|
attachObservation(text: string): void;
|
|
357
|
-
completeInvestigation(report: string,
|
|
374
|
+
completeInvestigation(report: string, ticketId?: string): void;
|
|
358
375
|
failInvestigation(message: string): void;
|
|
359
376
|
setPendingInteraction(payload: InteractionPayload): void;
|
|
360
377
|
clearPendingInteraction(): void;
|
|
@@ -368,7 +385,7 @@ declare class PRBEAgentState extends EventEmitter {
|
|
|
368
385
|
beginCR(id: string, query: string, slug?: string, ticketId?: string): void;
|
|
369
386
|
appendCREvent(crID: string, label: string, detail?: string, completed?: boolean): void;
|
|
370
387
|
attachCRObservation(crID: string, text: string): void;
|
|
371
|
-
completeCR(id: string, report: string
|
|
388
|
+
completeCR(id: string, report: string): void;
|
|
372
389
|
failCR(id: string, message: string): void;
|
|
373
390
|
updateTrackedSessionIDs(ids: string[]): void;
|
|
374
391
|
updateTicketInfo(info: TicketInfoOut[]): void;
|
|
@@ -391,7 +408,7 @@ interface PRBESerializedCR {
|
|
|
391
408
|
isCompleted: boolean;
|
|
392
409
|
isFailed: boolean;
|
|
393
410
|
report: string;
|
|
394
|
-
summary
|
|
411
|
+
summary?: string;
|
|
395
412
|
errorMessage?: string;
|
|
396
413
|
agentMessage?: string;
|
|
397
414
|
startedAt: string;
|
|
@@ -403,22 +420,24 @@ interface PRBESerializedCompletedInvestigation {
|
|
|
403
420
|
id: string;
|
|
404
421
|
query: string;
|
|
405
422
|
report: string;
|
|
406
|
-
summary
|
|
423
|
+
summary?: string;
|
|
407
424
|
ticketId?: string;
|
|
408
425
|
events: PRBEStatusEvent[];
|
|
409
426
|
resolvedInteractions: ResolvedInteraction[];
|
|
427
|
+
conversationHistory?: ConversationEntry[];
|
|
410
428
|
completedAt: string;
|
|
411
429
|
}
|
|
412
430
|
interface PRBESerializedState {
|
|
413
431
|
isInvestigating: boolean;
|
|
414
432
|
events: PRBEStatusEvent[];
|
|
415
433
|
report: string;
|
|
416
|
-
summary
|
|
434
|
+
summary?: string;
|
|
417
435
|
currentQuery: string;
|
|
418
436
|
investigationError?: string;
|
|
419
437
|
pendingInteraction?: InteractionPayload;
|
|
420
438
|
resolvedInteractions: ResolvedInteraction[];
|
|
421
439
|
agentMessage?: string;
|
|
440
|
+
conversationHistory: ConversationEntry[];
|
|
422
441
|
completedInvestigations: PRBESerializedCompletedInvestigation[];
|
|
423
442
|
activeCRs: PRBESerializedCR[];
|
|
424
443
|
completedCRs: PRBESerializedCR[];
|
|
@@ -429,4 +448,4 @@ interface PRBESerializedState {
|
|
|
429
448
|
declare const DEFAULT_PRBE_STATE: PRBESerializedState;
|
|
430
449
|
declare function serializePRBEState(state: PRBEAgentState): PRBESerializedState;
|
|
431
450
|
|
|
432
|
-
export { API_URL as A, type
|
|
451
|
+
export { API_URL as A, type PRBEStatusEvent as B, type ContextRequestOut as C, DEFAULT_PRBE_STATE as D, type PollRequest as E, type FlaggedFileIn as F, type RequestPathAccessResponse as G, type RequestPermissionPayload as H, InvestigationSource as I, type RequestPermissionResponse as J, type ResolveSessionsRequest as K, type ResolveSessionsResponse as L, MIDDLEWARE_URL as M, type ResolvedInteraction as N, type ResolvedTicketOut as O, type PRBEToolDeclaration as P, type TicketInfoRequest as Q, type RequestPathAccessPayload as R, type TicketInfoResponse as S, type TicketInfoOut as T, type TicketStatusOut as U, ToolName as V, ToolParamType as W, type WSMessage as X, WSMessageType as Y, redactPII as Z, serializePRBEState as _, type PRBEToolParameter as a, type PRBEInteractionRequester as b, PRBEAgentState as c, type PRBEAgentConfig as d, type InteractionPayload as e, type InteractionResponse as f, type PollResponse as g, type AskQuestionPayload as h, type AskQuestionResponse as i, type ConversationEntry as j, ConversationRole as k, InteractionType as l, type InvestigationResult as m, PRBEAgentConfigKey as n, PRBEAgentError as o, PRBEAgentErrorType as p, type PRBEAgentStatus as q, PRBEAgentStatusType as r, type PRBECRInvestigation as s, type PRBECompletedInvestigation as t, type PRBEInteractionHandler as u, type PRBESerializedCR as v, type PRBESerializedCompletedInvestigation as w, type PRBESerializedState as x, type PRBESerializedTicket as y, PRBEStateEvent as z };
|
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { A as API_URL, h as AskQuestionPayload, i as AskQuestionResponse, C as ContextRequestOut, D as DEFAULT_PRBE_STATE, F as FlaggedFileIn, e as InteractionPayload, f as InteractionResponse,
|
|
1
|
+
export { A as API_URL, h as AskQuestionPayload, i as AskQuestionResponse, C as ContextRequestOut, D as DEFAULT_PRBE_STATE, F as FlaggedFileIn, e as InteractionPayload, f as InteractionResponse, l as InteractionType, m as InvestigationResult, M as MIDDLEWARE_URL, d as PRBEAgentConfig, n as PRBEAgentConfigKey, p as PRBEAgentErrorType, q as PRBEAgentStatus, r as PRBEAgentStatusType, s as PRBECRInvestigation, t as PRBECompletedInvestigation, u as PRBEInteractionHandler, b as PRBEInteractionRequester, v as PRBESerializedCR, w as PRBESerializedCompletedInvestigation, x as PRBESerializedState, y as PRBESerializedTicket, z as PRBEStateEvent, B as PRBEStatusEvent, P as PRBEToolDeclaration, a as PRBEToolParameter, E as PollRequest, g as PollResponse, R as RequestPathAccessPayload, G as RequestPathAccessResponse, H as RequestPermissionPayload, J as RequestPermissionResponse, N as ResolvedInteraction, T as TicketInfoOut, Q as TicketInfoRequest, S as TicketInfoResponse, U as TicketStatusOut, V as ToolName, W as ToolParamType, X as WSMessage, Y as WSMessageType } from './types-Cyfgy1uD.mjs';
|
|
2
2
|
import 'events';
|
package/dist/types.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { A as API_URL, h as AskQuestionPayload, i as AskQuestionResponse, C as ContextRequestOut, D as DEFAULT_PRBE_STATE, F as FlaggedFileIn, e as InteractionPayload, f as InteractionResponse,
|
|
1
|
+
export { A as API_URL, h as AskQuestionPayload, i as AskQuestionResponse, C as ContextRequestOut, D as DEFAULT_PRBE_STATE, F as FlaggedFileIn, e as InteractionPayload, f as InteractionResponse, l as InteractionType, m as InvestigationResult, M as MIDDLEWARE_URL, d as PRBEAgentConfig, n as PRBEAgentConfigKey, p as PRBEAgentErrorType, q as PRBEAgentStatus, r as PRBEAgentStatusType, s as PRBECRInvestigation, t as PRBECompletedInvestigation, u as PRBEInteractionHandler, b as PRBEInteractionRequester, v as PRBESerializedCR, w as PRBESerializedCompletedInvestigation, x as PRBESerializedState, y as PRBESerializedTicket, z as PRBEStateEvent, B as PRBEStatusEvent, P as PRBEToolDeclaration, a as PRBEToolParameter, E as PollRequest, g as PollResponse, R as RequestPathAccessPayload, G as RequestPathAccessResponse, H as RequestPermissionPayload, J as RequestPermissionResponse, N as ResolvedInteraction, T as TicketInfoOut, Q as TicketInfoRequest, S as TicketInfoResponse, U as TicketStatusOut, V as ToolName, W as ToolParamType, X as WSMessage, Y as WSMessageType } from './types-Cyfgy1uD.js';
|
|
2
2
|
import 'events';
|
package/dist/types.js
CHANGED
|
@@ -47,6 +47,7 @@ var WSMessageType = /* @__PURE__ */ ((WSMessageType2) => {
|
|
|
47
47
|
WSMessageType2["START"] = "start";
|
|
48
48
|
WSMessageType2["TOOL_RESULT"] = "tool_result";
|
|
49
49
|
WSMessageType2["UPLOAD_REQUEST"] = "upload_request";
|
|
50
|
+
WSMessageType2["CONVERSATION_MESSAGE"] = "conversation_message";
|
|
50
51
|
WSMessageType2["CANCEL"] = "cancel";
|
|
51
52
|
WSMessageType2["PONG"] = "pong";
|
|
52
53
|
WSMessageType2["THOUGHT"] = "thought";
|
|
@@ -55,6 +56,7 @@ var WSMessageType = /* @__PURE__ */ ((WSMessageType2) => {
|
|
|
55
56
|
WSMessageType2["SERVER_OBSERVATION"] = "server_observation";
|
|
56
57
|
WSMessageType2["UPLOAD_URL"] = "upload_url";
|
|
57
58
|
WSMessageType2["SESSION_CONFIG"] = "session_config";
|
|
59
|
+
WSMessageType2["CONVERSATION_UPDATE"] = "conversation_update";
|
|
58
60
|
WSMessageType2["COMPLETE"] = "complete";
|
|
59
61
|
WSMessageType2["ERROR"] = "error";
|
|
60
62
|
WSMessageType2["PING"] = "ping";
|
|
@@ -93,6 +95,7 @@ var PRBEAgentConfigKey = /* @__PURE__ */ ((PRBEAgentConfigKey2) => {
|
|
|
93
95
|
PRBEAgentConfigKey2["IPC_MAIN"] = "ipcMain";
|
|
94
96
|
PRBEAgentConfigKey2["RENDERER_LOG_CHANNEL"] = "rendererLogChannel";
|
|
95
97
|
PRBEAgentConfigKey2["APP_DATA_PATH"] = "appDataPath";
|
|
98
|
+
PRBEAgentConfigKey2["SESSION_METADATA"] = "sessionMetadata";
|
|
96
99
|
return PRBEAgentConfigKey2;
|
|
97
100
|
})(PRBEAgentConfigKey || {});
|
|
98
101
|
var PRBEAgentStatusType = /* @__PURE__ */ ((PRBEAgentStatusType2) => {
|
|
@@ -124,6 +127,7 @@ var DEFAULT_PRBE_STATE = {
|
|
|
124
127
|
summary: "",
|
|
125
128
|
currentQuery: "",
|
|
126
129
|
resolvedInteractions: [],
|
|
130
|
+
conversationHistory: [],
|
|
127
131
|
completedInvestigations: [],
|
|
128
132
|
activeCRs: [],
|
|
129
133
|
completedCRs: [],
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/interactions.ts","../src/models.ts","../src/serialization.ts","../src/state.ts"],"sourcesContent":["/**\n * types.ts — Renderer-safe exports (no Node.js built-in imports)\n *\n * This entry point exports only interfaces, type aliases, enums, and\n * plain-object constants. It is safe to import from renderer/browser\n * code that cannot access Node.js modules like fs, path, child_process.\n *\n * Usage: import { ... } from \"@prbe/electron-sdk/types\"\n */\n\n// Interactions — enums + interfaces (no Node imports)\nexport {\n InteractionType,\n type AskQuestionPayload,\n type RequestPermissionPayload,\n type RequestPathAccessPayload,\n type InteractionPayload,\n type AskQuestionResponse,\n type RequestPermissionResponse,\n type RequestPathAccessResponse,\n type InteractionResponse,\n type PRBEInteractionRequester,\n type PRBEInteractionHandler,\n type ResolvedInteraction,\n} from \"./interactions\";\n\n// Models — enums + interfaces (no Node imports, no class exports)\nexport {\n WSMessageType,\n type WSMessage,\n ToolParamType,\n ToolName,\n type PRBEToolParameter,\n type PRBEToolDeclaration,\n PRBEAgentConfigKey,\n type PRBEAgentConfig,\n PRBEAgentStatusType,\n type PRBEAgentStatus,\n PRBEAgentErrorType,\n type PRBEStatusEvent,\n type PRBECRInvestigation,\n type PRBECompletedInvestigation,\n type FlaggedFileIn,\n type InvestigationResult,\n type PollRequest,\n type PollResponse,\n type ContextRequestOut,\n type TicketStatusOut,\n type TicketInfoRequest,\n type TicketInfoOut,\n type TicketInfoResponse,\n API_URL,\n MIDDLEWARE_URL,\n} from \"./models\";\n\n// Serialization — interfaces + plain constants (no Node imports)\nexport {\n type PRBESerializedCR,\n type PRBESerializedTicket,\n type PRBESerializedCompletedInvestigation,\n type PRBESerializedState,\n DEFAULT_PRBE_STATE,\n} from \"./serialization\";\n\n// State events enum (no Node imports — just re-export the enum)\nexport { PRBEStateEvent } from \"./state\";\n","/**\n * interactions.ts — Types for user interaction during investigations\n *\n * Defines the contract between tools (which request interactions) and\n * host apps (which present UI and collect responses).\n */\n\n// ---------------------------------------------------------------------------\n// Interaction Types\n// ---------------------------------------------------------------------------\n\nexport enum InteractionType {\n ASK_QUESTION = \"ask_question\",\n REQUEST_PERMISSION = \"request_permission\",\n REQUEST_PATH_ACCESS = \"request_path_access\",\n}\n\n// ---------------------------------------------------------------------------\n// Payloads (tool → host)\n// ---------------------------------------------------------------------------\n\nexport interface AskQuestionPayload {\n type: InteractionType.ASK_QUESTION;\n interactionId: string;\n question: string;\n context?: string;\n}\n\nexport interface RequestPermissionPayload {\n type: InteractionType.REQUEST_PERMISSION;\n interactionId: string;\n action: string;\n command: string;\n reason?: string;\n}\n\nexport interface RequestPathAccessPayload {\n type: InteractionType.REQUEST_PATH_ACCESS;\n interactionId: string;\n path: string;\n reason: string;\n}\n\nexport type InteractionPayload =\n | AskQuestionPayload\n | RequestPermissionPayload\n | RequestPathAccessPayload;\n\n// ---------------------------------------------------------------------------\n// Responses (host → tool)\n// ---------------------------------------------------------------------------\n\nexport interface AskQuestionResponse {\n type: InteractionType.ASK_QUESTION;\n answer: string;\n}\n\nexport interface RequestPermissionResponse {\n type: InteractionType.REQUEST_PERMISSION;\n approved: boolean;\n}\n\nexport interface RequestPathAccessResponse {\n type: InteractionType.REQUEST_PATH_ACCESS;\n granted: boolean;\n}\n\nexport type InteractionResponse =\n | AskQuestionResponse\n | RequestPermissionResponse\n | RequestPathAccessResponse;\n\n// ---------------------------------------------------------------------------\n// Investigation source\n// ---------------------------------------------------------------------------\n\nexport enum InvestigationSource {\n USER = \"user\",\n CONTEXT_REQUEST = \"context_request\",\n}\n\n// ---------------------------------------------------------------------------\n// Minimal requester interface (tools depend on this, not on PRBEAgent)\n// ---------------------------------------------------------------------------\n\nexport interface PRBEInteractionRequester {\n requestUserInteraction(payload: InteractionPayload): Promise<InteractionResponse>;\n readonly investigationSource: InvestigationSource;\n}\n\n// ---------------------------------------------------------------------------\n// Handler interface (host app implements this)\n// ---------------------------------------------------------------------------\n\nexport interface PRBEInteractionHandler {\n handleInteraction(payload: InteractionPayload): Promise<InteractionResponse>;\n}\n\n// ---------------------------------------------------------------------------\n// Resolved interaction (question + response, for persistence)\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedInteraction {\n interactionId: string;\n payload: InteractionPayload;\n response: InteractionResponse;\n /** Number of events at time of resolution — used to split thinking bubbles */\n eventIndex: number;\n}\n","/**\n * models.ts — WSMessage, WSMessageType, tool types, config, errors\n *\n * All types must match the Swift SDK + middleware protocol exactly.\n */\n\n// ---------------------------------------------------------------------------\n// WebSocket Message Types\n// ---------------------------------------------------------------------------\n\nexport enum WSMessageType {\n // SDK -> Middleware\n START = \"start\",\n TOOL_RESULT = \"tool_result\",\n UPLOAD_REQUEST = \"upload_request\",\n CANCEL = \"cancel\",\n PONG = \"pong\",\n // Middleware -> SDK\n THOUGHT = \"thought\",\n TOOL_CALL = \"tool_call\",\n SERVER_TOOL_CALL = \"server_tool_call\",\n SERVER_OBSERVATION = \"server_observation\",\n UPLOAD_URL = \"upload_url\",\n SESSION_CONFIG = \"session_config\",\n COMPLETE = \"complete\",\n ERROR = \"error\",\n PING = \"ping\",\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket Message\n// ---------------------------------------------------------------------------\n\nexport interface WSMessage {\n type: WSMessageType;\n id?: string;\n name?: string;\n content?: string;\n metadata?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Tool System\n// ---------------------------------------------------------------------------\n\nexport enum ToolParamType {\n STRING = \"STRING\",\n BOOLEAN = \"BOOLEAN\",\n INTEGER = \"INTEGER\",\n}\n\nexport interface PRBEToolParameter {\n name: string;\n type: ToolParamType;\n description: string;\n required: boolean;\n}\n\nexport interface PRBEToolDeclaration {\n name: string;\n description: string;\n parameters: PRBEToolParameter[];\n /** When true, the middleware uses a longer timeout for this tool (user interaction required). */\n interactive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Tool Names (must match middleware exactly)\n// ---------------------------------------------------------------------------\n\nexport enum ToolName {\n CLIENT_LIST_DIRECTORY = \"client_list_directory\",\n CLIENT_READ_FILE = \"client_read_file\",\n CLIENT_SEARCH_CONTENT = \"client_search_content\",\n CLIENT_FIND_FILES = \"client_find_files\",\n CLIENT_FLAG_FILE = \"client_flag_file\",\n CLIENT_READ_APP_LOGS = \"client_read_app_logs\",\n CLIENT_SEARCH_APP_LOGS = \"client_search_app_logs\",\n CLIENT_CLEAR_APP_LOGS = \"client_clear_app_logs\",\n CLIENT_FLAG_APP_LOGS = \"client_flag_app_logs\",\n CLIENT_ASK_USER = \"client_ask_user\",\n CLIENT_BASH_EXECUTE = \"client_bash_execute\",\n CLIENT_MESSAGE_USER = \"client_message_user\",\n}\n\n// ---------------------------------------------------------------------------\n// Agent Configuration\n// ---------------------------------------------------------------------------\n\nexport enum PRBEAgentConfigKey {\n API_KEY = \"apiKey\",\n AUTO_APPROVED_DIRS = \"autoApprovedDirs\",\n POLLING_INTERVAL = \"pollingInterval\",\n MAX_LOG_ENTRIES = \"maxLogEntries\",\n CAPTURE_CONSOLE = \"captureConsole\",\n BACKGROUND_POLLING = \"backgroundPolling\",\n INTERACTION_HANDLER = \"interactionHandler\",\n ELECTRON_LOG = \"electronLog\",\n IPC_MAIN = \"ipcMain\",\n RENDERER_LOG_CHANNEL = \"rendererLogChannel\",\n APP_DATA_PATH = \"appDataPath\",\n}\n\nexport interface PRBEAgentConfig {\n [PRBEAgentConfigKey.API_KEY]: string;\n [PRBEAgentConfigKey.AUTO_APPROVED_DIRS]: string[];\n [PRBEAgentConfigKey.POLLING_INTERVAL]?: number; // ms, default 600_000 (10 min)\n [PRBEAgentConfigKey.MAX_LOG_ENTRIES]?: number; // default 10_000\n [PRBEAgentConfigKey.CAPTURE_CONSOLE]?: boolean; // default true\n [PRBEAgentConfigKey.BACKGROUND_POLLING]?: boolean; // default true\n [PRBEAgentConfigKey.INTERACTION_HANDLER]?: import(\"./interactions\").PRBEInteractionHandler;\n /** electron-log instance (v5) — SDK hooks into its transports to capture main-process logs */\n [PRBEAgentConfigKey.ELECTRON_LOG]?: { hooks: { push: (hook: (...args: any[]) => any) => void } };\n /** Electron ipcMain instance — SDK listens for renderer log forwarding */\n [PRBEAgentConfigKey.IPC_MAIN]?: { on: (channel: string, listener: (event: any, ...args: any[]) => void) => void };\n /** IPC channel name for renderer log forwarding (default: \"prbe-renderer-log\") */\n [PRBEAgentConfigKey.RENDERER_LOG_CHANNEL]?: string;\n /** Path to the application's data directory (e.g. Electron userData). Sent to the agent so it explores this directory first. */\n [PRBEAgentConfigKey.APP_DATA_PATH]?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Agent Status\n// ---------------------------------------------------------------------------\n\nexport enum PRBEAgentStatusType {\n STARTED = \"started\",\n THINKING = \"thinking\",\n TOOL_CALL = \"tool_call\",\n THOUGHT = \"thought\",\n OBSERVATION = \"observation\",\n COMPLETED = \"completed\",\n ERROR = \"error\",\n AWAITING_INTERACTION = \"awaiting_interaction\",\n}\n\nexport type PRBEAgentStatus =\n | { type: PRBEAgentStatusType.STARTED }\n | { type: PRBEAgentStatusType.THINKING }\n | { type: PRBEAgentStatusType.TOOL_CALL; name: string; label: string }\n | { type: PRBEAgentStatusType.THOUGHT; text: string }\n | { type: PRBEAgentStatusType.OBSERVATION; text: string }\n | { type: PRBEAgentStatusType.COMPLETED; report: string; userSummary: string; ticketId?: string }\n | { type: PRBEAgentStatusType.ERROR; message: string }\n | { type: PRBEAgentStatusType.AWAITING_INTERACTION; interactionPayload: import(\"./interactions\").InteractionPayload };\n\n// ---------------------------------------------------------------------------\n// Investigation Result (internal)\n// ---------------------------------------------------------------------------\n\nexport interface InvestigationResult {\n report: string;\n userSummary: string;\n ticketId?: string;\n sessionId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Flagged File (internal)\n// ---------------------------------------------------------------------------\n\nexport interface FlaggedFileIn {\n originalPath: string;\n reason?: string;\n data: Buffer;\n isText: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Poll Endpoint\n// ---------------------------------------------------------------------------\n\nexport interface PollRequest {\n agent_id: string;\n ticket_ids: string[];\n}\n\nexport interface ContextRequestOut {\n id: string;\n query: string;\n slug?: string;\n is_active: boolean;\n created_at: string;\n}\n\nexport interface TicketStatusOut {\n ticket_id: string;\n status: string;\n context_requests: ContextRequestOut[];\n}\n\nexport interface PollResponse {\n tickets: TicketStatusOut[];\n}\n\n// ---------------------------------------------------------------------------\n// Ticket Info\n// ---------------------------------------------------------------------------\n\nexport interface TicketInfoRequest {\n ticket_ids: string[];\n}\n\nexport interface TicketInfoOut {\n ticket_id: string;\n title: string;\n status: string;\n priority?: string;\n description?: string;\n session_count: number;\n}\n\nexport interface TicketInfoResponse {\n tickets: TicketInfoOut[];\n}\n\n// ---------------------------------------------------------------------------\n// Status Events (for state tracking)\n// ---------------------------------------------------------------------------\n\nexport interface PRBEStatusEvent {\n id: string;\n label: string;\n detail?: string;\n isCompleted: boolean;\n isExpanded: boolean;\n}\n\nexport interface PRBECRInvestigation {\n id: string;\n query: string;\n slug?: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary: string;\n errorMessage?: string;\n agentMessage?: string;\n startedAt: Date;\n pendingInteraction?: import(\"./interactions\").InteractionPayload;\n resolvedInteractions?: import(\"./interactions\").ResolvedInteraction[];\n}\n\n// ---------------------------------------------------------------------------\n// Completed Investigation (persisted in state for history)\n// ---------------------------------------------------------------------------\n\nexport interface PRBECompletedInvestigation {\n id: string;\n query: string;\n report: string;\n summary: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n resolvedInteractions: import(\"./interactions\").ResolvedInteraction[];\n completedAt: Date;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve Sessions\n// ---------------------------------------------------------------------------\n\nexport interface ResolveSessionsRequest {\n agent_id: string;\n session_ids: string[];\n}\n\nexport interface ResolvedTicketOut {\n ticket_id: string;\n status: string;\n session_ids: string[];\n}\n\nexport interface ResolveSessionsResponse {\n tickets: ResolvedTicketOut[];\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport enum PRBEAgentErrorType {\n SERVER_ERROR = \"server_error\",\n NETWORK_ERROR = \"network_error\",\n CANCELLED = \"cancelled\",\n MAX_ITERATIONS = \"max_iterations\",\n}\n\nexport class PRBEAgentError extends Error {\n public readonly errorType: PRBEAgentErrorType;\n public readonly statusCode?: number;\n\n constructor(errorType: PRBEAgentErrorType, message: string, statusCode?: number) {\n super(message);\n this.name = \"PRBEAgentError\";\n this.errorType = errorType;\n this.statusCode = statusCode;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PII Redactor (pass-through stub, matches Swift SDK)\n// ---------------------------------------------------------------------------\n\nexport function redactPII(text: string): string {\n return text;\n}\n\n// ---------------------------------------------------------------------------\n// Static URLs\n// ---------------------------------------------------------------------------\n\nexport const API_URL = \"https://api.prbe.ai\";\nexport const MIDDLEWARE_URL = \"wss://middleware.prbe.ai\";\n","/**\n * serialization.ts — IPC-safe serialization of agent state\n *\n * Converts live PRBEAgentState (with Map, Date, EventEmitter) into\n * plain JSON-safe objects suitable for IPC or structured clone.\n */\n\nimport type { PRBEAgentState } from \"./state\";\nimport type {\n PRBEStatusEvent,\n PRBECRInvestigation,\n TicketInfoOut,\n} from \"./models\";\nimport type { InteractionPayload, ResolvedInteraction } from \"./interactions\";\n\n// ---------------------------------------------------------------------------\n// Serialized CR (Date → ISO string, safe for IPC)\n// ---------------------------------------------------------------------------\n\nexport interface PRBESerializedCR {\n id: string;\n query: string;\n slug?: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary: string;\n errorMessage?: string;\n agentMessage?: string;\n startedAt: string; // ISO string\n pendingInteraction?: InteractionPayload;\n resolvedInteractions?: ResolvedInteraction[];\n}\n\n// ---------------------------------------------------------------------------\n// Serialized Ticket (pass-through — already plain)\n// ---------------------------------------------------------------------------\n\nexport type PRBESerializedTicket = TicketInfoOut;\n\n// ---------------------------------------------------------------------------\n// Serialized Completed Investigation (Date → ISO string)\n// ---------------------------------------------------------------------------\n\nexport interface PRBESerializedCompletedInvestigation {\n id: string;\n query: string;\n report: string;\n summary: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n resolvedInteractions: ResolvedInteraction[];\n completedAt: string; // ISO string\n}\n\n// ---------------------------------------------------------------------------\n// Full serialized state (no Map, Date, or EventEmitter)\n// ---------------------------------------------------------------------------\n\nexport interface PRBESerializedState {\n isInvestigating: boolean;\n events: PRBEStatusEvent[];\n report: string;\n summary: string;\n currentQuery: string;\n investigationError?: string;\n pendingInteraction?: InteractionPayload;\n resolvedInteractions: ResolvedInteraction[];\n agentMessage?: string;\n completedInvestigations: PRBESerializedCompletedInvestigation[];\n activeCRs: PRBESerializedCR[];\n completedCRs: PRBESerializedCR[];\n trackedSessionIDs: string[];\n ticketInfo: PRBESerializedTicket[];\n hasActiveWork: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Default state (used before agent initializes)\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_PRBE_STATE: PRBESerializedState = {\n isInvestigating: false,\n events: [],\n report: \"\",\n summary: \"\",\n currentQuery: \"\",\n resolvedInteractions: [],\n completedInvestigations: [],\n activeCRs: [],\n completedCRs: [],\n trackedSessionIDs: [],\n ticketInfo: [],\n hasActiveWork: false,\n};\n\n// ---------------------------------------------------------------------------\n// Converter: live state → IPC-safe plain object\n// ---------------------------------------------------------------------------\n\nfunction serializeCR(cr: PRBECRInvestigation): PRBESerializedCR {\n return {\n id: cr.id,\n query: cr.query,\n slug: cr.slug,\n ticketId: cr.ticketId,\n events: cr.events,\n isRunning: cr.isRunning,\n isCompleted: cr.isCompleted,\n isFailed: cr.isFailed,\n report: cr.report,\n summary: cr.summary,\n errorMessage: cr.errorMessage,\n agentMessage: cr.agentMessage,\n startedAt: cr.startedAt.toISOString(),\n pendingInteraction: cr.pendingInteraction,\n resolvedInteractions: cr.resolvedInteractions ?? [],\n };\n}\n\nexport function serializePRBEState(state: PRBEAgentState): PRBESerializedState {\n return {\n isInvestigating: state.isInvestigating,\n events: state.events,\n report: state.report,\n summary: state.summary,\n currentQuery: state.currentQuery,\n investigationError: state.investigationError,\n pendingInteraction: state.pendingInteraction,\n resolvedInteractions: state.resolvedInteractions,\n agentMessage: state.agentMessage,\n completedInvestigations: state.completedInvestigations.map((inv) => ({\n id: inv.id,\n query: inv.query,\n report: inv.report,\n summary: inv.summary,\n ticketId: inv.ticketId,\n events: inv.events,\n resolvedInteractions: inv.resolvedInteractions,\n completedAt: inv.completedAt.toISOString(),\n })),\n activeCRs: Array.from(state.activeCRs.values()).map(serializeCR),\n completedCRs: state.completedCRs.map(serializeCR),\n trackedSessionIDs: state.trackedSessionIDs,\n ticketInfo: state.ticketInfo,\n hasActiveWork: state.hasActiveWork,\n };\n}\n","/**\n * state.ts — PRBEAgentState: EventEmitter-based observable investigation state\n *\n * Mirrors PRBEAgentState.swift but uses Node.js EventEmitter instead of Combine/@Published.\n * Host apps subscribe to events for UI updates.\n */\n\nimport { EventEmitter } from \"events\";\nimport { randomUUID } from \"crypto\";\nimport type {\n PRBEStatusEvent,\n PRBECRInvestigation,\n PRBECompletedInvestigation,\n TicketInfoOut,\n} from \"./models\";\nimport type { InteractionPayload, InteractionResponse, ResolvedInteraction } from \"./interactions\";\n\n// ---------------------------------------------------------------------------\n// Event types emitted by PRBEAgentState\n// ---------------------------------------------------------------------------\n\nexport enum PRBEStateEvent {\n /** Emitted on any state change. Payload: void */\n STATUS = \"status\",\n /** Emitted when a new event is appended. Payload: PRBEStatusEvent */\n EVENT = \"event\",\n /** Emitted when investigation completes. Payload: { report: string; summary: string } */\n COMPLETE = \"complete\",\n /** Emitted on error. Payload: { message: string } */\n ERROR = \"error\",\n /** Emitted when a background CR starts. Payload: PRBECRInvestigation */\n CR_START = \"cr-start\",\n /** Emitted when a background CR completes/fails. Payload: PRBECRInvestigation */\n CR_COMPLETE = \"cr-complete\",\n /** Emitted when tracked ticket IDs change. Payload: string[] */\n TICKETS_CHANGED = \"tickets-changed\",\n /** Emitted when ticket info is updated. Payload: TicketInfoOut[] */\n TICKET_INFO = \"ticket-info\",\n /** Emitted when an interaction is requested. Payload: InteractionPayload */\n INTERACTION_REQUESTED = \"interaction-requested\",\n /** Emitted when an interaction is resolved. Payload: void */\n INTERACTION_RESOLVED = \"interaction-resolved\",\n /** Emitted when the agent sends a message to the user. Payload: { message: string } */\n AGENT_MESSAGE = \"agent-message\",\n}\n\n// ---------------------------------------------------------------------------\n// PRBEAgentState\n// ---------------------------------------------------------------------------\n\nexport class PRBEAgentState extends EventEmitter {\n // User-initiated investigation\n public isInvestigating = false;\n public events: PRBEStatusEvent[] = [];\n public report = \"\";\n public summary = \"\";\n public currentQuery = \"\";\n public investigationError?: string;\n public pendingInteraction?: InteractionPayload;\n public resolvedInteractions: ResolvedInteraction[] = [];\n public agentMessage?: string;\n\n // Completed user investigations (history)\n public completedInvestigations: PRBECompletedInvestigation[] = [];\n\n // Background context requests\n public activeCRs: Map<string, PRBECRInvestigation> = new Map();\n public completedCRs: PRBECRInvestigation[] = [];\n\n // Tracked tickets\n public trackedSessionIDs: string[] = [];\n public ticketInfo: TicketInfoOut[] = [];\n\n // Computed\n get hasActiveWork(): boolean {\n return this.isInvestigating || this.activeCRs.size > 0;\n }\n\n get activeCRCount(): number {\n return this.activeCRs.size;\n }\n\n get isActive(): boolean {\n return this.isInvestigating || this.report.length > 0 || this.investigationError != null;\n }\n\n // ---------- User investigation mutations ----------\n\n beginInvestigation(query: string): void {\n this.isInvestigating = true;\n this.events = [];\n this.resolvedInteractions = [];\n this.report = \"\";\n this.summary = \"\";\n this.currentQuery = query;\n this.investigationError = undefined;\n this.agentMessage = undefined;\n this.emit(PRBEStateEvent.STATUS);\n }\n\n resetInvestigation(): void {\n this.isInvestigating = false;\n this.events = [];\n this.resolvedInteractions = [];\n this.report = \"\";\n this.summary = \"\";\n this.currentQuery = \"\";\n this.investigationError = undefined;\n this.pendingInteraction = undefined;\n this.agentMessage = undefined;\n this.emit(PRBEStateEvent.STATUS);\n }\n\n appendEvent(label: string, detail?: string, completed = false): void {\n // Mark previous event as completed before adding new one\n if (this.events.length > 0) {\n const last = this.events[this.events.length - 1];\n if (!last.isCompleted && !completed) {\n last.isCompleted = true;\n }\n }\n const event: PRBEStatusEvent = {\n id: randomUUID(),\n label,\n detail,\n isCompleted: completed,\n isExpanded: false,\n };\n this.events.push(event);\n this.emit(PRBEStateEvent.EVENT, event);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n attachObservation(text: string): void {\n if (this.events.length > 0) {\n this.events[this.events.length - 1].detail = text;\n this.emit(PRBEStateEvent.STATUS);\n }\n }\n\n completeInvestigation(report: string, summary: string, ticketId?: string): void {\n if (this.events.length > 0) {\n this.events[this.events.length - 1].isCompleted = true;\n }\n this.appendEvent(\"Done\", undefined, true);\n\n // Save to history (snapshot events + interactions before reset)\n this.completedInvestigations.unshift({\n id: randomUUID(),\n query: this.currentQuery,\n report,\n summary,\n ticketId,\n events: [...this.events],\n resolvedInteractions: [...this.resolvedInteractions],\n completedAt: new Date(),\n });\n\n this.report = report;\n this.summary = summary;\n this.isInvestigating = false;\n this.emit(PRBEStateEvent.COMPLETE, { report, summary });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n failInvestigation(message: string): void {\n this.appendEvent(`Error: ${message}`);\n this.investigationError = message;\n this.isInvestigating = false;\n this.emit(PRBEStateEvent.ERROR, { message });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n // ---------- Interaction state mutations ----------\n\n setPendingInteraction(payload: InteractionPayload): void {\n this.pendingInteraction = payload;\n this.emit(PRBEStateEvent.INTERACTION_REQUESTED, payload);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n clearPendingInteraction(): void {\n this.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n setCRPendingInteraction(crID: string, payload: InteractionPayload): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n cr.pendingInteraction = payload;\n this.emit(PRBEStateEvent.INTERACTION_REQUESTED, payload);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n clearCRPendingInteraction(crID: string): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n cr.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n resolveInteraction(response: InteractionResponse): void {\n if (!this.pendingInteraction) return;\n this.resolvedInteractions.push({\n interactionId: this.pendingInteraction.interactionId,\n payload: this.pendingInteraction,\n response,\n eventIndex: this.events.length,\n });\n this.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n resolveCRInteraction(crID: string, response: InteractionResponse): void {\n const cr = this.activeCRs.get(crID);\n if (!cr || !cr.pendingInteraction) return;\n const resolved = cr.resolvedInteractions ?? [];\n resolved.push({\n interactionId: cr.pendingInteraction.interactionId,\n payload: cr.pendingInteraction,\n response,\n eventIndex: cr.events.length,\n });\n cr.resolvedInteractions = resolved;\n cr.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n setAgentMessage(message: string): void {\n this.agentMessage = message;\n this.emit(PRBEStateEvent.AGENT_MESSAGE, { message });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n setCRAgentMessage(crID: string, message: string): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n cr.agentMessage = message;\n this.emit(PRBEStateEvent.AGENT_MESSAGE, { message });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n toggleExpansion(eventId: string): void {\n const event = this.events.find((e) => e.id === eventId);\n if (event) {\n event.isExpanded = !event.isExpanded;\n this.emit(PRBEStateEvent.STATUS);\n }\n }\n\n // ---------- CR state mutations ----------\n\n beginCR(id: string, query: string, slug?: string, ticketId?: string): void {\n const cr: PRBECRInvestigation = {\n id,\n query,\n slug,\n ticketId,\n events: [],\n resolvedInteractions: [],\n isRunning: true,\n isCompleted: false,\n isFailed: false,\n report: \"\",\n summary: \"\",\n startedAt: new Date(),\n };\n this.activeCRs.set(id, cr);\n this.emit(PRBEStateEvent.CR_START, cr);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n appendCREvent(crID: string, label: string, detail?: string, completed = false): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n\n if (cr.events.length > 0) {\n const last = cr.events[cr.events.length - 1];\n if (!last.isCompleted && !completed) {\n last.isCompleted = true;\n }\n }\n cr.events.push({\n id: randomUUID(),\n label,\n detail,\n isCompleted: completed,\n isExpanded: false,\n });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n attachCRObservation(crID: string, text: string): void {\n const cr = this.activeCRs.get(crID);\n if (!cr || cr.events.length === 0) return;\n cr.events[cr.events.length - 1].detail = text;\n this.emit(PRBEStateEvent.STATUS);\n }\n\n completeCR(id: string, report: string, summary: string): void {\n const cr = this.activeCRs.get(id);\n if (!cr) return;\n\n this.activeCRs.delete(id);\n if (cr.events.length > 0) {\n cr.events[cr.events.length - 1].isCompleted = true;\n }\n cr.events.push({\n id: randomUUID(),\n label: \"Done\",\n isCompleted: true,\n isExpanded: false,\n });\n cr.isRunning = false;\n cr.isCompleted = true;\n cr.report = report;\n cr.summary = summary;\n this.completedCRs.unshift(cr);\n this.emit(PRBEStateEvent.CR_COMPLETE, cr);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n failCR(id: string, message: string): void {\n const cr = this.activeCRs.get(id);\n if (!cr) return;\n\n this.activeCRs.delete(id);\n cr.events.push({\n id: randomUUID(),\n label: `Error: ${message}`,\n isCompleted: false,\n isExpanded: false,\n });\n cr.isRunning = false;\n cr.isFailed = true;\n cr.errorMessage = message;\n this.completedCRs.unshift(cr);\n this.emit(PRBEStateEvent.CR_COMPLETE, cr);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n // ---------- Tickets ----------\n\n updateTrackedSessionIDs(ids: string[]): void {\n this.trackedSessionIDs = ids;\n this.emit(PRBEStateEvent.TICKETS_CHANGED, ids);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n updateTicketInfo(info: TicketInfoOut[]): void {\n this.ticketInfo = info;\n this.emit(PRBEStateEvent.TICKET_INFO, info);\n this.emit(PRBEStateEvent.STATUS);\n }\n}\n"],"mappings":"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","names":["InteractionType","WSMessageType","ToolParamType","ToolName","PRBEAgentConfigKey","PRBEAgentStatusType","PRBEAgentErrorType","PRBEStateEvent"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/interactions.ts","../src/models.ts","../src/serialization.ts","../src/state.ts"],"sourcesContent":["/**\n * types.ts — Renderer-safe exports (no Node.js built-in imports)\n *\n * This entry point exports only interfaces, type aliases, enums, and\n * plain-object constants. It is safe to import from renderer/browser\n * code that cannot access Node.js modules like fs, path, child_process.\n *\n * Usage: import { ... } from \"@prbe/electron-sdk/types\"\n */\n\n// Interactions — enums + interfaces (no Node imports)\nexport {\n InteractionType,\n type AskQuestionPayload,\n type RequestPermissionPayload,\n type RequestPathAccessPayload,\n type InteractionPayload,\n type AskQuestionResponse,\n type RequestPermissionResponse,\n type RequestPathAccessResponse,\n type InteractionResponse,\n type PRBEInteractionRequester,\n type PRBEInteractionHandler,\n type ResolvedInteraction,\n} from \"./interactions\";\n\n// Models — enums + interfaces (no Node imports, no class exports)\nexport {\n WSMessageType,\n type WSMessage,\n ToolParamType,\n ToolName,\n type PRBEToolParameter,\n type PRBEToolDeclaration,\n PRBEAgentConfigKey,\n type PRBEAgentConfig,\n PRBEAgentStatusType,\n type PRBEAgentStatus,\n PRBEAgentErrorType,\n type PRBEStatusEvent,\n type PRBECRInvestigation,\n type PRBECompletedInvestigation,\n type FlaggedFileIn,\n type InvestigationResult,\n type PollRequest,\n type PollResponse,\n type ContextRequestOut,\n type TicketStatusOut,\n type TicketInfoRequest,\n type TicketInfoOut,\n type TicketInfoResponse,\n API_URL,\n MIDDLEWARE_URL,\n} from \"./models\";\n\n// Serialization — interfaces + plain constants (no Node imports)\nexport {\n type PRBESerializedCR,\n type PRBESerializedTicket,\n type PRBESerializedCompletedInvestigation,\n type PRBESerializedState,\n DEFAULT_PRBE_STATE,\n} from \"./serialization\";\n\n// State events enum (no Node imports — just re-export the enum)\nexport { PRBEStateEvent } from \"./state\";\n","/**\n * interactions.ts — Types for user interaction during investigations\n *\n * Defines the contract between tools (which request interactions) and\n * host apps (which present UI and collect responses).\n */\n\n// ---------------------------------------------------------------------------\n// Interaction Types\n// ---------------------------------------------------------------------------\n\nexport enum InteractionType {\n ASK_QUESTION = \"ask_question\",\n REQUEST_PERMISSION = \"request_permission\",\n REQUEST_PATH_ACCESS = \"request_path_access\",\n}\n\n// ---------------------------------------------------------------------------\n// Payloads (tool → host)\n// ---------------------------------------------------------------------------\n\nexport interface AskQuestionPayload {\n type: InteractionType.ASK_QUESTION;\n interactionId: string;\n question: string;\n context?: string;\n}\n\nexport interface RequestPermissionPayload {\n type: InteractionType.REQUEST_PERMISSION;\n interactionId: string;\n action: string;\n command: string;\n reason?: string;\n}\n\nexport interface RequestPathAccessPayload {\n type: InteractionType.REQUEST_PATH_ACCESS;\n interactionId: string;\n path: string;\n reason: string;\n}\n\nexport type InteractionPayload =\n | AskQuestionPayload\n | RequestPermissionPayload\n | RequestPathAccessPayload;\n\n// ---------------------------------------------------------------------------\n// Responses (host → tool)\n// ---------------------------------------------------------------------------\n\nexport interface AskQuestionResponse {\n type: InteractionType.ASK_QUESTION;\n answer: string;\n}\n\nexport interface RequestPermissionResponse {\n type: InteractionType.REQUEST_PERMISSION;\n approved: boolean;\n}\n\nexport interface RequestPathAccessResponse {\n type: InteractionType.REQUEST_PATH_ACCESS;\n granted: boolean;\n}\n\nexport type InteractionResponse =\n | AskQuestionResponse\n | RequestPermissionResponse\n | RequestPathAccessResponse;\n\n// ---------------------------------------------------------------------------\n// Investigation source\n// ---------------------------------------------------------------------------\n\nexport enum InvestigationSource {\n USER = \"user\",\n CONTEXT_REQUEST = \"context_request\",\n}\n\n// ---------------------------------------------------------------------------\n// Minimal requester interface (tools depend on this, not on PRBEAgent)\n// ---------------------------------------------------------------------------\n\nexport interface PRBEInteractionRequester {\n requestUserInteraction(payload: InteractionPayload): Promise<InteractionResponse>;\n sendConversationMessage(content: string): void;\n readonly investigationSource: InvestigationSource;\n}\n\n// ---------------------------------------------------------------------------\n// Handler interface (host app implements this)\n// ---------------------------------------------------------------------------\n\nexport interface PRBEInteractionHandler {\n handleInteraction(payload: InteractionPayload): Promise<InteractionResponse>;\n}\n\n// ---------------------------------------------------------------------------\n// Resolved interaction (question + response, for persistence)\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedInteraction {\n interactionId: string;\n payload: InteractionPayload;\n response: InteractionResponse;\n /** Number of events at time of resolution — used to split thinking bubbles */\n eventIndex: number;\n}\n","/**\n * models.ts — WSMessage, WSMessageType, tool types, config, errors\n *\n * All types must match the Swift SDK + middleware protocol exactly.\n */\n\n// ---------------------------------------------------------------------------\n// WebSocket Message Types\n// ---------------------------------------------------------------------------\n\nexport enum WSMessageType {\n // SDK -> Middleware\n START = \"start\",\n TOOL_RESULT = \"tool_result\",\n UPLOAD_REQUEST = \"upload_request\",\n CONVERSATION_MESSAGE = \"conversation_message\",\n CANCEL = \"cancel\",\n PONG = \"pong\",\n // Middleware -> SDK\n THOUGHT = \"thought\",\n TOOL_CALL = \"tool_call\",\n SERVER_TOOL_CALL = \"server_tool_call\",\n SERVER_OBSERVATION = \"server_observation\",\n UPLOAD_URL = \"upload_url\",\n SESSION_CONFIG = \"session_config\",\n CONVERSATION_UPDATE = \"conversation_update\",\n COMPLETE = \"complete\",\n ERROR = \"error\",\n PING = \"ping\",\n}\n\n// ---------------------------------------------------------------------------\n// Conversation\n// ---------------------------------------------------------------------------\n\nexport enum ConversationRole {\n User = \"user\",\n Agent = \"agent\",\n}\n\nexport interface ConversationEntry {\n role: ConversationRole;\n content: string;\n label?: string;\n ts: string;\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket Message\n// ---------------------------------------------------------------------------\n\nexport interface WSMessage {\n type: WSMessageType;\n id?: string;\n name?: string;\n content?: string;\n metadata?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Tool System\n// ---------------------------------------------------------------------------\n\nexport enum ToolParamType {\n STRING = \"STRING\",\n BOOLEAN = \"BOOLEAN\",\n INTEGER = \"INTEGER\",\n}\n\nexport interface PRBEToolParameter {\n name: string;\n type: ToolParamType;\n description: string;\n required: boolean;\n}\n\nexport interface PRBEToolDeclaration {\n name: string;\n description: string;\n parameters: PRBEToolParameter[];\n /** When true, the middleware uses a longer timeout for this tool (user interaction required). */\n interactive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Tool Names (must match middleware exactly)\n// ---------------------------------------------------------------------------\n\nexport enum ToolName {\n CLIENT_LIST_DIRECTORY = \"client_list_directory\",\n CLIENT_READ_FILE = \"client_read_file\",\n CLIENT_SEARCH_CONTENT = \"client_search_content\",\n CLIENT_FIND_FILES = \"client_find_files\",\n CLIENT_FLAG_FILE = \"client_flag_file\",\n CLIENT_READ_APP_LOGS = \"client_read_app_logs\",\n CLIENT_SEARCH_APP_LOGS = \"client_search_app_logs\",\n CLIENT_CLEAR_APP_LOGS = \"client_clear_app_logs\",\n CLIENT_FLAG_APP_LOGS = \"client_flag_app_logs\",\n CLIENT_ASK_USER = \"client_ask_user\",\n CLIENT_BASH_EXECUTE = \"client_bash_execute\",\n CLIENT_MESSAGE_USER = \"client_message_user\",\n}\n\n// ---------------------------------------------------------------------------\n// Agent Configuration\n// ---------------------------------------------------------------------------\n\nexport enum PRBEAgentConfigKey {\n API_KEY = \"apiKey\",\n AUTO_APPROVED_DIRS = \"autoApprovedDirs\",\n POLLING_INTERVAL = \"pollingInterval\",\n MAX_LOG_ENTRIES = \"maxLogEntries\",\n CAPTURE_CONSOLE = \"captureConsole\",\n BACKGROUND_POLLING = \"backgroundPolling\",\n INTERACTION_HANDLER = \"interactionHandler\",\n ELECTRON_LOG = \"electronLog\",\n IPC_MAIN = \"ipcMain\",\n RENDERER_LOG_CHANNEL = \"rendererLogChannel\",\n APP_DATA_PATH = \"appDataPath\",\n SESSION_METADATA = \"sessionMetadata\",\n}\n\nexport interface PRBEAgentConfig {\n [PRBEAgentConfigKey.API_KEY]: string;\n [PRBEAgentConfigKey.AUTO_APPROVED_DIRS]: string[];\n [PRBEAgentConfigKey.POLLING_INTERVAL]?: number; // ms, default 600_000 (10 min)\n [PRBEAgentConfigKey.MAX_LOG_ENTRIES]?: number; // default 10_000\n [PRBEAgentConfigKey.CAPTURE_CONSOLE]?: boolean; // default true\n [PRBEAgentConfigKey.BACKGROUND_POLLING]?: boolean; // default true\n [PRBEAgentConfigKey.INTERACTION_HANDLER]?: import(\"./interactions\").PRBEInteractionHandler;\n /** electron-log instance (v5) — SDK hooks into its transports to capture main-process logs */\n [PRBEAgentConfigKey.ELECTRON_LOG]?: { hooks: { push: (hook: (...args: any[]) => any) => void } };\n /** Electron ipcMain instance — SDK listens for renderer log forwarding */\n [PRBEAgentConfigKey.IPC_MAIN]?: { on: (channel: string, listener: (event: any, ...args: any[]) => void) => void };\n /** IPC channel name for renderer log forwarding (default: \"prbe-renderer-log\") */\n [PRBEAgentConfigKey.RENDERER_LOG_CHANNEL]?: string;\n /** Path to the application's data directory (e.g. Electron userData). Sent to the agent so it explores this directory first. */\n [PRBEAgentConfigKey.APP_DATA_PATH]?: string;\n /** Custom metadata included in every session submission (e.g. user profile, app version). */\n [PRBEAgentConfigKey.SESSION_METADATA]?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Agent Status\n// ---------------------------------------------------------------------------\n\nexport enum PRBEAgentStatusType {\n STARTED = \"started\",\n THINKING = \"thinking\",\n TOOL_CALL = \"tool_call\",\n THOUGHT = \"thought\",\n OBSERVATION = \"observation\",\n COMPLETED = \"completed\",\n ERROR = \"error\",\n AWAITING_INTERACTION = \"awaiting_interaction\",\n}\n\nexport type PRBEAgentStatus =\n | { type: PRBEAgentStatusType.STARTED }\n | { type: PRBEAgentStatusType.THINKING }\n | { type: PRBEAgentStatusType.TOOL_CALL; name: string; label: string }\n | { type: PRBEAgentStatusType.THOUGHT; text: string }\n | { type: PRBEAgentStatusType.OBSERVATION; text: string }\n | { type: PRBEAgentStatusType.COMPLETED; report: string; ticketId?: string }\n | { type: PRBEAgentStatusType.ERROR; message: string }\n | { type: PRBEAgentStatusType.AWAITING_INTERACTION; interactionPayload: import(\"./interactions\").InteractionPayload };\n\n// ---------------------------------------------------------------------------\n// Investigation Result (internal)\n// ---------------------------------------------------------------------------\n\nexport interface InvestigationResult {\n report: string;\n ticketId?: string;\n sessionId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Flagged File (internal)\n// ---------------------------------------------------------------------------\n\nexport interface FlaggedFileIn {\n originalPath: string;\n reason?: string;\n data: Buffer;\n isText: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Poll Endpoint\n// ---------------------------------------------------------------------------\n\nexport interface PollRequest {\n agent_id: string;\n ticket_ids: string[];\n}\n\nexport interface ContextRequestOut {\n id: string;\n query: string;\n slug?: string;\n is_active: boolean;\n created_at: string;\n}\n\nexport interface TicketStatusOut {\n ticket_id: string;\n status: string;\n context_requests: ContextRequestOut[];\n}\n\nexport interface PollResponse {\n tickets: TicketStatusOut[];\n}\n\n// ---------------------------------------------------------------------------\n// Ticket Info\n// ---------------------------------------------------------------------------\n\nexport interface TicketInfoRequest {\n ticket_ids: string[];\n}\n\nexport interface TicketInfoOut {\n ticket_id: string;\n title: string;\n status: string;\n priority?: string;\n description?: string;\n session_count: number;\n}\n\nexport interface TicketInfoResponse {\n tickets: TicketInfoOut[];\n}\n\n// ---------------------------------------------------------------------------\n// Status Events (for state tracking)\n// ---------------------------------------------------------------------------\n\nexport interface PRBEStatusEvent {\n id: string;\n label: string;\n detail?: string;\n isCompleted: boolean;\n isExpanded: boolean;\n}\n\nexport interface PRBECRInvestigation {\n id: string;\n query: string;\n slug?: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary?: string;\n errorMessage?: string;\n agentMessage?: string;\n startedAt: Date;\n pendingInteraction?: import(\"./interactions\").InteractionPayload;\n resolvedInteractions?: import(\"./interactions\").ResolvedInteraction[];\n}\n\n// ---------------------------------------------------------------------------\n// Completed Investigation (persisted in state for history)\n// ---------------------------------------------------------------------------\n\nexport interface PRBECompletedInvestigation {\n id: string;\n query: string;\n report: string;\n summary?: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n resolvedInteractions: import(\"./interactions\").ResolvedInteraction[];\n conversationHistory?: ConversationEntry[];\n completedAt: Date;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve Sessions\n// ---------------------------------------------------------------------------\n\nexport interface ResolveSessionsRequest {\n agent_id: string;\n session_ids: string[];\n}\n\nexport interface ResolvedTicketOut {\n ticket_id: string;\n status: string;\n session_ids: string[];\n}\n\nexport interface ResolveSessionsResponse {\n tickets: ResolvedTicketOut[];\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport enum PRBEAgentErrorType {\n SERVER_ERROR = \"server_error\",\n NETWORK_ERROR = \"network_error\",\n CANCELLED = \"cancelled\",\n MAX_ITERATIONS = \"max_iterations\",\n}\n\nexport class PRBEAgentError extends Error {\n public readonly errorType: PRBEAgentErrorType;\n public readonly statusCode?: number;\n\n constructor(errorType: PRBEAgentErrorType, message: string, statusCode?: number) {\n super(message);\n this.name = \"PRBEAgentError\";\n this.errorType = errorType;\n this.statusCode = statusCode;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PII Redactor (pass-through stub, matches Swift SDK)\n// ---------------------------------------------------------------------------\n\nexport function redactPII(text: string): string {\n return text;\n}\n\n// ---------------------------------------------------------------------------\n// Static URLs\n// ---------------------------------------------------------------------------\n\nexport const API_URL = \"https://api.prbe.ai\";\nexport const MIDDLEWARE_URL = \"wss://middleware.prbe.ai\";\n","/**\n * serialization.ts — IPC-safe serialization of agent state\n *\n * Converts live PRBEAgentState (with Map, Date, EventEmitter) into\n * plain JSON-safe objects suitable for IPC or structured clone.\n */\n\nimport type { PRBEAgentState } from \"./state\";\nimport type {\n PRBEStatusEvent,\n PRBECRInvestigation,\n TicketInfoOut,\n ConversationEntry,\n} from \"./models\";\nimport type { InteractionPayload, ResolvedInteraction } from \"./interactions\";\n\n// ---------------------------------------------------------------------------\n// Serialized CR (Date → ISO string, safe for IPC)\n// ---------------------------------------------------------------------------\n\nexport interface PRBESerializedCR {\n id: string;\n query: string;\n slug?: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary?: string;\n errorMessage?: string;\n agentMessage?: string;\n startedAt: string; // ISO string\n pendingInteraction?: InteractionPayload;\n resolvedInteractions?: ResolvedInteraction[];\n}\n\n// ---------------------------------------------------------------------------\n// Serialized Ticket (pass-through — already plain)\n// ---------------------------------------------------------------------------\n\nexport type PRBESerializedTicket = TicketInfoOut;\n\n// ---------------------------------------------------------------------------\n// Serialized Completed Investigation (Date → ISO string)\n// ---------------------------------------------------------------------------\n\nexport interface PRBESerializedCompletedInvestigation {\n id: string;\n query: string;\n report: string;\n summary?: string;\n ticketId?: string;\n events: PRBEStatusEvent[];\n resolvedInteractions: ResolvedInteraction[];\n conversationHistory?: ConversationEntry[];\n completedAt: string; // ISO string\n}\n\n// ---------------------------------------------------------------------------\n// Full serialized state (no Map, Date, or EventEmitter)\n// ---------------------------------------------------------------------------\n\nexport interface PRBESerializedState {\n isInvestigating: boolean;\n events: PRBEStatusEvent[];\n report: string;\n summary?: string;\n currentQuery: string;\n investigationError?: string;\n pendingInteraction?: InteractionPayload;\n resolvedInteractions: ResolvedInteraction[];\n agentMessage?: string;\n conversationHistory: ConversationEntry[];\n completedInvestigations: PRBESerializedCompletedInvestigation[];\n activeCRs: PRBESerializedCR[];\n completedCRs: PRBESerializedCR[];\n trackedSessionIDs: string[];\n ticketInfo: PRBESerializedTicket[];\n hasActiveWork: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Default state (used before agent initializes)\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_PRBE_STATE: PRBESerializedState = {\n isInvestigating: false,\n events: [],\n report: \"\",\n summary: \"\",\n currentQuery: \"\",\n resolvedInteractions: [],\n conversationHistory: [],\n completedInvestigations: [],\n activeCRs: [],\n completedCRs: [],\n trackedSessionIDs: [],\n ticketInfo: [],\n hasActiveWork: false,\n};\n\n// ---------------------------------------------------------------------------\n// Converter: live state → IPC-safe plain object\n// ---------------------------------------------------------------------------\n\nfunction serializeCR(cr: PRBECRInvestigation): PRBESerializedCR {\n return {\n id: cr.id,\n query: cr.query,\n slug: cr.slug,\n ticketId: cr.ticketId,\n events: cr.events,\n isRunning: cr.isRunning,\n isCompleted: cr.isCompleted,\n isFailed: cr.isFailed,\n report: cr.report,\n summary: cr.summary,\n errorMessage: cr.errorMessage,\n agentMessage: cr.agentMessage,\n startedAt: cr.startedAt.toISOString(),\n pendingInteraction: cr.pendingInteraction,\n resolvedInteractions: cr.resolvedInteractions ?? [],\n };\n}\n\nexport function serializePRBEState(state: PRBEAgentState): PRBESerializedState {\n return {\n isInvestigating: state.isInvestigating,\n events: state.events,\n report: state.report,\n summary: state.summary,\n currentQuery: state.currentQuery,\n investigationError: state.investigationError,\n pendingInteraction: state.pendingInteraction,\n resolvedInteractions: state.resolvedInteractions,\n agentMessage: state.agentMessage,\n conversationHistory: state.conversationHistory,\n completedInvestigations: state.completedInvestigations.map((inv) => ({\n id: inv.id,\n query: inv.query,\n report: inv.report,\n summary: inv.summary,\n ticketId: inv.ticketId,\n events: inv.events,\n resolvedInteractions: inv.resolvedInteractions,\n conversationHistory: inv.conversationHistory,\n completedAt: inv.completedAt.toISOString(),\n })),\n activeCRs: Array.from(state.activeCRs.values()).map(serializeCR),\n completedCRs: state.completedCRs.map(serializeCR),\n trackedSessionIDs: state.trackedSessionIDs,\n ticketInfo: state.ticketInfo,\n hasActiveWork: state.hasActiveWork,\n };\n}\n","/**\n * state.ts — PRBEAgentState: EventEmitter-based observable investigation state\n *\n * Mirrors PRBEAgentState.swift but uses Node.js EventEmitter instead of Combine/@Published.\n * Host apps subscribe to events for UI updates.\n */\n\nimport { EventEmitter } from \"events\";\nimport { randomUUID } from \"crypto\";\nimport type {\n PRBEStatusEvent,\n PRBECRInvestigation,\n PRBECompletedInvestigation,\n TicketInfoOut,\n ConversationEntry,\n} from \"./models\";\nimport type { InteractionPayload, InteractionResponse, ResolvedInteraction } from \"./interactions\";\n\n// ---------------------------------------------------------------------------\n// Event types emitted by PRBEAgentState\n// ---------------------------------------------------------------------------\n\nexport enum PRBEStateEvent {\n /** Emitted on any state change. Payload: void */\n STATUS = \"status\",\n /** Emitted when a new event is appended. Payload: PRBEStatusEvent */\n EVENT = \"event\",\n /** Emitted when investigation completes. Payload: { report: string } */\n COMPLETE = \"complete\",\n /** Emitted on error. Payload: { message: string } */\n ERROR = \"error\",\n /** Emitted when a background CR starts. Payload: PRBECRInvestigation */\n CR_START = \"cr-start\",\n /** Emitted when a background CR completes/fails. Payload: PRBECRInvestigation */\n CR_COMPLETE = \"cr-complete\",\n /** Emitted when tracked ticket IDs change. Payload: string[] */\n TICKETS_CHANGED = \"tickets-changed\",\n /** Emitted when ticket info is updated. Payload: TicketInfoOut[] */\n TICKET_INFO = \"ticket-info\",\n /** Emitted when an interaction is requested. Payload: InteractionPayload */\n INTERACTION_REQUESTED = \"interaction-requested\",\n /** Emitted when an interaction is resolved. Payload: void */\n INTERACTION_RESOLVED = \"interaction-resolved\",\n /** Emitted when the agent sends a message to the user. Payload: { message: string } */\n AGENT_MESSAGE = \"agent-message\",\n}\n\n// ---------------------------------------------------------------------------\n// PRBEAgentState\n// ---------------------------------------------------------------------------\n\nexport class PRBEAgentState extends EventEmitter {\n // User-initiated investigation\n public isInvestigating = false;\n public events: PRBEStatusEvent[] = [];\n public report = \"\";\n public summary = \"\";\n public currentQuery = \"\";\n public investigationError?: string;\n public pendingInteraction?: InteractionPayload;\n public resolvedInteractions: ResolvedInteraction[] = [];\n public agentMessage?: string;\n public conversationHistory: ConversationEntry[] = [];\n\n // Completed user investigations (history)\n public completedInvestigations: PRBECompletedInvestigation[] = [];\n\n // Background context requests\n public activeCRs: Map<string, PRBECRInvestigation> = new Map();\n public completedCRs: PRBECRInvestigation[] = [];\n\n // Tracked tickets\n public trackedSessionIDs: string[] = [];\n public ticketInfo: TicketInfoOut[] = [];\n\n // Computed\n get hasActiveWork(): boolean {\n return this.isInvestigating || this.activeCRs.size > 0;\n }\n\n get activeCRCount(): number {\n return this.activeCRs.size;\n }\n\n get isActive(): boolean {\n return this.isInvestigating || this.report.length > 0 || this.investigationError != null;\n }\n\n // ---------- User investigation mutations ----------\n\n beginInvestigation(query: string): void {\n this.isInvestigating = true;\n this.events = [];\n this.resolvedInteractions = [];\n this.conversationHistory = [];\n this.report = \"\";\n this.summary = \"\";\n this.currentQuery = query;\n this.investigationError = undefined;\n this.agentMessage = undefined;\n this.emit(PRBEStateEvent.STATUS);\n }\n\n appendConversation(entry: ConversationEntry): void {\n this.conversationHistory.push(entry);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n resetInvestigation(): void {\n this.isInvestigating = false;\n this.events = [];\n this.resolvedInteractions = [];\n this.conversationHistory = [];\n this.report = \"\";\n this.summary = \"\";\n this.currentQuery = \"\";\n this.investigationError = undefined;\n this.pendingInteraction = undefined;\n this.agentMessage = undefined;\n this.emit(PRBEStateEvent.STATUS);\n }\n\n appendEvent(label: string, detail?: string, completed = false): void {\n // Mark previous event as completed before adding new one\n if (this.events.length > 0) {\n const last = this.events[this.events.length - 1];\n if (!last.isCompleted && !completed) {\n last.isCompleted = true;\n }\n }\n const event: PRBEStatusEvent = {\n id: randomUUID(),\n label,\n detail,\n isCompleted: completed,\n isExpanded: false,\n };\n this.events.push(event);\n this.emit(PRBEStateEvent.EVENT, event);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n attachObservation(text: string): void {\n if (this.events.length > 0) {\n this.events[this.events.length - 1].detail = text;\n this.emit(PRBEStateEvent.STATUS);\n }\n }\n\n completeInvestigation(report: string, ticketId?: string): void {\n if (this.events.length > 0) {\n this.events[this.events.length - 1].isCompleted = true;\n }\n this.appendEvent(\"Done\", undefined, true);\n\n // Save to history (snapshot events + interactions before reset)\n this.completedInvestigations.unshift({\n id: randomUUID(),\n query: this.currentQuery,\n report,\n ticketId,\n events: [...this.events],\n resolvedInteractions: [...this.resolvedInteractions],\n conversationHistory: [...this.conversationHistory],\n completedAt: new Date(),\n });\n\n this.report = report;\n this.isInvestigating = false;\n this.emit(PRBEStateEvent.COMPLETE, { report });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n failInvestigation(message: string): void {\n this.appendEvent(`Error: ${message}`);\n this.investigationError = message;\n this.isInvestigating = false;\n this.emit(PRBEStateEvent.ERROR, { message });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n // ---------- Interaction state mutations ----------\n\n setPendingInteraction(payload: InteractionPayload): void {\n this.pendingInteraction = payload;\n this.emit(PRBEStateEvent.INTERACTION_REQUESTED, payload);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n clearPendingInteraction(): void {\n this.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n setCRPendingInteraction(crID: string, payload: InteractionPayload): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n cr.pendingInteraction = payload;\n this.emit(PRBEStateEvent.INTERACTION_REQUESTED, payload);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n clearCRPendingInteraction(crID: string): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n cr.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n resolveInteraction(response: InteractionResponse): void {\n if (!this.pendingInteraction) return;\n this.resolvedInteractions.push({\n interactionId: this.pendingInteraction.interactionId,\n payload: this.pendingInteraction,\n response,\n eventIndex: this.events.length,\n });\n this.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n resolveCRInteraction(crID: string, response: InteractionResponse): void {\n const cr = this.activeCRs.get(crID);\n if (!cr || !cr.pendingInteraction) return;\n const resolved = cr.resolvedInteractions ?? [];\n resolved.push({\n interactionId: cr.pendingInteraction.interactionId,\n payload: cr.pendingInteraction,\n response,\n eventIndex: cr.events.length,\n });\n cr.resolvedInteractions = resolved;\n cr.pendingInteraction = undefined;\n this.emit(PRBEStateEvent.INTERACTION_RESOLVED);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n setAgentMessage(message: string): void {\n this.agentMessage = message;\n this.emit(PRBEStateEvent.AGENT_MESSAGE, { message });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n setCRAgentMessage(crID: string, message: string): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n cr.agentMessage = message;\n this.emit(PRBEStateEvent.AGENT_MESSAGE, { message });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n toggleExpansion(eventId: string): void {\n const event = this.events.find((e) => e.id === eventId);\n if (event) {\n event.isExpanded = !event.isExpanded;\n this.emit(PRBEStateEvent.STATUS);\n }\n }\n\n // ---------- CR state mutations ----------\n\n beginCR(id: string, query: string, slug?: string, ticketId?: string): void {\n const cr: PRBECRInvestigation = {\n id,\n query,\n slug,\n ticketId,\n events: [],\n resolvedInteractions: [],\n isRunning: true,\n isCompleted: false,\n isFailed: false,\n report: \"\",\n summary: \"\",\n startedAt: new Date(),\n };\n this.activeCRs.set(id, cr);\n this.emit(PRBEStateEvent.CR_START, cr);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n appendCREvent(crID: string, label: string, detail?: string, completed = false): void {\n const cr = this.activeCRs.get(crID);\n if (!cr) return;\n\n if (cr.events.length > 0) {\n const last = cr.events[cr.events.length - 1];\n if (!last.isCompleted && !completed) {\n last.isCompleted = true;\n }\n }\n cr.events.push({\n id: randomUUID(),\n label,\n detail,\n isCompleted: completed,\n isExpanded: false,\n });\n this.emit(PRBEStateEvent.STATUS);\n }\n\n attachCRObservation(crID: string, text: string): void {\n const cr = this.activeCRs.get(crID);\n if (!cr || cr.events.length === 0) return;\n cr.events[cr.events.length - 1].detail = text;\n this.emit(PRBEStateEvent.STATUS);\n }\n\n completeCR(id: string, report: string): void {\n const cr = this.activeCRs.get(id);\n if (!cr) return;\n\n this.activeCRs.delete(id);\n if (cr.events.length > 0) {\n cr.events[cr.events.length - 1].isCompleted = true;\n }\n cr.events.push({\n id: randomUUID(),\n label: \"Done\",\n isCompleted: true,\n isExpanded: false,\n });\n cr.isRunning = false;\n cr.isCompleted = true;\n cr.report = report;\n this.completedCRs.unshift(cr);\n this.emit(PRBEStateEvent.CR_COMPLETE, cr);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n failCR(id: string, message: string): void {\n const cr = this.activeCRs.get(id);\n if (!cr) return;\n\n this.activeCRs.delete(id);\n cr.events.push({\n id: randomUUID(),\n label: `Error: ${message}`,\n isCompleted: false,\n isExpanded: false,\n });\n cr.isRunning = false;\n cr.isFailed = true;\n cr.errorMessage = message;\n this.completedCRs.unshift(cr);\n this.emit(PRBEStateEvent.CR_COMPLETE, cr);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n // ---------- Tickets ----------\n\n updateTrackedSessionIDs(ids: string[]): void {\n this.trackedSessionIDs = ids;\n this.emit(PRBEStateEvent.TICKETS_CHANGED, ids);\n this.emit(PRBEStateEvent.STATUS);\n }\n\n updateTicketInfo(info: TicketInfoOut[]): void {\n this.ticketInfo = info;\n this.emit(PRBEStateEvent.TICKET_INFO, info);\n this.emit(PRBEStateEvent.STATUS);\n }\n}\n"],"mappings":"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","names":["InteractionType","WSMessageType","ToolParamType","ToolName","PRBEAgentConfigKey","PRBEAgentStatusType","PRBEAgentErrorType","PRBEStateEvent"]}
|
package/dist/types.mjs
CHANGED
|
@@ -11,6 +11,7 @@ var WSMessageType = /* @__PURE__ */ ((WSMessageType2) => {
|
|
|
11
11
|
WSMessageType2["START"] = "start";
|
|
12
12
|
WSMessageType2["TOOL_RESULT"] = "tool_result";
|
|
13
13
|
WSMessageType2["UPLOAD_REQUEST"] = "upload_request";
|
|
14
|
+
WSMessageType2["CONVERSATION_MESSAGE"] = "conversation_message";
|
|
14
15
|
WSMessageType2["CANCEL"] = "cancel";
|
|
15
16
|
WSMessageType2["PONG"] = "pong";
|
|
16
17
|
WSMessageType2["THOUGHT"] = "thought";
|
|
@@ -19,6 +20,7 @@ var WSMessageType = /* @__PURE__ */ ((WSMessageType2) => {
|
|
|
19
20
|
WSMessageType2["SERVER_OBSERVATION"] = "server_observation";
|
|
20
21
|
WSMessageType2["UPLOAD_URL"] = "upload_url";
|
|
21
22
|
WSMessageType2["SESSION_CONFIG"] = "session_config";
|
|
23
|
+
WSMessageType2["CONVERSATION_UPDATE"] = "conversation_update";
|
|
22
24
|
WSMessageType2["COMPLETE"] = "complete";
|
|
23
25
|
WSMessageType2["ERROR"] = "error";
|
|
24
26
|
WSMessageType2["PING"] = "ping";
|
|
@@ -57,6 +59,7 @@ var PRBEAgentConfigKey = /* @__PURE__ */ ((PRBEAgentConfigKey2) => {
|
|
|
57
59
|
PRBEAgentConfigKey2["IPC_MAIN"] = "ipcMain";
|
|
58
60
|
PRBEAgentConfigKey2["RENDERER_LOG_CHANNEL"] = "rendererLogChannel";
|
|
59
61
|
PRBEAgentConfigKey2["APP_DATA_PATH"] = "appDataPath";
|
|
62
|
+
PRBEAgentConfigKey2["SESSION_METADATA"] = "sessionMetadata";
|
|
60
63
|
return PRBEAgentConfigKey2;
|
|
61
64
|
})(PRBEAgentConfigKey || {});
|
|
62
65
|
var PRBEAgentStatusType = /* @__PURE__ */ ((PRBEAgentStatusType2) => {
|
|
@@ -88,6 +91,7 @@ var DEFAULT_PRBE_STATE = {
|
|
|
88
91
|
summary: "",
|
|
89
92
|
currentQuery: "",
|
|
90
93
|
resolvedInteractions: [],
|
|
94
|
+
conversationHistory: [],
|
|
91
95
|
completedInvestigations: [],
|
|
92
96
|
activeCRs: [],
|
|
93
97
|
completedCRs: [],
|