@agentproto/agencies 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTAGENCIES.md +39 -0
- package/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/capacity-98VwY285.d.ts +862 -0
- package/dist/chunk-DYQ4A5HV.mjs +649 -0
- package/dist/chunk-DYQ4A5HV.mjs.map +1 -0
- package/dist/chunk-GAJQ5ZC2.mjs +149 -0
- package/dist/chunk-GAJQ5ZC2.mjs.map +1 -0
- package/dist/chunk-SOJ4GQR7.mjs +3 -0
- package/dist/chunk-SOJ4GQR7.mjs.map +1 -0
- package/dist/composition/index.d.ts +61 -0
- package/dist/composition/index.mjs +75 -0
- package/dist/composition/index.mjs.map +1 -0
- package/dist/doctypes/index.d.ts +61 -0
- package/dist/doctypes/index.mjs +4 -0
- package/dist/doctypes/index.mjs.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.mjs +17 -0
- package/dist/index.mjs.map +1 -0
- package/dist/renderers/index.d.ts +288 -0
- package/dist/renderers/index.mjs +321 -0
- package/dist/renderers/index.mjs.map +1 -0
- package/dist/validators/index.d.ts +70 -0
- package/dist/validators/index.mjs +4 -0
- package/dist/validators/index.mjs.map +1 -0
- package/package.json +94 -0
- package/src/spec/canvakit-templates/agency.agency-overview/template.canvakit.html +173 -0
- package/src/spec/canvakit-templates/agency.agency-profile/template.canvakit.html +121 -0
- package/src/spec/canvakit-templates/agency.agreement-signing/template.canvakit.html +164 -0
- package/src/spec/canvakit-templates/agency.deliverable-review/template.canvakit.html +148 -0
- package/src/spec/canvakit-templates/agency.engagement-dashboard/template.canvakit.html +191 -0
- package/src/spec/canvakit-templates/agency.invoice-pdf/template.canvakit.html +142 -0
- package/src/spec/canvakit-templates/agency.procedure-card/template.canvakit.html +93 -0
- package/src/spec/snippets/agency-overview-rollup/procedures/compute-agency-overview/PROCEDURE.md +88 -0
- package/src/spec/snippets/agency-overview-rollup/routines/agency-overview-rollup/ROUTINE.md +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/spec/renderers/engagement-dashboard.ts","../../src/spec/renderers/agency-overview.ts","../../src/spec/renderers/invoice-pdf.ts","../../src/spec/renderers/agreement-signing.ts","../../src/spec/renderers/deliverable-review.ts","../../src/spec/renderers/procedure-card.ts","../../src/spec/renderers/agency-profile.ts"],"names":["z","moneyFormattedSchema","lineItemSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Renderer wrapper for the `agency.engagement-dashboard` canvakit template.\n *\n * The template is a self-contained dashboard that re-reads workspace files on\n * every refresh tick. The host application substitutes `{{engagementSlug}}`\n * in the data-source paths before calling canvakit's resolver — variables\n * here are template-time values, NOT runtime data (which comes from the\n * declared data sources).\n */\n\nimport { z } from \"zod\"\n\nexport const ENGAGEMENT_DASHBOARD_TEMPLATE_ID =\n \"agency.engagement-dashboard\" as const\n\n/** Path to the bundled .canvakit.html template (relative to the package root). */\nexport const ENGAGEMENT_DASHBOARD_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.engagement-dashboard/template.canvakit.html\" as const\n\nexport const engagementDashboardVariablesSchema = z.object({\n /** Slug of the engagement folder under `engagements/` (e.g. `2026-acme-website-redesign`). */\n engagementSlug: z\n .string()\n .regex(\n /^[a-z0-9][a-z0-9-]*$/,\n \"Expected lowercase slug (alphanumeric + hyphens)\"\n ),\n /** Display name of the agency (header). */\n agencyName: z.string().min(1),\n /**\n * Base URL used when the dashboard renders signing links for pending\n * artifacts. The full link is `${signUrlBase}?artifactPath=...&nonce=...`.\n */\n signUrlBase: z.string().min(1).default(\"/sign\"),\n})\nexport type EngagementDashboardVariables = z.infer<\n typeof engagementDashboardVariablesSchema\n>\n\nexport function engagementDashboardVariables(\n input: EngagementDashboardVariables\n): Record<string, string> {\n return {\n engagementSlug: input.engagementSlug,\n agencyName: input.agencyName,\n signUrlBase: input.signUrlBase ?? \"/sign\",\n }\n}\n","/**\n * Renderer wrapper for the `agency.agency-overview` canvakit template.\n *\n * The overview is a routine-populated rollup. The template's only data\n * source is `_snapshots/agency-overview.json`, written by a procedure that\n * walks the workspace and computes aggregates. The shape of that snapshot\n * is documented here as `AgencyOverviewSnapshot` so writers + readers\n * stay in sync.\n *\n * Why a snapshot rather than live globs:\n * - Counting + summing 50 engagements on every page-view is expensive.\n * - Per-engagement parsing of frontmatter is the bottleneck (no DB index).\n * - Snapshots invert the cost: compute once per cron tick, render cheap.\n *\n * Trade-off: the dashboard shows up-to-`refreshEvery` stale data. The\n * snapshot's `generatedAt` field plus the staleness banner make that\n * visible to the operator.\n */\n\nimport { z } from \"zod\"\n\nexport const AGENCY_OVERVIEW_TEMPLATE_ID = \"agency.agency-overview\" as const\n\nexport const AGENCY_OVERVIEW_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.agency-overview/template.canvakit.html\" as const\n\n/** Snapshot shape — the procedure writes `_snapshots/agency-overview.json` matching this. */\nexport const agencyOverviewSnapshotSchema = z.object({\n /** ISO 8601 timestamp of when the snapshot was computed. */\n generatedAt: z.string().min(1),\n /** Set true when `Date.now() - generatedAt` exceeds the freshness threshold (default 30 min). */\n isStale: z.boolean().default(false),\n\n activeEngagementsCount: z.number().int().nonnegative(),\n activeEngagementsDelta: z.number().int().default(0),\n pipelineValueFormatted: z.string(),\n mrrFormatted: z.string(),\n pendingSignaturesCount: z.number().int().nonnegative(),\n\n byStatus: z\n .array(\n z.object({\n status: z.string(),\n pillClass: z.enum([\"\", \"ok\", \"warn\", \"danger\", \"muted\"]).default(\"\"),\n count: z.number().int().nonnegative(),\n valueFormatted: z.string(),\n })\n )\n .default([]),\n\n recentPayments: z\n .array(\n z.object({\n invoiceNumber: z.string(),\n counterpartyDisplayName: z.string(),\n amountFormatted: z.string(),\n paidAt: z.string(),\n })\n )\n .default([]),\n\n pendingByEngagement: z\n .array(\n z.object({\n slug: z.string(),\n name: z.string(),\n requiredSigners: z.string(),\n oldestPendingAt: z.string(),\n stalenessLabel: z.string().default(\"\"),\n stalenessPillClass: z\n .enum([\"\", \"ok\", \"warn\", \"danger\", \"muted\"])\n .default(\"\"),\n })\n )\n .default([]),\n})\nexport type AgencyOverviewSnapshot = z.infer<\n typeof agencyOverviewSnapshotSchema\n>\n\n/** Default freshness threshold (ms): how long a snapshot is considered \"fresh\". */\nexport const AGENCY_OVERVIEW_FRESHNESS_MS = 30 * 60 * 1000\n\n/**\n * Compute `isStale` from a snapshot's `generatedAt` timestamp. Pure helper —\n * the writing procedure can call it before persisting, the reader can call\n * it on load to refresh the flag.\n */\nexport function isAgencyOverviewSnapshotStale(\n snapshot: { generatedAt: string },\n thresholdMs: number = AGENCY_OVERVIEW_FRESHNESS_MS,\n now: Date = new Date()\n): boolean {\n const generated = Date.parse(snapshot.generatedAt)\n if (Number.isNaN(generated)) return true\n return now.getTime() - generated > thresholdMs\n}\n\nexport const agencyOverviewVariablesSchema = z.object({\n agencyName: z.string().min(1),\n /** Used to construct per-engagement deep-links in the dashboard. */\n agencySlug: z\n .string()\n .regex(\n /^[a-z0-9][a-z0-9-]*$/,\n \"Expected lowercase slug (alphanumeric + hyphens)\"\n ),\n /** ISO 4217 currency for the headline stats. */\n currency: z\n .string()\n .regex(/^[A-Z]{3}$/)\n .default(\"EUR\"),\n})\nexport type AgencyOverviewVariables = z.infer<\n typeof agencyOverviewVariablesSchema\n>\n\nexport function agencyOverviewVariables(\n input: AgencyOverviewVariables\n): Record<string, string> {\n return {\n agencyName: input.agencyName,\n agencySlug: input.agencySlug,\n currency: input.currency ?? \"EUR\",\n }\n}\n","/**\n * Renderer wrapper for the `agency.invoice-pdf` canvakit template.\n *\n * Unlike the engagement dashboard, this template has no live data sources —\n * the host application reads INVOICE.md (+ ENGAGEMENT.md / AGENCY.md /\n * COUNTERPARTY.md) and passes a flattened variable bag in. The result is\n * print-ready HTML; downstream PDF tooling (Chromium / wkhtmltopdf) renders\n * it. The frozen PDF is archived alongside the .md and signed.\n */\n\nimport { z } from \"zod\"\n\nexport const INVOICE_PDF_TEMPLATE_ID = \"agency.invoice-pdf\" as const\n\nexport const INVOICE_PDF_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.invoice-pdf/template.canvakit.html\" as const\n\nconst moneyFormattedSchema = z.string().regex(/^-?\\d+(\\.\\d{1,4})?$/, {\n message:\n \"Expected a numeric string (e.g. '1234.56'). Format the locale separately.\",\n})\n\nconst lineItemSchema = z.object({\n description: z.string().min(1),\n quantity: z.union([z.number(), z.string()]),\n unitPriceFormatted: moneyFormattedSchema,\n totalFormatted: moneyFormattedSchema,\n})\n\nconst taxLineSchema = z.object({\n label: z.string().min(1),\n amountFormatted: moneyFormattedSchema,\n})\n\nexport const invoicePdfVariablesSchema = z.object({\n agencyName: z.string().min(1),\n /** Allowed-HTML block (sender address). The renderer trusts this — sanitize upstream. */\n agencyAddressHtml: z.string().optional(),\n agencyTaxId: z.string().optional(),\n\n invoiceNumber: z.string().min(1),\n /** ISO date (YYYY-MM-DD). */\n issuedAt: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n dueAt: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n /** \"issued\" | \"paid\" | \"overdue\" | \"void\" — pill-rendered. */\n status: z.string().min(1),\n\n counterpartyDisplayName: z.string().min(1),\n counterpartyAddressHtml: z.string().optional(),\n counterpartyTaxId: z.string().optional(),\n\n /** ISO 4217 (e.g. \"EUR\", \"USD\"). */\n currency: z.string().regex(/^[A-Z]{3}$/),\n\n subtotalFormatted: moneyFormattedSchema,\n taxLines: z.array(taxLineSchema).default([]),\n totalFormatted: moneyFormattedSchema,\n amountDueFormatted: moneyFormattedSchema,\n\n paymentTermsHtml: z.string().optional(),\n notesHtml: z.string().optional(),\n paymentLinkUrl: z.string().optional(),\n\n lineItems: z.array(lineItemSchema).min(1),\n})\nexport type InvoicePdfVariables = z.infer<typeof invoicePdfVariablesSchema>\n\nexport function invoicePdfVariables(\n input: InvoicePdfVariables\n): Record<string, unknown> {\n return {\n agencyName: input.agencyName,\n agencyAddressHtml: input.agencyAddressHtml ?? \"\",\n agencyTaxId: input.agencyTaxId ?? \"\",\n invoiceNumber: input.invoiceNumber,\n issuedAt: input.issuedAt,\n dueAt: input.dueAt,\n status: input.status,\n counterpartyDisplayName: input.counterpartyDisplayName,\n counterpartyAddressHtml: input.counterpartyAddressHtml ?? \"\",\n counterpartyTaxId: input.counterpartyTaxId ?? \"\",\n currency: input.currency,\n subtotalFormatted: input.subtotalFormatted,\n taxLines: input.taxLines,\n totalFormatted: input.totalFormatted,\n amountDueFormatted: input.amountDueFormatted,\n paymentTermsHtml: input.paymentTermsHtml ?? \"\",\n notesHtml: input.notesHtml ?? \"\",\n paymentLinkUrl: input.paymentLinkUrl ?? \"\",\n lineItems: input.lineItems,\n }\n}\n","/**\n * Renderer wrapper for the `agency.agreement-signing` canvakit template.\n *\n * Multi-party signing portal for AGREEMENT.md. Differs from\n * governance.signing-portal by rendering the agreement body, line items, and\n * the multi-party signature status alongside the typed-name form.\n */\n\nimport { z } from \"zod\"\n\nexport const AGREEMENT_SIGNING_TEMPLATE_ID = \"agency.agreement-signing\" as const\n\nexport const AGREEMENT_SIGNING_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.agreement-signing/template.canvakit.html\" as const\n\nconst moneyFormattedSchema = z\n .string()\n .regex(/^-?\\d+(\\.\\d{1,4})?$/, \"Expected a numeric string (e.g. '1234.56')\")\n\nconst lineItemSchema = z.object({\n description: z.string().min(1),\n quantity: z.union([z.number(), z.string()]),\n totalFormatted: moneyFormattedSchema,\n})\n\nconst partySchema = z.object({\n /** Display label like \"Acme Corp (counterparty)\". */\n label: z.string().min(1),\n /** ISO timestamp (already-signed) or ISO deadline (pending). */\n signedAt: z.string().optional(),\n deadline: z.string().optional(),\n})\n\nexport const agreementSigningVariablesSchema = z.object({\n agencyName: z.string().min(1),\n agreementTitle: z.string().min(1),\n agreementPath: z.string().min(1),\n /** Pre-rendered HTML of the agreement body (markdown → HTML upstream). */\n agreementBodyHtml: z.string().optional(),\n documentHash: z.string().regex(/^[a-f0-9]{64}$/),\n signerKind: z.enum([\"operator\", \"user\", \"counterparty\", \"agent\", \"external\"]),\n signerSlug: z.string().min(1),\n signerName: z.string().optional(),\n signerEmail: z.email().optional(),\n nonce: z.string().min(1),\n signUrl: z.string().min(1),\n\n /** Parties who have already signed (rendered in the \"Already signed\" panel). */\n alreadySignedParties: z.array(partySchema).default([]),\n /** Parties still pending (rendered in the \"Pending signatures\" panel). */\n pendingParties: z.array(partySchema).default([]),\n\n lineItems: z.array(lineItemSchema).default([]),\n totalFormatted: moneyFormattedSchema.default(\"0.00\"),\n currency: z\n .string()\n .regex(/^[A-Z]{3}$/)\n .default(\"EUR\"),\n paymentTermsHtml: z.string().optional(),\n})\nexport type AgreementSigningVariables = z.infer<\n typeof agreementSigningVariablesSchema\n>\n\nexport function agreementSigningVariables(\n input: AgreementSigningVariables\n): Record<string, unknown> {\n return {\n agencyName: input.agencyName,\n agreementTitle: input.agreementTitle,\n agreementPath: input.agreementPath,\n agreementBodyHtml: input.agreementBodyHtml ?? \"\",\n documentHash: input.documentHash,\n signerKind: input.signerKind,\n signerSlug: input.signerSlug,\n signerName: input.signerName ?? \"\",\n signerEmail: input.signerEmail ?? \"\",\n nonce: input.nonce,\n signUrl: input.signUrl,\n alreadySignedParties: input.alreadySignedParties,\n pendingParties: input.pendingParties,\n lineItems: input.lineItems,\n totalFormatted: input.totalFormatted,\n currency: input.currency,\n paymentTermsHtml: input.paymentTermsHtml ?? \"\",\n }\n}\n","/**\n * Renderer wrapper for the `agency.deliverable-review` canvakit template.\n *\n * Counterparty validation page — approve (typed-name signature) or request\n * revisions. Approval signs DELIVERABLE.md; revision request appends a\n * feedback comment + flips the engagement workflow back to `revise`.\n */\n\nimport { z } from \"zod\"\n\nexport const DELIVERABLE_REVIEW_TEMPLATE_ID =\n \"agency.deliverable-review\" as const\n\nexport const DELIVERABLE_REVIEW_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.deliverable-review/template.canvakit.html\" as const\n\nconst attachmentSchema = z.object({\n name: z.string().min(1),\n /** Human-friendly size like \"1.2 MB\" — formatted upstream. */\n sizeFormatted: z.string(),\n /** Free-form kind label rendered next to the size (\"PDF\", \"Figma frame\", …). */\n kind: z.string().optional(),\n /** URL to view/download the attachment. */\n url: z.string().min(1),\n /** Single-glyph icon (emoji or unicode). The template renders verbatim. */\n icon: z.string().default(\"📎\"),\n})\n\nexport const deliverableReviewVariablesSchema = z.object({\n agencyName: z.string().min(1),\n /** Optional engagement display name (rendered in the lead). */\n engagementName: z.string().optional(),\n deliverableTitle: z.string().min(1),\n deliverablePath: z.string().min(1),\n /** Markdown body rendered to HTML upstream (description + acceptance criteria). */\n deliverableBodyHtml: z.string().optional(),\n /** Free-form context shown above the body (e.g., \"Phase 1 of 3\"). */\n context: z.string().optional(),\n documentHash: z.string().regex(/^[a-f0-9]{64}$/),\n signerKind: z.enum([\"operator\", \"user\", \"counterparty\", \"agent\", \"external\"]),\n signerSlug: z.string().min(1),\n signerName: z.string().optional(),\n signerEmail: z.email().optional(),\n nonce: z.string().min(1),\n signUrl: z.string().min(1),\n reviseUrl: z.string().min(1),\n attachments: z.array(attachmentSchema).default([]),\n})\nexport type DeliverableReviewVariables = z.infer<\n typeof deliverableReviewVariablesSchema\n>\n\nexport function deliverableReviewVariables(\n input: DeliverableReviewVariables\n): Record<string, unknown> {\n return {\n agencyName: input.agencyName,\n engagementName: input.engagementName ?? \"\",\n deliverableTitle: input.deliverableTitle,\n deliverablePath: input.deliverablePath,\n deliverableBodyHtml: input.deliverableBodyHtml ?? \"\",\n context: input.context ?? \"\",\n documentHash: input.documentHash,\n signerKind: input.signerKind,\n signerSlug: input.signerSlug,\n signerName: input.signerName ?? \"\",\n signerEmail: input.signerEmail ?? \"\",\n nonce: input.nonce,\n signUrl: input.signUrl,\n reviseUrl: input.reviseUrl,\n attachments: input.attachments,\n }\n}\n","/**\n * Renderer wrapper for the `agency.procedure-card` canvakit template.\n *\n * Narrative card view of a PROCEDURE.md — overview + step list. Doubles as\n * an in-product help surface and a public preview on agencies.sh registry\n * pages.\n *\n * The template reads the source PROCEDURE.md via `kind:file` data source.\n * The host can pre-compute step state (`done` / `active` / `pending`) and\n * pass the merged shape under `procedure.steps[].stateClass`.\n */\n\nimport { z } from \"zod\"\n\nexport const PROCEDURE_CARD_TEMPLATE_ID = \"agency.procedure-card\" as const\n\nexport const PROCEDURE_CARD_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.procedure-card/template.canvakit.html\" as const\n\nexport const procedureCardVariablesSchema = z.object({\n /** Optional agency name shown in the lead label. */\n agencyName: z.string().optional(),\n /** Workspace-relative path to the PROCEDURE.md being rendered. */\n procedurePath: z.string().min(1),\n /**\n * If rendered inside an active engagement, the slug of the step currently\n * executing. The host fills `step.stateClass = active|done|pending` based\n * on this when projecting the procedure data source. Pass `\"\"` for the\n * static documentation view.\n */\n currentStepId: z.string().default(\"\"),\n})\nexport type ProcedureCardVariables = z.infer<\n typeof procedureCardVariablesSchema\n>\n\nexport function procedureCardVariables(\n input: ProcedureCardVariables\n): Record<string, string> {\n return {\n agencyName: input.agencyName ?? \"\",\n procedurePath: input.procedurePath,\n currentStepId: input.currentStepId ?? \"\",\n }\n}\n","/**\n * Renderer wrapper for the `agency.agency-profile` canvakit template.\n *\n * Public-facing profile rendering of AGENCY.md. Reads AGENCY.md plus the\n * services/ and pricing-models/ directories, projects them into a marketing\n * page suitable as `/agency/<slug>` landing or a registry preview.\n *\n * No live tools — pure file + glob. Cacheable via `refreshEvery` set to a\n * long interval; defaults to none (host caches at CDN level).\n */\n\nimport { z } from \"zod\"\n\nexport const AGENCY_PROFILE_TEMPLATE_ID = \"agency.agency-profile\" as const\n\nexport const AGENCY_PROFILE_TEMPLATE_PATH =\n \"src/spec/canvakit-templates/agency.agency-profile/template.canvakit.html\" as const\n\nexport const agencyProfileVariablesSchema = z.object({\n /**\n * The primary header. Defaults to `agency.name` resolved from AGENCY.md\n * when omitted (template falls back to the data source).\n */\n agencyName: z.string().optional(),\n /** Optional one-line tagline shown under the H1. */\n agencyTagline: z.string().optional(),\n /** Optional public website URL shown in the footer. */\n websiteUrl: z.string().optional(),\n /** Where the \"Start an engagement\" CTA points. */\n contactUrl: z.string().default(\"/contact\"),\n /** Override AGENCY.md.autonomyPosture in the \"How we work\" panel (rare). */\n autonomyPosture: z.string().optional(),\n /** Override AGENCY.md.defaultCurrency. */\n defaultCurrency: z\n .string()\n .regex(/^[A-Z]{3}$/)\n .default(\"EUR\"),\n})\nexport type AgencyProfileVariables = z.infer<\n typeof agencyProfileVariablesSchema\n>\n\nexport function agencyProfileVariables(\n input: AgencyProfileVariables\n): Record<string, string> {\n return {\n agencyName: input.agencyName ?? \"\",\n agencyTagline: input.agencyTagline ?? \"\",\n websiteUrl: input.websiteUrl ?? \"\",\n contactUrl: input.contactUrl,\n autonomyPosture: input.autonomyPosture ?? \"\",\n defaultCurrency: input.defaultCurrency,\n }\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { e as Agency, L as Operations, a2 as Service, V as Procedure, T as PricingModel, q as Counterparty, y as Engagement, g as Agreement, t as Deliverable, H as Invoice, _ as Routine, o as Capacity } from '../capacity-98VwY285.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* agentagencies/v1 validators.
|
|
6
|
+
*
|
|
7
|
+
* Per-doctype validators take file content (markdown string for *.md, JSON
|
|
8
|
+
* string for *.json) and return typed ValidationResult. Cross-doctype
|
|
9
|
+
* consistency checks live alongside.
|
|
10
|
+
*
|
|
11
|
+
* Validators do NOT touch the filesystem — callers pass file contents in.
|
|
12
|
+
* For FS-aware orchestration, see `../../runtime/`.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
type ValidationResult<T = unknown> = {
|
|
16
|
+
ok: true;
|
|
17
|
+
value: T;
|
|
18
|
+
warnings: string[];
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
errors: ValidationError[];
|
|
22
|
+
warnings: string[];
|
|
23
|
+
};
|
|
24
|
+
interface ValidationError {
|
|
25
|
+
path: string[];
|
|
26
|
+
message: string;
|
|
27
|
+
code?: string;
|
|
28
|
+
}
|
|
29
|
+
declare const validateAgency: (markdown: string) => ValidationResult<Agency>;
|
|
30
|
+
declare const validateOperations: (markdown: string) => ValidationResult<Operations>;
|
|
31
|
+
declare const validateService: (markdown: string) => ValidationResult<Service>;
|
|
32
|
+
declare const validateProcedure: (markdown: string) => ValidationResult<Procedure>;
|
|
33
|
+
declare const validatePricingModel: (markdown: string) => ValidationResult<PricingModel>;
|
|
34
|
+
declare const validateCounterparty: (markdown: string) => ValidationResult<Counterparty>;
|
|
35
|
+
declare const validateEngagement: (markdown: string) => ValidationResult<Engagement>;
|
|
36
|
+
declare const validateAgreement: (markdown: string) => ValidationResult<Agreement>;
|
|
37
|
+
declare const validateDeliverable: (markdown: string) => ValidationResult<Deliverable>;
|
|
38
|
+
declare const validateInvoice: (markdown: string) => ValidationResult<Invoice>;
|
|
39
|
+
declare const validateRoutine: (markdown: string) => ValidationResult<Routine>;
|
|
40
|
+
declare const validateCapacity: (markdown: string) => ValidationResult<Capacity>;
|
|
41
|
+
interface AgenciesWorkspaceFiles {
|
|
42
|
+
agency?: Agency;
|
|
43
|
+
operations?: Operations;
|
|
44
|
+
services?: Map<string, Service>;
|
|
45
|
+
procedures?: Map<string, Procedure>;
|
|
46
|
+
pricingModels?: Map<string, PricingModel>;
|
|
47
|
+
counterparties?: Map<string, Counterparty>;
|
|
48
|
+
engagements?: Map<string, Engagement>;
|
|
49
|
+
agreements?: Map<string, Agreement>;
|
|
50
|
+
deliverables?: Map<string, Deliverable>;
|
|
51
|
+
invoices?: Map<string, Invoice>;
|
|
52
|
+
routines?: Map<string, Routine>;
|
|
53
|
+
capacities?: Map<string, Capacity>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Walk a parsed workspace and check cross-doctype consistency:
|
|
57
|
+
* - SERVICE.defaultProcedure refs an existing PROCEDURE.md
|
|
58
|
+
* - SERVICE.defaultPricingModel refs an existing PRICING-MODEL.md
|
|
59
|
+
* - ENGAGEMENT.serviceSlug refs an existing SERVICE.md
|
|
60
|
+
* - ENGAGEMENT.activeProcedure refs an existing PROCEDURE.md
|
|
61
|
+
* - ENGAGEMENT.primaryCounterpartyId refs an existing COUNTERPARTY.md
|
|
62
|
+
* - AGREEMENT.primaryCounterpartyId refs an existing COUNTERPARTY.md
|
|
63
|
+
* - INVOICE.engagementSlug + INVOICE.counterpartyId ref existing entries
|
|
64
|
+
* - ROUTINE.runs refs an existing PROCEDURE.md
|
|
65
|
+
*
|
|
66
|
+
* Returns a list of ValidationError; empty list = consistent.
|
|
67
|
+
*/
|
|
68
|
+
declare function checkAgenciesConsistency(ws: AgenciesWorkspaceFiles): ValidationError[];
|
|
69
|
+
|
|
70
|
+
export { type AgenciesWorkspaceFiles, type ValidationError, type ValidationResult, checkAgenciesConsistency, validateAgency, validateAgreement, validateCapacity, validateCounterparty, validateDeliverable, validateEngagement, validateInvoice, validateOperations, validatePricingModel, validateProcedure, validateRoutine, validateService };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { checkAgenciesConsistency, validateAgency, validateAgreement, validateCapacity, validateCounterparty, validateDeliverable, validateEngagement, validateInvoice, validateOperations, validatePricingModel, validateProcedure, validateRoutine, validateService } from '../chunk-GAJQ5ZC2.mjs';
|
|
2
|
+
import '../chunk-DYQ4A5HV.mjs';
|
|
3
|
+
//# sourceMappingURL=index.mjs.map
|
|
4
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
package/package.json
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentproto/agencies",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"description": "agentagencies/v1 — open file-format standard for entities that exercise agency. Operating layer over agentcompanies/v1 and agentgovernance/v1: services, counterparties, engagements, agreements, deliverables, invoices, vendor-neutral procedures, full-fidelity routines, capacity.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agentagencies",
|
|
7
|
+
"agencies",
|
|
8
|
+
"agency",
|
|
9
|
+
"operations",
|
|
10
|
+
"engagement",
|
|
11
|
+
"agreement",
|
|
12
|
+
"invoice",
|
|
13
|
+
"procedure",
|
|
14
|
+
"open-standard",
|
|
15
|
+
"agentcompanies",
|
|
16
|
+
"agentgovernance",
|
|
17
|
+
"agentic"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://agentproto.sh/docs/agp-1",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/agentproto/ts",
|
|
23
|
+
"directory": "packages/agencies/core"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/agentproto/ts/issues"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"type": "module",
|
|
30
|
+
"main": "dist/index.mjs",
|
|
31
|
+
"module": "dist/index.mjs",
|
|
32
|
+
"types": "dist/index.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"import": "./dist/index.mjs",
|
|
37
|
+
"default": "./dist/index.mjs"
|
|
38
|
+
},
|
|
39
|
+
"./doctypes": {
|
|
40
|
+
"types": "./dist/doctypes/index.d.ts",
|
|
41
|
+
"import": "./dist/doctypes/index.mjs",
|
|
42
|
+
"default": "./dist/doctypes/index.mjs"
|
|
43
|
+
},
|
|
44
|
+
"./validators": {
|
|
45
|
+
"types": "./dist/validators/index.d.ts",
|
|
46
|
+
"import": "./dist/validators/index.mjs",
|
|
47
|
+
"default": "./dist/validators/index.mjs"
|
|
48
|
+
},
|
|
49
|
+
"./composition": {
|
|
50
|
+
"types": "./dist/composition/index.d.ts",
|
|
51
|
+
"import": "./dist/composition/index.mjs",
|
|
52
|
+
"default": "./dist/composition/index.mjs"
|
|
53
|
+
},
|
|
54
|
+
"./renderers": {
|
|
55
|
+
"types": "./dist/renderers/index.d.ts",
|
|
56
|
+
"import": "./dist/renderers/index.mjs",
|
|
57
|
+
"default": "./dist/renderers/index.mjs"
|
|
58
|
+
},
|
|
59
|
+
"./package.json": "./package.json",
|
|
60
|
+
"./AGENTAGENCIES.md": "./AGENTAGENCIES.md"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist",
|
|
64
|
+
"src/spec/canvakit-templates",
|
|
65
|
+
"src/spec/snippets",
|
|
66
|
+
"AGENTAGENCIES.md",
|
|
67
|
+
"README.md",
|
|
68
|
+
"LICENSE"
|
|
69
|
+
],
|
|
70
|
+
"publishConfig": {
|
|
71
|
+
"access": "public"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"gray-matter": "^4.0.3",
|
|
75
|
+
"yaml": "^2.8.4",
|
|
76
|
+
"zod": "^4.4.3",
|
|
77
|
+
"@agentproto/governance": "0.1.0-alpha.0"
|
|
78
|
+
},
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"@types/node": "^25.6.2",
|
|
81
|
+
"tsup": "^8.5.1",
|
|
82
|
+
"typescript": "^5.9.3",
|
|
83
|
+
"vitest": "^3.2.4",
|
|
84
|
+
"@agentproto/tooling": "0.1.0-alpha.0"
|
|
85
|
+
},
|
|
86
|
+
"scripts": {
|
|
87
|
+
"dev": "tsup --watch",
|
|
88
|
+
"build": "tsup",
|
|
89
|
+
"clean": "rm -rf dist",
|
|
90
|
+
"check-types": "tsc --noEmit",
|
|
91
|
+
"test": "vitest run",
|
|
92
|
+
"test:watch": "vitest"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
template: true
|
|
3
|
+
name: agency.agency-overview
|
|
4
|
+
version: 1.0.0-alpha
|
|
5
|
+
description: |
|
|
6
|
+
Agency-wide rollup — active engagements, pipeline value, MRR-style stats,
|
|
7
|
+
pending signatures, recent payments. Driven by a routine-populated snapshot
|
|
8
|
+
file rather than live globs (counting 50 engagements on every page-view is
|
|
9
|
+
too expensive).
|
|
10
|
+
|
|
11
|
+
Connection pattern (the "data flow" answer):
|
|
12
|
+
1. routines/agency-overview-rollup/ROUTINE.md fires every 10 minutes.
|
|
13
|
+
2. It runs procedures/compute-agency-overview/PROCEDURE.md, which walks
|
|
14
|
+
counterparties/, engagements/, invoices/ and writes a snapshot to
|
|
15
|
+
_snapshots/agency-overview.json.
|
|
16
|
+
3. This template reads that snapshot via kind:file. Cheap. Static.
|
|
17
|
+
4. The snapshot frontmatter carries `generatedAt`; the page footer shows
|
|
18
|
+
it so operators know the freshness.
|
|
19
|
+
|
|
20
|
+
This is the canonical "routine writes a snapshot, template reads it" pattern
|
|
21
|
+
for any expensive aggregate. Do NOT switch to live globs without measuring.
|
|
22
|
+
author: agencies.sh
|
|
23
|
+
refreshEvery: 5m
|
|
24
|
+
variables:
|
|
25
|
+
agencyName: "Acme Agency"
|
|
26
|
+
agencySlug: "acme"
|
|
27
|
+
currency: "EUR"
|
|
28
|
+
sources:
|
|
29
|
+
snapshot:
|
|
30
|
+
kind: file
|
|
31
|
+
path: "_snapshots/agency-overview.json"
|
|
32
|
+
---
|
|
33
|
+
<!doctype html>
|
|
34
|
+
<html lang="en">
|
|
35
|
+
<head>
|
|
36
|
+
<meta charset="utf-8" />
|
|
37
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
38
|
+
<title>{{agencyName}} · Overview</title>
|
|
39
|
+
<style>
|
|
40
|
+
:root {
|
|
41
|
+
--fg: #1a1a1a;
|
|
42
|
+
--muted: #666;
|
|
43
|
+
--bg: #faf9f7;
|
|
44
|
+
--panel: #ffffff;
|
|
45
|
+
--border: #e5e5e5;
|
|
46
|
+
--accent: #1a1a1a;
|
|
47
|
+
--ok: #0a7d30;
|
|
48
|
+
--warn: #b45309;
|
|
49
|
+
}
|
|
50
|
+
body { font: 15px/1.55 ui-sans-serif, system-ui, sans-serif; max-width: 72rem; margin: 0 auto; padding: 2.5rem 1.5rem; color: var(--fg); background: var(--bg); }
|
|
51
|
+
header { margin-bottom: 2rem; }
|
|
52
|
+
h1 { font-size: 1.625rem; letter-spacing: -0.01em; margin: 0 0 0.25rem; }
|
|
53
|
+
.lead { color: var(--muted); margin: 0; font-size: 0.9375rem; }
|
|
54
|
+
.grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 1.5rem; }
|
|
55
|
+
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem; margin-bottom: 1.25rem; }
|
|
56
|
+
.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem 1.5rem; }
|
|
57
|
+
.panel h2 { font-size: 0.8125rem; text-transform: uppercase; letter-spacing: 0.08em; color: #666; margin: 0 0 1rem; }
|
|
58
|
+
.stat .label { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; }
|
|
59
|
+
.stat .value { font-size: 1.875rem; font-weight: 600; letter-spacing: -0.02em; margin-top: 0.25rem; }
|
|
60
|
+
.stat .delta { font-size: 0.8125rem; color: var(--ok); margin-top: 0.25rem; }
|
|
61
|
+
table { width: 100%; border-collapse: collapse; }
|
|
62
|
+
th, td { text-align: left; padding: 0.5rem 0.625rem; border-bottom: 1px solid #efece5; font-size: 0.875rem; }
|
|
63
|
+
th { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.06em; color: #777; font-weight: 500; }
|
|
64
|
+
td.num { text-align: right; font-variant-numeric: tabular-nums; }
|
|
65
|
+
.pill { display: inline-block; padding: 0.125rem 0.5rem; border-radius: 999px; font-size: 0.6875rem; font-weight: 500; background: #f0eee5; color: #555; }
|
|
66
|
+
.pill.ok { background: #e7f5eb; color: var(--ok); }
|
|
67
|
+
.pill.warn { background: #fef3c7; color: var(--warn); }
|
|
68
|
+
a { color: #2563eb; text-decoration: none; }
|
|
69
|
+
a:hover { text-decoration: underline; }
|
|
70
|
+
.stale { padding: 0.625rem 1rem; background: #fef3c7; border: 1px solid #fde68a; border-radius: 6px; color: #92400e; font-size: 0.875rem; margin-bottom: 1.25rem; }
|
|
71
|
+
footer { margin-top: 2rem; padding-top: 1rem; border-top: 1px solid var(--border); font-size: 0.8125rem; color: var(--muted); display: flex; justify-content: space-between; }
|
|
72
|
+
footer .freshness { font-family: ui-monospace, SF Mono, monospace; }
|
|
73
|
+
</style>
|
|
74
|
+
</head>
|
|
75
|
+
<body>
|
|
76
|
+
<header>
|
|
77
|
+
<p class="lead">Agency overview</p>
|
|
78
|
+
<h1>{{agencyName}}</h1>
|
|
79
|
+
</header>
|
|
80
|
+
|
|
81
|
+
{{#snapshot.isStale}}
|
|
82
|
+
<div class="stale">
|
|
83
|
+
⚠ Snapshot is stale (last refreshed {{snapshot.generatedAt}}). Trigger
|
|
84
|
+
<code>routines/agency-overview-rollup</code> or wait for the next cron tick.
|
|
85
|
+
</div>
|
|
86
|
+
{{/snapshot.isStale}}
|
|
87
|
+
|
|
88
|
+
<section class="grid-4">
|
|
89
|
+
<div class="panel stat">
|
|
90
|
+
<p class="label">Active engagements</p>
|
|
91
|
+
<p class="value">{{snapshot.activeEngagementsCount}}</p>
|
|
92
|
+
<p class="delta">+{{snapshot.activeEngagementsDelta}} this month</p>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="panel stat">
|
|
95
|
+
<p class="label">Pipeline value</p>
|
|
96
|
+
<p class="value">{{snapshot.pipelineValueFormatted}}</p>
|
|
97
|
+
<p class="delta">{{currency}}</p>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="panel stat">
|
|
100
|
+
<p class="label">MRR</p>
|
|
101
|
+
<p class="value">{{snapshot.mrrFormatted}}</p>
|
|
102
|
+
<p class="delta">{{currency}}</p>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="panel stat">
|
|
105
|
+
<p class="label">Pending signatures</p>
|
|
106
|
+
<p class="value">{{snapshot.pendingSignaturesCount}}</p>
|
|
107
|
+
</div>
|
|
108
|
+
</section>
|
|
109
|
+
|
|
110
|
+
<section class="grid-2">
|
|
111
|
+
<div class="panel">
|
|
112
|
+
<h2>Engagements by status</h2>
|
|
113
|
+
<table>
|
|
114
|
+
<thead><tr><th>Status</th><th class="num">Count</th><th class="num">Value</th></tr></thead>
|
|
115
|
+
<tbody>
|
|
116
|
+
{{#snapshot.byStatus}}
|
|
117
|
+
<tr>
|
|
118
|
+
<td><span class="pill {{pillClass}}">{{status}}</span></td>
|
|
119
|
+
<td class="num">{{count}}</td>
|
|
120
|
+
<td class="num">{{valueFormatted}}</td>
|
|
121
|
+
</tr>
|
|
122
|
+
{{/snapshot.byStatus}}
|
|
123
|
+
</tbody>
|
|
124
|
+
</table>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div class="panel">
|
|
128
|
+
<h2>Recent payments</h2>
|
|
129
|
+
{{#snapshot.recentPayments.length}}
|
|
130
|
+
<table>
|
|
131
|
+
<thead><tr><th>Invoice</th><th>Counterparty</th><th class="num">Amount</th><th>Paid</th></tr></thead>
|
|
132
|
+
<tbody>
|
|
133
|
+
{{#snapshot.recentPayments}}
|
|
134
|
+
<tr>
|
|
135
|
+
<td>{{invoiceNumber}}</td>
|
|
136
|
+
<td>{{counterpartyDisplayName}}</td>
|
|
137
|
+
<td class="num">{{amountFormatted}}</td>
|
|
138
|
+
<td>{{paidAt}}</td>
|
|
139
|
+
</tr>
|
|
140
|
+
{{/snapshot.recentPayments}}
|
|
141
|
+
</tbody>
|
|
142
|
+
</table>
|
|
143
|
+
{{/snapshot.recentPayments.length}}
|
|
144
|
+
{{^snapshot.recentPayments.length}}<p style="color:var(--muted);font-size:0.875rem;">No payments yet.</p>{{/snapshot.recentPayments.length}}
|
|
145
|
+
</div>
|
|
146
|
+
</section>
|
|
147
|
+
|
|
148
|
+
<section class="panel">
|
|
149
|
+
<h2>Engagements awaiting signature</h2>
|
|
150
|
+
{{#snapshot.pendingByEngagement.length}}
|
|
151
|
+
<table>
|
|
152
|
+
<thead><tr><th>Engagement</th><th>Awaiting</th><th>Oldest pending</th><th></th></tr></thead>
|
|
153
|
+
<tbody>
|
|
154
|
+
{{#snapshot.pendingByEngagement}}
|
|
155
|
+
<tr>
|
|
156
|
+
<td><a href="/g/{{agencySlug}}/engagements/{{slug}}">{{name}}</a></td>
|
|
157
|
+
<td>{{requiredSigners}}</td>
|
|
158
|
+
<td>{{oldestPendingAt}}</td>
|
|
159
|
+
<td><span class="pill {{stalenessPillClass}}">{{stalenessLabel}}</span></td>
|
|
160
|
+
</tr>
|
|
161
|
+
{{/snapshot.pendingByEngagement}}
|
|
162
|
+
</tbody>
|
|
163
|
+
</table>
|
|
164
|
+
{{/snapshot.pendingByEngagement.length}}
|
|
165
|
+
{{^snapshot.pendingByEngagement.length}}<p style="color:var(--muted);font-size:0.875rem;">Nothing pending — clean inbox.</p>{{/snapshot.pendingByEngagement.length}}
|
|
166
|
+
</section>
|
|
167
|
+
|
|
168
|
+
<footer>
|
|
169
|
+
<span>Snapshot computed by <code>routines/agency-overview-rollup</code></span>
|
|
170
|
+
<span class="freshness">Generated: {{snapshot.generatedAt}}</span>
|
|
171
|
+
</footer>
|
|
172
|
+
</body>
|
|
173
|
+
</html>
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
template: true
|
|
3
|
+
name: agency.agency-profile
|
|
4
|
+
version: 1.0.0-alpha
|
|
5
|
+
description: |
|
|
6
|
+
Public-facing profile rendering of AGENCY.md — verticals, primary services,
|
|
7
|
+
pricing models, autonomy posture. Suitable as the landing page when an
|
|
8
|
+
inbound prospect lands on `/agency/<slug>` or as a marketing fragment.
|
|
9
|
+
|
|
10
|
+
The optional services block lists primaryServices by reading their
|
|
11
|
+
SERVICE.md files; if the host doesn't pre-resolve them, only the slug is
|
|
12
|
+
shown.
|
|
13
|
+
author: agencies.sh
|
|
14
|
+
variables:
|
|
15
|
+
agencyName: ""
|
|
16
|
+
agencyDescription: ""
|
|
17
|
+
agencyTagline: ""
|
|
18
|
+
websiteUrl: ""
|
|
19
|
+
contactUrl: "/contact"
|
|
20
|
+
autonomyPosture: ""
|
|
21
|
+
defaultCurrency: "EUR"
|
|
22
|
+
sources:
|
|
23
|
+
agency:
|
|
24
|
+
kind: file
|
|
25
|
+
path: "AGENCY.md"
|
|
26
|
+
services:
|
|
27
|
+
kind: query
|
|
28
|
+
include: "services/*/SERVICE.md"
|
|
29
|
+
sort: "displayOrder:asc"
|
|
30
|
+
fields: ["slug", "name", "description", "pricingModel", "estimatedDuration"]
|
|
31
|
+
pricing:
|
|
32
|
+
kind: query
|
|
33
|
+
include: "pricing-models/*/PRICING-MODEL.md"
|
|
34
|
+
fields: ["slug", "kind", "label"]
|
|
35
|
+
---
|
|
36
|
+
<!doctype html>
|
|
37
|
+
<html lang="en">
|
|
38
|
+
<head>
|
|
39
|
+
<meta charset="utf-8" />
|
|
40
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
41
|
+
<title>{{agency.name}}{{#agencyTagline}} · {{agencyTagline}}{{/agencyTagline}}</title>
|
|
42
|
+
<style>
|
|
43
|
+
:root { --fg: #1a1a1a; --muted: #666; --bg: #faf9f7; --panel: #fff; --border: #e5e5e5; --accent: #1a1a1a; }
|
|
44
|
+
body { font: 16px/1.6 ui-sans-serif, system-ui, sans-serif; max-width: 56rem; margin: 0 auto; padding: 4rem 1.5rem; color: var(--fg); background: var(--bg); }
|
|
45
|
+
.hero { text-align: center; padding: 2rem 0 3rem; }
|
|
46
|
+
.hero h1 { font-size: 2.5rem; letter-spacing: -0.025em; margin: 0 0 0.5rem; line-height: 1.1; }
|
|
47
|
+
.hero .tagline { color: var(--muted); font-size: 1.125rem; margin: 0; }
|
|
48
|
+
.hero .description { max-width: 40rem; margin: 1.5rem auto 0; color: #333; font-size: 1.0625rem; line-height: 1.6; }
|
|
49
|
+
.pills { margin: 1.5rem 0 0; }
|
|
50
|
+
.pill { display: inline-block; padding: 0.25rem 0.75rem; border-radius: 999px; background: #f0eee5; color: #444; font-size: 0.8125rem; margin: 0.125rem; }
|
|
51
|
+
section { margin-bottom: 3rem; }
|
|
52
|
+
section h2 { font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin: 0 0 1.25rem; font-weight: 500; }
|
|
53
|
+
.services { display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: 1rem; }
|
|
54
|
+
.service { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem 1.5rem; }
|
|
55
|
+
.service h3 { font-size: 1.125rem; margin: 0 0 0.5rem; letter-spacing: -0.01em; }
|
|
56
|
+
.service p { margin: 0 0 0.875rem; color: #333; font-size: 0.9375rem; line-height: 1.55; }
|
|
57
|
+
.service .meta { font-size: 0.8125rem; color: var(--muted); display: flex; gap: 1rem; }
|
|
58
|
+
.service .meta strong { color: #444; font-weight: 500; }
|
|
59
|
+
.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem; }
|
|
60
|
+
.panel dl { margin: 0; display: grid; grid-template-columns: max-content 1fr; gap: 0.5rem 1.25rem; font-size: 0.9375rem; }
|
|
61
|
+
.panel dt { font-weight: 500; color: #444; }
|
|
62
|
+
.panel dd { margin: 0; }
|
|
63
|
+
.cta { text-align: center; margin-top: 2rem; }
|
|
64
|
+
.cta a { display: inline-block; padding: 0.75rem 1.5rem; background: var(--accent); color: #fff; text-decoration: none; border-radius: 6px; font-weight: 500; font-size: 0.9375rem; }
|
|
65
|
+
.cta a:hover { background: #000; }
|
|
66
|
+
footer { margin-top: 4rem; padding-top: 1.5rem; border-top: 1px solid var(--border); text-align: center; font-size: 0.8125rem; color: var(--muted); }
|
|
67
|
+
footer a { color: #2563eb; text-decoration: none; }
|
|
68
|
+
</style>
|
|
69
|
+
</head>
|
|
70
|
+
<body>
|
|
71
|
+
<div class="hero">
|
|
72
|
+
<h1>{{agency.name}}</h1>
|
|
73
|
+
{{#agencyTagline}}<p class="tagline">{{agencyTagline}}</p>{{/agencyTagline}}
|
|
74
|
+
{{#agency.description}}<p class="description">{{agency.description}}</p>{{/agency.description}}
|
|
75
|
+
<div class="pills">
|
|
76
|
+
{{#agency.verticalLabels}}<span class="pill">{{.}}</span>{{/agency.verticalLabels}}
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
{{#services.length}}
|
|
81
|
+
<section>
|
|
82
|
+
<h2>Services</h2>
|
|
83
|
+
<div class="services">
|
|
84
|
+
{{#services}}
|
|
85
|
+
<article class="service">
|
|
86
|
+
<h3>{{name}}</h3>
|
|
87
|
+
{{#description}}<p>{{.}}</p>{{/description}}
|
|
88
|
+
<div class="meta">
|
|
89
|
+
{{#estimatedDuration}}<span><strong>Duration:</strong> {{.}}</span>{{/estimatedDuration}}
|
|
90
|
+
{{#pricingModel}}<span><strong>Pricing:</strong> {{.}}</span>{{/pricingModel}}
|
|
91
|
+
</div>
|
|
92
|
+
</article>
|
|
93
|
+
{{/services}}
|
|
94
|
+
</div>
|
|
95
|
+
</section>
|
|
96
|
+
{{/services.length}}
|
|
97
|
+
|
|
98
|
+
<section>
|
|
99
|
+
<h2>How we work</h2>
|
|
100
|
+
<div class="panel">
|
|
101
|
+
<dl>
|
|
102
|
+
{{#agency.autonomyPosture}}<dt>Autonomy posture</dt><dd><code>{{.}}</code></dd>{{/agency.autonomyPosture}}
|
|
103
|
+
{{#agency.defaultPricingModel}}<dt>Default pricing</dt><dd>{{.}}</dd>{{/agency.defaultPricingModel}}
|
|
104
|
+
{{#agency.defaultCurrency}}<dt>Currency</dt><dd>{{.}}</dd>{{/agency.defaultCurrency}}
|
|
105
|
+
{{#agency.billingTimezone}}<dt>Timezone</dt><dd>{{.}}</dd>{{/agency.billingTimezone}}
|
|
106
|
+
</dl>
|
|
107
|
+
</div>
|
|
108
|
+
</section>
|
|
109
|
+
|
|
110
|
+
{{#contactUrl}}
|
|
111
|
+
<div class="cta">
|
|
112
|
+
<a href="{{contactUrl}}">Start an engagement</a>
|
|
113
|
+
</div>
|
|
114
|
+
{{/contactUrl}}
|
|
115
|
+
|
|
116
|
+
<footer>
|
|
117
|
+
<p>Powered by <a href="https://agentproto.sh/docs/agp-1">agencies.sh</a> · agentagencies/v1</p>
|
|
118
|
+
{{#websiteUrl}}<p><a href="{{websiteUrl}}">{{websiteUrl}}</a></p>{{/websiteUrl}}
|
|
119
|
+
</footer>
|
|
120
|
+
</body>
|
|
121
|
+
</html>
|