@prbe.ai/electron-sdk 0.1.6 → 0.1.8

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.
@@ -186,6 +186,7 @@ type PRBEAgentStatus = {
186
186
  type: PRBEAgentStatusType.COMPLETED;
187
187
  report: string;
188
188
  userSummary: string;
189
+ ticketId?: string;
189
190
  } | {
190
191
  type: PRBEAgentStatusType.ERROR;
191
192
  message: string;
@@ -248,6 +249,7 @@ interface PRBECRInvestigation {
248
249
  id: string;
249
250
  query: string;
250
251
  slug?: string;
252
+ ticketId?: string;
251
253
  events: PRBEStatusEvent[];
252
254
  isRunning: boolean;
253
255
  isCompleted: boolean;
@@ -264,6 +266,9 @@ interface PRBECompletedInvestigation {
264
266
  query: string;
265
267
  report: string;
266
268
  summary: string;
269
+ ticketId?: string;
270
+ events: PRBEStatusEvent[];
271
+ resolvedInteractions: ResolvedInteraction[];
267
272
  completedAt: Date;
268
273
  }
269
274
  declare enum PRBEAgentErrorType {
@@ -331,7 +336,7 @@ declare class PRBEAgentState extends EventEmitter {
331
336
  resetInvestigation(): void;
332
337
  appendEvent(label: string, detail?: string, completed?: boolean): void;
333
338
  attachObservation(text: string): void;
334
- completeInvestigation(report: string, summary: string): void;
339
+ completeInvestigation(report: string, summary: string, ticketId?: string): void;
335
340
  failInvestigation(message: string): void;
336
341
  setPendingInteraction(payload: InteractionPayload): void;
337
342
  clearPendingInteraction(): void;
@@ -340,7 +345,7 @@ declare class PRBEAgentState extends EventEmitter {
340
345
  resolveInteraction(response: InteractionResponse): void;
341
346
  resolveCRInteraction(crID: string, response: InteractionResponse): void;
342
347
  toggleExpansion(eventId: string): void;
343
- beginCR(id: string, query: string, slug?: string): void;
348
+ beginCR(id: string, query: string, slug?: string, ticketId?: string): void;
344
349
  appendCREvent(crID: string, label: string, detail?: string, completed?: boolean): void;
345
350
  attachCRObservation(crID: string, text: string): void;
346
351
  completeCR(id: string, report: string, summary: string): void;
@@ -360,6 +365,7 @@ interface PRBESerializedCR {
360
365
  id: string;
361
366
  query: string;
362
367
  slug?: string;
368
+ ticketId?: string;
363
369
  events: PRBEStatusEvent[];
364
370
  isRunning: boolean;
365
371
  isCompleted: boolean;
@@ -377,6 +383,9 @@ interface PRBESerializedCompletedInvestigation {
377
383
  query: string;
378
384
  report: string;
379
385
  summary: string;
386
+ ticketId?: string;
387
+ events: PRBEStatusEvent[];
388
+ resolvedInteractions: ResolvedInteraction[];
380
389
  completedAt: string;
381
390
  }
382
391
  interface PRBESerializedState {
@@ -186,6 +186,7 @@ type PRBEAgentStatus = {
186
186
  type: PRBEAgentStatusType.COMPLETED;
187
187
  report: string;
188
188
  userSummary: string;
189
+ ticketId?: string;
189
190
  } | {
190
191
  type: PRBEAgentStatusType.ERROR;
191
192
  message: string;
@@ -248,6 +249,7 @@ interface PRBECRInvestigation {
248
249
  id: string;
249
250
  query: string;
250
251
  slug?: string;
252
+ ticketId?: string;
251
253
  events: PRBEStatusEvent[];
252
254
  isRunning: boolean;
253
255
  isCompleted: boolean;
@@ -264,6 +266,9 @@ interface PRBECompletedInvestigation {
264
266
  query: string;
265
267
  report: string;
266
268
  summary: string;
269
+ ticketId?: string;
270
+ events: PRBEStatusEvent[];
271
+ resolvedInteractions: ResolvedInteraction[];
267
272
  completedAt: Date;
268
273
  }
269
274
  declare enum PRBEAgentErrorType {
@@ -331,7 +336,7 @@ declare class PRBEAgentState extends EventEmitter {
331
336
  resetInvestigation(): void;
332
337
  appendEvent(label: string, detail?: string, completed?: boolean): void;
333
338
  attachObservation(text: string): void;
334
- completeInvestigation(report: string, summary: string): void;
339
+ completeInvestigation(report: string, summary: string, ticketId?: string): void;
335
340
  failInvestigation(message: string): void;
336
341
  setPendingInteraction(payload: InteractionPayload): void;
337
342
  clearPendingInteraction(): void;
@@ -340,7 +345,7 @@ declare class PRBEAgentState extends EventEmitter {
340
345
  resolveInteraction(response: InteractionResponse): void;
341
346
  resolveCRInteraction(crID: string, response: InteractionResponse): void;
342
347
  toggleExpansion(eventId: string): void;
343
- beginCR(id: string, query: string, slug?: string): void;
348
+ beginCR(id: string, query: string, slug?: string, ticketId?: string): void;
344
349
  appendCREvent(crID: string, label: string, detail?: string, completed?: boolean): void;
345
350
  attachCRObservation(crID: string, text: string): void;
346
351
  completeCR(id: string, report: string, summary: string): void;
@@ -360,6 +365,7 @@ interface PRBESerializedCR {
360
365
  id: string;
361
366
  query: string;
362
367
  slug?: string;
368
+ ticketId?: string;
363
369
  events: PRBEStatusEvent[];
364
370
  isRunning: boolean;
365
371
  isCompleted: boolean;
@@ -377,6 +383,9 @@ interface PRBESerializedCompletedInvestigation {
377
383
  query: string;
378
384
  report: string;
379
385
  summary: string;
386
+ ticketId?: string;
387
+ events: PRBEStatusEvent[];
388
+ resolvedInteractions: ResolvedInteraction[];
380
389
  completedAt: string;
381
390
  }
382
391
  interface PRBESerializedState {
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, j as InteractionType, k as InvestigationResult, M as MIDDLEWARE_URL, d as PRBEAgentConfig, l as PRBEAgentConfigKey, n as PRBEAgentErrorType, o as PRBEAgentStatus, p as PRBEAgentStatusType, q as PRBECRInvestigation, r as PRBECompletedInvestigation, s as PRBEInteractionHandler, b as PRBEInteractionRequester, t as PRBESerializedCR, u as PRBESerializedCompletedInvestigation, v as PRBESerializedState, w as PRBESerializedTicket, x as PRBEStateEvent, y as PRBEStatusEvent, P as PRBEToolDeclaration, a as PRBEToolParameter, z as PollRequest, g as PollResponse, R as RequestPathAccessPayload, B as RequestPathAccessResponse, E as RequestPermissionPayload, G as RequestPermissionResponse, H as ResolvedInteraction, T as TicketInfoOut, J as TicketInfoRequest, K as TicketInfoResponse, L as TicketStatusOut, N as ToolName, O as ToolParamType, W as WSMessage, Q as WSMessageType } from './types-DHT-JxMT.mjs';
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, j as InteractionType, k as InvestigationResult, M as MIDDLEWARE_URL, d as PRBEAgentConfig, l as PRBEAgentConfigKey, n as PRBEAgentErrorType, o as PRBEAgentStatus, p as PRBEAgentStatusType, q as PRBECRInvestigation, r as PRBECompletedInvestigation, s as PRBEInteractionHandler, b as PRBEInteractionRequester, t as PRBESerializedCR, u as PRBESerializedCompletedInvestigation, v as PRBESerializedState, w as PRBESerializedTicket, x as PRBEStateEvent, y as PRBEStatusEvent, P as PRBEToolDeclaration, a as PRBEToolParameter, z as PollRequest, g as PollResponse, R as RequestPathAccessPayload, B as RequestPathAccessResponse, E as RequestPermissionPayload, G as RequestPermissionResponse, H as ResolvedInteraction, T as TicketInfoOut, J as TicketInfoRequest, K as TicketInfoResponse, L as TicketStatusOut, N as ToolName, O as ToolParamType, W as WSMessage, Q as WSMessageType } from './types-CwYRJCG0.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, j as InteractionType, k as InvestigationResult, M as MIDDLEWARE_URL, d as PRBEAgentConfig, l as PRBEAgentConfigKey, n as PRBEAgentErrorType, o as PRBEAgentStatus, p as PRBEAgentStatusType, q as PRBECRInvestigation, r as PRBECompletedInvestigation, s as PRBEInteractionHandler, b as PRBEInteractionRequester, t as PRBESerializedCR, u as PRBESerializedCompletedInvestigation, v as PRBESerializedState, w as PRBESerializedTicket, x as PRBEStateEvent, y as PRBEStatusEvent, P as PRBEToolDeclaration, a as PRBEToolParameter, z as PollRequest, g as PollResponse, R as RequestPathAccessPayload, B as RequestPathAccessResponse, E as RequestPermissionPayload, G as RequestPermissionResponse, H as ResolvedInteraction, T as TicketInfoOut, J as TicketInfoRequest, K as TicketInfoResponse, L as TicketStatusOut, N as ToolName, O as ToolParamType, W as WSMessage, Q as WSMessageType } from './types-DHT-JxMT.js';
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, j as InteractionType, k as InvestigationResult, M as MIDDLEWARE_URL, d as PRBEAgentConfig, l as PRBEAgentConfigKey, n as PRBEAgentErrorType, o as PRBEAgentStatus, p as PRBEAgentStatusType, q as PRBECRInvestigation, r as PRBECompletedInvestigation, s as PRBEInteractionHandler, b as PRBEInteractionRequester, t as PRBESerializedCR, u as PRBESerializedCompletedInvestigation, v as PRBESerializedState, w as PRBESerializedTicket, x as PRBEStateEvent, y as PRBEStatusEvent, P as PRBEToolDeclaration, a as PRBEToolParameter, z as PollRequest, g as PollResponse, R as RequestPathAccessPayload, B as RequestPathAccessResponse, E as RequestPermissionPayload, G as RequestPermissionResponse, H as ResolvedInteraction, T as TicketInfoOut, J as TicketInfoRequest, K as TicketInfoResponse, L as TicketStatusOut, N as ToolName, O as ToolParamType, W as WSMessage, Q as WSMessageType } from './types-CwYRJCG0.js';
2
2
  import 'events';
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}\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 }\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}\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 events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary: string;\n errorMessage?: 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 completedAt: Date;\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 events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary: string;\n errorMessage?: 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 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 completedInvestigations: PRBESerializedCompletedInvestigation[];\n activeCRs: PRBESerializedCR[];\n completedCRs: PRBESerializedCR[];\n trackedTicketIDs: 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 trackedTicketIDs: [],\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 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 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 completedInvestigations: state.completedInvestigations.map((inv) => ({\n id: inv.id,\n query: inv.query,\n report: inv.report,\n summary: inv.summary,\n completedAt: inv.completedAt.toISOString(),\n })),\n activeCRs: Array.from(state.activeCRs.values()).map(serializeCR),\n completedCRs: state.completedCRs.map(serializeCR),\n trackedTicketIDs: state.trackedTicketIDs,\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}\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\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 trackedTicketIDs: 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.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.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): 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\n this.completedInvestigations.unshift({\n id: randomUUID(),\n query: this.currentQuery,\n report,\n summary,\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 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): void {\n const cr: PRBECRInvestigation = {\n id,\n query,\n slug,\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 updateTrackedTicketIDs(ids: string[]): void {\n this.trackedTicketIDs = 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 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}\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}\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 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// 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 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 completedInvestigations: PRBESerializedCompletedInvestigation[];\n activeCRs: PRBESerializedCR[];\n completedCRs: PRBESerializedCR[];\n trackedTicketIDs: 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 trackedTicketIDs: [],\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 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 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 trackedTicketIDs: state.trackedTicketIDs,\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}\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\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 trackedTicketIDs: 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.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.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 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 updateTrackedTicketIDs(ids: string[]): void {\n this.trackedTicketIDs = 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 +1 @@
1
- {"version":3,"sources":["../src/interactions.ts","../src/models.ts","../src/serialization.ts","../src/state.ts"],"sourcesContent":["/**\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}\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 }\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}\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 events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary: string;\n errorMessage?: 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 completedAt: Date;\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 events: PRBEStatusEvent[];\n isRunning: boolean;\n isCompleted: boolean;\n isFailed: boolean;\n report: string;\n summary: string;\n errorMessage?: 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 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 completedInvestigations: PRBESerializedCompletedInvestigation[];\n activeCRs: PRBESerializedCR[];\n completedCRs: PRBESerializedCR[];\n trackedTicketIDs: 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 trackedTicketIDs: [],\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 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 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 completedInvestigations: state.completedInvestigations.map((inv) => ({\n id: inv.id,\n query: inv.query,\n report: inv.report,\n summary: inv.summary,\n completedAt: inv.completedAt.toISOString(),\n })),\n activeCRs: Array.from(state.activeCRs.values()).map(serializeCR),\n completedCRs: state.completedCRs.map(serializeCR),\n trackedTicketIDs: state.trackedTicketIDs,\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}\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\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 trackedTicketIDs: 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.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.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): 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\n this.completedInvestigations.unshift({\n id: randomUUID(),\n query: this.currentQuery,\n report,\n summary,\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 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): void {\n const cr: PRBECRInvestigation = {\n id,\n query,\n slug,\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 updateTrackedTicketIDs(ids: string[]): void {\n this.trackedTicketIDs = 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/interactions.ts","../src/models.ts","../src/serialization.ts","../src/state.ts"],"sourcesContent":["/**\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}\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}\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 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// 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 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 completedInvestigations: PRBESerializedCompletedInvestigation[];\n activeCRs: PRBESerializedCR[];\n completedCRs: PRBESerializedCR[];\n trackedTicketIDs: 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 trackedTicketIDs: [],\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 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 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 trackedTicketIDs: state.trackedTicketIDs,\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}\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\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 trackedTicketIDs: 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.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.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 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 updateTrackedTicketIDs(ids: string[]): void {\n this.trackedTicketIDs = 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prbe.ai/electron-sdk",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "PRBE debug agent SDK for Electron apps",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",