$client = BoardDocs::client('pa/phoe');
$client->discoverCommittees();
$client->listMeetings($committeeId);
$client->fetchPrintAgendaHtml($meetingId, $committeeId);
$client->fetchAgendaHtml($meetingId, $committeeId);
$client->fetchItemAttachments($itemId, $committeeId); // AttachmentData[]
$client->getBytes($fileUrl); // raw attachment bytes
$client->downloadToFile($fileUrl, $destinationPath); // streamed to disk instead
use BoardDocsScraper\Ai\BoardDocsAgent;
$answer = (new BoardDocsAgent)->prompt('What did the Policy Committee decide about edtech?');
use BoardDocsScraper\Ai\Tools\SearchAgendasTool;
use BoardDocsScraper\Ai\Tools\GetMeetingTool;
use BoardDocsScraper\Ai\Tools\ListCommitteesTool;
class MyAgent implements Agent, HasTools
{
use Promptable;
public function tools(): iterable
{
return [new SearchAgendasTool, new GetMeetingTool, new ListCommitteesTool];
}
}
use Laravel\Ai\Stores;
$store = Stores::create('BoardDocs Agendas');
// put $store->id in .env as BOARDDOCS_VECTOR_STORE_ID
use BoardDocsScraper\Pdf\Templates\PdfTemplate;
class MyTemplate implements PdfTemplate
{
public function styleBlock(): string
{
// A <style> block for TCPDF's writeHTML(). TCPDF's CSS parser only
// understands a small subset (core PDF fonts, no flexbox/grid,
// unreliable borders on non-table elements) — keep this simple.
return '<style>body { font-family: helvetica; font-size: 10pt; }</style>';
}
public function document(string $body, string $baseUrl): string
{
// A full HTML document for the browsershot engine, which renders with
// real headless Chrome and supports the full CSS spec.
return "<!DOCTYPE html><html><head><style>...</style></head><body>{$body}</body></html>";
}
}
bash
# From the unblocked machine, against the shared disk:
php artisan boarddocs:prefetch --site=pa/phoe
# On the deployed server, whenever you like — makes zero BoardDocs requests:
php artisan boarddocs:build --site=pa/phoe