@prbe.ai/electron-sdk 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/index.d.mts +332 -0
  2. package/dist/index.d.ts +331 -20
  3. package/dist/index.js +2471 -69
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +2402 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/dist/types-DHT-JxMT.d.mts +401 -0
  8. package/dist/types-DHT-JxMT.d.ts +401 -0
  9. package/dist/types.d.mts +2 -0
  10. package/dist/types.d.ts +2 -14
  11. package/dist/types.js +160 -30
  12. package/dist/types.js.map +1 -1
  13. package/dist/types.mjs +125 -0
  14. package/dist/types.mjs.map +1 -0
  15. package/package.json +22 -12
  16. package/dist/agent.d.ts +0 -106
  17. package/dist/agent.d.ts.map +0 -1
  18. package/dist/agent.js +0 -878
  19. package/dist/agent.js.map +0 -1
  20. package/dist/assets/index.d.ts +0 -6
  21. package/dist/assets/index.d.ts.map +0 -1
  22. package/dist/assets/index.js +0 -13
  23. package/dist/assets/index.js.map +0 -1
  24. package/dist/electron/channels.d.ts +0 -21
  25. package/dist/electron/channels.d.ts.map +0 -1
  26. package/dist/electron/channels.js +0 -25
  27. package/dist/electron/channels.js.map +0 -1
  28. package/dist/electron/index.d.ts +0 -12
  29. package/dist/electron/index.d.ts.map +0 -1
  30. package/dist/electron/index.js +0 -22
  31. package/dist/electron/index.js.map +0 -1
  32. package/dist/electron/ipc-interaction-handler.d.ts +0 -21
  33. package/dist/electron/ipc-interaction-handler.d.ts.map +0 -1
  34. package/dist/electron/ipc-interaction-handler.js +0 -48
  35. package/dist/electron/ipc-interaction-handler.js.map +0 -1
  36. package/dist/electron/preload.d.ts +0 -20
  37. package/dist/electron/preload.d.ts.map +0 -1
  38. package/dist/electron/preload.js +0 -72
  39. package/dist/electron/preload.js.map +0 -1
  40. package/dist/electron/setup-handlers.d.ts +0 -30
  41. package/dist/electron/setup-handlers.d.ts.map +0 -1
  42. package/dist/electron/setup-handlers.js +0 -111
  43. package/dist/electron/setup-handlers.js.map +0 -1
  44. package/dist/electron/types.d.ts +0 -56
  45. package/dist/electron/types.d.ts.map +0 -1
  46. package/dist/electron/types.js +0 -9
  47. package/dist/electron/types.js.map +0 -1
  48. package/dist/index.d.ts.map +0 -1
  49. package/dist/interactions.d.ts +0 -63
  50. package/dist/interactions.d.ts.map +0 -1
  51. package/dist/interactions.js +0 -27
  52. package/dist/interactions.js.map +0 -1
  53. package/dist/models.d.ts +0 -218
  54. package/dist/models.d.ts.map +0 -1
  55. package/dist/models.js +0 -121
  56. package/dist/models.js.map +0 -1
  57. package/dist/serialization.d.ts +0 -51
  58. package/dist/serialization.d.ts.map +0 -1
  59. package/dist/serialization.js +0 -72
  60. package/dist/serialization.js.map +0 -1
  61. package/dist/state.d.ts +0 -70
  62. package/dist/state.d.ts.map +0 -1
  63. package/dist/state.js +0 -303
  64. package/dist/state.js.map +0 -1
  65. package/dist/tools/bash.d.ts +0 -30
  66. package/dist/tools/bash.d.ts.map +0 -1
  67. package/dist/tools/bash.js +0 -248
  68. package/dist/tools/bash.js.map +0 -1
  69. package/dist/tools/filesystem.d.ts +0 -63
  70. package/dist/tools/filesystem.d.ts.map +0 -1
  71. package/dist/tools/filesystem.js +0 -573
  72. package/dist/tools/filesystem.js.map +0 -1
  73. package/dist/tools/index.d.ts +0 -46
  74. package/dist/tools/index.d.ts.map +0 -1
  75. package/dist/tools/index.js +0 -171
  76. package/dist/tools/index.js.map +0 -1
  77. package/dist/tools/interactive.d.ts +0 -15
  78. package/dist/tools/interactive.d.ts.map +0 -1
  79. package/dist/tools/interactive.js +0 -58
  80. package/dist/tools/interactive.js.map +0 -1
  81. package/dist/tools/logs.d.ts +0 -72
  82. package/dist/tools/logs.d.ts.map +0 -1
  83. package/dist/tools/logs.js +0 -366
  84. package/dist/tools/logs.js.map +0 -1
  85. package/dist/types.d.ts.map +0 -1
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,sDAAsD;AACtD,+CAYwB;AAXtB,+GAAA,eAAe,OAAA;AAajB,kEAAkE;AAClE,mCA0BkB;AAzBhB,uGAAA,aAAa,OAAA;AAEb,uGAAA,aAAa,OAAA;AACb,kGAAA,QAAQ,OAAA;AAGR,4GAAA,kBAAkB,OAAA;AAElB,6GAAA,mBAAmB,OAAA;AAEnB,4GAAA,kBAAkB,OAAA;AAalB,iGAAA,OAAO,OAAA;AACP,wGAAA,cAAc,OAAA;AAGhB,iEAAiE;AACjE,iDAMyB;AADvB,mHAAA,kBAAkB,OAAA;AAGpB,gEAAgE;AAChE,iCAAyC;AAAhC,uGAAA,cAAc,OAAA"}
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} 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"]}
package/dist/types.mjs ADDED
@@ -0,0 +1,125 @@
1
+ // src/interactions.ts
2
+ var InteractionType = /* @__PURE__ */ ((InteractionType2) => {
3
+ InteractionType2["ASK_QUESTION"] = "ask_question";
4
+ InteractionType2["REQUEST_PERMISSION"] = "request_permission";
5
+ InteractionType2["REQUEST_PATH_ACCESS"] = "request_path_access";
6
+ return InteractionType2;
7
+ })(InteractionType || {});
8
+
9
+ // src/models.ts
10
+ var WSMessageType = /* @__PURE__ */ ((WSMessageType2) => {
11
+ WSMessageType2["START"] = "start";
12
+ WSMessageType2["TOOL_RESULT"] = "tool_result";
13
+ WSMessageType2["UPLOAD_REQUEST"] = "upload_request";
14
+ WSMessageType2["CANCEL"] = "cancel";
15
+ WSMessageType2["PONG"] = "pong";
16
+ WSMessageType2["THOUGHT"] = "thought";
17
+ WSMessageType2["TOOL_CALL"] = "tool_call";
18
+ WSMessageType2["SERVER_TOOL_CALL"] = "server_tool_call";
19
+ WSMessageType2["SERVER_OBSERVATION"] = "server_observation";
20
+ WSMessageType2["UPLOAD_URL"] = "upload_url";
21
+ WSMessageType2["SESSION_CONFIG"] = "session_config";
22
+ WSMessageType2["COMPLETE"] = "complete";
23
+ WSMessageType2["ERROR"] = "error";
24
+ WSMessageType2["PING"] = "ping";
25
+ return WSMessageType2;
26
+ })(WSMessageType || {});
27
+ var ToolParamType = /* @__PURE__ */ ((ToolParamType2) => {
28
+ ToolParamType2["STRING"] = "STRING";
29
+ ToolParamType2["BOOLEAN"] = "BOOLEAN";
30
+ ToolParamType2["INTEGER"] = "INTEGER";
31
+ return ToolParamType2;
32
+ })(ToolParamType || {});
33
+ var ToolName = /* @__PURE__ */ ((ToolName2) => {
34
+ ToolName2["CLIENT_LIST_DIRECTORY"] = "client_list_directory";
35
+ ToolName2["CLIENT_READ_FILE"] = "client_read_file";
36
+ ToolName2["CLIENT_SEARCH_CONTENT"] = "client_search_content";
37
+ ToolName2["CLIENT_FIND_FILES"] = "client_find_files";
38
+ ToolName2["CLIENT_FLAG_FILE"] = "client_flag_file";
39
+ ToolName2["CLIENT_READ_APP_LOGS"] = "client_read_app_logs";
40
+ ToolName2["CLIENT_SEARCH_APP_LOGS"] = "client_search_app_logs";
41
+ ToolName2["CLIENT_CLEAR_APP_LOGS"] = "client_clear_app_logs";
42
+ ToolName2["CLIENT_FLAG_APP_LOGS"] = "client_flag_app_logs";
43
+ ToolName2["CLIENT_ASK_USER"] = "client_ask_user";
44
+ ToolName2["CLIENT_BASH_EXECUTE"] = "client_bash_execute";
45
+ return ToolName2;
46
+ })(ToolName || {});
47
+ var PRBEAgentConfigKey = /* @__PURE__ */ ((PRBEAgentConfigKey2) => {
48
+ PRBEAgentConfigKey2["API_KEY"] = "apiKey";
49
+ PRBEAgentConfigKey2["AUTO_APPROVED_DIRS"] = "autoApprovedDirs";
50
+ PRBEAgentConfigKey2["POLLING_INTERVAL"] = "pollingInterval";
51
+ PRBEAgentConfigKey2["MAX_LOG_ENTRIES"] = "maxLogEntries";
52
+ PRBEAgentConfigKey2["CAPTURE_CONSOLE"] = "captureConsole";
53
+ PRBEAgentConfigKey2["BACKGROUND_POLLING"] = "backgroundPolling";
54
+ PRBEAgentConfigKey2["INTERACTION_HANDLER"] = "interactionHandler";
55
+ PRBEAgentConfigKey2["ELECTRON_LOG"] = "electronLog";
56
+ PRBEAgentConfigKey2["IPC_MAIN"] = "ipcMain";
57
+ PRBEAgentConfigKey2["RENDERER_LOG_CHANNEL"] = "rendererLogChannel";
58
+ PRBEAgentConfigKey2["APP_DATA_PATH"] = "appDataPath";
59
+ return PRBEAgentConfigKey2;
60
+ })(PRBEAgentConfigKey || {});
61
+ var PRBEAgentStatusType = /* @__PURE__ */ ((PRBEAgentStatusType2) => {
62
+ PRBEAgentStatusType2["STARTED"] = "started";
63
+ PRBEAgentStatusType2["THINKING"] = "thinking";
64
+ PRBEAgentStatusType2["TOOL_CALL"] = "tool_call";
65
+ PRBEAgentStatusType2["THOUGHT"] = "thought";
66
+ PRBEAgentStatusType2["OBSERVATION"] = "observation";
67
+ PRBEAgentStatusType2["COMPLETED"] = "completed";
68
+ PRBEAgentStatusType2["ERROR"] = "error";
69
+ PRBEAgentStatusType2["AWAITING_INTERACTION"] = "awaiting_interaction";
70
+ return PRBEAgentStatusType2;
71
+ })(PRBEAgentStatusType || {});
72
+ var PRBEAgentErrorType = /* @__PURE__ */ ((PRBEAgentErrorType2) => {
73
+ PRBEAgentErrorType2["SERVER_ERROR"] = "server_error";
74
+ PRBEAgentErrorType2["NETWORK_ERROR"] = "network_error";
75
+ PRBEAgentErrorType2["CANCELLED"] = "cancelled";
76
+ PRBEAgentErrorType2["MAX_ITERATIONS"] = "max_iterations";
77
+ return PRBEAgentErrorType2;
78
+ })(PRBEAgentErrorType || {});
79
+ var API_URL = "https://api.prbe.ai";
80
+ var MIDDLEWARE_URL = "wss://middleware.prbe.ai";
81
+
82
+ // src/serialization.ts
83
+ var DEFAULT_PRBE_STATE = {
84
+ isInvestigating: false,
85
+ events: [],
86
+ report: "",
87
+ summary: "",
88
+ currentQuery: "",
89
+ resolvedInteractions: [],
90
+ completedInvestigations: [],
91
+ activeCRs: [],
92
+ completedCRs: [],
93
+ trackedTicketIDs: [],
94
+ ticketInfo: [],
95
+ hasActiveWork: false
96
+ };
97
+
98
+ // src/state.ts
99
+ var PRBEStateEvent = /* @__PURE__ */ ((PRBEStateEvent2) => {
100
+ PRBEStateEvent2["STATUS"] = "status";
101
+ PRBEStateEvent2["EVENT"] = "event";
102
+ PRBEStateEvent2["COMPLETE"] = "complete";
103
+ PRBEStateEvent2["ERROR"] = "error";
104
+ PRBEStateEvent2["CR_START"] = "cr-start";
105
+ PRBEStateEvent2["CR_COMPLETE"] = "cr-complete";
106
+ PRBEStateEvent2["TICKETS_CHANGED"] = "tickets-changed";
107
+ PRBEStateEvent2["TICKET_INFO"] = "ticket-info";
108
+ PRBEStateEvent2["INTERACTION_REQUESTED"] = "interaction-requested";
109
+ PRBEStateEvent2["INTERACTION_RESOLVED"] = "interaction-resolved";
110
+ return PRBEStateEvent2;
111
+ })(PRBEStateEvent || {});
112
+ export {
113
+ API_URL,
114
+ DEFAULT_PRBE_STATE,
115
+ InteractionType,
116
+ MIDDLEWARE_URL,
117
+ PRBEAgentConfigKey,
118
+ PRBEAgentErrorType,
119
+ PRBEAgentStatusType,
120
+ PRBEStateEvent,
121
+ ToolName,
122
+ ToolParamType,
123
+ WSMessageType
124
+ };
125
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +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"]}
package/package.json CHANGED
@@ -1,26 +1,35 @@
1
1
  {
2
2
  "name": "@prbe.ai/electron-sdk",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "PRBE debug agent SDK for Electron apps",
5
5
  "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
6
7
  "types": "dist/index.d.ts",
7
8
  "exports": {
8
9
  ".": {
9
- "types": "./dist/index.d.ts",
10
- "default": "./dist/index.js"
10
+ "import": {
11
+ "types": "./dist/index.d.mts",
12
+ "default": "./dist/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
11
18
  },
12
19
  "./types": {
13
- "types": "./dist/types.d.ts",
14
- "default": "./dist/types.js"
15
- },
16
- "./electron": {
17
- "types": "./dist/electron/index.d.ts",
18
- "default": "./dist/electron/index.js"
20
+ "import": {
21
+ "types": "./dist/types.d.mts",
22
+ "default": "./dist/types.mjs"
23
+ },
24
+ "require": {
25
+ "types": "./dist/types.d.ts",
26
+ "default": "./dist/types.js"
27
+ }
19
28
  },
20
29
  "./assets/*": "./src/assets/*"
21
30
  },
22
31
  "scripts": {
23
- "build": "tsc",
32
+ "build": "tsup",
24
33
  "typecheck": "tsc --noEmit",
25
34
  "clean": "rm -rf dist"
26
35
  },
@@ -33,7 +42,8 @@
33
42
  "node": ">=18"
34
43
  },
35
44
  "devDependencies": {
36
- "typescript": "^5.7.0",
37
- "@types/node": "^20.0.0"
45
+ "@types/node": "^20.0.0",
46
+ "tsup": "^8.5.1",
47
+ "typescript": "^5.7.0"
38
48
  }
39
49
  }
package/dist/agent.d.ts DELETED
@@ -1,106 +0,0 @@
1
- /**
2
- * agent.ts — PRBEAgent class
3
- *
4
- * Main entry point for the PRBE debug agent SDK.
5
- * Handles WebSocket connection to middleware, investigation lifecycle,
6
- * background polling for context requests, file uploads, and persistence.
7
- *
8
- * Mirrors PRBEAgent.swift behavior.
9
- */
10
- import type { PRBEAgentConfig, PRBEToolParameter, PollResponse, TicketInfoOut } from "./models";
11
- import { PRBEAgentState } from "./state";
12
- import { PRBELogCapture } from "./tools/logs";
13
- import { InvestigationSource } from "./interactions";
14
- import type { PRBEInteractionRequester, InteractionPayload, InteractionResponse } from "./interactions";
15
- export declare class PRBEAgent implements PRBEInteractionRequester {
16
- readonly state: PRBEAgentState;
17
- readonly logCapture: PRBELogCapture;
18
- private readonly config;
19
- private readonly appDataPath?;
20
- private readonly interactionHandler?;
21
- private readonly registry;
22
- private readonly grantedPaths;
23
- private userCancelled;
24
- private activeWS;
25
- private pollingTimer;
26
- private persistedData;
27
- private fetchAbortController;
28
- private currentInvestigationSource;
29
- private currentCRId;
30
- /** Files flagged during the current tool call — uploaded immediately after the tool returns. */
31
- private pendingFlaggedFiles;
32
- private get agentID();
33
- private get trackedTicketIDs();
34
- private set trackedTicketIDs(value);
35
- private get respondedCRIDs();
36
- private set respondedCRIDs(value);
37
- private syncPolling;
38
- private addTrackedTicket;
39
- constructor(config: PRBEAgentConfig);
40
- private hookElectronLog;
41
- private hookRendererLogs;
42
- private static mapElectronLogLevel;
43
- get investigationSource(): InvestigationSource;
44
- requestUserInteraction(payload: InteractionPayload): Promise<InteractionResponse>;
45
- /**
46
- * Add an additional root directory to the runtime allowed roots.
47
- */
48
- addAutoApprovedDir(rootPath: string): void;
49
- /**
50
- * Register a custom tool that the middleware can invoke during investigations.
51
- */
52
- registerTool(name: string, description: string, parameters: PRBEToolParameter[], handler: (args: Record<string, unknown>) => Promise<string>): void;
53
- /**
54
- * User-initiated investigation. Updates `state` events/report directly.
55
- */
56
- investigate(query: string, contextRequestID?: string): Promise<void>;
57
- /**
58
- * Cancel user-initiated investigation only (does not cancel background CRs).
59
- */
60
- cancelInvestigation(): void;
61
- /**
62
- * Cancel everything — user investigation and polling.
63
- */
64
- cancel(): void;
65
- /**
66
- * Poll the backend for context requests on tracked tickets.
67
- */
68
- poll(): Promise<PollResponse | null>;
69
- /**
70
- * Fetch ticket display info for all tracked tickets.
71
- */
72
- fetchTicketInfo(): Promise<TicketInfoOut[]>;
73
- stopPolling(): void;
74
- resumePolling(): void;
75
- /**
76
- * Destroy the agent — stops polling, stops console capture, closes WS.
77
- */
78
- destroy(): void;
79
- /**
80
- * Reset all persisted data (agent ID, tracked tickets, responded CRs).
81
- * Also clears in-memory state.
82
- */
83
- resetPersistedData(): void;
84
- /**
85
- * Delete the persisted data file. Can be called without an agent instance.
86
- */
87
- static clearPersistedData(): void;
88
- private investigateForCR;
89
- private connectToProxy;
90
- private sendCancel;
91
- private extractArgs;
92
- private extractUploadPrefix;
93
- private static backgroundUpload;
94
- private startPolling;
95
- /**
96
- * Abort all in-flight fetch requests to prevent orphaned DNS lookups
97
- * that can crash the c-ares resolver during process shutdown.
98
- */
99
- private abortInFlightRequests;
100
- /**
101
- * Get an AbortSignal for fetch requests. Creates a new controller if needed.
102
- */
103
- private getFetchSignal;
104
- private post;
105
- }
106
- //# sourceMappingURL=agent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}