{"name":"govops-backend","transport":"websocket","wsPath":"/ws","methods":{"system.health":{"description":"Return server health details","auth":"public","params":{},"tags":["system"]},"system.describe":{"description":"Describe available JSON-RPC methods","auth":"public","params":{},"tags":["system"]},"auth.login":{"description":"Authenticate against MongoDB and store the session on the socket","auth":"public","params":{"identity":"string","password":"string"},"tags":["auth"]},"auth.refresh":{"description":"Refresh the active auth session token","auth":"public","params":{"token":"string"},"tags":["auth"]},"auth.me":{"description":"Return the active authenticated user","auth":"required","params":{},"tags":["auth"]},"auth.updateProfile":{"description":"Update the current user's profile fields (username, name, title, phone)","auth":"required","params":{},"tags":["auth"]},"auth.logout":{"description":"Clear the active WebSocket session","auth":"required","params":{},"tags":["auth"]},"company.get":{"description":"Get the current user's company profile (creates a blank one if absent)","auth":"required","params":{},"tags":["company"]},"company.save":{"description":"Persist company profile fields used for AI search/analysis/matching","auth":"required","params":{},"tags":["company"]},"company.pastProjects.list":{"description":"List past performance projects for the current company","auth":"required","params":{},"tags":["company"]},"company.pastProjects.save":{"description":"Create or update a past performance project","auth":"required","params":{},"tags":["company"]},"company.pastProjects.remove":{"description":"Remove a past performance project","auth":"required","params":{},"tags":["company"]},"company.pastProjects.extract":{"description":"Run LLM extraction on a document's text to pre-fill a past performance project","auth":"required","params":{},"tags":["company"]},"auth.tokens.create":{"description":"Mint a long-lived API token for a worker or integration. Raw token returned only once.","auth":"required","params":{},"tags":["auth"]},"auth.tokens.list":{"description":"List API tokens owned by the current user (raw token omitted).","auth":"required","params":{},"tags":["auth"]},"auth.tokens.revoke":{"description":"Revoke an API token by id. Worker calls using that token will be rejected immediately.","auth":"required","params":{},"tags":["auth"]},"files.downloadRemote":{"description":"Download a remote file and store it in S3 and MongoDB","auth":"required","params":{},"tags":["files"]},"files.put":{"description":"Store provided content in S3 and MongoDB","auth":"required","params":{},"tags":["files"]},"files.get":{"description":"Get MongoDB metadata for a stored file and optional S3 access information","auth":"required","params":{},"tags":["files"]},"files.presign":{"description":"Generate a presigned download URL for an S3 object","auth":"required","params":{},"tags":["files"]},"files.delete":{"description":"Delete a file from S3 and MongoDB","auth":"required","params":{},"tags":["files"]},"realtime.subscribe":{"description":"Subscribe the current socket to one or more realtime topics","auth":"public","params":{},"tags":["realtime"]},"realtime.unsubscribe":{"description":"Unsubscribe the current socket from one or more realtime topics","auth":"public","params":{},"tags":["realtime"]},"realtime.listSubscriptions":{"description":"List the active realtime topic subscriptions for this socket","auth":"public","params":{},"tags":["realtime"]},"agents.listSites":{"description":"List supported opportunity agents and their criteria fields","auth":"public","params":{},"tags":["agents"]},"agents.saveCriteria":{"description":"Persist and optionally refine search criteria for a site agent","auth":"required","params":{},"tags":["agents"]},"agents.listCriteria":{"description":"List stored search criteria profiles","auth":"required","params":{},"tags":["agents"]},"agents.refineCriteria":{"description":"Refine criteria for a site profile or ad hoc site criteria","auth":"required","params":{},"tags":["agents"]},"agents.runSearch":{"description":"Run a site agent search from stored or ad hoc criteria and optionally persist the results","auth":"required","params":{},"tags":["agents"]},"agents.runAdHocSearch":{"description":"Fan out an ad-hoc search across all enabled Sites or an explicit list of site kinds","auth":"required","params":{},"tags":["agents"]},"agents.enqueueIngestOpportunity":{"description":"Queue a background ingest job for an opportunity","auth":"required","params":{},"tags":["agents"]},"agents.listOpportunities":{"description":"List stored opportunities gathered by the agent workflows","auth":"required","params":{},"tags":["agents"]},"agents.ingestOpportunity":{"description":"Fetch full opportunity details, discover references, store support documents, and build markdown analysis","auth":"required","params":{},"tags":["agents"]},"agents.syncOpportunity":{"description":"Refresh one stored opportunity by id or site plus external id and return the refreshed snapshot","auth":"required","params":{},"tags":["agents"]},"opportunities.addByUrl":{"description":"Add a single opportunity from a pasted source URL (SAM.gov, Grants.gov, DSIP, SBIR.gov, or a configured REST JSON site): parse the URL, ingest detail/references, and store it in the library","auth":"required","params":{"url":"string"},"tags":["opportunities"]},"agents.getOpportunity":{"description":"Fetch one stored opportunity with references and query history","auth":"required","params":{},"tags":["agents"]},"agents.applyOpportunityWorkup":{"description":"Persist an external GovOps agent workup, vetting result, and auditable run record","auth":"required","params":{},"tags":["agents"]},"agents.archiveOpportunity":{"description":"Archive a stored opportunity and remove it from active tracking","auth":"required","params":{},"tags":["agents"]},"ai.listPendingJobs":{"description":"List AI agent jobs in the pending queue (or stale claims). Used by the worker tick to pick work up.","auth":"required","params":{},"tags":["ai"]},"ai.claimJob":{"description":"Claim an AI job for processing.","auth":"required","params":{"jobId":"string"},"tags":["ai"]},"ai.completeJob":{"description":"Mark an AI job as completed or failed and apply its result to the canonical record.","auth":"required","params":{"jobId":"string"},"tags":["ai"]},"ai.getJob":{"description":"Fetch a single AI job by id (used by the UI for polling).","auth":"required","params":{"jobId":"string"},"tags":["ai"]},"ai.cancelJob":{"description":"Cancel a pending or stuck AI job.","auth":"required","params":{"jobId":"string"},"tags":["ai"]},"ai.appendDelta":{"description":"Stream a partial-output chunk from the AI agent; broadcast to the opportunity's realtime subscribers.","auth":"required","params":{"jobId":"string"},"tags":["ai"]},"opportunities.adminDelete":{"description":"Admin-only: permanently delete an opportunity and cascade related milestones/pricing/contacts/documents/references/runs/queries/jobs.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities","admin"]},"opportunities.getProposalDraft":{"description":"Return a markdown proposal draft seeded from the opportunity metadata + Component Instructions guidance.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities"]},"opportunities.generateProposalDraft":{"description":"Run the LLM agent to draft a per-section proposal using BAA + Component Instructions as the format guide.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities"]},"opportunities.saveProposalDraft":{"description":"Persist edits to an opportunity's proposal draft markdown.","auth":"required","params":{"opportunityId":"string","markdown":"string"},"tags":["opportunities"]},"opportunities.proposalOp":{"description":"Queue a scoped AI edit on a proposal section (rewrite/polish/extend/edit_selection) or a full-document review. Snapshots the live editor buffer first.","auth":"required","params":{"opportunityId":"string","op":"string"},"tags":["opportunities"]},"opportunities.revertProposalEdit":{"description":"Revert a previously applied AI proposal edit by jobId, restoring the section's prior content.","auth":"required","params":{"opportunityId":"string","jobId":"string"},"tags":["opportunities"]},"opportunities.markProposalReady":{"description":"Mark an opportunity as proposal-ready (status = proposal_ready). Logs activity.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities"]},"opportunities.requeueForAnalysis":{"description":"Reset opportunity status to discovered so the worker re-runs the workup.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities"]},"agents.setOpportunityStatus":{"description":"Set an opportunity's status (follow, archive, ignore, etc.)","auth":"required","params":{},"tags":["agents"]},"opportunities.setDates":{"description":"Set or clear an opportunity's posting (open) and closing (close) dates; syncs the Open/Close milestones.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities"]},"opportunities.setDetails":{"description":"Assign/update an opportunity's lead, supporters, notes, and description.","auth":"required","params":{"opportunityId":"string"},"tags":["opportunities"]},"agents.listJobs":{"description":"List queued, running, retried, and completed background jobs","auth":"required","params":{},"tags":["agents"]},"agents.getJob":{"description":"Fetch one background job by id","auth":"required","params":{},"tags":["agents"]},"agents.retryJob":{"description":"Requeue a failed or waiting background job","auth":"required","params":{},"tags":["agents"]},"agents.queryOpportunity":{"description":"Ask a question about a stored opportunity and persist the answer","auth":"required","params":{},"tags":["agents"]},"agents.refineOpportunity":{"description":"Refine and augment the stored markdown analysis for an opportunity","auth":"required","params":{},"tags":["agents"]},"sites.save":{"description":"Create or update a data source site","auth":"required","params":{},"tags":["sites"]},"sites.list":{"description":"List data source sites","auth":"required","params":{},"tags":["sites"]},"sites.remove":{"description":"Remove a data source site","auth":"required","params":{},"tags":["sites"]},"sites.kinds":{"description":"List supported site kinds and their per-kind config field schema","auth":"public","params":{},"tags":["sites"]},"sites.scrapePresets":{"description":"List ready-made HTML-scrape site presets (e.g. TechConnect) to prefill the Sites form","auth":"public","params":{},"tags":["sites"]},"sites.sync":{"description":"Run a site's default search and persist discovered opportunities","auth":"required","params":{},"tags":["sites"]},"sites.testSearch":{"description":"Run a non-persisting test search for a saved or unsaved site configuration","auth":"required","params":{},"tags":["sites"]},"criteria.save":{"description":"Create or update a search criteria","auth":"required","params":{},"tags":["criteria"]},"criteria.list":{"description":"List saved search criteria","auth":"required","params":{},"tags":["criteria"]},"criteria.remove":{"description":"Remove a search criteria","auth":"required","params":{},"tags":["criteria"]},"criteria.run":{"description":"Run a search criteria across its configured site kinds and persist discovered opportunities tagged with criteria_id","auth":"required","params":{},"tags":["criteria"]},"agents.save":{"description":"Create or update an AI agent","auth":"required","params":{},"tags":["agents"]},"agents.list":{"description":"List AI agents","auth":"required","params":{},"tags":["agents"]},"agents.remove":{"description":"Remove an AI agent","auth":"required","params":{},"tags":["agents"]},"agents.tick":{"description":"Run a single Agent's action (discovery/analysis/compliance/maintenance) and write the result to its activity log","auth":"required","params":{},"tags":["agents"]},"agents.activity":{"description":"Record agent activity log entry","auth":"required","params":{},"tags":["agents"]},"agents.activities":{"description":"List agent activity log entries","auth":"required","params":{},"tags":["agents"]},"agents.heartbeat":{"description":"Record a heartbeat pulse from a govops-agent worker process","auth":"required","params":{"workerId":"string"},"tags":["agents"]},"agents.workers":{"description":"List recently-seen worker processes with an online flag","auth":"required","params":{},"tags":["agents"]},"opportunities.milestones":{"description":"Save milestones for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.milestones.list":{"description":"List milestones for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.milestones.update":{"description":"Update a single opportunity milestone (name, date, status)","auth":"required","params":{"milestoneId":"string"},"tags":["opportunities"]},"opportunities.milestones.remove":{"description":"Delete a single opportunity milestone","auth":"required","params":{"milestoneId":"string"},"tags":["opportunities"]},"opportunities.milestones.listAll":{"description":"List all milestones across opportunities, optionally filtered by date range or criteria","auth":"required","params":{},"tags":["opportunities"]},"opportunities.pricing":{"description":"Save pricing information for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.pricing.list":{"description":"List pricing information for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.contacts":{"description":"Save contact information for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.contacts.list":{"description":"List contact information for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.docs":{"description":"Save reference documents for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"opportunities.docs.list":{"description":"List reference documents for an opportunity","auth":"required","params":{},"tags":["opportunities"]},"dsip.getTopic":{"description":"Fetch one DSIP topic","auth":"public","params":{},"tags":["dsip"]},"dsip.getComponents":{"description":"Fetch DSIP component list","auth":"public","params":{},"tags":["dsip"]},"dsip.getAllTopics":{"description":"Fetch paginated DSIP topics","auth":"public","params":{},"tags":["dsip"]},"dsip.searchTopics":{"description":"Search DSIP topics","auth":"public","params":{},"tags":["dsip"]},"sbir.fetchCompany":{"description":"Fetch one SBIR company by id","auth":"public","params":{},"tags":["sbir"]},"sbir.searchAwards":{"description":"Search SBIR awards by company name","auth":"public","params":{},"tags":["sbir"]},"sbir.searchCompaniesByKeywords":{"description":"Search SBIR companies by keywords","auth":"public","params":{},"tags":["sbir"]},"sbir.searchSolicitations":{"description":"Search SBIR solicitations","auth":"public","params":{},"tags":["sbir"]},"sbir.fetchSolicitation":{"description":"Fetch one cached SBIR solicitation","auth":"public","params":{},"tags":["sbir"]},"grants.fetchOpportunity":{"description":"Fetch one Grants.gov opportunity","auth":"public","params":{},"tags":["grants"]},"grants.searchOpportunities":{"description":"Search Grants.gov opportunities","auth":"public","params":{},"tags":["grants"]},"challenge.fetchChallenge":{"description":"Fetch one Challenge.gov challenge","auth":"public","params":{},"tags":["challenge"]},"challenge.searchChallenges":{"description":"Search Challenge.gov challenges","auth":"public","params":{},"tags":["challenge"]},"sam.fetchOpportunity":{"description":"Fetch one SAM opportunity","auth":"public","params":{},"tags":["sam"]},"sam.searchOpportunities":{"description":"Search SAM opportunities","auth":"public","params":{},"tags":["sam"]}}}