@lssm/example.pocket-family-office 0.0.0-canary-20251217060834 → 0.0.0-canary-20251217063201
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blueprint.js +1 -1
- package/dist/contracts/index.js +1 -1
- package/dist/libs/contracts/dist/integrations/index.js +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/index.js +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/models.js +1 -0
- package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/gmail.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/index.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/mistral.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/postmark.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/powens.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/qdrant.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/registry.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/stripe.js +1 -0
- package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +1 -0
- package/dist/libs/contracts/dist/ownership.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/EnumType.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/FieldType.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/entity/index.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/entity/types.js +1 -0
- package/dist/libs/contracts/dist/schema/dist/index.js +1 -0
- package/dist/libs/contracts/dist/spec.js +1 -0
- package/dist/telemetry.js +1 -1
- package/dist/workflows/generate-financial-summary.js +1 -1
- package/dist/workflows/generate-openbanking-overview.js +1 -1
- package/dist/workflows/ingest-email-threads.js +1 -1
- package/dist/workflows/process-uploaded-document.js +1 -1
- package/dist/workflows/refresh-openbanking-balances.js +1 -1
- package/dist/workflows/sync-openbanking-accounts.js +1 -1
- package/dist/workflows/sync-openbanking-transactions.js +1 -1
- package/dist/workflows/upcoming-payments-reminder.js +1 -1
- package/package.json +5 -5
package/dist/blueprint.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"./libs/contracts/dist/ownership.js";const r=(e,t)=>({key:e,version:t}),i={meta:{name:`pocket-family-office.app`,version:1,appId:`pocket-family-office`,title:`Pocket Family Office`,description:`Household finance automation: ingest documents, track bills, remind payments, and summarise cashflow.`,domain:`finance`,owners:[n.PlatformFinance],tags:[t.Guide,`finance`,`automation`],stability:e.Experimental},capabilities:{enabled:[r(`ai.chat`,1),r(`ai.embeddings`,1),r(`vector-db.search`,1),r(`vector-db.storage`,1),r(`storage.objects`,1),r(`email.inbound`,1),r(`email.transactional`,1),r(`calendar.events`,1),r(`sms.outbound`,1),r(`ai.voice.synthesis`,1),r(`payments.psp`,1),r(`openbanking.accounts.read`,1),r(`openbanking.transactions.read`,1),r(`openbanking.balances.read`,1)]},integrationSlots:[{slotId:`primaryLLM`,requiredCategory:`ai-llm`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`ai.chat`,1)],required:!0,description:`Chat completion provider powering summarisation, explanations, and insights.`},{slotId:`primaryVectorDb`,requiredCategory:`vector-db`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`vector-db.search`,1)],required:!0,description:`Vector database storing embeddings for financial documents and email threads.`},{slotId:`primaryStorage`,requiredCategory:`storage`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`storage.objects`,1)],required:!0,description:`Object storage used for raw uploads and normalised documents.`},{slotId:`primaryOpenBanking`,requiredCategory:`open-banking`,allowedModes:[`byok`],requiredCapabilities:[r(`openbanking.accounts.read`,1),r(`openbanking.transactions.read`,1),r(`openbanking.balances.read`,1)],required:!0,description:`Powens BYOK connection powering bank account, transaction, and balance synchronisation.`},{slotId:`emailInbound`,requiredCategory:`email`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`email.inbound`,1)],required:!0,description:`Inbound email/thread sync (Gmail) feeding the knowledge corpus.`},{slotId:`emailOutbound`,requiredCategory:`email`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`email.transactional`,1)],required:!0,description:`Transactional email delivery for reminders and summaries.`},{slotId:`calendarScheduling`,requiredCategory:`calendar`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`calendar.events`,1)],required:!0,description:`Creates calendar holds for bill reviews and handoff meetings.`},{slotId:`voicePlayback`,requiredCategory:`ai-voice`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`ai.voice.synthesis`,1)],required:!1,description:`Optional voice synthesis for spoken summaries (ElevenLabs).`},{slotId:`smsNotifications`,requiredCategory:`sms`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`sms.outbound`,1)],required:!1,description:`SMS provider used for urgent reminders.`},{slotId:`paymentsProcessing`,requiredCategory:`payments`,allowedModes:[`managed`,`byok`],requiredCapabilities:[r(`payments.psp`,1)],required:!1,description:`Optional payments processor enabling bill pay automations.`}],workflows:{processUploadedDocument:{name:`pfo.workflow.process-uploaded-document`,version:1},upcomingPaymentsReminder:{name:`pfo.workflow.upcoming-payments-reminder`,version:1},generateFinancialSummary:{name:`pfo.workflow.generate-financial-summary`,version:1},ingestEmailThreads:{name:`pfo.workflow.ingest-email-threads`,version:1},syncOpenBankingAccounts:{name:`pfo.workflow.sync-openbanking-accounts`,version:1},syncOpenBankingTransactions:{name:`pfo.workflow.sync-openbanking-transactions`,version:1},refreshOpenBankingBalances:{name:`pfo.workflow.refresh-openbanking-balances`,version:1},generateOpenBankingOverview:{name:`pfo.workflow.generate-openbanking-overview`,version:1}},policies:[{name:`pfo.policy.tenancy`,version:1},{name:`knowledge.access.financial-docs`,version:1}],telemetry:{spec:{name:`pfo.telemetry`,version:1}},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 a(e){return e.register(i)}export{i as pocketFamilyOfficeBlueprint,a as registerPocketFamilyOfficeBlueprint};
|
package/dist/contracts/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";import{t as r}from"../libs/contracts/dist/integrations/openbanking/telemetry.js";import"../libs/contracts/dist/integrations/index.js";import*as i from"zod";const a=i.object({bucket:i.string().min(1),objectKey:i.string().min(1),mimeType:i.string().min(1),bytes:i.number().int().nonnegative(),tags:i.array(i.string()).default([]),uploadedAt:i.coerce.date(),source:i.enum([`upload`,`email`,`sync`]).default(`upload`)}),o=i.object({documentId:i.string(),ingestionJobId:i.string()}),s={meta:{name:`pfo.documents.upload`,version:1,kind:`command`,title:`Upload Financial Document`,description:`Stores an object in tenant storage and schedules ingestion into the knowledge base.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`documents`,`ingestion`,t.Guide],stability:e.Experimental},io:{input:a,output:o},policy:{auth:{scopes:[`documents:ingest`]},rateLimit:{points:30,windowSeconds:60}},telemetry:{events:[{name:`pfo.documents.uploaded`,description:`Document queued for ingestion`}]}},c=i.object({billId:i.string(),recipientEmail:i.string().email(),recipientPhone:i.string().optional(),dueDate:i.coerce.date(),amountCents:i.number().int().nonnegative(),currency:i.string().length(3),channel:i.enum([`email`,`sms`,`both`]).default(`email`),memo:i.string().max(280).optional()}),l=i.object({reminderId:i.string(),scheduledAt:i.coerce.date()}),u={meta:{name:`pfo.reminders.schedule-payment`,version:1,kind:`command`,title:`Schedule Payment Reminder`,description:`Queues outbound email/SMS reminders for upcoming bills and adds an optional calendar hold.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`payments`,`reminders`,t.Automation],stability:e.Beta},io:{input:c,output:l},policy:{auth:{scopes:[`reminders:write`]}},telemetry:{events:[{name:`pfo.reminders.scheduled`,description:`Reminder scheduled for delivery`}]}},d=i.object({period:i.enum([`7d`,`30d`,`90d`]).default(`30d`),includeVoiceSummary:i.boolean().default(!1)}),f=i.object({summaryId:i.string(),generatedAt:i.coerce.date(),markdown:i.string(),highlights:i.array(i.object({label:i.string(),value:i.string()})),cashflowDelta:i.number()}),p={meta:{name:`pfo.summary.generate`,version:1,kind:`query`,title:`Generate Financial Summary`,description:`Runs RAG over financial documents and email threads to provide a natural-language summary with key metrics.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`summary`,`ai`,t.Automation],stability:e.Beta},io:{input:d,output:f},telemetry:{events:[{name:`pfo.summary.generated`,description:`Financial summary generated for a tenant`}]}},m=i.object({labelIds:i.array(i.string()).default([`INBOX`]),maxThreads:i.number().int().positive().max(500).default(50),syncSinceMinutes:i.number().int().positive().default(1440)}),h=i.object({syncedThreads:i.number().int().nonnegative(),lastMessageAt:i.coerce.date().optional()}),g={meta:{name:`pfo.email.sync-threads`,version:1,kind:`command`,title:`Sync Gmail Threads`,description:`Triggers ingestion of Gmail threads into the operational knowledge space.`,domain:`communications`,owners:[n.PlatformMessaging],tags:[`gmail`,`knowledge`,t.Automation],stability:e.Beta},io:{input:m,output:h},telemetry:{events:[{name:`pfo.email.synced`,description:`Gmail threads synced into knowledge base`}]}},_=i.object({summaryId:i.string(),recipientEmail:i.string().email(),recipientName:i.string().optional(),includeVoice:i.boolean().default(!1),voiceRecipient:i.string().optional()}),v=i.object({dispatchId:i.string(),emailSent:i.boolean(),voiceUrl:i.string().optional()}),y={meta:{name:`pfo.summary.dispatch`,version:1,kind:`command`,title:`Dispatch Financial Summary`,description:`Delivers the generated summary via email and optionally synthesises a voice note.`,domain:`finance`,owners:[n.PlatformMessaging],tags:[`summary`,`communications`,t.Automation],stability:e.Experimental},io:{input:_,output:v},policy:{auth:{scopes:[`summary:dispatch`]}},telemetry:{events:[{name:`pfo.summary.dispatched`,description:`Financial summary delivered to designated recipients`}]}},b=i.object({tenantId:i.string().min(1),accountIds:i.array(i.string().min(1)).optional(),period:i.enum([`week`,`month`,`quarter`]).default(`month`),asOf:i.coerce.date().optional(),includeCategories:i.boolean().default(!0),includeCashflowTrend:i.boolean().default(!0)}),x=i.object({knowledgeEntryId:i.string(),periodStart:i.coerce.date(),periodEnd:i.coerce.date(),generatedAt:i.coerce.date(),summaryPath:i.string().optional()}),S={meta:{name:`pfo.openbanking.generate-overview`,version:1,kind:`command`,title:`Generate Open Banking Overview`,description:`Aggregates balances and transactions into a derived financial overview stored in the knowledge layer.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`open-banking`,`summary`,t.Automation],stability:e.Experimental},io:{input:b,output:x},policy:{auth:{scopes:[`openbanking:derive`]}},telemetry:{events:[{name:r.overviewGenerated,description:`Derived financial overview generated from Powens banking data.`}]}},C={"pfo.documents.upload":s,"pfo.reminders.schedule-payment":u,"pfo.summary.generate":p,"pfo.summary.dispatch":y,"pfo.email.sync-threads":g,"pfo.openbanking.generate-overview":S};export{y as dispatchFinancialSummaryContract,p as generateFinancialSummaryContract,S as generateOpenBankingOverviewContract,C as pocketFamilyOfficeContracts,u as schedulePaymentReminderContract,g as syncEmailThreadsContract,s as uploadDocumentContract};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./providers/stripe.js";import"./providers/postmark.js";import"./providers/qdrant.js";import"./providers/mistral.js";import"./providers/elevenlabs.js";import"./providers/gmail.js";import"./providers/google-calendar.js";import"./providers/twilio-sms.js";import"./providers/gcs-storage.js";import"./providers/powens.js";import"./providers/registry.js";import"./providers/index.js";import{i as e,n as t,r as n}from"./openbanking/models.js";import{e as r,t as i}from"./openbanking/telemetry.js";import{d as a,f as o,p as s}from"./openbanking/contracts/accounts.js";import{d as c,u as l}from"./openbanking/contracts/transactions.js";import{d as u,u as d}from"./openbanking/contracts/balances.js";import"./openbanking/contracts/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"../../../schema/dist/ScalarTypeEnum.js";import{t}from"../../../schema/dist/SchemaModel.js";import"../../../schema/dist/index.js";import{n}from"../models.js";import{t as r}from"../telemetry.js";import{n as i,t as a}from"../../../spec.js";const o=new t({name:`OpenBankingListAccountsInput`,description:`Parameters for listing bank accounts through the open banking provider.`,fields:{tenantId:{type:e.ID(),isOptional:!1},userId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!0},includeBalances:{type:e.Boolean(),isOptional:!0},institutionId:{type:e.String_unsecure(),isOptional:!0},cursor:{type:e.String_unsecure(),isOptional:!0},pageSize:{type:e.Int_unsecure(),isOptional:!0}}}),s=new t({name:`OpenBankingListAccountsOutput`,description:`Paginated list of bank accounts available to the tenant and user.`,fields:{accounts:{type:n,isOptional:!1,isArray:!0},nextCursor:{type:e.String_unsecure(),isOptional:!0},hasMore:{type:e.Boolean(),isOptional:!0}}}),c=new t({name:`OpenBankingGetAccountInput`,description:`Parameters for retrieving a specific bank account.`,fields:{tenantId:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},includeBalances:{type:e.Boolean(),isOptional:!0},includeLatestTransactions:{type:e.Boolean(),isOptional:!0}}}),l=new t({name:`OpenBankingSyncAccountsInput`,description:`Command payload to trigger an account synchronisation against the open banking provider.`,fields:{tenantId:{type:e.ID(),isOptional:!1},userId:{type:e.ID(),isOptional:!0},connectionId:{type:e.ID(),isOptional:!1},accountIds:{type:e.ID(),isArray:!0,isOptional:!0},forceFullRefresh:{type:e.Boolean(),isOptional:!0},triggerWorkflows:{type:e.Boolean(),isOptional:!0}}}),u=new t({name:`OpenBankingSyncAccountsOutput`,description:`Result of a bank account synchronisation run.`,fields:{synced:{type:e.Int_unsecure(),isOptional:!1},failed:{type:e.Int_unsecure(),isOptional:!1},errors:{type:e.String_unsecure(),isArray:!0,isOptional:!0},nextSyncSuggestedAt:{type:e.DateTime(),isOptional:!0}}}),d=i({meta:{name:`openbanking.accounts.list`,version:1,description:`List bank accounts available to a tenant/user via Powens Open Banking.`,goal:`Provide downstream workflows with the set of accounts accessible via the configured open banking connection.`,context:`Used by Pocket Family Office dashboards and sync workflows to enumerate bank accounts prior to syncing balances or transactions.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`accounts`],stability:`experimental`},io:{input:o,output:s},policy:{auth:`user`}}),f=i({meta:{name:`openbanking.accounts.get`,version:1,description:`Retrieve the canonical bank account record for the given account identifier.`,goal:`Allow user-facing experiences and automations to display up-to-date account metadata.`,context:`Invoked by UI surfaces and workflow automation steps that require detailed metadata for a specific bank account.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`accounts`],stability:`experimental`},io:{input:c,output:n},policy:{auth:`user`}}),p=a({meta:{name:`openbanking.accounts.sync`,version:1,description:`Initiate a synchronisation run to refresh bank account metadata from Powens.`,goal:`Keep canonical bank account records aligned with the external open banking provider.`,context:`Triggered by scheduled workflows or manual operator actions to reconcile account metadata prior to transaction/balance syncs.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`accounts`],stability:`experimental`},io:{input:l,output:u},policy:{auth:`admin`},telemetry:{success:{event:{name:r.accountsSynced},properties:({input:e,output:t})=>{let n=e,r=t;return{tenantId:n?.tenantId,connectionId:n?.connectionId,synced:r?.synced,failed:r?.failed}}},failure:{event:{name:r.accountsSyncFailed},properties:({input:e,error:t})=>{let n=e;return{tenantId:n?.tenantId,connectionId:n?.connectionId,error:t instanceof Error?t.message:String(t??`unknown`)}}}}});export{d,f,p};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"../../../schema/dist/ScalarTypeEnum.js";import{t}from"../../../schema/dist/SchemaModel.js";import"../../../schema/dist/index.js";import{i as n}from"../models.js";import{t as r}from"../telemetry.js";import{n as i,t as a}from"../../../spec.js";const o=new t({name:`OpenBankingGetBalancesInput`,description:`Parameters for retrieving bank account balances from the canonical ledger.`,fields:{tenantId:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},balanceTypes:{type:e.String_unsecure(),isArray:!0,isOptional:!0}}}),s=new t({name:`OpenBankingGetBalancesOutput`,description:`Canonical balances for a bank account.`,fields:{balances:{type:n,isOptional:!1,isArray:!0},asOf:{type:e.DateTime(),isOptional:!0}}}),c=new t({name:`OpenBankingRefreshBalancesInput`,description:`Command payload to refresh balances for a bank account via the open banking provider.`,fields:{tenantId:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!0},balanceTypes:{type:e.String_unsecure(),isArray:!0,isOptional:!0},forceRefresh:{type:e.Boolean(),isOptional:!0}}}),l=new t({name:`OpenBankingRefreshBalancesOutput`,description:`Result of a balance refresh against the open banking provider.`,fields:{balances:{type:n,isOptional:!1,isArray:!0},refreshedAt:{type:e.DateTime(),isOptional:!1},errors:{type:e.String_unsecure(),isArray:!0,isOptional:!0}}}),u=i({meta:{name:`openbanking.balances.get`,version:1,description:`Retrieve the latest cached balances for a bank account.`,goal:`Expose current and available balances required by dashboards and analytics.`,context:`Used by Pocket Family Office UI surfaces and automation steps that require balance totals prior to generating summaries.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`balances`],stability:`experimental`},io:{input:o,output:s},policy:{auth:`user`}}),d=a({meta:{name:`openbanking.balances.refresh`,version:1,description:`Refresh balances for a bank account via the configured open banking provider.`,goal:`Ensure canonical balance records reflect the latest values from Powens.`,context:`Triggered by scheduled workflows before generating summaries or forecasting cashflow.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`balances`],stability:`experimental`},io:{input:c,output:l},policy:{auth:`admin`},telemetry:{success:{event:{name:r.balancesRefreshed},properties:({input:e,output:t})=>{let n=e,r=t;return{tenantId:n?.tenantId,accountId:n?.accountId,refreshedAt:r?.refreshedAt,balanceCount:Array.isArray(r?.balances)?r?.balances.length:void 0}}},failure:{event:{name:r.balancesRefreshFailed},properties:({input:e,error:t})=>{let n=e;return{tenantId:n?.tenantId,accountId:n?.accountId,error:t instanceof Error?t.message:String(t??`unknown`)}}}}});export{d,u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as e,f as t,p as n}from"./accounts.js";import{d as r,u as i}from"./transactions.js";import{d as a,u as o}from"./balances.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"../../../schema/dist/ScalarTypeEnum.js";import{t}from"../../../schema/dist/SchemaModel.js";import"../../../schema/dist/index.js";import{r as n}from"../models.js";import{t as r}from"../telemetry.js";import{n as i,t as a}from"../../../spec.js";const o=new t({name:`OpenBankingListTransactionsInput`,description:`Parameters for listing bank transactions from the canonical ledger.`,fields:{tenantId:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},from:{type:e.DateTime(),isOptional:!0},to:{type:e.DateTime(),isOptional:!0},cursor:{type:e.String_unsecure(),isOptional:!0},pageSize:{type:e.Int_unsecure(),isOptional:!0},direction:{type:e.String_unsecure(),isOptional:!0},minimumAmount:{type:e.Float_unsecure(),isOptional:!0},maximumAmount:{type:e.Float_unsecure(),isOptional:!0},category:{type:e.String_unsecure(),isOptional:!0}}}),s=new t({name:`OpenBankingListTransactionsOutput`,description:`Paginated list of transactions for a bank account.`,fields:{transactions:{type:n,isOptional:!1,isArray:!0},nextCursor:{type:e.String_unsecure(),isOptional:!0},hasMore:{type:e.Boolean(),isOptional:!0}}}),c=new t({name:`OpenBankingSyncTransactionsInput`,description:`Command payload to synchronise transactions from the open banking provider into the canonical ledger.`,fields:{tenantId:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},from:{type:e.DateTime(),isOptional:!0},to:{type:e.DateTime(),isOptional:!0},connectionId:{type:e.ID(),isOptional:!0},includePending:{type:e.Boolean(),isOptional:!0},backfillDays:{type:e.Int_unsecure(),isOptional:!0}}}),l=new t({name:`OpenBankingSyncTransactionsOutput`,description:`Result of a transaction synchronisation run.`,fields:{synced:{type:e.Int_unsecure(),isOptional:!1},failed:{type:e.Int_unsecure(),isOptional:!1},earliestSyncedAt:{type:e.DateTime(),isOptional:!0},latestSyncedAt:{type:e.DateTime(),isOptional:!0},nextSinceToken:{type:e.String_unsecure(),isOptional:!0},errors:{type:e.String_unsecure(),isArray:!0,isOptional:!0}}}),u=i({meta:{name:`openbanking.transactions.list`,version:1,description:`List bank transactions that have been normalised into the canonical ledger.`,goal:`Allow downstream analytics and UI surfaces to page through canonical bank transactions.`,context:`Used by Pocket Family Office dashboards, reconciliation workflows, and analytics data views.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`transactions`],stability:`experimental`},io:{input:o,output:s},policy:{auth:`user`}}),d=a({meta:{name:`openbanking.transactions.sync`,version:1,description:`Synchronise transactions for a bank account by calling the configured open banking provider.`,goal:`Ensure the canonical transaction ledger stays aligned with the external provider.`,context:`Triggered by scheduled workflows or on-demand actions when activity is expected on an account.`,owners:[`platform.finance`],tags:[`open-banking`,`powens`,`transactions`],stability:`experimental`},io:{input:c,output:l},policy:{auth:`admin`},telemetry:{success:{event:{name:r.transactionsSynced},properties:({input:e,output:t})=>{let n=e,r=t;return{tenantId:n?.tenantId,accountId:n?.accountId,synced:r?.synced,failed:r?.failed,earliestSyncedAt:r?.earliestSyncedAt,latestSyncedAt:r?.latestSyncedAt}}},failure:{event:{name:r.transactionsSyncFailed},properties:({input:e,error:t})=>{let n=e;return{tenantId:n?.tenantId,accountId:n?.accountId,error:t instanceof Error?t.message:String(t??`unknown`)}}}}});export{d,u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"../../schema/dist/ScalarTypeEnum.js";import{t}from"../../schema/dist/SchemaModel.js";import"../../schema/dist/index.js";const n=new t({name:`BankAccountRecord`,description:`Canonical representation of a bank account synced from an open banking provider.`,fields:{id:{type:e.ID(),isOptional:!1},tenantId:{type:e.ID(),isOptional:!1},userId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!1},externalId:{type:e.NonEmptyString(),isOptional:!1},institutionId:{type:e.NonEmptyString(),isOptional:!1},institutionName:{type:e.NonEmptyString(),isOptional:!1},institutionLogoUrl:{type:e.URL(),isOptional:!0},iban:{type:e.String_unsecure(),isOptional:!0},bic:{type:e.String_unsecure(),isOptional:!0},accountType:{type:e.NonEmptyString(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},displayName:{type:e.NonEmptyString(),isOptional:!1},accountNumberMasked:{type:e.String_unsecure(),isOptional:!0},productCode:{type:e.String_unsecure(),isOptional:!0},balance:{type:e.Float_unsecure(),isOptional:!0},availableBalance:{type:e.Float_unsecure(),isOptional:!0},lastSyncedAt:{type:e.DateTime(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1},metadata:{type:e.JSONObject(),isOptional:!0}}}),r=new t({name:`BankTransactionRecord`,description:`Canonical transaction entry mapped from Powens into the open banking ledger.`,fields:{id:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},tenantId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!1},externalId:{type:e.NonEmptyString(),isOptional:!1},amount:{type:e.Float_unsecure(),isOptional:!1},currency:{type:e.Currency(),isOptional:!1},date:{type:e.DateTime(),isOptional:!1},bookingDate:{type:e.DateTime(),isOptional:!0},valueDate:{type:e.DateTime(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},counterpartyName:{type:e.String_unsecure(),isOptional:!0},counterpartyAccount:{type:e.String_unsecure(),isOptional:!0},merchantCategoryCode:{type:e.String_unsecure(),isOptional:!0},rawCategory:{type:e.String_unsecure(),isOptional:!0},standardizedCategory:{type:e.String_unsecure(),isOptional:!0},transactionType:{type:e.NonEmptyString(),isOptional:!1},status:{type:e.NonEmptyString(),isOptional:!1},runningBalance:{type:e.Float_unsecure(),isOptional:!0},metadata:{type:e.JSONObject(),isOptional:!0},createdAt:{type:e.DateTime(),isOptional:!1},updatedAt:{type:e.DateTime(),isOptional:!1}}}),i=new t({name:`AccountBalanceRecord`,description:`Canonical balance snapshot computed from Powens balance payloads.`,fields:{id:{type:e.ID(),isOptional:!1},accountId:{type:e.ID(),isOptional:!1},tenantId:{type:e.ID(),isOptional:!1},connectionId:{type:e.ID(),isOptional:!1},balanceType:{type:e.NonEmptyString(),isOptional:!1},currentBalance:{type:e.Float_unsecure(),isOptional:!1},availableBalance:{type:e.Float_unsecure(),isOptional:!0},currency:{type:e.Currency(),isOptional:!1},lastUpdatedAt:{type:e.DateTime(),isOptional:!1},createdAt:{type:e.DateTime(),isOptional:!1},metadata:{type:e.JSONObject(),isOptional:!0}}});export{i,n,r};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=[`iban`,`bic`,`accountNumberMasked`,`accountNumber`,`counterpartyName`,`counterpartyAccount`,`description`,`merchantName`,`merchantCategoryCode`,`reference`],t={accountsSynced:`openbanking.accounts.synced`,accountsSyncFailed:`openbanking.accounts.sync_failed`,transactionsSynced:`openbanking.transactions.synced`,transactionsSyncFailed:`openbanking.transactions.sync_failed`,balancesRefreshed:`openbanking.balances.refreshed`,balancesRefreshFailed:`openbanking.balances.refresh_failed`,overviewGenerated:`openbanking.overview.generated`};export{e,t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Beta;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Beta;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Beta;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Beta;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./stripe.js";import"./postmark.js";import"./qdrant.js";import"./mistral.js";import"./elevenlabs.js";import"./gmail.js";import"./google-calendar.js";import"./twilio-sms.js";import"./gcs-storage.js";import"./powens.js";import"./registry.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Experimental;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Stable;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Experimental;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Experimental;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./stripe.js";import"./postmark.js";import"./qdrant.js";import"./mistral.js";import"./elevenlabs.js";import"./gmail.js";import"./google-calendar.js";import"./twilio-sms.js";import"./gcs-storage.js";import"./powens.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Stable;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e}from"../../ownership.js";e.Stable;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={Idea:`idea`,InCreation:`in_creation`,Experimental:`experimental`,Beta:`beta`,Stable:`stable`,Deprecated:`deprecated`},t={ProductColiving:`product.coliving`,ProductStrit:`product.strit`,ProductArtisanos:`product.artisanos`,PlatformSigil:`platform.sigil`,PlatformMarketplace:`platform.marketplace`,PlatformContent:`platform.content`,PlatformFeatureFlags:`platform.featureflags`},n={Spots:`spots`,Collectivity:`collectivity`,Marketplace:`marketplace`,Sellers:`sellers`,Auth:`auth`,Login:`login`,Signup:`signup`,Guide:`guide`,Docs:`docs`,I18n:`i18n`,AtomicPages:`atomic:pages`,Incident:`incident`,Hygiene:`hygiene`,WeeklyPulse:`weekly_pulse`,WebAuth:`webauth`};export{e,n as r,t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"zod";import"graphql";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"zod";import{GraphQLScalarType as e}from"graphql";var t=class extends e{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./FieldType.js";import*as t from"zod";import{Kind as n}from"graphql";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\/[A-Za-z_]+)$/,a=/^[+]?\d[\d\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\d{2}:\d{2}(:\d{2})?$/),parseValue:e=>t.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\d{2}:\\d{2}(:\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./FieldType.js";import"./EnumType.js";import*as e from"zod";var t=class{constructor(e){this.config=e}getZod(){let t=Object.entries(this.config.fields).reduce((t,[n,r])=>{let i=r.type.getZod(),a=r.isArray?e.array(i):i;return t[n]=r.isOptional?a.optional():a,t},{});return e.object(t)}getPothosInput(){return this.config.name}};export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"zod";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./defineEntity.js";import"./types.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"zod";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./FieldType.js";import"./ScalarTypeEnum.js";import"./EnumType.js";import"./SchemaModel.js";import"./entity/defineEntity.js";import"./entity/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=e=>({...e,meta:{...e.meta,kind:`command`},policy:{...e.policy,idempotent:e.policy?.policy?.idempotent??!1}}),t=e=>({...e,meta:{...e.meta,kind:`query`},policy:{...e.policy,idempotent:!0}});export{t as n,e as t};
|
package/dist/telemetry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"./libs/contracts/dist/ownership.js";import{e as r,t as i}from"./libs/contracts/dist/integrations/openbanking/telemetry.js";import"./libs/contracts/dist/integrations/index.js";const a={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 o(e){return{type:`string`,description:e,pii:!1}}const s={meta:{name:`pfo.telemetry`,version:1,title:`Pocket Family Office Telemetry`,description:`Operational telemetry for Pocket Family Office workflows, including Powens open banking syncs.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`open-banking`,t.Automation],stability:e.Experimental},config:{defaultRetentionDays:180,defaultSamplingRate:1},events:[{name:i.accountsSynced,version:1,semantics:{what:`Open banking account synchronisation completed.`,why:`Refresh canonical account metadata for reporting and workflows.`},privacy:`internal`,properties:{...a,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.`}}},{name:i.transactionsSynced,version:1,semantics:{what:`Open banking transaction synchronisation completed.`,why:`Keep canonical transaction ledger in sync for analytics.`},privacy:`internal`,properties:{...a,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.`}}},{name:i.balancesRefreshed,version:1,semantics:{what:`Open banking balances refreshed.`,why:`Provide accurate cash position for dashboards and alerts.`},privacy:`internal`,properties:{...a,accountId:o(`Bank account identifier.`),balanceTypes:{type:`json`,description:`Balance types included in the refresh.`},refreshedAt:{type:`timestamp`,description:`Timestamp when balances were refreshed.`}}},{name:i.overviewGenerated,version:1,semantics:{what:`Derived financial overview generated.`,why:`Persist cashflow and category summaries into knowledge space.`},privacy:`internal`,properties:{...a,knowledgeEntryId:o(`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`]}]},c=r;export{c as OPENBANKING_SENSITIVE_FIELDS,s as pocketFamilyOfficeTelemetry};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={meta:{name:`pfo.workflow.generate-financial-summary`,version:1,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:[n.PlatformFinance],tags:[`summary`,`ai`,t.Automation],stability:e.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:{name:`pfo.summary.generate`,version:1}},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:{name:`pfo.summary.dispatch`,version:1}},requiredIntegrations:[`emailOutbound`],retry:{maxAttempts:2,backoff:`linear`,delayMs:500}}],transitions:[{from:`summarise`,to:`distribute`}]}};export{r as generateFinancialSummaryWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={meta:{name:`pfo.workflow.generate-openbanking-overview`,version:1,title:`Generate Open Banking Overview`,description:`Produces a derived financial overview and stores it in the operational knowledge space.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`open-banking`,`summary`,t.Automation],stability:e.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:{name:`pfo.openbanking.generate-overview`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[{key:`openbanking.accounts.read`,version:1},{key:`openbanking.transactions.read`,version:1},{key:`openbanking.balances.read`,version:1}],retry:{maxAttempts:3,backoff:`exponential`,delayMs:1500}}],transitions:[]}};export{r as generateOpenBankingOverviewWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={meta:{name:`pfo.workflow.ingest-email-threads`,version:1,title:`Ingest Email Threads`,description:`Synchronises Gmail threads tagged with finance labels and indexes them into operational knowledge spaces.`,domain:`communications`,owners:[n.PlatformMessaging],tags:[`gmail`,`knowledge`,t.Automation],stability:e.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:{name:`pfo.email.sync-threads`,version:1}},requiredIntegrations:[`emailInbound`,`primaryVectorDb`],retry:{maxAttempts:3,backoff:`exponential`,delayMs:1e3}},{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`}]}};export{r as ingestEmailThreadsWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={meta:{name:`pfo.workflow.process-uploaded-document`,version:1,title:`Process Uploaded Document`,description:`Stores an uploaded invoice/contract, queues ingestion, and records any follow-up reminders.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`documents`,`ingestion`,t.Automation],stability:e.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:{name:`pfo.documents.upload`,version:1}},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`}]}};export{r as processUploadedDocumentWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={key:`openbanking.balances.read`,version:1},i={meta:{name:`pfo.workflow.refresh-openbanking-balances`,version:1,title:`Refresh Open Banking Balances`,description:`Refreshes balances for synced accounts to surface the latest cash positions in dashboards.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`open-banking`,`powens`,t.Automation],stability:e.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:{name:`openbanking.balances.refresh`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[r],retry:{maxAttempts:3,backoff:`exponential`,delayMs:1e3}},{id:`fetch-balances`,type:`automation`,label:`Fetch Balances`,description:`Load the canonical balance snapshots for downstream workflows and dashboards.`,action:{operation:{name:`openbanking.balances.get`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[r],retry:{maxAttempts:2,backoff:`linear`,delayMs:750}}],transitions:[{from:`refresh-balances`,to:`fetch-balances`}]}};export{i as refreshOpenBankingBalancesWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={key:`openbanking.accounts.read`,version:1},i={meta:{name:`pfo.workflow.sync-openbanking-accounts`,version:1,title:`Synchronise Open Banking Accounts`,description:`Validates Powens connectivity and synchronises bank account metadata into the canonical ledger.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`open-banking`,`powens`,t.Automation],stability:e.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:{name:`openbanking.accounts.sync`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[r],retry:{maxAttempts:3,backoff:`exponential`,delayMs:1e3}},{id:`fetch-accounts`,type:`automation`,label:`Fetch Accounts`,description:`Retrieve the latest canonical account snapshot for downstream consumers.`,action:{operation:{name:`openbanking.accounts.list`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[r],retry:{maxAttempts:2,backoff:`linear`,delayMs:750}}],transitions:[{from:`sync-accounts`,to:`fetch-accounts`}]}};export{i as syncOpenBankingAccountsWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={key:`openbanking.transactions.read`,version:1},i={meta:{name:`pfo.workflow.sync-openbanking-transactions`,version:1,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:[n.PlatformFinance],tags:[`open-banking`,`powens`,t.Automation],stability:e.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:{name:`openbanking.transactions.sync`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[r],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:{name:`openbanking.transactions.list`,version:1}},requiredIntegrations:[`primaryOpenBanking`],requiredCapabilities:[r],retry:{maxAttempts:2,backoff:`linear`,delayMs:1e3}}],transitions:[{from:`sync-transactions`,to:`list-transactions`}]}};export{i as syncOpenBankingTransactionsWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{e,r as t,t as n}from"../libs/contracts/dist/ownership.js";const r={meta:{name:`pfo.workflow.upcoming-payments-reminder`,version:1,title:`Schedule Upcoming Payment Reminder`,description:`Collects payment metadata and schedules multi-channel reminders for bills that are due soon.`,domain:`finance`,owners:[n.PlatformFinance],tags:[`payments`,`reminders`,t.Automation],stability:e.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:{name:`pfo.reminders.schedule-payment`,version:1}},requiredIntegrations:[`emailOutbound`,`smsNotifications`,`calendarScheduling`],retry:{maxAttempts:2,backoff:`linear`,delayMs:1e3}}],transitions:[{from:`collect`,to:`schedule`,condition:`output?.confirmed === true`,label:`Reminder confirmed`}]}};export{r as upcomingPaymentsReminderWorkflow};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lssm/example.pocket-family-office",
|
|
3
|
-
"version": "0.0.0-canary-
|
|
3
|
+
"version": "0.0.0-canary-20251217063201",
|
|
4
4
|
"description": "Pocket Family Office example - personal finance automation with open banking",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -18,13 +18,13 @@
|
|
|
18
18
|
"lint:check": "eslint ."
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@lssm/lib.schema": "0.0.0-canary-
|
|
22
|
-
"@lssm/lib.contracts": "0.0.0-canary-
|
|
21
|
+
"@lssm/lib.schema": "0.0.0-canary-20251217063201",
|
|
22
|
+
"@lssm/lib.contracts": "0.0.0-canary-20251217063201",
|
|
23
23
|
"zod": "^4.1.13"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@lssm/tool.typescript": "0.0.0-canary-
|
|
27
|
-
"@lssm/tool.tsdown": "0.0.0-canary-
|
|
26
|
+
"@lssm/tool.typescript": "0.0.0-canary-20251217063201",
|
|
27
|
+
"@lssm/tool.tsdown": "0.0.0-canary-20251217063201",
|
|
28
28
|
"typescript": "^5.9.3"
|
|
29
29
|
},
|
|
30
30
|
"exports": {
|