@contractspec/example.pocket-family-office 3.7.20 → 3.7.22

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.
@@ -1 +1 @@
1
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"]},docs:{rootDocId:"docs.examples.pocket-family-office"},entrypoints:{packageName:"@contractspec/example.pocket-family-office",feature:"./feature",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
1
+ import{defineExample as b}from"@contractspec/lib.contracts-spec/examples";var d=b({meta:{key:"examples.pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Pocket Family Office example - personal finance automation with open banking",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","pocket-family-office"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.pocket-family-office"}}),j=d;export{j as default,d as ExamplesPocketFamilyOfficeExample};
@@ -1,4 +1,4 @@
1
- import{OwnersEnum as v,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.contracts-spec/ownership";var t=(r,m)=>({key:r,version:m}),w={meta:{key:"pocket-family-office.app",version:"1.0.0",appId:"pocket-family-office",title:"Pocket Family Office",description:"Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.",domain:"finance",owners:[v.PlatformFinance],tags:[x.Guide,"finance","automation"],stability:b.Experimental},capabilities:{enabled:[t("ai.chat","1.0.0"),t("ai.embeddings","1.0.0"),t("vector-db.search","1.0.0"),t("vector-db.storage","1.0.0"),t("storage.objects","1.0.0"),t("email.inbound","1.0.0"),t("email.transactional","1.0.0"),t("calendar.events","1.0.0"),t("sms.outbound","1.0.0"),t("ai.voice.tts","1.0.0"),t("payments.psp","1.0.0"),t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")]},integrationSlots:[{slotId:"primaryLLM",requiredCategory:"ai-llm",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.chat","1.0.0")],required:!0,description:"Chat completion provider powering summarisation, explanations, and insights."},{slotId:"primaryVectorDb",requiredCategory:"vector-db",allowedModes:["managed","byok"],requiredCapabilities:[t("vector-db.search","1.0.0")],required:!0,description:"Vector database storing embeddings for financial documents and email threads."},{slotId:"primaryStorage",requiredCategory:"storage",allowedModes:["managed","byok"],requiredCapabilities:[t("storage.objects","1.0.0")],required:!0,description:"Object storage used for raw uploads and normalised documents."},{slotId:"primaryOpenBanking",requiredCategory:"open-banking",allowedModes:["byok"],requiredCapabilities:[t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")],required:!0,description:"Powens BYOK connection powering bank account, transaction, and balance synchronisation."},{slotId:"emailInbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.inbound","1.0.0")],required:!0,description:"Inbound email/thread sync (Gmail) feeding the knowledge corpus."},{slotId:"emailOutbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.transactional","1.0.0")],required:!0,description:"Transactional email delivery for reminders and summaries."},{slotId:"calendarScheduling",requiredCategory:"calendar",allowedModes:["managed","byok"],requiredCapabilities:[t("calendar.events","1.0.0")],required:!0,description:"Creates calendar holds for bill reviews and handoff meetings."},{slotId:"voicePlayback",requiredCategory:"ai-voice-tts",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.voice.tts","1.0.0")],required:!1,description:"Optional voice synthesis for spoken summaries (ElevenLabs)."},{slotId:"smsNotifications",requiredCategory:"sms",allowedModes:["managed","byok"],requiredCapabilities:[t("sms.outbound","1.0.0")],required:!1,description:"SMS provider used for urgent reminders."},{slotId:"paymentsProcessing",requiredCategory:"payments",allowedModes:["managed","byok"],requiredCapabilities:[t("payments.psp","1.0.0")],required:!1,description:"Optional payments processor enabling bill pay automations."}],workflows:{processUploadedDocument:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},upcomingPaymentsReminder:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},generateFinancialSummary:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},ingestEmailThreads:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"},syncOpenBankingAccounts:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},syncOpenBankingTransactions:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},refreshOpenBankingBalances:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},generateOpenBankingOverview:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"}},policies:[{key:"pfo.policy.tenancy",version:"1.0.0"},{key:"knowledge.access.financial-docs",version:"1.0.0"}],telemetry:{spec:{key:"pfo.telemetry",version:"1.0.0"}},featureFlags:[{key:"voice-summaries",enabled:!1,description:"Enable ElevenLabs spoken summaries in addition to email distribution."}],routes:[{path:"/dashboard",label:"Overview",workflow:"pfo.workflow.generate-financial-summary"},{path:"/documents/upload",label:"Upload Document",workflow:"pfo.workflow.process-uploaded-document"},{path:"/communications",label:"Inbox",workflow:"pfo.workflow.ingest-email-threads"}],notes:"Pocket Family Office blueprint pulling together finance automations for the hackathon reference implementation."};function $e(r){return r.register(w)}var o=new Date,a={tenantId:"tenant.family-office",createdAt:o,updatedAt:o},M=[{meta:{...a,id:"conn-mistral-primary",integrationKey:"ai-llm.mistral",integrationVersion:"1.0.0",label:"Mistral Primary"},ownershipMode:"managed",config:{model:"mistral-large-latest",embeddingModel:"mistral-embed"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/mistral-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-qdrant-finance",integrationKey:"vectordb.qdrant",integrationVersion:"1.0.0",label:"Qdrant Finance Cluster"},ownershipMode:"managed",config:{apiUrl:"https://qdrant.pfo.internal",collectionPrefix:"tenant-family-office"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/qdrant-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:95}},{meta:{...a,id:"conn-gcs-documents",integrationKey:"storage.gcs",integrationVersion:"1.0.0",label:"GCS Documents Bucket"},ownershipMode:"managed",config:{bucket:"pfo-uploads",prefix:"financial-docs/"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gcs-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:60}},{meta:{...a,id:"conn-gmail-threads",integrationKey:"email.gmail",integrationVersion:"1.0.0",label:"Gmail Household Threads"},ownershipMode:"byok",config:{labelIds:["FINANCE","INBOX"],includeSpamTrash:!1},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gmail-refresh-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:320}},{meta:{...a,id:"conn-postmark-outbound",integrationKey:"email.postmark",integrationVersion:"1.0.0",label:"Postmark Transactional"},ownershipMode:"managed",config:{messageStream:"outbound",fromEmail:"family.office@pfo.dev"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/postmark-server-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:210}},{meta:{...a,id:"conn-google-calendar",integrationKey:"calendar.google",integrationVersion:"1.0.0",label:"Household Calendar"},ownershipMode:"managed",config:{calendarId:"primary"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/google-calendar-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:140}},{meta:{...a,id:"conn-elevenlabs-voice",integrationKey:"ai-voice.elevenlabs",integrationVersion:"1.0.0",label:"ElevenLabs Voice"},ownershipMode:"byok",config:{defaultVoiceId:"pNInz6obpgDQGcFmaJgB"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/elevenlabs-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:250}},{meta:{...a,id:"conn-twilio-sms",integrationKey:"sms.twilio",integrationVersion:"1.0.0",label:"Twilio SMS"},ownershipMode:"managed",config:{fromNumber:"+15552340000"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/twilio-auth-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-stripe-recurring",integrationKey:"payments.stripe",integrationVersion:"1.0.0",label:"Stripe Recurring Billing"},ownershipMode:"managed",config:{accountId:"acct_1PFOHACKATHON",region:"eu-west-1"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/stripe-secret-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:220}},{meta:{...a,id:"conn-powens-primary",integrationKey:"openbanking.powens",integrationVersion:"1.0.0",label:"Powens Open Banking"},ownershipMode:"byok",config:{environment:"sandbox",baseUrl:"https://api-sandbox.powens.com/v2"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/powens-credentials/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:410}}];function Ce(r){return M.find((m)=>m.meta.id===r)}import{registerDocBlocks as I}from"@contractspec/lib.contracts-spec/docs";var K=[{id:"docs.examples.pocket-family-office.goal",title:"Pocket Family Office — Goal",summary:"Secure personal finance automation combining documents and open banking.",kind:"goal",visibility:"public",route:"/docs/examples/pocket-family-office/goal",tags:["finance","goal"],body:`## Why it matters
1
+ import{OwnersEnum as k,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.contracts-spec/ownership";var t=(s,m)=>({key:s,version:m}),w={meta:{key:"pocket-family-office.app",version:"1.0.0",appId:"pocket-family-office",title:"Pocket Family Office",description:"Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.",domain:"finance",owners:[k.PlatformFinance],tags:[x.Guide,"finance","automation"],stability:b.Experimental},capabilities:{enabled:[t("ai.chat","1.0.0"),t("ai.embeddings","1.0.0"),t("vector-db.search","1.0.0"),t("vector-db.storage","1.0.0"),t("storage.objects","1.0.0"),t("email.inbound","1.0.0"),t("email.transactional","1.0.0"),t("calendar.events","1.0.0"),t("sms.outbound","1.0.0"),t("ai.voice.tts","1.0.0"),t("payments.psp","1.0.0"),t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")]},integrationSlots:[{slotId:"primaryLLM",requiredCategory:"ai-llm",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.chat","1.0.0")],required:!0,description:"Chat completion provider powering summarisation, explanations, and insights."},{slotId:"primaryVectorDb",requiredCategory:"vector-db",allowedModes:["managed","byok"],requiredCapabilities:[t("vector-db.search","1.0.0")],required:!0,description:"Vector database storing embeddings for financial documents and email threads."},{slotId:"primaryStorage",requiredCategory:"storage",allowedModes:["managed","byok"],requiredCapabilities:[t("storage.objects","1.0.0")],required:!0,description:"Object storage used for raw uploads and normalised documents."},{slotId:"primaryOpenBanking",requiredCategory:"open-banking",allowedModes:["byok"],requiredCapabilities:[t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")],required:!0,description:"Powens BYOK connection powering bank account, transaction, and balance synchronisation."},{slotId:"emailInbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.inbound","1.0.0")],required:!0,description:"Inbound email/thread sync (Gmail) feeding the knowledge corpus."},{slotId:"emailOutbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.transactional","1.0.0")],required:!0,description:"Transactional email delivery for reminders and summaries."},{slotId:"calendarScheduling",requiredCategory:"calendar",allowedModes:["managed","byok"],requiredCapabilities:[t("calendar.events","1.0.0")],required:!0,description:"Creates calendar holds for bill reviews and handoff meetings."},{slotId:"voicePlayback",requiredCategory:"ai-voice-tts",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.voice.tts","1.0.0")],required:!1,description:"Optional voice synthesis for spoken summaries (ElevenLabs)."},{slotId:"smsNotifications",requiredCategory:"sms",allowedModes:["managed","byok"],requiredCapabilities:[t("sms.outbound","1.0.0")],required:!1,description:"SMS provider used for urgent reminders."},{slotId:"paymentsProcessing",requiredCategory:"payments",allowedModes:["managed","byok"],requiredCapabilities:[t("payments.psp","1.0.0")],required:!1,description:"Optional payments processor enabling bill pay automations."}],workflows:{processUploadedDocument:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},upcomingPaymentsReminder:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},generateFinancialSummary:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},ingestEmailThreads:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"},syncOpenBankingAccounts:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},syncOpenBankingTransactions:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},refreshOpenBankingBalances:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},generateOpenBankingOverview:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"}},policies:[{key:"pfo.policy.tenancy",version:"1.0.0"},{key:"knowledge.access.financial-docs",version:"1.0.0"}],telemetry:{spec:{key:"pfo.telemetry",version:"1.0.0"}},featureFlags:[{key:"voice-summaries",enabled:!1,description:"Enable ElevenLabs spoken summaries in addition to email distribution."}],routes:[{path:"/dashboard",label:"Overview",workflow:"pfo.workflow.generate-financial-summary"},{path:"/documents/upload",label:"Upload Document",workflow:"pfo.workflow.process-uploaded-document"},{path:"/communications",label:"Inbox",workflow:"pfo.workflow.ingest-email-threads"}],notes:"Pocket Family Office blueprint pulling together finance automations for the hackathon reference implementation."};function $e(s){return s.register(w)}var o=new Date,a={tenantId:"tenant.family-office",createdAt:o,updatedAt:o},M=[{meta:{...a,id:"conn-mistral-primary",integrationKey:"ai-llm.mistral",integrationVersion:"1.0.0",label:"Mistral Primary"},ownershipMode:"managed",config:{model:"mistral-large-latest",embeddingModel:"mistral-embed"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/mistral-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-qdrant-finance",integrationKey:"vectordb.qdrant",integrationVersion:"1.0.0",label:"Qdrant Finance Cluster"},ownershipMode:"managed",config:{apiUrl:"https://qdrant.pfo.internal",collectionPrefix:"tenant-family-office"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/qdrant-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:95}},{meta:{...a,id:"conn-gcs-documents",integrationKey:"storage.gcs",integrationVersion:"1.0.0",label:"GCS Documents Bucket"},ownershipMode:"managed",config:{bucket:"pfo-uploads",prefix:"financial-docs/"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gcs-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:60}},{meta:{...a,id:"conn-gmail-threads",integrationKey:"email.gmail",integrationVersion:"1.0.0",label:"Gmail Household Threads"},ownershipMode:"byok",config:{labelIds:["FINANCE","INBOX"],includeSpamTrash:!1},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gmail-refresh-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:320}},{meta:{...a,id:"conn-postmark-outbound",integrationKey:"email.postmark",integrationVersion:"1.0.0",label:"Postmark Transactional"},ownershipMode:"managed",config:{messageStream:"outbound",fromEmail:"family.office@pfo.dev"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/postmark-server-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:210}},{meta:{...a,id:"conn-google-calendar",integrationKey:"calendar.google",integrationVersion:"1.0.0",label:"Household Calendar"},ownershipMode:"managed",config:{calendarId:"primary"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/google-calendar-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:140}},{meta:{...a,id:"conn-elevenlabs-voice",integrationKey:"ai-voice.elevenlabs",integrationVersion:"1.0.0",label:"ElevenLabs Voice"},ownershipMode:"byok",config:{defaultVoiceId:"pNInz6obpgDQGcFmaJgB"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/elevenlabs-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:250}},{meta:{...a,id:"conn-twilio-sms",integrationKey:"sms.twilio",integrationVersion:"1.0.0",label:"Twilio SMS"},ownershipMode:"managed",config:{fromNumber:"+15552340000"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/twilio-auth-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-stripe-recurring",integrationKey:"payments.stripe",integrationVersion:"1.0.0",label:"Stripe Recurring Billing"},ownershipMode:"managed",config:{accountId:"acct_1PFOHACKATHON",region:"eu-west-1"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/stripe-secret-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:220}},{meta:{...a,id:"conn-powens-primary",integrationKey:"openbanking.powens",integrationVersion:"1.0.0",label:"Powens Open Banking"},ownershipMode:"byok",config:{environment:"sandbox",baseUrl:"https://api-sandbox.powens.com/v2"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/powens-credentials/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:410}}];function Ge(s){return M.find((m)=>m.meta.id===s)}import{registerDocBlocks as I}from"@contractspec/lib.contracts-spec/docs";var K=[{id:"docs.examples.pocket-family-office.goal",title:"Pocket Family Office — Goal",summary:"Secure personal finance automation combining documents and open banking.",kind:"goal",visibility:"public",route:"/docs/examples/pocket-family-office/goal",tags:["finance","goal"],body:`## Why it matters
2
2
  - Automate document ingestion (receipts, statements) and link to transactions.
3
3
  - Provides a "family office" grade overview for individuals.
4
4
  - Uses open banking for real-time data and AI for insights.
@@ -23,7 +23,7 @@ import{OwnersEnum as v,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.c
23
23
 
24
24
  ## Guardrails
25
25
  - PII is redacted in summaries by default.
26
- - Read-only access to bank data (no write/payment initiation in this template).`},{id:"docs.examples.pocket-family-office.reference",title:"Pocket Family Office — Reference",summary:"Key components of the Pocket Family Office system.",kind:"reference",visibility:"public",route:"/docs/examples/pocket-family-office",tags:["finance","reference"],body:"## Workflows\n- `process-uploaded-document`: Extracts data from PDFs/Images.\n- `sync-openbanking-transactions`: Fetches latest transactions.\n- `generate-financial-summary`: AI-driven report generation.\n- `upcoming-payments-reminder`: Scans needed actions.\n\n## Operations\n- `pfo.documents.upload`: Secure upload endpoint for documents.\n\n## Capabilities\n- Requires: `identity`, `openbanking`.\n- Provides: `pocket-family-office`."}];I(K);import{defineExample as V}from"@contractspec/lib.contracts-spec";var j=V({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"]},docs:{rootDocId:"docs.examples.pocket-family-office"},entrypoints:{packageName:"@contractspec/example.pocket-family-office",feature:"./feature",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),F=j;var s=new Date,Ye=[{meta:{id:"source-financial-uploads",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-docs",spaceVersion:"1.0.0",label:"Uploaded Financial Documents",sourceType:"file_upload",createdAt:s,updatedAt:s},config:{bucket:"pfo-uploads",prefix:"financial-docs/"},syncSchedule:{enabled:!0,intervalMs:900000},lastSync:{timestamp:s,success:!0}},{meta:{id:"source-gmail-threads",tenantId:"tenant.family-office",spaceKey:"knowledge.email-threads",spaceVersion:"1.0.0",label:"Household Gmail Threads",sourceType:"email",createdAt:s,updatedAt:s},config:{labelIds:["INBOX","FINANCE"]},syncSchedule:{enabled:!0,intervalMs:300000},lastSync:{timestamp:s,success:!0}},{meta:{id:"source-financial-overview",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-overview",spaceVersion:"1.0.0",label:"Financial Overview",sourceType:"api",createdAt:s,updatedAt:s},config:{},syncSchedule:{enabled:!1}}];import{OPENBANKING_TELEMETRY_EVENTS as q}from"@contractspec/lib.contracts-integrations";import{defineCommand as l,defineQuery as D}from"@contractspec/lib.contracts-spec";import{OwnersEnum as i,StabilityEnum as c,TagsEnum as d}from"@contractspec/lib.contracts-spec/ownership";import{defineEnum as g,defineSchemaModel as n,ScalarTypeEnum as e}from"@contractspec/lib.schema";var H=g("Source",["upload","email","sync"]),R=g("Channel",["email","sms","both"]),Q=g("Period",["P7d","P30d","P90d"]),X=g("ObPeriod",["Pweek","Pmonth","Pquarter"]),z=n({name:"UploadDocumentInput",fields:{bucket:{type:e.NonEmptyString(),isOptional:!1},objectKey:{type:e.NonEmptyString(),isOptional:!1},mimeType:{type:e.NonEmptyString(),isOptional:!1},bytes:{type:e.Int_unsecure(),isOptional:!1},tags:{type:e.String_unsecure(),isOptional:!1,isArray:!0},uploadedAt:{type:e.Date(),isOptional:!1},source:{type:H,isOptional:!1}}}),J=n({name:"UploadDocumentOutput",fields:{documentId:{type:e.String_unsecure(),isOptional:!1},ingestionJobId:{type:e.String_unsecure(),isOptional:!1}}}),U=l({meta:{key:"pfo.documents.upload",version:"1.0.0",description:"Stores an object in tenant storage and schedules ingestion into the knowledge base.",goal:"Allow users to ingest financial documents for processing.",context:"Part of the finance domain. Documents are uploaded to object storage and then processed by the ingestion pipeline.",owners:[i.PlatformFinance],tags:["documents","ingestion",d.Guide],stability:c.Experimental},io:{input:z,output:J},policy:{auth:"user",rateLimit:{rpm:30,key:"user"}}}),Z=n({name:"PaymentReminderInput",fields:{billId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientPhone:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.Date(),isOptional:!1},amountCents:{type:e.Int_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},channel:{type:R,isOptional:!1},memo:{type:e.String_unsecure(),isOptional:!0}}}),$=n({name:"PaymentReminderOutput",fields:{reminderId:{type:e.String_unsecure(),isOptional:!1},scheduledAt:{type:e.Date(),isOptional:!1}}}),P=l({meta:{key:"pfo.reminders.schedule-payment",version:"1.0.0",description:"Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.",goal:"Ensure bills are paid on time by notifying users.",context:"Finance automation. Reminders are sent via configured channels (email, SMS).",owners:[i.PlatformFinance],tags:["payments","reminders",d.Automation],stability:c.Beta},io:{input:Z,output:$},policy:{auth:"user"}}),C=n({name:"FinancialSummaryInput",fields:{period:{type:Q,isOptional:!1},includeVoiceSummary:{type:e.Boolean(),isOptional:!1}}}),G=n({name:"SummaryHighlight",fields:{label:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1}}}),S=n({name:"FinancialSummaryOutput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},markdown:{type:e.String_unsecure(),isOptional:!1},highlights:{type:G,isOptional:!1,isArray:!0},cashflowDelta:{type:e.Float_unsecure(),isOptional:!1}}}),A=D({meta:{key:"pfo.summary.generate",version:"1.0.0",description:"Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.",goal:"Provide a quick overview of financial status and recent activity.",context:"Uses RAG over ingested knowledge. Summaries can be dispatched or viewed in app.",owners:[i.PlatformFinance],tags:["summary","ai",d.Automation],stability:c.Beta},io:{input:C,output:S},policy:{auth:"user"}}),W=n({name:"SyncEmailThreadsInput",fields:{labelIds:{type:e.String_unsecure(),isOptional:!1,isArray:!0},maxThreads:{type:e.Int_unsecure(),isOptional:!1},syncSinceMinutes:{type:e.Int_unsecure(),isOptional:!1}}}),L=n({name:"SyncEmailThreadsOutput",fields:{syncedThreads:{type:e.Int_unsecure(),isOptional:!1},lastMessageAt:{type:e.Date(),isOptional:!0}}}),Y=l({meta:{key:"pfo.email.sync-threads",version:"1.0.0",description:"Triggers ingestion of Gmail threads into the operational knowledge space.",goal:"Keep knowledge base up to date with email communications.",context:"Syncs from Gmail integration. Only includes threads matching configured labels.",owners:[i.PlatformMessaging],tags:["gmail","knowledge",d.Automation],stability:c.Beta},io:{input:W,output:L},policy:{auth:"user"}}),B=n({name:"SummaryDispatchInput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientName:{type:e.String_unsecure(),isOptional:!0},includeVoice:{type:e.Boolean(),isOptional:!1},voiceRecipient:{type:e.String_unsecure(),isOptional:!0}}}),O=n({name:"SummaryDispatchOutput",fields:{dispatchId:{type:e.String_unsecure(),isOptional:!1},emailSent:{type:e.Boolean(),isOptional:!1},voiceUrl:{type:e.String_unsecure(),isOptional:!0}}}),_=l({meta:{key:"pfo.summary.dispatch",version:"1.0.0",description:"Delivers the generated summary via email and optionally synthesises a voice note.",goal:"Deliver financial insights to users proactively.",context:"Dispatches summaries generated by pfo.summary.generate via email or voice.",owners:[i.PlatformMessaging],tags:["summary","communications",d.Automation],stability:c.Experimental},io:{input:B,output:O},policy:{auth:"user"}}),N=n({name:"OpenBankingOverviewInput",fields:{tenantId:{type:e.String_unsecure(),isOptional:!1},accountIds:{type:e.String_unsecure(),isOptional:!0,isArray:!0},period:{type:X,isOptional:!1},asOf:{type:e.Date(),isOptional:!0},includeCategories:{type:e.Boolean(),isOptional:!1},includeCashflowTrend:{type:e.Boolean(),isOptional:!1}}}),T=n({name:"OpenBankingOverviewOutput",fields:{knowledgeEntryId:{type:e.String_unsecure(),isOptional:!1},periodStart:{type:e.Date(),isOptional:!1},periodEnd:{type:e.Date(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},summaryPath:{type:e.String_unsecure(),isOptional:!0}}}),E=l({meta:{key:"pfo.openbanking.generate-overview",version:"1.0.0",description:"Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.",goal:"Create a periodic financial snapshot.",context:"Aggregates data from open banking integration into a document.",owners:[i.PlatformFinance],tags:["open-banking","summary",d.Automation],stability:c.Experimental},io:{input:N,output:T},policy:{auth:"user"},telemetry:{success:{event:{key:q.overviewGenerated,version:"1.0.0"}}}}),Ee={"pfo.documents.upload":U,"pfo.reminders.schedule-payment":P,"pfo.summary.generate":A,"pfo.summary.dispatch":_,"pfo.email.sync-threads":Y,"pfo.openbanking.generate-overview":E};import{defineFeature as ee}from"@contractspec/lib.contracts-spec";var nt=ee({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),ot=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
26
+ - Read-only access to bank data (no write/payment initiation in this template).`},{id:"docs.examples.pocket-family-office.reference",title:"Pocket Family Office — Reference",summary:"Key components of the Pocket Family Office system.",kind:"reference",visibility:"public",route:"/docs/examples/pocket-family-office",tags:["finance","reference"],body:"## Workflows\n- `process-uploaded-document`: Extracts data from PDFs/Images.\n- `sync-openbanking-transactions`: Fetches latest transactions.\n- `generate-financial-summary`: AI-driven report generation.\n- `upcoming-payments-reminder`: Scans needed actions.\n\n## Operations\n- `pfo.documents.upload`: Secure upload endpoint for documents.\n\n## Capabilities\n- Requires: `identity`, `openbanking`.\n- Provides: `pocket-family-office`."}];I(K);import{defineExample as V}from"@contractspec/lib.contracts-spec/examples";var j=V({meta:{key:"examples.pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Pocket Family Office example - personal finance automation with open banking",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","pocket-family-office"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.pocket-family-office"}}),q=j;var r=new Date,Ye=[{meta:{id:"source-financial-uploads",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-docs",spaceVersion:"1.0.0",label:"Uploaded Financial Documents",sourceType:"file_upload",createdAt:r,updatedAt:r},config:{bucket:"pfo-uploads",prefix:"financial-docs/"},syncSchedule:{enabled:!0,intervalMs:900000},lastSync:{timestamp:r,success:!0}},{meta:{id:"source-gmail-threads",tenantId:"tenant.family-office",spaceKey:"knowledge.email-threads",spaceVersion:"1.0.0",label:"Household Gmail Threads",sourceType:"email",createdAt:r,updatedAt:r},config:{labelIds:["INBOX","FINANCE"]},syncSchedule:{enabled:!0,intervalMs:300000},lastSync:{timestamp:r,success:!0}},{meta:{id:"source-financial-overview",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-overview",spaceVersion:"1.0.0",label:"Financial Overview",sourceType:"api",createdAt:r,updatedAt:r},config:{},syncSchedule:{enabled:!1}}];import{OPENBANKING_TELEMETRY_EVENTS as D}from"@contractspec/lib.contracts-integrations";import{defineCommand as l,defineQuery as F}from"@contractspec/lib.contracts-spec";import{OwnersEnum as i,StabilityEnum as c,TagsEnum as d}from"@contractspec/lib.contracts-spec/ownership";import{defineEnum as g,defineSchemaModel as n,ScalarTypeEnum as e}from"@contractspec/lib.schema";var H=g("Source",["upload","email","sync"]),R=g("Channel",["email","sms","both"]),Q=g("Period",["P7d","P30d","P90d"]),X=g("ObPeriod",["Pweek","Pmonth","Pquarter"]),z=n({name:"UploadDocumentInput",fields:{bucket:{type:e.NonEmptyString(),isOptional:!1},objectKey:{type:e.NonEmptyString(),isOptional:!1},mimeType:{type:e.NonEmptyString(),isOptional:!1},bytes:{type:e.Int_unsecure(),isOptional:!1},tags:{type:e.String_unsecure(),isOptional:!1,isArray:!0},uploadedAt:{type:e.Date(),isOptional:!1},source:{type:H,isOptional:!1}}}),J=n({name:"UploadDocumentOutput",fields:{documentId:{type:e.String_unsecure(),isOptional:!1},ingestionJobId:{type:e.String_unsecure(),isOptional:!1}}}),U=l({meta:{key:"pfo.documents.upload",version:"1.0.0",description:"Stores an object in tenant storage and schedules ingestion into the knowledge base.",goal:"Allow users to ingest financial documents for processing.",context:"Part of the finance domain. Documents are uploaded to object storage and then processed by the ingestion pipeline.",owners:[i.PlatformFinance],tags:["documents","ingestion",d.Guide],stability:c.Experimental},io:{input:z,output:J},policy:{auth:"user",rateLimit:{rpm:30,key:"user"}}}),Z=n({name:"PaymentReminderInput",fields:{billId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientPhone:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.Date(),isOptional:!1},amountCents:{type:e.Int_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},channel:{type:R,isOptional:!1},memo:{type:e.String_unsecure(),isOptional:!0}}}),$=n({name:"PaymentReminderOutput",fields:{reminderId:{type:e.String_unsecure(),isOptional:!1},scheduledAt:{type:e.Date(),isOptional:!1}}}),C=l({meta:{key:"pfo.reminders.schedule-payment",version:"1.0.0",description:"Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.",goal:"Ensure bills are paid on time by notifying users.",context:"Finance automation. Reminders are sent via configured channels (email, SMS).",owners:[i.PlatformFinance],tags:["payments","reminders",d.Automation],stability:c.Beta},io:{input:Z,output:$},policy:{auth:"user"}}),G=n({name:"FinancialSummaryInput",fields:{period:{type:Q,isOptional:!1},includeVoiceSummary:{type:e.Boolean(),isOptional:!1}}}),P=n({name:"SummaryHighlight",fields:{label:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1}}}),S=n({name:"FinancialSummaryOutput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},markdown:{type:e.String_unsecure(),isOptional:!1},highlights:{type:P,isOptional:!1,isArray:!0},cashflowDelta:{type:e.Float_unsecure(),isOptional:!1}}}),A=F({meta:{key:"pfo.summary.generate",version:"1.0.0",description:"Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.",goal:"Provide a quick overview of financial status and recent activity.",context:"Uses RAG over ingested knowledge. Summaries can be dispatched or viewed in app.",owners:[i.PlatformFinance],tags:["summary","ai",d.Automation],stability:c.Beta},io:{input:G,output:S},policy:{auth:"user"}}),W=n({name:"SyncEmailThreadsInput",fields:{labelIds:{type:e.String_unsecure(),isOptional:!1,isArray:!0},maxThreads:{type:e.Int_unsecure(),isOptional:!1},syncSinceMinutes:{type:e.Int_unsecure(),isOptional:!1}}}),L=n({name:"SyncEmailThreadsOutput",fields:{syncedThreads:{type:e.Int_unsecure(),isOptional:!1},lastMessageAt:{type:e.Date(),isOptional:!0}}}),Y=l({meta:{key:"pfo.email.sync-threads",version:"1.0.0",description:"Triggers ingestion of Gmail threads into the operational knowledge space.",goal:"Keep knowledge base up to date with email communications.",context:"Syncs from Gmail integration. Only includes threads matching configured labels.",owners:[i.PlatformMessaging],tags:["gmail","knowledge",d.Automation],stability:c.Beta},io:{input:W,output:L},policy:{auth:"user"}}),B=n({name:"SummaryDispatchInput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientName:{type:e.String_unsecure(),isOptional:!0},includeVoice:{type:e.Boolean(),isOptional:!1},voiceRecipient:{type:e.String_unsecure(),isOptional:!0}}}),_=n({name:"SummaryDispatchOutput",fields:{dispatchId:{type:e.String_unsecure(),isOptional:!1},emailSent:{type:e.Boolean(),isOptional:!1},voiceUrl:{type:e.String_unsecure(),isOptional:!0}}}),O=l({meta:{key:"pfo.summary.dispatch",version:"1.0.0",description:"Delivers the generated summary via email and optionally synthesises a voice note.",goal:"Deliver financial insights to users proactively.",context:"Dispatches summaries generated by pfo.summary.generate via email or voice.",owners:[i.PlatformMessaging],tags:["summary","communications",d.Automation],stability:c.Experimental},io:{input:B,output:_},policy:{auth:"user"}}),N=n({name:"OpenBankingOverviewInput",fields:{tenantId:{type:e.String_unsecure(),isOptional:!1},accountIds:{type:e.String_unsecure(),isOptional:!0,isArray:!0},period:{type:X,isOptional:!1},asOf:{type:e.Date(),isOptional:!0},includeCategories:{type:e.Boolean(),isOptional:!1},includeCashflowTrend:{type:e.Boolean(),isOptional:!1}}}),T=n({name:"OpenBankingOverviewOutput",fields:{knowledgeEntryId:{type:e.String_unsecure(),isOptional:!1},periodStart:{type:e.Date(),isOptional:!1},periodEnd:{type:e.Date(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},summaryPath:{type:e.String_unsecure(),isOptional:!0}}}),E=l({meta:{key:"pfo.openbanking.generate-overview",version:"1.0.0",description:"Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.",goal:"Create a periodic financial snapshot.",context:"Aggregates data from open banking integration into a document.",owners:[i.PlatformFinance],tags:["open-banking","summary",d.Automation],stability:c.Experimental},io:{input:N,output:T},policy:{auth:"user"},telemetry:{success:{event:{key:D.overviewGenerated,version:"1.0.0"}}}}),Ee={"pfo.documents.upload":U,"pfo.reminders.schedule-payment":C,"pfo.summary.generate":A,"pfo.summary.dispatch":O,"pfo.email.sync-threads":Y,"pfo.openbanking.generate-overview":E};import{defineFeature as ee}from"@contractspec/lib.contracts-spec/features";var nt=ee({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),ot=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
27
27
 
28
28
  Pocket Family Office is a ContractSpec reference vertical that
29
29
  demonstrates finance automation atop the integration and knowledge
@@ -128,4 +128,4 @@ tenant-specific IDs/secret references before deploying.
128
128
 
129
129
 
130
130
 
131
- `}];import{OPENBANKING_PII_FIELDS as te,OPENBANKING_TELEMETRY_EVENTS as f}from"@contractspec/lib.contracts-integrations";import{OwnersEnum as ne,StabilityEnum as oe,TagsEnum as ae}from"@contractspec/lib.contracts-spec/ownership";var p={tenantId:{type:"string",required:!0,description:"Tenant identifier for multi-tenant isolation."},appId:{type:"string",required:!0,description:"Application identifier associated with the event."},blueprint:{type:"string",required:!0,description:"Blueprint name@version emitting the telemetry."},configVersion:{type:"number",required:!0,description:"Resolved app config version when the event was generated."},slotId:{type:"string",required:!0,description:"Integration slot identifier (e.g., primaryOpenBanking)."},connectionId:{type:"string",required:!0,description:"Integration connection ID used for the sync."}};function h(r){return{type:"string",description:r,pii:!1}}var it={meta:{key:"pfo.telemetry",version:"1.0.0",title:"Pocket Family Office Telemetry",description:"Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.",domain:"finance",owners:[ne.PlatformFinance],tags:["open-banking",ae.Automation],stability:oe.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{key:f.accountsSynced,version:"1.0.0",semantics:{what:"Open banking account synchronisation completed.",why:"Refresh canonical account metadata for reporting and workflows."},privacy:"internal",properties:{...p,syncedCount:{type:"number",description:"Number of accounts synced successfully."},failedCount:{type:"number",description:"Number of accounts that failed to sync."},durationMs:{type:"number",description:"Duration of the sync job in milliseconds."}}},{key:f.transactionsSynced,version:"1.0.0",semantics:{what:"Open banking transaction synchronisation completed.",why:"Keep canonical transaction ledger in sync for analytics."},privacy:"internal",properties:{...p,accountId:{type:"string",description:"Bank account identifier used during the sync.",pii:!1},syncedCount:{type:"number",description:"Number of transactions synced successfully."},failedCount:{type:"number",description:"Number of transactions that failed to sync."},from:{type:"timestamp",description:"Start timestamp for the sync window."},to:{type:"timestamp",description:"End timestamp for the sync window."}}},{key:f.balancesRefreshed,version:"1.0.0",semantics:{what:"Open banking balances refreshed.",why:"Provide accurate cash position for dashboards and alerts."},privacy:"internal",properties:{...p,accountId:h("Bank account identifier."),balanceTypes:{type:"json",description:"Balance types included in the refresh."},refreshedAt:{type:"timestamp",description:"Timestamp when balances were refreshed."}}},{key:f.overviewGenerated,version:"1.0.0",semantics:{what:"Derived financial overview generated.",why:"Persist cashflow and category summaries into knowledge space."},privacy:"internal",properties:{...p,knowledgeEntryId:h("Identifier of the knowledge document containing the overview."),period:{type:"string",description:"Aggregation period used (week, month, quarter)."},periodStart:{type:"timestamp",description:"Start timestamp for the aggregation window."},periodEnd:{type:"timestamp",description:"End timestamp for the aggregation window."}},tags:["knowledge","analytics"]}]},ct=te;var lt={meta:{id:"tenant-pfo-sample",tenantId:"tenant.family-office",appId:"pocket-family-office",blueprintName:"pocket-family-office.app",blueprintVersion:"1.0.0",environment:"production",version:"1.0.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),status:"published"},featureFlags:[{key:"voice-summaries",enabled:!0,description:"Enable spoken ElevenLabs summaries for daily briefings."}],integrations:[{slotId:"primaryLLM",connectionId:"conn-mistral-primary"},{slotId:"primaryVectorDb",connectionId:"conn-qdrant-finance"},{slotId:"primaryStorage",connectionId:"conn-gcs-documents"},{slotId:"primaryOpenBanking",connectionId:"conn-powens-primary"},{slotId:"emailInbound",connectionId:"conn-gmail-threads"},{slotId:"emailOutbound",connectionId:"conn-postmark-outbound"},{slotId:"calendarScheduling",connectionId:"conn-google-calendar"},{slotId:"voicePlayback",connectionId:"conn-elevenlabs-voice"},{slotId:"smsNotifications",connectionId:"conn-twilio-sms"},{slotId:"paymentsProcessing",connectionId:"conn-stripe-recurring"}],knowledge:[{spaceKey:"knowledge.financial-docs",scope:{workflows:["pfo.workflow.process-uploaded-document","pfo.workflow.generate-financial-summary"]}},{spaceKey:"knowledge.email-threads",scope:{workflows:["pfo.workflow.ingest-email-threads"]}},{spaceKey:"knowledge.financial-overview",scope:{workflows:["pfo.workflow.sync-openbanking-transactions","pfo.workflow.refresh-openbanking-balances","pfo.workflow.generate-financial-summary","pfo.workflow.generate-openbanking-overview"]},required:!1}],locales:{defaultLocale:"en",enabledLocales:["en"]},notes:"Sample tenant configuration for hackathon demos. Replace connection IDs with tenant-specific bindings when provisioning."};import{OwnersEnum as se,StabilityEnum as re,TagsEnum as ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ce}from"@contractspec/lib.contracts-spec/workflow/spec";var mt=ce({meta:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0",title:"Generate Financial Summary",description:"Retrieves the latest financial signals, generates an AI summary, and optionally distributes it by voice or email.",domain:"finance",owners:[se.PlatformFinance],tags:["summary","ai",ie.Automation],stability:re.Beta},definition:{entryStepId:"summarise",steps:[{id:"summarise",type:"automation",label:"Generate Summary",description:"Run retrieval augmented generation over the knowledge base to produce a household summary.",action:{operation:{key:"pfo.summary.generate",version:"1.0.0"}},requiredIntegrations:["primaryLLM","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:750}},{id:"distribute",type:"automation",label:"Distribute Summary",description:"Send the generated summary via email and optionally synthesise a voice note.",action:{operation:{key:"pfo.summary.dispatch",version:"1.0.0"}},requiredIntegrations:["emailOutbound"],retry:{maxAttempts:2,backoff:"linear",delayMs:500}}],transitions:[{from:"summarise",to:"distribute"}]}});import{OwnersEnum as de,StabilityEnum as le,TagsEnum as ge}from"@contractspec/lib.contracts-spec";import{defineWorkflow as fe}from"@contractspec/lib.contracts-spec/workflow/spec";var pe=[{key:"openbanking.accounts.read",version:"1.0.0"},{key:"openbanking.transactions.read",version:"1.0.0"},{key:"openbanking.balances.read",version:"1.0.0"}],kt=fe({meta:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0",title:"Generate Open Banking Overview",description:"Produces a derived financial overview and stores it in the operational knowledge space.",domain:"finance",owners:[de.PlatformFinance],tags:["open-banking","summary",ge.Automation],stability:le.Experimental},definition:{entryStepId:"generate-overview",steps:[{id:"generate-overview",type:"automation",label:"Generate Overview",description:"Aggregate balances, cashflow, and category breakdowns into a knowledge entry.",action:{operation:{key:"pfo.openbanking.generate-overview",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:pe,retry:{maxAttempts:3,backoff:"exponential",delayMs:1500}}],transitions:[]}});import{OwnersEnum as me,StabilityEnum as he,TagsEnum as ue}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ye}from"@contractspec/lib.contracts-spec/workflow/spec";var wt=ye({meta:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0",title:"Ingest Email Threads",description:"Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.",domain:"communications",owners:[me.PlatformMessaging],tags:["gmail","knowledge",ue.Automation],stability:he.Experimental},definition:{entryStepId:"sync",steps:[{id:"sync",type:"automation",label:"Sync Gmail Threads",description:"Fetches Gmail threads and transforms them into knowledge fragments before vector indexing.",action:{operation:{key:"pfo.email.sync-threads",version:"1.0.0"}},requiredIntegrations:["emailInbound","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"triage",type:"human",label:"Triage Exceptions",description:"Operators can resolve sync failures or tag important threads for follow-up."}],transitions:[{from:"sync",to:"triage",condition:"output?.syncedThreads === 0",label:"No new threads"}]}});import{OwnersEnum as ke,StabilityEnum as ve,TagsEnum as be}from"@contractspec/lib.contracts-spec";import{defineWorkflow as xe}from"@contractspec/lib.contracts-spec/workflow/spec";var Vt=xe({meta:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0",title:"Process Uploaded Document",description:"Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.",domain:"finance",owners:[ke.PlatformFinance],tags:["documents","ingestion",be.Automation],stability:ve.Experimental},definition:{entryStepId:"store",steps:[{id:"store",type:"automation",label:"Store and Queue Ingestion",description:"Persist the document to storage and enqueue the knowledge ingestion pipeline.",action:{operation:{key:"pfo.documents.upload",version:"1.0.0"}},requiredIntegrations:["primaryStorage","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:500}},{id:"review",type:"human",label:"Optional Human Classification",description:"Finance lead can categorise the document while ingestion completes."}],transitions:[{from:"store",to:"review"}]}});import{OwnersEnum as we,StabilityEnum as Me,TagsEnum as Ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ke}from"@contractspec/lib.contracts-spec/workflow/spec";var u={key:"openbanking.balances.read",version:"1.0.0"},Dt=Ke({meta:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0",title:"Refresh Open Banking Balances",description:"Refreshes balances for synced accounts to surface the latest cash positions in dashboards.",domain:"finance",owners:[we.PlatformFinance],tags:["open-banking","powens",Ie.Automation],stability:Me.Experimental},definition:{entryStepId:"refresh-balances",steps:[{id:"refresh-balances",type:"automation",label:"Refresh Balances",description:"Trigger the Powens provider to obtain current and available balances.",action:{operation:{key:"openbanking.balances.refresh",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-balances",type:"automation",label:"Fetch Balances",description:"Load the canonical balance snapshots for downstream workflows and dashboards.",action:{operation:{key:"openbanking.balances.get",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"refresh-balances",to:"fetch-balances"}]}});import{OwnersEnum as Ve,StabilityEnum as je,TagsEnum as Fe}from"@contractspec/lib.contracts-spec";import{defineWorkflow as qe}from"@contractspec/lib.contracts-spec/workflow/spec";var y={key:"openbanking.accounts.read",version:"1.0.0"},Xt=qe({meta:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0",title:"Synchronise Open Banking Accounts",description:"Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.",domain:"finance",owners:[Ve.PlatformFinance],tags:["open-banking","powens",Fe.Automation],stability:je.Experimental},definition:{entryStepId:"sync-accounts",steps:[{id:"sync-accounts",type:"automation",label:"Sync Accounts",description:"Refresh linked bank accounts via Powens and upsert canonical BankAccount records.",action:{operation:{key:"openbanking.accounts.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-accounts",type:"automation",label:"Fetch Accounts",description:"Retrieve the latest canonical account snapshot for downstream consumers.",action:{operation:{key:"openbanking.accounts.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"sync-accounts",to:"fetch-accounts"}]}});import{OwnersEnum as De,StabilityEnum as He,TagsEnum as Re}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Qe}from"@contractspec/lib.contracts-spec/workflow/spec";var k={key:"openbanking.transactions.read",version:"1.0.0"},Zt=Qe({meta:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0",title:"Synchronise Open Banking Transactions",description:"Fetches recent transactions from Powens for each linked account and stores them in the canonical ledger.",domain:"finance",owners:[De.PlatformFinance],tags:["open-banking","powens",Re.Automation],stability:He.Experimental},definition:{entryStepId:"sync-transactions",steps:[{id:"sync-transactions",type:"automation",label:"Sync Transactions",description:"Call the Powens provider to pull incremental transactions for active accounts.",action:{operation:{key:"openbanking.transactions.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[k],retry:{maxAttempts:4,backoff:"exponential",delayMs:1500}},{id:"list-transactions",type:"automation",label:"List Transactions",description:"Retrieve the canonical transaction list for reporting and downstream analytics.",action:{operation:{key:"openbanking.transactions.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[k],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"sync-transactions",to:"list-transactions"}]}});import{OwnersEnum as Xe,StabilityEnum as ze,TagsEnum as Je}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ue}from"@contractspec/lib.contracts-spec/workflow/spec";var Gt=Ue({meta:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0",title:"Schedule Upcoming Payment Reminder",description:"Collects payment metadata and schedules multi-channel reminders for bills that are due soon.",domain:"finance",owners:[Xe.PlatformFinance],tags:["payments","reminders",Je.Automation],stability:ze.Beta},definition:{entryStepId:"collect",steps:[{id:"collect",type:"human",label:"Review Upcoming Bill",description:"Confirm amount, due date, and preferred delivery channels before scheduling reminder."},{id:"schedule",type:"automation",label:"Schedule Reminder",action:{operation:{key:"pfo.reminders.schedule-payment",version:"1.0.0"}},requiredIntegrations:["emailOutbound","smsNotifications","calendarScheduling"],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"collect",to:"schedule",condition:"output?.confirmed === true",label:"Reminder confirmed"}]}});export{U as uploadDocumentContract,Gt as upcomingPaymentsReminderWorkflow,ot as tech_contracts_vertical_pocket_family_office_DocBlocks,Zt as syncOpenBankingTransactionsWorkflow,Xt as syncOpenBankingAccountsWorkflow,Y as syncEmailThreadsContract,P as schedulePaymentReminderContract,$e as registerPocketFamilyOfficeBlueprint,Dt as refreshOpenBankingBalancesWorkflow,Vt as processUploadedDocumentWorkflow,lt as pocketFamilyOfficeTenantSample,it as pocketFamilyOfficeTelemetry,Ye as pocketFamilyOfficeKnowledgeSources,Ee as pocketFamilyOfficeContracts,M as pocketFamilyOfficeConnections,w as pocketFamilyOfficeBlueprint,wt as ingestEmailThreadsWorkflow,Ce as getPocketFamilyOfficeConnection,kt as generateOpenBankingOverviewWorkflow,E as generateOpenBankingOverviewContract,mt as generateFinancialSummaryWorkflow,A as generateFinancialSummaryContract,F as example,_ as dispatchFinancialSummaryContract,nt as PocketFamilyOfficeFeature,ct as OPENBANKING_SENSITIVE_FIELDS};
131
+ `}];import{OPENBANKING_PII_FIELDS as te,OPENBANKING_TELEMETRY_EVENTS as p}from"@contractspec/lib.contracts-integrations";import{OwnersEnum as ne,StabilityEnum as oe,TagsEnum as ae}from"@contractspec/lib.contracts-spec/ownership";var f={tenantId:{type:"string",required:!0,description:"Tenant identifier for multi-tenant isolation."},appId:{type:"string",required:!0,description:"Application identifier associated with the event."},blueprint:{type:"string",required:!0,description:"Blueprint name@version emitting the telemetry."},configVersion:{type:"number",required:!0,description:"Resolved app config version when the event was generated."},slotId:{type:"string",required:!0,description:"Integration slot identifier (e.g., primaryOpenBanking)."},connectionId:{type:"string",required:!0,description:"Integration connection ID used for the sync."}};function h(s){return{type:"string",description:s,pii:!1}}var it={meta:{key:"pfo.telemetry",version:"1.0.0",title:"Pocket Family Office Telemetry",description:"Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.",domain:"finance",owners:[ne.PlatformFinance],tags:["open-banking",ae.Automation],stability:oe.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{key:p.accountsSynced,version:"1.0.0",semantics:{what:"Open banking account synchronisation completed.",why:"Refresh canonical account metadata for reporting and workflows."},privacy:"internal",properties:{...f,syncedCount:{type:"number",description:"Number of accounts synced successfully."},failedCount:{type:"number",description:"Number of accounts that failed to sync."},durationMs:{type:"number",description:"Duration of the sync job in milliseconds."}}},{key:p.transactionsSynced,version:"1.0.0",semantics:{what:"Open banking transaction synchronisation completed.",why:"Keep canonical transaction ledger in sync for analytics."},privacy:"internal",properties:{...f,accountId:{type:"string",description:"Bank account identifier used during the sync.",pii:!1},syncedCount:{type:"number",description:"Number of transactions synced successfully."},failedCount:{type:"number",description:"Number of transactions that failed to sync."},from:{type:"timestamp",description:"Start timestamp for the sync window."},to:{type:"timestamp",description:"End timestamp for the sync window."}}},{key:p.balancesRefreshed,version:"1.0.0",semantics:{what:"Open banking balances refreshed.",why:"Provide accurate cash position for dashboards and alerts."},privacy:"internal",properties:{...f,accountId:h("Bank account identifier."),balanceTypes:{type:"json",description:"Balance types included in the refresh."},refreshedAt:{type:"timestamp",description:"Timestamp when balances were refreshed."}}},{key:p.overviewGenerated,version:"1.0.0",semantics:{what:"Derived financial overview generated.",why:"Persist cashflow and category summaries into knowledge space."},privacy:"internal",properties:{...f,knowledgeEntryId:h("Identifier of the knowledge document containing the overview."),period:{type:"string",description:"Aggregation period used (week, month, quarter)."},periodStart:{type:"timestamp",description:"Start timestamp for the aggregation window."},periodEnd:{type:"timestamp",description:"End timestamp for the aggregation window."}},tags:["knowledge","analytics"]}]},ct=te;var lt={meta:{id:"tenant-pfo-sample",tenantId:"tenant.family-office",appId:"pocket-family-office",blueprintName:"pocket-family-office.app",blueprintVersion:"1.0.0",environment:"production",version:"1.0.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),status:"published"},featureFlags:[{key:"voice-summaries",enabled:!0,description:"Enable spoken ElevenLabs summaries for daily briefings."}],integrations:[{slotId:"primaryLLM",connectionId:"conn-mistral-primary"},{slotId:"primaryVectorDb",connectionId:"conn-qdrant-finance"},{slotId:"primaryStorage",connectionId:"conn-gcs-documents"},{slotId:"primaryOpenBanking",connectionId:"conn-powens-primary"},{slotId:"emailInbound",connectionId:"conn-gmail-threads"},{slotId:"emailOutbound",connectionId:"conn-postmark-outbound"},{slotId:"calendarScheduling",connectionId:"conn-google-calendar"},{slotId:"voicePlayback",connectionId:"conn-elevenlabs-voice"},{slotId:"smsNotifications",connectionId:"conn-twilio-sms"},{slotId:"paymentsProcessing",connectionId:"conn-stripe-recurring"}],knowledge:[{spaceKey:"knowledge.financial-docs",scope:{workflows:["pfo.workflow.process-uploaded-document","pfo.workflow.generate-financial-summary"]}},{spaceKey:"knowledge.email-threads",scope:{workflows:["pfo.workflow.ingest-email-threads"]}},{spaceKey:"knowledge.financial-overview",scope:{workflows:["pfo.workflow.sync-openbanking-transactions","pfo.workflow.refresh-openbanking-balances","pfo.workflow.generate-financial-summary","pfo.workflow.generate-openbanking-overview"]},required:!1}],locales:{defaultLocale:"en",enabledLocales:["en"]},notes:"Sample tenant configuration for hackathon demos. Replace connection IDs with tenant-specific bindings when provisioning."};import{OwnersEnum as re,StabilityEnum as se,TagsEnum as ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ce}from"@contractspec/lib.contracts-spec/workflow/spec";var mt=ce({meta:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0",title:"Generate Financial Summary",description:"Retrieves the latest financial signals, generates an AI summary, and optionally distributes it by voice or email.",domain:"finance",owners:[re.PlatformFinance],tags:["summary","ai",ie.Automation],stability:se.Beta},definition:{entryStepId:"summarise",steps:[{id:"summarise",type:"automation",label:"Generate Summary",description:"Run retrieval augmented generation over the knowledge base to produce a household summary.",action:{operation:{key:"pfo.summary.generate",version:"1.0.0"}},requiredIntegrations:["primaryLLM","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:750}},{id:"distribute",type:"automation",label:"Distribute Summary",description:"Send the generated summary via email and optionally synthesise a voice note.",action:{operation:{key:"pfo.summary.dispatch",version:"1.0.0"}},requiredIntegrations:["emailOutbound"],retry:{maxAttempts:2,backoff:"linear",delayMs:500}}],transitions:[{from:"summarise",to:"distribute"}]}});import{OwnersEnum as de,StabilityEnum as le,TagsEnum as ge}from"@contractspec/lib.contracts-spec";import{defineWorkflow as pe}from"@contractspec/lib.contracts-spec/workflow/spec";var fe=[{key:"openbanking.accounts.read",version:"1.0.0"},{key:"openbanking.transactions.read",version:"1.0.0"},{key:"openbanking.balances.read",version:"1.0.0"}],vt=pe({meta:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0",title:"Generate Open Banking Overview",description:"Produces a derived financial overview and stores it in the operational knowledge space.",domain:"finance",owners:[de.PlatformFinance],tags:["open-banking","summary",ge.Automation],stability:le.Experimental},definition:{entryStepId:"generate-overview",steps:[{id:"generate-overview",type:"automation",label:"Generate Overview",description:"Aggregate balances, cashflow, and category breakdowns into a knowledge entry.",action:{operation:{key:"pfo.openbanking.generate-overview",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:fe,retry:{maxAttempts:3,backoff:"exponential",delayMs:1500}}],transitions:[]}});import{OwnersEnum as me,StabilityEnum as he,TagsEnum as ue}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ye}from"@contractspec/lib.contracts-spec/workflow/spec";var wt=ye({meta:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0",title:"Ingest Email Threads",description:"Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.",domain:"communications",owners:[me.PlatformMessaging],tags:["gmail","knowledge",ue.Automation],stability:he.Experimental},definition:{entryStepId:"sync",steps:[{id:"sync",type:"automation",label:"Sync Gmail Threads",description:"Fetches Gmail threads and transforms them into knowledge fragments before vector indexing.",action:{operation:{key:"pfo.email.sync-threads",version:"1.0.0"}},requiredIntegrations:["emailInbound","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"triage",type:"human",label:"Triage Exceptions",description:"Operators can resolve sync failures or tag important threads for follow-up."}],transitions:[{from:"sync",to:"triage",condition:"output?.syncedThreads === 0",label:"No new threads"}]}});import{OwnersEnum as ve,StabilityEnum as ke,TagsEnum as be}from"@contractspec/lib.contracts-spec";import{defineWorkflow as xe}from"@contractspec/lib.contracts-spec/workflow/spec";var Vt=xe({meta:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0",title:"Process Uploaded Document",description:"Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.",domain:"finance",owners:[ve.PlatformFinance],tags:["documents","ingestion",be.Automation],stability:ke.Experimental},definition:{entryStepId:"store",steps:[{id:"store",type:"automation",label:"Store and Queue Ingestion",description:"Persist the document to storage and enqueue the knowledge ingestion pipeline.",action:{operation:{key:"pfo.documents.upload",version:"1.0.0"}},requiredIntegrations:["primaryStorage","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:500}},{id:"review",type:"human",label:"Optional Human Classification",description:"Finance lead can categorise the document while ingestion completes."}],transitions:[{from:"store",to:"review"}]}});import{OwnersEnum as we,StabilityEnum as Me,TagsEnum as Ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ke}from"@contractspec/lib.contracts-spec/workflow/spec";var u={key:"openbanking.balances.read",version:"1.0.0"},Ft=Ke({meta:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0",title:"Refresh Open Banking Balances",description:"Refreshes balances for synced accounts to surface the latest cash positions in dashboards.",domain:"finance",owners:[we.PlatformFinance],tags:["open-banking","powens",Ie.Automation],stability:Me.Experimental},definition:{entryStepId:"refresh-balances",steps:[{id:"refresh-balances",type:"automation",label:"Refresh Balances",description:"Trigger the Powens provider to obtain current and available balances.",action:{operation:{key:"openbanking.balances.refresh",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-balances",type:"automation",label:"Fetch Balances",description:"Load the canonical balance snapshots for downstream workflows and dashboards.",action:{operation:{key:"openbanking.balances.get",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"refresh-balances",to:"fetch-balances"}]}});import{OwnersEnum as Ve,StabilityEnum as je,TagsEnum as qe}from"@contractspec/lib.contracts-spec";import{defineWorkflow as De}from"@contractspec/lib.contracts-spec/workflow/spec";var y={key:"openbanking.accounts.read",version:"1.0.0"},Xt=De({meta:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0",title:"Synchronise Open Banking Accounts",description:"Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.",domain:"finance",owners:[Ve.PlatformFinance],tags:["open-banking","powens",qe.Automation],stability:je.Experimental},definition:{entryStepId:"sync-accounts",steps:[{id:"sync-accounts",type:"automation",label:"Sync Accounts",description:"Refresh linked bank accounts via Powens and upsert canonical BankAccount records.",action:{operation:{key:"openbanking.accounts.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-accounts",type:"automation",label:"Fetch Accounts",description:"Retrieve the latest canonical account snapshot for downstream consumers.",action:{operation:{key:"openbanking.accounts.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"sync-accounts",to:"fetch-accounts"}]}});import{OwnersEnum as Fe,StabilityEnum as He,TagsEnum as Re}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Qe}from"@contractspec/lib.contracts-spec/workflow/spec";var v={key:"openbanking.transactions.read",version:"1.0.0"},Zt=Qe({meta:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0",title:"Synchronise Open Banking Transactions",description:"Fetches recent transactions from Powens for each linked account and stores them in the canonical ledger.",domain:"finance",owners:[Fe.PlatformFinance],tags:["open-banking","powens",Re.Automation],stability:He.Experimental},definition:{entryStepId:"sync-transactions",steps:[{id:"sync-transactions",type:"automation",label:"Sync Transactions",description:"Call the Powens provider to pull incremental transactions for active accounts.",action:{operation:{key:"openbanking.transactions.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[v],retry:{maxAttempts:4,backoff:"exponential",delayMs:1500}},{id:"list-transactions",type:"automation",label:"List Transactions",description:"Retrieve the canonical transaction list for reporting and downstream analytics.",action:{operation:{key:"openbanking.transactions.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[v],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"sync-transactions",to:"list-transactions"}]}});import{OwnersEnum as Xe,StabilityEnum as ze,TagsEnum as Je}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ue}from"@contractspec/lib.contracts-spec/workflow/spec";var Pt=Ue({meta:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0",title:"Schedule Upcoming Payment Reminder",description:"Collects payment metadata and schedules multi-channel reminders for bills that are due soon.",domain:"finance",owners:[Xe.PlatformFinance],tags:["payments","reminders",Je.Automation],stability:ze.Beta},definition:{entryStepId:"collect",steps:[{id:"collect",type:"human",label:"Review Upcoming Bill",description:"Confirm amount, due date, and preferred delivery channels before scheduling reminder."},{id:"schedule",type:"automation",label:"Schedule Reminder",action:{operation:{key:"pfo.reminders.schedule-payment",version:"1.0.0"}},requiredIntegrations:["emailOutbound","smsNotifications","calendarScheduling"],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"collect",to:"schedule",condition:"output?.confirmed === true",label:"Reminder confirmed"}]}});export{U as uploadDocumentContract,Pt as upcomingPaymentsReminderWorkflow,ot as tech_contracts_vertical_pocket_family_office_DocBlocks,Zt as syncOpenBankingTransactionsWorkflow,Xt as syncOpenBankingAccountsWorkflow,Y as syncEmailThreadsContract,C as schedulePaymentReminderContract,$e as registerPocketFamilyOfficeBlueprint,Ft as refreshOpenBankingBalancesWorkflow,Vt as processUploadedDocumentWorkflow,lt as pocketFamilyOfficeTenantSample,it as pocketFamilyOfficeTelemetry,Ye as pocketFamilyOfficeKnowledgeSources,Ee as pocketFamilyOfficeContracts,M as pocketFamilyOfficeConnections,w as pocketFamilyOfficeBlueprint,wt as ingestEmailThreadsWorkflow,Ge as getPocketFamilyOfficeConnection,vt as generateOpenBankingOverviewWorkflow,E as generateOpenBankingOverviewContract,mt as generateFinancialSummaryWorkflow,A as generateFinancialSummaryContract,q as example,O as dispatchFinancialSummaryContract,nt as PocketFamilyOfficeFeature,ct as OPENBANKING_SENSITIVE_FIELDS,j as ExamplesPocketFamilyOfficeExample};
@@ -1,4 +1,4 @@
1
- import{defineFeature as g}from"@contractspec/lib.contracts-spec";var j=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),k=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
1
+ import{defineFeature as g}from"@contractspec/lib.contracts-spec/features";var j=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),k=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
2
2
 
3
3
  Pocket Family Office is a ContractSpec reference vertical that
4
4
  demonstrates finance automation atop the integration and knowledge
package/dist/example.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- declare const example: import("@contractspec/lib.contracts-spec").ExampleSpec;
2
- export default example;
1
+ declare const ExamplesPocketFamilyOfficeExample: import("@contractspec/lib.contracts-spec").ExampleSpec;
2
+ export default ExamplesPocketFamilyOfficeExample;
3
+ export { ExamplesPocketFamilyOfficeExample };
package/dist/example.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"]},docs:{rootDocId:"docs.examples.pocket-family-office"},entrypoints:{packageName:"@contractspec/example.pocket-family-office",feature:"./feature",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
2
+ import{defineExample as b}from"@contractspec/lib.contracts-spec/examples";var d=b({meta:{key:"examples.pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Pocket Family Office example - personal finance automation with open banking",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","pocket-family-office"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.pocket-family-office"}}),j=d;export{j as default,d as ExamplesPocketFamilyOfficeExample};
package/dist/index.d.ts CHANGED
@@ -8,3 +8,4 @@ export * from './telemetry';
8
8
  export * from './tenant.sample';
9
9
  export * from './workflows';
10
10
  import './docs';
11
+ export * from './example';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{OwnersEnum as v,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.contracts-spec/ownership";var t=(r,m)=>({key:r,version:m}),w={meta:{key:"pocket-family-office.app",version:"1.0.0",appId:"pocket-family-office",title:"Pocket Family Office",description:"Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.",domain:"finance",owners:[v.PlatformFinance],tags:[x.Guide,"finance","automation"],stability:b.Experimental},capabilities:{enabled:[t("ai.chat","1.0.0"),t("ai.embeddings","1.0.0"),t("vector-db.search","1.0.0"),t("vector-db.storage","1.0.0"),t("storage.objects","1.0.0"),t("email.inbound","1.0.0"),t("email.transactional","1.0.0"),t("calendar.events","1.0.0"),t("sms.outbound","1.0.0"),t("ai.voice.tts","1.0.0"),t("payments.psp","1.0.0"),t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")]},integrationSlots:[{slotId:"primaryLLM",requiredCategory:"ai-llm",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.chat","1.0.0")],required:!0,description:"Chat completion provider powering summarisation, explanations, and insights."},{slotId:"primaryVectorDb",requiredCategory:"vector-db",allowedModes:["managed","byok"],requiredCapabilities:[t("vector-db.search","1.0.0")],required:!0,description:"Vector database storing embeddings for financial documents and email threads."},{slotId:"primaryStorage",requiredCategory:"storage",allowedModes:["managed","byok"],requiredCapabilities:[t("storage.objects","1.0.0")],required:!0,description:"Object storage used for raw uploads and normalised documents."},{slotId:"primaryOpenBanking",requiredCategory:"open-banking",allowedModes:["byok"],requiredCapabilities:[t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")],required:!0,description:"Powens BYOK connection powering bank account, transaction, and balance synchronisation."},{slotId:"emailInbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.inbound","1.0.0")],required:!0,description:"Inbound email/thread sync (Gmail) feeding the knowledge corpus."},{slotId:"emailOutbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.transactional","1.0.0")],required:!0,description:"Transactional email delivery for reminders and summaries."},{slotId:"calendarScheduling",requiredCategory:"calendar",allowedModes:["managed","byok"],requiredCapabilities:[t("calendar.events","1.0.0")],required:!0,description:"Creates calendar holds for bill reviews and handoff meetings."},{slotId:"voicePlayback",requiredCategory:"ai-voice-tts",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.voice.tts","1.0.0")],required:!1,description:"Optional voice synthesis for spoken summaries (ElevenLabs)."},{slotId:"smsNotifications",requiredCategory:"sms",allowedModes:["managed","byok"],requiredCapabilities:[t("sms.outbound","1.0.0")],required:!1,description:"SMS provider used for urgent reminders."},{slotId:"paymentsProcessing",requiredCategory:"payments",allowedModes:["managed","byok"],requiredCapabilities:[t("payments.psp","1.0.0")],required:!1,description:"Optional payments processor enabling bill pay automations."}],workflows:{processUploadedDocument:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},upcomingPaymentsReminder:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},generateFinancialSummary:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},ingestEmailThreads:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"},syncOpenBankingAccounts:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},syncOpenBankingTransactions:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},refreshOpenBankingBalances:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},generateOpenBankingOverview:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"}},policies:[{key:"pfo.policy.tenancy",version:"1.0.0"},{key:"knowledge.access.financial-docs",version:"1.0.0"}],telemetry:{spec:{key:"pfo.telemetry",version:"1.0.0"}},featureFlags:[{key:"voice-summaries",enabled:!1,description:"Enable ElevenLabs spoken summaries in addition to email distribution."}],routes:[{path:"/dashboard",label:"Overview",workflow:"pfo.workflow.generate-financial-summary"},{path:"/documents/upload",label:"Upload Document",workflow:"pfo.workflow.process-uploaded-document"},{path:"/communications",label:"Inbox",workflow:"pfo.workflow.ingest-email-threads"}],notes:"Pocket Family Office blueprint pulling together finance automations for the hackathon reference implementation."};function $e(r){return r.register(w)}var o=new Date,a={tenantId:"tenant.family-office",createdAt:o,updatedAt:o},M=[{meta:{...a,id:"conn-mistral-primary",integrationKey:"ai-llm.mistral",integrationVersion:"1.0.0",label:"Mistral Primary"},ownershipMode:"managed",config:{model:"mistral-large-latest",embeddingModel:"mistral-embed"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/mistral-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-qdrant-finance",integrationKey:"vectordb.qdrant",integrationVersion:"1.0.0",label:"Qdrant Finance Cluster"},ownershipMode:"managed",config:{apiUrl:"https://qdrant.pfo.internal",collectionPrefix:"tenant-family-office"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/qdrant-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:95}},{meta:{...a,id:"conn-gcs-documents",integrationKey:"storage.gcs",integrationVersion:"1.0.0",label:"GCS Documents Bucket"},ownershipMode:"managed",config:{bucket:"pfo-uploads",prefix:"financial-docs/"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gcs-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:60}},{meta:{...a,id:"conn-gmail-threads",integrationKey:"email.gmail",integrationVersion:"1.0.0",label:"Gmail Household Threads"},ownershipMode:"byok",config:{labelIds:["FINANCE","INBOX"],includeSpamTrash:!1},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gmail-refresh-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:320}},{meta:{...a,id:"conn-postmark-outbound",integrationKey:"email.postmark",integrationVersion:"1.0.0",label:"Postmark Transactional"},ownershipMode:"managed",config:{messageStream:"outbound",fromEmail:"family.office@pfo.dev"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/postmark-server-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:210}},{meta:{...a,id:"conn-google-calendar",integrationKey:"calendar.google",integrationVersion:"1.0.0",label:"Household Calendar"},ownershipMode:"managed",config:{calendarId:"primary"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/google-calendar-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:140}},{meta:{...a,id:"conn-elevenlabs-voice",integrationKey:"ai-voice.elevenlabs",integrationVersion:"1.0.0",label:"ElevenLabs Voice"},ownershipMode:"byok",config:{defaultVoiceId:"pNInz6obpgDQGcFmaJgB"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/elevenlabs-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:250}},{meta:{...a,id:"conn-twilio-sms",integrationKey:"sms.twilio",integrationVersion:"1.0.0",label:"Twilio SMS"},ownershipMode:"managed",config:{fromNumber:"+15552340000"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/twilio-auth-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-stripe-recurring",integrationKey:"payments.stripe",integrationVersion:"1.0.0",label:"Stripe Recurring Billing"},ownershipMode:"managed",config:{accountId:"acct_1PFOHACKATHON",region:"eu-west-1"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/stripe-secret-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:220}},{meta:{...a,id:"conn-powens-primary",integrationKey:"openbanking.powens",integrationVersion:"1.0.0",label:"Powens Open Banking"},ownershipMode:"byok",config:{environment:"sandbox",baseUrl:"https://api-sandbox.powens.com/v2"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/powens-credentials/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:410}}];function Ce(r){return M.find((m)=>m.meta.id===r)}import{registerDocBlocks as I}from"@contractspec/lib.contracts-spec/docs";var K=[{id:"docs.examples.pocket-family-office.goal",title:"Pocket Family Office \u2014 Goal",summary:"Secure personal finance automation combining documents and open banking.",kind:"goal",visibility:"public",route:"/docs/examples/pocket-family-office/goal",tags:["finance","goal"],body:`## Why it matters
2
+ import{OwnersEnum as k,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.contracts-spec/ownership";var t=(s,m)=>({key:s,version:m}),w={meta:{key:"pocket-family-office.app",version:"1.0.0",appId:"pocket-family-office",title:"Pocket Family Office",description:"Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.",domain:"finance",owners:[k.PlatformFinance],tags:[x.Guide,"finance","automation"],stability:b.Experimental},capabilities:{enabled:[t("ai.chat","1.0.0"),t("ai.embeddings","1.0.0"),t("vector-db.search","1.0.0"),t("vector-db.storage","1.0.0"),t("storage.objects","1.0.0"),t("email.inbound","1.0.0"),t("email.transactional","1.0.0"),t("calendar.events","1.0.0"),t("sms.outbound","1.0.0"),t("ai.voice.tts","1.0.0"),t("payments.psp","1.0.0"),t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")]},integrationSlots:[{slotId:"primaryLLM",requiredCategory:"ai-llm",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.chat","1.0.0")],required:!0,description:"Chat completion provider powering summarisation, explanations, and insights."},{slotId:"primaryVectorDb",requiredCategory:"vector-db",allowedModes:["managed","byok"],requiredCapabilities:[t("vector-db.search","1.0.0")],required:!0,description:"Vector database storing embeddings for financial documents and email threads."},{slotId:"primaryStorage",requiredCategory:"storage",allowedModes:["managed","byok"],requiredCapabilities:[t("storage.objects","1.0.0")],required:!0,description:"Object storage used for raw uploads and normalised documents."},{slotId:"primaryOpenBanking",requiredCategory:"open-banking",allowedModes:["byok"],requiredCapabilities:[t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")],required:!0,description:"Powens BYOK connection powering bank account, transaction, and balance synchronisation."},{slotId:"emailInbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.inbound","1.0.0")],required:!0,description:"Inbound email/thread sync (Gmail) feeding the knowledge corpus."},{slotId:"emailOutbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.transactional","1.0.0")],required:!0,description:"Transactional email delivery for reminders and summaries."},{slotId:"calendarScheduling",requiredCategory:"calendar",allowedModes:["managed","byok"],requiredCapabilities:[t("calendar.events","1.0.0")],required:!0,description:"Creates calendar holds for bill reviews and handoff meetings."},{slotId:"voicePlayback",requiredCategory:"ai-voice-tts",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.voice.tts","1.0.0")],required:!1,description:"Optional voice synthesis for spoken summaries (ElevenLabs)."},{slotId:"smsNotifications",requiredCategory:"sms",allowedModes:["managed","byok"],requiredCapabilities:[t("sms.outbound","1.0.0")],required:!1,description:"SMS provider used for urgent reminders."},{slotId:"paymentsProcessing",requiredCategory:"payments",allowedModes:["managed","byok"],requiredCapabilities:[t("payments.psp","1.0.0")],required:!1,description:"Optional payments processor enabling bill pay automations."}],workflows:{processUploadedDocument:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},upcomingPaymentsReminder:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},generateFinancialSummary:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},ingestEmailThreads:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"},syncOpenBankingAccounts:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},syncOpenBankingTransactions:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},refreshOpenBankingBalances:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},generateOpenBankingOverview:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"}},policies:[{key:"pfo.policy.tenancy",version:"1.0.0"},{key:"knowledge.access.financial-docs",version:"1.0.0"}],telemetry:{spec:{key:"pfo.telemetry",version:"1.0.0"}},featureFlags:[{key:"voice-summaries",enabled:!1,description:"Enable ElevenLabs spoken summaries in addition to email distribution."}],routes:[{path:"/dashboard",label:"Overview",workflow:"pfo.workflow.generate-financial-summary"},{path:"/documents/upload",label:"Upload Document",workflow:"pfo.workflow.process-uploaded-document"},{path:"/communications",label:"Inbox",workflow:"pfo.workflow.ingest-email-threads"}],notes:"Pocket Family Office blueprint pulling together finance automations for the hackathon reference implementation."};function $e(s){return s.register(w)}var o=new Date,a={tenantId:"tenant.family-office",createdAt:o,updatedAt:o},M=[{meta:{...a,id:"conn-mistral-primary",integrationKey:"ai-llm.mistral",integrationVersion:"1.0.0",label:"Mistral Primary"},ownershipMode:"managed",config:{model:"mistral-large-latest",embeddingModel:"mistral-embed"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/mistral-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-qdrant-finance",integrationKey:"vectordb.qdrant",integrationVersion:"1.0.0",label:"Qdrant Finance Cluster"},ownershipMode:"managed",config:{apiUrl:"https://qdrant.pfo.internal",collectionPrefix:"tenant-family-office"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/qdrant-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:95}},{meta:{...a,id:"conn-gcs-documents",integrationKey:"storage.gcs",integrationVersion:"1.0.0",label:"GCS Documents Bucket"},ownershipMode:"managed",config:{bucket:"pfo-uploads",prefix:"financial-docs/"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gcs-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:60}},{meta:{...a,id:"conn-gmail-threads",integrationKey:"email.gmail",integrationVersion:"1.0.0",label:"Gmail Household Threads"},ownershipMode:"byok",config:{labelIds:["FINANCE","INBOX"],includeSpamTrash:!1},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gmail-refresh-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:320}},{meta:{...a,id:"conn-postmark-outbound",integrationKey:"email.postmark",integrationVersion:"1.0.0",label:"Postmark Transactional"},ownershipMode:"managed",config:{messageStream:"outbound",fromEmail:"family.office@pfo.dev"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/postmark-server-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:210}},{meta:{...a,id:"conn-google-calendar",integrationKey:"calendar.google",integrationVersion:"1.0.0",label:"Household Calendar"},ownershipMode:"managed",config:{calendarId:"primary"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/google-calendar-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:140}},{meta:{...a,id:"conn-elevenlabs-voice",integrationKey:"ai-voice.elevenlabs",integrationVersion:"1.0.0",label:"ElevenLabs Voice"},ownershipMode:"byok",config:{defaultVoiceId:"pNInz6obpgDQGcFmaJgB"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/elevenlabs-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:250}},{meta:{...a,id:"conn-twilio-sms",integrationKey:"sms.twilio",integrationVersion:"1.0.0",label:"Twilio SMS"},ownershipMode:"managed",config:{fromNumber:"+15552340000"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/twilio-auth-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-stripe-recurring",integrationKey:"payments.stripe",integrationVersion:"1.0.0",label:"Stripe Recurring Billing"},ownershipMode:"managed",config:{accountId:"acct_1PFOHACKATHON",region:"eu-west-1"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/stripe-secret-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:220}},{meta:{...a,id:"conn-powens-primary",integrationKey:"openbanking.powens",integrationVersion:"1.0.0",label:"Powens Open Banking"},ownershipMode:"byok",config:{environment:"sandbox",baseUrl:"https://api-sandbox.powens.com/v2"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/powens-credentials/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:410}}];function Ge(s){return M.find((m)=>m.meta.id===s)}import{registerDocBlocks as I}from"@contractspec/lib.contracts-spec/docs";var K=[{id:"docs.examples.pocket-family-office.goal",title:"Pocket Family Office \u2014 Goal",summary:"Secure personal finance automation combining documents and open banking.",kind:"goal",visibility:"public",route:"/docs/examples/pocket-family-office/goal",tags:["finance","goal"],body:`## Why it matters
3
3
  - Automate document ingestion (receipts, statements) and link to transactions.
4
4
  - Provides a "family office" grade overview for individuals.
5
5
  - Uses open banking for real-time data and AI for insights.
@@ -24,7 +24,7 @@ import{OwnersEnum as v,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.c
24
24
 
25
25
  ## Guardrails
26
26
  - PII is redacted in summaries by default.
27
- - Read-only access to bank data (no write/payment initiation in this template).`},{id:"docs.examples.pocket-family-office.reference",title:"Pocket Family Office \u2014 Reference",summary:"Key components of the Pocket Family Office system.",kind:"reference",visibility:"public",route:"/docs/examples/pocket-family-office",tags:["finance","reference"],body:"## Workflows\n- `process-uploaded-document`: Extracts data from PDFs/Images.\n- `sync-openbanking-transactions`: Fetches latest transactions.\n- `generate-financial-summary`: AI-driven report generation.\n- `upcoming-payments-reminder`: Scans needed actions.\n\n## Operations\n- `pfo.documents.upload`: Secure upload endpoint for documents.\n\n## Capabilities\n- Requires: `identity`, `openbanking`.\n- Provides: `pocket-family-office`."}];I(K);import{defineExample as V}from"@contractspec/lib.contracts-spec";var j=V({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"]},docs:{rootDocId:"docs.examples.pocket-family-office"},entrypoints:{packageName:"@contractspec/example.pocket-family-office",feature:"./feature",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),F=j;var s=new Date,Ye=[{meta:{id:"source-financial-uploads",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-docs",spaceVersion:"1.0.0",label:"Uploaded Financial Documents",sourceType:"file_upload",createdAt:s,updatedAt:s},config:{bucket:"pfo-uploads",prefix:"financial-docs/"},syncSchedule:{enabled:!0,intervalMs:900000},lastSync:{timestamp:s,success:!0}},{meta:{id:"source-gmail-threads",tenantId:"tenant.family-office",spaceKey:"knowledge.email-threads",spaceVersion:"1.0.0",label:"Household Gmail Threads",sourceType:"email",createdAt:s,updatedAt:s},config:{labelIds:["INBOX","FINANCE"]},syncSchedule:{enabled:!0,intervalMs:300000},lastSync:{timestamp:s,success:!0}},{meta:{id:"source-financial-overview",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-overview",spaceVersion:"1.0.0",label:"Financial Overview",sourceType:"api",createdAt:s,updatedAt:s},config:{},syncSchedule:{enabled:!1}}];import{OPENBANKING_TELEMETRY_EVENTS as q}from"@contractspec/lib.contracts-integrations";import{defineCommand as l,defineQuery as D}from"@contractspec/lib.contracts-spec";import{OwnersEnum as i,StabilityEnum as c,TagsEnum as d}from"@contractspec/lib.contracts-spec/ownership";import{defineEnum as g,defineSchemaModel as n,ScalarTypeEnum as e}from"@contractspec/lib.schema";var H=g("Source",["upload","email","sync"]),R=g("Channel",["email","sms","both"]),Q=g("Period",["P7d","P30d","P90d"]),X=g("ObPeriod",["Pweek","Pmonth","Pquarter"]),z=n({name:"UploadDocumentInput",fields:{bucket:{type:e.NonEmptyString(),isOptional:!1},objectKey:{type:e.NonEmptyString(),isOptional:!1},mimeType:{type:e.NonEmptyString(),isOptional:!1},bytes:{type:e.Int_unsecure(),isOptional:!1},tags:{type:e.String_unsecure(),isOptional:!1,isArray:!0},uploadedAt:{type:e.Date(),isOptional:!1},source:{type:H,isOptional:!1}}}),J=n({name:"UploadDocumentOutput",fields:{documentId:{type:e.String_unsecure(),isOptional:!1},ingestionJobId:{type:e.String_unsecure(),isOptional:!1}}}),U=l({meta:{key:"pfo.documents.upload",version:"1.0.0",description:"Stores an object in tenant storage and schedules ingestion into the knowledge base.",goal:"Allow users to ingest financial documents for processing.",context:"Part of the finance domain. Documents are uploaded to object storage and then processed by the ingestion pipeline.",owners:[i.PlatformFinance],tags:["documents","ingestion",d.Guide],stability:c.Experimental},io:{input:z,output:J},policy:{auth:"user",rateLimit:{rpm:30,key:"user"}}}),Z=n({name:"PaymentReminderInput",fields:{billId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientPhone:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.Date(),isOptional:!1},amountCents:{type:e.Int_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},channel:{type:R,isOptional:!1},memo:{type:e.String_unsecure(),isOptional:!0}}}),$=n({name:"PaymentReminderOutput",fields:{reminderId:{type:e.String_unsecure(),isOptional:!1},scheduledAt:{type:e.Date(),isOptional:!1}}}),P=l({meta:{key:"pfo.reminders.schedule-payment",version:"1.0.0",description:"Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.",goal:"Ensure bills are paid on time by notifying users.",context:"Finance automation. Reminders are sent via configured channels (email, SMS).",owners:[i.PlatformFinance],tags:["payments","reminders",d.Automation],stability:c.Beta},io:{input:Z,output:$},policy:{auth:"user"}}),C=n({name:"FinancialSummaryInput",fields:{period:{type:Q,isOptional:!1},includeVoiceSummary:{type:e.Boolean(),isOptional:!1}}}),G=n({name:"SummaryHighlight",fields:{label:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1}}}),S=n({name:"FinancialSummaryOutput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},markdown:{type:e.String_unsecure(),isOptional:!1},highlights:{type:G,isOptional:!1,isArray:!0},cashflowDelta:{type:e.Float_unsecure(),isOptional:!1}}}),A=D({meta:{key:"pfo.summary.generate",version:"1.0.0",description:"Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.",goal:"Provide a quick overview of financial status and recent activity.",context:"Uses RAG over ingested knowledge. Summaries can be dispatched or viewed in app.",owners:[i.PlatformFinance],tags:["summary","ai",d.Automation],stability:c.Beta},io:{input:C,output:S},policy:{auth:"user"}}),W=n({name:"SyncEmailThreadsInput",fields:{labelIds:{type:e.String_unsecure(),isOptional:!1,isArray:!0},maxThreads:{type:e.Int_unsecure(),isOptional:!1},syncSinceMinutes:{type:e.Int_unsecure(),isOptional:!1}}}),L=n({name:"SyncEmailThreadsOutput",fields:{syncedThreads:{type:e.Int_unsecure(),isOptional:!1},lastMessageAt:{type:e.Date(),isOptional:!0}}}),Y=l({meta:{key:"pfo.email.sync-threads",version:"1.0.0",description:"Triggers ingestion of Gmail threads into the operational knowledge space.",goal:"Keep knowledge base up to date with email communications.",context:"Syncs from Gmail integration. Only includes threads matching configured labels.",owners:[i.PlatformMessaging],tags:["gmail","knowledge",d.Automation],stability:c.Beta},io:{input:W,output:L},policy:{auth:"user"}}),B=n({name:"SummaryDispatchInput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientName:{type:e.String_unsecure(),isOptional:!0},includeVoice:{type:e.Boolean(),isOptional:!1},voiceRecipient:{type:e.String_unsecure(),isOptional:!0}}}),O=n({name:"SummaryDispatchOutput",fields:{dispatchId:{type:e.String_unsecure(),isOptional:!1},emailSent:{type:e.Boolean(),isOptional:!1},voiceUrl:{type:e.String_unsecure(),isOptional:!0}}}),_=l({meta:{key:"pfo.summary.dispatch",version:"1.0.0",description:"Delivers the generated summary via email and optionally synthesises a voice note.",goal:"Deliver financial insights to users proactively.",context:"Dispatches summaries generated by pfo.summary.generate via email or voice.",owners:[i.PlatformMessaging],tags:["summary","communications",d.Automation],stability:c.Experimental},io:{input:B,output:O},policy:{auth:"user"}}),N=n({name:"OpenBankingOverviewInput",fields:{tenantId:{type:e.String_unsecure(),isOptional:!1},accountIds:{type:e.String_unsecure(),isOptional:!0,isArray:!0},period:{type:X,isOptional:!1},asOf:{type:e.Date(),isOptional:!0},includeCategories:{type:e.Boolean(),isOptional:!1},includeCashflowTrend:{type:e.Boolean(),isOptional:!1}}}),T=n({name:"OpenBankingOverviewOutput",fields:{knowledgeEntryId:{type:e.String_unsecure(),isOptional:!1},periodStart:{type:e.Date(),isOptional:!1},periodEnd:{type:e.Date(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},summaryPath:{type:e.String_unsecure(),isOptional:!0}}}),E=l({meta:{key:"pfo.openbanking.generate-overview",version:"1.0.0",description:"Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.",goal:"Create a periodic financial snapshot.",context:"Aggregates data from open banking integration into a document.",owners:[i.PlatformFinance],tags:["open-banking","summary",d.Automation],stability:c.Experimental},io:{input:N,output:T},policy:{auth:"user"},telemetry:{success:{event:{key:q.overviewGenerated,version:"1.0.0"}}}}),Ee={"pfo.documents.upload":U,"pfo.reminders.schedule-payment":P,"pfo.summary.generate":A,"pfo.summary.dispatch":_,"pfo.email.sync-threads":Y,"pfo.openbanking.generate-overview":E};import{defineFeature as ee}from"@contractspec/lib.contracts-spec";var nt=ee({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),ot=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
27
+ - Read-only access to bank data (no write/payment initiation in this template).`},{id:"docs.examples.pocket-family-office.reference",title:"Pocket Family Office \u2014 Reference",summary:"Key components of the Pocket Family Office system.",kind:"reference",visibility:"public",route:"/docs/examples/pocket-family-office",tags:["finance","reference"],body:"## Workflows\n- `process-uploaded-document`: Extracts data from PDFs/Images.\n- `sync-openbanking-transactions`: Fetches latest transactions.\n- `generate-financial-summary`: AI-driven report generation.\n- `upcoming-payments-reminder`: Scans needed actions.\n\n## Operations\n- `pfo.documents.upload`: Secure upload endpoint for documents.\n\n## Capabilities\n- Requires: `identity`, `openbanking`.\n- Provides: `pocket-family-office`."}];I(K);import{defineExample as V}from"@contractspec/lib.contracts-spec/examples";var j=V({meta:{key:"examples.pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Pocket Family Office example - personal finance automation with open banking",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","pocket-family-office"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.pocket-family-office"}}),q=j;var r=new Date,Ye=[{meta:{id:"source-financial-uploads",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-docs",spaceVersion:"1.0.0",label:"Uploaded Financial Documents",sourceType:"file_upload",createdAt:r,updatedAt:r},config:{bucket:"pfo-uploads",prefix:"financial-docs/"},syncSchedule:{enabled:!0,intervalMs:900000},lastSync:{timestamp:r,success:!0}},{meta:{id:"source-gmail-threads",tenantId:"tenant.family-office",spaceKey:"knowledge.email-threads",spaceVersion:"1.0.0",label:"Household Gmail Threads",sourceType:"email",createdAt:r,updatedAt:r},config:{labelIds:["INBOX","FINANCE"]},syncSchedule:{enabled:!0,intervalMs:300000},lastSync:{timestamp:r,success:!0}},{meta:{id:"source-financial-overview",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-overview",spaceVersion:"1.0.0",label:"Financial Overview",sourceType:"api",createdAt:r,updatedAt:r},config:{},syncSchedule:{enabled:!1}}];import{OPENBANKING_TELEMETRY_EVENTS as D}from"@contractspec/lib.contracts-integrations";import{defineCommand as l,defineQuery as F}from"@contractspec/lib.contracts-spec";import{OwnersEnum as i,StabilityEnum as c,TagsEnum as d}from"@contractspec/lib.contracts-spec/ownership";import{defineEnum as g,defineSchemaModel as n,ScalarTypeEnum as e}from"@contractspec/lib.schema";var H=g("Source",["upload","email","sync"]),R=g("Channel",["email","sms","both"]),Q=g("Period",["P7d","P30d","P90d"]),X=g("ObPeriod",["Pweek","Pmonth","Pquarter"]),z=n({name:"UploadDocumentInput",fields:{bucket:{type:e.NonEmptyString(),isOptional:!1},objectKey:{type:e.NonEmptyString(),isOptional:!1},mimeType:{type:e.NonEmptyString(),isOptional:!1},bytes:{type:e.Int_unsecure(),isOptional:!1},tags:{type:e.String_unsecure(),isOptional:!1,isArray:!0},uploadedAt:{type:e.Date(),isOptional:!1},source:{type:H,isOptional:!1}}}),J=n({name:"UploadDocumentOutput",fields:{documentId:{type:e.String_unsecure(),isOptional:!1},ingestionJobId:{type:e.String_unsecure(),isOptional:!1}}}),U=l({meta:{key:"pfo.documents.upload",version:"1.0.0",description:"Stores an object in tenant storage and schedules ingestion into the knowledge base.",goal:"Allow users to ingest financial documents for processing.",context:"Part of the finance domain. Documents are uploaded to object storage and then processed by the ingestion pipeline.",owners:[i.PlatformFinance],tags:["documents","ingestion",d.Guide],stability:c.Experimental},io:{input:z,output:J},policy:{auth:"user",rateLimit:{rpm:30,key:"user"}}}),Z=n({name:"PaymentReminderInput",fields:{billId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientPhone:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.Date(),isOptional:!1},amountCents:{type:e.Int_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},channel:{type:R,isOptional:!1},memo:{type:e.String_unsecure(),isOptional:!0}}}),$=n({name:"PaymentReminderOutput",fields:{reminderId:{type:e.String_unsecure(),isOptional:!1},scheduledAt:{type:e.Date(),isOptional:!1}}}),C=l({meta:{key:"pfo.reminders.schedule-payment",version:"1.0.0",description:"Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.",goal:"Ensure bills are paid on time by notifying users.",context:"Finance automation. Reminders are sent via configured channels (email, SMS).",owners:[i.PlatformFinance],tags:["payments","reminders",d.Automation],stability:c.Beta},io:{input:Z,output:$},policy:{auth:"user"}}),G=n({name:"FinancialSummaryInput",fields:{period:{type:Q,isOptional:!1},includeVoiceSummary:{type:e.Boolean(),isOptional:!1}}}),P=n({name:"SummaryHighlight",fields:{label:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1}}}),S=n({name:"FinancialSummaryOutput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},markdown:{type:e.String_unsecure(),isOptional:!1},highlights:{type:P,isOptional:!1,isArray:!0},cashflowDelta:{type:e.Float_unsecure(),isOptional:!1}}}),A=F({meta:{key:"pfo.summary.generate",version:"1.0.0",description:"Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.",goal:"Provide a quick overview of financial status and recent activity.",context:"Uses RAG over ingested knowledge. Summaries can be dispatched or viewed in app.",owners:[i.PlatformFinance],tags:["summary","ai",d.Automation],stability:c.Beta},io:{input:G,output:S},policy:{auth:"user"}}),W=n({name:"SyncEmailThreadsInput",fields:{labelIds:{type:e.String_unsecure(),isOptional:!1,isArray:!0},maxThreads:{type:e.Int_unsecure(),isOptional:!1},syncSinceMinutes:{type:e.Int_unsecure(),isOptional:!1}}}),L=n({name:"SyncEmailThreadsOutput",fields:{syncedThreads:{type:e.Int_unsecure(),isOptional:!1},lastMessageAt:{type:e.Date(),isOptional:!0}}}),Y=l({meta:{key:"pfo.email.sync-threads",version:"1.0.0",description:"Triggers ingestion of Gmail threads into the operational knowledge space.",goal:"Keep knowledge base up to date with email communications.",context:"Syncs from Gmail integration. Only includes threads matching configured labels.",owners:[i.PlatformMessaging],tags:["gmail","knowledge",d.Automation],stability:c.Beta},io:{input:W,output:L},policy:{auth:"user"}}),B=n({name:"SummaryDispatchInput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientName:{type:e.String_unsecure(),isOptional:!0},includeVoice:{type:e.Boolean(),isOptional:!1},voiceRecipient:{type:e.String_unsecure(),isOptional:!0}}}),_=n({name:"SummaryDispatchOutput",fields:{dispatchId:{type:e.String_unsecure(),isOptional:!1},emailSent:{type:e.Boolean(),isOptional:!1},voiceUrl:{type:e.String_unsecure(),isOptional:!0}}}),O=l({meta:{key:"pfo.summary.dispatch",version:"1.0.0",description:"Delivers the generated summary via email and optionally synthesises a voice note.",goal:"Deliver financial insights to users proactively.",context:"Dispatches summaries generated by pfo.summary.generate via email or voice.",owners:[i.PlatformMessaging],tags:["summary","communications",d.Automation],stability:c.Experimental},io:{input:B,output:_},policy:{auth:"user"}}),N=n({name:"OpenBankingOverviewInput",fields:{tenantId:{type:e.String_unsecure(),isOptional:!1},accountIds:{type:e.String_unsecure(),isOptional:!0,isArray:!0},period:{type:X,isOptional:!1},asOf:{type:e.Date(),isOptional:!0},includeCategories:{type:e.Boolean(),isOptional:!1},includeCashflowTrend:{type:e.Boolean(),isOptional:!1}}}),T=n({name:"OpenBankingOverviewOutput",fields:{knowledgeEntryId:{type:e.String_unsecure(),isOptional:!1},periodStart:{type:e.Date(),isOptional:!1},periodEnd:{type:e.Date(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},summaryPath:{type:e.String_unsecure(),isOptional:!0}}}),E=l({meta:{key:"pfo.openbanking.generate-overview",version:"1.0.0",description:"Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.",goal:"Create a periodic financial snapshot.",context:"Aggregates data from open banking integration into a document.",owners:[i.PlatformFinance],tags:["open-banking","summary",d.Automation],stability:c.Experimental},io:{input:N,output:T},policy:{auth:"user"},telemetry:{success:{event:{key:D.overviewGenerated,version:"1.0.0"}}}}),Ee={"pfo.documents.upload":U,"pfo.reminders.schedule-payment":C,"pfo.summary.generate":A,"pfo.summary.dispatch":O,"pfo.email.sync-threads":Y,"pfo.openbanking.generate-overview":E};import{defineFeature as ee}from"@contractspec/lib.contracts-spec/features";var nt=ee({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),ot=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
28
28
 
29
29
  Pocket Family Office is a ContractSpec reference vertical that
30
30
  demonstrates finance automation atop the integration and knowledge
@@ -129,4 +129,4 @@ tenant-specific IDs/secret references before deploying.
129
129
 
130
130
 
131
131
 
132
- `}];import{OPENBANKING_PII_FIELDS as te,OPENBANKING_TELEMETRY_EVENTS as f}from"@contractspec/lib.contracts-integrations";import{OwnersEnum as ne,StabilityEnum as oe,TagsEnum as ae}from"@contractspec/lib.contracts-spec/ownership";var p={tenantId:{type:"string",required:!0,description:"Tenant identifier for multi-tenant isolation."},appId:{type:"string",required:!0,description:"Application identifier associated with the event."},blueprint:{type:"string",required:!0,description:"Blueprint name@version emitting the telemetry."},configVersion:{type:"number",required:!0,description:"Resolved app config version when the event was generated."},slotId:{type:"string",required:!0,description:"Integration slot identifier (e.g., primaryOpenBanking)."},connectionId:{type:"string",required:!0,description:"Integration connection ID used for the sync."}};function h(r){return{type:"string",description:r,pii:!1}}var it={meta:{key:"pfo.telemetry",version:"1.0.0",title:"Pocket Family Office Telemetry",description:"Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.",domain:"finance",owners:[ne.PlatformFinance],tags:["open-banking",ae.Automation],stability:oe.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{key:f.accountsSynced,version:"1.0.0",semantics:{what:"Open banking account synchronisation completed.",why:"Refresh canonical account metadata for reporting and workflows."},privacy:"internal",properties:{...p,syncedCount:{type:"number",description:"Number of accounts synced successfully."},failedCount:{type:"number",description:"Number of accounts that failed to sync."},durationMs:{type:"number",description:"Duration of the sync job in milliseconds."}}},{key:f.transactionsSynced,version:"1.0.0",semantics:{what:"Open banking transaction synchronisation completed.",why:"Keep canonical transaction ledger in sync for analytics."},privacy:"internal",properties:{...p,accountId:{type:"string",description:"Bank account identifier used during the sync.",pii:!1},syncedCount:{type:"number",description:"Number of transactions synced successfully."},failedCount:{type:"number",description:"Number of transactions that failed to sync."},from:{type:"timestamp",description:"Start timestamp for the sync window."},to:{type:"timestamp",description:"End timestamp for the sync window."}}},{key:f.balancesRefreshed,version:"1.0.0",semantics:{what:"Open banking balances refreshed.",why:"Provide accurate cash position for dashboards and alerts."},privacy:"internal",properties:{...p,accountId:h("Bank account identifier."),balanceTypes:{type:"json",description:"Balance types included in the refresh."},refreshedAt:{type:"timestamp",description:"Timestamp when balances were refreshed."}}},{key:f.overviewGenerated,version:"1.0.0",semantics:{what:"Derived financial overview generated.",why:"Persist cashflow and category summaries into knowledge space."},privacy:"internal",properties:{...p,knowledgeEntryId:h("Identifier of the knowledge document containing the overview."),period:{type:"string",description:"Aggregation period used (week, month, quarter)."},periodStart:{type:"timestamp",description:"Start timestamp for the aggregation window."},periodEnd:{type:"timestamp",description:"End timestamp for the aggregation window."}},tags:["knowledge","analytics"]}]},ct=te;var lt={meta:{id:"tenant-pfo-sample",tenantId:"tenant.family-office",appId:"pocket-family-office",blueprintName:"pocket-family-office.app",blueprintVersion:"1.0.0",environment:"production",version:"1.0.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),status:"published"},featureFlags:[{key:"voice-summaries",enabled:!0,description:"Enable spoken ElevenLabs summaries for daily briefings."}],integrations:[{slotId:"primaryLLM",connectionId:"conn-mistral-primary"},{slotId:"primaryVectorDb",connectionId:"conn-qdrant-finance"},{slotId:"primaryStorage",connectionId:"conn-gcs-documents"},{slotId:"primaryOpenBanking",connectionId:"conn-powens-primary"},{slotId:"emailInbound",connectionId:"conn-gmail-threads"},{slotId:"emailOutbound",connectionId:"conn-postmark-outbound"},{slotId:"calendarScheduling",connectionId:"conn-google-calendar"},{slotId:"voicePlayback",connectionId:"conn-elevenlabs-voice"},{slotId:"smsNotifications",connectionId:"conn-twilio-sms"},{slotId:"paymentsProcessing",connectionId:"conn-stripe-recurring"}],knowledge:[{spaceKey:"knowledge.financial-docs",scope:{workflows:["pfo.workflow.process-uploaded-document","pfo.workflow.generate-financial-summary"]}},{spaceKey:"knowledge.email-threads",scope:{workflows:["pfo.workflow.ingest-email-threads"]}},{spaceKey:"knowledge.financial-overview",scope:{workflows:["pfo.workflow.sync-openbanking-transactions","pfo.workflow.refresh-openbanking-balances","pfo.workflow.generate-financial-summary","pfo.workflow.generate-openbanking-overview"]},required:!1}],locales:{defaultLocale:"en",enabledLocales:["en"]},notes:"Sample tenant configuration for hackathon demos. Replace connection IDs with tenant-specific bindings when provisioning."};import{OwnersEnum as se,StabilityEnum as re,TagsEnum as ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ce}from"@contractspec/lib.contracts-spec/workflow/spec";var mt=ce({meta:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0",title:"Generate Financial Summary",description:"Retrieves the latest financial signals, generates an AI summary, and optionally distributes it by voice or email.",domain:"finance",owners:[se.PlatformFinance],tags:["summary","ai",ie.Automation],stability:re.Beta},definition:{entryStepId:"summarise",steps:[{id:"summarise",type:"automation",label:"Generate Summary",description:"Run retrieval augmented generation over the knowledge base to produce a household summary.",action:{operation:{key:"pfo.summary.generate",version:"1.0.0"}},requiredIntegrations:["primaryLLM","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:750}},{id:"distribute",type:"automation",label:"Distribute Summary",description:"Send the generated summary via email and optionally synthesise a voice note.",action:{operation:{key:"pfo.summary.dispatch",version:"1.0.0"}},requiredIntegrations:["emailOutbound"],retry:{maxAttempts:2,backoff:"linear",delayMs:500}}],transitions:[{from:"summarise",to:"distribute"}]}});import{OwnersEnum as de,StabilityEnum as le,TagsEnum as ge}from"@contractspec/lib.contracts-spec";import{defineWorkflow as fe}from"@contractspec/lib.contracts-spec/workflow/spec";var pe=[{key:"openbanking.accounts.read",version:"1.0.0"},{key:"openbanking.transactions.read",version:"1.0.0"},{key:"openbanking.balances.read",version:"1.0.0"}],kt=fe({meta:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0",title:"Generate Open Banking Overview",description:"Produces a derived financial overview and stores it in the operational knowledge space.",domain:"finance",owners:[de.PlatformFinance],tags:["open-banking","summary",ge.Automation],stability:le.Experimental},definition:{entryStepId:"generate-overview",steps:[{id:"generate-overview",type:"automation",label:"Generate Overview",description:"Aggregate balances, cashflow, and category breakdowns into a knowledge entry.",action:{operation:{key:"pfo.openbanking.generate-overview",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:pe,retry:{maxAttempts:3,backoff:"exponential",delayMs:1500}}],transitions:[]}});import{OwnersEnum as me,StabilityEnum as he,TagsEnum as ue}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ye}from"@contractspec/lib.contracts-spec/workflow/spec";var wt=ye({meta:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0",title:"Ingest Email Threads",description:"Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.",domain:"communications",owners:[me.PlatformMessaging],tags:["gmail","knowledge",ue.Automation],stability:he.Experimental},definition:{entryStepId:"sync",steps:[{id:"sync",type:"automation",label:"Sync Gmail Threads",description:"Fetches Gmail threads and transforms them into knowledge fragments before vector indexing.",action:{operation:{key:"pfo.email.sync-threads",version:"1.0.0"}},requiredIntegrations:["emailInbound","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"triage",type:"human",label:"Triage Exceptions",description:"Operators can resolve sync failures or tag important threads for follow-up."}],transitions:[{from:"sync",to:"triage",condition:"output?.syncedThreads === 0",label:"No new threads"}]}});import{OwnersEnum as ke,StabilityEnum as ve,TagsEnum as be}from"@contractspec/lib.contracts-spec";import{defineWorkflow as xe}from"@contractspec/lib.contracts-spec/workflow/spec";var Vt=xe({meta:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0",title:"Process Uploaded Document",description:"Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.",domain:"finance",owners:[ke.PlatformFinance],tags:["documents","ingestion",be.Automation],stability:ve.Experimental},definition:{entryStepId:"store",steps:[{id:"store",type:"automation",label:"Store and Queue Ingestion",description:"Persist the document to storage and enqueue the knowledge ingestion pipeline.",action:{operation:{key:"pfo.documents.upload",version:"1.0.0"}},requiredIntegrations:["primaryStorage","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:500}},{id:"review",type:"human",label:"Optional Human Classification",description:"Finance lead can categorise the document while ingestion completes."}],transitions:[{from:"store",to:"review"}]}});import{OwnersEnum as we,StabilityEnum as Me,TagsEnum as Ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ke}from"@contractspec/lib.contracts-spec/workflow/spec";var u={key:"openbanking.balances.read",version:"1.0.0"},Dt=Ke({meta:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0",title:"Refresh Open Banking Balances",description:"Refreshes balances for synced accounts to surface the latest cash positions in dashboards.",domain:"finance",owners:[we.PlatformFinance],tags:["open-banking","powens",Ie.Automation],stability:Me.Experimental},definition:{entryStepId:"refresh-balances",steps:[{id:"refresh-balances",type:"automation",label:"Refresh Balances",description:"Trigger the Powens provider to obtain current and available balances.",action:{operation:{key:"openbanking.balances.refresh",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-balances",type:"automation",label:"Fetch Balances",description:"Load the canonical balance snapshots for downstream workflows and dashboards.",action:{operation:{key:"openbanking.balances.get",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"refresh-balances",to:"fetch-balances"}]}});import{OwnersEnum as Ve,StabilityEnum as je,TagsEnum as Fe}from"@contractspec/lib.contracts-spec";import{defineWorkflow as qe}from"@contractspec/lib.contracts-spec/workflow/spec";var y={key:"openbanking.accounts.read",version:"1.0.0"},Xt=qe({meta:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0",title:"Synchronise Open Banking Accounts",description:"Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.",domain:"finance",owners:[Ve.PlatformFinance],tags:["open-banking","powens",Fe.Automation],stability:je.Experimental},definition:{entryStepId:"sync-accounts",steps:[{id:"sync-accounts",type:"automation",label:"Sync Accounts",description:"Refresh linked bank accounts via Powens and upsert canonical BankAccount records.",action:{operation:{key:"openbanking.accounts.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-accounts",type:"automation",label:"Fetch Accounts",description:"Retrieve the latest canonical account snapshot for downstream consumers.",action:{operation:{key:"openbanking.accounts.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"sync-accounts",to:"fetch-accounts"}]}});import{OwnersEnum as De,StabilityEnum as He,TagsEnum as Re}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Qe}from"@contractspec/lib.contracts-spec/workflow/spec";var k={key:"openbanking.transactions.read",version:"1.0.0"},Zt=Qe({meta:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0",title:"Synchronise Open Banking Transactions",description:"Fetches recent transactions from Powens for each linked account and stores them in the canonical ledger.",domain:"finance",owners:[De.PlatformFinance],tags:["open-banking","powens",Re.Automation],stability:He.Experimental},definition:{entryStepId:"sync-transactions",steps:[{id:"sync-transactions",type:"automation",label:"Sync Transactions",description:"Call the Powens provider to pull incremental transactions for active accounts.",action:{operation:{key:"openbanking.transactions.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[k],retry:{maxAttempts:4,backoff:"exponential",delayMs:1500}},{id:"list-transactions",type:"automation",label:"List Transactions",description:"Retrieve the canonical transaction list for reporting and downstream analytics.",action:{operation:{key:"openbanking.transactions.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[k],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"sync-transactions",to:"list-transactions"}]}});import{OwnersEnum as Xe,StabilityEnum as ze,TagsEnum as Je}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ue}from"@contractspec/lib.contracts-spec/workflow/spec";var Gt=Ue({meta:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0",title:"Schedule Upcoming Payment Reminder",description:"Collects payment metadata and schedules multi-channel reminders for bills that are due soon.",domain:"finance",owners:[Xe.PlatformFinance],tags:["payments","reminders",Je.Automation],stability:ze.Beta},definition:{entryStepId:"collect",steps:[{id:"collect",type:"human",label:"Review Upcoming Bill",description:"Confirm amount, due date, and preferred delivery channels before scheduling reminder."},{id:"schedule",type:"automation",label:"Schedule Reminder",action:{operation:{key:"pfo.reminders.schedule-payment",version:"1.0.0"}},requiredIntegrations:["emailOutbound","smsNotifications","calendarScheduling"],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"collect",to:"schedule",condition:"output?.confirmed === true",label:"Reminder confirmed"}]}});export{U as uploadDocumentContract,Gt as upcomingPaymentsReminderWorkflow,ot as tech_contracts_vertical_pocket_family_office_DocBlocks,Zt as syncOpenBankingTransactionsWorkflow,Xt as syncOpenBankingAccountsWorkflow,Y as syncEmailThreadsContract,P as schedulePaymentReminderContract,$e as registerPocketFamilyOfficeBlueprint,Dt as refreshOpenBankingBalancesWorkflow,Vt as processUploadedDocumentWorkflow,lt as pocketFamilyOfficeTenantSample,it as pocketFamilyOfficeTelemetry,Ye as pocketFamilyOfficeKnowledgeSources,Ee as pocketFamilyOfficeContracts,M as pocketFamilyOfficeConnections,w as pocketFamilyOfficeBlueprint,wt as ingestEmailThreadsWorkflow,Ce as getPocketFamilyOfficeConnection,kt as generateOpenBankingOverviewWorkflow,E as generateOpenBankingOverviewContract,mt as generateFinancialSummaryWorkflow,A as generateFinancialSummaryContract,F as example,_ as dispatchFinancialSummaryContract,nt as PocketFamilyOfficeFeature,ct as OPENBANKING_SENSITIVE_FIELDS};
132
+ `}];import{OPENBANKING_PII_FIELDS as te,OPENBANKING_TELEMETRY_EVENTS as p}from"@contractspec/lib.contracts-integrations";import{OwnersEnum as ne,StabilityEnum as oe,TagsEnum as ae}from"@contractspec/lib.contracts-spec/ownership";var f={tenantId:{type:"string",required:!0,description:"Tenant identifier for multi-tenant isolation."},appId:{type:"string",required:!0,description:"Application identifier associated with the event."},blueprint:{type:"string",required:!0,description:"Blueprint name@version emitting the telemetry."},configVersion:{type:"number",required:!0,description:"Resolved app config version when the event was generated."},slotId:{type:"string",required:!0,description:"Integration slot identifier (e.g., primaryOpenBanking)."},connectionId:{type:"string",required:!0,description:"Integration connection ID used for the sync."}};function h(s){return{type:"string",description:s,pii:!1}}var it={meta:{key:"pfo.telemetry",version:"1.0.0",title:"Pocket Family Office Telemetry",description:"Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.",domain:"finance",owners:[ne.PlatformFinance],tags:["open-banking",ae.Automation],stability:oe.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{key:p.accountsSynced,version:"1.0.0",semantics:{what:"Open banking account synchronisation completed.",why:"Refresh canonical account metadata for reporting and workflows."},privacy:"internal",properties:{...f,syncedCount:{type:"number",description:"Number of accounts synced successfully."},failedCount:{type:"number",description:"Number of accounts that failed to sync."},durationMs:{type:"number",description:"Duration of the sync job in milliseconds."}}},{key:p.transactionsSynced,version:"1.0.0",semantics:{what:"Open banking transaction synchronisation completed.",why:"Keep canonical transaction ledger in sync for analytics."},privacy:"internal",properties:{...f,accountId:{type:"string",description:"Bank account identifier used during the sync.",pii:!1},syncedCount:{type:"number",description:"Number of transactions synced successfully."},failedCount:{type:"number",description:"Number of transactions that failed to sync."},from:{type:"timestamp",description:"Start timestamp for the sync window."},to:{type:"timestamp",description:"End timestamp for the sync window."}}},{key:p.balancesRefreshed,version:"1.0.0",semantics:{what:"Open banking balances refreshed.",why:"Provide accurate cash position for dashboards and alerts."},privacy:"internal",properties:{...f,accountId:h("Bank account identifier."),balanceTypes:{type:"json",description:"Balance types included in the refresh."},refreshedAt:{type:"timestamp",description:"Timestamp when balances were refreshed."}}},{key:p.overviewGenerated,version:"1.0.0",semantics:{what:"Derived financial overview generated.",why:"Persist cashflow and category summaries into knowledge space."},privacy:"internal",properties:{...f,knowledgeEntryId:h("Identifier of the knowledge document containing the overview."),period:{type:"string",description:"Aggregation period used (week, month, quarter)."},periodStart:{type:"timestamp",description:"Start timestamp for the aggregation window."},periodEnd:{type:"timestamp",description:"End timestamp for the aggregation window."}},tags:["knowledge","analytics"]}]},ct=te;var lt={meta:{id:"tenant-pfo-sample",tenantId:"tenant.family-office",appId:"pocket-family-office",blueprintName:"pocket-family-office.app",blueprintVersion:"1.0.0",environment:"production",version:"1.0.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),status:"published"},featureFlags:[{key:"voice-summaries",enabled:!0,description:"Enable spoken ElevenLabs summaries for daily briefings."}],integrations:[{slotId:"primaryLLM",connectionId:"conn-mistral-primary"},{slotId:"primaryVectorDb",connectionId:"conn-qdrant-finance"},{slotId:"primaryStorage",connectionId:"conn-gcs-documents"},{slotId:"primaryOpenBanking",connectionId:"conn-powens-primary"},{slotId:"emailInbound",connectionId:"conn-gmail-threads"},{slotId:"emailOutbound",connectionId:"conn-postmark-outbound"},{slotId:"calendarScheduling",connectionId:"conn-google-calendar"},{slotId:"voicePlayback",connectionId:"conn-elevenlabs-voice"},{slotId:"smsNotifications",connectionId:"conn-twilio-sms"},{slotId:"paymentsProcessing",connectionId:"conn-stripe-recurring"}],knowledge:[{spaceKey:"knowledge.financial-docs",scope:{workflows:["pfo.workflow.process-uploaded-document","pfo.workflow.generate-financial-summary"]}},{spaceKey:"knowledge.email-threads",scope:{workflows:["pfo.workflow.ingest-email-threads"]}},{spaceKey:"knowledge.financial-overview",scope:{workflows:["pfo.workflow.sync-openbanking-transactions","pfo.workflow.refresh-openbanking-balances","pfo.workflow.generate-financial-summary","pfo.workflow.generate-openbanking-overview"]},required:!1}],locales:{defaultLocale:"en",enabledLocales:["en"]},notes:"Sample tenant configuration for hackathon demos. Replace connection IDs with tenant-specific bindings when provisioning."};import{OwnersEnum as re,StabilityEnum as se,TagsEnum as ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ce}from"@contractspec/lib.contracts-spec/workflow/spec";var mt=ce({meta:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0",title:"Generate Financial Summary",description:"Retrieves the latest financial signals, generates an AI summary, and optionally distributes it by voice or email.",domain:"finance",owners:[re.PlatformFinance],tags:["summary","ai",ie.Automation],stability:se.Beta},definition:{entryStepId:"summarise",steps:[{id:"summarise",type:"automation",label:"Generate Summary",description:"Run retrieval augmented generation over the knowledge base to produce a household summary.",action:{operation:{key:"pfo.summary.generate",version:"1.0.0"}},requiredIntegrations:["primaryLLM","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:750}},{id:"distribute",type:"automation",label:"Distribute Summary",description:"Send the generated summary via email and optionally synthesise a voice note.",action:{operation:{key:"pfo.summary.dispatch",version:"1.0.0"}},requiredIntegrations:["emailOutbound"],retry:{maxAttempts:2,backoff:"linear",delayMs:500}}],transitions:[{from:"summarise",to:"distribute"}]}});import{OwnersEnum as de,StabilityEnum as le,TagsEnum as ge}from"@contractspec/lib.contracts-spec";import{defineWorkflow as pe}from"@contractspec/lib.contracts-spec/workflow/spec";var fe=[{key:"openbanking.accounts.read",version:"1.0.0"},{key:"openbanking.transactions.read",version:"1.0.0"},{key:"openbanking.balances.read",version:"1.0.0"}],vt=pe({meta:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0",title:"Generate Open Banking Overview",description:"Produces a derived financial overview and stores it in the operational knowledge space.",domain:"finance",owners:[de.PlatformFinance],tags:["open-banking","summary",ge.Automation],stability:le.Experimental},definition:{entryStepId:"generate-overview",steps:[{id:"generate-overview",type:"automation",label:"Generate Overview",description:"Aggregate balances, cashflow, and category breakdowns into a knowledge entry.",action:{operation:{key:"pfo.openbanking.generate-overview",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:fe,retry:{maxAttempts:3,backoff:"exponential",delayMs:1500}}],transitions:[]}});import{OwnersEnum as me,StabilityEnum as he,TagsEnum as ue}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ye}from"@contractspec/lib.contracts-spec/workflow/spec";var wt=ye({meta:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0",title:"Ingest Email Threads",description:"Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.",domain:"communications",owners:[me.PlatformMessaging],tags:["gmail","knowledge",ue.Automation],stability:he.Experimental},definition:{entryStepId:"sync",steps:[{id:"sync",type:"automation",label:"Sync Gmail Threads",description:"Fetches Gmail threads and transforms them into knowledge fragments before vector indexing.",action:{operation:{key:"pfo.email.sync-threads",version:"1.0.0"}},requiredIntegrations:["emailInbound","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"triage",type:"human",label:"Triage Exceptions",description:"Operators can resolve sync failures or tag important threads for follow-up."}],transitions:[{from:"sync",to:"triage",condition:"output?.syncedThreads === 0",label:"No new threads"}]}});import{OwnersEnum as ve,StabilityEnum as ke,TagsEnum as be}from"@contractspec/lib.contracts-spec";import{defineWorkflow as xe}from"@contractspec/lib.contracts-spec/workflow/spec";var Vt=xe({meta:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0",title:"Process Uploaded Document",description:"Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.",domain:"finance",owners:[ve.PlatformFinance],tags:["documents","ingestion",be.Automation],stability:ke.Experimental},definition:{entryStepId:"store",steps:[{id:"store",type:"automation",label:"Store and Queue Ingestion",description:"Persist the document to storage and enqueue the knowledge ingestion pipeline.",action:{operation:{key:"pfo.documents.upload",version:"1.0.0"}},requiredIntegrations:["primaryStorage","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:500}},{id:"review",type:"human",label:"Optional Human Classification",description:"Finance lead can categorise the document while ingestion completes."}],transitions:[{from:"store",to:"review"}]}});import{OwnersEnum as we,StabilityEnum as Me,TagsEnum as Ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ke}from"@contractspec/lib.contracts-spec/workflow/spec";var u={key:"openbanking.balances.read",version:"1.0.0"},Ft=Ke({meta:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0",title:"Refresh Open Banking Balances",description:"Refreshes balances for synced accounts to surface the latest cash positions in dashboards.",domain:"finance",owners:[we.PlatformFinance],tags:["open-banking","powens",Ie.Automation],stability:Me.Experimental},definition:{entryStepId:"refresh-balances",steps:[{id:"refresh-balances",type:"automation",label:"Refresh Balances",description:"Trigger the Powens provider to obtain current and available balances.",action:{operation:{key:"openbanking.balances.refresh",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-balances",type:"automation",label:"Fetch Balances",description:"Load the canonical balance snapshots for downstream workflows and dashboards.",action:{operation:{key:"openbanking.balances.get",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"refresh-balances",to:"fetch-balances"}]}});import{OwnersEnum as Ve,StabilityEnum as je,TagsEnum as qe}from"@contractspec/lib.contracts-spec";import{defineWorkflow as De}from"@contractspec/lib.contracts-spec/workflow/spec";var y={key:"openbanking.accounts.read",version:"1.0.0"},Xt=De({meta:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0",title:"Synchronise Open Banking Accounts",description:"Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.",domain:"finance",owners:[Ve.PlatformFinance],tags:["open-banking","powens",qe.Automation],stability:je.Experimental},definition:{entryStepId:"sync-accounts",steps:[{id:"sync-accounts",type:"automation",label:"Sync Accounts",description:"Refresh linked bank accounts via Powens and upsert canonical BankAccount records.",action:{operation:{key:"openbanking.accounts.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-accounts",type:"automation",label:"Fetch Accounts",description:"Retrieve the latest canonical account snapshot for downstream consumers.",action:{operation:{key:"openbanking.accounts.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"sync-accounts",to:"fetch-accounts"}]}});import{OwnersEnum as Fe,StabilityEnum as He,TagsEnum as Re}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Qe}from"@contractspec/lib.contracts-spec/workflow/spec";var v={key:"openbanking.transactions.read",version:"1.0.0"},Zt=Qe({meta:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0",title:"Synchronise Open Banking Transactions",description:"Fetches recent transactions from Powens for each linked account and stores them in the canonical ledger.",domain:"finance",owners:[Fe.PlatformFinance],tags:["open-banking","powens",Re.Automation],stability:He.Experimental},definition:{entryStepId:"sync-transactions",steps:[{id:"sync-transactions",type:"automation",label:"Sync Transactions",description:"Call the Powens provider to pull incremental transactions for active accounts.",action:{operation:{key:"openbanking.transactions.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[v],retry:{maxAttempts:4,backoff:"exponential",delayMs:1500}},{id:"list-transactions",type:"automation",label:"List Transactions",description:"Retrieve the canonical transaction list for reporting and downstream analytics.",action:{operation:{key:"openbanking.transactions.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[v],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"sync-transactions",to:"list-transactions"}]}});import{OwnersEnum as Xe,StabilityEnum as ze,TagsEnum as Je}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ue}from"@contractspec/lib.contracts-spec/workflow/spec";var Pt=Ue({meta:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0",title:"Schedule Upcoming Payment Reminder",description:"Collects payment metadata and schedules multi-channel reminders for bills that are due soon.",domain:"finance",owners:[Xe.PlatformFinance],tags:["payments","reminders",Je.Automation],stability:ze.Beta},definition:{entryStepId:"collect",steps:[{id:"collect",type:"human",label:"Review Upcoming Bill",description:"Confirm amount, due date, and preferred delivery channels before scheduling reminder."},{id:"schedule",type:"automation",label:"Schedule Reminder",action:{operation:{key:"pfo.reminders.schedule-payment",version:"1.0.0"}},requiredIntegrations:["emailOutbound","smsNotifications","calendarScheduling"],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"collect",to:"schedule",condition:"output?.confirmed === true",label:"Reminder confirmed"}]}});export{U as uploadDocumentContract,Pt as upcomingPaymentsReminderWorkflow,ot as tech_contracts_vertical_pocket_family_office_DocBlocks,Zt as syncOpenBankingTransactionsWorkflow,Xt as syncOpenBankingAccountsWorkflow,Y as syncEmailThreadsContract,C as schedulePaymentReminderContract,$e as registerPocketFamilyOfficeBlueprint,Ft as refreshOpenBankingBalancesWorkflow,Vt as processUploadedDocumentWorkflow,lt as pocketFamilyOfficeTenantSample,it as pocketFamilyOfficeTelemetry,Ye as pocketFamilyOfficeKnowledgeSources,Ee as pocketFamilyOfficeContracts,M as pocketFamilyOfficeConnections,w as pocketFamilyOfficeBlueprint,wt as ingestEmailThreadsWorkflow,Ge as getPocketFamilyOfficeConnection,vt as generateOpenBankingOverviewWorkflow,E as generateOpenBankingOverviewContract,mt as generateFinancialSummaryWorkflow,A as generateFinancialSummaryContract,q as example,O as dispatchFinancialSummaryContract,nt as PocketFamilyOfficeFeature,ct as OPENBANKING_SENSITIVE_FIELDS,j as ExamplesPocketFamilyOfficeExample};
@@ -1 +1 @@
1
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"]},docs:{rootDocId:"docs.examples.pocket-family-office"},entrypoints:{packageName:"@contractspec/example.pocket-family-office",feature:"./feature",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
1
+ import{defineExample as b}from"@contractspec/lib.contracts-spec/examples";var d=b({meta:{key:"examples.pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Pocket Family Office example - personal finance automation with open banking",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","pocket-family-office"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.pocket-family-office"}}),j=d;export{j as default,d as ExamplesPocketFamilyOfficeExample};
@@ -1,4 +1,4 @@
1
- import{OwnersEnum as v,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.contracts-spec/ownership";var t=(r,m)=>({key:r,version:m}),w={meta:{key:"pocket-family-office.app",version:"1.0.0",appId:"pocket-family-office",title:"Pocket Family Office",description:"Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.",domain:"finance",owners:[v.PlatformFinance],tags:[x.Guide,"finance","automation"],stability:b.Experimental},capabilities:{enabled:[t("ai.chat","1.0.0"),t("ai.embeddings","1.0.0"),t("vector-db.search","1.0.0"),t("vector-db.storage","1.0.0"),t("storage.objects","1.0.0"),t("email.inbound","1.0.0"),t("email.transactional","1.0.0"),t("calendar.events","1.0.0"),t("sms.outbound","1.0.0"),t("ai.voice.tts","1.0.0"),t("payments.psp","1.0.0"),t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")]},integrationSlots:[{slotId:"primaryLLM",requiredCategory:"ai-llm",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.chat","1.0.0")],required:!0,description:"Chat completion provider powering summarisation, explanations, and insights."},{slotId:"primaryVectorDb",requiredCategory:"vector-db",allowedModes:["managed","byok"],requiredCapabilities:[t("vector-db.search","1.0.0")],required:!0,description:"Vector database storing embeddings for financial documents and email threads."},{slotId:"primaryStorage",requiredCategory:"storage",allowedModes:["managed","byok"],requiredCapabilities:[t("storage.objects","1.0.0")],required:!0,description:"Object storage used for raw uploads and normalised documents."},{slotId:"primaryOpenBanking",requiredCategory:"open-banking",allowedModes:["byok"],requiredCapabilities:[t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")],required:!0,description:"Powens BYOK connection powering bank account, transaction, and balance synchronisation."},{slotId:"emailInbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.inbound","1.0.0")],required:!0,description:"Inbound email/thread sync (Gmail) feeding the knowledge corpus."},{slotId:"emailOutbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.transactional","1.0.0")],required:!0,description:"Transactional email delivery for reminders and summaries."},{slotId:"calendarScheduling",requiredCategory:"calendar",allowedModes:["managed","byok"],requiredCapabilities:[t("calendar.events","1.0.0")],required:!0,description:"Creates calendar holds for bill reviews and handoff meetings."},{slotId:"voicePlayback",requiredCategory:"ai-voice-tts",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.voice.tts","1.0.0")],required:!1,description:"Optional voice synthesis for spoken summaries (ElevenLabs)."},{slotId:"smsNotifications",requiredCategory:"sms",allowedModes:["managed","byok"],requiredCapabilities:[t("sms.outbound","1.0.0")],required:!1,description:"SMS provider used for urgent reminders."},{slotId:"paymentsProcessing",requiredCategory:"payments",allowedModes:["managed","byok"],requiredCapabilities:[t("payments.psp","1.0.0")],required:!1,description:"Optional payments processor enabling bill pay automations."}],workflows:{processUploadedDocument:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},upcomingPaymentsReminder:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},generateFinancialSummary:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},ingestEmailThreads:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"},syncOpenBankingAccounts:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},syncOpenBankingTransactions:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},refreshOpenBankingBalances:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},generateOpenBankingOverview:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"}},policies:[{key:"pfo.policy.tenancy",version:"1.0.0"},{key:"knowledge.access.financial-docs",version:"1.0.0"}],telemetry:{spec:{key:"pfo.telemetry",version:"1.0.0"}},featureFlags:[{key:"voice-summaries",enabled:!1,description:"Enable ElevenLabs spoken summaries in addition to email distribution."}],routes:[{path:"/dashboard",label:"Overview",workflow:"pfo.workflow.generate-financial-summary"},{path:"/documents/upload",label:"Upload Document",workflow:"pfo.workflow.process-uploaded-document"},{path:"/communications",label:"Inbox",workflow:"pfo.workflow.ingest-email-threads"}],notes:"Pocket Family Office blueprint pulling together finance automations for the hackathon reference implementation."};function $e(r){return r.register(w)}var o=new Date,a={tenantId:"tenant.family-office",createdAt:o,updatedAt:o},M=[{meta:{...a,id:"conn-mistral-primary",integrationKey:"ai-llm.mistral",integrationVersion:"1.0.0",label:"Mistral Primary"},ownershipMode:"managed",config:{model:"mistral-large-latest",embeddingModel:"mistral-embed"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/mistral-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-qdrant-finance",integrationKey:"vectordb.qdrant",integrationVersion:"1.0.0",label:"Qdrant Finance Cluster"},ownershipMode:"managed",config:{apiUrl:"https://qdrant.pfo.internal",collectionPrefix:"tenant-family-office"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/qdrant-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:95}},{meta:{...a,id:"conn-gcs-documents",integrationKey:"storage.gcs",integrationVersion:"1.0.0",label:"GCS Documents Bucket"},ownershipMode:"managed",config:{bucket:"pfo-uploads",prefix:"financial-docs/"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gcs-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:60}},{meta:{...a,id:"conn-gmail-threads",integrationKey:"email.gmail",integrationVersion:"1.0.0",label:"Gmail Household Threads"},ownershipMode:"byok",config:{labelIds:["FINANCE","INBOX"],includeSpamTrash:!1},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gmail-refresh-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:320}},{meta:{...a,id:"conn-postmark-outbound",integrationKey:"email.postmark",integrationVersion:"1.0.0",label:"Postmark Transactional"},ownershipMode:"managed",config:{messageStream:"outbound",fromEmail:"family.office@pfo.dev"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/postmark-server-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:210}},{meta:{...a,id:"conn-google-calendar",integrationKey:"calendar.google",integrationVersion:"1.0.0",label:"Household Calendar"},ownershipMode:"managed",config:{calendarId:"primary"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/google-calendar-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:140}},{meta:{...a,id:"conn-elevenlabs-voice",integrationKey:"ai-voice.elevenlabs",integrationVersion:"1.0.0",label:"ElevenLabs Voice"},ownershipMode:"byok",config:{defaultVoiceId:"pNInz6obpgDQGcFmaJgB"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/elevenlabs-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:250}},{meta:{...a,id:"conn-twilio-sms",integrationKey:"sms.twilio",integrationVersion:"1.0.0",label:"Twilio SMS"},ownershipMode:"managed",config:{fromNumber:"+15552340000"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/twilio-auth-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-stripe-recurring",integrationKey:"payments.stripe",integrationVersion:"1.0.0",label:"Stripe Recurring Billing"},ownershipMode:"managed",config:{accountId:"acct_1PFOHACKATHON",region:"eu-west-1"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/stripe-secret-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:220}},{meta:{...a,id:"conn-powens-primary",integrationKey:"openbanking.powens",integrationVersion:"1.0.0",label:"Powens Open Banking"},ownershipMode:"byok",config:{environment:"sandbox",baseUrl:"https://api-sandbox.powens.com/v2"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/powens-credentials/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:410}}];function Ce(r){return M.find((m)=>m.meta.id===r)}import{registerDocBlocks as I}from"@contractspec/lib.contracts-spec/docs";var K=[{id:"docs.examples.pocket-family-office.goal",title:"Pocket Family Office — Goal",summary:"Secure personal finance automation combining documents and open banking.",kind:"goal",visibility:"public",route:"/docs/examples/pocket-family-office/goal",tags:["finance","goal"],body:`## Why it matters
1
+ import{OwnersEnum as k,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.contracts-spec/ownership";var t=(s,m)=>({key:s,version:m}),w={meta:{key:"pocket-family-office.app",version:"1.0.0",appId:"pocket-family-office",title:"Pocket Family Office",description:"Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.",domain:"finance",owners:[k.PlatformFinance],tags:[x.Guide,"finance","automation"],stability:b.Experimental},capabilities:{enabled:[t("ai.chat","1.0.0"),t("ai.embeddings","1.0.0"),t("vector-db.search","1.0.0"),t("vector-db.storage","1.0.0"),t("storage.objects","1.0.0"),t("email.inbound","1.0.0"),t("email.transactional","1.0.0"),t("calendar.events","1.0.0"),t("sms.outbound","1.0.0"),t("ai.voice.tts","1.0.0"),t("payments.psp","1.0.0"),t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")]},integrationSlots:[{slotId:"primaryLLM",requiredCategory:"ai-llm",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.chat","1.0.0")],required:!0,description:"Chat completion provider powering summarisation, explanations, and insights."},{slotId:"primaryVectorDb",requiredCategory:"vector-db",allowedModes:["managed","byok"],requiredCapabilities:[t("vector-db.search","1.0.0")],required:!0,description:"Vector database storing embeddings for financial documents and email threads."},{slotId:"primaryStorage",requiredCategory:"storage",allowedModes:["managed","byok"],requiredCapabilities:[t("storage.objects","1.0.0")],required:!0,description:"Object storage used for raw uploads and normalised documents."},{slotId:"primaryOpenBanking",requiredCategory:"open-banking",allowedModes:["byok"],requiredCapabilities:[t("openbanking.accounts.read","1.0.0"),t("openbanking.transactions.read","1.0.0"),t("openbanking.balances.read","1.0.0")],required:!0,description:"Powens BYOK connection powering bank account, transaction, and balance synchronisation."},{slotId:"emailInbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.inbound","1.0.0")],required:!0,description:"Inbound email/thread sync (Gmail) feeding the knowledge corpus."},{slotId:"emailOutbound",requiredCategory:"email",allowedModes:["managed","byok"],requiredCapabilities:[t("email.transactional","1.0.0")],required:!0,description:"Transactional email delivery for reminders and summaries."},{slotId:"calendarScheduling",requiredCategory:"calendar",allowedModes:["managed","byok"],requiredCapabilities:[t("calendar.events","1.0.0")],required:!0,description:"Creates calendar holds for bill reviews and handoff meetings."},{slotId:"voicePlayback",requiredCategory:"ai-voice-tts",allowedModes:["managed","byok"],requiredCapabilities:[t("ai.voice.tts","1.0.0")],required:!1,description:"Optional voice synthesis for spoken summaries (ElevenLabs)."},{slotId:"smsNotifications",requiredCategory:"sms",allowedModes:["managed","byok"],requiredCapabilities:[t("sms.outbound","1.0.0")],required:!1,description:"SMS provider used for urgent reminders."},{slotId:"paymentsProcessing",requiredCategory:"payments",allowedModes:["managed","byok"],requiredCapabilities:[t("payments.psp","1.0.0")],required:!1,description:"Optional payments processor enabling bill pay automations."}],workflows:{processUploadedDocument:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},upcomingPaymentsReminder:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},generateFinancialSummary:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},ingestEmailThreads:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"},syncOpenBankingAccounts:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},syncOpenBankingTransactions:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},refreshOpenBankingBalances:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},generateOpenBankingOverview:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"}},policies:[{key:"pfo.policy.tenancy",version:"1.0.0"},{key:"knowledge.access.financial-docs",version:"1.0.0"}],telemetry:{spec:{key:"pfo.telemetry",version:"1.0.0"}},featureFlags:[{key:"voice-summaries",enabled:!1,description:"Enable ElevenLabs spoken summaries in addition to email distribution."}],routes:[{path:"/dashboard",label:"Overview",workflow:"pfo.workflow.generate-financial-summary"},{path:"/documents/upload",label:"Upload Document",workflow:"pfo.workflow.process-uploaded-document"},{path:"/communications",label:"Inbox",workflow:"pfo.workflow.ingest-email-threads"}],notes:"Pocket Family Office blueprint pulling together finance automations for the hackathon reference implementation."};function $e(s){return s.register(w)}var o=new Date,a={tenantId:"tenant.family-office",createdAt:o,updatedAt:o},M=[{meta:{...a,id:"conn-mistral-primary",integrationKey:"ai-llm.mistral",integrationVersion:"1.0.0",label:"Mistral Primary"},ownershipMode:"managed",config:{model:"mistral-large-latest",embeddingModel:"mistral-embed"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/mistral-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-qdrant-finance",integrationKey:"vectordb.qdrant",integrationVersion:"1.0.0",label:"Qdrant Finance Cluster"},ownershipMode:"managed",config:{apiUrl:"https://qdrant.pfo.internal",collectionPrefix:"tenant-family-office"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/qdrant-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:95}},{meta:{...a,id:"conn-gcs-documents",integrationKey:"storage.gcs",integrationVersion:"1.0.0",label:"GCS Documents Bucket"},ownershipMode:"managed",config:{bucket:"pfo-uploads",prefix:"financial-docs/"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gcs-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:60}},{meta:{...a,id:"conn-gmail-threads",integrationKey:"email.gmail",integrationVersion:"1.0.0",label:"Gmail Household Threads"},ownershipMode:"byok",config:{labelIds:["FINANCE","INBOX"],includeSpamTrash:!1},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/gmail-refresh-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:320}},{meta:{...a,id:"conn-postmark-outbound",integrationKey:"email.postmark",integrationVersion:"1.0.0",label:"Postmark Transactional"},ownershipMode:"managed",config:{messageStream:"outbound",fromEmail:"family.office@pfo.dev"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/postmark-server-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:210}},{meta:{...a,id:"conn-google-calendar",integrationKey:"calendar.google",integrationVersion:"1.0.0",label:"Household Calendar"},ownershipMode:"managed",config:{calendarId:"primary"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/google-calendar-service-account/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:140}},{meta:{...a,id:"conn-elevenlabs-voice",integrationKey:"ai-voice.elevenlabs",integrationVersion:"1.0.0",label:"ElevenLabs Voice"},ownershipMode:"byok",config:{defaultVoiceId:"pNInz6obpgDQGcFmaJgB"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/elevenlabs-api-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:250}},{meta:{...a,id:"conn-twilio-sms",integrationKey:"sms.twilio",integrationVersion:"1.0.0",label:"Twilio SMS"},ownershipMode:"managed",config:{fromNumber:"+15552340000"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/twilio-auth-token/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:180}},{meta:{...a,id:"conn-stripe-recurring",integrationKey:"payments.stripe",integrationVersion:"1.0.0",label:"Stripe Recurring Billing"},ownershipMode:"managed",config:{accountId:"acct_1PFOHACKATHON",region:"eu-west-1"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/stripe-secret-key/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:220}},{meta:{...a,id:"conn-powens-primary",integrationKey:"openbanking.powens",integrationVersion:"1.0.0",label:"Powens Open Banking"},ownershipMode:"byok",config:{environment:"sandbox",baseUrl:"https://api-sandbox.powens.com/v2"},secretProvider:"gcp-secret-manager",secretRef:"gcp://projects/pfo-hackathon/secrets/powens-credentials/versions/latest",status:"connected",health:{status:"connected",checkedAt:o,latencyMs:410}}];function Ge(s){return M.find((m)=>m.meta.id===s)}import{registerDocBlocks as I}from"@contractspec/lib.contracts-spec/docs";var K=[{id:"docs.examples.pocket-family-office.goal",title:"Pocket Family Office — Goal",summary:"Secure personal finance automation combining documents and open banking.",kind:"goal",visibility:"public",route:"/docs/examples/pocket-family-office/goal",tags:["finance","goal"],body:`## Why it matters
2
2
  - Automate document ingestion (receipts, statements) and link to transactions.
3
3
  - Provides a "family office" grade overview for individuals.
4
4
  - Uses open banking for real-time data and AI for insights.
@@ -23,7 +23,7 @@ import{OwnersEnum as v,StabilityEnum as b,TagsEnum as x}from"@contractspec/lib.c
23
23
 
24
24
  ## Guardrails
25
25
  - PII is redacted in summaries by default.
26
- - Read-only access to bank data (no write/payment initiation in this template).`},{id:"docs.examples.pocket-family-office.reference",title:"Pocket Family Office — Reference",summary:"Key components of the Pocket Family Office system.",kind:"reference",visibility:"public",route:"/docs/examples/pocket-family-office",tags:["finance","reference"],body:"## Workflows\n- `process-uploaded-document`: Extracts data from PDFs/Images.\n- `sync-openbanking-transactions`: Fetches latest transactions.\n- `generate-financial-summary`: AI-driven report generation.\n- `upcoming-payments-reminder`: Scans needed actions.\n\n## Operations\n- `pfo.documents.upload`: Secure upload endpoint for documents.\n\n## Capabilities\n- Requires: `identity`, `openbanking`.\n- Provides: `pocket-family-office`."}];I(K);import{defineExample as V}from"@contractspec/lib.contracts-spec";var j=V({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"]},docs:{rootDocId:"docs.examples.pocket-family-office"},entrypoints:{packageName:"@contractspec/example.pocket-family-office",feature:"./feature",docs:"./docs"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),F=j;var s=new Date,Ye=[{meta:{id:"source-financial-uploads",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-docs",spaceVersion:"1.0.0",label:"Uploaded Financial Documents",sourceType:"file_upload",createdAt:s,updatedAt:s},config:{bucket:"pfo-uploads",prefix:"financial-docs/"},syncSchedule:{enabled:!0,intervalMs:900000},lastSync:{timestamp:s,success:!0}},{meta:{id:"source-gmail-threads",tenantId:"tenant.family-office",spaceKey:"knowledge.email-threads",spaceVersion:"1.0.0",label:"Household Gmail Threads",sourceType:"email",createdAt:s,updatedAt:s},config:{labelIds:["INBOX","FINANCE"]},syncSchedule:{enabled:!0,intervalMs:300000},lastSync:{timestamp:s,success:!0}},{meta:{id:"source-financial-overview",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-overview",spaceVersion:"1.0.0",label:"Financial Overview",sourceType:"api",createdAt:s,updatedAt:s},config:{},syncSchedule:{enabled:!1}}];import{OPENBANKING_TELEMETRY_EVENTS as q}from"@contractspec/lib.contracts-integrations";import{defineCommand as l,defineQuery as D}from"@contractspec/lib.contracts-spec";import{OwnersEnum as i,StabilityEnum as c,TagsEnum as d}from"@contractspec/lib.contracts-spec/ownership";import{defineEnum as g,defineSchemaModel as n,ScalarTypeEnum as e}from"@contractspec/lib.schema";var H=g("Source",["upload","email","sync"]),R=g("Channel",["email","sms","both"]),Q=g("Period",["P7d","P30d","P90d"]),X=g("ObPeriod",["Pweek","Pmonth","Pquarter"]),z=n({name:"UploadDocumentInput",fields:{bucket:{type:e.NonEmptyString(),isOptional:!1},objectKey:{type:e.NonEmptyString(),isOptional:!1},mimeType:{type:e.NonEmptyString(),isOptional:!1},bytes:{type:e.Int_unsecure(),isOptional:!1},tags:{type:e.String_unsecure(),isOptional:!1,isArray:!0},uploadedAt:{type:e.Date(),isOptional:!1},source:{type:H,isOptional:!1}}}),J=n({name:"UploadDocumentOutput",fields:{documentId:{type:e.String_unsecure(),isOptional:!1},ingestionJobId:{type:e.String_unsecure(),isOptional:!1}}}),U=l({meta:{key:"pfo.documents.upload",version:"1.0.0",description:"Stores an object in tenant storage and schedules ingestion into the knowledge base.",goal:"Allow users to ingest financial documents for processing.",context:"Part of the finance domain. Documents are uploaded to object storage and then processed by the ingestion pipeline.",owners:[i.PlatformFinance],tags:["documents","ingestion",d.Guide],stability:c.Experimental},io:{input:z,output:J},policy:{auth:"user",rateLimit:{rpm:30,key:"user"}}}),Z=n({name:"PaymentReminderInput",fields:{billId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientPhone:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.Date(),isOptional:!1},amountCents:{type:e.Int_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},channel:{type:R,isOptional:!1},memo:{type:e.String_unsecure(),isOptional:!0}}}),$=n({name:"PaymentReminderOutput",fields:{reminderId:{type:e.String_unsecure(),isOptional:!1},scheduledAt:{type:e.Date(),isOptional:!1}}}),P=l({meta:{key:"pfo.reminders.schedule-payment",version:"1.0.0",description:"Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.",goal:"Ensure bills are paid on time by notifying users.",context:"Finance automation. Reminders are sent via configured channels (email, SMS).",owners:[i.PlatformFinance],tags:["payments","reminders",d.Automation],stability:c.Beta},io:{input:Z,output:$},policy:{auth:"user"}}),C=n({name:"FinancialSummaryInput",fields:{period:{type:Q,isOptional:!1},includeVoiceSummary:{type:e.Boolean(),isOptional:!1}}}),G=n({name:"SummaryHighlight",fields:{label:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1}}}),S=n({name:"FinancialSummaryOutput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},markdown:{type:e.String_unsecure(),isOptional:!1},highlights:{type:G,isOptional:!1,isArray:!0},cashflowDelta:{type:e.Float_unsecure(),isOptional:!1}}}),A=D({meta:{key:"pfo.summary.generate",version:"1.0.0",description:"Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.",goal:"Provide a quick overview of financial status and recent activity.",context:"Uses RAG over ingested knowledge. Summaries can be dispatched or viewed in app.",owners:[i.PlatformFinance],tags:["summary","ai",d.Automation],stability:c.Beta},io:{input:C,output:S},policy:{auth:"user"}}),W=n({name:"SyncEmailThreadsInput",fields:{labelIds:{type:e.String_unsecure(),isOptional:!1,isArray:!0},maxThreads:{type:e.Int_unsecure(),isOptional:!1},syncSinceMinutes:{type:e.Int_unsecure(),isOptional:!1}}}),L=n({name:"SyncEmailThreadsOutput",fields:{syncedThreads:{type:e.Int_unsecure(),isOptional:!1},lastMessageAt:{type:e.Date(),isOptional:!0}}}),Y=l({meta:{key:"pfo.email.sync-threads",version:"1.0.0",description:"Triggers ingestion of Gmail threads into the operational knowledge space.",goal:"Keep knowledge base up to date with email communications.",context:"Syncs from Gmail integration. Only includes threads matching configured labels.",owners:[i.PlatformMessaging],tags:["gmail","knowledge",d.Automation],stability:c.Beta},io:{input:W,output:L},policy:{auth:"user"}}),B=n({name:"SummaryDispatchInput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientName:{type:e.String_unsecure(),isOptional:!0},includeVoice:{type:e.Boolean(),isOptional:!1},voiceRecipient:{type:e.String_unsecure(),isOptional:!0}}}),O=n({name:"SummaryDispatchOutput",fields:{dispatchId:{type:e.String_unsecure(),isOptional:!1},emailSent:{type:e.Boolean(),isOptional:!1},voiceUrl:{type:e.String_unsecure(),isOptional:!0}}}),_=l({meta:{key:"pfo.summary.dispatch",version:"1.0.0",description:"Delivers the generated summary via email and optionally synthesises a voice note.",goal:"Deliver financial insights to users proactively.",context:"Dispatches summaries generated by pfo.summary.generate via email or voice.",owners:[i.PlatformMessaging],tags:["summary","communications",d.Automation],stability:c.Experimental},io:{input:B,output:O},policy:{auth:"user"}}),N=n({name:"OpenBankingOverviewInput",fields:{tenantId:{type:e.String_unsecure(),isOptional:!1},accountIds:{type:e.String_unsecure(),isOptional:!0,isArray:!0},period:{type:X,isOptional:!1},asOf:{type:e.Date(),isOptional:!0},includeCategories:{type:e.Boolean(),isOptional:!1},includeCashflowTrend:{type:e.Boolean(),isOptional:!1}}}),T=n({name:"OpenBankingOverviewOutput",fields:{knowledgeEntryId:{type:e.String_unsecure(),isOptional:!1},periodStart:{type:e.Date(),isOptional:!1},periodEnd:{type:e.Date(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},summaryPath:{type:e.String_unsecure(),isOptional:!0}}}),E=l({meta:{key:"pfo.openbanking.generate-overview",version:"1.0.0",description:"Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.",goal:"Create a periodic financial snapshot.",context:"Aggregates data from open banking integration into a document.",owners:[i.PlatformFinance],tags:["open-banking","summary",d.Automation],stability:c.Experimental},io:{input:N,output:T},policy:{auth:"user"},telemetry:{success:{event:{key:q.overviewGenerated,version:"1.0.0"}}}}),Ee={"pfo.documents.upload":U,"pfo.reminders.schedule-payment":P,"pfo.summary.generate":A,"pfo.summary.dispatch":_,"pfo.email.sync-threads":Y,"pfo.openbanking.generate-overview":E};import{defineFeature as ee}from"@contractspec/lib.contracts-spec";var nt=ee({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),ot=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
26
+ - Read-only access to bank data (no write/payment initiation in this template).`},{id:"docs.examples.pocket-family-office.reference",title:"Pocket Family Office — Reference",summary:"Key components of the Pocket Family Office system.",kind:"reference",visibility:"public",route:"/docs/examples/pocket-family-office",tags:["finance","reference"],body:"## Workflows\n- `process-uploaded-document`: Extracts data from PDFs/Images.\n- `sync-openbanking-transactions`: Fetches latest transactions.\n- `generate-financial-summary`: AI-driven report generation.\n- `upcoming-payments-reminder`: Scans needed actions.\n\n## Operations\n- `pfo.documents.upload`: Secure upload endpoint for documents.\n\n## Capabilities\n- Requires: `identity`, `openbanking`.\n- Provides: `pocket-family-office`."}];I(K);import{defineExample as V}from"@contractspec/lib.contracts-spec/examples";var j=V({meta:{key:"examples.pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Pocket Family Office example - personal finance automation with open banking",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","pocket-family-office"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.pocket-family-office"}}),q=j;var r=new Date,Ye=[{meta:{id:"source-financial-uploads",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-docs",spaceVersion:"1.0.0",label:"Uploaded Financial Documents",sourceType:"file_upload",createdAt:r,updatedAt:r},config:{bucket:"pfo-uploads",prefix:"financial-docs/"},syncSchedule:{enabled:!0,intervalMs:900000},lastSync:{timestamp:r,success:!0}},{meta:{id:"source-gmail-threads",tenantId:"tenant.family-office",spaceKey:"knowledge.email-threads",spaceVersion:"1.0.0",label:"Household Gmail Threads",sourceType:"email",createdAt:r,updatedAt:r},config:{labelIds:["INBOX","FINANCE"]},syncSchedule:{enabled:!0,intervalMs:300000},lastSync:{timestamp:r,success:!0}},{meta:{id:"source-financial-overview",tenantId:"tenant.family-office",spaceKey:"knowledge.financial-overview",spaceVersion:"1.0.0",label:"Financial Overview",sourceType:"api",createdAt:r,updatedAt:r},config:{},syncSchedule:{enabled:!1}}];import{OPENBANKING_TELEMETRY_EVENTS as D}from"@contractspec/lib.contracts-integrations";import{defineCommand as l,defineQuery as F}from"@contractspec/lib.contracts-spec";import{OwnersEnum as i,StabilityEnum as c,TagsEnum as d}from"@contractspec/lib.contracts-spec/ownership";import{defineEnum as g,defineSchemaModel as n,ScalarTypeEnum as e}from"@contractspec/lib.schema";var H=g("Source",["upload","email","sync"]),R=g("Channel",["email","sms","both"]),Q=g("Period",["P7d","P30d","P90d"]),X=g("ObPeriod",["Pweek","Pmonth","Pquarter"]),z=n({name:"UploadDocumentInput",fields:{bucket:{type:e.NonEmptyString(),isOptional:!1},objectKey:{type:e.NonEmptyString(),isOptional:!1},mimeType:{type:e.NonEmptyString(),isOptional:!1},bytes:{type:e.Int_unsecure(),isOptional:!1},tags:{type:e.String_unsecure(),isOptional:!1,isArray:!0},uploadedAt:{type:e.Date(),isOptional:!1},source:{type:H,isOptional:!1}}}),J=n({name:"UploadDocumentOutput",fields:{documentId:{type:e.String_unsecure(),isOptional:!1},ingestionJobId:{type:e.String_unsecure(),isOptional:!1}}}),U=l({meta:{key:"pfo.documents.upload",version:"1.0.0",description:"Stores an object in tenant storage and schedules ingestion into the knowledge base.",goal:"Allow users to ingest financial documents for processing.",context:"Part of the finance domain. Documents are uploaded to object storage and then processed by the ingestion pipeline.",owners:[i.PlatformFinance],tags:["documents","ingestion",d.Guide],stability:c.Experimental},io:{input:z,output:J},policy:{auth:"user",rateLimit:{rpm:30,key:"user"}}}),Z=n({name:"PaymentReminderInput",fields:{billId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientPhone:{type:e.String_unsecure(),isOptional:!0},dueDate:{type:e.Date(),isOptional:!1},amountCents:{type:e.Int_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},channel:{type:R,isOptional:!1},memo:{type:e.String_unsecure(),isOptional:!0}}}),$=n({name:"PaymentReminderOutput",fields:{reminderId:{type:e.String_unsecure(),isOptional:!1},scheduledAt:{type:e.Date(),isOptional:!1}}}),C=l({meta:{key:"pfo.reminders.schedule-payment",version:"1.0.0",description:"Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.",goal:"Ensure bills are paid on time by notifying users.",context:"Finance automation. Reminders are sent via configured channels (email, SMS).",owners:[i.PlatformFinance],tags:["payments","reminders",d.Automation],stability:c.Beta},io:{input:Z,output:$},policy:{auth:"user"}}),G=n({name:"FinancialSummaryInput",fields:{period:{type:Q,isOptional:!1},includeVoiceSummary:{type:e.Boolean(),isOptional:!1}}}),P=n({name:"SummaryHighlight",fields:{label:{type:e.String_unsecure(),isOptional:!1},value:{type:e.String_unsecure(),isOptional:!1}}}),S=n({name:"FinancialSummaryOutput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},markdown:{type:e.String_unsecure(),isOptional:!1},highlights:{type:P,isOptional:!1,isArray:!0},cashflowDelta:{type:e.Float_unsecure(),isOptional:!1}}}),A=F({meta:{key:"pfo.summary.generate",version:"1.0.0",description:"Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.",goal:"Provide a quick overview of financial status and recent activity.",context:"Uses RAG over ingested knowledge. Summaries can be dispatched or viewed in app.",owners:[i.PlatformFinance],tags:["summary","ai",d.Automation],stability:c.Beta},io:{input:G,output:S},policy:{auth:"user"}}),W=n({name:"SyncEmailThreadsInput",fields:{labelIds:{type:e.String_unsecure(),isOptional:!1,isArray:!0},maxThreads:{type:e.Int_unsecure(),isOptional:!1},syncSinceMinutes:{type:e.Int_unsecure(),isOptional:!1}}}),L=n({name:"SyncEmailThreadsOutput",fields:{syncedThreads:{type:e.Int_unsecure(),isOptional:!1},lastMessageAt:{type:e.Date(),isOptional:!0}}}),Y=l({meta:{key:"pfo.email.sync-threads",version:"1.0.0",description:"Triggers ingestion of Gmail threads into the operational knowledge space.",goal:"Keep knowledge base up to date with email communications.",context:"Syncs from Gmail integration. Only includes threads matching configured labels.",owners:[i.PlatformMessaging],tags:["gmail","knowledge",d.Automation],stability:c.Beta},io:{input:W,output:L},policy:{auth:"user"}}),B=n({name:"SummaryDispatchInput",fields:{summaryId:{type:e.String_unsecure(),isOptional:!1},recipientEmail:{type:e.EmailAddress(),isOptional:!1},recipientName:{type:e.String_unsecure(),isOptional:!0},includeVoice:{type:e.Boolean(),isOptional:!1},voiceRecipient:{type:e.String_unsecure(),isOptional:!0}}}),_=n({name:"SummaryDispatchOutput",fields:{dispatchId:{type:e.String_unsecure(),isOptional:!1},emailSent:{type:e.Boolean(),isOptional:!1},voiceUrl:{type:e.String_unsecure(),isOptional:!0}}}),O=l({meta:{key:"pfo.summary.dispatch",version:"1.0.0",description:"Delivers the generated summary via email and optionally synthesises a voice note.",goal:"Deliver financial insights to users proactively.",context:"Dispatches summaries generated by pfo.summary.generate via email or voice.",owners:[i.PlatformMessaging],tags:["summary","communications",d.Automation],stability:c.Experimental},io:{input:B,output:_},policy:{auth:"user"}}),N=n({name:"OpenBankingOverviewInput",fields:{tenantId:{type:e.String_unsecure(),isOptional:!1},accountIds:{type:e.String_unsecure(),isOptional:!0,isArray:!0},period:{type:X,isOptional:!1},asOf:{type:e.Date(),isOptional:!0},includeCategories:{type:e.Boolean(),isOptional:!1},includeCashflowTrend:{type:e.Boolean(),isOptional:!1}}}),T=n({name:"OpenBankingOverviewOutput",fields:{knowledgeEntryId:{type:e.String_unsecure(),isOptional:!1},periodStart:{type:e.Date(),isOptional:!1},periodEnd:{type:e.Date(),isOptional:!1},generatedAt:{type:e.Date(),isOptional:!1},summaryPath:{type:e.String_unsecure(),isOptional:!0}}}),E=l({meta:{key:"pfo.openbanking.generate-overview",version:"1.0.0",description:"Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.",goal:"Create a periodic financial snapshot.",context:"Aggregates data from open banking integration into a document.",owners:[i.PlatformFinance],tags:["open-banking","summary",d.Automation],stability:c.Experimental},io:{input:N,output:T},policy:{auth:"user"},telemetry:{success:{event:{key:D.overviewGenerated,version:"1.0.0"}}}}),Ee={"pfo.documents.upload":U,"pfo.reminders.schedule-payment":C,"pfo.summary.generate":A,"pfo.summary.dispatch":O,"pfo.email.sync-threads":Y,"pfo.openbanking.generate-overview":E};import{defineFeature as ee}from"@contractspec/lib.contracts-spec/features";var nt=ee({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),ot=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
27
27
 
28
28
  Pocket Family Office is a ContractSpec reference vertical that
29
29
  demonstrates finance automation atop the integration and knowledge
@@ -128,4 +128,4 @@ tenant-specific IDs/secret references before deploying.
128
128
 
129
129
 
130
130
 
131
- `}];import{OPENBANKING_PII_FIELDS as te,OPENBANKING_TELEMETRY_EVENTS as f}from"@contractspec/lib.contracts-integrations";import{OwnersEnum as ne,StabilityEnum as oe,TagsEnum as ae}from"@contractspec/lib.contracts-spec/ownership";var p={tenantId:{type:"string",required:!0,description:"Tenant identifier for multi-tenant isolation."},appId:{type:"string",required:!0,description:"Application identifier associated with the event."},blueprint:{type:"string",required:!0,description:"Blueprint name@version emitting the telemetry."},configVersion:{type:"number",required:!0,description:"Resolved app config version when the event was generated."},slotId:{type:"string",required:!0,description:"Integration slot identifier (e.g., primaryOpenBanking)."},connectionId:{type:"string",required:!0,description:"Integration connection ID used for the sync."}};function h(r){return{type:"string",description:r,pii:!1}}var it={meta:{key:"pfo.telemetry",version:"1.0.0",title:"Pocket Family Office Telemetry",description:"Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.",domain:"finance",owners:[ne.PlatformFinance],tags:["open-banking",ae.Automation],stability:oe.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{key:f.accountsSynced,version:"1.0.0",semantics:{what:"Open banking account synchronisation completed.",why:"Refresh canonical account metadata for reporting and workflows."},privacy:"internal",properties:{...p,syncedCount:{type:"number",description:"Number of accounts synced successfully."},failedCount:{type:"number",description:"Number of accounts that failed to sync."},durationMs:{type:"number",description:"Duration of the sync job in milliseconds."}}},{key:f.transactionsSynced,version:"1.0.0",semantics:{what:"Open banking transaction synchronisation completed.",why:"Keep canonical transaction ledger in sync for analytics."},privacy:"internal",properties:{...p,accountId:{type:"string",description:"Bank account identifier used during the sync.",pii:!1},syncedCount:{type:"number",description:"Number of transactions synced successfully."},failedCount:{type:"number",description:"Number of transactions that failed to sync."},from:{type:"timestamp",description:"Start timestamp for the sync window."},to:{type:"timestamp",description:"End timestamp for the sync window."}}},{key:f.balancesRefreshed,version:"1.0.0",semantics:{what:"Open banking balances refreshed.",why:"Provide accurate cash position for dashboards and alerts."},privacy:"internal",properties:{...p,accountId:h("Bank account identifier."),balanceTypes:{type:"json",description:"Balance types included in the refresh."},refreshedAt:{type:"timestamp",description:"Timestamp when balances were refreshed."}}},{key:f.overviewGenerated,version:"1.0.0",semantics:{what:"Derived financial overview generated.",why:"Persist cashflow and category summaries into knowledge space."},privacy:"internal",properties:{...p,knowledgeEntryId:h("Identifier of the knowledge document containing the overview."),period:{type:"string",description:"Aggregation period used (week, month, quarter)."},periodStart:{type:"timestamp",description:"Start timestamp for the aggregation window."},periodEnd:{type:"timestamp",description:"End timestamp for the aggregation window."}},tags:["knowledge","analytics"]}]},ct=te;var lt={meta:{id:"tenant-pfo-sample",tenantId:"tenant.family-office",appId:"pocket-family-office",blueprintName:"pocket-family-office.app",blueprintVersion:"1.0.0",environment:"production",version:"1.0.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),status:"published"},featureFlags:[{key:"voice-summaries",enabled:!0,description:"Enable spoken ElevenLabs summaries for daily briefings."}],integrations:[{slotId:"primaryLLM",connectionId:"conn-mistral-primary"},{slotId:"primaryVectorDb",connectionId:"conn-qdrant-finance"},{slotId:"primaryStorage",connectionId:"conn-gcs-documents"},{slotId:"primaryOpenBanking",connectionId:"conn-powens-primary"},{slotId:"emailInbound",connectionId:"conn-gmail-threads"},{slotId:"emailOutbound",connectionId:"conn-postmark-outbound"},{slotId:"calendarScheduling",connectionId:"conn-google-calendar"},{slotId:"voicePlayback",connectionId:"conn-elevenlabs-voice"},{slotId:"smsNotifications",connectionId:"conn-twilio-sms"},{slotId:"paymentsProcessing",connectionId:"conn-stripe-recurring"}],knowledge:[{spaceKey:"knowledge.financial-docs",scope:{workflows:["pfo.workflow.process-uploaded-document","pfo.workflow.generate-financial-summary"]}},{spaceKey:"knowledge.email-threads",scope:{workflows:["pfo.workflow.ingest-email-threads"]}},{spaceKey:"knowledge.financial-overview",scope:{workflows:["pfo.workflow.sync-openbanking-transactions","pfo.workflow.refresh-openbanking-balances","pfo.workflow.generate-financial-summary","pfo.workflow.generate-openbanking-overview"]},required:!1}],locales:{defaultLocale:"en",enabledLocales:["en"]},notes:"Sample tenant configuration for hackathon demos. Replace connection IDs with tenant-specific bindings when provisioning."};import{OwnersEnum as se,StabilityEnum as re,TagsEnum as ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ce}from"@contractspec/lib.contracts-spec/workflow/spec";var mt=ce({meta:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0",title:"Generate Financial Summary",description:"Retrieves the latest financial signals, generates an AI summary, and optionally distributes it by voice or email.",domain:"finance",owners:[se.PlatformFinance],tags:["summary","ai",ie.Automation],stability:re.Beta},definition:{entryStepId:"summarise",steps:[{id:"summarise",type:"automation",label:"Generate Summary",description:"Run retrieval augmented generation over the knowledge base to produce a household summary.",action:{operation:{key:"pfo.summary.generate",version:"1.0.0"}},requiredIntegrations:["primaryLLM","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:750}},{id:"distribute",type:"automation",label:"Distribute Summary",description:"Send the generated summary via email and optionally synthesise a voice note.",action:{operation:{key:"pfo.summary.dispatch",version:"1.0.0"}},requiredIntegrations:["emailOutbound"],retry:{maxAttempts:2,backoff:"linear",delayMs:500}}],transitions:[{from:"summarise",to:"distribute"}]}});import{OwnersEnum as de,StabilityEnum as le,TagsEnum as ge}from"@contractspec/lib.contracts-spec";import{defineWorkflow as fe}from"@contractspec/lib.contracts-spec/workflow/spec";var pe=[{key:"openbanking.accounts.read",version:"1.0.0"},{key:"openbanking.transactions.read",version:"1.0.0"},{key:"openbanking.balances.read",version:"1.0.0"}],kt=fe({meta:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0",title:"Generate Open Banking Overview",description:"Produces a derived financial overview and stores it in the operational knowledge space.",domain:"finance",owners:[de.PlatformFinance],tags:["open-banking","summary",ge.Automation],stability:le.Experimental},definition:{entryStepId:"generate-overview",steps:[{id:"generate-overview",type:"automation",label:"Generate Overview",description:"Aggregate balances, cashflow, and category breakdowns into a knowledge entry.",action:{operation:{key:"pfo.openbanking.generate-overview",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:pe,retry:{maxAttempts:3,backoff:"exponential",delayMs:1500}}],transitions:[]}});import{OwnersEnum as me,StabilityEnum as he,TagsEnum as ue}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ye}from"@contractspec/lib.contracts-spec/workflow/spec";var wt=ye({meta:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0",title:"Ingest Email Threads",description:"Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.",domain:"communications",owners:[me.PlatformMessaging],tags:["gmail","knowledge",ue.Automation],stability:he.Experimental},definition:{entryStepId:"sync",steps:[{id:"sync",type:"automation",label:"Sync Gmail Threads",description:"Fetches Gmail threads and transforms them into knowledge fragments before vector indexing.",action:{operation:{key:"pfo.email.sync-threads",version:"1.0.0"}},requiredIntegrations:["emailInbound","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"triage",type:"human",label:"Triage Exceptions",description:"Operators can resolve sync failures or tag important threads for follow-up."}],transitions:[{from:"sync",to:"triage",condition:"output?.syncedThreads === 0",label:"No new threads"}]}});import{OwnersEnum as ke,StabilityEnum as ve,TagsEnum as be}from"@contractspec/lib.contracts-spec";import{defineWorkflow as xe}from"@contractspec/lib.contracts-spec/workflow/spec";var Vt=xe({meta:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0",title:"Process Uploaded Document",description:"Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.",domain:"finance",owners:[ke.PlatformFinance],tags:["documents","ingestion",be.Automation],stability:ve.Experimental},definition:{entryStepId:"store",steps:[{id:"store",type:"automation",label:"Store and Queue Ingestion",description:"Persist the document to storage and enqueue the knowledge ingestion pipeline.",action:{operation:{key:"pfo.documents.upload",version:"1.0.0"}},requiredIntegrations:["primaryStorage","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:500}},{id:"review",type:"human",label:"Optional Human Classification",description:"Finance lead can categorise the document while ingestion completes."}],transitions:[{from:"store",to:"review"}]}});import{OwnersEnum as we,StabilityEnum as Me,TagsEnum as Ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ke}from"@contractspec/lib.contracts-spec/workflow/spec";var u={key:"openbanking.balances.read",version:"1.0.0"},Dt=Ke({meta:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0",title:"Refresh Open Banking Balances",description:"Refreshes balances for synced accounts to surface the latest cash positions in dashboards.",domain:"finance",owners:[we.PlatformFinance],tags:["open-banking","powens",Ie.Automation],stability:Me.Experimental},definition:{entryStepId:"refresh-balances",steps:[{id:"refresh-balances",type:"automation",label:"Refresh Balances",description:"Trigger the Powens provider to obtain current and available balances.",action:{operation:{key:"openbanking.balances.refresh",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-balances",type:"automation",label:"Fetch Balances",description:"Load the canonical balance snapshots for downstream workflows and dashboards.",action:{operation:{key:"openbanking.balances.get",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"refresh-balances",to:"fetch-balances"}]}});import{OwnersEnum as Ve,StabilityEnum as je,TagsEnum as Fe}from"@contractspec/lib.contracts-spec";import{defineWorkflow as qe}from"@contractspec/lib.contracts-spec/workflow/spec";var y={key:"openbanking.accounts.read",version:"1.0.0"},Xt=qe({meta:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0",title:"Synchronise Open Banking Accounts",description:"Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.",domain:"finance",owners:[Ve.PlatformFinance],tags:["open-banking","powens",Fe.Automation],stability:je.Experimental},definition:{entryStepId:"sync-accounts",steps:[{id:"sync-accounts",type:"automation",label:"Sync Accounts",description:"Refresh linked bank accounts via Powens and upsert canonical BankAccount records.",action:{operation:{key:"openbanking.accounts.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-accounts",type:"automation",label:"Fetch Accounts",description:"Retrieve the latest canonical account snapshot for downstream consumers.",action:{operation:{key:"openbanking.accounts.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"sync-accounts",to:"fetch-accounts"}]}});import{OwnersEnum as De,StabilityEnum as He,TagsEnum as Re}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Qe}from"@contractspec/lib.contracts-spec/workflow/spec";var k={key:"openbanking.transactions.read",version:"1.0.0"},Zt=Qe({meta:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0",title:"Synchronise Open Banking Transactions",description:"Fetches recent transactions from Powens for each linked account and stores them in the canonical ledger.",domain:"finance",owners:[De.PlatformFinance],tags:["open-banking","powens",Re.Automation],stability:He.Experimental},definition:{entryStepId:"sync-transactions",steps:[{id:"sync-transactions",type:"automation",label:"Sync Transactions",description:"Call the Powens provider to pull incremental transactions for active accounts.",action:{operation:{key:"openbanking.transactions.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[k],retry:{maxAttempts:4,backoff:"exponential",delayMs:1500}},{id:"list-transactions",type:"automation",label:"List Transactions",description:"Retrieve the canonical transaction list for reporting and downstream analytics.",action:{operation:{key:"openbanking.transactions.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[k],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"sync-transactions",to:"list-transactions"}]}});import{OwnersEnum as Xe,StabilityEnum as ze,TagsEnum as Je}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ue}from"@contractspec/lib.contracts-spec/workflow/spec";var Gt=Ue({meta:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0",title:"Schedule Upcoming Payment Reminder",description:"Collects payment metadata and schedules multi-channel reminders for bills that are due soon.",domain:"finance",owners:[Xe.PlatformFinance],tags:["payments","reminders",Je.Automation],stability:ze.Beta},definition:{entryStepId:"collect",steps:[{id:"collect",type:"human",label:"Review Upcoming Bill",description:"Confirm amount, due date, and preferred delivery channels before scheduling reminder."},{id:"schedule",type:"automation",label:"Schedule Reminder",action:{operation:{key:"pfo.reminders.schedule-payment",version:"1.0.0"}},requiredIntegrations:["emailOutbound","smsNotifications","calendarScheduling"],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"collect",to:"schedule",condition:"output?.confirmed === true",label:"Reminder confirmed"}]}});export{U as uploadDocumentContract,Gt as upcomingPaymentsReminderWorkflow,ot as tech_contracts_vertical_pocket_family_office_DocBlocks,Zt as syncOpenBankingTransactionsWorkflow,Xt as syncOpenBankingAccountsWorkflow,Y as syncEmailThreadsContract,P as schedulePaymentReminderContract,$e as registerPocketFamilyOfficeBlueprint,Dt as refreshOpenBankingBalancesWorkflow,Vt as processUploadedDocumentWorkflow,lt as pocketFamilyOfficeTenantSample,it as pocketFamilyOfficeTelemetry,Ye as pocketFamilyOfficeKnowledgeSources,Ee as pocketFamilyOfficeContracts,M as pocketFamilyOfficeConnections,w as pocketFamilyOfficeBlueprint,wt as ingestEmailThreadsWorkflow,Ce as getPocketFamilyOfficeConnection,kt as generateOpenBankingOverviewWorkflow,E as generateOpenBankingOverviewContract,mt as generateFinancialSummaryWorkflow,A as generateFinancialSummaryContract,F as example,_ as dispatchFinancialSummaryContract,nt as PocketFamilyOfficeFeature,ct as OPENBANKING_SENSITIVE_FIELDS};
131
+ `}];import{OPENBANKING_PII_FIELDS as te,OPENBANKING_TELEMETRY_EVENTS as p}from"@contractspec/lib.contracts-integrations";import{OwnersEnum as ne,StabilityEnum as oe,TagsEnum as ae}from"@contractspec/lib.contracts-spec/ownership";var f={tenantId:{type:"string",required:!0,description:"Tenant identifier for multi-tenant isolation."},appId:{type:"string",required:!0,description:"Application identifier associated with the event."},blueprint:{type:"string",required:!0,description:"Blueprint name@version emitting the telemetry."},configVersion:{type:"number",required:!0,description:"Resolved app config version when the event was generated."},slotId:{type:"string",required:!0,description:"Integration slot identifier (e.g., primaryOpenBanking)."},connectionId:{type:"string",required:!0,description:"Integration connection ID used for the sync."}};function h(s){return{type:"string",description:s,pii:!1}}var it={meta:{key:"pfo.telemetry",version:"1.0.0",title:"Pocket Family Office Telemetry",description:"Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.",domain:"finance",owners:[ne.PlatformFinance],tags:["open-banking",ae.Automation],stability:oe.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{key:p.accountsSynced,version:"1.0.0",semantics:{what:"Open banking account synchronisation completed.",why:"Refresh canonical account metadata for reporting and workflows."},privacy:"internal",properties:{...f,syncedCount:{type:"number",description:"Number of accounts synced successfully."},failedCount:{type:"number",description:"Number of accounts that failed to sync."},durationMs:{type:"number",description:"Duration of the sync job in milliseconds."}}},{key:p.transactionsSynced,version:"1.0.0",semantics:{what:"Open banking transaction synchronisation completed.",why:"Keep canonical transaction ledger in sync for analytics."},privacy:"internal",properties:{...f,accountId:{type:"string",description:"Bank account identifier used during the sync.",pii:!1},syncedCount:{type:"number",description:"Number of transactions synced successfully."},failedCount:{type:"number",description:"Number of transactions that failed to sync."},from:{type:"timestamp",description:"Start timestamp for the sync window."},to:{type:"timestamp",description:"End timestamp for the sync window."}}},{key:p.balancesRefreshed,version:"1.0.0",semantics:{what:"Open banking balances refreshed.",why:"Provide accurate cash position for dashboards and alerts."},privacy:"internal",properties:{...f,accountId:h("Bank account identifier."),balanceTypes:{type:"json",description:"Balance types included in the refresh."},refreshedAt:{type:"timestamp",description:"Timestamp when balances were refreshed."}}},{key:p.overviewGenerated,version:"1.0.0",semantics:{what:"Derived financial overview generated.",why:"Persist cashflow and category summaries into knowledge space."},privacy:"internal",properties:{...f,knowledgeEntryId:h("Identifier of the knowledge document containing the overview."),period:{type:"string",description:"Aggregation period used (week, month, quarter)."},periodStart:{type:"timestamp",description:"Start timestamp for the aggregation window."},periodEnd:{type:"timestamp",description:"End timestamp for the aggregation window."}},tags:["knowledge","analytics"]}]},ct=te;var lt={meta:{id:"tenant-pfo-sample",tenantId:"tenant.family-office",appId:"pocket-family-office",blueprintName:"pocket-family-office.app",blueprintVersion:"1.0.0",environment:"production",version:"1.0.0",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),status:"published"},featureFlags:[{key:"voice-summaries",enabled:!0,description:"Enable spoken ElevenLabs summaries for daily briefings."}],integrations:[{slotId:"primaryLLM",connectionId:"conn-mistral-primary"},{slotId:"primaryVectorDb",connectionId:"conn-qdrant-finance"},{slotId:"primaryStorage",connectionId:"conn-gcs-documents"},{slotId:"primaryOpenBanking",connectionId:"conn-powens-primary"},{slotId:"emailInbound",connectionId:"conn-gmail-threads"},{slotId:"emailOutbound",connectionId:"conn-postmark-outbound"},{slotId:"calendarScheduling",connectionId:"conn-google-calendar"},{slotId:"voicePlayback",connectionId:"conn-elevenlabs-voice"},{slotId:"smsNotifications",connectionId:"conn-twilio-sms"},{slotId:"paymentsProcessing",connectionId:"conn-stripe-recurring"}],knowledge:[{spaceKey:"knowledge.financial-docs",scope:{workflows:["pfo.workflow.process-uploaded-document","pfo.workflow.generate-financial-summary"]}},{spaceKey:"knowledge.email-threads",scope:{workflows:["pfo.workflow.ingest-email-threads"]}},{spaceKey:"knowledge.financial-overview",scope:{workflows:["pfo.workflow.sync-openbanking-transactions","pfo.workflow.refresh-openbanking-balances","pfo.workflow.generate-financial-summary","pfo.workflow.generate-openbanking-overview"]},required:!1}],locales:{defaultLocale:"en",enabledLocales:["en"]},notes:"Sample tenant configuration for hackathon demos. Replace connection IDs with tenant-specific bindings when provisioning."};import{OwnersEnum as re,StabilityEnum as se,TagsEnum as ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ce}from"@contractspec/lib.contracts-spec/workflow/spec";var mt=ce({meta:{key:"pfo.workflow.generate-financial-summary",version:"1.0.0",title:"Generate Financial Summary",description:"Retrieves the latest financial signals, generates an AI summary, and optionally distributes it by voice or email.",domain:"finance",owners:[re.PlatformFinance],tags:["summary","ai",ie.Automation],stability:se.Beta},definition:{entryStepId:"summarise",steps:[{id:"summarise",type:"automation",label:"Generate Summary",description:"Run retrieval augmented generation over the knowledge base to produce a household summary.",action:{operation:{key:"pfo.summary.generate",version:"1.0.0"}},requiredIntegrations:["primaryLLM","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:750}},{id:"distribute",type:"automation",label:"Distribute Summary",description:"Send the generated summary via email and optionally synthesise a voice note.",action:{operation:{key:"pfo.summary.dispatch",version:"1.0.0"}},requiredIntegrations:["emailOutbound"],retry:{maxAttempts:2,backoff:"linear",delayMs:500}}],transitions:[{from:"summarise",to:"distribute"}]}});import{OwnersEnum as de,StabilityEnum as le,TagsEnum as ge}from"@contractspec/lib.contracts-spec";import{defineWorkflow as pe}from"@contractspec/lib.contracts-spec/workflow/spec";var fe=[{key:"openbanking.accounts.read",version:"1.0.0"},{key:"openbanking.transactions.read",version:"1.0.0"},{key:"openbanking.balances.read",version:"1.0.0"}],vt=pe({meta:{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0",title:"Generate Open Banking Overview",description:"Produces a derived financial overview and stores it in the operational knowledge space.",domain:"finance",owners:[de.PlatformFinance],tags:["open-banking","summary",ge.Automation],stability:le.Experimental},definition:{entryStepId:"generate-overview",steps:[{id:"generate-overview",type:"automation",label:"Generate Overview",description:"Aggregate balances, cashflow, and category breakdowns into a knowledge entry.",action:{operation:{key:"pfo.openbanking.generate-overview",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:fe,retry:{maxAttempts:3,backoff:"exponential",delayMs:1500}}],transitions:[]}});import{OwnersEnum as me,StabilityEnum as he,TagsEnum as ue}from"@contractspec/lib.contracts-spec";import{defineWorkflow as ye}from"@contractspec/lib.contracts-spec/workflow/spec";var wt=ye({meta:{key:"pfo.workflow.ingest-email-threads",version:"1.0.0",title:"Ingest Email Threads",description:"Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.",domain:"communications",owners:[me.PlatformMessaging],tags:["gmail","knowledge",ue.Automation],stability:he.Experimental},definition:{entryStepId:"sync",steps:[{id:"sync",type:"automation",label:"Sync Gmail Threads",description:"Fetches Gmail threads and transforms them into knowledge fragments before vector indexing.",action:{operation:{key:"pfo.email.sync-threads",version:"1.0.0"}},requiredIntegrations:["emailInbound","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"triage",type:"human",label:"Triage Exceptions",description:"Operators can resolve sync failures or tag important threads for follow-up."}],transitions:[{from:"sync",to:"triage",condition:"output?.syncedThreads === 0",label:"No new threads"}]}});import{OwnersEnum as ve,StabilityEnum as ke,TagsEnum as be}from"@contractspec/lib.contracts-spec";import{defineWorkflow as xe}from"@contractspec/lib.contracts-spec/workflow/spec";var Vt=xe({meta:{key:"pfo.workflow.process-uploaded-document",version:"1.0.0",title:"Process Uploaded Document",description:"Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.",domain:"finance",owners:[ve.PlatformFinance],tags:["documents","ingestion",be.Automation],stability:ke.Experimental},definition:{entryStepId:"store",steps:[{id:"store",type:"automation",label:"Store and Queue Ingestion",description:"Persist the document to storage and enqueue the knowledge ingestion pipeline.",action:{operation:{key:"pfo.documents.upload",version:"1.0.0"}},requiredIntegrations:["primaryStorage","primaryVectorDb"],retry:{maxAttempts:3,backoff:"exponential",delayMs:500}},{id:"review",type:"human",label:"Optional Human Classification",description:"Finance lead can categorise the document while ingestion completes."}],transitions:[{from:"store",to:"review"}]}});import{OwnersEnum as we,StabilityEnum as Me,TagsEnum as Ie}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ke}from"@contractspec/lib.contracts-spec/workflow/spec";var u={key:"openbanking.balances.read",version:"1.0.0"},Ft=Ke({meta:{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0",title:"Refresh Open Banking Balances",description:"Refreshes balances for synced accounts to surface the latest cash positions in dashboards.",domain:"finance",owners:[we.PlatformFinance],tags:["open-banking","powens",Ie.Automation],stability:Me.Experimental},definition:{entryStepId:"refresh-balances",steps:[{id:"refresh-balances",type:"automation",label:"Refresh Balances",description:"Trigger the Powens provider to obtain current and available balances.",action:{operation:{key:"openbanking.balances.refresh",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-balances",type:"automation",label:"Fetch Balances",description:"Load the canonical balance snapshots for downstream workflows and dashboards.",action:{operation:{key:"openbanking.balances.get",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[u],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"refresh-balances",to:"fetch-balances"}]}});import{OwnersEnum as Ve,StabilityEnum as je,TagsEnum as qe}from"@contractspec/lib.contracts-spec";import{defineWorkflow as De}from"@contractspec/lib.contracts-spec/workflow/spec";var y={key:"openbanking.accounts.read",version:"1.0.0"},Xt=De({meta:{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0",title:"Synchronise Open Banking Accounts",description:"Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.",domain:"finance",owners:[Ve.PlatformFinance],tags:["open-banking","powens",qe.Automation],stability:je.Experimental},definition:{entryStepId:"sync-accounts",steps:[{id:"sync-accounts",type:"automation",label:"Sync Accounts",description:"Refresh linked bank accounts via Powens and upsert canonical BankAccount records.",action:{operation:{key:"openbanking.accounts.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:3,backoff:"exponential",delayMs:1000}},{id:"fetch-accounts",type:"automation",label:"Fetch Accounts",description:"Retrieve the latest canonical account snapshot for downstream consumers.",action:{operation:{key:"openbanking.accounts.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[y],retry:{maxAttempts:2,backoff:"linear",delayMs:750}}],transitions:[{from:"sync-accounts",to:"fetch-accounts"}]}});import{OwnersEnum as Fe,StabilityEnum as He,TagsEnum as Re}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Qe}from"@contractspec/lib.contracts-spec/workflow/spec";var v={key:"openbanking.transactions.read",version:"1.0.0"},Zt=Qe({meta:{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0",title:"Synchronise Open Banking Transactions",description:"Fetches recent transactions from Powens for each linked account and stores them in the canonical ledger.",domain:"finance",owners:[Fe.PlatformFinance],tags:["open-banking","powens",Re.Automation],stability:He.Experimental},definition:{entryStepId:"sync-transactions",steps:[{id:"sync-transactions",type:"automation",label:"Sync Transactions",description:"Call the Powens provider to pull incremental transactions for active accounts.",action:{operation:{key:"openbanking.transactions.sync",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[v],retry:{maxAttempts:4,backoff:"exponential",delayMs:1500}},{id:"list-transactions",type:"automation",label:"List Transactions",description:"Retrieve the canonical transaction list for reporting and downstream analytics.",action:{operation:{key:"openbanking.transactions.list",version:"1.0.0"}},requiredIntegrations:["primaryOpenBanking"],requiredCapabilities:[v],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"sync-transactions",to:"list-transactions"}]}});import{OwnersEnum as Xe,StabilityEnum as ze,TagsEnum as Je}from"@contractspec/lib.contracts-spec";import{defineWorkflow as Ue}from"@contractspec/lib.contracts-spec/workflow/spec";var Pt=Ue({meta:{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0",title:"Schedule Upcoming Payment Reminder",description:"Collects payment metadata and schedules multi-channel reminders for bills that are due soon.",domain:"finance",owners:[Xe.PlatformFinance],tags:["payments","reminders",Je.Automation],stability:ze.Beta},definition:{entryStepId:"collect",steps:[{id:"collect",type:"human",label:"Review Upcoming Bill",description:"Confirm amount, due date, and preferred delivery channels before scheduling reminder."},{id:"schedule",type:"automation",label:"Schedule Reminder",action:{operation:{key:"pfo.reminders.schedule-payment",version:"1.0.0"}},requiredIntegrations:["emailOutbound","smsNotifications","calendarScheduling"],retry:{maxAttempts:2,backoff:"linear",delayMs:1000}}],transitions:[{from:"collect",to:"schedule",condition:"output?.confirmed === true",label:"Reminder confirmed"}]}});export{U as uploadDocumentContract,Pt as upcomingPaymentsReminderWorkflow,ot as tech_contracts_vertical_pocket_family_office_DocBlocks,Zt as syncOpenBankingTransactionsWorkflow,Xt as syncOpenBankingAccountsWorkflow,Y as syncEmailThreadsContract,C as schedulePaymentReminderContract,$e as registerPocketFamilyOfficeBlueprint,Ft as refreshOpenBankingBalancesWorkflow,Vt as processUploadedDocumentWorkflow,lt as pocketFamilyOfficeTenantSample,it as pocketFamilyOfficeTelemetry,Ye as pocketFamilyOfficeKnowledgeSources,Ee as pocketFamilyOfficeContracts,M as pocketFamilyOfficeConnections,w as pocketFamilyOfficeBlueprint,wt as ingestEmailThreadsWorkflow,Ge as getPocketFamilyOfficeConnection,vt as generateOpenBankingOverviewWorkflow,E as generateOpenBankingOverviewContract,mt as generateFinancialSummaryWorkflow,A as generateFinancialSummaryContract,q as example,O as dispatchFinancialSummaryContract,nt as PocketFamilyOfficeFeature,ct as OPENBANKING_SENSITIVE_FIELDS,j as ExamplesPocketFamilyOfficeExample};
@@ -1,4 +1,4 @@
1
- import{defineFeature as g}from"@contractspec/lib.contracts-spec";var j=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),k=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
1
+ import{defineFeature as g}from"@contractspec/lib.contracts-spec/features";var j=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),k=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
2
2
 
3
3
  Pocket Family Office is a ContractSpec reference vertical that
4
4
  demonstrates finance automation atop the integration and knowledge
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{defineFeature as g}from"@contractspec/lib.contracts-spec";var j=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),k=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
2
+ import{defineFeature as g}from"@contractspec/lib.contracts-spec/features";var j=g({meta:{key:"pocket-family-office",version:"1.0.0",title:"Pocket Family Office",description:"Personal finance automation with document ingestion, open banking, and AI summaries",domain:"finance",owners:["@platform.finance"],tags:["finance","open-banking","documents","automation","family-office"],stability:"experimental"},operations:[{key:"pfo.documents.upload",version:"1.0.0"},{key:"pfo.reminders.schedule-payment",version:"1.0.0"},{key:"pfo.summary.generate",version:"1.0.0"},{key:"pfo.email.sync-threads",version:"1.0.0"},{key:"pfo.summary.dispatch",version:"1.0.0"},{key:"pfo.openbanking.generate-overview",version:"1.0.0"}],events:[],presentations:[],opToPresentation:[],presentationsTargets:[],capabilities:{provides:[{key:"pocket-family-office",version:"1.0.0"}],requires:[{key:"identity",version:"1.0.0"},{key:"openbanking",version:"1.0.0"}]},workflows:[{key:"pfo.workflow.sync-openbanking-accounts",version:"1.0.0"},{key:"pfo.workflow.sync-openbanking-transactions",version:"1.0.0"},{key:"pfo.workflow.refresh-openbanking-balances",version:"1.0.0"},{key:"pfo.workflow.generate-openbanking-overview",version:"1.0.0"},{key:"pfo.workflow.process-uploaded-document",version:"1.0.0"},{key:"pfo.workflow.upcoming-payments-reminder",version:"1.0.0"},{key:"pfo.workflow.generate-financial-summary",version:"1.0.0"},{key:"pfo.workflow.ingest-email-threads",version:"1.0.0"}],knowledge:[{key:"knowledge.financial-docs",version:"1.0.0"},{key:"knowledge.email-threads",version:"1.0.0"},{key:"knowledge.financial-overview",version:"1.0.0"}],telemetry:[{key:"pfo.telemetry",version:"1.0.0"}],policies:[{key:"pfo.policy.tenancy",version:"1.0.0"}],integrations:[{key:"pfo.integration.openbanking",version:"1.0.0"},{key:"pfo.integration.llm",version:"1.0.0"}],jobs:[{key:"pfo.job.doc-processing",version:"1.0.0"},{key:"pfo.job.reminder-dispatch",version:"1.0.0"}],docs:["docs.examples.pocket-family-office.goal","docs.examples.pocket-family-office.usage","docs.examples.pocket-family-office.reference"]}),k=[{id:"docs.tech.contracts.vertical-pocket-family-office",title:"Pocket Family Office Vertical",summary:"Pocket Family Office is a ContractSpec reference vertical that",kind:"reference",visibility:"public",route:"/docs/tech/contracts/vertical-pocket-family-office",tags:["tech","contracts","vertical-pocket-family-office"],body:`# Pocket Family Office Vertical
3
3
 
4
4
  Pocket Family Office is a ContractSpec reference vertical that
5
5
  demonstrates finance automation atop the integration and knowledge
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/example.pocket-family-office",
3
- "version": "3.7.20",
3
+ "version": "3.7.22",
4
4
  "description": "Pocket Family Office example - personal finance automation with open banking",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -29,15 +29,15 @@
29
29
  "typecheck": "tsc --noEmit"
30
30
  },
31
31
  "dependencies": {
32
- "@contractspec/lib.knowledge": "3.7.20",
33
- "@contractspec/lib.contracts-spec": "5.4.0",
34
- "@contractspec/lib.contracts-integrations": "3.8.12",
32
+ "@contractspec/lib.knowledge": "3.7.22",
33
+ "@contractspec/lib.contracts-spec": "5.5.1",
34
+ "@contractspec/lib.contracts-integrations": "3.8.14",
35
35
  "@contractspec/lib.schema": "3.7.14"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@contractspec/tool.typescript": "3.7.13",
39
39
  "typescript": "^5.9.3",
40
- "@contractspec/tool.bun": "3.7.14"
40
+ "@contractspec/tool.bun": "3.7.17"
41
41
  },
42
42
  "exports": {
43
43
  ".": {